Metamasks injiziert web3 gibt einen Fehler bei der Verwendungweb3.eth.sendTransaction()
web3.eth.sendTransaction({from:web3.eth.accounts[0], to:'', data: // hash to interact with contraact, gas:85000});
Was wäre eine Möglichkeit, Metamask zu verwenden, damit eine Website einen Benutzer auffordert, eine Transaktion zu unterzeichnen?
Ihnen fehlt das letzte Argument für sendTransaction
, der Rückruffunction(error, transactionHash) { ... }
In den häufig gestellten Fragen zu MetaMask heißt es:
All Async - Stellen Sie sich MetaMask als Light-Client vor
Der Benutzer hat nicht die vollständige Blockchain auf seinem Computer, sodass die Datensuche etwas langsam sein kann. Aus diesem Grund können wir die meisten synchronen Methoden nicht unterstützen. Die Ausnahme hiervon ist:
eth_accounts (web3.eth.konten)
eth_coinbase (web3.eth.coinbase)
Normalerweise kann ein Methodenaufruf asynchron gemacht werden, indem einfach ein Callback als letztes Argument zu einer synchronen Methode hinzugefügt wird.
Siehe Ethereum-Wiki zum Thema „Callbacks verwenden“
Dies ist nicht nur eine technische Einschränkung, sondern auch ein Problem der Benutzererfahrung. Wenn Sie synchrone Aufrufe verwenden, blockieren Sie die Benutzeroberfläche, und daher ist dies sowieso eine allgemein schlechte Praxis. Betrachten Sie diese API-Einschränkung als Geschenk an Ihre Benutzer.
Daher sollten alle Aufrufe von web3.js als letztes Argument einen Rückruf haben: Die einzigen Aufrufe, bei denen dies nicht erforderlich ist, sind for web3.eth.accounts
und web3.eth.coinbase
. Die generische Form des Rückrufs ist function(error, result)
.
deasync
var receiver = "0x541209bd9C60cDb11A5076b785ba1BD44cd15768";
var sender = web3.eth.accounts[0];
web3.eth.sendTransaction({to:receiver,
from:sender,
value:web3.toWei("0.5", "ether")}
,function (err, res){});
DanF