diff --git a/consensus/dummy/consensus.go b/consensus/dummy/consensus.go index a67a26bfb1..47d868382c 100644 --- a/consensus/dummy/consensus.go +++ b/consensus/dummy/consensus.go @@ -8,6 +8,7 @@ import ( "fmt" "math/big" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/consensus/misc/eip4844" "github.com/ava-labs/libevm/core/state" @@ -31,17 +32,18 @@ type Mode struct { ModeSkipCoinbase bool } -type ( - DummyEngine struct { - consensusMode Mode - } -) +type DummyEngine struct { + consensusMode Mode + desiredDelayExcess *acp226.DelayExcess +} func NewDummyEngine( mode Mode, + desiredDelayExcess *acp226.DelayExcess, // Guides the min delay excess (ACP-226) toward the desired value ) *DummyEngine { return &DummyEngine{ - consensusMode: mode, + consensusMode: mode, + desiredDelayExcess: desiredDelayExcess, } } @@ -306,6 +308,18 @@ func (eng *DummyEngine) FinalizeAndAssemble(chain consensus.ChainHeaderReader, h } header.Extra = append(extraPrefix, header.Extra...) + // Set the min delay excess + minDelayExcess, err := customheader.MinDelayExcess( + configExtra, + parent, + header.Time, + eng.desiredDelayExcess, + ) + if err != nil { + return nil, fmt.Errorf("failed to calculate min delay excess: %w", err) + } + headerExtra.MinDelayExcess = minDelayExcess + // commit the final state root header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) diff --git a/core/genesis.go b/core/genesis.go index 4e180aebbf..9039bd978f 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -34,6 +34,7 @@ import ( "math/big" "time" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/common/hexutil" "github.com/ava-labs/libevm/common/math" @@ -363,7 +364,8 @@ func (g *Genesis) toBlock(db ethdb.Database, triedb *triedb.Database) *types.Blo headerExtra.TimeMilliseconds = new(uint64) *headerExtra.TimeMilliseconds = g.Timestamp * 1000 - headerExtra.MinDelayExcess = new(uint64) + headerExtra.MinDelayExcess = new(acp226.DelayExcess) + *headerExtra.MinDelayExcess = acp226.InitialDelayExcess } } diff --git a/core/genesis_extra_test.go b/core/genesis_extra_test.go index 42e77fee8b..be1d9ab2b4 100644 --- a/core/genesis_extra_test.go +++ b/core/genesis_extra_test.go @@ -87,7 +87,7 @@ func TestGenesisToBlockDecoding(t *testing.T) { upgradetest.Durango: common.HexToHash("0x74dd5d404823f342fb3d372ea289565e5b1ff25d07e48a59db8130c5f61e941a"), upgradetest.Etna: common.HexToHash("0xa5de01cb7e5c6d721be62ab4b37878e863d65e0c1fe308e5df1f4c5b148650f9"), upgradetest.Fortuna: common.HexToHash("0xa5de01cb7e5c6d721be62ab4b37878e863d65e0c1fe308e5df1f4c5b148650f9"), - upgradetest.Granite: common.HexToHash("0x9f3811050eedcfd289695cd16bbc3ccd9db4c3b32aec1125e96654df35285656"), + upgradetest.Granite: common.HexToHash("0x4d5ff1b8509d30c6b7842b784a6cf8be78e34c78bc5de8559ea6f15ad18d6a10"), } for fork, chainConfig := range paramstest.ForkToChainConfig { t.Run(fork.String(), func(t *testing.T) { diff --git a/core/genesis_test.go b/core/genesis_test.go index 671b1a477f..4c22ad4449 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -65,7 +65,7 @@ func setupGenesisBlock(db ethdb.Database, triedb *triedb.Database, genesis *Gene } func TestGenesisBlockForTesting(t *testing.T) { - genesisBlockForTestingHash := common.HexToHash("0x66d680f02c4a370700a8c0af564d147f65b797cc6752ee62675c6e6927dc45ae") + genesisBlockForTestingHash := common.HexToHash("0x7d576d17f8083b02cada42b908f66c0f45a9be57a06a4673b89e53b81053a787") block := GenesisBlockForTesting(rawdb.NewMemoryDatabase(), common.Address{1}, big.NewInt(1)) if block.Hash() != genesisBlockForTestingHash { t.Errorf("wrong testing genesis hash, got %v, want %v", block.Hash(), genesisBlockForTestingHash) diff --git a/internal/ethapi/testdata/eth_getBlockByHash-hash-1.json b/internal/ethapi/testdata/eth_getBlockByHash-hash-1.json index 11cbc97ffd..875a3ca847 100644 --- a/internal/ethapi/testdata/eth_getBlockByHash-hash-1.json +++ b/internal/ethapi/testdata/eth_getBlockByHash-hash-1.json @@ -7,17 +7,18 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x52f9cafd5ba612afa80c61f0cbd1413fd7ff88adccc6caf31b135abafff8f5c2", + "hash": "0x08982d2a5e6262a2f7222c39d1d549b32ddda7d9def85d0cace4c23d20a8447f", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x1", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "parentHash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x2e1", + "size": "0x2e5", "stateRoot": "0xa17c770ca1e18e544a4a6d14b611cd03b505d465cc967ba5162d59ce459b553d", "timestamp": "0xa", "timestampMilliseconds": "0x2710", diff --git a/internal/ethapi/testdata/eth_getBlockByHash-hash-genesis.json b/internal/ethapi/testdata/eth_getBlockByHash-hash-genesis.json index d8d5a902a7..ab470c9daa 100644 --- a/internal/ethapi/testdata/eth_getBlockByHash-hash-genesis.json +++ b/internal/ethapi/testdata/eth_getBlockByHash-hash-genesis.json @@ -7,9 +7,9 @@ "extraData": "0x", "gasLimit": "0x47e7c4", "gasUsed": "0x0", - "hash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "hash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "minDelayExcess": "0x0", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", @@ -18,7 +18,7 @@ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x227", + "size": "0x22a", "stateRoot": "0xd883f48b83cc9c1e8389453beb4ad4e572462eec049ca4fffbe16ecefb3fe937", "timestamp": "0x0", "timestampMilliseconds": "0x0", diff --git a/internal/ethapi/testdata/eth_getBlockByHash-hash-latest-1-fullTx.json b/internal/ethapi/testdata/eth_getBlockByHash-hash-latest-1-fullTx.json index c9e8591785..f84692e853 100644 --- a/internal/ethapi/testdata/eth_getBlockByHash-hash-latest-1-fullTx.json +++ b/internal/ethapi/testdata/eth_getBlockByHash-hash-latest-1-fullTx.json @@ -7,24 +7,25 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "hash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x9", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x93f96b6105875977135589cdc68e8a2cfb9fca99875737c0c3b594cbb9a09ff0", + "parentHash": "0x37b615767ca349072aa3956340106ba6d289a2868d05e49aa98d93485e40c64b", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x2e2", + "size": "0x2e6", "stateRoot": "0x67e974f6435c557282cd778ae1ae16dded6e84db121d3ab27b931726bd48e2ac", "timestamp": "0x5a", "timestampMilliseconds": "0x15f90", "totalDifficulty": "0x9", "transactions": [ { - "blockHash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "blockHash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "blockNumber": "0x9", "from": "0x703c4b2bd70c169f5717101caee543299fc946c7", "gas": "0x5208", diff --git a/internal/ethapi/testdata/eth_getBlockByHash-hash-latest.json b/internal/ethapi/testdata/eth_getBlockByHash-hash-latest.json index 50d2b3f4a4..8b55dd6fd1 100644 --- a/internal/ethapi/testdata/eth_getBlockByHash-hash-latest.json +++ b/internal/ethapi/testdata/eth_getBlockByHash-hash-latest.json @@ -7,17 +7,18 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x63901ae32d0f88fb19b10f95eaa27adfc9fa93f6e6a6c0a9e4f89b43ae85998c", + "hash": "0xfaf24721ea90162f6491710986d08ad46e4a1f5657643d78e95bf69155379a63", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0xa", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "parentHash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x2e2", + "size": "0x2e6", "stateRoot": "0x2b8307a066fd4575aca1fa6b42ef2c3a860a9c40337ea0d647c9f25e22062e34", "timestamp": "0x64", "timestampMilliseconds": "0x186a0", diff --git a/internal/ethapi/testdata/eth_getBlockByNumber-number-0.json b/internal/ethapi/testdata/eth_getBlockByNumber-number-0.json index d8d5a902a7..ab470c9daa 100644 --- a/internal/ethapi/testdata/eth_getBlockByNumber-number-0.json +++ b/internal/ethapi/testdata/eth_getBlockByNumber-number-0.json @@ -7,9 +7,9 @@ "extraData": "0x", "gasLimit": "0x47e7c4", "gasUsed": "0x0", - "hash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "hash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "minDelayExcess": "0x0", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", @@ -18,7 +18,7 @@ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x227", + "size": "0x22a", "stateRoot": "0xd883f48b83cc9c1e8389453beb4ad4e572462eec049ca4fffbe16ecefb3fe937", "timestamp": "0x0", "timestampMilliseconds": "0x0", diff --git a/internal/ethapi/testdata/eth_getBlockByNumber-number-1.json b/internal/ethapi/testdata/eth_getBlockByNumber-number-1.json index 11cbc97ffd..875a3ca847 100644 --- a/internal/ethapi/testdata/eth_getBlockByNumber-number-1.json +++ b/internal/ethapi/testdata/eth_getBlockByNumber-number-1.json @@ -7,17 +7,18 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x52f9cafd5ba612afa80c61f0cbd1413fd7ff88adccc6caf31b135abafff8f5c2", + "hash": "0x08982d2a5e6262a2f7222c39d1d549b32ddda7d9def85d0cace4c23d20a8447f", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x1", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "parentHash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x2e1", + "size": "0x2e5", "stateRoot": "0xa17c770ca1e18e544a4a6d14b611cd03b505d465cc967ba5162d59ce459b553d", "timestamp": "0xa", "timestampMilliseconds": "0x2710", diff --git a/internal/ethapi/testdata/eth_getBlockByNumber-number-latest-1.json b/internal/ethapi/testdata/eth_getBlockByNumber-number-latest-1.json index c9e8591785..f84692e853 100644 --- a/internal/ethapi/testdata/eth_getBlockByNumber-number-latest-1.json +++ b/internal/ethapi/testdata/eth_getBlockByNumber-number-latest-1.json @@ -7,24 +7,25 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "hash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x9", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x93f96b6105875977135589cdc68e8a2cfb9fca99875737c0c3b594cbb9a09ff0", + "parentHash": "0x37b615767ca349072aa3956340106ba6d289a2868d05e49aa98d93485e40c64b", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x2e2", + "size": "0x2e6", "stateRoot": "0x67e974f6435c557282cd778ae1ae16dded6e84db121d3ab27b931726bd48e2ac", "timestamp": "0x5a", "timestampMilliseconds": "0x15f90", "totalDifficulty": "0x9", "transactions": [ { - "blockHash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "blockHash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "blockNumber": "0x9", "from": "0x703c4b2bd70c169f5717101caee543299fc946c7", "gas": "0x5208", diff --git a/internal/ethapi/testdata/eth_getBlockByNumber-tag-latest.json b/internal/ethapi/testdata/eth_getBlockByNumber-tag-latest.json index 50d2b3f4a4..8b55dd6fd1 100644 --- a/internal/ethapi/testdata/eth_getBlockByNumber-tag-latest.json +++ b/internal/ethapi/testdata/eth_getBlockByNumber-tag-latest.json @@ -7,17 +7,18 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x63901ae32d0f88fb19b10f95eaa27adfc9fa93f6e6a6c0a9e4f89b43ae85998c", + "hash": "0xfaf24721ea90162f6491710986d08ad46e4a1f5657643d78e95bf69155379a63", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0xa", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "parentHash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": "0x2e2", + "size": "0x2e6", "stateRoot": "0x2b8307a066fd4575aca1fa6b42ef2c3a860a9c40337ea0d647c9f25e22062e34", "timestamp": "0x64", "timestampMilliseconds": "0x186a0", diff --git a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-blob-tx.json b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-blob-tx.json index 37dd25b39c..751edca0d9 100644 --- a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-blob-tx.json +++ b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-blob-tx.json @@ -2,7 +2,7 @@ { "blobGasPrice": "0x1", "blobGasUsed": "0x20000", - "blockHash": "0x4fa7d90ba0f07eb991a22aec4a7817ede8087b260ab8cd84127558c503dfd1d9", + "blockHash": "0x1cf2a277ebde08f28f4ec154beaab1db3aa0cd41a3efce73f34d951a50b59bca", "blockNumber": "0x6", "contractAddress": null, "cumulativeGasUsed": "0x5208", diff --git a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-contract-create-tx.json b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-contract-create-tx.json index 275642c881..8b49d39c58 100644 --- a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-contract-create-tx.json +++ b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-contract-create-tx.json @@ -1,6 +1,6 @@ [ { - "blockHash": "0x0ffa78199b2bf471d297c64a89b35058fff2b500e3ea7a1daf5761905c86fb14", + "blockHash": "0x76609cbbb79f1d90a718395e6568ee89eee2a3740e4fa0579664f675f5dd175f", "blockNumber": "0x2", "contractAddress": "0xae9bea628c4ce503dcfd7e305cab4e29e7476592", "cumulativeGasUsed": "0xcf50", diff --git a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-dynamic-fee-tx.json b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-dynamic-fee-tx.json index b23ee64a46..867d84df30 100644 --- a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-dynamic-fee-tx.json +++ b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-dynamic-fee-tx.json @@ -1,6 +1,6 @@ [ { - "blockHash": "0x43f701765a9fd308be64da61d57e85817959f80a2d745d20f4d459f81e253932", + "blockHash": "0x579b19afb8b51f342ee152a43ef5f375c12ace059a12dcc01d3d1e3e9e24cc16", "blockNumber": "0x4", "contractAddress": null, "cumulativeGasUsed": "0x538d", diff --git a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-contract-call-tx.json b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-contract-call-tx.json index de971be064..23e1fe31ec 100644 --- a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-contract-call-tx.json +++ b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-contract-call-tx.json @@ -1,6 +1,6 @@ [ { - "blockHash": "0x78653d23f1301edaac5a3a25b261ec974bf24741995367ca854c47208ea93833", + "blockHash": "0x3bb3015e290cd7e342997782443d4240d4dc75525bbf9509f40c5419d7b96415", "blockNumber": "0x3", "contractAddress": null, "cumulativeGasUsed": "0x5e28", @@ -19,7 +19,7 @@ "blockNumber": "0x3", "transactionHash": "0x7366a7738f47e32f5b6d292ca064b6b66f295d3931533a3745975be1191fccdf", "transactionIndex": "0x0", - "blockHash": "0x78653d23f1301edaac5a3a25b261ec974bf24741995367ca854c47208ea93833", + "blockHash": "0x3bb3015e290cd7e342997782443d4240d4dc75525bbf9509f40c5419d7b96415", "logIndex": "0x0", "removed": false } diff --git a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-transfer-tx.json b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-transfer-tx.json index 7e1232d8f8..7773f3bb41 100644 --- a/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-transfer-tx.json +++ b/internal/ethapi/testdata/eth_getBlockReceipts-block-with-legacy-transfer-tx.json @@ -1,6 +1,6 @@ [ { - "blockHash": "0x3f2b1059fa6d59071108bdd74bc8a7e326e021441b6922eecf9493ea3fded761", + "blockHash": "0x981cd0cffd6c669f90ee1abb945ff06eaaca24be76c01c60b16874f023e4145c", "blockNumber": "0x1", "contractAddress": null, "cumulativeGasUsed": "0x5208", diff --git a/internal/ethapi/testdata/eth_getBlockReceipts-tag-latest.json b/internal/ethapi/testdata/eth_getBlockReceipts-tag-latest.json index 37dd25b39c..751edca0d9 100644 --- a/internal/ethapi/testdata/eth_getBlockReceipts-tag-latest.json +++ b/internal/ethapi/testdata/eth_getBlockReceipts-tag-latest.json @@ -2,7 +2,7 @@ { "blobGasPrice": "0x1", "blobGasUsed": "0x20000", - "blockHash": "0x4fa7d90ba0f07eb991a22aec4a7817ede8087b260ab8cd84127558c503dfd1d9", + "blockHash": "0x1cf2a277ebde08f28f4ec154beaab1db3aa0cd41a3efce73f34d951a50b59bca", "blockNumber": "0x6", "contractAddress": null, "cumulativeGasUsed": "0x5208", diff --git a/internal/ethapi/testdata/eth_getHeaderByHash-hash-0.json b/internal/ethapi/testdata/eth_getHeaderByHash-hash-0.json index 6d59fcc4ed..6ba2ae74a3 100644 --- a/internal/ethapi/testdata/eth_getHeaderByHash-hash-0.json +++ b/internal/ethapi/testdata/eth_getHeaderByHash-hash-0.json @@ -7,9 +7,9 @@ "extraData": "0x", "gasLimit": "0x47e7c4", "gasUsed": "0x0", - "hash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "hash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "minDelayExcess": "0x0", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", diff --git a/internal/ethapi/testdata/eth_getHeaderByHash-hash-1.json b/internal/ethapi/testdata/eth_getHeaderByHash-hash-1.json index 169e82a41f..e652c83428 100644 --- a/internal/ethapi/testdata/eth_getHeaderByHash-hash-1.json +++ b/internal/ethapi/testdata/eth_getHeaderByHash-hash-1.json @@ -7,14 +7,15 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x52f9cafd5ba612afa80c61f0cbd1413fd7ff88adccc6caf31b135abafff8f5c2", + "hash": "0x08982d2a5e6262a2f7222c39d1d549b32ddda7d9def85d0cace4c23d20a8447f", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x1", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "parentHash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot": "0xa17c770ca1e18e544a4a6d14b611cd03b505d465cc967ba5162d59ce459b553d", diff --git a/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest-1.json b/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest-1.json index 71d4e10e0e..1160811bbe 100644 --- a/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest-1.json +++ b/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest-1.json @@ -7,14 +7,15 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "hash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x9", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x93f96b6105875977135589cdc68e8a2cfb9fca99875737c0c3b594cbb9a09ff0", + "parentHash": "0x37b615767ca349072aa3956340106ba6d289a2868d05e49aa98d93485e40c64b", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot": "0x67e974f6435c557282cd778ae1ae16dded6e84db121d3ab27b931726bd48e2ac", diff --git a/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest.json b/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest.json index 255422a9da..5fd5f5dc0d 100644 --- a/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest.json +++ b/internal/ethapi/testdata/eth_getHeaderByHash-hash-latest.json @@ -7,14 +7,15 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x63901ae32d0f88fb19b10f95eaa27adfc9fa93f6e6a6c0a9e4f89b43ae85998c", + "hash": "0xfaf24721ea90162f6491710986d08ad46e4a1f5657643d78e95bf69155379a63", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0xa", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "parentHash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot": "0x2b8307a066fd4575aca1fa6b42ef2c3a860a9c40337ea0d647c9f25e22062e34", diff --git a/internal/ethapi/testdata/eth_getHeaderByNumber-number-0.json b/internal/ethapi/testdata/eth_getHeaderByNumber-number-0.json index 6d59fcc4ed..6ba2ae74a3 100644 --- a/internal/ethapi/testdata/eth_getHeaderByNumber-number-0.json +++ b/internal/ethapi/testdata/eth_getHeaderByNumber-number-0.json @@ -7,9 +7,9 @@ "extraData": "0x", "gasLimit": "0x47e7c4", "gasUsed": "0x0", - "hash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "hash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "minDelayExcess": "0x0", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", diff --git a/internal/ethapi/testdata/eth_getHeaderByNumber-number-1.json b/internal/ethapi/testdata/eth_getHeaderByNumber-number-1.json index 169e82a41f..e652c83428 100644 --- a/internal/ethapi/testdata/eth_getHeaderByNumber-number-1.json +++ b/internal/ethapi/testdata/eth_getHeaderByNumber-number-1.json @@ -7,14 +7,15 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x52f9cafd5ba612afa80c61f0cbd1413fd7ff88adccc6caf31b135abafff8f5c2", + "hash": "0x08982d2a5e6262a2f7222c39d1d549b32ddda7d9def85d0cace4c23d20a8447f", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x1", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x2bd12052feeb217a8521d3b4fb9998b17924e9f6d776d1ce45d9dd46d17b087c", + "parentHash": "0x3dab1f520258d2b470c8fb84c334d37cdc1d4e25f8df44b006be1bb33cfd3856", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot": "0xa17c770ca1e18e544a4a6d14b611cd03b505d465cc967ba5162d59ce459b553d", diff --git a/internal/ethapi/testdata/eth_getHeaderByNumber-number-latest-1.json b/internal/ethapi/testdata/eth_getHeaderByNumber-number-latest-1.json index 71d4e10e0e..1160811bbe 100644 --- a/internal/ethapi/testdata/eth_getHeaderByNumber-number-latest-1.json +++ b/internal/ethapi/testdata/eth_getHeaderByNumber-number-latest-1.json @@ -7,14 +7,15 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "hash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0x9", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x93f96b6105875977135589cdc68e8a2cfb9fca99875737c0c3b594cbb9a09ff0", + "parentHash": "0x37b615767ca349072aa3956340106ba6d289a2868d05e49aa98d93485e40c64b", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot": "0x67e974f6435c557282cd778ae1ae16dded6e84db121d3ab27b931726bd48e2ac", diff --git a/internal/ethapi/testdata/eth_getHeaderByNumber-tag-latest.json b/internal/ethapi/testdata/eth_getHeaderByNumber-tag-latest.json index 255422a9da..5fd5f5dc0d 100644 --- a/internal/ethapi/testdata/eth_getHeaderByNumber-tag-latest.json +++ b/internal/ethapi/testdata/eth_getHeaderByNumber-tag-latest.json @@ -7,14 +7,15 @@ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x7a1200", "gasUsed": "0x5208", - "hash": "0x63901ae32d0f88fb19b10f95eaa27adfc9fa93f6e6a6c0a9e4f89b43ae85998c", + "hash": "0xfaf24721ea90162f6491710986d08ad46e4a1f5657643d78e95bf69155379a63", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "minDelayExcess": "0x799d4c", "miner": "0x0000000000000000000000000000000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000000", "number": "0xa", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0xe11dcbcbee11121181a96a9780b736360fa5ce4eea025a196e2bc46fc7f2d369", + "parentHash": "0xf6fb07f85d6d23ec543aa2e4b79b86fe06cb73ce3c21e74eee61d77cd9c05267", "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", "stateRoot": "0x2b8307a066fd4575aca1fa6b42ef2c3a860a9c40337ea0d647c9f25e22062e34", diff --git a/internal/ethapi/testdata/eth_getTransactionReceipt-blob-tx.json b/internal/ethapi/testdata/eth_getTransactionReceipt-blob-tx.json index 561a7fd391..8b82e9707c 100644 --- a/internal/ethapi/testdata/eth_getTransactionReceipt-blob-tx.json +++ b/internal/ethapi/testdata/eth_getTransactionReceipt-blob-tx.json @@ -1,7 +1,7 @@ { "blobGasPrice": "0x1", "blobGasUsed": "0x20000", - "blockHash": "0x4fa7d90ba0f07eb991a22aec4a7817ede8087b260ab8cd84127558c503dfd1d9", + "blockHash": "0x1cf2a277ebde08f28f4ec154beaab1db3aa0cd41a3efce73f34d951a50b59bca", "blockNumber": "0x6", "contractAddress": null, "cumulativeGasUsed": "0x5208", diff --git a/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-tx.json b/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-tx.json index ff2028186d..75516859a4 100644 --- a/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-tx.json +++ b/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-tx.json @@ -1,5 +1,5 @@ { - "blockHash": "0x0ffa78199b2bf471d297c64a89b35058fff2b500e3ea7a1daf5761905c86fb14", + "blockHash": "0x76609cbbb79f1d90a718395e6568ee89eee2a3740e4fa0579664f675f5dd175f", "blockNumber": "0x2", "contractAddress": "0xae9bea628c4ce503dcfd7e305cab4e29e7476592", "cumulativeGasUsed": "0xcf50", diff --git a/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-with-access-list.json b/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-with-access-list.json index 92eb2ddb4b..a6cd09a656 100644 --- a/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-with-access-list.json +++ b/internal/ethapi/testdata/eth_getTransactionReceipt-create-contract-with-access-list.json @@ -1,5 +1,5 @@ { - "blockHash": "0xd45b3a64e6aef92805a6019a56bc500dbfe1861f0358621b70f38d3756831706", + "blockHash": "0x6ec9409647ceabc51e373e4676d53228ec48c5919752b40701420595404918d3", "blockNumber": "0x5", "contractAddress": "0xfdaa97661a584d977b4d3abb5370766ff5b86a18", "cumulativeGasUsed": "0xe01c", diff --git a/internal/ethapi/testdata/eth_getTransactionReceipt-dynamic-tx-with-logs.json b/internal/ethapi/testdata/eth_getTransactionReceipt-dynamic-tx-with-logs.json index 7d882c2ec0..031abf8511 100644 --- a/internal/ethapi/testdata/eth_getTransactionReceipt-dynamic-tx-with-logs.json +++ b/internal/ethapi/testdata/eth_getTransactionReceipt-dynamic-tx-with-logs.json @@ -1,5 +1,5 @@ { - "blockHash": "0x43f701765a9fd308be64da61d57e85817959f80a2d745d20f4d459f81e253932", + "blockHash": "0x579b19afb8b51f342ee152a43ef5f375c12ace059a12dcc01d3d1e3e9e24cc16", "blockNumber": "0x4", "contractAddress": null, "cumulativeGasUsed": "0x538d", diff --git a/internal/ethapi/testdata/eth_getTransactionReceipt-normal-transfer-tx.json b/internal/ethapi/testdata/eth_getTransactionReceipt-normal-transfer-tx.json index 8aeb14c723..8ccee3e84c 100644 --- a/internal/ethapi/testdata/eth_getTransactionReceipt-normal-transfer-tx.json +++ b/internal/ethapi/testdata/eth_getTransactionReceipt-normal-transfer-tx.json @@ -1,5 +1,5 @@ { - "blockHash": "0x3f2b1059fa6d59071108bdd74bc8a7e326e021441b6922eecf9493ea3fded761", + "blockHash": "0x981cd0cffd6c669f90ee1abb945ff06eaaca24be76c01c60b16874f023e4145c", "blockNumber": "0x1", "contractAddress": null, "cumulativeGasUsed": "0x5208", diff --git a/internal/ethapi/testdata/eth_getTransactionReceipt-with-logs.json b/internal/ethapi/testdata/eth_getTransactionReceipt-with-logs.json index 5d025212b1..c5c119f6c0 100644 --- a/internal/ethapi/testdata/eth_getTransactionReceipt-with-logs.json +++ b/internal/ethapi/testdata/eth_getTransactionReceipt-with-logs.json @@ -1,5 +1,5 @@ { - "blockHash": "0x78653d23f1301edaac5a3a25b261ec974bf24741995367ca854c47208ea93833", + "blockHash": "0x3bb3015e290cd7e342997782443d4240d4dc75525bbf9509f40c5419d7b96415", "blockNumber": "0x3", "contractAddress": null, "cumulativeGasUsed": "0x5e28", @@ -18,7 +18,7 @@ "blockNumber": "0x3", "transactionHash": "0x7366a7738f47e32f5b6d292ca064b6b66f295d3931533a3745975be1191fccdf", "transactionIndex": "0x0", - "blockHash": "0x78653d23f1301edaac5a3a25b261ec974bf24741995367ca854c47208ea93833", + "blockHash": "0x3bb3015e290cd7e342997782443d4240d4dc75525bbf9509f40c5419d7b96415", "logIndex": "0x0", "removed": false } diff --git a/plugin/evm/config/config.go b/plugin/evm/config/config.go index d6c3afb3a4..f750abbd6d 100644 --- a/plugin/evm/config/config.go +++ b/plugin/evm/config/config.go @@ -26,6 +26,11 @@ type Config struct { // Airdrop AirdropFile string `json:"airdrop"` + // MinDelayTarget is the minimum delay between blocks (in milliseconds) that this node will attempt to use + // when creating blocks. If this config is not specified, the node will + // default to use the parent block's target delay per second. + MinDelayTarget *uint64 `json:"min-delay-target,omitempty"` + // Subnet EVM APIs ValidatorsAPIEnabled bool `json:"validators-api-enabled"` AdminAPIEnabled bool `json:"admin-api-enabled"` diff --git a/plugin/evm/customheader/min_delay_excess.go b/plugin/evm/customheader/min_delay_excess.go new file mode 100644 index 0000000000..0857d69ed6 --- /dev/null +++ b/plugin/evm/customheader/min_delay_excess.go @@ -0,0 +1,113 @@ +// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package customheader + +import ( + "errors" + "fmt" + + "github.com/ava-labs/avalanchego/vms/evm/acp226" + "github.com/ava-labs/libevm/core/types" + + "github.com/ava-labs/subnet-evm/params/extras" + "github.com/ava-labs/subnet-evm/plugin/evm/customtypes" +) + +var ( + errRemoteMinDelayExcessSet = errors.New("remote min delay excess should be nil") + errRemoteMinDelayExcessNil = errors.New("remote min delay excess should not be nil") + errIncorrectMinDelayExcess = errors.New("incorrect min delay excess") + errParentMinDelayExcessNil = errors.New("parent min delay excess should not be nil") +) + +// MinDelayExcess calculates the minimum delay excess based on the parent, current +// header and the desired min delay excess. +// If the `desiredMinDelayExcess` is nil, the parent's delay excess is used. +func MinDelayExcess( + config *extras.ChainConfig, + parent *types.Header, + timestamp uint64, + desiredMinDelayExcess *acp226.DelayExcess, +) (*acp226.DelayExcess, error) { + // If the header is in Granite, calculate the min delay excess. + // Otherwise, return nil. + if config.IsGranite(timestamp) { + minDelayExcess, err := minDelayExcess(config, parent, desiredMinDelayExcess) + if err != nil { + return nil, fmt.Errorf("calculating min delay excess: %w", err) + } + return &minDelayExcess, nil + } + return nil, nil +} + +// VerifyMinDelayExcess verifies that the min delay excess in header is consistent. +func VerifyMinDelayExcess( + config *extras.ChainConfig, + parent *types.Header, + header *types.Header, +) error { + switch { + case config.IsGranite(header.Time): + remoteDelayExcess := customtypes.GetHeaderExtra(header).MinDelayExcess + if remoteDelayExcess == nil { + return fmt.Errorf("%w: %s", errRemoteMinDelayExcessNil, header.Hash()) + } + // By passing in the claimed excess, we ensure that the expected + // excess is equal to the claimed excess if it is possible + // to have correctly set it to that value. Otherwise, the resulting + // value will be as close to the claimed value as possible, but would + // not be equal. + expectedDelayExcess, err := minDelayExcess( + config, + parent, + remoteDelayExcess, + ) + if err != nil { + return fmt.Errorf("calculating expected min delay excess: %w", err) + } + + if *remoteDelayExcess != expectedDelayExcess { + return fmt.Errorf("%w: expected %d, found %d", + errIncorrectMinDelayExcess, + expectedDelayExcess, + *remoteDelayExcess, + ) + } + default: + // Prior to Granite there was no expected min delay excess. + // TODO (ceyonur): this can be removed after Granite is activated. + if customtypes.GetHeaderExtra(header).MinDelayExcess != nil { + return fmt.Errorf("%w: %s", errRemoteMinDelayExcessSet, header.Hash()) + } + } + return nil +} + +// minDelayExcess takes the parent header and the desired min delay excess +// and returns the min delay excess for the child block. +// If the desired min delay excess is specified, moves the min delay excess as much +// as possible toward that desired value. +// Assumes the Granite upgrade has been activated. +func minDelayExcess( + config *extras.ChainConfig, + parent *types.Header, + desiredMinDelayExcess *acp226.DelayExcess, +) (acp226.DelayExcess, error) { + minDelayExcess := acp226.DelayExcess(acp226.InitialDelayExcess) + if config.IsGranite(parent.Time) { + // If the parent block was running with ACP-226, we start with the + // resulting min delay excess from the parent block. + parentMinDelayExcess := customtypes.GetHeaderExtra(parent).MinDelayExcess + if parentMinDelayExcess == nil { + return 0, fmt.Errorf("%w: %s", errParentMinDelayExcessNil, parent.Hash()) + } + minDelayExcess = *parentMinDelayExcess + } + + if desiredMinDelayExcess != nil { + minDelayExcess.UpdateDelayExcess(*desiredMinDelayExcess) + } + return minDelayExcess, nil +} diff --git a/plugin/evm/customheader/min_delay_excess_test.go b/plugin/evm/customheader/min_delay_excess_test.go new file mode 100644 index 0000000000..2f84b34801 --- /dev/null +++ b/plugin/evm/customheader/min_delay_excess_test.go @@ -0,0 +1,221 @@ +// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package customheader + +import ( + "testing" + + "github.com/ava-labs/avalanchego/vms/evm/acp226" + "github.com/ava-labs/libevm/core/types" + "github.com/stretchr/testify/require" + + "github.com/ava-labs/subnet-evm/params/extras" + "github.com/ava-labs/subnet-evm/plugin/evm/customtypes" + "github.com/ava-labs/subnet-evm/utils" + "github.com/ava-labs/subnet-evm/utils/utilstest" +) + +func TestMinDelayExcess(t *testing.T) { + activatingGraniteConfig := *extras.TestGraniteChainConfig + activatingGraniteTimestamp := uint64(1000) + activatingGraniteConfig.NetworkUpgrades.GraniteTimestamp = utils.NewUint64(activatingGraniteTimestamp) + + tests := []struct { + name string + config *extras.ChainConfig + parent *types.Header + header *types.Header + desiredMinDelayExcess *acp226.DelayExcess + expectedDelayExcess *acp226.DelayExcess + expectedErr error + }{ + // Pre-Granite tests + { + name: "pre_granite_returns_nil", + config: extras.TestFortunaChainConfig, // Pre-Granite config + parent: &types.Header{ + Time: 1000, + }, + header: &types.Header{ + Time: 1001, + }, + desiredMinDelayExcess: nil, + expectedDelayExcess: nil, + }, + { + name: "pre_granite_with_desired_value_returns_nil", + config: extras.TestFortunaChainConfig, // Pre-Granite config + parent: &types.Header{ + Time: 1000, + }, + header: &types.Header{ + Time: 1001, + }, + desiredMinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(1000)), + expectedDelayExcess: nil, + }, + { + name: "granite_first_block_initial_delay_excess", + config: &activatingGraniteConfig, + parent: &types.Header{ + Time: activatingGraniteTimestamp - 1, + }, + header: &types.Header{ + Time: activatingGraniteTimestamp + 1, + }, + desiredMinDelayExcess: nil, + expectedDelayExcess: utilstest.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess)), + }, + { + name: "granite_no_parent_min_delay_error", + config: extras.TestGraniteChainConfig, + parent: &types.Header{ + Time: 1000, + }, + header: &types.Header{ + Time: 1001, + }, + desiredMinDelayExcess: nil, + expectedDelayExcess: nil, + expectedErr: errParentMinDelayExcessNil, + }, + { + name: "granite_with_parent_min_delay", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: &types.Header{ + Time: 1001, + }, + desiredMinDelayExcess: nil, + expectedDelayExcess: utilstest.PointerTo(acp226.DelayExcess(500)), + }, + { + name: "granite_with_desired_min_delay_excess", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: &types.Header{ + Time: 1001, + }, + desiredMinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(1000)), + expectedDelayExcess: utilstest.PointerTo(acp226.DelayExcess(500 + acp226.MaxDelayExcessDiff)), + }, + { + name: "granite_with_zero_desired_value", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: &types.Header{ + Time: 1001, + }, + desiredMinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(0)), + expectedDelayExcess: utilstest.PointerTo(acp226.DelayExcess(500 - acp226.MaxDelayExcessDiff)), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + result, err := MinDelayExcess(test.config, test.parent, test.header.Time, test.desiredMinDelayExcess) + require.ErrorIs(t, err, test.expectedErr) + require.Equal(t, test.expectedDelayExcess, result) + }) + } +} + +func TestVerifyMinDelayExcess(t *testing.T) { + tests := []struct { + name string + config *extras.ChainConfig + parent *types.Header + header *types.Header + expectedErr error + }{ + { + name: "pre_granite_nil_min_delay_excess", + config: extras.TestFortunaChainConfig, // Pre-Granite config + parent: &types.Header{ + Time: 1000, + }, + header: &types.Header{ + Time: 1001, + }, + }, + { + name: "pre_granite_min_delay_excess_set_error", + config: extras.TestFortunaChainConfig, // Pre-Granite config + parent: &types.Header{ + Time: 1000, + }, + header: generateHeaderWithMinDelayExcess(1001, 1000), + expectedErr: errRemoteMinDelayExcessSet, + }, + { + name: "granite_nil_min_delay_excess_error", + config: extras.TestGraniteChainConfig, + parent: &types.Header{ + Time: 1000, + }, + header: &types.Header{ + Time: 1001, + }, + expectedErr: errRemoteMinDelayExcessNil, + }, + { + name: "granite_incorrect_min_delay_excess", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: generateHeaderWithMinDelayExcess(1001, 1000), + expectedErr: errIncorrectMinDelayExcess, + }, + { + name: "granite_incorrect_min_delay_excess_with_zero_desired", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: generateHeaderWithMinDelayExcess(1001, 0), + expectedErr: errIncorrectMinDelayExcess, + }, + { + name: "granite_correct_min_delay_excess", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: generateHeaderWithMinDelayExcess(1001, 500), + }, + { + name: "granite_with_increased_desired_min_delay_excess_correct", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: generateHeaderWithMinDelayExcess(1001, 700), + }, + { + name: "granite_with_decreased_desired_min_delay_excess_correct", + config: extras.TestGraniteChainConfig, + parent: generateHeaderWithMinDelayExcess(1000, 500), + header: generateHeaderWithMinDelayExcess(1001, 300), + }, + + // Different chain configs + { + name: "fortuna_config_no_verification", + config: extras.TestFortunaChainConfig, + parent: &types.Header{Time: 1000}, + header: &types.Header{Time: 1001}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := VerifyMinDelayExcess(test.config, test.parent, test.header) + require.ErrorIs(t, err, test.expectedErr) + }) + } +} + +func generateHeaderWithMinDelayExcess(timeSeconds uint64, minDelayExcess acp226.DelayExcess) *types.Header { + return customtypes.WithHeaderExtra( + &types.Header{ + Time: timeSeconds, + }, + &customtypes.HeaderExtra{ + MinDelayExcess: &minDelayExcess, + }, + ) +} diff --git a/plugin/evm/customtypes/block_ext.go b/plugin/evm/customtypes/block_ext.go index a008594069..34dcec5ec9 100644 --- a/plugin/evm/customtypes/block_ext.go +++ b/plugin/evm/customtypes/block_ext.go @@ -6,6 +6,8 @@ package customtypes import ( "math/big" + "github.com/ava-labs/avalanchego/vms/evm/acp226" + ethtypes "github.com/ava-labs/libevm/core/types" ) @@ -26,7 +28,7 @@ func BlockTimeMilliseconds(b *ethtypes.Block) *uint64 { return &cp } -func BlockMinDelayExcess(b *ethtypes.Block) *uint64 { +func BlockMinDelayExcess(b *ethtypes.Block) *acp226.DelayExcess { e := GetHeaderExtra(b.Header()).MinDelayExcess if e == nil { return nil diff --git a/plugin/evm/customtypes/block_ext_test.go b/plugin/evm/customtypes/block_ext_test.go index 011c359114..97a0e19c88 100644 --- a/plugin/evm/customtypes/block_ext_test.go +++ b/plugin/evm/customtypes/block_ext_test.go @@ -9,11 +9,13 @@ import ( "testing" "unsafe" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/libevm/common" "github.com/stretchr/testify/assert" "github.com/ava-labs/subnet-evm/internal/blocktest" "github.com/ava-labs/subnet-evm/utils" + "github.com/ava-labs/subnet-evm/utils/utilstest" // TODO(arr4n) These tests were originally part of the `subnet-evm/core/types` // package so assume the presence of identifiers. A dot-import reduces PR @@ -28,20 +30,24 @@ func TestBlockGetters(t *testing.T) { headerExtra *HeaderExtra wantBlockGasCost *big.Int wantTimeMilliseconds *uint64 + wantMinDelayExcess *acp226.DelayExcess }{ { name: "empty", headerExtra: &HeaderExtra{}, wantTimeMilliseconds: nil, + wantMinDelayExcess: nil, }, { name: "fields_set", headerExtra: &HeaderExtra{ BlockGasCost: big.NewInt(2), TimeMilliseconds: utils.NewUint64(3), + MinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(4)), }, wantBlockGasCost: big.NewInt(2), wantTimeMilliseconds: utils.NewUint64(3), + wantMinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(4)), }, } for _, test := range tests { @@ -57,6 +63,9 @@ func TestBlockGetters(t *testing.T) { timeMilliseconds := BlockTimeMilliseconds(block) assert.Equal(t, test.wantTimeMilliseconds, timeMilliseconds, "BlockTimeMilliseconds()") + + minDelayExcess := BlockMinDelayExcess(block) + assert.Equal(t, test.wantMinDelayExcess, minDelayExcess, "BlockMinDelayExcess()") }) } } @@ -128,6 +137,8 @@ func exportedFieldsPointToDifferentMemory[T interface { assertDifferentPointers(t, f, fieldCp) case *common.Hash: assertDifferentPointers(t, f, fieldCp) + case *acp226.DelayExcess: + assertDifferentPointers(t, f, fieldCp) case *uint64: assertDifferentPointers(t, f, fieldCp) case []uint8: diff --git a/plugin/evm/customtypes/block_test.go b/plugin/evm/customtypes/block_test.go index 39f1039216..f54072bf9d 100644 --- a/plugin/evm/customtypes/block_test.go +++ b/plugin/evm/customtypes/block_test.go @@ -33,6 +33,7 @@ import ( "reflect" "testing" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/common/math" "github.com/ava-labs/libevm/core/types" @@ -78,7 +79,7 @@ func TestBlockEncoding(t *testing.T) { check("BaseFee", block.BaseFee(), (*big.Int)(nil)) check("BlockGasCost", BlockGasCost(&block), (*big.Int)(nil)) check("TimeMilliseconds", BlockTimeMilliseconds(&block), (*uint64)(nil)) - check("MinDelayExcess", BlockMinDelayExcess(&block), (*uint64)(nil)) + check("MinDelayExcess", BlockMinDelayExcess(&block), (*acp226.DelayExcess)(nil)) check("Size", block.Size(), uint64(len(blockEnc))) check("BlockHash", block.Hash(), common.HexToHash("0x0a5843ac1cb04865017cb35a57b50b07084e5fcee39b5acadade33149f4fff9e")) @@ -121,7 +122,7 @@ func TestEIP1559BlockEncoding(t *testing.T) { check("BaseFee", block.BaseFee(), new(big.Int).SetUint64(1000000000)) check("BlockGasCost", BlockGasCost(&block), (*big.Int)(nil)) check("TimeMilliseconds", BlockTimeMilliseconds(&block), (*uint64)(nil)) - check("MinDelayExcess", BlockMinDelayExcess(&block), (*uint64)(nil)) + check("MinDelayExcess", BlockMinDelayExcess(&block), (*acp226.DelayExcess)(nil)) tx1 := types.NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), 50000, big.NewInt(10), nil) tx1, _ = tx1.WithSignature(types.HomesteadSigner{}, common.Hex2Bytes("9bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094f8a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b100")) @@ -187,7 +188,7 @@ func TestEIP2718BlockEncoding(t *testing.T) { check("BaseFee", block.BaseFee(), (*big.Int)(nil)) check("BlockGasCost", BlockGasCost(&block), (*big.Int)(nil)) check("TimeMilliseconds", BlockTimeMilliseconds(&block), (*uint64)(nil)) - check("MinDelayExcess", BlockMinDelayExcess(&block), (*uint64)(nil)) + check("MinDelayExcess", BlockMinDelayExcess(&block), (*acp226.DelayExcess)(nil)) // Create legacy tx. to := common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87") @@ -318,7 +319,7 @@ func TestSubnetEVMBlockEncoding(t *testing.T) { check("BaseFee", block.BaseFee(), big.NewInt(1_000_000_000)) check("BlockGasCost", BlockGasCost(&block), big.NewInt(100_000)) check("TimeMilliseconds", BlockTimeMilliseconds(&block), (*uint64)(nil)) - check("MinDelayExcess", BlockMinDelayExcess(&block), (*uint64)(nil)) + check("MinDelayExcess", BlockMinDelayExcess(&block), (*acp226.DelayExcess)(nil)) tx1 := types.NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), 50000, big.NewInt(10), nil) tx1, _ = tx1.WithSignature(types.HomesteadSigner{}, common.Hex2Bytes("9bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094f8a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b100")) diff --git a/plugin/evm/customtypes/header_ext.go b/plugin/evm/customtypes/header_ext.go index 1d6b0f1db7..b67816036b 100644 --- a/plugin/evm/customtypes/header_ext.go +++ b/plugin/evm/customtypes/header_ext.go @@ -7,6 +7,7 @@ import ( "io" "math/big" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/common/hexutil" "github.com/ava-labs/libevm/rlp" @@ -38,7 +39,7 @@ func WithHeaderExtra(h *ethtypes.Header, extra *HeaderExtra) *ethtypes.Header { type HeaderExtra struct { BlockGasCost *big.Int TimeMilliseconds *uint64 - MinDelayExcess *uint64 + MinDelayExcess *acp226.DelayExcess } // EncodeRLP RLP encodes the given [ethtypes.Header] and [HeaderExtra] together @@ -154,13 +155,13 @@ func (h *HeaderSerializable) updateToEth(eth *ethtypes.Header) { func (h *HeaderSerializable) updateFromExtras(extras *HeaderExtra) { h.BlockGasCost = extras.BlockGasCost h.TimeMilliseconds = extras.TimeMilliseconds - h.MinDelayExcess = extras.MinDelayExcess + h.MinDelayExcess = (*uint64)(extras.MinDelayExcess) } func (h *HeaderSerializable) updateToExtras(extras *HeaderExtra) { extras.BlockGasCost = h.BlockGasCost extras.TimeMilliseconds = h.TimeMilliseconds - extras.MinDelayExcess = h.MinDelayExcess + extras.MinDelayExcess = (*acp226.DelayExcess)(h.MinDelayExcess) } // NOTE: both generators currently do not support type aliases. @@ -211,6 +212,7 @@ type HeaderSerializable struct { TimeMilliseconds *uint64 `json:"timestampMilliseconds" rlp:"optional"` // MinDelayExcess was added by Granite and is ignored in legacy headers. + // We use *uint64 type here to avoid rlpgen generating incorrect code MinDelayExcess *uint64 `json:"minDelayExcess" rlp:"optional"` } diff --git a/plugin/evm/customtypes/header_ext_test.go b/plugin/evm/customtypes/header_ext_test.go index c39f54d773..ed601a80b1 100644 --- a/plugin/evm/customtypes/header_ext_test.go +++ b/plugin/evm/customtypes/header_ext_test.go @@ -13,11 +13,14 @@ import ( "testing" "unsafe" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/rlp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/ava-labs/subnet-evm/utils/utilstest" + // TODO(arr4n) These tests were originally part of the `subnet-evm/core/types` // package so assume the presence of identifiers. A dot-import reduces PR // noise during the refactoring. @@ -115,14 +118,14 @@ func headerWithNonZeroFields() (*Header, *HeaderExtra) { Nonce: BlockNonce{15}, BaseFee: big.NewInt(16), WithdrawalsHash: &common.Hash{17}, - BlobGasUsed: ptrTo(uint64(18)), - ExcessBlobGas: ptrTo(uint64(19)), + BlobGasUsed: utilstest.PointerTo(uint64(18)), + ExcessBlobGas: utilstest.PointerTo(uint64(19)), ParentBeaconRoot: &common.Hash{20}, } extra := &HeaderExtra{ BlockGasCost: big.NewInt(23), - TimeMilliseconds: ptrTo(uint64(24)), - MinDelayExcess: ptrTo(uint64(25)), + TimeMilliseconds: utilstest.PointerTo(uint64(24)), + MinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(25)), } return WithHeaderExtra(header, extra), extra } @@ -168,7 +171,13 @@ func allFieldsSet[T interface { assertNonZero(t, f) case *uint64: assertNonZero(t, f) - case []uint8: + case *[]uint8: + assertNonZero(t, f) + case *Header: + assertNonZero(t, f) + case *acp226.DelayExcess: + assertNonZero(t, f) + case []uint8, []*Header, Transactions, []*Transaction, Withdrawals, []*Withdrawal: assert.NotEmpty(t, f) default: t.Errorf("Field %q has unsupported type %T", field.Name, f) @@ -178,8 +187,8 @@ func allFieldsSet[T interface { } func assertNonZero[T interface { - common.Hash | common.Address | BlockNonce | uint64 | Bloom | - *big.Int | *common.Hash | *uint64 + common.Hash | common.Address | BlockNonce | uint32 | uint64 | Bloom | + *big.Int | *common.Hash | *uint64 | *[]uint8 | *Header | *acp226.DelayExcess }](t *testing.T, v T) { t.Helper() var zero T @@ -189,5 +198,3 @@ func assertNonZero[T interface { } // Note [TestCopyHeader] tests the [HeaderExtra.PostCopy] method. - -func ptrTo[T any](x T) *T { return &x } diff --git a/plugin/evm/vm.go b/plugin/evm/vm.go index a3d1a650c0..f95a0c0067 100644 --- a/plugin/evm/vm.go +++ b/plugin/evm/vm.go @@ -33,6 +33,7 @@ import ( "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/version" "github.com/ava-labs/avalanchego/vms/components/chain" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/firewood-go-ethhash/ffi" "github.com/ava-labs/libevm/common" "github.com/ava-labs/libevm/core/rawdb" @@ -603,6 +604,13 @@ func (vm *VM) initializeChain(lastAcceptedHash common.Hash, ethConfig ethconfig. if err != nil { return err } + + var desiredDelayExcess *acp226.DelayExcess + if vm.config.MinDelayTarget != nil { + desiredDelayExcess = new(acp226.DelayExcess) + *desiredDelayExcess = acp226.DesiredDelayExcess(*vm.config.MinDelayTarget) + } + vm.eth, err = eth.New( node, &vm.ethConfig, @@ -610,7 +618,10 @@ func (vm *VM) initializeChain(lastAcceptedHash common.Hash, ethConfig ethconfig. vm.chaindb, eth.Settings{MaxBlocksPerRequest: vm.config.MaxBlocksPerRequest}, lastAcceptedHash, - dummy.NewFaker(), + dummy.NewDummyEngine( + dummy.Mode{}, + desiredDelayExcess, + ), vm.clock, ) if err != nil { diff --git a/plugin/evm/vm_test.go b/plugin/evm/vm_test.go index 67d8dcdc50..866dca3b50 100644 --- a/plugin/evm/vm_test.go +++ b/plugin/evm/vm_test.go @@ -33,6 +33,7 @@ import ( "github.com/ava-labs/avalanchego/utils/set" "github.com/ava-labs/avalanchego/vms/components/chain" "github.com/ava-labs/avalanchego/vms/evm/acp176" + "github.com/ava-labs/avalanchego/vms/evm/acp226" "github.com/ava-labs/avalanchego/vms/evm/predicate" "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/libevm/common" @@ -4158,3 +4159,79 @@ func TestDelegatePrecompile_BehaviorAcrossUpgrades(t *testing.T) { }) } } + +func TestMinDelayExcessInHeader(t *testing.T) { + tests := []struct { + name string + fork upgradetest.Fork + desiredMinDelay *uint64 + expectedMinDelayExcess *acp226.DelayExcess + }{ + { + name: "pre_granite_no_min_delay_excess", + fork: upgradetest.Fortuna, + desiredMinDelay: nil, + expectedMinDelayExcess: nil, + }, + { + name: "pre_granite_min_delay_excess", + fork: upgradetest.Fortuna, + desiredMinDelay: utils.NewUint64(1000), + expectedMinDelayExcess: nil, + }, + { + name: "granite_first_block_initial_delay_excess", + fork: upgradetest.Granite, + desiredMinDelay: nil, + expectedMinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess)), + }, + { + name: "granite_with_excessive_desired_min_delay_excess", + fork: upgradetest.Granite, + desiredMinDelay: utils.NewUint64(4000), + expectedMinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess + acp226.MaxDelayExcessDiff)), + }, + { + name: "granite_with_zero_desired_min_delay_excess", + fork: upgradetest.Granite, + desiredMinDelay: utils.NewUint64(0), + expectedMinDelayExcess: utilstest.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess - acp226.MaxDelayExcessDiff)), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require := require.New(t) + ctx := context.Background() + var configJSON string + if test.desiredMinDelay != nil { + // convert excess to delay + configJSON = fmt.Sprintf(`{"min-delay-target": %d}`, *test.desiredMinDelay) + } + vm := newVM(t, testVMConfig{ + fork: &test.fork, + configJSON: configJSON, + }) + + defer func() { + require.NoError(vm.vm.Shutdown(ctx)) + }() + + // Build a block + signedTx := newSignedLegacyTx(t, vm.vm.chainConfig, testKeys[0].ToECDSA(), 0, &testEthAddrs[1], big.NewInt(1), 21000, big.NewInt(testMinGasPrice), nil) + txErrors := vm.vm.txPool.AddRemotesSync([]*types.Transaction{signedTx}) + for _, err := range txErrors { + require.NoError(err) + } + + blk, err := vm.vm.BuildBlock(ctx) + require.NoError(err) + + // Check the min delay excess in the header + ethBlock := blk.(*chain.BlockWrapper).Block.(*wrappedBlock).ethBlock + headerExtra := customtypes.GetHeaderExtra(ethBlock.Header()) + + require.Equal(test.expectedMinDelayExcess, headerExtra.MinDelayExcess, "expected %s, got %s", test.expectedMinDelayExcess, headerExtra.MinDelayExcess) + }) + } +} diff --git a/plugin/evm/wrapped_block.go b/plugin/evm/wrapped_block.go index dbab069172..5f7949dac6 100644 --- a/plugin/evm/wrapped_block.go +++ b/plugin/evm/wrapped_block.go @@ -286,8 +286,13 @@ func (b *wrappedBlock) semanticVerify() error { return fmt.Errorf("%w: %s at height %d", errInvalidParent, b.ethBlock.ParentHash(), b.ethBlock.NumberU64()-1) } + header := b.ethBlock.Header() + // Ensure MinDelayExcess is consistent with rules and minimum block delay is enforced. + if err := customheader.VerifyMinDelayExcess(extraConfig, parent, header); err != nil { + return err + } // Ensure Time and TimeMilliseconds are consistent with rules. - if err := customheader.VerifyTime(extraConfig, parent, b.ethBlock.Header(), b.vm.clock.Time()); err != nil { + if err := customheader.VerifyTime(extraConfig, parent, header, b.vm.clock.Time()); err != nil { return err } diff --git a/utils/utilstest/pointer.go b/utils/utilstest/pointer.go new file mode 100644 index 0000000000..27b36369d7 --- /dev/null +++ b/utils/utilstest/pointer.go @@ -0,0 +1,6 @@ +// Copyright (C) 2019-2025, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package utilstest + +func PointerTo[T any](x T) *T { return &x }