Überprüfen, ob die Transaktion über RPC fehlgeschlagen ist

Ich rufe einen Vertrag über geth RPC mit sendTransaction auf und erhalte einen Transaktions-Hash. Gibt es eine Möglichkeit, über die Geth-RPC-Schnittstelle zu überprüfen, ob diese Transaktion aufgrund eines VM-Abbruchs fehlgeschlagen ist (Solidity throw-Anweisung, ähnlich)?

Der Transaktionsbeleg scheint keine Variablen zu bieten, die dies sagen.

Antworten (2)

Die Antwort von @eth ist nicht korrekt.

Verwenden Sie eth_getTransactionReceipt, um den Status zu erhalten: QUANTITY entweder 1 (Erfolg) oder 0 (Fehler) ist genauer

Referenz:
https://eth.wiki/json-rpc/API

             // Request
            curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}'

            // Result
            {
            "id":1,
            "jsonrpc":"2.0",
            "result": {
                transactionHash: '0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238',
                transactionIndex:  '0x1', // 1
                blockNumber: '0xb', // 11
                blockHash: '0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b',
                cumulativeGasUsed: '0x33bc', // 13244
                gasUsed: '0x4dc', // 1244
                contractAddress: '0xb60e8dd61c5d32be8058bb8eb970870f07233155', // or null, if none was created
                logs: [{
                    // logs as returned by getFilterLogs, etc.
                }, ...],
                logsBloom: "0x00...0", // 256 byte bloom filter
                status: '0x1'
            }
            }
Ich habe die richtige Antwortmarkierung verschoben. Beachten Sie, dass die ursprüngliche Antwort 2016 geschrieben wurde und das statusFeld zu diesem Zeitpunkt in keiner API existierte.

Das Überprüfen des Transaktionsbelegs auf gas == gasUsedist eine praktische Heuristik , da die VM nur dann abbricht, wenn sie das gesamte Gas verbraucht.

Derzeit gibt es keinen Indikator für eine Transaktion, bei der das Benzin ausgegangen ist, daher ist nichts Präziseres als die Heuristik über RPC verfügbar.

Wie wäre es mit throw-Anweisung? Verhält es sich genauso?
Ja, der Link „Alles Gas verbrauchen“ weist auf die Frage hin: Warum verbraucht ein Solidity-Wurf alles Gas?