Ich arbeite an einer Google Chrome-Erweiterung, die funktioniert, wenn ein Benutzer einen neuen Tab öffnet. Beim Öffnen eines neuen Tabs sollte meine DAPP eine Verbindung zum web3-Anbieter des Benutzers herstellen. Es wird jedoch kein web3 erkannt.
Alles funktioniert gut, wenn es als einfache Webseite bereitgestellt wird.
Ich stoße gerade auf dieses Problem, wenn ich versuche, meine Dapp als Chrome-Erweiterung zu betreiben, die beim Öffnen eines neuen Tabs ausgeführt wird.
Hier ist truffle-react
das Setup von , das ich zum Abrufen von web3 nicht bearbeitet habe:
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)
}
})
})
Dieser Code prüft zum Beispiel bereits im Fenster
var web3 = window.web3
Wenn gefunden, suchen Sie nach Mist/Metamask oder einem anderen Anbieter und geben Sie web3 und die Konsolenausgaben an „Injiziertes web3 erkannt“ zurück.
// Use Mist/MetaMask's provider.
web3 = new Web3(web3.currentProvider)
results = {
web3: web3
}
console.log('Injected web3 detected.');
Andernfalls, wenn die web3-Instanz nicht gefunden wird, greift dieser Code auf den web3-Anbieter des localhost-Knotens zurück, sodass die Konsole „Keine web3-Instanz injiziert, mit lokalem web3“ ausgibt.
// 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.');
Da Sie in Ihrem Fall keinen lokalen Ethereum-Knoten ausführen , wird ein Fehler ausgelöst.
Aber wie von mir vorgeschlagen, haben Sie den Localhost-Link durch den Infura-Link ersetzt.
Jetzt gibt es keinen Fehler. Warum? weil web3 injiziert wurde.
Aber die Konsolenausgabe ist immer noch dieselbe, weil der Konsolenbefehl immer noch dieselbe ist.
console.log('No web3 instance injected, using Local web3.');
Um zu überprüfen, ob web3 instanziiert und injiziert wurde, überprüfen Sie einfach die web3-Version
console.log(web3.version.api) // for web3 0.2x.x
oder
console.log(web3.version) // for web3 1.0
kherwa
braunmamba
kherwa
braunmamba
No web3 instance injected, using Local web3.
Konsolenprotokollkherwa
James_pic
web3
inhttp://
undhttps://
Seiten. Wenn dieser Code entweder in einem Hintergrundskript oder einem Inhaltsskript ausgeführt wird, fügt MetaMask nichtweb
in das einwindow
, was Ihr Skript sehen kann (da diese Skripte in einemchrome-extension://
Kontext ausgeführt werden).web3
wird nur von Skripten sichtbar sein, die in die Seite eingefügt werden.