Vertragsmethode: Fehler: Anbieter nicht gesetzt oder ungültig

Ich baue eine Dapp mit MetaMask. Ich erhalte jedoch eine Fehlermeldung, wenn ich versuche, eine Methode für meinen Vertrag aufzurufen.

Hier ist der vereinfachte Code:

var web3 = new Web3(web3.currentProvider);
var contract = new web3.eth.Contract(contractData.abi);
contract.options.address = address;
contract.methods.getName().call().then(name => console.log(name))

Dies wirft den folgenden Fehler:

Unhandled rejection Error: Provider not set or invalid

Beim Durchsuchen des Debuggers scheint der RequestManager keinen Anbieter festgelegt zu haben. Ich kann jedoch nicht herausfinden, wie dieser Anbieter eingestellt werden soll?

Versuchen Sie, die erste Zeile hinzuzufügen var currentProvider = new Web3.providers.HttpProvider('http://localhost:7545');und zu ändernvar web3 = new Web3(currentProvider);
'http://localhost:7545'Stellen Sie sicher, dass Sie bei Bedarf den Port ändern.
@RomanFrolov Er verwendet MetaMask.
@DavidMihal Hast du dafür eine Lösung gefunden? Ich habe das gleiche Problem.
@t_io Nicht wirklich, aber ich habe das Problem umgangen, indem ich contract.setProvider(web3.currentProvider);jeden Vertrag aufgerufen habe, den ich erstellt habe
könnte dies daran liegen, dass metamask nicht installiert ist?

Antworten (2)

Haben Sie MetaMask auf das von Ihnen verwendete Testnetzwerk eingestellt? Wählen Sie bei testrpc in Metamask aus, dass Sie sich mit LocalHost 8545 verbinden möchten, und wenn Sie Ganache verwenden, können Sie einen benutzerdefinierten RPC erstellen, um sich mit LocalHost 7545 zu verbinden . Dies sollte Ihre Konten einziehen und Ihnen eine ordnungsgemäße Verbindung zu einem Anbieter ermöglichen.

MetaMask scheint gut zu funktionieren, ich konnte das Problem umgehen, indem ich contract.setProvider(web3.currentProvider);jeden Vertrag, den ich erstelle, anrufe. Das Problem scheint entweder ein Fehler oder eine verwirrende API mit web3 zu sein.

Anscheinend haben Sie die fromAdresse nicht festgelegt. Sehen Sie sich die Vertragseigenschaften an . Mit MetaMask bekommt man die aktuell ausgewählte Adresse mitvar account = web3.eth.accounts[0];

Wenn Sie so etwas hinzufügen, contract.options.from = account;sollte es funktionieren.