From e56fa1a7b4e45c5eb24bf4741d5152224ca51911 Mon Sep 17 00:00:00 2001 From: Stephen Buttolph Date: Thu, 27 Feb 2025 18:42:52 -0500 Subject: [PATCH 1/2] Add Rules to PredicateBytesFromExtra --- core/vm/evm.go | 2 +- plugin/evm/block.go | 2 +- plugin/evm/header/extra.go | 7 +++---- plugin/evm/header/extra_test.go | 3 ++- plugin/evm/vm_warp_test.go | 3 ++- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index eac394b362..2d26282b03 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -235,7 +235,7 @@ func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig // Parse the predicate results from the extra field and store them in the // block context. - predicateBytes := header.PredicateBytesFromExtra(blockCtx.Extra) + predicateBytes := header.PredicateBytesFromExtra(evm.chainRules.AvalancheRules, blockCtx.Extra) if len(predicateBytes) == 0 { return evm } diff --git a/plugin/evm/block.go b/plugin/evm/block.go index d30a943fa8..042ff22703 100644 --- a/plugin/evm/block.go +++ b/plugin/evm/block.go @@ -382,7 +382,7 @@ func (b *Block) verifyPredicates(predicateContext *precompileconfig.PredicateCon return fmt.Errorf("failed to marshal predicate results: %w", err) } extraData := b.ethBlock.Extra() - headerPredicateResultsBytes := header.PredicateBytesFromExtra(extraData) + headerPredicateResultsBytes := header.PredicateBytesFromExtra(rules.AvalancheRules, extraData) if !bytes.Equal(headerPredicateResultsBytes, predicateResultsBytes) { return fmt.Errorf("%w (remote: %x local: %x)", errInvalidHeaderPredicateResults, headerPredicateResultsBytes, predicateResultsBytes) } diff --git a/plugin/evm/header/extra.go b/plugin/evm/header/extra.go index e4db0b6c6f..654ce4d6af 100644 --- a/plugin/evm/header/extra.go +++ b/plugin/evm/header/extra.go @@ -79,11 +79,10 @@ func VerifyExtra(rules params.AvalancheRules, extra []byte) error { // PredicateBytesFromExtra returns the predicate result bytes from the header's // extra data. If the extra data is not long enough, an empty slice is returned. -func PredicateBytesFromExtra(extra []byte) []byte { +func PredicateBytesFromExtra(_ params.AvalancheRules, extra []byte) []byte { // Prior to Durango, the VM enforces the extra data is smaller than or equal - // to this size. - // After Durango, the VM pre-verifies the extra data past the dynamic fee - // rollup window is valid. + // to `offset`. + // After Durango, the VM pre-verifies the extra data past `offset` is valid. if len(extra) <= FeeWindowSize { return nil } diff --git a/plugin/evm/header/extra_test.go b/plugin/evm/header/extra_test.go index c00fe31430..887aa9dbe2 100644 --- a/plugin/evm/header/extra_test.go +++ b/plugin/evm/header/extra_test.go @@ -331,6 +331,7 @@ func TestVerifyExtra(t *testing.T) { func TestPredicateBytesFromExtra(t *testing.T) { tests := []struct { name string + rules params.AvalancheRules extra []byte expected []byte }{ @@ -359,7 +360,7 @@ func TestPredicateBytesFromExtra(t *testing.T) { } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got := PredicateBytesFromExtra(test.extra) + got := PredicateBytesFromExtra(test.rules, test.extra) require.Equal(t, test.expected, got) }) } diff --git a/plugin/evm/vm_warp_test.go b/plugin/evm/vm_warp_test.go index 26696986bd..abcb8b058c 100644 --- a/plugin/evm/vm_warp_test.go +++ b/plugin/evm/vm_warp_test.go @@ -653,7 +653,8 @@ func testReceiveWarpMessage( // Require the block was built with a successful predicate result ethBlock := block2.(*chain.BlockWrapper).Block.(*Block).ethBlock - headerPredicateResultsBytes := customheader.PredicateBytesFromExtra(ethBlock.Extra()) + rules := vm.chainConfig.GetAvalancheRules(ethBlock.Time()) + headerPredicateResultsBytes := customheader.PredicateBytesFromExtra(rules, ethBlock.Extra()) results, err := predicate.ParseResults(headerPredicateResultsBytes) require.NoError(err) From f6bf0db99593c41469a880144b3d978d4fe4be5c Mon Sep 17 00:00:00 2001 From: Stephen Buttolph Date: Thu, 27 Feb 2025 18:44:29 -0500 Subject: [PATCH 2/2] reduce diff --- plugin/evm/header/extra.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugin/evm/header/extra.go b/plugin/evm/header/extra.go index 654ce4d6af..79736f41d0 100644 --- a/plugin/evm/header/extra.go +++ b/plugin/evm/header/extra.go @@ -81,8 +81,9 @@ func VerifyExtra(rules params.AvalancheRules, extra []byte) error { // extra data. If the extra data is not long enough, an empty slice is returned. func PredicateBytesFromExtra(_ params.AvalancheRules, extra []byte) []byte { // Prior to Durango, the VM enforces the extra data is smaller than or equal - // to `offset`. - // After Durango, the VM pre-verifies the extra data past `offset` is valid. + // to this size. + // After Durango, the VM pre-verifies the extra data past the dynamic fee + // rollup window is valid. if len(extra) <= FeeWindowSize { return nil }