feat: api: improve the correctness of Eth's trace_block (#11609)
* Improve the correctness of Eth's trace_block
- Improve encoding/decoding of parameters and return values:
- Encode "native" parameters and return values with Solidity ABI.
- Correctly decode parameters to "create" calls.
- Use the correct (ish) output for "create" calls.
- Handle all forms of "create".
- Make robust with respect to reverts:
- Use the actor ID/address from the trace instead of looking it up in
the state-tree (may not exist in the state-tree due to a revert).
- Gracefully handle failed actor/contract creation.
- Improve performance:
- We avoid looking anything up in the state-tree when translating the
trace, which should significantly improve performance.
- Improve code readability:
- Remove all "backtracking" logic.
- Use an "environment" struct to store temporary state instead of
attaching it to the trace.
- Fix random bugs:
- Fix an allocation bug in the "address" logic (need to set the
capacity before modifying the slice).
- Improved error checking/handling.
- Use correct types for `trace_block` action/results (create, call, etc.).
- And use the correct types for Result/Action structs instead of reusing the same "Call" action every time.
- Improve error messages.
This commit is contained in:
+18
-1
@@ -868,9 +868,26 @@ type FullNode interface {
|
||||
Web3ClientVersion(ctx context.Context) (string, error) //perm:read
|
||||
|
||||
// TraceAPI related methods
|
||||
|
||||
// Returns an OpenEthereum-compatible trace of the given block (implementing `trace_block`),
|
||||
// translating Filecoin semantics into Ethereum semantics and tracing both EVM and FVM calls.
|
||||
//
|
||||
// Returns traces created at given block
|
||||
// Features:
|
||||
//
|
||||
// - FVM actor create events, calls, etc. show up as if they were EVM smart contract events.
|
||||
// - Native FVM call inputs are ABI-encoded (Solidity ABI) as if they were calls to a
|
||||
// `handle_filecoin_method(uint64 method, uint64 codec, bytes params)` function
|
||||
// (where `codec` is the IPLD codec of `params`).
|
||||
// - Native FVM call outputs (return values) are ABI-encoded as `(uint32 exit_code, uint64
|
||||
// codec, bytes output)` where `codec` is the IPLD codec of `output`.
|
||||
//
|
||||
// Limitations (for now):
|
||||
//
|
||||
// 1. Block rewards are not included in the trace.
|
||||
// 2. SELFDESTRUCT operations are not included in the trace.
|
||||
// 3. EVM smart contract "create" events always specify `0xfe` as the "code" for newly created EVM smart contracts.
|
||||
EthTraceBlock(ctx context.Context, blkNum string) ([]*ethtypes.EthTraceBlock, error) //perm:read
|
||||
|
||||
// Replays all transactions in a block returning the requested traces for each transaction
|
||||
EthTraceReplayBlockTransactions(ctx context.Context, blkNum string, traceTypes []string) ([]*ethtypes.EthTraceReplayBlockTransaction, error) //perm:read
|
||||
|
||||
|
||||
Reference in New Issue
Block a user