diff --git a/eth/tracers/api.go b/eth/tracers/api.go index dccd12a35f..5a60766373 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -953,15 +953,19 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc } defer release() - // Apply block override to header to ensure GetHashFn works correctly with - // blocks in the future (#32175). - h := block.Header() - if config != nil { - h = config.BlockOverrides.MakeHeader(h) + h := *block.Header() + + if config != nil && config.BlockOverrides != nil { + h = *config.BlockOverrides.MakeHeader(block.Header()) + if h.Number.Uint64() == block.NumberU64()+1 { + h.ParentHash = block.Hash() + } else if h.Number.Uint64() > block.NumberU64()+1 { + h.ParentHash = common.Hash{} + } } - // Apply block overrides to block context, if applicable. - vmctx := core.NewEVMBlockContext(h, api.chainContext(ctx), nil) + vmctx := core.NewEVMBlockContext(&h, api.chainContext(ctx), nil) + // Apply the customization rules if required. if config != nil { if overrideErr := config.BlockOverrides.Apply(&vmctx); overrideErr != nil { return nil, overrideErr diff --git a/eth/tracers/api_test.go b/eth/tracers/api_test.go index 048978fcd0..670f9f1186 100644 --- a/eth/tracers/api_test.go +++ b/eth/tracers/api_test.go @@ -689,6 +689,9 @@ func TestTracingWithOverrides(t *testing.T) { Failed bool ReturnValue string } + overrideBlockNumber := genBlocks + 1 + parentHash := backend.chain.GetHeaderByNumber(uint64(genBlocks)).Hash().Hex()[2:] + expectParent := fmt.Sprintf("0x%064s", parentHash) var testSuite = []struct { blockNumber rpc.BlockNumber @@ -789,6 +792,25 @@ func TestTracingWithOverrides(t *testing.T) { }, want: `{"gas":72666,"failed":false,"returnValue":"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}`, }, + { // Override blocknumber, and query a blockhash + blockNumber: rpc.LatestBlockNumber, + call: ethapi.TransactionArgs{ + From: &accounts[0].addr, + Input: newRPCBytes([]byte{ + byte(vm.PUSH1), byte(genBlocks), + byte(vm.BLOCKHASH), + byte(vm.PUSH1), 0x00, + byte(vm.MSTORE), + byte(vm.PUSH1), 0x20, + byte(vm.PUSH1), 0x00, + byte(vm.RETURN), + }), // blocknumber + }, + config: &TraceCallConfig{ + BlockOverrides: &override.BlockOverrides{Number: (*hexutil.Big)(big.NewInt(int64(overrideBlockNumber)))}, + }, + want: fmt.Sprintf(`{"gas":59590,"failed":false,"returnValue":"%s"}`, expectParent), + }, /* pragma solidity =0.8.12;