Minor improvements to EIP-7685 (#7142)

Signed-off-by: Gabriel-Trintinalia <gabriel.trintinalia@consensys.net>
pull/7147/head
Gabriel-Trintinalia 5 months ago committed by GitHub
parent 067164f7b5
commit 7a5a3e0957
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 16
      datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java
  2. 2
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java
  3. 22
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java
  4. 2
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java
  5. 4
      ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java
  6. 2
      ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java
  7. 2
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java
  8. 2
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java
  9. 4
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java
  10. 5
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositsValidator.java
  11. 2
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java
  12. 19
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java
  13. 4
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestsValidatorCoordinator.java
  14. 4
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java
  15. 7
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java
  16. 2
      ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java
  17. 35
      ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositEncoderTest.java
  18. 27
      ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoderTest.java
  19. 2
      ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java
  20. 2
      ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java

@ -14,8 +14,6 @@
*/
package org.hyperledger.besu.datatypes;
import java.util.Arrays;
/** Enum representing different types of requests with associated serialized type values. */
public enum RequestType {
/** DEPOSITS */
@ -47,12 +45,12 @@ public enum RequestType {
* RequestType}.
*/
public static RequestType of(final int serializedTypeValue) {
return Arrays.stream(RequestType.values())
.filter(requestType -> requestType.typeValue == serializedTypeValue)
.findFirst()
.orElseThrow(
() ->
new IllegalArgumentException(
String.format("Unsupported request type: 0x%02X", serializedTypeValue)));
return switch (serializedTypeValue) {
case 0x00 -> DEPOSIT;
case 0x01 -> WITHDRAWAL;
default ->
throw new IllegalArgumentException(
String.format("Unsupported request type: 0x%02X", serializedTypeValue));
};
}
}

@ -66,6 +66,6 @@ public class RequestValidatorProvider {
final ProtocolSpec protocolSchedule) {
return Optional.ofNullable(protocolSchedule)
.map(ProtocolSpec::getRequestsValidatorCoordinator)
.orElseGet(() -> new RequestsValidatorCoordinator.Builder().build());
.orElseGet(RequestsValidatorCoordinator::empty);
}
}

@ -14,6 +14,9 @@
*/
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.results;
import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getDepositRequests;
import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getWithdrawalRequests;
import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.datatypes.Wei;
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadBodiesResultV1.PayloadBody;
@ -24,12 +27,8 @@ import org.hyperledger.besu.ethereum.core.BlockBody;
import org.hyperledger.besu.ethereum.core.BlockHeader;
import org.hyperledger.besu.ethereum.core.BlockValueCalculator;
import org.hyperledger.besu.ethereum.core.BlockWithReceipts;
import org.hyperledger.besu.ethereum.core.Deposit;
import org.hyperledger.besu.ethereum.core.Request;
import org.hyperledger.besu.ethereum.core.WithdrawalRequest;
import org.hyperledger.besu.ethereum.core.encoding.EncodingContext;
import org.hyperledger.besu.ethereum.core.encoding.TransactionEncoder;
import org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil;
import java.util.ArrayList;
import java.util.List;
@ -176,23 +175,12 @@ public class BlockResultFactory {
blockWithReceipts.getHeader(),
txs,
blockWithReceipts.getBlock().getBody().getWithdrawals(),
getDepositRequest(blockWithReceipts.getBlock().getBody().getRequests()),
getWithdrawalRequest(blockWithReceipts.getBlock().getBody().getRequests()),
getDepositRequests(blockWithReceipts.getBlock().getBody().getRequests()),
getWithdrawalRequests(blockWithReceipts.getBlock().getBody().getRequests()),
Quantity.create(blockValue),
blobsBundleV1);
}
private Optional<List<Deposit>> getDepositRequest(final Optional<List<Request>> requests) {
return requests.map(
requestList -> RequestUtil.filterRequestsOfType(requestList, Deposit.class));
}
private Optional<List<WithdrawalRequest>> getWithdrawalRequest(
final Optional<List<Request>> requests) {
return requests.map(
requestList -> RequestUtil.filterRequestsOfType(requestList, WithdrawalRequest.class));
}
public BlockResult transactionHash(final BlockWithMetadata<Hash, Hash> blockWithMetadata) {
return transactionHash(blockWithMetadata, false);
}

