Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

eupgrade/cancun: verify no blobs in header #611

Merged
merged 10 commits into from
Aug 2, 2024
3 changes: 3 additions & 0 deletions consensus/dummy/consensus.go
darioush marked this conversation as resolved.
Show resolved Hide resolved
ceyonur marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,9 @@ func (self *DummyEngine) verifyHeader(chain consensus.ChainHeaderReader, header
if err := eip4844.VerifyEIP4844Header(parent, header); err != nil {
return err
}
if *header.BlobGasUsed > 0 { // VerifyEIP4844Header ensures BlobGasUsed is non-nil
darioush marked this conversation as resolved.
Show resolved Hide resolved
return fmt.Errorf("blobs not enabled on avalanche networks: used %d blob gas, expected 0", *header.BlobGasUsed)
}
}
return nil
}
Expand Down
6 changes: 4 additions & 2 deletions core/state_processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ func TestStateProcessorErrors(t *testing.T) {
},
GasLimit: params.CortinaGasLimit,
}
blockchain, _ = NewBlockChain(db, DefaultCacheConfig, gspec, dummy.NewCoinbaseFaker(), vm.Config{}, common.Hash{}, false)
// FullFaker used to skip header verification that enforces no blobs.
blockchain, _ = NewBlockChain(db, DefaultCacheConfig, gspec, dummy.NewFullFaker(), vm.Config{}, common.Hash{}, false)
tooBigInitCode = [params.MaxInitCodeSize + 1]byte{}
)

Expand Down Expand Up @@ -236,7 +237,8 @@ func TestStateProcessorErrors(t *testing.T) {
want: "could not apply tx 0 [0x6c11015985ce82db691d7b2d017acda296db88b811c3c60dc71449c76256c716]: max fee per gas less than block base fee: address 0x71562b71999873DB5b286dF957af199Ec94617F7, maxFeePerGas: 1, baseFee: 225000000000",
},
} {
block := GenerateBadBlock(gspec.ToBlock(), dummy.NewCoinbaseFaker(), tt.txs, gspec.Config)
// FullFaker used to skip header verification that enforces no blobs.
block := GenerateBadBlock(gspec.ToBlock(), dummy.NewFullFaker(), tt.txs, gspec.Config)
_, err := blockchain.InsertChain(types.Blocks{block})
if err == nil {
t.Fatal("block imported without errors")
Expand Down
3 changes: 2 additions & 1 deletion internal/ethapi/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1436,7 +1436,8 @@ func setupReceiptBackend(t *testing.T, genBlocks int) (*testBackend, []common.Ha
// Set the terminal total difficulty in the config
// genesis.Config.TerminalTotalDifficulty = big.NewInt(0)
// genesis.Config.TerminalTotalDifficultyPassed = true
backend := newTestBackend(t, genBlocks, genesis, dummy.NewCoinbaseFaker(), func(i int, b *core.BlockGen) {
// FullFaker used to skip header verification that enforces no blobs.
backend := newTestBackend(t, genBlocks, genesis, dummy.NewFullFaker(), func(i int, b *core.BlockGen) {
var (
tx *types.Transaction
err error
Expand Down
5 changes: 5 additions & 0 deletions plugin/evm/block_verification.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,11 @@ func (v blockValidator) SyntacticVerify(b *Block, rules params.Rules) error {
case *ethHeader.ParentBeaconRoot != (common.Hash{}):
return fmt.Errorf("invalid parentBeaconRoot: have %x, expected empty hash", ethHeader.ParentBeaconRoot)
}
if ethHeader.BlobGasUsed == nil {
return fmt.Errorf("blob gas used must not be nil in Cancun")
} else if *ethHeader.BlobGasUsed > 0 {
return fmt.Errorf("blobs not enabled on avalanche networks: used %d blob gas, expected 0", *ethHeader.BlobGasUsed)
}
}
return nil
}
33 changes: 33 additions & 0 deletions plugin/evm/vm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4090,6 +4090,39 @@ func TestParentBeaconRootBlock(t *testing.T) {
}
}

func TestNoBlobsAllowed(t *testing.T) {
darioush marked this conversation as resolved.
Show resolved Hide resolved
require := require.New(t)
importAmount := uint64(1000000000)
issuer, vm, _, _, _ := GenesisVMWithUTXOs(t, true, genesisJSONCancun, "", "", map[ids.ShortID]uint64{
darioush marked this conversation as resolved.
Show resolved Hide resolved
testShortIDAddrs[0]: importAmount,
})
defer func() { require.NoError(vm.Shutdown(context.Background())) }()

// Build a valid block in Cancun
importTx, err := vm.newImportTx(vm.ctx.XChainID, testEthAddrs[0], initialBaseFee, []*secp256k1.PrivateKey{testKeys[0]})
require.NoError(err)
require.NoError(vm.mempool.AddLocalTx(importTx))
<-issuer
blk, err := vm.BuildBlock(context.Background())
darioush marked this conversation as resolved.
Show resolved Hide resolved
require.NoError(err)

// Modify the block to have a non-zero blob gas
ethBlock := blk.(*chain.BlockWrapper).Block.(*Block).ethBlock
header := types.CopyHeader(ethBlock.Header())
blobGasUsed := uint64(params.BlobTxBlobGasPerBlob)
header.BlobGasUsed = &blobGasUsed
modifiedEthBlock := types.NewBlockWithExtData(
header, nil, nil, nil, new(trie.Trie), ethBlock.ExtData(), false)
modifiedBlock, err := vm.newBlock(modifiedEthBlock)
require.NoError(err)

// Verification should fail
_, err = vm.ParseBlock(context.Background(), modifiedBlock.Bytes())
require.ErrorContains(err, "blobs not enabled on avalanche networks")
err = modifiedBlock.Verify(context.Background())
require.ErrorContains(err, "blobs not enabled on avalanche networks")
}

func TestMinFeeSetAtEUpgrade(t *testing.T) {
require := require.New(t)
now := time.Now()
Expand Down
Loading