Warum hat das Ethereum-Protokoll keinen Indikator für eine fehlgeschlagene Transaktion?

Warum hat das Ethereum-Protokoll keinen klaren Indikator für eine rückgängig gemachte Transaktion?

Hier gibt es eine Heuristik sowie eine Problemumgehung mit Geth . Aber es gibt wahrscheinlich Möglichkeiten, wie das Protokoll einen klaren Indikator liefern könnte. Könnte beispielsweise ein Transaktionsbeleg eine boolesche Eigenschaft für kein Gas haben?

Was könnte das Protokoll tun, um einen „Out of Gas“-Indikator bereitzustellen, und warum wurde keiner implementiert?

Ich denke, es könnte bei einem Angriff verwendet werden, um einen Knoten dazu zu bringen, zusätzliche Arbeit kostenlos zu erledigen. Idk
Wäre es nicht eine gute Idee, eine EIP zu machen?
Ich denke, es ist eine sehr gute Idee, diese Informationen in der Transaktionsquittung zu haben.

Antworten (2)

Der größte Teil des Protokolls (und insbesondere der Transaktionsbeleg) ist konsenskritisch. Die Menge der verarbeiteten Informationen muss so weit wie möglich begrenzt und stabil sein. Eine Fehlermeldung entspricht nicht wirklich diesen Anforderungen.

Andererseits können Implementierungen diese Art von Informationen leicht hervorbringen. Zumindest tun dies sowohl Ethereumj als auch Geth. Ein Beispiel finden Sie hier in der Eigenschaft "execution_error":

http://api.blockcypher.com/v1/eth/main/txs/0x63b904db45e52924ff37e998a5553e2c9993bb89c0922c869fb7af8139af33ad

Verwenden Sie für Geth debug.traceTransactionoder etwas anderes, wo eine neue Antwort auf ethereum.stackexchange.com/questions/6007/… helfen würde?

Das Protokoll wurde in Block 4370000 (Byzanz) dahingehend aktualisiert, dass statusden Quittungen ein Indikator hinzugefügt wurde.

eth.getTransactionReceipt(transactionHash)gibt ein statusFeld zurück, das einen Wert hat, 0wann eine Transaktion fehlgeschlagen ist und 1wann die Transaktion erfolgreich war.

Hier ist ein Beispiel, das das statusFeld zeigt:

{ blockHash: '0xb1fcff633029ee18ab6482b58ff8b6e95dd7c82a954c852157152a7a6d32785e',
  blockNumber: 4370000,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  gasUsed: 21000,
  logs: [],
  logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
  root: null,
  status: 1, // **** HERE IS THE STATUS FIELD *****
  transactionHash: '0x1421a887a02301ae127bf2cd4c006116053c9dc4a255e69ea403a2d77c346cf5',
  transactionIndex: 0 }

(Blöcke vor 4370000 haben einen statusNullwert.)

Näheres hier .

Was erhalten Sie im Statusfeld zurück, wenn Sie eth.getTransactionReceipt(transactionHash) aufrufen, bevor der mit dem Tx-Hash verknüpfte Block abgebaut wird?