paradigmxyz / revm-inspectors

EVM Execution Hooks.
Apache License 2.0
183 stars 71 forks source link

fix: gas and gasUsed in trace root only for ParityTrace #171

Closed ZzPoLariszZ closed 3 months ago

ZzPoLariszZ commented 3 months ago

Description

This pull request is Part 1/2 of fixing the bug where the gas and gasUsed fields in Parity Trace root are incorrect.

Part 2/2 paradigmxyz/reth#9761

Related Issues and Pull Requests

Problem

The gas and gasUsed fields in Geth Debug Trace root should be the gas limit and gas used for the entire transaction.

However, two fields in Parity Trace root should be the original ones.

Reproducible Example

With the latest version Reth v1.0.3, using trace_transaction() to trace
the transaction 0x03128677ee3a9623d20f3c677f423ccc592d126374bf32e331343dd1bdf38b61

curl http://localhost:8545 \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"method":"trace_transaction","params":["0x03128677ee3a9623d20f3c677f423ccc592d126374bf32e331343dd1bdf38b61"],"id":1,"jsonrpc":"2.0"}'  

From Reth

gas: 0x55493 (349331)
gasUsed: 0x32d16 (208150)

From Etherscan and QuickNode

gas: 0x4f227 (324135)
gasUsed: 0x36622 (222754)

Solution for revm-inspectors

  1. Not modify gas_limit and gas_used in the trace root

    - gas_limit = context.env.tx.gas_limit;
    - trace.set_root_trace_gas_used(gas_used);
    - trace.gas_used = gas_used(context.spec_id(), gas.spent(), gas.refunded() as u64);
  2. The modification in Step 1 will cause another problem

    The gas field for Geth Debug Trace root will also be reset (not the gas limitation for the entire transaction).

    therefore, can define set_transaction_gas_limit() and with_transaction_gas_limit() for Geth Debug,

    which is similar to current set_transaction_gas_used() and with_transaction_gas_used() for Parity.

  3. Then, modify the Reth Part:

    crates/rpc/rpc/src/trace.rs and crates/rpc/rpc/src/debug.rs to completely fix the bug.

Miscellaneous