@ -521,7 +521,7 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT
}
private void mockProhibitedRequestsValidator() {
var validator = new RequestsValidatorCoordinator.Builder().build();
var validator = RequestsValidatorCoordinator.empty();
when(protocolSpec.getRequestsValidatorCoordinator()).thenReturn(validator);
}
}

@ -158,7 +158,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test {
final List<DepositParameter> deposits = List.of();
lenient()
.when(protocolSpec.getRequestsValidatorCoordinator())
.thenReturn(new RequestsValidatorCoordinator.Builder().build());
.thenReturn(RequestsValidatorCoordinator.empty());
var resp =
resp(
@ -311,7 +311,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test {
}
private void mockProhibitedRequestsValidator() {
var validator = new RequestsValidatorCoordinator.Builder().build();
var validator = RequestsValidatorCoordinator.empty();
when(protocolSpec.getRequestsValidatorCoordinator()).thenReturn(validator);
}

@ -134,7 +134,7 @@ abstract class AbstractBlockCreatorTest {
UInt64.valueOf(539967));
final List<Deposit> expectedDeposits = List.of(expectedDeposit);
final Optional<List<Request>> depositsFromReceipts =
var depositsFromReceipts =
new DepositRequestProcessor(DEFAULT_DEPOSIT_CONTRACT_ADDRESS).process(null, receipts);
assertThat(depositsFromReceipts.get()).isEqualTo(expectedDeposits);
}

@ -89,7 +89,7 @@ public final class BodyValidation {
}
/**
* Generates the request root for a list of requests
* Generates the requests root for a list of requests
*
* @param requests list of request
* @return the requests root

@ -78,7 +78,7 @@ public class ProtocolSpecBuilder {
new WithdrawalsValidator.ProhibitedWithdrawals();
private WithdrawalsProcessor withdrawalsProcessor;
private RequestsValidatorCoordinator requestsValidatorCoordinator =
new RequestsValidatorCoordinator.Builder().build();
RequestsValidatorCoordinator.empty();
private RequestProcessorCoordinator requestProcessorCoordinator;
protected BlockHashProcessor blockHashProcessor;
private FeeMarket feeMarket = FeeMarket.legacy();

@ -39,13 +39,13 @@ public class DepositRequestProcessor implements RequestProcessor {
}
@Override
public Optional<List<Request>> process(
public Optional<List<? extends Request>> process(
final MutableWorldState ignored, final List<TransactionReceipt> transactionReceipts) {
if (depositContractAddress.isEmpty()) {
return Optional.empty();
}
List<Deposit> deposits = findDepositsFromReceipts(transactionReceipts);
return Optional.of(deposits.stream().map(r -> (Request) r).toList());
return Optional.of(deposits);
}
@VisibleForTesting

@ -14,6 +14,8 @@
*/
package org.hyperledger.besu.ethereum.mainnet.requests;
import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getDepositRequests;
import org.hyperledger.besu.datatypes.Address;
import org.hyperledger.besu.ethereum.core.Block;
import org.hyperledger.besu.ethereum.core.Deposit;
@ -23,6 +25,7 @@ import org.hyperledger.besu.ethereum.core.encoding.DepositDecoder;
import org.hyperledger.besu.evm.log.Log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@ -75,7 +78,7 @@ public class DepositsValidator implements RequestValidator {
@Override
public boolean validate(
final Block block, final List<Request> requests, final List<TransactionReceipt> receipts) {
var deposits = RequestUtil.filterRequestsOfType(requests, Deposit.class);
var deposits = getDepositRequests(Optional.of(requests)).orElse(Collections.emptyList());
return validateDeposits(block, deposits, receipts);
}
}

@ -22,7 +22,7 @@ import java.util.List;
import java.util.Optional;
public interface RequestProcessor {
Optional<List<Request>> process(
Optional<List<? extends Request>> process(
final MutableWorldState mutableWorldState,
final List<TransactionReceipt> transactionReceipts);
}

@ -14,7 +14,9 @@
*/
package org.hyperledger.besu.ethereum.mainnet.requests;
import org.hyperledger.besu.ethereum.core.Deposit;
import org.hyperledger.besu.ethereum.core.Request;
import org.hyperledger.besu.ethereum.core.WithdrawalRequest;
import java.util.ArrayList;
import java.util.Collections;
@ -40,6 +42,23 @@ public class RequestUtil {
return requests.stream().filter(requestType::isInstance).map(requestType::cast).toList();
}
public static Optional<List<Deposit>> getDepositRequests(final Optional<List<Request>> requests) {
return requests.map(r -> filterRequestsOfType(r, Deposit.class));
}
public static Optional<List<WithdrawalRequest>> getWithdrawalRequests(
final Optional<List<Request>> requests) {
return requests.map(r -> filterRequestsOfType(r, WithdrawalRequest.class));
}
/**
* Combines two optional lists of requests into a single optional list.
*
* @param maybeDeposits Optional list of deposit requests.
* @param maybeWithdrawalRequest Optional list of withdrawal requests.
* @return An Optional containing the combined list of requests, or an empty Optional if both
* inputs are empty.
*/
public static Optional<List<Request>> combine(
final Optional<List<Request>> maybeDeposits,
final Optional<List<Request>> maybeWithdrawalRequest) {

@ -41,6 +41,10 @@ public class RequestsValidatorCoordinator {
private static final Logger LOG = LoggerFactory.getLogger(RequestsValidatorCoordinator.class);
private final ImmutableSortedMap<RequestType, RequestValidator> validators;
public static RequestsValidatorCoordinator empty() {
return new Builder().build();
}
/**
* Constructs a new RequestsDelegateValidator with a mapping of request types to their respective
* validators.

@ -25,7 +25,7 @@ import java.util.Optional;
public class WithdrawalRequestProcessor implements RequestProcessor {
@Override
public Optional<List<Request>> process(
public Optional<List<? extends Request>> process(
final MutableWorldState mutableWorldState,
final List<TransactionReceipt> transactionReceipts) {
@ -33,6 +33,6 @@ public class WithdrawalRequestProcessor implements RequestProcessor {
WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(mutableWorldState).stream()
.toList();
return Optional.of(withdrawalRequests.stream().map(r -> (Request) r).toList());
return Optional.of(withdrawalRequests);
}
}

@ -14,6 +14,8 @@
*/
package org.hyperledger.besu.ethereum.mainnet.requests;
import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getWithdrawalRequests;
import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.ethereum.core.Block;
import org.hyperledger.besu.ethereum.core.Request;
@ -45,7 +47,7 @@ public class WithdrawalRequestValidator implements RequestValidator {
block
.getBody()
.getRequests()
.map(requests -> RequestUtil.filterRequestsOfType(requests, WithdrawalRequest.class))
.flatMap(requests -> getWithdrawalRequests(Optional.of(requests)))
.orElse(Collections.emptyList());
// TODO Do we need to allow for customization? (e.g. if the value changes in the next fork)
@ -74,7 +76,8 @@ public class WithdrawalRequestValidator implements RequestValidator {
@Override
public boolean validate(
final Block block, final List<Request> requests, final List<TransactionReceipt> receipts) {
var withdrawalRequests = RequestUtil.filterRequestsOfType(requests, WithdrawalRequest.class);
var withdrawalRequests =
getWithdrawalRequests(Optional.of(requests)).orElse(Collections.emptyList());
return validateWithdrawalRequestsInBlock(block, withdrawalRequests);
}

@ -114,7 +114,7 @@ class BlockImportExceptionHandlingTest {
when(protocolContext.getWorldStateArchive()).thenReturn(worldStateArchive);
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
when(protocolSpec.getRequestsValidatorCoordinator())
.thenReturn(new RequestsValidatorCoordinator.Builder().build());
.thenReturn(RequestsValidatorCoordinator.empty());
when(protocolSpec.getBlockHashProcessor()).thenReturn(new FrontierBlockHashProcessor());
mainnetBlockValidator =
new MainnetBlockValidator(

@ -27,24 +27,35 @@ import org.apache.tuweni.units.bigints.UInt64;
import org.junit.jupiter.api.Test;
class DepositEncoderTest {
private final String expectedDepositEncodedBytes =
"f8bbb0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416ea00017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483850773594000b860a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb501";
final Deposit deposit =
new Deposit(
BLSPublicKey.fromHexString(
"0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"),
Bytes32.fromHexString(
"0x0017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483"),
GWei.of(32000000000L),
BLSSignature.fromHexString(
"0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"),
UInt64.ONE);
@Test
void shouldEncodeDeposit() {
final Deposit deposit =
new Deposit(
BLSPublicKey.fromHexString(
"0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"),
Bytes32.fromHexString(
"0x0017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483"),
GWei.of(32000000000L),
BLSSignature.fromHexString(
"0xa889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb5"),
UInt64.ONE);
final Bytes encoded = DepositEncoder.encodeOpaqueBytes(deposit);
assertThat(encoded).isEqualTo(Bytes.fromHexString(expectedDepositEncodedBytes));
}
@Test
void shouldEncodeDepositRequest() {
final Bytes encoded = RequestEncoder.encodeOpaqueBytes(deposit);
// Request encoding is Request = RequestType ++ RequestData
assertThat(encoded)
.isEqualTo(
Bytes.fromHexString(
"0xf8bbb0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416ea00017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483850773594000b860a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb501"));
String.format(
"0x%02X%s",
deposit.getType().getSerializedType(), expectedDepositEncodedBytes)));
}
}

@ -25,20 +25,31 @@ import org.apache.tuweni.bytes.Bytes;
import org.junit.jupiter.api.Test;
class WithdrawalRequestEncoderTest {
private final String expectedEncodedBytes =
"f84794763c396673f9c391dce3361a9a71c8e161388000b0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e05";
final WithdrawalRequest withdrawalRequest =
new WithdrawalRequest(
Address.fromHexString("0x763c396673F9c391DCe3361A9A71C8E161388000"),
BLSPublicKey.fromHexString(
"0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"),
GWei.of(5));
@Test
void shouldEncodeWithdrawalRequest() {
final WithdrawalRequest withdrawalRequest =
new WithdrawalRequest(
Address.fromHexString("0x763c396673F9c391DCe3361A9A71C8E161388000"),
BLSPublicKey.fromHexString(
"0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"),
GWei.of(5));
final Bytes encoded = WithdrawalRequestEncoder.encodeOpaqueBytes(withdrawalRequest);
assertThat(encoded).isEqualTo(Bytes.fromHexString(expectedEncodedBytes));
}
@Test
void shouldEncodeRequest() {
final Bytes encoded = RequestEncoder.encodeOpaqueBytes(withdrawalRequest);
assertThat(encoded)
.isEqualTo(
Bytes.fromHexString(
"0xf84794763c396673f9c391dce3361a9a71c8e161388000b0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e05"));
String.format(
"0x%02X%s",
withdrawalRequest.getType().getSerializedType(), expectedEncodedBytes)));
}
}

@ -70,7 +70,7 @@ abstract class AbstractBlockProcessorTest {
lenient().when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
lenient()
.when(protocolSpec.getRequestsValidatorCoordinator())
.thenReturn(new RequestsValidatorCoordinator.Builder().build());
.thenReturn(RequestsValidatorCoordinator.empty());
lenient()
.when(protocolSpec.getBlockHashProcessor())
.thenReturn(new FrontierBlockHashProcessor());

@ -51,7 +51,7 @@ public class MainnetBlockProcessorTest extends AbstractBlockProcessorTest {
public void setup() {
when(protocolSchedule.getByBlockHeader(any())).thenReturn(protocolSpec);
when(protocolSpec.getRequestsValidatorCoordinator())
.thenReturn(new RequestsValidatorCoordinator.Builder().build());
.thenReturn(RequestsValidatorCoordinator.empty());
when(protocolSpec.getBlockHashProcessor()).thenReturn(new FrontierBlockHashProcessor());
}

Loading…
Cancel
Save