diff --git a/core/genesis.go b/core/genesis.go index 1b9ec20ed9..1120be015f 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -465,10 +465,12 @@ func (g *Genesis) ToBlock() *types.Block { head.BaseFee = new(big.Int).SetUint64(params.InitialBaseFee) } } + var withdrawals []*types.Withdrawal if g.Config != nil && g.Config.IsShanghai(g.Timestamp) { head.WithdrawalsHash = &types.EmptyRootHash + withdrawals = make([]*types.Withdrawal, 0) } - return types.NewBlock(head, nil, nil, nil, trie.NewStackTrie(nil)) + return types.NewBlock(head, nil, nil, nil, trie.NewStackTrie(nil)).WithWithdrawals(withdrawals) } // Commit writes the block and state of a genesis specification to the database. diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index 13b3021b24..b90f417ea4 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -783,6 +783,10 @@ func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListH if header.WithdrawalsHash == nil { // discard any withdrawals if we don't have a withdrawal hash set withdrawalLists[index] = nil + } else if *header.WithdrawalsHash == types.EmptyRootHash && withdrawalLists[index] == nil { + // if the withdrawal hash is the emptyRootHash, + // we expect withdrawals to be [] instead of nil + withdrawalLists[index] = make([]*types.Withdrawal, 0) } else if withdrawalListHashes[index] != *header.WithdrawalsHash { return errInvalidBody } diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go index 51850c60ea..76505ab8d3 100644 --- a/eth/protocols/eth/handler_test.go +++ b/eth/protocols/eth/handler_test.go @@ -424,7 +424,7 @@ func testGetBlockBodies(t *testing.T, protocol uint) { RequestId: 123, BlockBodiesPacket: bodies, }); err != nil { - t.Errorf("test %d: bodies mismatch: %v", i, err) + t.Fatalf("test %d: bodies mismatch: %v", i, err) } } }