diff --git a/cmd/evm/testdata/12/exp.json b/cmd/evm/testdata/12/exp.json index 9f88273f734..0589c867585 100644 --- a/cmd/evm/testdata/12/exp.json +++ b/cmd/evm/testdata/12/exp.json @@ -13,7 +13,7 @@ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "receipts": [], + "receipts": null, "rejected": [ { "index": 0, diff --git a/cmd/evm/testdata/19/exp_arrowglacier.json b/cmd/evm/testdata/19/exp_arrowglacier.json index 266b955565b..85506a07ae9 100644 --- a/cmd/evm/testdata/19/exp_arrowglacier.json +++ b/cmd/evm/testdata/19/exp_arrowglacier.json @@ -17,7 +17,7 @@ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "receipts": [], + "receipts": null, "currentDifficulty": "0x2000000200000", "gasUsed": "0x0" } diff --git a/cmd/evm/testdata/19/exp_london.json b/cmd/evm/testdata/19/exp_london.json index d594281e4be..10e11aedd5b 100644 --- a/cmd/evm/testdata/19/exp_london.json +++ b/cmd/evm/testdata/19/exp_london.json @@ -17,7 +17,7 @@ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "receipts": [], + "receipts": null, "currentDifficulty": "0x2000080000000", "gasUsed": "0x0" } diff --git a/cmd/evm/testdata/5/exp.json b/cmd/evm/testdata/5/exp.json index 5feeff85c09..1815d430588 100644 --- a/cmd/evm/testdata/5/exp.json +++ b/cmd/evm/testdata/5/exp.json @@ -16,7 +16,7 @@ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "receipts": [], + "receipts": null, "currentDifficulty": "0x20000", "gasUsed": "0x0" } diff --git a/cmd/evm/testdata/7/exp.json b/cmd/evm/testdata/7/exp.json index 23ca9f5cf97..e5b41ef0d21 100644 --- a/cmd/evm/testdata/7/exp.json +++ b/cmd/evm/testdata/7/exp.json @@ -368,7 +368,7 @@ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "receipts": [], + "receipts": null, "currentDifficulty": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020000", "gasUsed": "0x0" } diff --git a/cmd/state/commands/erigon22.go b/cmd/state/commands/erigon22.go index 55dffedbd41..16ca55ababf 100644 --- a/cmd/state/commands/erigon22.go +++ b/cmd/state/commands/erigon22.go @@ -305,6 +305,7 @@ func processBlock22(startTxNum uint64, trace bool, txNumStart uint64, rw *Reader txNum++ // Pre-block transaction ww.w.SetTxNum(txNum) + getHashFn := core.GetHashFn(header, getHeader) for i, tx := range block.Transactions() { if txNum >= startTxNum { @@ -312,7 +313,7 @@ func processBlock22(startTxNum uint64, trace bool, txNumStart uint64, rw *Reader ibs.Prepare(tx.Hash(), block.Hash(), i) ct := NewCallTracer() vmConfig.Tracer = ct - receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, ww, header, tx, usedGas, vmConfig, nil) + receipt, _, err := core.ApplyTransaction(chainConfig, getHashFn, engine, nil, gp, ibs, ww, header, tx, usedGas, vmConfig, nil) if err != nil { return 0, nil, fmt.Errorf("could not apply tx %d [%x] failed: %w", i, tx.Hash(), err) } diff --git a/cmd/state/commands/state_recon.go b/cmd/state/commands/state_recon.go index 83f6f9bd156..edb70a1068d 100644 --- a/cmd/state/commands/state_recon.go +++ b/cmd/state/commands/state_recon.go @@ -183,7 +183,8 @@ func (rw *ReconWorker) runTxNum(txNum uint64) { vmConfig := vm.Config{NoReceipts: true, SkipAnalysis: core.SkipAnalysis(rw.chainConfig, blockNum)} contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } ibs.Prepare(txHash, rw.lastBlockHash, int(txIndex)) - _, _, err = core.ApplyTransaction(rw.chainConfig, rw.getHeader, rw.engine, nil, gp, ibs, noop, rw.lastHeader, txn, usedGas, vmConfig, contractHasTEVM) + getHashFn := core.GetHashFn(rw.lastHeader, rw.getHeader) + _, _, err = core.ApplyTransaction(rw.chainConfig, getHashFn, rw.engine, nil, gp, ibs, noop, rw.lastHeader, txn, usedGas, vmConfig, contractHasTEVM) if err != nil { panic(fmt.Errorf("could not apply tx %d [%x] failed: %w", txIndex, txHash, err)) } diff --git a/core/blockchain.go b/core/blockchain.go index dc8af60a6c6..6b845347df9 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -87,7 +87,6 @@ func ExecuteBlockEphemerallyForBSC( block.Uncles() ibs := state.New(stateReader) header := block.Header() - var receipts types.Receipts usedGas := new(uint64) gp := new(GasPool) gp.AddGas(block.GasLimit()) @@ -95,6 +94,7 @@ func ExecuteBlockEphemerallyForBSC( var ( rejectedTxs []*RejectedTx includedTxs types.Transactions + receipts types.Receipts ) if !vmConfig.ReadOnly { @@ -123,7 +123,7 @@ func ExecuteBlockEphemerallyForBSC( if vmConfig.Debug && vmConfig.Tracer == nil { tracer, err := getTracer(i, tx.Hash()) if err != nil { - panic(err) + return nil, fmt.Errorf("could not obtain tracer: %w", err) } vmConfig.Tracer = tracer writeTrace = true @@ -137,10 +137,11 @@ func ExecuteBlockEphemerallyForBSC( vmConfig.Tracer = nil } - if err != nil && statelessExec { + if err != nil { + if !statelessExec { + return nil, fmt.Errorf("could not apply tx %d from block %d [%v]: %w", i, block.NumberU64(), tx.Hash().Hex(), err) + } rejectedTxs = append(rejectedTxs, &RejectedTx{i, err.Error()}) - } else if err != nil && !statelessExec { - return nil, fmt.Errorf("could not apply tx %d from block %d [%v]: %w", i, block.NumberU64(), tx.Hash().Hex(), err) } else { includedTxs = append(includedTxs, tx) if !vmConfig.NoReceipts { @@ -181,20 +182,20 @@ func ExecuteBlockEphemerallyForBSC( receiptSha = types.DeriveSha(receipts) } - var bloom types.Bloom - if chainConfig.IsByzantium(header.Number.Uint64()) && !vmConfig.NoReceipts { - if !statelessExec && newBlock.ReceiptHash() != block.ReceiptHash() { + if !statelessExec && receiptSha != block.ReceiptHash() { return nil, fmt.Errorf("mismatched receipt headers for block %d (%s != %s)", block.NumberU64(), newBlock.ReceiptHash().Hex(), block.Header().ReceiptHash.Hex()) } } if !statelessExec && newBlock.GasUsed() != header.GasUsed { return nil, fmt.Errorf("gas used by execution: %d, in header: %d", *usedGas, header.GasUsed) } + + var bloom types.Bloom if !vmConfig.NoReceipts { bloom = newBlock.Bloom() - if !statelessExec && newBlock.Bloom() != header.Bloom { - return nil, fmt.Errorf("bloom computed by execution: %x, in header: %x", newBlock.Bloom(), header.Bloom) + if !statelessExec && bloom != header.Bloom { + return nil, fmt.Errorf("bloom computed by execution: %x, in header: %x", bloom, header.Bloom) } } @@ -238,7 +239,7 @@ func ExecuteBlockEphemerally( block.Uncles() ibs := state.New(stateReader) header := block.Header() - var receipts = make(types.Receipts, 0) + usedGas := new(uint64) gp := new(GasPool) gp.AddGas(block.GasLimit()) @@ -246,6 +247,7 @@ func ExecuteBlockEphemerally( var ( rejectedTxs []*RejectedTx includedTxs types.Transactions + receipts types.Receipts ) if !vmConfig.ReadOnly { @@ -265,7 +267,7 @@ func ExecuteBlockEphemerally( if vmConfig.Debug && vmConfig.Tracer == nil { tracer, err := getTracer(i, tx.Hash()) if err != nil { - panic(err) + return nil, fmt.Errorf("could not obtain tracer: %w", err) } vmConfig.Tracer = tracer writeTrace = true @@ -279,10 +281,11 @@ func ExecuteBlockEphemerally( vmConfig.Tracer = nil } - if err != nil && statelessExec { + if err != nil { + if !statelessExec { + return nil, fmt.Errorf("could not apply tx %d from block %d [%v]: %w", i, block.NumberU64(), tx.Hash().Hex(), err) + } rejectedTxs = append(rejectedTxs, &RejectedTx{i, err.Error()}) - } else if err != nil && !statelessExec { - return nil, fmt.Errorf("could not apply tx %d from block %d [%v]: %w", i, block.NumberU64(), tx.Hash().Hex(), err) } else { includedTxs = append(includedTxs, tx) if !vmConfig.NoReceipts { @@ -291,7 +294,6 @@ func ExecuteBlockEphemerally( } } - var bloom types.Bloom receiptSha := types.DeriveSha(receipts) if !statelessExec && chainConfig.IsByzantium(header.Number.Uint64()) && !vmConfig.NoReceipts && receiptSha != block.ReceiptHash() { return nil, fmt.Errorf("mismatched receipt headers for block %d", block.NumberU64()) @@ -300,6 +302,8 @@ func ExecuteBlockEphemerally( if !statelessExec && *usedGas != header.GasUsed { return nil, fmt.Errorf("gas used by execution: %d, in header: %d", *usedGas, header.GasUsed) } + + var bloom types.Bloom if !vmConfig.NoReceipts { bloom = types.CreateBloom(receipts) if !statelessExec && bloom != header.Bloom { diff --git a/eth/stagedsync/stage_execute.go b/eth/stagedsync/stage_execute.go index 47d415d642e..0bb8ace725d 100644 --- a/eth/stagedsync/stage_execute.go +++ b/eth/stagedsync/stage_execute.go @@ -122,6 +122,10 @@ func executeBlock( return h } + getTracer := func(txIndex int, txHash ecom.Hash) (vm.Tracer, error) { + return vm.NewStructLogger(&vm.LogConfig{}), nil + } + callTracer := calltracer.NewCallTracer(contractHasTEVM) vmConfig.Debug = true vmConfig.Tracer = callTracer @@ -131,24 +135,17 @@ func executeBlock( var execRs *core.EphemeralExecResult _, isPoSa := cfg.engine.(consensus.PoSA) getHashFn := core.GetHashFn(block.Header(), getHeader) + if isPoSa { - getTracer := func(txIndex int, txHash ecom.Hash) (vm.Tracer, error) { - return vm.NewStructLogger(&vm.LogConfig{}), nil - } execRs, err = core.ExecuteBlockEphemerallyForBSC(cfg.chainConfig, &vmConfig, getHashFn, cfg.engine, block, stateReader, stateWriter, epochReader{tx: tx}, chainReader{config: cfg.chainConfig, tx: tx, blockReader: cfg.blockReader}, contractHasTEVM, false, getTracer) - receipts = execRs.Receipts - stateSyncReceipt = execRs.ReceiptForStorage } else { - getTracer := func(txIndex int, txHash ecom.Hash) (vm.Tracer, error) { - return vm.NewStructLogger(&vm.LogConfig{}), nil - } execRs, err = core.ExecuteBlockEphemerally(cfg.chainConfig, &vmConfig, getHashFn, cfg.engine, block, stateReader, stateWriter, epochReader{tx: tx}, chainReader{config: cfg.chainConfig, tx: tx, blockReader: cfg.blockReader}, contractHasTEVM, false, getTracer) - receipts = execRs.Receipts - stateSyncReceipt = execRs.ReceiptForStorage } if err != nil { return err } + receipts = execRs.Receipts + stateSyncReceipt = execRs.ReceiptForStorage if writeReceipts { if err = rawdb.AppendReceipts(tx, blockNum, receipts); err != nil { @@ -160,7 +157,6 @@ func executeBlock( return err } } - } if cfg.changeSetHook != nil {