Я работаю над расширением 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)
}
})
})
Этот код проверяет наличие проверки, например, уже доступной в окне
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
херва
коричневая мамба
херва
коричневая мамба
No web3 instance injected, using Local web3.
консольным журналомхерва
Джеймс_пик
web3
в страницыhttp://
иhttps://
. Если этот код выполняется либо в фоновом скрипте, либо в контентном скрипте, то MetaMask не будет внедрятьсяweb
в тоwindow
, что может видеть ваш скрипт (поскольку эти скрипты выполняются вchrome-extension://
контексте).web3
будет виден только из скриптов, внедренных на страницу.