Объединение web3js не работает (приложение Metamask)

(Это дополнительный вопрос отсюда . )

В часто задаваемых вопросах разработчиков Metamask говорится, что «связывается версия web3, которая используется во время разработки».

Итак, я скачал web3.min.js версии 0.20.6 с GitHub и «связал» ее, как показано в коде ниже. Затем я вывожу в консоль "web3.version.api".

Теперь, с комплектацией или без , консоль сообщает о версии 0.20.3 после нажатия кнопки.

Я подозреваю, что это из-за строки

web3 = new Web3(web3.currentProvider);

который устанавливает для web3 введенный код из моего плагина Metamask, в котором я вошел в систему, и запускает этот код, а не мою "встроенную" версию...

Вопрос: Как мне собрать собственную версию web3?

<html>
  <body>

    <script type="text/javascript" src="scripts/web3.min.js"></script>

    <script type="text/javascript">

      window.addEventListener("load", function() {

        if (typeof web3 === "undefined") {
            console.log("No web3 provider found");
        } else {
            web3 = new Web3(web3.currentProvider);
            console.log("Using web wallet");
        }

      })  </script>

    <button id="buttonBalance">Click to report version to console</button>

    <script type="text/javascript">
      button = document.getElementById("buttonBalance")
      button.onclick = function tmp()
  {
    console.log("Version=" + web3.version.api);
      };
    </script>


  </body>
</html>

PS. Я создал кнопку, чтобы убедиться, что вызов web3 для «web.version.api» выполняется «вне добавления eventListener в окно» в соответствии с предложением @Kai Kälberer

Обновление: по предложению @viz я загрузил неминифицированную версию web3j с GitHub и раскомментировал строку, которая позволяет избежать переопределения глобального экземпляра web3. Посмотрите на этот снимок экрана из моего отладчика инструментов разработки:

снимок экрана из отладчика инструментов разработчика, показывающий, что связанный код web3js раскомментировал строки, которые переопределяют глобальный объект web3.

Тем не менее я вижу, что консоль выводит версию 0.20.3 , а не 0.20.6 , как определено в загруженном web3.js ... почему?

Я тестирую с вашим кодом. После некоторых экспериментов кажется, что последний источник web3.min.js неправильно переопределяет глобальный Web3объект.

Ответы (1)

Это происходит из-за этой строки . В настоящее время код не переопределяет Web3объект, если глобальный объект Web3уже существует. Вот почему вы получаете ту же версию Web3 API, которую MetaMask уже внедрил, как бы вы ни пытались.

Это можно решить, используя инструмент упаковки, такой как webpack, и загрузив объект Web3 как модуль, или вручную загрузив файл web3.js и исправьте эту строку, если вы хотите встроить ее в качестве тега скрипта.

Я думаю, что web3.js должен переопределять, даже если глобальный объект существует. Если вы считаете, что текущее поведение является неуместным, вы можете сообщить о проблеме через репозиторий web3.js github.

Спасибо за ваш ответ! Я сделал, как вы предложили, вручную загрузить файл web3.js, закомментировать эту строку и связать ее. Нет успеха, пожалуйста, смотрите мой обновленный вопрос.
@YtsendeBoer, вы не должны комментировать все три строки. Пожалуйста, прочитайте код, вы должны удалить только && typeof window.Web3 === 'undefined'эту часть.
Рад, что помогло :)