Meine dApp kann Metamask-Konten mit gegebenem Anbieter verwenden, aber nicht, wenn das Web3-Objekt auf die URL des Rinkeby-Anbieters gesetzt wird?

Heute ist der erste Tag, an dem ich in einem Testnetzwerk ( Rinkeby ) und nicht in meinem lokalen Ganache-Client-Netzwerk bereitgestellt habe. Ich denke, ich brauche eine Klärung der Konten, wenn es um Metamask und Rinkeby geht.

Wenn ich das Web3-Objekt bei der Erstellung auf der Clientseite mit der GivenProvider- Eigenschaft initialisiere, kann ich auf meine Metamask-Konten zugreifen, wenn ich einen getAccounts()- Methodenaufruf von meinem Webseiten-JavaScript-Code ausführe. Wenn ich jedoch stattdessen das Web3-Objekt mit der von der Infura-API dekorierten Rinkeby-URL initialisiere, erhalte ich ein leeres Ergebnis, wenn ich getAccounts() aufrufe . Ich vermute, dass dies daran liegt, dass die Konten nicht "auf Rinkeby" sind ( nicht sicher, wie ich das sonst sagen soll ), sondern von der Metamask-Brieftasche verwaltet werden?

Mein Gesamtziel ist es, dass der Server das gewünschte Netzwerk angibt, anstatt sich darauf zu verlassen, dass Metamask auf das gewünschte Ethereum-Netzwerk eingestellt wird, wenn die Webseite meiner dApp ausgeführt wird.

Weiß jemand auch, wie man das Web3-Objekt initialisiert, ohne dass der Infura-API-Schlüssel für jemanden sichtbar ist, der den Code im Browser-Debugger verfolgt?

// This is how I get a valid accounts result.  Metamask is currently set to Rinkeby.
const Web3 = require('web3');   
const localWeb3 = new Web3(Web3.givenProvider); 

localWeb3.eth.getAccounts()
.then(function (result) {}

// This results in an empty accounts result.
const Web3 = require('web3');   
const localWeb3 = new Web3("https://rinkeby.infura.io/<redacted>"); 

localWeb3.eth.getAccounts()
.then(function (result) {}
Ich denke, der zweite Teil Ihrer Frage hat nichts mit der ersten Frage zu tun, vielleicht kann er einen anderen Beitrag füllen

Antworten (1)

Dies passiert, weil es bei Aufrufen mit Web3.givenProvidernie den Ethereum-Knoten erreicht, um die Konten abzufragen, stattdessen geben sie nur Ihre Konten auf zurück, Metamaskund Aufrufe für Rinkeby mit Infura geben nichts zurück, weil dort kein Konto registriert ist. Möglicherweise stellt Infura das Backend für die Methode nicht bereit getAccounts.

Infura bietet keine kontobezogenen Funktionen wie die Erstellung neuer Konten. Für getAccounts() wird also nichts zurückgegeben.