From 5f27956f59e1e94dd9ed3b800f2aa649bc5ca588 Mon Sep 17 00:00:00 2001 From: Jan Kalina Date: Mon, 11 Apr 2022 10:22:14 +0200 Subject: [PATCH 1/2] Fix concurrent access to blockCtx in debug_traceBlock --- ethapi/api.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ethapi/api.go b/ethapi/api.go index 1b5d72f78..35fc218c4 100644 --- a/ethapi/api.go +++ b/ethapi/api.go @@ -2179,12 +2179,14 @@ func (api *PublicDebugAPI) traceBlock(ctx context.Context, block *evmcore.EvmBlo threads = len(txs) } - blockCtx := api.b.GetBlockContext(block.Header()) + blockHeader := block.Header() blockHash := block.Hash for th := 0; th < threads; th++ { pend.Add(1) go func() { defer pend.Done() + blockCtx := api.b.GetBlockContext(blockHeader) + // Fetch and execute the next transaction trace tasks for task := range jobs { msg, _ := txs[task.index].AsMessage(signer, block.BaseFee) @@ -2203,6 +2205,7 @@ func (api *PublicDebugAPI) traceBlock(ctx context.Context, block *evmcore.EvmBlo }() } // Feed the transactions into the tracers and return + blockCtx := api.b.GetBlockContext(blockHeader) var failed error for i, tx := range txs { // Send the trace task over for execution From 14064f03c71d4203795125f78c146c803b2f88fe Mon Sep 17 00:00:00 2001 From: Jan Kalina Date: Mon, 11 Apr 2022 11:10:27 +0200 Subject: [PATCH 2/2] Revert "Fix debug_traceBlock - prevent garbage collecting of EvmHeader ref" This reverts commit a826ce881ad225e50e0b8d848b839747b3923e23. --- evmcore/evm.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/evmcore/evm.go b/evmcore/evm.go index d4dfcb496..8958754f1 100644 --- a/evmcore/evm.go +++ b/evmcore/evm.go @@ -48,7 +48,7 @@ func NewEVMBlockContext(header *EvmHeader, chain DummyChain, author *common.Addr return vm.BlockContext{ CanTransfer: CanTransfer, Transfer: Transfer, - GetHash: GetHashFn(*header, chain), + GetHash: GetHashFn(header, chain), Coinbase: beneficiary, BlockNumber: new(big.Int).Set(header.Number), Time: new(big.Int).SetUint64(uint64(header.Time.Unix())), @@ -67,7 +67,7 @@ func NewEVMTxContext(msg Message) vm.TxContext { } // GetHashFn returns a GetHashFunc which retrieves header hashes by number -func GetHashFn(ref EvmHeader, chain DummyChain) func(n uint64) common.Hash { +func GetHashFn(ref *EvmHeader, chain DummyChain) func(n uint64) common.Hash { // Cache will initially contain [refHash.parent], // Then fill up with [refHash.p, refHash.pp, refHash.ppp, ...] var cache []common.Hash