Skip to content

Commit 8deacf7

Browse files
pingesNickSneo
authored andcommitted
add parent beacon block root to payload id calculation (besu-eth#5843)
Signed-off-by: Stefan <stefan.pingel@consensys.net>
1 parent eafd5f3 commit 8deacf7

File tree

6 files changed

+115
-13
lines changed

6 files changed

+115
-13
lines changed

consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,12 @@ public PayloadIdentifier preparePayload(
254254

255255
final PayloadIdentifier payloadIdentifier =
256256
PayloadIdentifier.forPayloadParams(
257-
parentHeader.getBlockHash(), timestamp, prevRandao, feeRecipient, withdrawals);
257+
parentHeader.getBlockHash(),
258+
timestamp,
259+
prevRandao,
260+
feeRecipient,
261+
withdrawals,
262+
parentBeaconBlockRoot);
258263

259264
if (blockCreationTasks.containsKey(payloadIdentifier)) {
260265
LOG.debug(

consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifier.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,16 @@ public PayloadIdentifier(final Long payloadId) {
6262
* @param prevRandao the prev randao
6363
* @param feeRecipient the fee recipient
6464
* @param withdrawals the withdrawals
65+
* @param parentBeaconBlockRoot the parent beacon block root
6566
* @return the payload identifier
6667
*/
6768
public static PayloadIdentifier forPayloadParams(
6869
final Hash parentHash,
6970
final Long timestamp,
7071
final Bytes32 prevRandao,
7172
final Address feeRecipient,
72-
final Optional<List<Withdrawal>> withdrawals) {
73+
final Optional<List<Withdrawal>> withdrawals,
74+
final Optional<Bytes32> parentBeaconBlockRoot) {
7375

7476
return new PayloadIdentifier(
7577
timestamp
@@ -84,7 +86,8 @@ public static PayloadIdentifier forPayloadParams(
8486
.sorted(Comparator.comparing(Withdrawal::getIndex))
8587
.map(Withdrawal::hashCode)
8688
.reduce(1, (a, b) -> a ^ (b * 31)))
87-
.orElse(0));
89+
.orElse(0)
90+
^ ((long) parentBeaconBlockRoot.hashCode()) << 40);
8891
}
8992

9093
@Override

consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifierTest.java

Lines changed: 86 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ public void serializesToEvenHexRepresentation() {
4848
public void conversionCoverage() {
4949
var idTest =
5050
PayloadIdentifier.forPayloadParams(
51-
Hash.ZERO, 1337L, Bytes32.random(), Address.fromHexString("0x42"), Optional.empty());
51+
Hash.ZERO,
52+
1337L,
53+
Bytes32.random(),
54+
Address.fromHexString("0x42"),
55+
Optional.empty(),
56+
Optional.empty());
5257
assertThat(new PayloadIdentifier(idTest.getAsBigInteger().longValue())).isEqualTo(idTest);
5358
assertThat(new PayloadIdentifier(idTest.getAsBigInteger().longValue())).isEqualTo(idTest);
5459
}
@@ -82,10 +87,20 @@ public void differentWithdrawalAmountsYieldDifferentHash() {
8287
final Bytes32 prevRandao = Bytes32.random();
8388
var idForWithdrawals1 =
8489
PayloadIdentifier.forPayloadParams(
85-
Hash.ZERO, 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals1));
90+
Hash.ZERO,
91+
1337L,
92+
prevRandao,
93+
Address.fromHexString("0x42"),
94+
Optional.of(withdrawals1),
95+
Optional.empty());
8696
var idForWithdrawals2 =
8797
PayloadIdentifier.forPayloadParams(
88-
Hash.ZERO, 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals2));
98+
Hash.ZERO,
99+
1337L,
100+
prevRandao,
101+
Address.fromHexString("0x42"),
102+
Optional.of(withdrawals2),
103+
Optional.empty());
89104
assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2);
90105
}
91106

@@ -118,10 +133,20 @@ public void differentOrderedWithdrawalsYieldSameHash() {
118133
final Bytes32 prevRandao = Bytes32.random();
119134
var idForWithdrawals1 =
120135
PayloadIdentifier.forPayloadParams(
121-
Hash.ZERO, 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals1));
136+
Hash.ZERO,
137+
1337L,
138+
prevRandao,
139+
Address.fromHexString("0x42"),
140+
Optional.of(withdrawals1),
141+
Optional.empty());
122142
var idForWithdrawals2 =
123143
PayloadIdentifier.forPayloadParams(
124-
Hash.ZERO, 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals2));
144+
Hash.ZERO,
145+
1337L,
146+
prevRandao,
147+
Address.fromHexString("0x42"),
148+
Optional.of(withdrawals2),
149+
Optional.empty());
125150
assertThat(idForWithdrawals1).isEqualTo(idForWithdrawals2);
126151
}
127152

