From 2b5718fe9248fd9869a27408d31e8b59ef747315 Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Tue, 23 Sep 2025 14:39:44 +0200 Subject: [PATCH] cmd/evm/internal/t8ntool: fix nil pointer dereference in Osaka blob gas calculation (#32714) The parent header was missing the BaseFee field when calculating the reserve price for EIP-7918 in the Osaka fork, causing a nil pointer dereference. This fix ensures BaseFee is properly set from ParentBaseFee in the environment. Added regression test case 34 to verify Osaka fork blob gas calculation works correctly with parent base fee. --- cmd/evm/internal/t8ntool/execution.go | 1 + cmd/evm/t8n_test.go | 8 ++++++++ cmd/evm/testdata/34/README.md | 6 ++++++ cmd/evm/testdata/34/alloc.json | 6 ++++++ cmd/evm/testdata/34/env.json | 18 ++++++++++++++++++ cmd/evm/testdata/34/exp.json | 23 +++++++++++++++++++++++ cmd/evm/testdata/34/txs.json | 1 + 7 files changed, 63 insertions(+) create mode 100644 cmd/evm/testdata/34/README.md create mode 100644 cmd/evm/testdata/34/alloc.json create mode 100644 cmd/evm/testdata/34/env.json create mode 100644 cmd/evm/testdata/34/exp.json create mode 100644 cmd/evm/testdata/34/txs.json diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index f595a9bf4d..f1e65afe9c 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -191,6 +191,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, Time: pre.Env.ParentTimestamp, ExcessBlobGas: pre.Env.ParentExcessBlobGas, BlobGasUsed: pre.Env.ParentBlobGasUsed, + BaseFee: pre.Env.ParentBaseFee, } header := &types.Header{ Time: pre.Env.Timestamp, diff --git a/cmd/evm/t8n_test.go b/cmd/evm/t8n_test.go index 46146be787..3c6fd90b47 100644 --- a/cmd/evm/t8n_test.go +++ b/cmd/evm/t8n_test.go @@ -296,6 +296,14 @@ func TestT8n(t *testing.T) { output: t8nOutput{alloc: true, result: true}, expOut: "exp.json", }, + { // Osaka test, EIP-7918 blob gas with parent base fee + base: "./testdata/34", + input: t8nInput{ + "alloc.json", "txs.json", "env.json", "Osaka", "", + }, + output: t8nOutput{alloc: true, result: true}, + expOut: "exp.json", + }, } { args := []string{"t8n"} args = append(args, tc.output.get()...) diff --git a/cmd/evm/testdata/34/README.md b/cmd/evm/testdata/34/README.md new file mode 100644 index 0000000000..a18f85ca14 --- /dev/null +++ b/cmd/evm/testdata/34/README.md @@ -0,0 +1,6 @@ +This test verifies that Osaka fork blob gas calculation works correctly when +parentBaseFee is provided. It tests the EIP-7918 reserve price calculation +which requires parent.BaseFee to be properly set. + +Regression test for: nil pointer dereference when parent.BaseFee was not +included in the parent header during Osaka fork blob gas calculations. \ No newline at end of file diff --git a/cmd/evm/testdata/34/alloc.json b/cmd/evm/testdata/34/alloc.json new file mode 100644 index 0000000000..199de13285 --- /dev/null +++ b/cmd/evm/testdata/34/alloc.json @@ -0,0 +1,6 @@ +{ + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x1000000000000000000", + "nonce": "0x0" + } +} \ No newline at end of file diff --git a/cmd/evm/testdata/34/env.json b/cmd/evm/testdata/34/env.json new file mode 100644 index 0000000000..ae2bde5ef3 --- /dev/null +++ b/cmd/evm/testdata/34/env.json @@ -0,0 +1,18 @@ +{ + "currentCoinbase": "0x0000000000000000000000000000000000000000", + "currentDifficulty": "0x0", + "currentRandom": "0x0000000000000000000000000000000000000000000000000000000000000000", + "currentGasLimit": "0x5f5e100", + "currentNumber": "0x1", + "currentTimestamp": "0x1000", + "parentTimestamp": "0x0", + "currentBaseFee": "0x10", + "parentBaseFee": "0x0a", + "parentGasUsed": "0x0", + "parentGasLimit": "0x5f5e100", + "currentExcessBlobGas": "0x0", + "parentExcessBlobGas": "0x0", + "parentBlobGasUsed": "0x20000", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "withdrawals": [] +} \ No newline at end of file diff --git a/cmd/evm/testdata/34/exp.json b/cmd/evm/testdata/34/exp.json new file mode 100644 index 0000000000..56d24a532e --- /dev/null +++ b/cmd/evm/testdata/34/exp.json @@ -0,0 +1,23 @@ +{ + "alloc": { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x1000000000000000000" + } + }, + "result": { + "stateRoot": "0x01c28492482a1a1f66224726ef1059a7036fce69d1d2c991b65cd013725d5742", + "txRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "currentDifficulty": null, + "receipts": [], + "gasUsed": "0x0", + "currentBaseFee": "0x10", + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "currentExcessBlobGas": "0x0", + "blobGasUsed": "0x0", + "requestsHash": "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "requests": [] + } +} \ No newline at end of file diff --git a/cmd/evm/testdata/34/txs.json b/cmd/evm/testdata/34/txs.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/cmd/evm/testdata/34/txs.json @@ -0,0 +1 @@ +[] \ No newline at end of file