diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index ae3ad08e7..96613ac16 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -1041,6 +1041,7 @@ func TestWithdrawals(t *testing.T) { Timestamp: blockParams.Timestamp, FeeRecipient: blockParams.SuggestedFeeRecipient, Random: blockParams.Random, + Withdrawals: blockParams.Withdrawals, }).Id() execData, err := api.GetPayloadV2(payloadID) if err != nil { @@ -1087,6 +1088,7 @@ func TestWithdrawals(t *testing.T) { Timestamp: blockParams.Timestamp, FeeRecipient: blockParams.SuggestedFeeRecipient, Random: blockParams.Random, + Withdrawals: blockParams.Withdrawals, }).Id() execData, err = api.GetPayloadV2(payloadID) if err != nil { diff --git a/miner/payload_building.go b/miner/payload_building.go index 4c36dd8d1..f84d908e8 100644 --- a/miner/payload_building.go +++ b/miner/payload_building.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // BuildPayloadArgs contains the provided parameters for building payload. @@ -49,6 +50,7 @@ func (args *BuildPayloadArgs) Id() engine.PayloadID { binary.Write(hasher, binary.BigEndian, args.Timestamp) hasher.Write(args.Random[:]) hasher.Write(args.FeeRecipient[:]) + rlp.Encode(hasher, args.Withdrawals) var out engine.PayloadID copy(out[:], hasher.Sum(nil)[:8]) return out diff --git a/miner/payload_building_test.go b/miner/payload_building_test.go index 43b9db416..b2f1d68f3 100644 --- a/miner/payload_building_test.go +++ b/miner/payload_building_test.go @@ -25,6 +25,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/ethash" "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/params" ) @@ -79,3 +80,79 @@ func TestBuildPayload(t *testing.T) { t.Fatal("Unexpected payload data") } } + +func TestPayloadId(t *testing.T) { + ids := make(map[string]int) + for i, tt := range []*BuildPayloadArgs{ + &BuildPayloadArgs{ + Parent: common.Hash{1}, + Timestamp: 1, + Random: common.Hash{0x1}, + FeeRecipient: common.Address{0x1}, + }, + // Different parent + &BuildPayloadArgs{ + Parent: common.Hash{2}, + Timestamp: 1, + Random: common.Hash{0x1}, + FeeRecipient: common.Address{0x1}, + }, + // Different timestamp + &BuildPayloadArgs{ + Parent: common.Hash{2}, + Timestamp: 2, + Random: common.Hash{0x1}, + FeeRecipient: common.Address{0x1}, + }, + // Different Random + &BuildPayloadArgs{ + Parent: common.Hash{2}, + Timestamp: 2, + Random: common.Hash{0x2}, + FeeRecipient: common.Address{0x1}, + }, + // Different fee-recipient + &BuildPayloadArgs{ + Parent: common.Hash{2}, + Timestamp: 2, + Random: common.Hash{0x2}, + FeeRecipient: common.Address{0x2}, + }, + // Different withdrawals (non-empty) + &BuildPayloadArgs{ + Parent: common.Hash{2}, + Timestamp: 2, + Random: common.Hash{0x2}, + FeeRecipient: common.Address{0x2}, + Withdrawals: []*types.Withdrawal{ + &types.Withdrawal{ + Index: 0, + Validator: 0, + Address: common.Address{}, + Amount: 0, + }, + }, + }, + // Different withdrawals (non-empty) + &BuildPayloadArgs{ + Parent: common.Hash{2}, + Timestamp: 2, + Random: common.Hash{0x2}, + FeeRecipient: common.Address{0x2}, + Withdrawals: []*types.Withdrawal{ + &types.Withdrawal{ + Index: 2, + Validator: 0, + Address: common.Address{}, + Amount: 0, + }, + }, + }, + } { + id := tt.Id().String() + if prev, exists := ids[id]; exists { + t.Errorf("ID collision, case %d and case %d: id %v", prev, i, id) + } + ids[id] = i + } +}