@@ -130,10 +155,64 @@ public void emptyOptionalAndEmptyListWithdrawalsYieldDifferentHash() {
130155
final Bytes32 prevRandao = Bytes32.random();
131156
var idForWithdrawals1 =
132157
PayloadIdentifier.forPayloadParams(
133-
Hash.ZERO, 1337L, prevRandao, Address.fromHexString("0x42"), Optional.empty());
158+
Hash.ZERO,
159+
1337L,
160+
prevRandao,
161+
Address.fromHexString("0x42"),
162+
Optional.empty(),
163+
Optional.empty());
134164
var idForWithdrawals2 =
135165
PayloadIdentifier.forPayloadParams(
136-
Hash.ZERO, 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(emptyList()));
166+
Hash.ZERO,
167+
1337L,
168+
prevRandao,
169+
Address.fromHexString("0x42"),
170+
Optional.of(emptyList()),
171+
Optional.empty());
172+
assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2);
173+
}
174+
175+
@Test
176+
public void emptyOptionalAndNonEmptyParentBeaconBlockRootYieldDifferentHash() {
177+
final Bytes32 prevRandao = Bytes32.random();
178+
var idForWithdrawals1 =
179+
PayloadIdentifier.forPayloadParams(
180+
Hash.ZERO,
181+
1337L,
182+
prevRandao,
183+
Address.fromHexString("0x42"),
184+
Optional.empty(),
185+
Optional.empty());
186+
var idForWithdrawals2 =
187+
PayloadIdentifier.forPayloadParams(
188+
Hash.ZERO,
189+
1337L,
190+
prevRandao,
191+
Address.fromHexString("0x42"),
192+
Optional.empty(),
193+
Optional.of(Bytes32.ZERO));
194+
assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2);
195+
}
196+
197+
@Test
198+
public void differentParentBeaconBlockRootYieldDifferentHash() {
199+
final Bytes32 prevRandao = Bytes32.random();
200+
var idForWithdrawals1 =
201+
PayloadIdentifier.forPayloadParams(
202+
Hash.ZERO,
203+
1337L,
204+
prevRandao,
205+
Address.fromHexString("0x42"),
206+
Optional.empty(),
207+
Optional.of(Bytes32.fromHexStringLenient("0x1")));
208+
var idForWithdrawals2 =
209+
PayloadIdentifier.forPayloadParams(
210+
Hash.ZERO,
211+
1337L,
212+
prevRandao,
213+
Address.fromHexString("0x42"),
214+
Optional.empty(),
215+
Optional.of(Bytes32.ZERO));
137216
assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2);
138217
}
139218
}

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ public void shouldReturnValidWithoutFinalizedWithPayload() {
242242
payloadParams.getTimestamp(),
243243
payloadParams.getPrevRandao(),
244244
payloadParams.getSuggestedFeeRecipient(),
245+
Optional.empty(),
245246
Optional.empty());
246247

247248
when(mergeCoordinator.preparePayload(
@@ -518,6 +519,7 @@ public void shouldReturnValidIfWithdrawalsIsNull_WhenWithdrawalsProhibited() {
518519
payloadParams.getTimestamp(),
519520
payloadParams.getPrevRandao(),
520521
payloadParams.getSuggestedFeeRecipient(),
522+
Optional.empty(),
521523
Optional.empty());
522524

523525
when(mergeCoordinator.preparePayload(
@@ -603,7 +605,8 @@ public void shouldReturnValidIfWithdrawalsIsNotNull_WhenWithdrawalsAllowed() {
603605
payloadParams.getTimestamp(),
604606
payloadParams.getPrevRandao(),
605607
payloadParams.getSuggestedFeeRecipient(),
606-
withdrawals);
608+
withdrawals,
609+
Optional.empty());
607610

608611
when(mergeCoordinator.preparePayload(
609612
mockHeader,
@@ -645,6 +648,7 @@ public void shouldReturnValidIfProtocolScheduleIsEmpty() {
645648
payloadParams.getTimestamp(),
646649
payloadParams.getPrevRandao(),
647650
payloadParams.getSuggestedFeeRecipient(),
651+
Optional.empty(),
648652
Optional.empty());
649653

650654
when(mergeCoordinator.preparePayload(

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ public AbstractEngineGetPayloadTest() {
8585
protected static final BlockResultFactory factory = new BlockResultFactory();
8686
protected static final PayloadIdentifier mockPid =
8787
PayloadIdentifier.forPayloadParams(
88-
Hash.ZERO, 1337L, Bytes32.random(), Address.fromHexString("0x42"), Optional.empty());
88+
Hash.ZERO,
89+
1337L,
90+
Bytes32.random(),
91+
Address.fromHexString("0x42"),
92+
Optional.empty(),
93+
Optional.empty());
8994
protected static final BlockHeader mockHeader =
9095
new BlockHeaderTestFixture().prevRandao(Bytes32.random()).buildHeader();
9196
private static final Block mockBlock =
@@ -147,7 +152,12 @@ public void shouldFailForUnknownPayloadId() {
147152
resp(
148153
getMethodName(),
149154
PayloadIdentifier.forPayloadParams(
150-
Hash.ZERO, 0L, Bytes32.random(), Address.fromHexString("0x42"), Optional.empty()));
155+
Hash.ZERO,
156+
0L,
157+
Bytes32.random(),
158+
Address.fromHexString("0x42"),
159+
Optional.empty(),
160+
Optional.empty()));
151161
assertThat(resp).isInstanceOf(JsonRpcErrorResponse.class);
152162
verify(engineCallListener, times(1)).executionEngineCalled();
153163
}

ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3Test.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public void shouldReturnBlockForKnownPayloadId() {
104104
cancunHardfork.milestone(),
105105
Bytes32.random(),
106106
Address.fromHexString("0x42"),
107+
Optional.empty(),
107108
Optional.empty());
108109

109110
BlobTestFixture blobTestFixture = new BlobTestFixture();

0 commit comments

Comments
 (0)