Web3 не обнаруживается - расширение Google Chrome

Я работаю над расширением Google Chrome, которое работает, когда пользователь открывает новую вкладку. При открытии новой вкладки мое децентрализованное приложение должно подключиться к провайдеру web3 пользователя. Однако web3 не обнаруживается.

Все работает нормально, если развернуто как простая веб-страница.

Я просто сталкиваюсь с указанной проблемой, когда пытаюсь использовать свое децентрализованное приложение как расширение Chrome, и оно начинает работать при открытии новой вкладки.

Вот truffle-reactустановка, которую я не редактировал для получения web3:

let getWeb3 = new Promise(function(resolve, reject) {
// Wait for loading completion to avoid race conditions with web3 
injection timing.
window.addEventListener('load', function() {
var results
var web3 = window.web3

// Checking if Web3 has been injected by the browser (Mist/MetaMask)
if (typeof web3 !== 'undefined') {
  // Use Mist/MetaMask's provider.
  web3 = new Web3(web3.currentProvider)

  results = {
    web3: web3
  }

  console.log('Injected web3 detected.');

  resolve(results)
} else {
  // Fallback to localhost if no web3 injection. We've configured this to
  // use the development console's port by default.
  var provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545')

  web3 = new Web3(provider)

  results = {
    web3: web3
  }

  console.log('No web3 instance injected, using Local web3.');

  resolve(results)
}
})
})
Ваш локальный узел работает с портом rpc 9545 и открытым API web3?
да, мой rpc настроен на порт 9545. Однако я думал, что это не имеет значения, учитывая, что я запускал его через инфуру
Но в приведенной здесь логике, когда объект web3 не найден, вы переходите на локальный хост, здесь нет ссылки на infura API?
Я заменил ссылку на локальный хост своей ссылкой на инфуру. Я убрал вызов смарт-контракта, и теперь ошибок нет. Тем не менее, я все еще сталкиваюсь с No web3 instance injected, using Local web3.консольным журналом
Я попытался ответить на этот вопрос шаг за шагом. после замены ссылки localhost на ссылку infura она будет работать, просто вывод консоли неоднозначен.
Где работает ваш код? MetaMask внедряет только web3в страницы http://и https://. Если этот код выполняется либо в фоновом скрипте, либо в контентном скрипте, то MetaMask не будет внедряться webв то window, что может видеть ваш скрипт (поскольку эти скрипты выполняются в chrome-extension://контексте). web3будет виден только из скриптов, внедренных на страницу.

Ответы (1)

Этот код проверяет наличие проверки, например, уже доступной в окне

var web3 = window.web3

Если найдено, проверьте Mist/Metamask или любого другого поставщика и верните web3, а выходные данные консоли — «Обнаружен внедренный web3».

// Use Mist/MetaMask's provider.
  web3 = new Web3(web3.currentProvider)

  results = {
    web3: web3
  }

  console.log('Injected web3 detected.');

в противном случае, если экземпляр web3 не найден, этот код возвращается к провайдеру web3 узла localhost, поэтому консоль выводит «Экземпляр web3 не введен, используя локальный web3».

// Fallback to localhost if no web3 injection. We've configured this to
  // use the development console's port by default.
  var provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545')

  web3 = new Web3(provider)

  results = {
    web3: web3
  }

  console.log('No web3 instance injected, using Local web3.');

Поскольку в вашем случае вы не используете локальный узел ethereum , он выдает ошибку.

Но, как я предложил, вы заменили ссылку localhost на ссылку infura.

Теперь ошибки нет. Почему? потому что web3 был введен.

Но вывод консоли все тот же, потому что консольная команда все та же.

 console.log('No web3 instance injected, using Local web3.');

Чтобы проверить, был ли создан и внедрен web3, просто проверьте версию web3.

console.log(web3.version.api) // for web3 0.2x.x

или

console.log(web3.version) // for web3 1.0