Beim Versuch, die Methode sendFundsToFriend() im Testnet-Vertrag https://testnet.etherscan.io/address/0xce8efd03766a309af57ddeb9c79f3e7cd23da0df (Vertragscode unter https://gist.github.com/anonymous/5bdc3d9032a8b3cb5cba7c7625afa4d7 ) aufzurufen, habe ich Folgendes erhalten:
Warning! Error encountered during contract execution [Out of gas]
Das tx-Ergebnis sagt:
Result: {
"blockHash": "0x585ca866c5143090c7a82443269d55658a176a018b1ad90827ec70adc1ff66c8",
"blockNumber": 465927,
"contractAddress": null,
"cumulativeGasUsed": 508930,
"from": "0xe5f68950d479fab12797dabbe5a4b0d88ec7a722",
"gasUsed": 58787,
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"root": "0x1289d7517d81fa8c4894c0cd97fd200ec4e9f0fecebba586435daca8e4e8f9ec",
"to": "0xce8efd03766a309af57ddeb9c79f3e7cd23da0df",
"transactionHash": "0x703d7657c093557d1cd42dfeb7b8d0d3b74e413d22e8009b26d7ac966c85d048",
"transactionIndex": 3
}
Transaction cost: 58787 gas.
Beim Senden der tx wird das Transaktionsgaslimit auf 3000000 festgelegt, den Standardwert für die Browsersolidität.
Wenn die TX-Kosten 58787 Gas betragen und das Limit 3000000 beträgt, warum der Gasfehler? Irgendeine Idee? Danke!
PS: Versuchte einen ähnlichen TX von einem Geth-Knoten, anstatt Metamask + Browser-Solidity zu verwenden, und es funktionierte gut:
https://testnet.etherscan.io/tx/0x56465b6594769578d9223ca902757780600dd2628074aedcf9635fb590b75bfa
Also mache ich etwas falsch mit der Browser-Solidität, wenn ich die Contract-Methode aufrufe, oder könnte eine Art Fehler in dieser Umgebung sein ...
Meine Theorie, wenn ich mir die Transaktionen der Deployed ansehe, ist, dass die fehlgeschlagenen Transaktionen an eine nicht existierende Adresse gingen (null Nonce, null ETH zuvor) und die erfolgreichen an eine existierende Adresse (anscheinend hatten Transaktionen in der Vergangenheit und ETH schon). Ersteres würde mehr Gas verbrauchen und es über die normale Gasgrenze hinausschieben.
Um dies zu testen, würde man metamask+browser-solidity verwenden, um an eine Adresse zu senden, die bereits ETH hatte. Wenn es fehlschlägt, dann ist es nicht der Fall. Wenn es nicht fehlschlägt, dann ist wahrscheinlich das passiert.
Es kann immer noch ein Fehler in der Metamaske sein, da sie falsch berechnet hat, wie viel Gas bereitgestellt werden soll.
BEARBEITEN:
Ich habe vielleicht die Antwort gefunden.
Der Vergleich eines erfolgreichen Geth mit einer erfolglosen Metamaske (ich nehme an) zeigt, dass die Rohtransaktionen tatsächlich unterschiedlich sind. Ich vermute, dass der Client, der die erfolglose Transaktion gesendet hat, Felder anders oder nur fehlerhaft formatiert.
An dieser Stelle würde ich einen Fehler mit Metamask einreichen. Es übersteigt meine eigene Fähigkeit zu debuggen.
Zuerst dachte ich, dass wir vielleicht das Gas irgendwie falsch berechnet haben und Transaktionen fehlgeschlagen sind, da die meisten der fehlgeschlagenen TXs sehr wenig Gas haben, aber tatsächlich schienen fast identische Transaktionen mit weniger Gas erfolgreich zu sein, wie dieses Paar: https://testnet. etherscan.io/tx/0x5dde4e0536756b380b34a6fed79bda50bbe274c25b07ac1812f0d816917b9fbd https://testnet.etherscan.io/tx/0xd2f0047ee8d6ed27a8435352c809a95484e9c24c90a24c0d6
Eine Sache, die mir aufgefallen ist, ist, dass es sich bei diesen beiden Verträgen eigentlich um unterschiedliche Verträge handelt, daher bin ich mir nicht sicher, von welchem Sie den Quellcode gepostet haben.
Beachten Sie auch, dass Sie einige Muster zum Senden verwenden, die in den Solidity-Dokumenten nicht empfohlen werden: https://solidity.readthedocs.io/en/develop/security-considerations.html?highlight=send#sending-and -Empfangs-Äther
Ich stelle fest, dass einige der fehlgeschlagenen Transaktionen auf Verträge zurückzuführen sind, und dies sind einige der gefährlicheren Zeiten, um die send
Funktion zu verwenden, da diese Verträge das Gas verbrennen könnten.
Entschuldigung, ich habe eine Weile damit verbracht, ich bin mir nicht sicher, ob ich es gefunden habe.
Ich hatte das gleiche Problem mit Remix + Ganache, ich wechselte zu einem anderen Ethereum Test Net und das Problem tauchte nicht auf. Versuchen Sie es mit einem anderen Testnetz.
Mikko Ohtamaa
Juan Ignacio Pérez Sakristán
Juan Ignacio Pérez Sakristán
Juan Ignacio Pérez Sakristán
Mikko Ohtamaa
Tjaden Hess
Juan Ignacio Pérez Sakristán