Web3 wird nicht erkannt - Google Chrome-Erweiterung

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-reactdas 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)
}
})
})
Läuft Ihr lokaler Knoten mit RPC-Port 9545 und offengelegter Web3-API?
Ja, ich habe meinen RPC für Port 9545 eingerichtet. Ich dachte jedoch, dass dies keine Rolle spielt, wenn man bedenkt, dass ich ihn über Infura laufen lasse
Aber in der hier angegebenen Logik, wenn das web3-Objekt nicht gefunden wird, greifen Sie auf localhost zurück, gibt es hier keinen Link zu infura api?
Ich habe den localhost-Link durch meinen Infura-Link ersetzt. Ich habe den Smart-Contract-Aufruf entfernt, und jetzt gibt es keine Fehler mehr. Ich stoße jedoch immer noch auf ein No web3 instance injected, using Local web3.Konsolenprotokoll
Ich habe versucht, diese Frage Schritt für Schritt zu beantworten. Nach dem Ersetzen des localhost-Links durch den Infura-Link wird es funktionieren, nur die Konsolenausgabe ist mehrdeutig.
Wo läuft dein Code? MetaMask injiziert nur web3in http://und https://Seiten. Wenn dieser Code entweder in einem Hintergrundskript oder einem Inhaltsskript ausgeführt wird, fügt MetaMask nicht webin das ein window, was Ihr Skript sehen kann (da diese Skripte in einem chrome-extension://Kontext ausgeführt werden). web3wird nur von Skripten sichtbar sein, die in die Seite eingefügt werden.

Antworten (1)

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