Skip to content

Commit

Permalink
eth/catalyst,miner: include withdrawals in payload id calculation (#2…
Browse files Browse the repository at this point in the history
…6554)

According to the spec the payloadID needs to be random or dependent on all arguments, to prevent two payloads from clashing. This change adds withdrawals into the payload derivation. 

---------

Co-authored-by: [email protected] <[email protected]>
Co-authored-by: Martin Holst Swende <[email protected]>
Co-authored-by: Felix Lange <[email protected]>
  • Loading branch information
4 people authored Feb 7, 2023
1 parent 31d401e commit 2f73f4f
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
2 changes: 2 additions & 0 deletions eth/catalyst/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 2 additions & 0 deletions miner/payload_building.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
77 changes: 77 additions & 0 deletions miner/payload_building_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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
}
}

0 comments on commit 2f73f4f

Please sign in to comment.