Kein Benzin mehr beim Aufrufen der Vertragsmethode - Browser Solidity & Metamask

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.

Geben Sie hier die Bildbeschreibung ein

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 ...

Es ist cumulateGasUsed, das Sie überprüfen müssen, 508930
Laut ethereum.stackexchange.com/questions/3346/… hat das kumulative Gas mit allen TXs im selben Block zu tun. Warum sollte ich Gebühren für alle Sendungen im Block zahlen?
Außerdem ist 3000000 höher als 508930
Die Methode sendFundsToFriend ist tatsächlich nicht kostenpflichtig. Es ist der Vertrag, der sein eigenes Geld an einen Freund sendet, nicht der Absender. Betrag muss 0 sein.
@JuanIgnacioPérezSacristán: Entschuldigung, Sie hatten Recht, alle Transaktionen sind kumulativ
Es ist schwierig, Ihnen zu helfen, wenn wir den Vertragscode nicht sehen können. Könnten Sie die relevante Solidität posten?

Antworten (3)

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.

Leider funktioniert es auch so nicht: testnet.etherscan.io/tx/… In diesem Fall ist die Zieladresse testnet.etherscan.io/address/… mit mehreren vorherigen txs und einem nicht null Guthaben. Dasselbe TX, das einen Geth-Knoten verwendet, funktioniert von einem Geth-Knoten aus => testnet.etherscan.io/tx/…
Bei näherer Betrachtung scheint es, dass Metamask genau genug Gas sendet, während Geth zusätzliches Gas sendet. Ich bin mir nicht sicher, warum es kaputt gehen würde, wenn es gerade genug hat - es gibt eine kleine Anzahl obskurer Möglichkeiten. (Ich glaube nicht, dass es sich um ein Rückerstattungsproblem handelt, da es keine Speicherlöschung oder Selbstzerstörung gibt.)
gas gesendet von metamask: 33787 auf testnet.etherscan.io/tx/… 58787 auf testnet.etherscan.io/tx/… und testnet.etherscan.io/tx/… während geth 1000000 sendet, aber nur 23263 ausgibt => testnet. etherscan.io/tx/…
Ich kann mir immer noch nicht vorstellen, dass es etwas anderes ist, als nicht genug Benzin zu haben, da die Transaktionen ansonsten identisch sind. Welcher Client es gesendet hat, sollte keine Rolle spielen, da es Miner sind, die es ausführen.
Oder nicht!? Siehe meine neueste Bearbeitung.
Danke Matthäus. Ein Bug mit Metamask ist auch meine Hypothese.

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 sendFunktion 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.

Mein Fehler. Es gibt zwei Versionen des Vertrags, aber die neueste ist diese testnet.etherscan.io/address/… und diese entspricht dem Quellcode.
Sollte ich also ein Auszahlungsmuster anstelle eines Sendemusters verwenden?
Sie sollten wahrscheinlich "draw" anstelle von "send" verwenden, aber das beantwortet nicht ganz, warum dies passiert ist.

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.