op-besu

+2484
-229

This is an overview of the changes in op-besu, a fork of besu, part of the OP Stack.

Related op-stack specifications:

The Bedrock upgrade introduces a Deposit transaction-type (0x7E) to enable both users and the rollup system itself to change the L2 state based on L1 events and system rules as specified.

diff --git hyperledger/besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/Transaction.java optimism-java/op-besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/Transaction.java index 3407513ca74de0cdfb0e7e43eaebaf08796e7488..a3d19f6962062ce434942a7dbc3071c2669b1487 100644 --- hyperledger/besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/Transaction.java +++ optimism-java/op-besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/Transaction.java @@ -200,6 +200,34 @@ */ Optional<BlobsWithCommitments> getBlobsWithCommitments();   /** + * Return the source hash for this transaction. + * + * @return optional source hash + */ + Optional<Hash> getSourceHash(); + + /** + * Return the mint value for this transaction. + * + * @return optional mint value + */ + Optional<Wei> getMint(); + + /** + * Return the is system transaction flag for this transaction. + * + * @return optional is system transaction flag + */ + Optional<Boolean> getIsSystemTx(); + + /** + * Return the roll up gas data. + * + * @return roll up gas data + */ + RollupGasData getRollupGasData(); + + /** * Return the address of the contract, if the transaction creates one * * @return address of new contract or empty otherwise
diff --git hyperledger/besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/TransactionType.java optimism-java/op-besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/TransactionType.java index 984a4cc74675c8030b2bd1252d9711b0fc55a476..ac2ff5ff3381afcf8327c2f0d8811c822e1af69e 100644 --- hyperledger/besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/TransactionType.java +++ optimism-java/op-besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/TransactionType.java @@ -27,7 +27,9 @@ ACCESS_LIST(0x01), /** Eip1559 transaction type. */ EIP1559(0x02), /** Blob transaction type. */ - BLOB(0x03); + BLOB(0x03), + /** Optimism Deposit transaction type. */ + OPTIMISM_DEPOSIT(0x7e);   private static final Set<TransactionType> ACCESS_LIST_SUPPORTED_TRANSACTION_TYPES = Set.of(ACCESS_LIST, EIP1559, BLOB); @@ -83,7 +85,8 @@ new TransactionType[] { TransactionType.FRONTIER, TransactionType.ACCESS_LIST, TransactionType.EIP1559, - TransactionType.BLOB + TransactionType.BLOB, + TransactionType.OPTIMISM_DEPOSIT }) .filter(transactionType -> transactionType.typeValue == serializedTypeValue) .findFirst() @@ -117,7 +120,7 @@ * * @return the boolean */ public boolean requiresChainId() { - return !this.equals(FRONTIER); + return !this.equals(FRONTIER) && !this.equals(OPTIMISM_DEPOSIT); }   /**
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionDecoder.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionDecoder.java new file mode 100644 index 0000000000000000000000000000000000000000..3e8a27c382a88e0fbffd1da3951240387a36d8bb --- /dev/null +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionDecoder.java @@ -0,0 +1,44 @@ +/* + * Copyright optimism-java. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.core.encoding; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.TransactionType; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.ethereum.rlp.RLPInput; + +import java.math.BigInteger; + +public class OptimismDepositTransactionDecoder { + + public static Transaction decode(final RLPInput input) { + input.enterList(); + final Transaction.Builder builder = + Transaction.builder() + .type(TransactionType.OPTIMISM_DEPOSIT) + .sourceHash(Hash.wrap(input.readBytes32())) + .sender(Address.wrap(input.readBytes())) + .to(input.readBytes(v -> v.isEmpty() ? null : Address.wrap(v))) + .mint(Wei.of(input.readUInt256Scalar())) + .value(Wei.of(input.readUInt256Scalar())) + .gasLimit(input.readLongScalar()) + .isSystemTx(input.readBigIntegerScalar().compareTo(BigInteger.ONE) == 0) + .payload(input.readBytes()); + input.leaveList(); + return builder.build(); + } +}
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionEncoder.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionEncoder.java new file mode 100644 index 0000000000000000000000000000000000000000..db0d314e23e26ad8e33c11447f0330956b62b96b --- /dev/null +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionEncoder.java @@ -0,0 +1,40 @@ +/* + * Copyright optimism-java. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.core.encoding; + +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.ethereum.rlp.RLPOutput; + +import java.math.BigInteger; + +import org.apache.tuweni.bytes.Bytes; + +public class OptimismDepositTransactionEncoder { + + public static void encode(final Transaction transaction, final RLPOutput out) { + out.startList(); + out.writeBytes(transaction.getSourceHash().orElseThrow()); + out.writeBytes(transaction.getSender()); + out.writeBytes(transaction.getTo().map(Bytes::copy).orElse(Bytes.EMPTY)); + out.writeUInt256Scalar(transaction.getMint().orElse(Wei.ZERO)); + out.writeUInt256Scalar(transaction.getValue() != null ? transaction.getValue() : Wei.ZERO); + out.writeLongScalar(transaction.getGasLimit()); + out.writeBigIntegerScalar( + transaction.getIsSystemTx().map(b -> b ? BigInteger.ONE : BigInteger.ZERO).orElseThrow()); + out.writeBytes(transaction.getPayload() != null ? transaction.getPayload() : Bytes.EMPTY); + out.endList(); + } +}
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionDecoder.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionDecoder.java index fe6687cdb5c10bf9b49bfe562ad3e24564d82270..5ba7375c9b666cd6f8fc11748336161918255583 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionDecoder.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionDecoder.java @@ -40,7 +40,9 @@ AccessListTransactionDecoder::decode, TransactionType.EIP1559, EIP1559TransactionDecoder::decode, TransactionType.BLOB, - BlobTransactionDecoder::decode); + BlobTransactionDecoder::decode, + TransactionType.OPTIMISM_DEPOSIT, + OptimismDepositTransactionDecoder::decode);   private static final ImmutableMap<TransactionType, Decoder> POOLED_TRANSACTION_DECODERS = ImmutableMap.of(TransactionType.BLOB, BlobPooledTransactionDecoder::decode);
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionEncoder.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionEncoder.java index 20fe75885e49c524ec6768089ffc0f946848d6e5..c68131781186ed9070e78a1fb37460251feb20af 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionEncoder.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionEncoder.java @@ -39,7 +39,9 @@ AccessListTransactionEncoder::encode, TransactionType.EIP1559, EIP1559TransactionEncoder::encode, TransactionType.BLOB, - BlobTransactionEncoder::encode); + BlobTransactionEncoder::encode, + TransactionType.OPTIMISM_DEPOSIT, + OptimismDepositTransactionEncoder::encode);   private static final ImmutableMap<TransactionType, Encoder> POOLED_TRANSACTION_ENCODERS = ImmutableMap.of(TransactionType.BLOB, BlobPooledTransactionEncoder::encode);
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java index cc54415ff5c1b5aff9ba36975f55e5c81e860d95..9a13a8d84ceaaef9debf4ae1a92b13184397d161 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java @@ -31,6 +31,7 @@ import org.hyperledger.besu.datatypes.BlobsWithCommitments; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.KZGCommitment; import org.hyperledger.besu.datatypes.KZGProof; +import org.hyperledger.besu.datatypes.RollupGasData; import org.hyperledger.besu.datatypes.Sha256Hash; import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.VersionedHash; @@ -119,6 +120,12 @@ private final Optional<List<VersionedHash>> versionedHashes;   private final Optional<BlobsWithCommitments> blobsWithCommitments;   + private final Optional<Hash> sourceHash; + + private final Optional<Wei> mint; + + private final Optional<Boolean> isSystemTx; + public static Builder builder() { return new Builder(); } @@ -155,6 +162,9 @@ * <p>The {@code to} will be an {@code Optional.empty()} for a contract creation transaction; * otherwise it should contain an address. * <p>The {@code chainId} must be greater than 0 to be applied to a specific chain; otherwise * it will default to any chain. + * @param sourceHash Hash that uniquely identifies the source of the deposit. + * @param mint The ETH value to mint on L2. + * @param isSystemTx Field indicating if this transaction is exempt from the L2 gas limit. */ private Transaction( final boolean forCopy, @@ -173,7 +183,13 @@ final Optional<List<AccessListEntry>> maybeAccessList, final Address sender, final Optional<BigInteger> chainId, final Optional<List<VersionedHash>> versionedHashes, - final Optional<BlobsWithCommitments> blobsWithCommitments) { + final Optional<BlobsWithCommitments> blobsWithCommitments, + final Optional<Hash> sourceHash, + final Optional<Wei> mint, + final Optional<Boolean> isSystemTx) { + this.sourceHash = sourceHash; + this.mint = mint; + this.isSystemTx = isSystemTx;   if (!forCopy) { if (transactionType.requiresChainId()) { @@ -228,7 +244,9 @@ this.chainId = chainId; this.versionedHashes = versionedHashes; this.blobsWithCommitments = blobsWithCommitments;   - if (!forCopy && isUpfrontGasCostTooHigh()) { + if (!forCopy + && transactionType != TransactionType.OPTIMISM_DEPOSIT + && isUpfrontGasCostTooHigh()) { throw new IllegalArgumentException("Upfront gas cost exceeds UInt256"); } } @@ -240,6 +258,9 @@ * @return the transaction nonce */ @Override public long getNonce() { + if (TransactionType.OPTIMISM_DEPOSIT.equals(transactionType)) { + return 0L; + } return nonce; }   @@ -294,7 +315,8 @@ return maybeBaseFee .map( baseFee -> { if (getType().supports1559FeeMarket()) { - if (baseFee.greaterOrEqualThan(getMaxFeePerGas().get())) { + if (getType().equals(TransactionType.OPTIMISM_DEPOSIT) + || baseFee.greaterOrEqualThan(getMaxFeePerGas().get())) { return Wei.ZERO; } return UInt256s.min( @@ -478,17 +500,25 @@ }   @Override public BigInteger getR() { + if (TransactionType.OPTIMISM_DEPOSIT.equals(transactionType)) { + return BigInteger.ZERO; + } return signature.getR(); }   @Override public BigInteger getS() { + if (TransactionType.OPTIMISM_DEPOSIT.equals(transactionType)) { + return BigInteger.ZERO; + } return signature.getS(); }   @Override public BigInteger getV() { - + if (TransactionType.OPTIMISM_DEPOSIT.equals(transactionType)) { + return BigInteger.ZERO; + } final BigInteger recId = BigInteger.valueOf(signature.getRecId());   if (transactionType != null && transactionType != TransactionType.FRONTIER) { @@ -645,6 +675,9 @@ * @param baseFeePerGas optional baseFee from the block header, if we are post-london * @return the effective gas price. */ public final Wei getEffectiveGasPrice(final Optional<Wei> baseFeePerGas) { + if (TransactionType.OPTIMISM_DEPOSIT.equals(transactionType)) { + return Wei.ZERO; + } return getEffectivePriorityFeePerGas(baseFeePerGas).addExact(baseFeePerGas.orElse(Wei.ZERO)); }   @@ -663,6 +696,27 @@ public Optional<BlobsWithCommitments> getBlobsWithCommitments() { return blobsWithCommitments; }   + @Override + public Optional<Hash> getSourceHash() { + return sourceHash; + } + + @Override + public Optional<Wei> getMint() { + return mint; + } + + @Override + public Optional<Boolean> getIsSystemTx() { + return isSystemTx; + } + + @Override + public RollupGasData getRollupGasData() { + return RollupGasData.fromPayload( + TransactionEncoder.encodeOpaqueBytes(this, EncodingContext.BLOCK_BODY)); + } + /** * Return the list of transaction hashes extracted from the collection of Transaction passed as * argument @@ -1039,7 +1093,7 @@ ? blobsWithCommitments : Optional.of( blobsWithCommitmentsDetachedCopy( blobsWithCommitments.get(), detachedVersionedHashes.get())); - + final Bytes copiedPayload = payload.copy(); return new Transaction( true, transactionType, @@ -1052,12 +1106,15 @@ gasLimit, detachedTo, value, signature, - payload.copy(), + copiedPayload, detachedAccessList, sender, chainId, detachedVersionedHashes, - detachedBlobsWithCommitments); + detachedBlobsWithCommitments, + sourceHash, + mint, + isSystemTx); }   private AccessListEntry accessListDetachedCopy(final AccessListEntry accessListEntry) { @@ -1118,6 +1175,12 @@ protected Optional<BigInteger> v = Optional.empty(); protected List<VersionedHash> versionedHashes = null; private BlobsWithCommitments blobsWithCommitments;   + private Hash sourceHash; + + private Wei mint; + + private Boolean isSystemTx; + public Builder type(final TransactionType transactionType) { this.transactionType = transactionType; return this; @@ -1201,6 +1264,21 @@ this.versionedHashes = versionedHashes; return this; }   + public Builder sourceHash(final Hash sourceHash) { + this.sourceHash = sourceHash; + return this; + } + + public Builder mint(final Wei mint) { + this.mint = mint; + return this; + } + + public Builder isSystemTx(final Boolean isSystemTx) { + this.isSystemTx = isSystemTx; + return this; + } + public Builder guessType() { if (versionedHashes != null && !versionedHashes.isEmpty()) { transactionType = TransactionType.BLOB; @@ -1237,12 +1315,16 @@ accessList, sender, chainId, Optional.ofNullable(versionedHashes), - Optional.ofNullable(blobsWithCommitments)); + Optional.ofNullable(blobsWithCommitments), + Optional.ofNullable(sourceHash), + Optional.ofNullable(mint), + Optional.ofNullable(isSystemTx)); }   public Transaction signAndBuild(final KeyPair keys) { checkState( signature == null, "The transaction signature has already been provided to this builder"); + signature(computeSignature(keys)); sender(Address.extract(Hash.hash(keys.getPublicKey().getEncodedBytes()))); return build();
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/TransactionReceipt.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/TransactionReceipt.java index b7419b1572dd8da1b9ef7282ae6955cb10862930..b0553752e2de6bda681378bc20a125068dc859f7 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/TransactionReceipt.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/TransactionReceipt.java @@ -57,6 +57,9 @@ private final int status; private final TransactionReceiptType transactionReceiptType; private final Optional<Bytes> revertReason;   + private final Optional<Long> depositNonce; + private final Optional<Long> depositReceiptVersion; + /** * Creates an instance of a state root-encoded transaction receipt. * @@ -77,24 +80,9 @@ NONEXISTENT, cumulativeGasUsed, logs, LogsBloomFilter.builder().insertLogs(logs).build(), - revertReason); - } - - private TransactionReceipt( - final TransactionType transactionType, - final Hash stateRoot, - final long cumulativeGasUsed, - final List<Log> logs, - final LogsBloomFilter bloomFilter, - final Optional<Bytes> revertReason) { - this( - transactionType, - stateRoot, - NONEXISTENT, - cumulativeGasUsed, - logs, - bloomFilter, - revertReason); + revertReason, + Optional.empty(), + Optional.empty()); }   /** @@ -117,7 +105,9 @@ status, cumulativeGasUsed, logs, LogsBloomFilter.builder().insertLogs(logs).build(), - revertReason); + revertReason, + Optional.empty(), + Optional.empty()); }   public TransactionReceipt( @@ -127,7 +117,16 @@ final long cumulativeGasUsed, final List<Log> logs, final LogsBloomFilter bloomFilter, final Optional<Bytes> revertReason) { - this(transactionType, null, status, cumulativeGasUsed, logs, bloomFilter, revertReason); + this( + transactionType, + null, + status, + cumulativeGasUsed, + logs, + bloomFilter, + revertReason, + Optional.empty(), + Optional.empty()); }   public TransactionReceipt( @@ -145,14 +144,36 @@ LogsBloomFilter.builder().insertLogs(logs).build(), maybeRevertReason); }   - private TransactionReceipt( + public TransactionReceipt( + final TransactionType transactionType, + final int status, + final long cumulativeGasUsed, + final List<Log> logs, + final Optional<Bytes> maybeRevertReason, + final Optional<Long> depositNonce, + final Optional<Long> depositReceiptVersion) { + this( + transactionType, + null, + status, + cumulativeGasUsed, + logs, + LogsBloomFilter.builder().insertLogs(logs).build(), + maybeRevertReason, + depositNonce, + depositReceiptVersion); + } + + public TransactionReceipt( final TransactionType transactionType, final Hash stateRoot, final int status, final long cumulativeGasUsed, final List<Log> logs, final LogsBloomFilter bloomFilter, - final Optional<Bytes> revertReason) { + final Optional<Bytes> revertReason, + final Optional<Long> depositNonce, + final Optional<Long> depositReceiptVersion) { this.transactionType = transactionType; this.stateRoot = stateRoot; this.cumulativeGasUsed = cumulativeGasUsed; @@ -161,6 +182,8 @@ this.logs = logs; this.bloomFilter = bloomFilter; this.transactionReceiptType = stateRoot == null ? TransactionReceiptType.STATUS : TransactionReceiptType.ROOT; + this.depositNonce = depositNonce; + this.depositReceiptVersion = depositReceiptVersion; this.revertReason = revertReason; }   @@ -185,6 +208,50 @@ rlpOutput.writeBytes(RLP.encode(out -> writeToForReceiptTrie(out, withRevertReason))); } }   + /** + * Write an RLP representation for block chain storage. + * @param rlpOutput The RLP output to write to + */ + public void writeToForStorage(final RLPOutput rlpOutput) { + if (transactionType.equals(TransactionType.FRONTIER)) { + writeToForChainStorage(rlpOutput, true); + } else { + rlpOutput.writeBytes(RLP.encode(out -> writeToForChainStorage(out, true))); + } + } + + /** + * Write an RLP representation for block chain storage. + * Will Always include deposit nonce and deposit receipt version. + * @param rlpOutput The RLP output to write to + */ + public void writeToForChainStorage(final RLPOutput rlpOutput, final boolean withRevertReason) { + if (!transactionType.equals(TransactionType.FRONTIER)) { + rlpOutput.writeIntScalar(transactionType.getSerializedType()); + } + + rlpOutput.startList(); + + // Determine whether it's a state root-encoded transaction receipt + // or is a status code-encoded transaction receipt. + if (stateRoot != null) { + rlpOutput.writeBytes(stateRoot); + } else { + rlpOutput.writeLongScalar(status); + } + rlpOutput.writeLongScalar(cumulativeGasUsed); + rlpOutput.writeBytes(bloomFilter); + rlpOutput.writeList(logs, Log::writeTo); + + depositNonce.ifPresentOrElse(rlpOutput::writeLongScalar, rlpOutput::writeNull); + depositReceiptVersion.ifPresentOrElse(rlpOutput::writeLongScalar, rlpOutput::writeNull); + + if (withRevertReason && revertReason.isPresent()) { + rlpOutput.writeBytes(revertReason.get()); + } + rlpOutput.endList(); + } + public void writeToForReceiptTrie(final RLPOutput rlpOutput, final boolean withRevertReason) { if (!transactionType.equals(TransactionType.FRONTIER)) { rlpOutput.writeIntScalar(transactionType.getSerializedType()); @@ -202,6 +269,14 @@ } rlpOutput.writeLongScalar(cumulativeGasUsed); rlpOutput.writeBytes(bloomFilter); rlpOutput.writeList(logs, Log::writeTo); + + if (transactionType.equals(TransactionType.OPTIMISM_DEPOSIT)) { + if (depositReceiptVersion.isPresent()) { + depositNonce.ifPresentOrElse(rlpOutput::writeLongScalar, rlpOutput::writeNull); + depositReceiptVersion.ifPresentOrElse(rlpOutput::writeLongScalar, rlpOutput::writeNull); + } + } + if (withRevertReason && revertReason.isPresent()) { rlpOutput.writeBytes(revertReason.get()); } @@ -244,14 +319,24 @@ // The logs below will populate the bloom filter upon construction. // TODO consider validating that the logs and bloom filter match. final LogsBloomFilter bloomFilter = LogsBloomFilter.readFrom(input); final List<Log> logs = input.readList(Log::readFrom); - final Optional<Bytes> revertReason; - if (input.isEndOfCurrentList()) { - revertReason = Optional.empty(); - } else { - if (!revertReasonAllowed) { - throw new RLPException("Unexpected value at end of TransactionReceipt"); + Optional<Bytes> revertReason = Optional.empty(); + Optional<Long> depositNonce = Optional.empty(); + Optional<Long> depositReceptVersion = Optional.empty(); + if (transactionType.equals(TransactionType.OPTIMISM_DEPOSIT) && !input.isEndOfCurrentList()) { + var element = input.readBytes(); + if (input.isEndOfCurrentList() && revertReasonAllowed) { + revertReason = Optional.of(element); + } else { + depositNonce = Optional.of(element).map(Bytes::toLong); + depositReceptVersion = Optional.of(input.readBytes()).map(Bytes::toLong); + } + } + if (revertReasonAllowed && revertReason.isEmpty()) { + if (!input.isEndOfCurrentList()) { + revertReason = Optional.of(input.readBytes()); } - revertReason = Optional.of(input.readBytes()); + } else if (!revertReasonAllowed && !input.isEndOfCurrentList()) { + throw new RLPException("Unexpected value at end of TransactionReceipt"); }   // Status code-encoded transaction receipts have a single @@ -260,12 +345,28 @@ if (firstElement.raw().size() == 1) { final int status = firstElement.readIntScalar(); input.leaveList(); return new TransactionReceipt( - transactionType, status, cumulativeGas, logs, bloomFilter, revertReason); + transactionType, + null, + status, + cumulativeGas, + logs, + bloomFilter, + revertReason, + depositNonce, + depositReceptVersion); } else { final Hash stateRoot = Hash.wrap(firstElement.readBytes32()); input.leaveList(); return new TransactionReceipt( - transactionType, stateRoot, cumulativeGas, logs, bloomFilter, revertReason); + transactionType, + stateRoot, + 0, + cumulativeGas, + logs, + bloomFilter, + revertReason, + depositNonce, + depositReceptVersion); } }   @@ -334,6 +435,14 @@ @Override public Optional<Bytes> getRevertReason() { return revertReason; + } + + public Optional<Long> getDepositNonce() { + return depositNonce; + } + + public Optional<Long> getDepositReceiptVersion() { + return depositReceiptVersion; }   @Override

Transactions must pay an additional L1 cost based on the amount of rollup-data-gas they consume, estimated based on gas-price-oracle information and encoded tx size.”

diff --git hyperledger/besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/RollupGasData.java optimism-java/op-besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/RollupGasData.java new file mode 100644 index 0000000000000000000000000000000000000000..bf40b9156f02330c449765dfb0e399388e33ffdf --- /dev/null +++ optimism-java/op-besu/datatypes/src/main/java/org/hyperledger/besu/datatypes/RollupGasData.java @@ -0,0 +1,74 @@ +/* + * Copyright optimism-java. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.datatypes; + +import org.apache.tuweni.bytes.Bytes; + +/** Optimism roll up data records. */ +public class RollupGasData { + + private static final RollupGasData empty = new RollupGasData(0L, 0L); + + private final long zeroes; + + private final long ones; + + RollupGasData(final long zeroes, final long ones) { + this.zeroes = zeroes; + this.ones = ones; + } + + /** + * Get the number of zeroes. + * + * @return the number of zeroes + */ + public long getZeroes() { + return zeroes; + } + + /** + * Get the number of non-zeroes. + * + * @return the number of non-zeroes + */ + public long getOnes() { + return ones; + } + + /** + * Create a new roll up data record from a payload bytes. + * + * @param payload the transaction rlp encoded bytes + * @return the roll up data record + */ + public static RollupGasData fromPayload(final Bytes payload) { + if (payload == null) { + return empty; + } + final int length = payload.size(); + int zeroes = 0; + int ones = 0; + for (int i = 0; i < length; i++) { + byte b = payload.get(i); + if (b == 0) { + zeroes++; + } else { + ones++; + } + } + return new RollupGasData(zeroes, ones); + } +}
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/L1CostCalculator.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/L1CostCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..f20e65ff08c7b74b57694d2897273d90080eee46 --- /dev/null +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/L1CostCalculator.java @@ -0,0 +1,113 @@ +/* + * Copyright optimism-java. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet; + +import org.hyperledger.besu.config.GenesisConfigOptions; +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.RollupGasData; +import org.hyperledger.besu.datatypes.TransactionType; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.core.Transaction; +import org.hyperledger.besu.evm.account.MutableAccount; +import org.hyperledger.besu.evm.worldstate.WorldUpdater; + +import org.apache.tuweni.units.bigints.UInt256; + +/** L1 Cost calculator. */ +public class L1CostCalculator { + + private static final long TX_DATA_ZERO_COST = 4L; + private static final long TX_DATA_NON_ZERO_GAS_EIP2028_COST = 16L; + private static final long TX_DATA_NON_ZERO_GAS_FRONTIER_COST = 68L; + + private static final Address l1BlockAddr = + Address.fromHexString("0x4200000000000000000000000000000000000015"); + private static final UInt256 l1BaseFeeSlot = UInt256.valueOf(1L); + private static final UInt256 overheadSlot = UInt256.valueOf(5L); + private static final UInt256 scalarSlot = UInt256.valueOf(6L); + private long cachedBlock; + private UInt256 l1FBaseFee; + private UInt256 overhead; + private UInt256 scalar; + + public L1CostCalculator() { + this.cachedBlock = 0L; + this.l1FBaseFee = UInt256.ZERO; + this.overhead = UInt256.ZERO; + this.scalar = UInt256.ZERO; + } + + /** + * Calculates the l1 cost of transaction. + * + * @param options genesis config options + * @param blockHeader block header info + * @param transaction transaction is checked + * @param worldState instance of the WorldState + * @return l1 costed gas + */ + public Wei l1Cost( + final GenesisConfigOptions options, + final ProcessableBlockHeader blockHeader, + final Transaction transaction, + final WorldUpdater worldState) { + long gas = 0; + boolean isRegolith = options.isRegolith(blockHeader.getTimestamp()); + + gas += calculateRollupDataGasCost(transaction.getRollupGasData(), isRegolith); + + boolean isOptimism = options.isOptimism(); + boolean isDepositTx = TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType()); + if (!isOptimism || isDepositTx || gas == 0) { + return Wei.ZERO; + } + if (blockHeader.getNumber() != cachedBlock) { + MutableAccount systemConfig = worldState.getOrCreate(l1BlockAddr); + l1FBaseFee = systemConfig.getStorageValue(l1BaseFeeSlot); + overhead = systemConfig.getStorageValue(overheadSlot); + scalar = systemConfig.getStorageValue(scalarSlot); + cachedBlock = blockHeader.getNumber(); + } + UInt256 l1GasUsed = + UInt256.valueOf(gas) + .add(overhead) + .multiply(l1FBaseFee) + .multiply(scalar) + .divide(UInt256.valueOf(1_000_000L)); + + return Wei.of(l1GasUsed); + } + + /** + * calculates rollup data gas cost. + * + * @param rollupGasData rollup gas data record + * @param isRegolith flag that transaction time is bigger than regolith time + * @return the transaction gas value + */ + public static long calculateRollupDataGasCost( + final RollupGasData rollupGasData, final boolean isRegolith) { + var gas = rollupGasData.getZeroes() * TX_DATA_ZERO_COST; + if (isRegolith) { + gas += rollupGasData.getOnes() * TX_DATA_NON_ZERO_GAS_EIP2028_COST; + } else { + gas += + (rollupGasData.getOnes() + TX_DATA_NON_ZERO_GAS_FRONTIER_COST) + * TX_DATA_NON_ZERO_GAS_EIP2028_COST; + } + return gas; + } +}

Deposit transactions have special processing rules: gas is pre-paid on L1, and deposits with EVM-failure are included with rolled back changes (except mint). For regular transactions, at the end of the transition, the 1559 burn and L1 cost are routed to vaults.

diff --git hyperledger/besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/BaseFeePrioritizedTransactions.java optimism-java/op-besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/BaseFeePrioritizedTransactions.java index f5ee0de2ae4df20b529aa980e0e7dadf171eec40..c7093ebcbebaa7e74ead7051664184f0595f96a7 100644 --- hyperledger/besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/BaseFeePrioritizedTransactions.java +++ optimism-java/op-besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/BaseFeePrioritizedTransactions.java @@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;   import java.util.Comparator; import java.util.Optional; +import java.util.OptionalLong; import java.util.function.BiFunction; import java.util.function.Supplier;   @@ -137,7 +138,8 @@ return baseFeeMarket.computeBaseFee( blockHeader.getNumber() + 1, blockHeader.getBaseFee().orElse(Wei.ZERO), blockHeader.getGasUsed(), - baseFeeMarket.targetGasUsed(blockHeader)); + baseFeeMarket.targetGasUsed(blockHeader), + OptionalLong.of(blockHeader.getTimestamp())); } return Wei.ZERO; }
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java index cdeec19b117abfcd0f70d370dad90330b4acbe84..8d771a5d66af8d9b45b5c51cfc7f9909682756dd 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java @@ -19,8 +19,10 @@ import static org.hyperledger.besu.ethereum.mainnet.PrivateStateUtils.KEY_PRIVATE_METADATA_UPDATER; import static org.hyperledger.besu.ethereum.mainnet.PrivateStateUtils.KEY_TRANSACTION; import static org.hyperledger.besu.ethereum.mainnet.PrivateStateUtils.KEY_TRANSACTION_HASH;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.AccessListEntry; import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; @@ -42,6 +44,7 @@ import org.hyperledger.besu.evm.processor.AbstractMessageProcessor; import org.hyperledger.besu.evm.tracing.OperationTracer; import org.hyperledger.besu.evm.worldstate.WorldUpdater;   +import java.nio.charset.StandardCharsets; import java.util.Deque; import java.util.HashSet; import java.util.List; @@ -77,6 +80,10 @@ protected final FeeMarket feeMarket; private final CoinbaseFeePriceCalculator coinbaseFeePriceCalculator;   + private final Optional<GenesisConfigOptions> genesisConfigOptions; + + private final Optional<L1CostCalculator> l1CostCalculator; + public MainnetTransactionProcessor( final GasCalculator gasCalculator, final TransactionValidatorFactory transactionValidatorFactory, @@ -96,6 +103,33 @@ this.warmCoinbase = warmCoinbase; this.maxStackSize = maxStackSize; this.feeMarket = feeMarket; this.coinbaseFeePriceCalculator = coinbaseFeePriceCalculator; + this.genesisConfigOptions = Optional.empty(); + this.l1CostCalculator = Optional.empty(); + } + + public MainnetTransactionProcessor( + final GasCalculator gasCalculator, + final TransactionValidatorFactory transactionValidatorFactory, + final AbstractMessageProcessor contractCreationProcessor, + final AbstractMessageProcessor messageCallProcessor, + final boolean clearEmptyAccounts, + final boolean warmCoinbase, + final int maxStackSize, + final FeeMarket feeMarket, + final CoinbaseFeePriceCalculator coinbaseFeePriceCalculator, + final Optional<GenesisConfigOptions> genesisConfigOptions, + final Optional<L1CostCalculator> l1CostCalculator) { + this.gasCalculator = gasCalculator; + this.transactionValidatorFactory = transactionValidatorFactory; + this.contractCreationProcessor = contractCreationProcessor; + this.messageCallProcessor = messageCallProcessor; + this.clearEmptyAccounts = clearEmptyAccounts; + this.warmCoinbase = warmCoinbase; + this.maxStackSize = maxStackSize; + this.feeMarket = feeMarket; + this.coinbaseFeePriceCalculator = coinbaseFeePriceCalculator; + this.genesisConfigOptions = genesisConfigOptions; + this.l1CostCalculator = l1CostCalculator; }   /** @@ -269,11 +303,24 @@ final TransactionValidationParams transactionValidationParams, final PrivateMetadataUpdater privateMetadataUpdater, final Wei blobGasPrice) { try { + transaction + .getMint() + .ifPresent( + mint -> { + WorldUpdater mintUpdater = worldState.updater(); + final MutableAccount sender = + mintUpdater.getOrCreateSenderAccount(transaction.getSender()); + sender.incrementBalance(transaction.getMint().orElse(Wei.ZERO)); + mintUpdater.commit(); + }); final var transactionValidator = transactionValidatorFactory.get(); LOG.trace("Starting execution of {}", transaction); ValidationResult<TransactionInvalidReason> validationResult = transactionValidator.validate( - transaction, blockHeader.getBaseFee(), transactionValidationParams); + transaction, + blockHeader.getTimestamp(), + blockHeader.getBaseFee(), + transactionValidationParams); // Make sure the transaction is intrinsically valid before trying to // compare against a sender account (because the transaction may not // be signed correctly to extract the sender). @@ -300,20 +347,42 @@ senderAddress, previousNonce, sender.getNonce());   - final Wei transactionGasPrice = - feeMarket.getTransactionPriceCalculator().price(transaction, blockHeader.getBaseFee()); + Wei transactionGasPrice; + if (!TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) { + transactionGasPrice = + feeMarket.getTransactionPriceCalculator().price(transaction, blockHeader.getBaseFee());   - final long blobGas = gasCalculator.blobGasCost(transaction.getBlobCount()); + final long blobGas = gasCalculator.blobGasCost(transaction.getBlobCount());   - final Wei upfrontGasCost = - transaction.getUpfrontGasCost(transactionGasPrice, blobGasPrice, blobGas); - final Wei previousBalance = sender.decrementBalance(upfrontGasCost); - LOG.trace( - "Deducted sender {} upfront gas cost {} ({} -> {})", - senderAddress, - upfrontGasCost, - previousBalance, - sender.getBalance()); + final Wei upfrontGasCost = + transaction.getUpfrontGasCost(transactionGasPrice, blobGasPrice, blobGas); + final Wei previousBalance = sender.decrementBalance(upfrontGasCost); + LOG.trace( + "Deducted sender {} upfront gas cost {} ({} -> {})", + senderAddress, + upfrontGasCost, + previousBalance, + sender.getBalance()); + } else { + transactionGasPrice = Wei.ZERO; + } + + genesisConfigOptions.ifPresent( + options -> { + if (!options.isOptimism() + || !options.isRegolith(blockHeader.getTimestamp()) + || TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) { + return; + } + final Wei l1Cost = + l1CostCalculator + .map( + l1CostCalculator -> + l1CostCalculator.l1Cost( + genesisConfigOptions.get(), blockHeader, transaction, worldState)) + .orElse(Wei.ZERO); + sender.decrementBalance(l1Cost); + });   final List<AccessListEntry> accessListEntries = transaction.getAccessList().orElse(List.of()); // we need to keep a separate hash set of addresses in case they specify no storage. @@ -372,7 +441,10 @@ .miningBeneficiary(miningBeneficiary) .blockHashLookup(blockHashLookup) .contextVariables(contextVariablesBuilder.build()) .accessListWarmAddresses(addressList) - .accessListWarmStorage(storageList); + .accessListWarmStorage(storageList) + .isDepositTx(TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) + .isSystemTx(transaction.getIsSystemTx().orElse(false)) + .mint(transaction.getMint());   if (transaction.getVersionedHashes().isPresent()) { commonMessageFrameBuilder.versionedHashes( @@ -433,12 +505,34 @@ transaction.getGasLimit() - initialFrame.getRemainingGas(), gasAvailable - initialFrame.getRemainingGas()); }   + boolean isRegolith = + genesisConfigOptions + .map(options -> options.isRegolith(blockHeader.getTimestamp())) + .orElse(false); + + // if deposit: skip refunds, skip tipping coinbase + // Regolith changes this behaviour to report the actual gasUsed instead of always reporting + // all gas used. + if (initialFrame.isDepositTx() && !isRegolith) { + var gasUsed = transaction.getGasLimit(); + if (initialFrame.isSystemTx()) { + gasUsed = 0L; + } + if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { + return TransactionProcessingResult.successful( + initialFrame.getLogs(), gasUsed, 0L, initialFrame.getOutputData(), validationResult); + } else { + return TransactionProcessingResult.failed( + gasUsed, 0L, validationResult, initialFrame.getRevertReason()); + } + } + // Refund the sender by what we should and pay the miner fee (note that we're doing them one // after the other so that if it is the same account somehow, we end up with the right result) final long selfDestructRefund = gasCalculator.getSelfDestructRefundAmount() * initialFrame.getSelfDestructs().size(); final long baseRefundGas = initialFrame.getGasRefund() + selfDestructRefund; - final long refundedGas = refunded(transaction, initialFrame.getRemainingGas(), baseRefundGas); + final long refundedGas = refunded(transaction, initialFrame, baseRefundGas); final Wei refundedWei = transactionGasPrice.multiply(refundedGas); final Wei balancePriorToRefund = sender.getBalance(); sender.incrementBalance(refundedWei); @@ -449,8 +543,24 @@ .addArgument(refundedWei) .addArgument(balancePriorToRefund) .addArgument(sender.getBalance()) .log(); + final long gasUsedByTransaction = transaction.getGasLimit() - initialFrame.getRemainingGas();   + // Skip coinbase payments for deposit tx in Regolith + if (initialFrame.isDepositTx() && isRegolith) { + if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { + return TransactionProcessingResult.successful( + initialFrame.getLogs(), + gasUsedByTransaction, + refundedGas, + initialFrame.getOutputData(), + validationResult); + } else { + return TransactionProcessingResult.failed( + gasUsedByTransaction, refundedGas, validationResult, initialFrame.getRevertReason()); + } + } + // update the coinbase final var coinbase = worldState.getOrCreate(miningBeneficiary); final long usedGas = transaction.getGasLimit() - refundedGas; @@ -482,6 +592,30 @@ if (clearEmptyAccounts) { worldState.clearAccountsThatAreEmpty(); }   + // Check that we are post bedrock to enable op-geth to be able to create pseudo pre-bedrock + // blocks (these are pre-bedrock, but don't follow l2 geth rules) + // Note optimismConfig will not be nil if rules.IsOptimismBedrock is true + genesisConfigOptions.ifPresent( + options -> { + if (!options.isBedrockBlock(blockHeader.getNumber())) { + return; + } + MutableAccount opBaseFeeRecipient = + worldState.getOrCreate( + Address.fromHexString("0x4200000000000000000000000000000000000019")); + opBaseFeeRecipient.incrementBalance( + blockHeader.getBaseFee().get().multiply(gasUsedByTransaction)); + + l1CostCalculator.ifPresent( + costCal -> { + final Wei l1Cost = costCal.l1Cost(options, blockHeader, transaction, worldState); + MutableAccount opL1FeeRecipient = + worldState.getOrCreate( + Address.fromHexString("0x420000000000000000000000000000000000001A")); + opL1FeeRecipient.incrementBalance(l1Cost); + }); + }); + if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { return TransactionProcessingResult.successful( initialFrame.getLogs(), @@ -497,6 +631,21 @@ } catch (final MerkleTrieException re) { // need to throw to trigger the heal throw re; } catch (final RuntimeException re) { + if (TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) { + worldState.revert(); + worldState.getAccount(transaction.getSender()).incrementNonce(); + var gasUsed = transaction.getGasLimit(); + if (transaction.getIsSystemTx().get() + && genesisConfigOptions.get().isRegolith(blockHeader.getTimestamp())) { + gasUsed = 0L; + } + final String msg = String.format("failed deposit: %s", re); + return TransactionProcessingResult.failed( + gasUsed, + 0L, + ValidationResult.valid(), + Optional.of(Bytes.wrap(msg.getBytes(StandardCharsets.UTF_8)))); + } LOG.error("Critical Exception Processing Transaction", re); return TransactionProcessingResult.invalid( ValidationResult.invalid( @@ -518,11 +667,13 @@ }; }   protected long refunded( - final Transaction transaction, final long gasRemaining, final long gasRefund) { + final Transaction transaction, final MessageFrame initialFrame, final long gasRefund) { // Integer truncation takes care of the floor calculation needed after the divide. + final long gasRemaining = initialFrame.getRemainingGas(); final long maxRefundAllowance = (transaction.getGasLimit() - gasRemaining) / gasCalculator.getMaxRefundQuotient(); final long refundAllowance = Math.min(maxRefundAllowance, gasRefund); - return gasRemaining + refundAllowance; + initialFrame.incrementRemainingGas(refundAllowance); + return initialFrame.getRemainingGas(); } }
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java index 103fb3782d1d03355e6a4b949de3231a6532d28a..6bd238cf82d04979315b8a3b4f598c392b90c5a2 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.mainnet;   import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator.calculateExcessBlobGasForParent;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.Wei; @@ -35,6 +36,7 @@ import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.trie.MerkleTrieException; import org.hyperledger.besu.ethereum.vm.BlockHashLookup; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; +import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.tracing.OperationTracer; import org.hyperledger.besu.evm.worldstate.WorldState; import org.hyperledger.besu.evm.worldstate.WorldUpdater; @@ -43,6 +45,7 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.OptionalLong;   import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,6 +75,8 @@ protected final boolean skipZeroBlockRewards; private final ProtocolSchedule protocolSchedule;   + private final Optional<GenesisConfigOptions> genesisOptions; + protected final MiningBeneficiaryCalculator miningBeneficiaryCalculator;   protected AbstractBlockProcessor( @@ -80,13 +85,15 @@ final TransactionReceiptFactory transactionReceiptFactory, final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final ProtocolSchedule protocolSchedule) { + final ProtocolSchedule protocolSchedule, + final Optional<GenesisConfigOptions> genesisOptions) { this.transactionProcessor = transactionProcessor; this.transactionReceiptFactory = transactionReceiptFactory; this.blockReward = blockReward; this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.skipZeroBlockRewards = skipZeroBlockRewards; this.protocolSchedule = protocolSchedule; + this.genesisOptions = genesisOptions; }   @Override @@ -109,6 +116,9 @@ final WorldUpdater updater = worldState.updater(); ParentBeaconBlockRootHelper.storeParentBeaconBlockRoot( updater, blockHeader.getTimestamp(), blockHeader.getParentBeaconBlockRoot().get()); } + + Create2DeployerFunction.ensureCreate2Deployer( + genesisOptions, blockHeader.getTimestamp(), worldState.updater());   for (final Transaction transaction : transactions) { if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) { @@ -134,6 +144,12 @@ .blobGasPricePerGas( calculateExcessBlobGasForParent(protocolSpec, parentHeader))) .orElse(Wei.ZERO);   + OptionalLong nonce = OptionalLong.empty(); + if (TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) { + Account sender = worldStateUpdater.getOrCreate(transaction.getSender()); + nonce = OptionalLong.of(sender.getNonce()); + } + final TransactionProcessingResult result = transactionProcessor.processTransaction( blockchain, @@ -163,10 +179,31 @@ } worldStateUpdater.commit();   currentGasUsed += transaction.getGasLimit() - result.getGasRemaining(); - final TransactionReceipt transactionReceipt = - transactionReceiptFactory.create( - transaction.getType(), result, worldState, currentGasUsed); - receipts.add(transactionReceipt); + TransactionReceipt receipt; + if (!TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) { + receipt = + transactionReceiptFactory.create( + transaction.getType(), result, worldState, currentGasUsed); + } else { + GenesisConfigOptions options = genesisOptions.orElseThrow(); + Optional<Long> depositNonce = + options.isRegolith(blockHeader.getTimestamp()) && nonce.isPresent() + ? Optional.of(nonce.getAsLong()) + : Optional.empty(); + + Optional<Long> canyonDepositReceiptVer = + options.isCanyon(blockHeader.getTimestamp()) ? Optional.of(1L) : Optional.empty(); + receipt = + new TransactionReceipt( + transaction.getType(), + result.isSuccessful() ? 1 : 0, + currentGasUsed, + result.getLogs(), + Optional.empty(), + depositNonce, + canyonDepositReceiptVer); + } + receipts.add(receipt); }   final Optional<WithdrawalsProcessor> maybeWithdrawalsProcessor =
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java index 9f2096f63d2661cd7b61ff8188a102bc28a78ce5..a19ac318dd12e2b788a8c1b5e97b0adc52dc1eb5 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java @@ -14,6 +14,7 @@ * SPDX-License-Identifier: Apache-2.0 */ package org.hyperledger.besu.ethereum.mainnet;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.BlockHeader; @@ -22,6 +23,7 @@ import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater;   import java.util.List; +import java.util.Optional;   import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,14 +38,16 @@ final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory, final Wei blockReward, final MiningBeneficiaryCalculator miningBeneficiaryCalculator, final boolean skipZeroBlockRewards, - final ProtocolSchedule protocolSchedule) { + final ProtocolSchedule protocolSchedule, + final Optional<GenesisConfigOptions> genesisConfigOptions) { super( transactionProcessor, transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - protocolSchedule); + protocolSchedule, + genesisConfigOptions); }   @Override
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java index 044017b8728ee5f726abf446380eadfb50c65e9c..3d1a2c636aac9ba7634f8703068ec83a95d2adaa 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.evm.worldstate.WorldUpdater;   import java.math.BigInteger; import java.util.List; +import java.util.Optional; import java.util.OptionalLong;   import org.slf4j.Logger; @@ -49,7 +50,8 @@ transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - protocolSchedule); + protocolSchedule, + Optional.empty()); eraLength = eraLen.orElse(DEFAULT_ERA_LENGTH); }
diff --git hyperledger/besu/evm/src/main/java/org/hyperledger/besu/evm/frame/MessageFrame.java optimism-java/op-besu/evm/src/main/java/org/hyperledger/besu/evm/frame/MessageFrame.java index ed711e3f18182ed753794160111d688937098c0e..d84667d212cd23c39b048047fa43a4cfa43a49be 100644 --- hyperledger/besu/evm/src/main/java/org/hyperledger/besu/evm/frame/MessageFrame.java +++ optimism-java/op-besu/evm/src/main/java/org/hyperledger/besu/evm/frame/MessageFrame.java @@ -231,6 +231,9 @@ private final Address sender; private final Wei value; private final Wei apparentValue; private final Code code; + private final boolean isSystemTx; + private final boolean isDepositTx; + private final Optional<Wei> mint;   private Optional<Bytes> revertReason;   @@ -271,7 +274,10 @@ final boolean isStatic, final Consumer<MessageFrame> completer, final Map<String, Object> contextVariables, final Optional<Bytes> revertReason, - final TxValues txValues) { + final TxValues txValues, + final boolean isSystemTx, + final boolean isDepositTx, + final Optional<Wei> mint) {   this.txValues = txValues; this.type = type; @@ -299,6 +305,9 @@ this.contextVariables = contextVariables; this.revertReason = revertReason;   this.undoMark = txValues.transientStorage().mark(); + this.isSystemTx = isSystemTx; + this.isDepositTx = isDepositTx; + this.mint = mint; }   /** @@ -933,6 +942,7 @@ */ public void addCreate(final Address address) { txValues.creates().add(address); } + /** * Add addresses to the create set if they are not already present. * @@ -1107,6 +1117,7 @@ */ public int getDepth() { return getMessageStackSize() - 1; } + /** * Returns the recipient that originated the message. * @@ -1357,6 +1368,33 @@ public Optional<List<VersionedHash>> getVersionedHashes() { return txValues.versionedHashes(); }   + /** + * Is deposit tx boolean. + * + * @return the boolean + */ + public boolean isDepositTx() { + return isDepositTx; + } + + /** + * Is system tx boolean. + * + * @return the boolean + */ + public boolean isSystemTx() { + return isSystemTx; + } + + /** + * Gets mint. + * + * @return the mint + */ + public Optional<Wei> getMint() { + return mint; + } + /** Reset. */ public void reset() { maybeUpdatedMemory = Optional.empty(); @@ -1393,6 +1431,10 @@ private Multimap<Address, Bytes32> accessListWarmStorage = HashMultimap.create();   private Optional<List<VersionedHash>> versionedHashes = Optional.empty();   + private boolean isSystemTx; + private boolean isDepositTx; + private Optional<Wei> mint; + /** * The "parent" message frame. When present some fields will be populated from the parent and * ignored if passed in via builder @@ -1669,6 +1711,39 @@ this.versionedHashes = versionedHashes; return this; }   + /** + * Is system tx builder. + * + * @param isSystemTx the is system tx + * @return the builder + */ + public Builder isSystemTx(final boolean isSystemTx) { + this.isSystemTx = isSystemTx; + return this; + } + + /** + * Is deposit tx builder. + * + * @param isDepositTx the is deposit tx + * @return the builder + */ + public Builder isDepositTx(final boolean isDepositTx) { + this.isDepositTx = isDepositTx; + return this; + } + + /** + * Mint builder. + * + * @param mint the mint + * @return the builder + */ + public Builder mint(final Optional<Wei> mint) { + this.mint = mint; + return this; + } + private void validate() { if (parentMessageFrame == null) { checkState(worldUpdater != null, "Missing message frame world updater"); @@ -1743,7 +1818,10 @@ newStatic, completer, contextVariables == null ? Map.of() : contextVariables, reason, - newTxValues); + newTxValues, + isSystemTx, + isDepositTx, + mint); newTxValues.messageFrameStack().addFirst(messageFrame); messageFrame.warmUpAddress(sender); messageFrame.warmUpAddress(contract);

The gaslimit is free to be set by the Engine API caller, instead of enforcing adjustments of the gaslimit in increments of 11024 of the previous gaslimit. The gaslimit is changed (and limited) through the SystemConfig contract.

diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFee.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFee.java index 010d94a174cb10893431a7dcb52832ddae211f40..23ca0175eef2a9dff303bcecd2fe60f04ebbce15 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFee.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFee.java @@ -17,6 +17,8 @@ import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;   +import java.util.OptionalLong; + public class BaseFee { private final Wei value; private final Wei delta; @@ -25,7 +27,7 @@ private final Wei maxNextValue;   public BaseFee(final BaseFeeMarket feeMarket, final Wei value) { this.value = value; - this.delta = value.divide(feeMarket.getBasefeeMaxChangeDenominator()); + this.delta = value.divide(feeMarket.getBasefeeMaxChangeDenominator(OptionalLong.empty())); this.minNextValue = value.subtract(delta); this.maxNextValue = value.add(delta); }
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/BaseFeeMarket.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/BaseFeeMarket.java index 4678092003d22acac5f50c81851f0387e22774d5..a82aff967545860091e90d840ad4f8f3db4d44e1 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/BaseFeeMarket.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/BaseFeeMarket.java @@ -17,6 +17,8 @@ import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.BlockHeader;   +import java.util.OptionalLong; + public interface BaseFeeMarket extends FeeMarket {   enum ValidationMode { @@ -30,7 +32,7 @@ default boolean implementsBaseFee() { return true; }   - long getBasefeeMaxChangeDenominator(); + long getBasefeeMaxChangeDenominator(OptionalLong time);   Wei getInitialBasefee();   @@ -51,7 +53,8 @@ Wei computeBaseFee( final long blockNumber, final Wei parentBaseFee, final long parentBlockGasUsed, - final long targetGasUsed); + final long targetGasUsed, + final OptionalLong time);   ValidationMode baseFeeValidationMode(final long blockNumber);
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/CancunFeeMarket.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/CancunFeeMarket.java index ab46beadca555e357a7202132e79adedd4a87044..25899f5a4a6d1aa1990da9a8c47c5605dd7bec60 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/CancunFeeMarket.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/CancunFeeMarket.java @@ -30,7 +30,7 @@ private static final BigInteger BLOB_GAS_PRICE_UPDATE_FRACTION = BigInteger.valueOf(3338477);   public CancunFeeMarket( final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) { - super(londonForkBlockNumber, baseFeePerGasOverride); + super(londonForkBlockNumber, baseFeePerGasOverride, Optional.empty()); }   @Override
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/FeeMarket.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/FeeMarket.java index 637ffb471eca01950c9cb8b2309f2ff083e75f16..1829737ae991ad434a2165fe73046c6dca45ac94 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/FeeMarket.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/FeeMarket.java @@ -14,6 +14,7 @@ * SPDX-License-Identifier: Apache-2.0 */ package org.hyperledger.besu.ethereum.mainnet.feemarket;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.BlobGas; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.Transaction; @@ -36,12 +37,14 @@ boolean satisfiesFloorTxFee(Transaction txn);   static BaseFeeMarket london(final long londonForkBlockNumber) { - return london(londonForkBlockNumber, Optional.empty()); + return london(londonForkBlockNumber, Optional.empty(), Optional.empty()); }   static BaseFeeMarket london( - final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) { - return new LondonFeeMarket(londonForkBlockNumber, baseFeePerGasOverride); + final long londonForkBlockNumber, + final Optional<Wei> baseFeePerGasOverride, + final Optional<GenesisConfigOptions> chainOptions) { + return new LondonFeeMarket(londonForkBlockNumber, baseFeePerGasOverride, chainOptions); }   static BaseFeeMarket cancun(
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarket.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarket.java index 2fff3a629fa4e1d4e91c194e0dbe205e9dcb60b1..5cd88b08ebf2f5e47ed7660f19c52f9730b6d80d 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarket.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarket.java @@ -15,11 +15,13 @@ */ package org.hyperledger.besu.ethereum.mainnet.feemarket;   import org.hyperledger.besu.config.GenesisConfigFile; +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.feemarket.TransactionPriceCalculator;   import java.util.Optional; +import java.util.OptionalLong;   import org.apache.tuweni.units.bigints.UInt256s; import org.slf4j.Logger; @@ -39,28 +41,48 @@ private final Wei baseFeeInitialValue; private final long londonForkBlockNumber; private final TransactionPriceCalculator txPriceCalculator; private final Wei baseFeeFloor; + private final Optional<GenesisConfigOptions> chainOptions;   public LondonFeeMarket(final long londonForkBlockNumber) { - this(londonForkBlockNumber, Optional.empty()); + this(londonForkBlockNumber, Optional.empty(), Optional.empty()); }   public LondonFeeMarket( - final long londonForkBlockNumber, final Optional<Wei> baseFeePerGasOverride) { - this(TransactionPriceCalculator.eip1559(), londonForkBlockNumber, baseFeePerGasOverride); + final long londonForkBlockNumber, + final Optional<Wei> baseFeePerGasOverride, + final Optional<GenesisConfigOptions> chainOptions) { + this( + TransactionPriceCalculator.eip1559(), + londonForkBlockNumber, + baseFeePerGasOverride, + chainOptions); }   protected LondonFeeMarket( final TransactionPriceCalculator txPriceCalculator, final long londonForkBlockNumber, - final Optional<Wei> baseFeePerGasOverride) { + final Optional<Wei> baseFeePerGasOverride, + final Optional<GenesisConfigOptions> chainOptions) { this.txPriceCalculator = txPriceCalculator; this.londonForkBlockNumber = londonForkBlockNumber; this.baseFeeInitialValue = baseFeePerGasOverride.orElse(DEFAULT_BASEFEE_INITIAL_VALUE); this.baseFeeFloor = baseFeeInitialValue.isZero() ? Wei.ZERO : DEFAULT_BASEFEE_FLOOR; + this.chainOptions = chainOptions; }   @Override - public long getBasefeeMaxChangeDenominator() { + public long getBasefeeMaxChangeDenominator(final OptionalLong time) { + if (this.chainOptions.isPresent() && this.chainOptions.get().isOptimism() && time.isPresent()) { + if (this.chainOptions.get().isCanyon(time.getAsLong())) { + return chainOptions + .get() + .getOptimismConfigOptions() + .getEIP1559DenominatorCanyon() + .orElseThrow(); + } else { + return chainOptions.get().getOptimismConfigOptions().getEIP1559Denominator().orElseThrow(); + } + } return DEFAULT_BASEFEE_MAX_CHANGE_DENOMINATOR; }   @@ -71,6 +93,9 @@ }   @Override public long getSlackCoefficient() { + if (chainOptions.isPresent() && chainOptions.get().isOptimism()) { + return chainOptions.get().getOptimismConfigOptions().getEIP1559Elasticity().orElseThrow(); + } return DEFAULT_SLACK_COEFFICIENT; }   @@ -94,7 +119,8 @@ public Wei computeBaseFee( final long blockNumber, final Wei parentBaseFee, final long parentBlockGasUsed, - final long targetGasUsed) { + final long targetGasUsed, + final OptionalLong time) { if (londonForkBlockNumber == blockNumber) { return getInitialBasefee(); } @@ -105,16 +131,16 @@ if (parentBlockGasUsed == targetGasUsed) { return parentBaseFee; } else if (parentBlockGasUsed > targetGasUsed) { gasDelta = parentBlockGasUsed - targetGasUsed; - final long denominator = getBasefeeMaxChangeDenominator(); + final long denominator = getBasefeeMaxChangeDenominator(time); feeDelta = UInt256s.max( parentBaseFee.multiply(gasDelta).divide(targetGasUsed).divide(denominator), Wei.ONE); baseFee = parentBaseFee.add(feeDelta); } else { gasDelta = targetGasUsed - parentBlockGasUsed; - final long denominator = getBasefeeMaxChangeDenominator(); + final long denominator = getBasefeeMaxChangeDenominator(time); feeDelta = parentBaseFee.multiply(gasDelta).divide(targetGasUsed).divide(denominator); - baseFee = parentBaseFee.subtract(feeDelta); + baseFee = UInt256s.max(parentBaseFee.subtract(feeDelta), Wei.ZERO); } LOG.trace( "block #{} parentBaseFee: {} parentGasUsed: {} parentGasTarget: {} baseFee: {}",
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarket.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarket.java index c2f406cad04844a807abcfee5b4ff3915764a4e7..26e2aa7e99ee1f95fecffe18637b650053edfbd2 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarket.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarket.java @@ -17,11 +17,12 @@ import org.hyperledger.besu.datatypes.Wei;   import java.util.Optional; +import java.util.OptionalLong;   public class ZeroBaseFeeMarket extends LondonFeeMarket {   public ZeroBaseFeeMarket(final long londonForkBlockNumber) { - super(londonForkBlockNumber, Optional.of(Wei.ZERO)); + super(londonForkBlockNumber, Optional.of(Wei.ZERO), Optional.empty()); }   @Override @@ -29,7 +30,8 @@ public Wei computeBaseFee( final long blockNumber, final Wei parentBaseFee, final long parentBlockGasUsed, - final long targetGasUsed) { + final long targetGasUsed, + final OptionalLong time) {   return Wei.ZERO; }
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthFeeHistory.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthFeeHistory.java index ffe3b96b05a7c77f9418e06f89c20cef9294879d..17cfcb96cd91c274df4e3610fa547cef7529c052 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthFeeHistory.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthFeeHistory.java @@ -42,6 +42,7 @@ import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.OptionalLong; import java.util.stream.LongStream; import java.util.stream.Stream;   @@ -138,7 +139,8 @@ nextBlockNumber, explicitlyRequestedBaseFees.get( explicitlyRequestedBaseFees.size() - 1), lastBlockHeader.getGasUsed(), - feeMarket.targetGasUsed(lastBlockHeader)); + feeMarket.targetGasUsed(lastBlockHeader), + OptionalLong.of(chainHeadHeader.getTimestamp())); }) .orElse(Wei.ZERO));

The block creation code implements the changes to support the transaction-inclusion, tx-pool toggle and gaslimit parameters of the Engine API.

diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java index ffd57c4b27e4f0c9e785b360f636b3e1831e9465..cf7ced7d23d9e5037ac1e60828d6a5a388192649 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java @@ -17,6 +17,7 @@ import static java.util.stream.Collectors.joining; import static org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator.ForkchoiceResult.Status.INVALID;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.consensus.merge.MergeContext; import org.hyperledger.besu.consensus.merge.PayloadWrapper; import org.hyperledger.besu.datatypes.Address; @@ -47,7 +48,6 @@ import org.hyperledger.besu.plugin.services.exception.StorageException;   import java.io.PrintWriter; import java.io.StringWriter; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -113,7 +113,8 @@ final ProposalBuilderExecutor blockBuilderExecutor, final TransactionPool transactionPool, final MiningParameters miningParams, final BackwardSyncContext backwardSyncContext, - final Optional<Address> depositContractAddress) { + final Optional<Address> depositContractAddress, + final Optional<GenesisConfigOptions> genesisConfigOptions) { this.protocolContext = protocolContext; this.protocolSchedule = protocolSchedule; this.blockBuilderExecutor = blockBuilderExecutor; @@ -139,7 +140,8 @@ protocolSchedule, this.miningParameters.getMinTransactionGasPrice(), address.or(miningParameters::getCoinbase).orElse(Address.ZERO), parentHeader, - depositContractAddress); + depositContractAddress, + genesisConfigOptions);   this.backwardSyncContext.subscribeBadChainListener(this); } @@ -247,7 +249,10 @@ final Long timestamp, final Bytes32 prevRandao, final Address feeRecipient, final Optional<List<Withdrawal>> withdrawals, - final Optional<Bytes32> parentBeaconBlockRoot) { + final Optional<Bytes32> parentBeaconBlockRoot, + final Optional<Boolean> noTxPool, + final Optional<List<Transaction>> transactions, + final Optional<Long> gasLimit) {   // we assume that preparePayload is always called sequentially, since the RPC Engine calls // are sequential, if this assumption changes then more synchronization should be added to @@ -260,7 +265,10 @@ timestamp, prevRandao, feeRecipient, withdrawals, - parentBeaconBlockRoot); + parentBeaconBlockRoot, + noTxPool, + transactions, + gasLimit);   if (blockCreationTasks.containsKey(payloadIdentifier)) { LOG.debug( @@ -280,11 +288,13 @@ // put the empty block in first final Block emptyBlock = mergeBlockCreator .createBlock( - Optional.of(Collections.emptyList()), + transactions, prevRandao, timestamp, withdrawals, - parentBeaconBlockRoot) + parentBeaconBlockRoot, + Optional.of(true), + gasLimit) .getBlock();   BlockProcessingResult result = validateProposedBlock(emptyBlock); @@ -306,13 +316,21 @@ LOG.warn("caused by", result.causedBy().get()); } }   + if (mergeContext.isOptimism() && noTxPool.isPresent() && noTxPool.get()) { + LOG.info("optimism: no tx pool, no need external txs from tx pool"); + return payloadIdentifier; + } + tryToBuildBetterBlock( timestamp, prevRandao, payloadIdentifier, mergeBlockCreator, withdrawals, - parentBeaconBlockRoot); + parentBeaconBlockRoot, + Optional.of(false), + transactions, + gasLimit);   return payloadIdentifier; } @@ -353,12 +371,21 @@ final Bytes32 random, final PayloadIdentifier payloadIdentifier, final MergeBlockCreator mergeBlockCreator, final Optional<List<Withdrawal>> withdrawals, - final Optional<Bytes32> parentBeaconBlockRoot) { + final Optional<Bytes32> parentBeaconBlockRoot, + final Optional<Boolean> noTxPool, + final Optional<List<Transaction>> transactions, + final Optional<Long> gasLimit) {   final Supplier<BlockCreationResult> blockCreator = () -> mergeBlockCreator.createBlock( - Optional.empty(), random, timestamp, withdrawals, parentBeaconBlockRoot); + transactions, + random, + timestamp, + withdrawals, + parentBeaconBlockRoot, + noTxPool, + gasLimit);   LOG.debug( "Block creation started for payload id {}, remaining time is {}ms",
diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java index 887fef6629908a1c2e9d75d0a4e5d3dbb28b4a62..cf18f2ed5c15fc6986fdef7e646b5b40df845459 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.ethereum.BlockProcessingResult; import org.hyperledger.besu.ethereum.blockcreation.MiningCoordinator; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.Withdrawal;   import java.util.List; @@ -42,6 +43,9 @@ * @param prevRandao the prev randao * @param feeRecipient the fee recipient * @param withdrawals the optional list of withdrawals * @param parentBeaconBlockRoot optional root hash of the parent beacon block + * @param noTxPool optional flag to indicate that the transaction pool should not be used + * @param transactions the optional list of transactions + * @param gasLimit the optional gas limit * @return the payload identifier */ PayloadIdentifier preparePayload( @@ -50,7 +54,10 @@ final Long timestamp, final Bytes32 prevRandao, final Address feeRecipient, final Optional<List<Withdrawal>> withdrawals, - final Optional<Bytes32> parentBeaconBlockRoot); + final Optional<Bytes32> parentBeaconBlockRoot, + final Optional<Boolean> noTxPool, + final Optional<List<Transaction>> transactions, + final Optional<Long> gasLimit);   @Override default boolean isCompatibleWithEngineApi() {
diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeBlockCreator.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeBlockCreator.java index dd8adae7e9b6f3fdc5873ef97a50c589f0e83b0c..bd974329d9af77d84b36f40585e5ab8cf0620d8d 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeBlockCreator.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeBlockCreator.java @@ -14,6 +14,7 @@ * SPDX-License-Identifier: Apache-2.0 */ package org.hyperledger.besu.consensus.merge.blockcreation;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.ProtocolContext; @@ -68,7 +69,8 @@ final ProtocolSchedule protocolSchedule, final Wei minTransactionGasPrice, final Address miningBeneficiary, final BlockHeader parentHeader, - final Optional<Address> depositContractAddress) { + final Optional<Address> depositContractAddress, + final Optional<GenesisConfigOptions> genesisConfigOptions) { super( miningBeneficiary, __ -> miningBeneficiary, @@ -80,7 +82,8 @@ protocolSchedule, minTransactionGasPrice, TRY_FILL_BLOCK, parentHeader, - depositContractAddress); + depositContractAddress, + genesisConfigOptions); }   /** @@ -98,7 +101,9 @@ final Optional<List<Transaction>> maybeTransactions, final Bytes32 random, final long timestamp, final Optional<List<Withdrawal>> withdrawals, - final Optional<Bytes32> parentBeaconBlockRoot) { + final Optional<Bytes32> parentBeaconBlockRoot, + final Optional<Boolean> noTxFromPool, + final Optional<Long> gasLimit) {   return createBlock( maybeTransactions, @@ -107,7 +112,9 @@ withdrawals, Optional.of(random), parentBeaconBlockRoot, timestamp, - false); + false, + noTxFromPool, + gasLimit); }   @Override
diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifier.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifier.java index ddd3c1b3e4e23e852751c038bab7f5b9a712afd6..f28ccad35ef0972191aa829bee0f4cc8a00ccd83 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifier.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifier.java @@ -17,17 +17,23 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Quantity; +import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.Withdrawal; +import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput;   import java.math.BigInteger; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Optional;   import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import com.google.common.primitives.Longs; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; +import org.bouncycastle.jcajce.provider.digest.SHA256; +import org.web3j.utils.Numeric;   /** The Payload identifier. */ public class PayloadIdentifier implements Quantity { @@ -41,7 +47,11 @@ * @param payloadId the payload id */ @JsonCreator public PayloadIdentifier(final String payloadId) { - this(Long.decode(payloadId)); + if (payloadId.startsWith("0x")) { + this.val = UInt64.fromHexString(payloadId); + } else { + this.val = UInt64.valueOf(Math.abs(Long.parseLong(payloadId))); + } }   /** @@ -54,6 +64,15 @@ this.val = UInt64.valueOf(Math.abs(payloadId)); }   /** + * Instantiates a new Payload identifier. + * + * @param payloadId the payload id + */ + public PayloadIdentifier(final BigInteger payloadId) { + this.val = UInt64.valueOf(payloadId); + } + + /** * Create payload identifier for payload params. This is a deterministic hash of all payload * parameters that aims to avoid collisions * @@ -63,6 +82,9 @@ * @param prevRandao the prev randao * @param feeRecipient the fee recipient * @param withdrawals the withdrawals * @param parentBeaconBlockRoot the parent beacon block root + * @param noTxPool the no tx pool + * @param transactions the transactions + * @param gasLimit the gas limit * @return the payload identifier */ public static PayloadIdentifier forPayloadParams( @@ -71,7 +93,37 @@ final Long timestamp, final Bytes32 prevRandao, final Address feeRecipient, final Optional<List<Withdrawal>> withdrawals, - final Optional<Bytes32> parentBeaconBlockRoot) { + final Optional<Bytes32> parentBeaconBlockRoot, + final Optional<Boolean> noTxPool, + final Optional<List<Transaction>> transactions, + final Optional<Long> gasLimit) { + // Optimism: gasLimit will exist + if (gasLimit.isPresent()) { + SHA256.Digest digest = new SHA256.Digest(); + digest.update(parentHash.toArrayUnsafe()); + digest.update(Longs.toByteArray(timestamp)); + digest.update(prevRandao.toArrayUnsafe()); + digest.update(feeRecipient.toArrayUnsafe()); + final BytesValueRLPOutput out = new BytesValueRLPOutput(); + if (withdrawals.isPresent()) { + out.writeList(withdrawals.get(), Withdrawal::writeTo); + } else { + out.writeEmptyList(); + } + digest.update(out.encoded().toArrayUnsafe()); + parentBeaconBlockRoot.ifPresent( + parentBeaconBlockRootBytes -> digest.update(parentBeaconBlockRootBytes.toArrayUnsafe())); + boolean noTxPoolFlag = noTxPool.orElse(false); + List<Transaction> txList = transactions.orElse(Collections.emptyList()); + if (noTxPoolFlag || !txList.isEmpty()) { + digest.update(new byte[] {(byte) (noTxPoolFlag ? 1 : 0)}); + digest.update(Longs.toByteArray(txList.size())); + txList.forEach(tx -> digest.update(tx.getHash().toArrayUnsafe())); + } + digest.update(Longs.toByteArray(gasLimit.get())); + + return new PayloadIdentifier(Numeric.toBigInt(digest.digest(), 0, 8)); + }   return new PayloadIdentifier( timestamp
diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java index 4044ac3d34bdc58d3ca53c6ee80ae143774c3b20..09d28138701e5894cf1381cf8fa4b63e7cc7c65f 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java @@ -148,9 +148,20 @@ final Long timestamp, final Bytes32 prevRandao, final Address feeRecipient, final Optional<List<Withdrawal>> withdrawals, - final Optional<Bytes32> parentBeaconBlockRoot) { + final Optional<Bytes32> parentBeaconBlockRoot, + final Optional<Boolean> noTxPool, + final Optional<List<Transaction>> transactions, + final Optional<Long> gasLimit) { return mergeCoordinator.preparePayload( - parentHeader, timestamp, prevRandao, feeRecipient, withdrawals, parentBeaconBlockRoot); + parentHeader, + timestamp, + prevRandao, + feeRecipient, + withdrawals, + parentBeaconBlockRoot, + noTxPool, + transactions, + gasLimit); }   @Override
diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeContext.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeContext.java index 9db6a97a0ca75aed9bad68a610ee2f6f6cefe804..a2a07ecc7827518d65d57588dce3792ba7ef681b 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeContext.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeContext.java @@ -198,4 +198,18 @@ * * @return the boolean */ boolean isPostMergeAtGenesis(); + + /** + * Is configured for optimism. + * + * @return the boolean + */ + boolean isOptimism(); + + /** + * Sets is configured for optimism. + * + * @param isOptimism the boolean + */ + default void setOptimism(final boolean isOptimism) {} }
diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java index 08985ed326b9b46df7fe756895b09a1387746e7a..113bb3afc170b73627fca5636718d1237f8f6758 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java @@ -77,6 +77,8 @@ // TODO: cleanup - isChainPruningEnabled will not be required after // https://github.com/hyperledger/besu/pull/4703 is merged. private boolean isChainPruningEnabled = false;   + private boolean isOptimism; + /** Instantiates a new Post merge context. */ @VisibleForTesting PostMergeContext() { @@ -333,6 +335,16 @@ @Override public boolean isPostMergeAtGenesis() { return this.isPostMergeAtGenesis; + } + + @Override + public void setOptimism(final boolean isOptimism) { + this.isOptimism = isOptimism; + } + + @Override + public boolean isOptimism() { + return this.isOptimism; }   /**
diff --git hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionContext.java optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionContext.java index 35e51db563e6828b3f498d4885c3bd0d4d528cd7..8a58e267d63ff22e622b81edb7b26f3e1ac4f0b4 100644 --- hyperledger/besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionContext.java +++ optimism-java/op-besu/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionContext.java @@ -158,4 +158,14 @@ @Override public boolean isPostMergeAtGenesis() { return postMergeContext.isPostMergeAtGenesis(); } + + @Override + public boolean isOptimism() { + return postMergeContext.isOptimism(); + } + + @Override + public void setOptimism(final boolean isOptimism) { + postMergeContext.setOptimism(isOptimism); + } }
diff --git hyperledger/besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPool.java optimism-java/op-besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPool.java index c41027deb1b52e51298b97c4eba8aa0f05294fbb..53e015166f00c3ce70595ca5983eea2f409953d9 100644 --- hyperledger/besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPool.java +++ optimism-java/op-besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPool.java @@ -435,6 +435,7 @@ final ValidationResult<TransactionInvalidReason> basicValidationResult = getTransactionValidator() .validate( transaction, + 1, chainHeadBlockHeader.getBaseFee(), TransactionValidationParams.transactionPool()); if (!basicValidationResult.isValid()) {
diff --git hyperledger/besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java optimism-java/op-besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java index 3fa80f1dd0ae2d38f069df2c5aa776024581a3bb..116e836b85b2b7c8c2abffc643f347d41647dd54 100644 --- hyperledger/besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java +++ optimism-java/op-besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.blockcreation;   import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator.calculateExcessBlobGasForParent;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.BlobGas; import org.hyperledger.besu.datatypes.Hash; @@ -37,9 +38,11 @@ import org.hyperledger.besu.ethereum.core.SealableBlockHeader; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.Withdrawal; import org.hyperledger.besu.ethereum.core.encoding.DepositDecoder; +import org.hyperledger.besu.ethereum.eth.transactions.PendingTransaction; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.mainnet.AbstractBlockProcessor; import org.hyperledger.besu.ethereum.mainnet.BodyValidation; +import org.hyperledger.besu.ethereum.mainnet.Create2DeployerFunction; import org.hyperledger.besu.ethereum.mainnet.DepositsValidator; import org.hyperledger.besu.ethereum.mainnet.DifficultyCalculator; import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor; @@ -57,8 +60,10 @@ import org.hyperledger.besu.plugin.services.exception.StorageException; import org.hyperledger.besu.plugin.services.securitymodule.SecurityModuleException;   import java.math.BigInteger; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.OptionalLong; import java.util.concurrent.CancellationException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; @@ -92,6 +97,7 @@ private final Wei minTransactionGasPrice; private final Double minBlockOccupancyRatio; protected final BlockHeader parentHeader; private final Optional<Address> depositContractAddress; + private final Optional<GenesisConfigOptions> genesisConfigOptions;   private final AtomicBoolean isCancelled = new AtomicBoolean(false);   @@ -107,6 +113,34 @@ final Wei minTransactionGasPrice, final Double minBlockOccupancyRatio, final BlockHeader parentHeader, final Optional<Address> depositContractAddress) { + this( + coinbase, + miningBeneficiaryCalculator, + targetGasLimitSupplier, + extraDataCalculator, + transactionPool, + protocolContext, + protocolSchedule, + minTransactionGasPrice, + minBlockOccupancyRatio, + parentHeader, + depositContractAddress, + Optional.empty()); + } + + protected AbstractBlockCreator( + final Address coinbase, + final MiningBeneficiaryCalculator miningBeneficiaryCalculator, + final Supplier<Optional<Long>> targetGasLimitSupplier, + final ExtraDataCalculator extraDataCalculator, + final TransactionPool transactionPool, + final ProtocolContext protocolContext, + final ProtocolSchedule protocolSchedule, + final Wei minTransactionGasPrice, + final Double minBlockOccupancyRatio, + final BlockHeader parentHeader, + final Optional<Address> depositContractAddress, + final Optional<GenesisConfigOptions> genesisConfigOptions) { this.coinbase = coinbase; this.miningBeneficiaryCalculator = miningBeneficiaryCalculator; this.targetGasLimitSupplier = targetGasLimitSupplier; @@ -119,6 +153,7 @@ this.minBlockOccupancyRatio = minBlockOccupancyRatio; this.parentHeader = parentHeader; this.depositContractAddress = depositContractAddress; blockHeaderFunctions = ScheduleBasedBlockHeaderFunctions.create(protocolSchedule); + this.genesisConfigOptions = genesisConfigOptions; }   /** @@ -161,7 +196,9 @@ Optional.empty(), Optional.empty(), Optional.empty(), timestamp, - true); + true, + Optional.empty(), + Optional.empty()); }   protected BlockCreationResult createBlock( @@ -171,7 +208,9 @@ final Optional<List<Withdrawal>> maybeWithdrawals, final Optional<Bytes32> maybePrevRandao, final Optional<Bytes32> maybeParentBeaconBlockRoot, final long timestamp, - boolean rewardCoinbase) { + boolean rewardCoinbase, + final Optional<Boolean> noTxFromPool, + final Optional<Long> gasLimit) {   try (final MutableWorldState disposableWorldState = duplicateWorldStateAtParent()) { final ProtocolSpec newProtocolSpec = @@ -179,7 +218,7 @@ protocolSchedule.getForNextBlockHeader(parentHeader, timestamp);   final ProcessableBlockHeader processableBlockHeader = createPendingBlockHeader( - timestamp, maybePrevRandao, maybeParentBeaconBlockRoot, newProtocolSpec); + timestamp, maybePrevRandao, maybeParentBeaconBlockRoot, gasLimit, newProtocolSpec); final Address miningBeneficiary = miningBeneficiaryCalculator.getMiningBeneficiary(processableBlockHeader.getNumber()); Wei blobGasPrice = @@ -204,7 +243,8 @@ disposableWorldState, maybeTransactions, miningBeneficiary, blobGasPrice, - newProtocolSpec); + newProtocolSpec, + noTxFromPool);   transactionResults.logSelectionStats();   @@ -332,7 +372,8 @@ final MutableWorldState disposableWorldState, final Optional<List<Transaction>> transactions, final Address miningBeneficiary, final Wei blobGasPrice, - final ProtocolSpec protocolSpec) + final ProtocolSpec protocolSpec, + final Optional<Boolean> noTxFromPool) throws RuntimeException { final MainnetTransactionProcessor transactionProcessor = protocolSpec.getTransactionProcessor();   @@ -355,11 +396,40 @@ blobGasPrice, protocolSpec.getFeeMarket(), protocolSpec.getGasCalculator(), protocolSpec.getGasLimitCalculator(), - protocolContext.getTransactionSelectorFactory()); + protocolContext.getTransactionSelectorFactory(), + genesisConfigOptions); + + Create2DeployerFunction.ensureCreate2Deployer( + genesisConfigOptions, + processableBlockHeader.getTimestamp(), + disposableWorldState.updater());   - if (transactions.isPresent()) { - return selector.evaluateTransactions(transactions.get()); + if (noTxFromPool.isEmpty()) { + if (transactions.isPresent()) { + return selector.evaluateTransactions(transactions.get()); + } else { + return selector.buildTransactionListForBlock(); + } } else { + if (transactions.isPresent()) { + List<PendingTransaction> pendingTransactions = + transactions.get().stream() + .map( + transaction -> { + PendingTransaction pendingTransaction = + new PendingTransaction.Local.Priority(transaction); + pendingTransaction.setMustSelect(true); + return pendingTransaction; + }) + .toList(); + + selector.evaluatePendingTransactions(pendingTransactions); + } + + if (noTxFromPool.get()) { + return selector.evaluateTransactions(Collections.emptyList()); + } + return selector.buildTransactionListForBlock(); } } @@ -388,15 +458,17 @@ private ProcessableBlockHeader createPendingBlockHeader( final long timestamp, final Optional<Bytes32> maybePrevRandao, final Optional<Bytes32> maybeParentBeaconBlockRoot, + final Optional<Long> gasLimitParam, final ProtocolSpec protocolSpec) { final long newBlockNumber = parentHeader.getNumber() + 1; long gasLimit = - protocolSpec - .getGasLimitCalculator() - .nextGasLimit( - parentHeader.getGasLimit(), - targetGasLimitSupplier.get().orElse(parentHeader.getGasLimit()), - newBlockNumber); + gasLimitParam.orElse( + protocolSpec + .getGasLimitCalculator() + .nextGasLimit( + parentHeader.getGasLimit(), + targetGasLimitSupplier.get().orElse(parentHeader.getGasLimit()), + newBlockNumber));   final DifficultyCalculator difficultyCalculator = protocolSpec.getDifficultyCalculator(); final BigInteger difficulty = @@ -412,7 +484,8 @@ feeMarket.computeBaseFee( newBlockNumber, parentHeader.getBaseFee().orElse(Wei.ZERO), parentHeader.getGasUsed(), - feeMarket.targetGasUsed(parentHeader))) + feeMarket.targetGasUsed(parentHeader), + OptionalLong.of(timestamp))) .orElse(null);   final Bytes32 prevRandao = maybePrevRandao.orElse(null); @@ -498,6 +571,7 @@ final SealableBlockHeader sealableBlockHeader);   @FunctionalInterface protected interface MiningBeneficiaryCalculator { + Address getMiningBeneficiary(long blockNumber); } }
diff --git hyperledger/besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java optimism-java/op-besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java index 03c6ef289512fc7b1a7680e654b336f1c22c56ab..d0a0c4277fc8024e15a4c5f8781ecfd78d34d5a4 100644 --- hyperledger/besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java +++ optimism-java/op-besu/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java @@ -14,7 +14,9 @@ * SPDX-License-Identifier: Apache-2.0 */ package org.hyperledger.besu.ethereum.blockcreation.txselection;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.GasLimitCalculator; import org.hyperledger.besu.ethereum.blockcreation.txselection.selectors.AbstractTransactionSelector; @@ -37,6 +39,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.vm.BlockHashLookup; import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; +import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.gascalculator.GasCalculator; import org.hyperledger.besu.evm.tracing.OperationTracer; import org.hyperledger.besu.evm.worldstate.WorldUpdater; @@ -70,10 +73,11 @@ * <li>The amount of gas consumed when executing all transactions. * <li>A list of transactions evaluated but not included in the block being constructed. * </ul> * - * Once "used" this class must be discarded and another created. This class contains state which is - * not cleared between executions of buildTransactionListForBlock(). + * <p>Once "used" this class must be discarded and another created. This class contains state which + * is not cleared between executions of buildTransactionListForBlock(). */ public class BlockTransactionSelector { + private static final Logger LOG = LoggerFactory.getLogger(BlockTransactionSelector.class);   private final Supplier<Boolean> isCancelled; @@ -87,6 +91,7 @@ new TransactionSelectionResults(); private final List<AbstractTransactionSelector> transactionSelectors; private final PluginTransactionSelector pluginTransactionSelector; private final OperationTracer pluginOperationTracer; + private final Optional<GenesisConfigOptions> genesisConfigOptions;   public BlockTransactionSelector( final MainnetTransactionProcessor transactionProcessor, @@ -103,7 +108,8 @@ final Wei blobGasPrice, final FeeMarket feeMarket, final GasCalculator gasCalculator, final GasLimitCalculator gasLimitCalculator, - final Optional<PluginTransactionSelectorFactory> transactionSelectorFactory) { + final Optional<PluginTransactionSelectorFactory> transactionSelectorFactory, + final Optional<GenesisConfigOptions> genesisConfigOptions) { this.transactionProcessor = transactionProcessor; this.blockchain = blockchain; this.worldState = worldState; @@ -126,6 +132,7 @@ transactionSelectorFactory .map(PluginTransactionSelectorFactory::create) .orElse(AllAcceptingTransactionSelector.INSTANCE); pluginOperationTracer = pluginTransactionSelector.getOperationTracer(); + this.genesisConfigOptions = genesisConfigOptions; }   private List<AbstractTransactionSelector> createTransactionSelectors( @@ -175,6 +182,21 @@ return transactionSelectionResults; }   /** + * Evaluates a list of pending transactions and updates the selection results accordingly. If a + * transaction is not selected during the evaluation, it is updated as not selected in the + * transaction selection results. + * + * @param transactions The list of pending transactions to be evaluated. + * @return The {@code TransactionSelectionResults} containing the results of the transaction + * evaluations. + */ + public TransactionSelectionResults evaluatePendingTransactions( + final List<PendingTransaction> transactions) { + transactions.forEach(this::evaluateTransaction); + return transactionSelectionResults; + } + + /** * Passed into the PendingTransactions, and is called on each transaction until sufficient * transactions are found which fill a block worth of gas. This function will continue to be * called until the block under construction is suitably full (in terms of gasLimit) and the @@ -194,6 +216,8 @@ return handleTransactionNotSelected(pendingTransaction, selectionResult); }   final WorldUpdater worldStateUpdater = worldState.updater(); + Account sender = worldStateUpdater.getOrCreate(pendingTransaction.getTransaction().getSender()); + final long nonce = sender.getNonce(); final TransactionProcessingResult processingResult = processTransaction(pendingTransaction, worldStateUpdater);   @@ -203,7 +227,8 @@ if (!postProcessingSelectionResult.selected()) { return handleTransactionNotSelected(pendingTransaction, postProcessingSelectionResult); }   - return handleTransactionSelected(pendingTransaction, processingResult, worldStateUpdater); + return handleTransactionSelected( + nonce, pendingTransaction, processingResult, worldStateUpdater); }   /** @@ -217,6 +242,9 @@ * @return The result of the transaction selection process. */ private TransactionSelectionResult evaluatePreProcessing( final PendingTransaction pendingTransaction) { + if (pendingTransaction.isMustSelect()) { + return TransactionSelectionResult.SELECTED; + }   for (var selector : transactionSelectors) { TransactionSelectionResult result = @@ -290,6 +318,7 @@ * @param worldStateUpdater The world state updater. * @return The result of the transaction selection process. */ private TransactionSelectionResult handleTransactionSelected( + final long nonce, final PendingTransaction pendingTransaction, final TransactionProcessingResult processingResult, final WorldUpdater worldStateUpdater) { @@ -303,9 +332,32 @@ transactionSelectionResults.getCumulativeGasUsed() + gasUsedByTransaction; final long blobGasUsed = blockSelectionContext.gasCalculator().blobGasCost(transaction.getBlobCount());   - final TransactionReceipt receipt = - transactionReceiptFactory.create( - transaction.getType(), processingResult, worldState, cumulativeGasUsed); + TransactionReceipt receipt; + if (!TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) { + receipt = + transactionReceiptFactory.create( + transaction.getType(), processingResult, worldState, cumulativeGasUsed); + } else { + GenesisConfigOptions options = genesisConfigOptions.orElseThrow(); + Optional<Long> depositNonce = + options.isRegolith(blockSelectionContext.processableBlockHeader().getTimestamp()) + ? Optional.of(nonce) + : Optional.empty(); + + Optional<Long> canyonDepositReceiptVer = + options.isCanyon(blockSelectionContext.processableBlockHeader().getTimestamp()) + ? Optional.of(1L) + : Optional.empty(); + receipt = + new TransactionReceipt( + transaction.getType(), + processingResult.isSuccessful() ? 1 : 0, + cumulativeGasUsed, + processingResult.getLogs(), + Optional.empty(), + depositNonce, + canyonDepositReceiptVer); + }   logTransactionSelection(pendingTransaction.getTransaction());
diff --git hyperledger/besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java optimism-java/op-besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java index dbc461ecc38f75062f61a086770774b3e008de48..7dae81ed83dab5dac8a589e40cc12abefda5031e 100644 --- hyperledger/besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java +++ optimism-java/op-besu/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java @@ -46,12 +46,20 @@ static final int KZG_COMMITMENT_OR_PROOF_SIZE = 112; static final int BLOB_SIZE = 131136; static final int BLOBS_WITH_COMMITMENTS_SIZE = 32; static final int PENDING_TRANSACTION_MEMORY_SIZE = 40; + + static final int SOURCE_HASH_SIZE = 32; + + static final int IS_SYSTEM_TX_SIZE = 1; + + static final int MINT_SIZE = 32; private static final AtomicLong TRANSACTIONS_ADDED = new AtomicLong(); private final Transaction transaction; private final long addedAt; private final long sequence; // Allows prioritization based on order transactions are added   private int memorySize = NOT_INITIALIZED; + + private boolean mustSelect = false;   private PendingTransaction( final Transaction transaction, final long addedAt, final long sequence) { @@ -116,6 +124,14 @@ public long getAddedAt() { return addedAt; }   + public boolean isMustSelect() { + return mustSelect; + } + + public void setMustSelect(final boolean mustSelect) { + this.mustSelect = mustSelect; + } + public int memorySize() { if (memorySize == NOT_INITIALIZED) { memorySize = computeMemorySize(); @@ -131,6 +147,7 @@ case FRONTIER -> computeFrontierMemorySize(); case ACCESS_LIST -> computeAccessListMemorySize(); case EIP1559 -> computeEIP1559MemorySize(); case BLOB -> computeBlobMemorySize(); + case OPTIMISM_DEPOSIT -> computeOptimismDepositMemorySize(); } + PENDING_TRANSACTION_MEMORY_SIZE; } @@ -208,6 +225,16 @@ * ACCESS_LIST_STORAGE_KEY_MEMORY_SIZE; return totalSize; }) .orElse(0); + } + + // TODO: correct memory size for OptimismDeposit transactions + private int computeOptimismDepositMemorySize() { + return FRONTIER_AND_ACCESS_LIST_BASE_MEMORY_SIZE + + computePayloadMemorySize() + + computeToMemorySize() + + SOURCE_HASH_SIZE + + IS_SYSTEM_TX_SIZE + + MINT_SIZE; }   public static List<Transaction> toTransactionList(

The block validation and transaction validation modifications.

diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/BaseFeeMarketBlockHeaderGasPriceValidationRule.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/BaseFeeMarketBlockHeaderGasPriceValidationRule.java index 4a9728683894ca95bbb4559e5437039f6a101bdc..c7ab92f0a208777c7ceffb8c7b236efacd094a61 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/BaseFeeMarketBlockHeaderGasPriceValidationRule.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/BaseFeeMarketBlockHeaderGasPriceValidationRule.java @@ -22,6 +22,8 @@ import org.hyperledger.besu.ethereum.core.feemarket.FeeMarketException; import org.hyperledger.besu.ethereum.mainnet.DetachedBlockHeaderValidationRule; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket;   +import java.util.OptionalLong; + import org.slf4j.Logger; import org.slf4j.LoggerFactory;   @@ -59,7 +61,11 @@ final long targetGasUsed = baseFeeMarket.targetGasUsed(parent); final Wei expectedBaseFee = baseFeeMarket.computeBaseFee( - header.getNumber(), parentBaseFee, parent.getGasUsed(), targetGasUsed); + header.getNumber(), + parentBaseFee, + parent.getGasUsed(), + targetGasUsed, + OptionalLong.of(header.getTimestamp())); if (!expectedBaseFee.equals(currentBaseFee)) { LOG.info( "Invalid block header: basefee {} does not equal expected basefee {}",
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BaseFeeBlockBodyValidator.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BaseFeeBlockBodyValidator.java index 62629dde6653910201777e0db2f11f00d5db9fa1..19a0ce37184acba54371bd9ac1cc5bc01ccf6013 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BaseFeeBlockBodyValidator.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BaseFeeBlockBodyValidator.java @@ -14,6 +14,7 @@ * SPDX-License-Identifier: Apache-2.0 */ package org.hyperledger.besu.ethereum.mainnet;   +import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.core.Block; @@ -59,6 +60,9 @@ .getFeeMarket() .getTransactionPriceCalculator();   for (final Transaction transaction : transactions) { + if (transaction.getType().equals(TransactionType.OPTIMISM_DEPOSIT)) { + continue; + } final Optional<Wei> baseFee = block.getHeader().getBaseFee(); final Wei price = transactionPriceCalculator.price(transaction, baseFee); if (price.compareTo(baseFee.orElseThrow()) < 0) {
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java index f806c8d4cd158061a66e63ae36061201999ae29c..9663f1f9a5bbefba3a8e1a183fb52841f325faec 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java @@ -119,7 +119,6 @@ trie.put( indexKey(i), RLP.encode( rlpOutput -> receipts.get(i).writeToForReceiptTrie(rlpOutput, false)))); - return Hash.wrap(trie.getRootHash()); }
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java index 339e4c1d9c3f74bdf17ea44b35d0e99e2f2e1938..1fb9abf225a3e2c707a571a64c4e02dd15fe871d 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.mainnet;   import static org.hyperledger.besu.evm.account.Account.MAX_NONCE;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.crypto.SECPSignature; import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; import org.hyperledger.besu.datatypes.Blob; @@ -62,6 +63,8 @@ private final Set<TransactionType> acceptedTransactionTypes;   private final int maxInitcodeSize;   + private final Optional<GenesisConfigOptions> genesisOptions; + public MainnetTransactionValidator( final GasCalculator gasCalculator, final GasLimitCalculator gasLimitCalculator, @@ -77,17 +80,40 @@ this.disallowSignatureMalleability = checkSignatureMalleability; this.chainId = chainId; this.acceptedTransactionTypes = acceptedTransactionTypes; this.maxInitcodeSize = maxInitcodeSize; + this.genesisOptions = Optional.empty(); + } + + public MainnetTransactionValidator( + final GasCalculator gasCalculator, + final GasLimitCalculator gasLimitCalculator, + final FeeMarket feeMarket, + final boolean checkSignatureMalleability, + final Optional<BigInteger> chainId, + final Set<TransactionType> acceptedTransactionTypes, + final int maxInitcodeSize, + final Optional<GenesisConfigOptions> genesisOptions) { + this.gasCalculator = gasCalculator; + this.gasLimitCalculator = gasLimitCalculator; + this.feeMarket = feeMarket; + this.disallowSignatureMalleability = checkSignatureMalleability; + this.chainId = chainId; + this.acceptedTransactionTypes = acceptedTransactionTypes; + this.maxInitcodeSize = maxInitcodeSize; + this.genesisOptions = genesisOptions; }   @Override public ValidationResult<TransactionInvalidReason> validate( final Transaction transaction, + final long blockTimestamp, final Optional<Wei> baseFee, final TransactionValidationParams transactionValidationParams) { - final ValidationResult<TransactionInvalidReason> signatureResult = - validateTransactionSignature(transaction); - if (!signatureResult.isValid()) { - return signatureResult; + if (transaction.getType() != TransactionType.OPTIMISM_DEPOSIT) { + final ValidationResult<TransactionInvalidReason> signatureResult = + validateTransactionSignature(transaction); + if (!signatureResult.isValid()) { + return signatureResult; + } }   if (transaction.getType().supportsBlob()) { @@ -113,6 +139,20 @@ TransactionInvalidReason.INVALID_TRANSACTION_FORMAT, String.format( "Transaction type %s is invalid, accepted transaction types are %s", transactionType, acceptedTransactionTypes)); + } + + if (transaction.getType().equals(TransactionType.OPTIMISM_DEPOSIT)) { + // genesisOptions.orElseThrow(); + if (transaction.getIsSystemTx().orElse(false)) { + var regolithTime = genesisOptions.get().getRegolithTime(); + if (genesisOptions.get().isOptimism() && regolithTime.orElseThrow() <= blockTimestamp) { + return ValidationResult.invalid( + TransactionInvalidReason.SYSTEM_TX_NOT_SUPPORT, + String.format( + "system tx not supported: address = %s", transaction.getSender().toHexString())); + } + } + return ValidationResult.valid(); }   if (transaction.getNonce() == MAX_NONCE) { @@ -190,6 +230,9 @@ public ValidationResult<TransactionInvalidReason> validateForSender( final Transaction transaction, final Account sender, final TransactionValidationParams validationParams) { + if (TransactionType.OPTIMISM_DEPOSIT.equals(transaction.getType())) { + return ValidationResult.valid(); + } Wei senderBalance = Account.DEFAULT_BALANCE; long senderNonce = Account.DEFAULT_NONCE; Hash codeHash = Hash.EMPTY; @@ -199,6 +242,8 @@ senderBalance = sender.getBalance(); senderNonce = sender.getNonce(); if (sender.getCodeHash() != null) codeHash = sender.getCodeHash(); } + + // todo calculate gas cost with l1 gas cost   final Wei upfrontCost = transaction.getUpfrontCost(gasCalculator.blobGasCost(transaction.getBlobCount()));
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/PermissionTransactionValidator.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/PermissionTransactionValidator.java index 5325567d0f94e64f6810d82e848a7e52004cff38..e847c1ccb502bfc6536324655f76511c3aefe76a 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/PermissionTransactionValidator.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/PermissionTransactionValidator.java @@ -42,9 +42,10 @@ @Override public ValidationResult<TransactionInvalidReason> validate( final Transaction transaction, + final long blockTimestamp, final Optional<Wei> baseFee, final TransactionValidationParams transactionValidationParams) { - return delegate.validate(transaction, baseFee, transactionValidationParams); + return delegate.validate(transaction, blockTimestamp, baseFee, transactionValidationParams); }   @Override
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidator.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidator.java index a70de0bcd7f41388dcea313fc139eeb78874aa88..16ad0b25d1c93233aadb78cf4d8c7ff3c81c159c 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidator.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidator.java @@ -34,6 +34,7 @@ * present */ ValidationResult<TransactionInvalidReason> validate( Transaction transaction, + final long blockTimestamp, Optional<Wei> baseFee, TransactionValidationParams transactionValidationParams);
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidatorFactory.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidatorFactory.java index e89ca469a8abb69a0666a0bfa71f299ff0fe04e7..d539dce8fded552f82ecb750d60a610bbf3a8392 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidatorFactory.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidatorFactory.java @@ -14,6 +14,7 @@ * SPDX-License-Identifier: Apache-2.0 */ package org.hyperledger.besu.ethereum.mainnet;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.ethereum.GasLimitCalculator; import org.hyperledger.besu.ethereum.core.PermissionTransactionFilter; @@ -80,6 +81,30 @@ checkSignatureMalleability, chainId, acceptedTransactionTypes, maxInitcodeSize)); + } + + public TransactionValidatorFactory( + final GasCalculator gasCalculator, + final GasLimitCalculator gasLimitCalculator, + final FeeMarket feeMarket, + final boolean checkSignatureMalleability, + final Optional<BigInteger> chainId, + final Set<TransactionType> acceptedTransactionTypes, + final int maxInitcodeSize, + final GenesisConfigOptions genesisOptions) { + + this.transactionValidatorSupplier = + Suppliers.memoize( + () -> + new MainnetTransactionValidator( + gasCalculator, + gasLimitCalculator, + feeMarket, + checkSignatureMalleability, + chainId, + acceptedTransactionTypes, + maxInitcodeSize, + Optional.of(genesisOptions))); }   public void setPermissionTransactionFilter(
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionInvalidReason.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionInvalidReason.java index 6b9db98dea2cd22a7e301e37e63b6982ef40edec..ad1c85ff297fe632902401777d439ed7ae284720 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionInvalidReason.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionInvalidReason.java @@ -49,6 +49,7 @@ INTERNAL_ERROR, TX_POOL_DISABLED, INVALID_BLOBS, PLUGIN_TX_VALIDATOR, + SYSTEM_TX_NOT_SUPPORT, // Private Transaction Invalid Reasons PRIVATE_TRANSACTION_INVALID, PRIVATE_TRANSACTION_FAILED,

The Engine API is extended to insert transactions into the block and optionally exclude the tx-pool, to reproduce the exact block of the sequencer from just the inputs, as derived from L1 by the rollup-node. See L2 execution engine specs.

diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java index b5c38c1e6828dca891ace9f5eaeda89fa1c68391..bddca4af23a03f155edcee7c13bd3dae18189792 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java @@ -37,6 +37,8 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineUpdateForkchoiceResult; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.Withdrawal; +import org.hyperledger.besu.ethereum.core.encoding.EncodingContext; +import org.hyperledger.besu.ethereum.core.encoding.TransactionDecoder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ScheduledProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.ValidationResult; @@ -46,6 +48,7 @@ import java.util.Optional; import java.util.function.BiConsumer;   import io.vertx.core.Vertx; +import org.apache.tuweni.bytes.Bytes; import org.slf4j.Logger; import org.slf4j.LoggerFactory;   @@ -71,6 +74,15 @@ protected ValidationResult<RpcErrorType> validateParameter( final EngineForkchoiceUpdatedParameter forkchoiceUpdatedParameter, final Optional<EnginePayloadAttributesParameter> maybePayloadAttributes) { + // According to the spec + // https://github.com/ethereum-optimism/optimism/blob/develop/specs/exec-engine.md#extended-payloadattributesv2, + // gasLimit is needed when the engine is running in optimism mode. + if (mergeContext.get().isOptimism() && maybePayloadAttributes.isPresent()) { + if (null == maybePayloadAttributes.get().getGasLimit()) { + logForkchoiceUpdatedCall(INVALID, forkchoiceUpdatedParameter); + return ValidationResult.invalid(RpcErrorType.INVALID_PARAMS); + } + } return ValidationResult.valid(); }   @@ -207,7 +219,19 @@ payloadAttributes.getTimestamp(), payloadAttributes.getPrevRandao(), payloadAttributes.getSuggestedFeeRecipient(), finalWithdrawals, - Optional.ofNullable(payloadAttributes.getParentBeaconBlockRoot()))); + Optional.ofNullable(payloadAttributes.getParentBeaconBlockRoot()), + Optional.ofNullable(payloadAttributes.isNoTxPool()), + Optional.ofNullable( + payloadAttributes.getTransactions() == null + ? null + : payloadAttributes.getTransactions().stream() + .map(Bytes::fromHexString) + .map( + in -> + TransactionDecoder.decodeOpaqueBytes( + in, EncodingContext.BLOCK_BODY)) + .collect(toList())), + Optional.ofNullable(payloadAttributes.getGasLimit())));   payloadId.ifPresent( pid ->
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EnginePreparePayloadDebug.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EnginePreparePayloadDebug.java index 7f18250ec277a9d06fcd855c13b512d2116ace29..50f1499fc36d74e96c0e3e1b3698916307fb5956 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EnginePreparePayloadDebug.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EnginePreparePayloadDebug.java @@ -31,6 +31,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EnginePreparePayloadResult; +import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.Withdrawal;   import java.util.List; @@ -38,6 +39,7 @@ import java.util.Optional;   import graphql.VisibleForTesting; import io.vertx.core.Vertx; +import org.apache.tuweni.bytes.Bytes;   public class EnginePreparePayloadDebug extends ExecutionEngineJsonRpcMethod { private final MergeMiningCoordinator mergeCoordinator; @@ -63,11 +65,14 @@ requestContext .getOptionalParameter(0, EnginePreparePayloadParameter.class) .orElse( new EnginePreparePayloadParameter( + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), Optional.empty()));   final var requestId = requestContext.getRequest().getId(); @@ -89,6 +94,10 @@ Optional<PayloadIdentifier> generatePayload(final EnginePreparePayloadParameter param) { final List<Withdrawal> withdrawals = param.getWithdrawals().stream().map(WithdrawalParameter::toWithdrawal).collect(toList());   + final List<Transaction> transactions = + param.getTransactions().stream() + .map(s -> Transaction.readFrom(Bytes.fromHexString(s))) + .collect(toList()); return param .getParentHash() .map(header -> protocolContext.getBlockchain().getBlockHeader(header)) @@ -101,6 +110,9 @@ param.getTimestamp().orElse(parentHeader.getTimestamp() + 1L), param.getPrevRandao(), param.getFeeRecipient(), Optional.of(withdrawals), - param.getParentBeaconBlockRoot())); + param.getParentBeaconBlockRoot(), + param.isNoTxPool(), + Optional.of(transactions), + param.getGasLimit())); } }
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2.java index b6406a3e6624f85416bce27d5067406492de2af6..2961176ac980f9106ee41173a9ee2805ec987db5 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2.java @@ -51,6 +51,10 @@ @Override protected Optional<JsonRpcErrorResponse> isPayloadAttributesValid( final Object requestId, final EnginePayloadAttributesParameter payloadAttributes) { + if (this.mergeContext.get().isOptimism()) { + return Optional.empty(); + } + if (payloadAttributes.getTimestamp() >= cancunTimestamp) { if (payloadAttributes.getParentBeaconBlockRoot() == null || payloadAttributes.getParentBeaconBlockRoot().isEmpty()) {
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV3.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV3.java index c070d220854ce57323a39b7372c92580c70d2cb2..76f4c89e38472a7939d41fa151af57176d3bf3ae 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV3.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV3.java @@ -62,7 +62,7 @@ return ValidationResult.invalid(RpcErrorType.INVALID_PARAMS, "Missing safe block hash"); } else if (fcuParameter.getFinalizedBlockHash() == null) { return ValidationResult.invalid(RpcErrorType.INVALID_PARAMS, "Missing finalized block hash"); } - if (maybePayloadAttributes.isPresent()) { + if (maybePayloadAttributes.isPresent() && (!this.mergeContext.get().isOptimism())) { if (maybePayloadAttributes.get().getParentBeaconBlockRoot() == null) { return ValidationResult.invalid( RpcErrorType.INVALID_PARAMS, "Missing parent beacon block root hash"); @@ -73,6 +73,10 @@ }   @Override protected ValidationResult<RpcErrorType> validateForkSupported(final long blockTimestamp) { + if (this.mergeContext.get().isOptimism()) { + return ValidationResult.valid(); + } + if (protocolSchedule.isPresent()) { if (cancun.isPresent() && blockTimestamp >= cancun.get().milestone()) { return ValidationResult.valid(); @@ -90,6 +94,10 @@ @Override protected Optional<JsonRpcErrorResponse> isPayloadAttributesValid( final Object requestId, final EnginePayloadAttributesParameter payloadAttributes) { + if (this.mergeContext.get().isOptimism()) { + return Optional.empty(); + } + if (payloadAttributes.getParentBeaconBlockRoot() == null) { LOG.error( "Parent beacon block root hash not present in payload attributes after cancun hardfork");
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameter.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameter.java index 655047573a0d7e6d0e3aaf78dda348b1d3fcc91a..17bcd0aca7cb9f8fd2dae5a8c2a0cbf45e98350e 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameter.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameter.java @@ -32,19 +32,30 @@ final Address suggestedFeeRecipient; final List<WithdrawalParameter> withdrawals; private final Bytes32 parentBeaconBlockRoot;   + // optimism payload attributes + private final Boolean noTxPool; + private final List<String> transactions; + private final Long gasLimit; + @JsonCreator public EnginePayloadAttributesParameter( @JsonProperty("timestamp") final String timestamp, @JsonProperty("prevRandao") final String prevRandao, @JsonProperty("suggestedFeeRecipient") final String suggestedFeeRecipient, @JsonProperty("withdrawals") final List<WithdrawalParameter> withdrawals, - @JsonProperty("parentBeaconBlockRoot") final String parentBeaconBlockRoot) { + @JsonProperty("parentBeaconBlockRoot") final String parentBeaconBlockRoot, + @JsonProperty("noTxPool") final Boolean noTxPool, + @JsonProperty("transactions") final List<String> transactions, + @JsonProperty("gasLimit") final UnsignedLongParameter gasLimit) { this.timestamp = Long.decode(timestamp); this.prevRandao = Bytes32.fromHexString(prevRandao); this.suggestedFeeRecipient = Address.fromHexString(suggestedFeeRecipient); this.withdrawals = withdrawals; this.parentBeaconBlockRoot = parentBeaconBlockRoot == null ? null : Bytes32.fromHexString(parentBeaconBlockRoot); + this.noTxPool = noTxPool; + this.transactions = transactions; + this.gasLimit = gasLimit.getValue(); }   public Long getTimestamp() { @@ -67,6 +78,18 @@ public List<WithdrawalParameter> getWithdrawals() { return withdrawals; }   + public Boolean isNoTxPool() { + return noTxPool; + } + + public List<String> getTransactions() { + return transactions; + } + + public Long getGasLimit() { + return gasLimit; + } + public String serialize() { final JsonObject json = new JsonObject() @@ -80,6 +103,15 @@ withdrawals.stream().map(WithdrawalParameter::asJsonObject).collect(Collectors.toList())); } if (parentBeaconBlockRoot != null) { json.put("parentBeaconBlockRoot", parentBeaconBlockRoot.toHexString()); + } + if (noTxPool != null) { + json.put("noTxPool", noTxPool); + } + if (transactions != null) { + json.put("transactions", transactions); + } + if (gasLimit != null) { + json.put("gasLimit", gasLimit); } return json.encode(); }
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePreparePayloadParameter.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePreparePayloadParameter.java index 049ae4608d3a84d170288dbd7b03d1fb2232a503..8808fcad242470d2cbc25c1da8fdb1cf7e02ce80 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePreparePayloadParameter.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePreparePayloadParameter.java @@ -33,6 +33,11 @@ private final Optional<Long> timestamp; final List<WithdrawalParameter> withdrawals; private final Optional<Bytes32> parentBeaconBlockRoot;   + // optimism payload attributes + private final Optional<Boolean> noTxPool; + private final List<String> transactions; + private final Optional<Long> gasLimit; + @JsonCreator public EnginePreparePayloadParameter( @JsonProperty("parentHash") final Optional<Hash> parentHash, @@ -40,13 +45,19 @@ @JsonProperty("feeRecipient") final Optional<Address> feeRecipient, @JsonProperty("timestamp") final Optional<UnsignedLongParameter> timestamp, @JsonProperty("prevRandao") final Optional<String> prevRandao, @JsonProperty("withdrawals") final Optional<List<WithdrawalParameter>> withdrawals, - @JsonProperty("parentBeaconBlockRoot") final Optional<Bytes32> parentBeaconBlockRoot) { + @JsonProperty("parentBeaconBlockRoot") final Optional<Bytes32> parentBeaconBlockRoot, + @JsonProperty("noTxPool") final Optional<Boolean> noTxPool, + @JsonProperty("transactions") final Optional<List<String>> transactions, + @JsonProperty("gasLimit") final Optional<Long> gasLimit) { this.parentHash = parentHash; this.feeRecipient = feeRecipient.orElse(Address.ZERO); this.timestamp = timestamp.map(UnsignedLongParameter::getValue); this.prevRandao = Bytes32.fromHexStringLenient(prevRandao.orElse("deadbeef")); this.withdrawals = withdrawals.orElse(Collections.emptyList()); this.parentBeaconBlockRoot = parentBeaconBlockRoot; + this.noTxPool = noTxPool; + this.transactions = transactions.orElse(Collections.emptyList()); + this.gasLimit = gasLimit; }   public Optional<Hash> getParentHash() { @@ -71,5 +82,17 @@ }   public Optional<Bytes32> getParentBeaconBlockRoot() { return parentBeaconBlockRoot; + } + + public Optional<Boolean> isNoTxPool() { + return noTxPool; + } + + public List<String> getTransactions() { + return transactions; + } + + public Optional<Long> getGasLimit() { + return gasLimit; } }
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionCompleteResult.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionCompleteResult.java index f1475713f39b1f5c18f63895ff952d6678a20045..6f03901e3b46b4928f99831dfcf95ab86f27ebc1 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionCompleteResult.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionCompleteResult.java @@ -27,6 +27,7 @@ import com.fasterxml.jackson.annotation.JsonGetter; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.bytes.DelegatingBytes;   @JsonPropertyOrder({ "accessList", @@ -39,6 +40,7 @@ "gasPrice", "maxPriorityFeePerGas", "maxFeePerGas", "maxFeePerBlobGas", + "mint", "hash", "input", "nonce", @@ -49,6 +51,7 @@ "value", "v", "r", "s", + "sourceHash", "blobVersionedHashes" }) public class TransactionCompleteResult implements TransactionResult { @@ -74,6 +77,9 @@ private final String maxFeePerGas;   @JsonInclude(JsonInclude.Include.NON_NULL) private final String maxFeePerBlobGas; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private final String mint;   private final String hash; private final String input; @@ -87,6 +93,9 @@ private final String r; private final String s;   @JsonInclude(JsonInclude.Include.NON_NULL) + private final String sourceHash; + + @JsonInclude(JsonInclude.Include.NON_NULL) private final List<VersionedHash> versionedHashes;   public TransactionCompleteResult(final TransactionWithMetadata tx) { @@ -110,8 +119,9 @@ transaction .getGasPrice() .orElseGet(() -> transaction.getEffectiveGasPrice(tx.getBaseFee()))); this.hash = transaction.getHash().toString(); + this.mint = transaction.getMint().map(Wei::toShortHexString).orElse(null); this.input = transaction.getPayload().toString(); - this.nonce = Quantity.create(transaction.getNonce()); + this.nonce = Quantity.create(tx.getNonce()); this.to = transaction.getTo().map(Bytes::toHexString).orElse(null); this.transactionIndex = Quantity.create(tx.getTransactionIndex().get()); this.type = @@ -122,6 +132,7 @@ this.value = Quantity.create(transaction.getValue()); this.v = Quantity.create(transaction.getV()); this.r = Quantity.create(transaction.getR()); this.s = Quantity.create(transaction.getS()); + this.sourceHash = transaction.getSourceHash().map(DelegatingBytes::toString).orElse(null); this.versionedHashes = transaction.getVersionedHashes().orElse(null); }   @@ -180,6 +191,11 @@ public String getHash() { return hash; }   + @JsonGetter(value = "mint") + public String getMint() { + return mint; + } + @JsonGetter(value = "input") public String getInput() { return input; @@ -223,6 +239,11 @@ @JsonGetter(value = "s") public String getS() { return s; + } + + @JsonGetter(value = "sourceHash") + public String getSourceHash() { + return sourceHash; }   @JsonGetter(value = "blobVersionedHashes")
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionReceiptResult.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionReceiptResult.java index b2f39d7a287ff2b02daae95696321e48dcb4fff3..dfb2ccbdaa0e28a7d24529c833b4cdd4c8f8a356 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionReceiptResult.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionReceiptResult.java @@ -37,6 +37,7 @@ "contractAddress", "cumulativeGasUsed", "from", "gasUsed", + "depositNonce", "effectiveGasPrice", "logs", "logsBloom", @@ -58,6 +59,7 @@ private final String contractAddress; private final String cumulativeGasUsed; private final String from; private final String gasUsed; + private final String depositNonce; private final String effectiveGasPrice; private final List<TransactionReceiptLogResult> logs; private final String logsBloom; @@ -83,6 +85,10 @@ this.from = txn.getSender().toString(); this.gasUsed = Quantity.create(receiptWithMetadata.getGasUsed()); this.blobGasUsed = receiptWithMetadata.getBlobGasUsed().map(Quantity::create).orElse(null); this.blobGasPrice = receiptWithMetadata.getBlobGasPrice().map(Quantity::create).orElse(null); + this.depositNonce = + this.receipt.getDepositNonce().isPresent() + ? Quantity.create(this.receipt.getDepositNonce().get()) + : null; this.effectiveGasPrice = Quantity.create(txn.getEffectiveGasPrice(receiptWithMetadata.getBaseFee()));   @@ -144,6 +150,11 @@ @JsonGetter(value = "blobGasPrice") @JsonInclude(JsonInclude.Include.NON_NULL) public String getBlobGasPrice() { return blobGasPrice; + } + + @JsonGetter(value = "depositNonce") + public String getDepositNonce() { + return depositNonce; }   @JsonGetter(value = "effectiveGasPrice")

The Create2 Deployer contract is used to deploy contracts to the L2. It is used by the sequencer to deploy the sequencer contract.

diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/Create2DeployerFunction.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/Create2DeployerFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..f220c933b3edac5bf5bdc44c005b69ac10e3d4d9 --- /dev/null +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/Create2DeployerFunction.java @@ -0,0 +1,56 @@ +/* + * Copyright optimism-java. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet; + +import org.hyperledger.besu.config.GenesisConfigOptions; +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.evm.account.MutableAccount; +import org.hyperledger.besu.evm.worldstate.WorldUpdater; + +import java.util.Optional; + +import org.apache.tuweni.bytes.Bytes; + +/** Create2DeployerFunction */ +public class Create2DeployerFunction { + + private static final String CREATE2_DEPLOYER_ADDR = "0x13b0d85ccb8bf860b6b79af3029fca081ae9bef2"; + + private static final Bytes CREATE_2_DEPLOYER_CODE = + Bytes.fromHexString( + "0x6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033"); + + /** + * The Canyon hardfork issues an irregular state transition that force-deploys the create2 + * deployer contract. This is done by directly setting the code of the create2 deployer account + * prior to executing any transactions on the timestamp activation of the fork. + * + * @param configOptions chain config options + * @param timestamp the block header timestamp + * @param updater world state updater + */ + public static void ensureCreate2Deployer( + final Optional<GenesisConfigOptions> configOptions, + final long timestamp, + final WorldUpdater updater) { + if (configOptions.isEmpty() || !configOptions.get().isCanyon(timestamp)) { + return; + } + final MutableAccount contract = + updater.getOrCreate(Address.fromHexString(CREATE2_DEPLOYER_ADDR)); + contract.setCode(CREATE_2_DEPLOYER_CODE); + updater.commit(); + } +}

The rollup functionality is enabled with the optimism field in the chain config. The EIP-1559 parameters are configurable to adjust for faster more frequent and smaller blocks. The parameters can be overriden for testing.

diff --git hyperledger/besu/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java index 3c8776cac4047657f1a3606e912afbcfb4d70702..edef6a962275db324d61d726f96b65f0c00571ca 100644 --- hyperledger/besu/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java +++ optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java @@ -43,6 +43,7 @@ private static final String IBFT_LEGACY_CONFIG_KEY = "ibft"; private static final String IBFT2_CONFIG_KEY = "ibft2"; private static final String QBFT_CONFIG_KEY = "qbft"; private static final String CLIQUE_CONFIG_KEY = "clique"; + private static final String OPTIMISM_CONFIG_KEY = "optimism"; private static final String EC_CURVE_CONFIG_KEY = "eccurve"; private static final String TRANSITIONS_CONFIG_KEY = "transitions"; private static final String DISCOVERY_CONFIG_KEY = "discovery"; @@ -152,6 +153,11 @@ return isQbft() || isClique() || isIbft2() || isIbftLegacy(); }   @Override + public boolean isOptimism() { + return configRoot.has(OPTIMISM_CONFIG_KEY); + } + + @Override public BftConfigOptions getBftConfigOptions() { final String fieldKey = isIbft2() ? IBFT2_CONFIG_KEY : QBFT_CONFIG_KEY; return JsonUtil.getObjectNode(configRoot, fieldKey) @@ -195,6 +201,13 @@ .orElse(EthashConfigOptions.DEFAULT); }   @Override + public OptimismConfigOptions getOptimismConfigOptions() { + return JsonUtil.getObjectNode(configRoot, OPTIMISM_CONFIG_KEY) + .map(OptimismConfigOptions::new) + .orElse(OptimismConfigOptions.DEFAULT); + } + + @Override public TransitionsConfigOptions getTransitions() { return transitions; } @@ -303,6 +316,54 @@ return getOptionalLong("experimentaleipstime"); }   @Override + public OptionalLong getBedrockBlock() { + return getOptionalLong("bedrockblock"); + } + + @Override + public boolean isBedrockBlock(final long headBlock) { + OptionalLong bedrockBlock = getBedrockBlock(); + if (!bedrockBlock.isPresent()) { + return false; + } + return bedrockBlock.getAsLong() <= headBlock; + } + + @Override + public OptionalLong getRegolithTime() { + return getOptionalLong("regolithtime"); + } + + @Override + public boolean isRegolith(final long headTime) { + if (!isOptimism()) { + return false; + } + var regolithTime = getRegolithTime(); + if (regolithTime.isPresent()) { + return regolithTime.getAsLong() <= headTime; + } + return false; + } + + @Override + public OptionalLong getCanyonTime() { + return getOptionalLong("canyontime"); + } + + @Override + public boolean isCanyon(final long headTime) { + if (!isOptimism()) { + return false; + } + var canyonTime = getCanyonTime(); + if (canyonTime.isPresent()) { + return canyonTime.getAsLong() <= headTime; + } + return false; + } + + @Override public Optional<Wei> getBaseFeePerGas() { return Optional.ofNullable(configOverrides.get("baseFeePerGas")) .map(Wei::fromHexString) @@ -448,6 +509,10 @@ getTerminalBlockHash().ifPresent(h -> builder.put("terminalBlockHash", h.toHexString())); getFutureEipsTime().ifPresent(l -> builder.put("futureEipsTime", l)); getExperimentalEipsTime().ifPresent(l -> builder.put("experimentalEipsTime", l));   + getBedrockBlock().ifPresent(l -> builder.put("bedrockBlock", l)); + getRegolithTime().ifPresent(l -> builder.put("regolithTime", l)); + getCanyonTime().ifPresent(l -> builder.put("canyonTime", l)); + // classic fork blocks getClassicForkBlock().ifPresent(l -> builder.put("classicForkBlock", l)); getEcip1015BlockNumber().ifPresent(l -> builder.put("ecip1015Block", l)); @@ -478,6 +543,9 @@ builder.put("ibft2", getBftConfigOptions().asMap()); } if (isQbft()) { builder.put("qbft", getQbftConfigOptions().asMap()); + } + if (isOptimism()) { + builder.put("optimism", getOptimismConfigOptions().asMap()); }   if (isZeroBaseFee()) {
diff --git hyperledger/besu/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java index f60bffec96f98ddb7213979b0014e35bc28685ce..15bc375874bbc694b48df22971a3341b41cb0d35 100644 --- hyperledger/besu/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java +++ optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java @@ -82,6 +82,13 @@ return isIbft2() && isQbft(); }   /** + * Is Optimism boolean + * + * @return the boolean + */ + boolean isOptimism(); + + /** * Gets consensus engine. * * @return the consensus engine @@ -129,6 +136,13 @@ * * @return the ethash config options */ EthashConfigOptions getEthashConfigOptions(); + + /** + * Gets optimism config options + * + * @return the optimism config options. + */ + OptimismConfigOptions getOptimismConfigOptions();   /** * Gets homestead block number. @@ -255,6 +269,52 @@ * * @return the experimental eips time */ OptionalLong getExperimentalEipsTime(); + + /** + * Gets bedrock switch block number. + * + * @return the bedrock switch block number + */ + OptionalLong getBedrockBlock(); + + /** + * Returns whether a fork scheduled at bedrock block number is active at the given head block + * number + * + * @param headBlock the head block height + * @return the boolean + */ + boolean isBedrockBlock(long headBlock); + + /** + * Gets regolith time. + * + * @return the regolith time + */ + OptionalLong getRegolithTime(); + + /** + * Returns whether a fork scheduled at regolith timestamp is active at the given head timestamp. + * + * @param headTime the current head time + * @return the boolean + */ + boolean isRegolith(long headTime); + + /** + * Gets canyon time. + * + * @return the canyon time + */ + OptionalLong getCanyonTime(); + + /** + * Returns whether a fork scheduled at canyon timestamp is active at the given head timestamp. + * + * @param headTime the current head time + * @return the boolean + */ + boolean isCanyon(long headTime);   /** * Gets base fee per gas.
diff --git hyperledger/besu/config/src/main/java/org/hyperledger/besu/config/OptimismConfigOptions.java optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/OptimismConfigOptions.java new file mode 100644 index 0000000000000000000000000000000000000000..008dd16e9695faf4eecc0d3a9d6805f7ddad06c2 --- /dev/null +++ optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/OptimismConfigOptions.java @@ -0,0 +1,81 @@ +/* + * Copyright ConsenSys AG. + * Copyright OptimismJ. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.config; + +import java.util.Map; +import java.util.OptionalLong; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.ImmutableMap; + +/** the Optimism config options. */ +public class OptimismConfigOptions { + + /** The constant DEFAULT. */ + public static final OptimismConfigOptions DEFAULT = + new OptimismConfigOptions(JsonUtil.createEmptyObjectNode()); + + private final ObjectNode optimismConfigRoot; + + /** + * Instantiates a new Optimism config options. + * + * @param optimismConfigRoot the Optimism config root + */ + OptimismConfigOptions(final ObjectNode optimismConfigRoot) { + this.optimismConfigRoot = optimismConfigRoot; + } + + /** + * Gets EIP1559 elasticity. + * + * @return the EIP1559 elasticity + */ + public OptionalLong getEIP1559Elasticity() { + return JsonUtil.getLong(optimismConfigRoot, "eip1559elasticity"); + } + + /** + * Gets EIP1559 denominator. + * + * @return the EIP1559 denominator + */ + public OptionalLong getEIP1559Denominator() { + return JsonUtil.getLong(optimismConfigRoot, "eip1559denominator"); + } + + /** + * Gets EIP1559 denominatorCanyon. + * + * @return the EIP1559 denominatorCanyon + */ + public OptionalLong getEIP1559DenominatorCanyon() { + return JsonUtil.getLong(optimismConfigRoot, "eip1559denominatorcanyon"); + } + + /** + * As map. + * + * @return the map + */ + Map<String, Object> asMap() { + final ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder(); + getEIP1559Elasticity().ifPresent(l -> builder.put("eip1559Elasticity", l)); + getEIP1559Denominator().ifPresent(l -> builder.put("eip1559Denominator", l)); + getEIP1559DenominatorCanyon().ifPresent(l -> builder.put("eip1559DenominatorCanyon", l)); + return builder.build(); + } +}

Changes to the node configuration and services.

diff --git hyperledger/besu/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java optimism-java/op-besu/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java index bb46003b24b7094aa194398ecba625c98c352538..582b43b701a18cd4ace8f6ff951335de3eaeff23 100644 --- hyperledger/besu/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java +++ optimism-java/op-besu/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java @@ -357,6 +357,8 @@ } else if (configOptions.isQbft()) { builder = new QbftBesuControllerBuilder(); } else if (configOptions.isClique()) { builder = new CliqueBesuControllerBuilder(); + } else if (configOptions.isOptimism()) { + builder = new MainnetBesuControllerBuilder(); } else { throw new IllegalArgumentException("Unknown consensus mechanism defined"); }
diff --git hyperledger/besu/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java optimism-java/op-besu/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java index 8bdbee2d9b24ff4235312225dcf3663ccdf22e5a..19a91d3919e182d3cfc1e5f9eac2c0c20a9f4102 100644 --- hyperledger/besu/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java +++ optimism-java/op-besu/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java @@ -177,7 +177,8 @@ }, transactionPool, miningParameters, backwardSyncContext, - depositContractAddress); + depositContractAddress, + Optional.of(genesisConfigOptions)); }   @Override

The Spec Builder is extended to support the new transaction type and the new EIP-1559 parameters for the optimism.

diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java index 786fdd3597652a430e0f8ee5580ef69dab174f59..7a2cf0521a4761aba6834f75823a9e8c45b3d452 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java @@ -275,6 +275,8 @@ }   private TreeMap<Long, BuilderMapEntry> buildMilestoneMap( final MainnetProtocolSpecFactory specFactory) { + Stream<Optional<BuilderMapEntry>> milestones = createMilestones(specFactory); + milestones.close(); return createMilestones(specFactory) .flatMap(Optional::stream) .collect( @@ -287,6 +289,12 @@ }   private Stream<Optional<BuilderMapEntry>> createMilestones( final MainnetProtocolSpecFactory specFactory) { + if (config.isOptimism()) { + return Stream.of( + blockNumberMilestone(config.getBedrockBlock(), specFactory.londonDefinition(config)), + timestampMilestone(config.getRegolithTime(), specFactory.londonDefinition(config)), + timestampMilestone(config.getCanyonTime(), specFactory.shanghaiDefinition(config))); + } return Stream.of( blockNumberMilestone(OptionalLong.of(0), specFactory.frontierDefinition()), blockNumberMilestone(config.getHomesteadBlockNumber(), specFactory.homesteadDefinition()),
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index 7b39ebe2f5f58f71a62f683ade94789326952c6c..351570174a18a1a8ff3ae9d3366757aae8208ef4 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -19,6 +19,7 @@ import static org.hyperledger.besu.ethereum.core.PrivacyParameters.DEFAULT_PRIVACY; import static org.hyperledger.besu.ethereum.core.PrivacyParameters.FLEXIBLE_PRIVACY; import static org.hyperledger.besu.ethereum.core.PrivacyParameters.PLUGIN_PRIVACY;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.BlockValidator; import org.hyperledger.besu.ethereum.GasLimitCalculator; @@ -81,6 +82,7 @@ private BadBlockManager badBlockManager; private PoWHasher powHasher = PoWHasher.ETHASH_LIGHT; private boolean isPoS = false; private boolean isReplayProtectionSupported = false; + private Optional<GenesisConfigOptions> genesisConfigOptions = Optional.empty();   public ProtocolSpecBuilder gasCalculator(final Supplier<GasCalculator> gasCalculatorBuilder) { this.gasCalculatorBuilder = gasCalculatorBuilder; @@ -276,6 +278,11 @@ this.isReplayProtectionSupported = isReplayProtectionSupported; return this; }   + public ProtocolSpecBuilder genesisConfigOptions(final Optional<GenesisConfigOptions> options) { + this.genesisConfigOptions = options; + return this; + } + public ProtocolSpec build(final ProtocolSchedule protocolSchedule) { checkNotNull(gasCalculatorBuilder, "Missing gasCalculator"); checkNotNull(gasLimitCalculatorBuilder, "Missing gasLimitCalculatorBuilder"); @@ -333,7 +340,8 @@ createBlockHeaderValidator(ommerHeaderValidatorBuilder);   final BlockBodyValidator blockBodyValidator = blockBodyValidatorBuilder.apply(protocolSchedule);   - BlockProcessor blockProcessor = createBlockProcessor(transactionProcessor, protocolSchedule); + BlockProcessor blockProcessor = + createBlockProcessor(transactionProcessor, protocolSchedule, genesisConfigOptions); // Set private Tx Processor PrivateTransactionProcessor privateTransactionProcessor = createPrivateTransactionProcessor( @@ -426,14 +434,16 @@ }   private BlockProcessor createBlockProcessor( final MainnetTransactionProcessor transactionProcessor, - final ProtocolSchedule protocolSchedule) { + final ProtocolSchedule protocolSchedule, + final Optional<GenesisConfigOptions> genesisConfigOptions) { return blockProcessorBuilder.apply( transactionProcessor, transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - protocolSchedule); + protocolSchedule, + genesisConfigOptions); }   private BlockHeaderValidator createBlockHeaderValidator( @@ -472,7 +482,8 @@ AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory, Wei blockReward, MiningBeneficiaryCalculator miningBeneficiaryCalculator, boolean skipZeroBlockRewards, - ProtocolSchedule protocolSchedule); + ProtocolSchedule protocolSchedule, + Optional<GenesisConfigOptions> genesisConfigOptions); }   public interface BlockValidatorBuilder {
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index e477bf6f75ed576b19905b3b58468eb443fc5786..d8221c9e27dec7072073d7c02c9d5922e1a9f354 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -217,7 +217,8 @@ transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - protocolSchedule) -> + protocolSchedule, + genesisConfigOptions) -> new DaoBlockProcessor( new MainnetBlockProcessor( transactionProcessor, @@ -225,7 +226,8 @@ transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - protocolSchedule))) + protocolSchedule, + genesisConfigOptions))) .name("DaoRecoveryInit"); }   @@ -441,7 +443,10 @@ genesisConfigOptions.getLondonBlockNumber().orElse(Long.MAX_VALUE); final BaseFeeMarket londonFeeMarket = genesisConfigOptions.isZeroBaseFee() ? FeeMarket.zeroBaseFee(londonForkBlockNumber) - : FeeMarket.london(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); + : FeeMarket.london( + londonForkBlockNumber, + genesisConfigOptions.getBaseFeePerGas(), + Optional.of(genesisConfigOptions)); return berlinDefinition( chainId, configContractSizeLimit, @@ -465,7 +470,8 @@ chainId, Set.of( TransactionType.FRONTIER, TransactionType.ACCESS_LIST, - TransactionType.EIP1559), + TransactionType.EIP1559, + TransactionType.OPTIMISM_DEPOSIT), Integer.MAX_VALUE)) .transactionProcessorBuilder( (gasCalculator, @@ -482,7 +488,9 @@ true, false, stackSizeLimit, feeMarket, - CoinbaseFeePriceCalculator.eip1559())) + CoinbaseFeePriceCalculator.eip1559(), + Optional.of(genesisConfigOptions), + Optional.of(new L1CostCalculator()))) .contractCreationProcessorBuilder( (gasCalculator, evm) -> new ContractCreationProcessor( @@ -505,6 +513,7 @@ feeMarket -> MainnetBlockHeaderValidator.createBaseFeeMarketOmmerValidator( (BaseFeeMarket) feeMarket)) .blockBodyValidatorBuilder(BaseFeeBlockBodyValidator::new) + .genesisConfigOptions(Optional.of(genesisConfigOptions)) .name("London"); }   @@ -611,7 +620,9 @@ true, true, stackSizeLimit, feeMarket, - CoinbaseFeePriceCalculator.eip1559())) + CoinbaseFeePriceCalculator.eip1559(), + Optional.of(genesisConfigOptions), + Optional.of(new L1CostCalculator()))) // Contract creation rules for EIP-3860 Limit and meter intitcode .transactionValidatorFactoryBuilder( (gasCalculator, gasLimitCalculator, feeMarket) -> @@ -624,10 +635,13 @@ chainId, Set.of( TransactionType.FRONTIER, TransactionType.ACCESS_LIST, - TransactionType.EIP1559), - SHANGHAI_INIT_CODE_SIZE_LIMIT)) + TransactionType.EIP1559, + TransactionType.OPTIMISM_DEPOSIT), + SHANGHAI_INIT_CODE_SIZE_LIMIT, + genesisConfigOptions)) .withdrawalsProcessor(new WithdrawalsProcessor()) .withdrawalsValidator(new WithdrawalsValidator.AllowedWithdrawals()) + .genesisConfigOptions(Optional.of(genesisConfigOptions)) .name("Shanghai"); }   @@ -696,11 +710,79 @@ Set.of( TransactionType.FRONTIER, TransactionType.ACCESS_LIST, TransactionType.EIP1559, - TransactionType.BLOB), + TransactionType.BLOB, + TransactionType.OPTIMISM_DEPOSIT), SHANGHAI_INIT_CODE_SIZE_LIMIT)) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::cancun) .blockHeaderValidatorBuilder(MainnetBlockHeaderValidator::cancunBlockHeaderValidator) + .genesisConfigOptions(Optional.of(genesisConfigOptions)) .name("Cancun"); + } + + static ProtocolSpecBuilder canyonDefinition( + final Optional<BigInteger> chainId, + final OptionalInt configContractSizeLimit, + final OptionalInt configStackSizeLimit, + final boolean enableRevertReason, + final GenesisConfigOptions genesisConfigOptions, + final EvmConfiguration evmConfiguration) { + + // extra variables need to support flipping the warm coinbase flag. + final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); + + return parisDefinition( + chainId, + configContractSizeLimit, + configStackSizeLimit, + enableRevertReason, + genesisConfigOptions, + evmConfiguration) + // gas calculator has new code to support EIP-3860 limit and meter initcode + .gasCalculator(ShanghaiGasCalculator::new) + // EVM has a new operation for EIP-3855 PUSH0 instruction + .evmBuilder( + (gasCalculator, jdCacheConfig) -> + MainnetEVMs.shanghai( + gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) + // we need to flip the Warm Coinbase flag for EIP-3651 warm coinbase + .transactionProcessorBuilder( + (gasCalculator, + feeMarket, + transactionValidatorFactory, + contractCreationProcessor, + messageCallProcessor) -> + new MainnetTransactionProcessor( + gasCalculator, + transactionValidatorFactory, + contractCreationProcessor, + messageCallProcessor, + true, + true, + stackSizeLimit, + feeMarket, + CoinbaseFeePriceCalculator.eip1559(), + Optional.of(genesisConfigOptions), + Optional.of(new L1CostCalculator()))) + // Contract creation rules for EIP-3860 Limit and meter intitcode + .transactionValidatorFactoryBuilder( + (gasCalculator, gasLimitCalculator, feeMarket) -> + new TransactionValidatorFactory( + gasCalculator, + gasLimitCalculator, + feeMarket, + true, + chainId, + Set.of( + TransactionType.FRONTIER, + TransactionType.ACCESS_LIST, + TransactionType.EIP1559, + TransactionType.OPTIMISM_DEPOSIT), + SHANGHAI_INIT_CODE_SIZE_LIMIT, + genesisConfigOptions)) + .withdrawalsProcessor(new WithdrawalsProcessor()) + .withdrawalsValidator(new WithdrawalsValidator.AllowedWithdrawals()) + .genesisConfigOptions(Optional.of(genesisConfigOptions)) + .name("Canyon"); }   static ProtocolSpecBuilder futureEipsDefinition(
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java index bc460811ae0c1d24a3876c03437df0a684b6a4f3..d351ffc22eefb6d5be7b2a0f49e6312458a58db5 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java @@ -106,7 +106,8 @@ transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - protocolSchedule) -> + protocolSchedule, + genesisConfigOptions) -> new ClassicBlockProcessor( transactionProcessor, transactionReceiptFactory,
diff --git hyperledger/besu/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java optimism-java/op-besu/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java index b1f59554af3f42f42afcfaba6e49cec1a93bc7a5..e8d58ac650c2df918a06ae2d603ddf5e26050de1 100644 --- hyperledger/besu/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java +++ optimism-java/op-besu/besu/src/test/java/org/hyperledger/besu/controller/MergeBesuControllerBuilderTest.java @@ -99,7 +99,8 @@ @Mock WorldStatePreimageStorage worldStatePreimageStorage;   BigInteger networkId = BigInteger.ONE; private final BlockHeaderTestFixture headerGenerator = new BlockHeaderTestFixture(); - private final BaseFeeMarket feeMarket = new LondonFeeMarket(0, Optional.of(Wei.of(42))); + private final BaseFeeMarket feeMarket = + new LondonFeeMarket(0, Optional.of(Wei.of(42)), Optional.empty()); private final TransactionPoolConfiguration poolConfiguration = TransactionPoolConfiguration.DEFAULT; private final ObservableMetricsSystem observableMetricsSystem = new NoOpMetricsSystem(); @@ -272,7 +273,9 @@ return headerGenerator .difficulty(Difficulty.MAX_VALUE) .parentHash(magicHash) .number(blockNumber) - .baseFeePerGas(feeMarket.computeBaseFee(blockNumber, Wei.of(0x3b9aca00), 0, 15000000l)) + .baseFeePerGas( + feeMarket.computeBaseFee( + blockNumber, Wei.of(0x3b9aca00), 0, 15000000l, OptionalLong.empty())) .gasLimit(30000000l) .stateRoot(magicHash) .buildHeader();
diff --git hyperledger/besu/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java optimism-java/op-besu/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index 8b6b10f5493870ed2621f17a8b8a0bcd6ca5d89d..eca186ba69d45c2ec9f3ffb518071e945473b320 100644 --- hyperledger/besu/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ optimism-java/op-besu/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -17,6 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when;   @@ -135,7 +136,9 @@ when(mockProtocolSchedule.getByBlockHeader(any())).thenReturn(mockProtocolSpec); when(mockProtocolSpec.getTransactionValidatorFactory()) .thenReturn(mockTransactionValidatorFactory); when(mockProtocolSpec.getFeeMarket()).thenReturn(FeeMarket.london(0L)); - when(mockTransactionValidatorFactory.get().validate(any(), any(Optional.class), any())) + when(mockTransactionValidatorFactory + .get() + .validate(any(), anyLong(), any(Optional.class), any())) .thenReturn(ValidationResult.valid()); when(mockTransactionValidatorFactory.get().validateForSender(any(), any(), any())) .thenReturn(ValidationResult.valid());
diff --git hyperledger/besu/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java index 0d1648f13d2952450f3fd697e7ba4749a94f1ec9..31c1dab1f08adfb8a7217c4f781d26d0a92ab54f 100644 --- hyperledger/besu/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java +++ optimism-java/op-besu/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java @@ -50,6 +50,10 @@ private OptionalLong shanghaiTime = OptionalLong.empty(); private OptionalLong cancunTime = OptionalLong.empty(); private OptionalLong futureEipsTime = OptionalLong.empty(); private OptionalLong experimentalEipsTime = OptionalLong.empty(); + private final OptionalLong bedrockBlock = OptionalLong.empty(); + private final OptionalLong regolithTime = OptionalLong.empty(); + private final OptionalLong canyonTime = OptionalLong.empty(); + private OptionalLong terminalBlockNumber = OptionalLong.empty(); private Optional<Hash> terminalBlockHash = Optional.empty(); private Optional<UInt256> terminalTotalDifficulty = Optional.empty(); @@ -122,6 +126,11 @@ return false; }   @Override + public boolean isOptimism() { + return false; + } + + @Override public CheckpointConfigOptions getCheckpointOptions() { return CheckpointConfigOptions.DEFAULT; } @@ -152,6 +161,11 @@ return EthashConfigOptions.DEFAULT; }   @Override + public OptimismConfigOptions getOptimismConfigOptions() { + return OptimismConfigOptions.DEFAULT; + } + + @Override public OptionalLong getHomesteadBlockNumber() { return homesteadBlockNumber; } @@ -239,6 +253,36 @@ @Override public OptionalLong getExperimentalEipsTime() { return experimentalEipsTime; + } + + @Override + public OptionalLong getBedrockBlock() { + return bedrockBlock; + } + + @Override + public boolean isBedrockBlock(final long headBlock) { + return false; + } + + @Override + public OptionalLong getRegolithTime() { + return regolithTime; + } + + @Override + public boolean isRegolith(final long headTime) { + return false; + } + + @Override + public OptionalLong getCanyonTime() { + return canyonTime; + } + + @Override + public boolean isCanyon(final long headTime) { + return false; }   @Override
diff --git hyperledger/besu/consensus/merge/build.gradle optimism-java/op-besu/consensus/merge/build.gradle index 9476f09d9d7ec51d760a73710e38ddbcf9e0d7c3..c1559ceade1ee52a72025333eb934a74782d0b69 100644 --- hyperledger/besu/consensus/merge/build.gradle +++ optimism-java/op-besu/consensus/merge/build.gradle @@ -39,6 +39,7 @@ implementation project(':ethereum:core') implementation project(':ethereum:eth') implementation project(':ethereum:p2p') implementation project(':ethereum:trie') + implementation project(':ethereum:rlp') implementation project(':evm') implementation project(':plugin-api') implementation project(':util')
diff --git hyperledger/besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinatorTest.java optimism-java/op-besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinatorTest.java index bc7e424133d95601942e99ce7e04d886c70b255e..971084ad2a8feecbbce17a420e5a8580bfd63d55 100644 --- hyperledger/besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinatorTest.java +++ optimism-java/op-besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinatorTest.java @@ -82,6 +82,7 @@ import java.time.ZoneId; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.OptionalLong; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; @@ -154,7 +155,7 @@ private final Address suggestedFeeRecipient = Address.ZERO; private final BlockHeaderTestFixture headerGenerator = new BlockHeaderTestFixture(); private final BaseFeeMarket feeMarket = - new LondonFeeMarket(0, genesisState.getBlock().getHeader().getBaseFee()); + new LondonFeeMarket(0, genesisState.getBlock().getHeader().getBaseFee(), Optional.empty());   private final org.hyperledger.besu.metrics.StubMetricsSystem metricsSystem = new StubMetricsSystem(); @@ -235,6 +236,7 @@ proposalBuilderExecutor, transactionPool, miningParameters, backwardSyncContext, + Optional.empty(), Optional.empty()); }   @@ -256,6 +258,9 @@ System.currentTimeMillis() / 1000, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   ArgumentCaptor<PayloadWrapper> payloadWrapper = ArgumentCaptor.forClass(PayloadWrapper.class); @@ -287,6 +292,7 @@ protocolSchedule, this.miningParameters.getMinTransactionGasPrice(), address.or(miningParameters::getCoinbase).orElse(Address.ZERO), parentHeader, + Optional.empty(), Optional.empty()));   doCallRealMethod() @@ -295,7 +301,13 @@ .doThrow(new MerkleTrieException("missing leaf")) .doCallRealMethod() .when(beingSpiedOn) .createBlock( - any(), any(Bytes32.class), anyLong(), eq(Optional.empty()), eq(Optional.empty())); + any(), + any(Bytes32.class), + anyLong(), + eq(Optional.empty()), + eq(Optional.empty()), + eq(Optional.empty()), + eq(Optional.empty())); return beingSpiedOn; };   @@ -332,6 +344,9 @@ genesisState.getBlock().getHeader(), System.currentTimeMillis() / 1000, Bytes32.random(), suggestedFeeRecipient, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty());   @@ -373,6 +388,9 @@ System.currentTimeMillis() / 1000, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   verify(badBlockManager, never()).addBadBlock(any(), any()); @@ -406,6 +424,9 @@ System.currentTimeMillis() / 1000, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   blockCreationTask.get(); @@ -464,6 +485,9 @@ System.currentTimeMillis() / 1000, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   blockCreationTask.get(); @@ -515,6 +539,9 @@ System.currentTimeMillis() / 1000, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   blockCreationTask.get(); @@ -563,6 +590,9 @@ genesisState.getBlock().getHeader(), System.currentTimeMillis() / 1000, Bytes32.ZERO, suggestedFeeRecipient, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty());   @@ -610,6 +640,9 @@ System.currentTimeMillis() / 1000, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   waitForBlockCreationInProgress.await(); @@ -664,6 +697,9 @@ timestamp, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   final CompletableFuture<Void> task1 = blockCreationTask; @@ -674,6 +710,9 @@ genesisState.getBlock().getHeader(), timestamp, Bytes32.ZERO, suggestedFeeRecipient, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty());   @@ -716,6 +755,9 @@ timestamp, Bytes32.ZERO, suggestedFeeRecipient, Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   assertThat(coordinator.isBlockCreationCancelled(payloadId1)).isFalse(); @@ -726,6 +768,9 @@ genesisState.getBlock().getHeader(), timestamp + 1, Bytes32.ZERO, suggestedFeeRecipient, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty());   @@ -748,6 +793,7 @@ proposalBuilderExecutor, transactionPool, miningParameters, backwardSyncContext, + Optional.empty(), Optional.empty());   final PayloadIdentifier payloadId = @@ -756,6 +802,9 @@ genesisState.getBlock().getHeader(), 1L, Bytes32.ZERO, suggestedFeeRecipient, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty());   @@ -995,7 +1044,8 @@ feeMarket.computeBaseFee( genesisState.getBlock().getHeader().getNumber() + 1, genesisState.getBlock().getHeader().getBaseFee().orElse(Wei.of(0x3b9aca00)), 0, - 15000000l)) + 15000000l, + OptionalLong.empty())) .timestamp(1) .gasLimit(genesisState.getBlock().getHeader().getGasLimit()) .stateRoot(genesisState.getBlock().getHeader().getStateRoot()) @@ -1018,7 +1068,8 @@ feeMarket.computeBaseFee( genesisState.getBlock().getHeader().getNumber() + 1, parentHeader.getBaseFee().orElse(Wei.of(0x3b9aca00)), 0, - 15000000l)) + 15000000l, + OptionalLong.empty())) .buildHeader(); }
diff --git hyperledger/besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java optimism-java/op-besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java index d5dbd139c6cb111c3b6e7f6a4506bb29c9b4fcc9..0834d8a90d9ee41fe7eb1ce01ff9f64fa7cceaa4 100644 --- hyperledger/besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java +++ optimism-java/op-besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeReorgTest.java @@ -46,6 +46,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.OptionalLong; import java.util.concurrent.CompletableFuture;   import org.junit.jupiter.api.BeforeEach; @@ -78,7 +79,7 @@ private final Address coinbase = genesisAllocations(getPowGenesisConfigFile()).findFirst().get(); private final BlockHeaderTestFixture headerGenerator = new BlockHeaderTestFixture(); private final BaseFeeMarket feeMarket = - new LondonFeeMarket(0, genesisState.getBlock().getHeader().getBaseFee()); + new LondonFeeMarket(0, genesisState.getBlock().getHeader().getBaseFee(), Optional.empty());   @BeforeEach public void setUp() { @@ -95,6 +96,7 @@ CompletableFuture::runAsync, mockTransactionPool, new MiningParameters.Builder().coinbase(coinbase).build(), mock(BackwardSyncContext.class), + Optional.empty(), Optional.empty()); mergeContext.setIsPostMerge(genesisState.getBlock().getHeader().getDifficulty()); blockchain.observeBlockAdded( @@ -186,7 +188,8 @@ feeMarket.computeBaseFee( genesisState.getBlock().getHeader().getNumber() + 1, newParent.getBaseFee().orElse(Wei.of(0x3b9aca00)), 0, - 15000000)) + 15000000, + OptionalLong.empty())) .gasLimit(newParent.getGasLimit()) .timestamp(newParent.getTimestamp() + 1) .stateRoot(newParent.getStateRoot()); @@ -212,7 +215,8 @@ feeMarket.computeBaseFee( genesisState.getBlock().getHeader().getNumber() + 1, parent.getBaseFee().orElse(Wei.of(0x3b9aca00)), 0, - 15000000l)) + 15000000l, + OptionalLong.empty())) .gasLimit(parent.getGasLimit()) .timestamp(parent.getTimestamp() + 1) .stateRoot(parent.getStateRoot())
diff --git hyperledger/besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifierTest.java optimism-java/op-besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifierTest.java index 314224cf55db3accc51b8c1f768b2ec976d91215..87717cdda4df6475602e447269c0e03b04d93fe4 100644 --- hyperledger/besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifierTest.java +++ optimism-java/op-besu/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifierTest.java @@ -53,6 +53,9 @@ 1337L, Bytes32.random(), Address.fromHexString("0x42"), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); assertThat(new PayloadIdentifier(idTest.getAsBigInteger().longValue())).isEqualTo(idTest); assertThat(new PayloadIdentifier(idTest.getAsBigInteger().longValue())).isEqualTo(idTest); @@ -92,6 +95,9 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals1), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); var idForWithdrawals2 = PayloadIdentifier.forPayloadParams( @@ -100,6 +106,9 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals2), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2); } @@ -138,6 +147,9 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals1), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); var idForWithdrawals2 = PayloadIdentifier.forPayloadParams( @@ -146,6 +158,9 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(withdrawals2), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); assertThat(idForWithdrawals1).isEqualTo(idForWithdrawals2); } @@ -160,6 +175,9 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); var idForWithdrawals2 = PayloadIdentifier.forPayloadParams( @@ -168,6 +186,9 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.of(emptyList()), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2); } @@ -182,6 +203,9 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); var idForWithdrawals2 = PayloadIdentifier.forPayloadParams( @@ -190,7 +214,10 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.empty(), - Optional.of(Bytes32.ZERO)); + Optional.of(Bytes32.ZERO), + Optional.empty(), + Optional.empty(), + Optional.empty()); assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2); }   @@ -204,7 +231,10 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.empty(), - Optional.of(Bytes32.fromHexStringLenient("0x1"))); + Optional.of(Bytes32.fromHexStringLenient("0x1")), + Optional.empty(), + Optional.empty(), + Optional.empty()); var idForWithdrawals2 = PayloadIdentifier.forPayloadParams( Hash.ZERO, @@ -212,7 +242,10 @@ 1337L, prevRandao, Address.fromHexString("0x42"), Optional.empty(), - Optional.of(Bytes32.ZERO)); + Optional.of(Bytes32.ZERO), + Optional.empty(), + Optional.empty(), + Optional.empty()); assertThat(idForWithdrawals1).isNotEqualTo(idForWithdrawals2); } }
diff --git hyperledger/besu/enclave/src/integration-test/java/org/hyperledger/besu/enclave/EnclaveTest.java optimism-java/op-besu/enclave/src/integration-test/java/org/hyperledger/besu/enclave/EnclaveTest.java index b9b657e66896e9acd46b028b779d01b6d992480d..ac6cc60ef03ee05b35eeba60ac4453f579fbdcce 100644 --- hyperledger/besu/enclave/src/integration-test/java/org/hyperledger/besu/enclave/EnclaveTest.java +++ optimism-java/op-besu/enclave/src/integration-test/java/org/hyperledger/besu/enclave/EnclaveTest.java @@ -39,9 +39,11 @@ import io.vertx.core.Vertx; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir;   +@Disabled public class EnclaveTest {   @TempDir private static Path folder;
diff --git hyperledger/besu/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/PrivGetPrivateTransactionIntegrationTest.java optimism-java/op-besu/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/PrivGetPrivateTransactionIntegrationTest.java index 9bb10629f31cb29e35b60893a38d2b38dadddfda..d325ab1e6c959f35b504fe5d4fa6561cf83944ec 100644 --- hyperledger/besu/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/PrivGetPrivateTransactionIntegrationTest.java +++ optimism-java/op-besu/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/PrivGetPrivateTransactionIntegrationTest.java @@ -64,9 +64,11 @@ import io.vertx.core.Vertx; import org.apache.tuweni.bytes.Bytes; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir;   +@Disabled public class PrivGetPrivateTransactionIntegrationTest {   @TempDir private static Path folder;
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java index 04bfdd9727a5cca3cf22870a7e6b1dd1fa240a69..bb51d8ab0f7fb75ad970fca0e3b7dbdfe3bd7b1e 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/BlockchainQueries.java @@ -20,6 +20,7 @@ import static org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator.calculateExcessBlobGasForParent;   import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.ApiConfiguration; import org.hyperledger.besu.ethereum.api.ImmutableApiConfiguration; @@ -1026,7 +1027,16 @@ final Hash blockHash) { final int count = txs.size(); final List<TransactionWithMetadata> result = new ArrayList<>(count); for (int i = 0; i < count; i++) { - result.add(new TransactionWithMetadata(txs.get(i), blockNumber, baseFee, blockHash, i)); + if (TransactionType.OPTIMISM_DEPOSIT.equals(txs.get(i).getType())) { + final List<TransactionReceipt> txReceipts = + blockchain.getTxReceipts(blockHash).orElseThrow(); + final TransactionReceipt receipt = txReceipts.get(i); + result.add( + new TransactionWithMetadata( + txs.get(i), blockNumber, baseFee, blockHash, i, receipt.getDepositNonce())); + } else { + result.add(new TransactionWithMetadata(txs.get(i), blockNumber, baseFee, blockHash, i)); + } } return result; }
diff --git hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/TransactionWithMetadata.java optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/TransactionWithMetadata.java index 637b0f8f5cea298855ed004d416ee9accbabe00e..f8b81eb44de8ed7b7fb4f63710618b708d5484e1 100644 --- hyperledger/besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/TransactionWithMetadata.java +++ optimism-java/op-besu/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/query/TransactionWithMetadata.java @@ -29,6 +29,7 @@ private final Optional<Long> blockNumber; private final Optional<Wei> baseFee; private final Optional<Hash> blockHash; private final Optional<Integer> transactionIndex; + private final Optional<Long> nonce;   public TransactionWithMetadata(final Transaction transaction) { this.transaction = transaction; @@ -36,6 +37,7 @@ this.blockNumber = Optional.empty(); this.baseFee = Optional.empty(); this.blockHash = Optional.empty(); this.transactionIndex = Optional.empty(); + this.nonce = Optional.empty(); }   public TransactionWithMetadata( @@ -44,11 +46,22 @@ final long blockNumber, final Optional<Wei> baseFee, final Hash blockHash, final int transactionIndex) { + this(transaction, blockNumber, baseFee, blockHash, transactionIndex, Optional.empty()); + } + + public TransactionWithMetadata( + final Transaction transaction, + final long blockNumber, + final Optional<Wei> baseFee, + final Hash blockHash, + final int transactionIndex, + final Optional<Long> nonce) { this.transaction = transaction; this.blockNumber = Optional.of(blockNumber); this.baseFee = baseFee; this.blockHash = Optional.of(blockHash); this.transactionIndex = Optional.of(transactionIndex); + this.nonce = nonce; }   public Transaction getTransaction() { @@ -69,5 +82,9 @@ }   public Optional<Integer> getTransactionIndex() { return transactionIndex; + } + + public long getNonce() { + return nonce.orElse(transaction.getNonce()); } }
diff --git hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java index 249a12d9f0b87a52faf40d289d85f0a5604468ef..8a0cb05ecb42e2097a212b44e62d780d1a43d9f9 100644 --- hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java +++ optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java @@ -241,6 +241,9 @@ String.valueOf(System.currentTimeMillis()), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), null, + null, + null, + null, null); var mockPayloadId = PayloadIdentifier.forPayloadParams( @@ -249,6 +252,9 @@ payloadParams.getTimestamp(), payloadParams.getPrevRandao(), payloadParams.getSuggestedFeeRecipient(), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   when(mergeCoordinator.preparePayload( @@ -256,6 +262,9 @@ mockHeader, payloadParams.getTimestamp(), payloadParams.getPrevRandao(), Address.ECREC, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty())) .thenReturn(mockPayloadId); @@ -430,6 +439,9 @@ String.valueOf(System.currentTimeMillis()), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), null, + null, + null, + null, null);   var resp = @@ -441,7 +453,8 @@ Optional.of(payloadParams));   var forkchoiceRes = (EngineUpdateForkchoiceResult) resp.getResult();   - verify(mergeCoordinator, never()).preparePayload(any(), any(), any(), any(), any(), any()); + verify(mergeCoordinator, never()) + .preparePayload(any(), any(), any(), any(), any(), any(), any(), any(), any());   assertThat(forkchoiceRes.getPayloadStatus().getStatus()).isEqualTo(VALID); assertThat(forkchoiceRes.getPayloadStatus().getError()).isNull(); @@ -467,6 +480,9 @@ String.valueOf(timestampNotGreaterThanHead), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), emptyList(), + null, + null, + null, null);   var resp = @@ -492,6 +508,9 @@ String.valueOf(System.currentTimeMillis()), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), emptyList(), + null, + null, + null, null);   var resp = @@ -517,6 +536,9 @@ String.valueOf(System.currentTimeMillis()), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), null, + null, + null, + null, null);   var mockPayloadId = @@ -526,6 +548,9 @@ payloadParams.getTimestamp(), payloadParams.getPrevRandao(), payloadParams.getSuggestedFeeRecipient(), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   when(mergeCoordinator.preparePayload( @@ -533,6 +558,9 @@ mockHeader, payloadParams.getTimestamp(), payloadParams.getPrevRandao(), Address.ECREC, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty())) .thenReturn(mockPayloadId); @@ -560,6 +588,9 @@ new EnginePayloadAttributesParameter( String.valueOf(System.currentTimeMillis()), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), + null, + null, + null, null, null);   @@ -597,6 +628,9 @@ String.valueOf(System.currentTimeMillis()), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), withdrawalParameters, + null, + null, + null, null);   final Optional<List<Withdrawal>> withdrawals = @@ -612,6 +646,9 @@ payloadParams.getTimestamp(), payloadParams.getPrevRandao(), payloadParams.getSuggestedFeeRecipient(), withdrawals, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   when(mergeCoordinator.preparePayload( @@ -620,6 +657,9 @@ payloadParams.getTimestamp(), payloadParams.getPrevRandao(), Address.ECREC, withdrawals, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty())) .thenReturn(mockPayloadId);   @@ -645,6 +685,9 @@ new EnginePayloadAttributesParameter( String.valueOf(System.currentTimeMillis()), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), + null, + null, + null, null, null);   @@ -655,6 +698,9 @@ payloadParams.getTimestamp(), payloadParams.getPrevRandao(), payloadParams.getSuggestedFeeRecipient(), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   when(mergeCoordinator.preparePayload( @@ -662,6 +708,9 @@ mockHeader, payloadParams.getTimestamp(), payloadParams.getPrevRandao(), Address.ECREC, + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty())) .thenReturn(mockPayloadId);
diff --git hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java index fd2f02ba0244440a8e790d03ff068e828766d422..68143b9b21157c5b3a106080dfbdeae01bf2fa97 100644 --- hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java +++ optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineGetPayloadTest.java @@ -90,6 +90,9 @@ 1337L, Bytes32.random(), Address.fromHexString("0x42"), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty()); protected static final BlockHeader mockHeader = new BlockHeaderTestFixture().prevRandao(Bytes32.random()).buildHeader(); @@ -156,6 +159,9 @@ Hash.ZERO, 0L, Bytes32.random(), Address.fromHexString("0x42"), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty())); assertThat(resp).isInstanceOf(JsonRpcErrorResponse.class);
diff --git hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3Test.java optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3Test.java index 1e19bc3fd5d7dd5edf10d1590f934cc9983ab2ec..4f7ee9f74d0ec3bbfac735f03815a63ad976d3d4 100644 --- hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3Test.java +++ optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV3Test.java @@ -105,6 +105,9 @@ cancunHardfork.milestone(), Bytes32.random(), Address.fromHexString("0x42"), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   BlobTestFixture blobTestFixture = new BlobTestFixture();
diff --git hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV6110Test.java optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV6110Test.java index 879f11e724c798a9fca41fc4dd37d69ba68e8116..48eeb60a12894478d1ec0758e367169b1a248320 100644 --- hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV6110Test.java +++ optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV6110Test.java @@ -107,6 +107,9 @@ experimentalHardfork.milestone(), Bytes32.random(), Address.fromHexString("0x42"), Optional.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty(), Optional.empty());   BlobTestFixture blobTestFixture = new BlobTestFixture();
diff --git hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameterTest.java optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameterTest.java index 46f46f3bbd417beb2568e222df883741a6f367e3..08b7e72320be1c67867d1de2293b83d5429f7114 100644 --- hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameterTest.java +++ optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameterTest.java @@ -99,13 +99,20 @@ }   private EnginePayloadAttributesParameter parameterWithdrawalsOmitted() { return new EnginePayloadAttributesParameter( - TIMESTAMP, PREV_RANDAO, SUGGESTED_FEE_RECIPIENT_ADDRESS, null, null); + TIMESTAMP, PREV_RANDAO, SUGGESTED_FEE_RECIPIENT_ADDRESS, null, null, null, null, null); }   private EnginePayloadAttributesParameter parameterWithdrawalsPresent() { final List<WithdrawalParameter> withdrawals = List.of(WITHDRAWAL_PARAM_1, WITHDRAWAL_PARAM_2); return new EnginePayloadAttributesParameter( - TIMESTAMP, PREV_RANDAO, SUGGESTED_FEE_RECIPIENT_ADDRESS, withdrawals, null); + TIMESTAMP, + PREV_RANDAO, + SUGGESTED_FEE_RECIPIENT_ADDRESS, + withdrawals, + null, + null, + null, + null); }   // TODO: add a parent beacon block root test here
diff --git hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java index f8275182051a3da056560ec8b5e57170c260ef7d..1e5e26314133d38d6ec957b6425d6dbeb4d4c8df 100644 --- hyperledger/besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java +++ optimism-java/op-besu/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/tracing/flat/RewardTraceGeneratorTest.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.tracing.Trace; @@ -35,6 +36,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;   import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.OptionalLong; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -55,6 +57,7 @@ @Mock private ProtocolSchedule protocolSchedule; @Mock private ProtocolSpec protocolSpec; @Mock private MiningBeneficiaryCalculator miningBeneficiaryCalculator; @Mock private MainnetTransactionProcessor transactionProcessor; + @Mock private GenesisConfigOptions genesisConfigOptions;   private final Address ommerBeneficiary = Address.wrap(Bytes.fromHexString("0x095e7baea6a6c7c4c2dfeb977efac326af552d87")); @@ -91,7 +94,8 @@ transactionReceiptFactory, blockReward, BlockHeader::getCoinbase, true, - protocolSchedule); + protocolSchedule, + Optional.of(genesisConfigOptions)); when(protocolSpec.getBlockProcessor()).thenReturn(blockProcessor);   final Stream<Trace> traceStream =
diff --git hyperledger/besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java optimism-java/op-besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java index b5ad06d8248d3fc6657ade2d89220837897ed3b8..6b77dcec970b1da2d2ac5829431d5550134acfd2 100644 --- hyperledger/besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java +++ optimism-java/op-besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java @@ -148,7 +148,9 @@ Optional.of(emptyList()), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty());   List<Deposit> deposits = emptyList(); final Hash depositsRoot = BodyValidation.depositsRoot(deposits); @@ -168,7 +170,9 @@ Optional.of(emptyList()), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty());   assertThat(blockCreationResult.getBlock().getHeader().getDepositsRoot()).isEmpty(); assertThat(blockCreationResult.getBlock().getBody().getDeposits()).isEmpty(); @@ -186,7 +190,9 @@ Optional.of(emptyList()), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty());   assertThat(blockCreationResult.getBlock().getHeader().getDepositsRoot()).isEmpty(); assertThat(blockCreationResult.getBlock().getBody().getDeposits()).isEmpty(); @@ -223,7 +229,9 @@ Optional.empty(), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty()); verify(withdrawalsProcessor, never()).processWithdrawals(any(), any()); assertThat(blockCreationResult.getBlock().getHeader().getWithdrawalsRoot()).isEmpty(); assertThat(blockCreationResult.getBlock().getBody().getWithdrawals()).isEmpty(); @@ -240,7 +248,9 @@ Optional.empty(), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty()); verify(withdrawalsProcessor, never()).processWithdrawals(any(), any()); assertThat(blockCreationResult.getBlock().getHeader().getWithdrawalsRoot()).isEmpty(); assertThat(blockCreationResult.getBlock().getBody().getWithdrawals()).isEmpty(); @@ -259,7 +269,9 @@ Optional.of(withdrawals), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty());   final Hash withdrawalsRoot = BodyValidation.withdrawalsRoot(withdrawals); verify(withdrawalsProcessor).processWithdrawals(eq(withdrawals), any()); @@ -281,7 +293,9 @@ Optional.of(withdrawals), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty()); verify(withdrawalsProcessor, never()).processWithdrawals(any(), any()); assertThat(blockCreationResult.getBlock().getHeader().getWithdrawalsRoot()).isEmpty(); assertThat(blockCreationResult.getBlock().getBody().getWithdrawals()).isEmpty(); @@ -314,7 +328,9 @@ Optional.empty(), Optional.empty(), Optional.empty(), 1L, - false); + false, + Optional.empty(), + Optional.empty()); long blobGasUsage = blockCreationResult.getBlock().getHeader().getGasUsed(); assertThat(blobGasUsage).isNotZero(); BlobGas excessBlobGas = blockCreationResult.getBlock().getHeader().getExcessBlobGas().get();
diff --git hyperledger/besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java optimism-java/op-besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java index 863d164df4314cec54f659cca59f3eef4c4f2c63..81f662bf7be994fe76f8ca43d9f06999b501b8c1 100644 --- hyperledger/besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java +++ optimism-java/op-besu/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockTransactionSelectorTest.java @@ -761,6 +761,7 @@ blobGasPrice, getFeeMarket(), new LondonGasCalculator(), GasLimitCalculator.constant(), + Optional.empty(), Optional.empty());   return selector; @@ -790,7 +791,8 @@ blobGasPrice, getFeeMarket(), new LondonGasCalculator(), GasLimitCalculator.constant(), - Optional.of(transactionSelectorFactory)); + Optional.of(transactionSelectorFactory), + Optional.empty());   return selector; }
diff --git hyperledger/besu/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java optimism-java/op-besu/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java index 2c6e07433f06ca71fb1c32eccc89df21edcd8ac9..3c4c8d4f8054bf3e092360510f33c85ced4053fe 100644 --- hyperledger/besu/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java +++ optimism-java/op-besu/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java @@ -67,9 +67,11 @@ import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir;   +@Disabled public class PrivacyPrecompiledContractIntegrationTest {   @TempDir private static Path folder;
diff --git hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/storage/keyvalue/KeyValueStoragePrefixedKeyBlockchainStorage.java optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/storage/keyvalue/KeyValueStoragePrefixedKeyBlockchainStorage.java index 9134ca91c014195766612983d10994027443993b..73eadeaa6384d0c0f4a5ec2bdfc4a5472da6b860 100644 --- hyperledger/besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/storage/keyvalue/KeyValueStoragePrefixedKeyBlockchainStorage.java +++ optimism-java/op-besu/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/storage/keyvalue/KeyValueStoragePrefixedKeyBlockchainStorage.java @@ -365,7 +365,7 @@ blockchainTransaction.remove(Bytes.concatenate(prefix, key).toArrayUnsafe()); }   private Bytes rlpEncode(final List<TransactionReceipt> receipts) { - return RLP.encode(o -> o.writeList(receipts, TransactionReceipt::writeToWithRevertReason)); + return RLP.encode(o -> o.writeList(receipts, TransactionReceipt::writeToForStorage)); }   private void removeVariables() {
diff --git hyperledger/besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockDataGenerator.java optimism-java/op-besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockDataGenerator.java index 3b2b8e309588da0525a439770d2c19951cf28e69..a56f29b539987b46635ea344cb467008b298cd99 100644 --- hyperledger/besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockDataGenerator.java +++ optimism-java/op-besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/BlockDataGenerator.java @@ -376,6 +376,7 @@ case FRONTIER -> frontierTransaction(payload, to); case EIP1559 -> eip1559Transaction(payload, to); case ACCESS_LIST -> accessListTransaction(payload, to); case BLOB -> blobTransaction(payload, to); + case OPTIMISM_DEPOSIT -> optimismDepositTransaction(payload, to); // no default, all types accounted for. }; } @@ -446,6 +447,20 @@ .to(to) .value(Wei.wrap(bytes32())) .payload(payload) .chainId(BigInteger.ONE) + .signAndBuild(generateKeyPair()); + } + + private Transaction optimismDepositTransaction(final Bytes payload, final Address to) { + return Transaction.builder() + .type(TransactionType.OPTIMISM_DEPOSIT) + .gasLimit(positiveLong()) + .to(to) + .value(Wei.wrap(bytes32())) + .payload(payload) + .isSystemTx(false) + .mint(Wei.of(BigInteger.ONE)) + .sourceHash(Hash.ZERO) + .chainId(BigInteger.TEN) .signAndBuild(generateKeyPair()); }
diff --git hyperledger/besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/TransactionTestFixture.java optimism-java/op-besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/TransactionTestFixture.java index 933e6b3ce0b3605a2774633c98bb825d971964a1..fac550af0127716e450e04eefc969f9653de0d6b 100644 --- hyperledger/besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/TransactionTestFixture.java +++ optimism-java/op-besu/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/TransactionTestFixture.java @@ -18,6 +18,7 @@ import org.hyperledger.besu.crypto.KeyPair; import org.hyperledger.besu.datatypes.AccessListEntry; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.BlobsWithCommitments; +import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.VersionedHash; import org.hyperledger.besu.datatypes.Wei; @@ -91,6 +92,11 @@ blobs.ifPresent( bwc -> { builder.kzgBlobs(bwc.getKzgCommitments(), bwc.getBlobs(), bwc.getKzgProofs()); }); + break; + case OPTIMISM_DEPOSIT: + builder.sourceHash(Hash.ZERO); + builder.isSystemTx(true); + builder.mint(Wei.of(BigInteger.ONE)); break; }
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java index b936ed28fa33d0b82f6ee25d89808ca8d98dd0f2..5628093296ce1f689dea21e1d1dc033d51482277 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/BlockImportExceptionHandlingTest.java @@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.bonsai.BonsaiWorldStateProvider; @@ -64,6 +65,7 @@ private final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory = mock(AbstractBlockProcessor.TransactionReceiptFactory.class);   private final ProtocolSchedule protocolSchedule = mock(ProtocolSchedule.class); + private final GenesisConfigOptions genesisConfigOptions = mock(GenesisConfigOptions.class); private final BlockProcessor blockProcessor = new MainnetBlockProcessor( transactionProcessor, @@ -71,7 +73,8 @@ transactionReceiptFactory, Wei.ZERO, BlockHeader::getCoinbase, true, - protocolSchedule); + protocolSchedule, + Optional.of(genesisConfigOptions)); private final BlockHeaderValidator blockHeaderValidator = mock(BlockHeaderValidator.class); private final BlockBodyValidator blockBodyValidator = mock(BlockBodyValidator.class); private final ProtocolContext protocolContext = mock(ProtocolContext.class);
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/TransactionReceiptTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/TransactionReceiptTest.java index 00a04354c694d487e155388499e3c7536ca6e98b..23e31c917b7931eb265a22dff313ced9bbf2d066 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/TransactionReceiptTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/TransactionReceiptTest.java @@ -16,7 +16,15 @@ package org.hyperledger.besu.ethereum.core;   import static org.assertj.core.api.Assertions.assertThat;   +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.ethereum.rlp.RLP; +import org.hyperledger.besu.evm.log.Log; +import org.hyperledger.besu.evm.log.LogTopic; +import org.hyperledger.besu.evm.log.LogsBloomFilter; + +import java.util.Arrays; +import java.util.Optional;   import org.apache.tuweni.bytes.Bytes; import org.junit.jupiter.api.Test; @@ -38,6 +46,183 @@ final BlockDataGenerator gen = new BlockDataGenerator(); final TransactionReceipt receipt = gen.receipt(Bytes.fromHexString("0x1122334455667788")); final TransactionReceipt copy = TransactionReceipt.readFrom(RLP.input(RLP.encode(receipt::writeToWithRevertReason))); + assertThat(copy).isEqualTo(receipt); + } + + @Test + public void toFromRlpEIP1559() { + String receiptHex = + "0x02f901c58001b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8bef85d940000000000000000000000000000000000000011f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100fff85d940000000000000000000000000000000000000111f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100ff"; + + final TransactionReceipt receipt = + new TransactionReceipt( + TransactionType.EIP1559, + null, + 0, + 1, + Arrays.asList( + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000011"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef"))), + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000111"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef")))), + LogsBloomFilter.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty()); + Bytes encoded = + RLP.encode( + rlpoutput -> { + receipt.writeToForReceiptTrie(rlpoutput, false); + }); + assertThat(encoded.toHexString()).isEqualTo(receiptHex); + + final TransactionReceipt copy = + TransactionReceipt.readFrom(RLP.input(RLP.encode(receipt::writeTo)), false); + assertThat(copy).isEqualTo(receipt); + } + + @Test + public void toFromDepositWithNonceRlp() { + String receiptHex = + "0x7ef901c58001b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8bef85d940000000000000000000000000000000000000011f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100fff85d940000000000000000000000000000000000000111f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100ff"; + final TransactionReceipt receipt = + new TransactionReceipt( + TransactionType.OPTIMISM_DEPOSIT, + null, + 0, + 1, + Arrays.asList( + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000011"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef"))), + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000111"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef")))), + LogsBloomFilter.empty(), + Optional.empty(), + Optional.of(1234L), + Optional.empty()); + Bytes encoded = + RLP.encode( + rlpoutput -> { + receipt.writeToForReceiptTrie(rlpoutput, false); + }); + assertThat(encoded.toHexString()).isEqualTo(receiptHex); + + var parsed = TransactionReceipt.readFrom(RLP.input(RLP.encode(receipt::writeTo)), false); + var reEncoded = + RLP.encode( + rlpoutput -> { + parsed.writeToForReceiptTrie(rlpoutput, false); + }); + assertThat(reEncoded.toHexString()).isEqualTo(receiptHex); + } + + @Test + public void toFromDepositNoNonceRlp() { + String receiptHex = + "0x7ef901c58001b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8bef85d940000000000000000000000000000000000000011f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100fff85d940000000000000000000000000000000000000111f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100ff"; + final TransactionReceipt receipt = + new TransactionReceipt( + TransactionType.OPTIMISM_DEPOSIT, + null, + 0, + 1, + Arrays.asList( + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000011"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef"))), + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000111"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef")))), + LogsBloomFilter.empty(), + Optional.empty(), + Optional.empty(), + Optional.empty()); + Bytes encoded = + RLP.encode( + rlpoutput -> { + receipt.writeToForReceiptTrie(rlpoutput, false); + }); + assertThat(encoded.toHexString()).isEqualTo(receiptHex); + + final TransactionReceipt copy = + TransactionReceipt.readFrom(RLP.input(RLP.encode(receipt::writeTo)), false); + assertThat(copy).isEqualTo(receipt); + } + + @Test + public void toFromDepositWithNonceAndVersionRlp() { + String receiptHex = + "0x7ef901c98001b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8bef85d940000000000000000000000000000000000000011f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100fff85d940000000000000000000000000000000000000111f842a0000000000000000000000000000000000000000000000000000000000000deada0000000000000000000000000000000000000000000000000000000000000beef830100ff8204d201"; + final TransactionReceipt receipt = + new TransactionReceipt( + TransactionType.OPTIMISM_DEPOSIT, + null, + 0, + 1, + Arrays.asList( + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000011"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef"))), + new Log( + Address.fromHexString("0x0000000000000000000000000000000000000111"), + Bytes.of(0x01, 0x00, 0xff), + Arrays.asList( + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000dead"), + LogTopic.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000beef")))), + LogsBloomFilter.empty(), + Optional.empty(), + Optional.of(1234L), + Optional.of(1L)); + Bytes encoded = + RLP.encode( + rlpoutput -> { + receipt.writeToForReceiptTrie(rlpoutput, false); + }); + assertThat(encoded.toHexString()).isEqualTo(receiptHex); + + final TransactionReceipt copy = + TransactionReceipt.readFrom(RLP.input(RLP.encode(receipt::writeTo)), false); assertThat(copy).isEqualTo(receipt); } }
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPDecoderTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPDecoderTest.java index 245561158b02ea671dd24ccfaa760b6e3f78916c..fa01327243637184b248fd31ec15cbbff7cc4f5f 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPDecoderTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPDecoderTest.java @@ -17,7 +17,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.hyperledger.besu.evm.account.Account.MAX_NONCE; +import static org.junit.jupiter.api.Assertions.assertTrue;   +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.TransactionType; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.rlp.RLP; @@ -43,6 +47,24 @@ "0xb8a902f8a686796f6c6f7632800285012a05f20082753094000000000000000000000000000000000000aaaa8080f838f794000000000000000000000000000000000000aaaae1a0000000000000000000000000000000000000000000000000000000000000000001a00c1d69648e348fe26155b45de45004f0e4195f6352d8f0935bc93e98a3e2a862a060064e5b9765c0ac74223b0cf49635c59ae0faf82044fd17bcc68a549ade6f95"; private static final String NONCE_64_BIT_MAX_MINUS_2_TX_RLP = "0xf86788fffffffffffffffe0182520894095e7baea6a6c7c4c2dfeb977efac326af552d8780801ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a01fffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804";   + private static final String OPTIMISM_DEPOSIT_TX_RLP = + "0xb8417ef83ea0000000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000080648082c3500180"; + + @Test + void decodeOptimismDepositNominalCase() { + final Transaction transaction = + decodeRLP(RLP.input(Bytes.fromHexString(OPTIMISM_DEPOSIT_TX_RLP))); + assertThat(transaction).isNotNull(); + assertThat(transaction.getType()).isEqualTo(TransactionType.OPTIMISM_DEPOSIT); + assertThat(transaction.getSourceHash().get()).isEqualTo(Hash.ZERO); + assertThat(transaction.getSender()).isEqualTo(Address.ZERO); + assertTrue(transaction.getIsSystemTx().get()); + assertThat(transaction.getMint().get()).isEqualByComparingTo(Wei.of(100L)); + assertThat(transaction.getValue()).isEqualByComparingTo(Wei.ZERO); + assertThat(transaction.getGasLimit()).isEqualTo(50000L); + assertTrue(transaction.getData().isEmpty()); + } + @Test void decodeFrontierNominalCase() { final Transaction transaction = decodeRLP(RLP.input(Bytes.fromHexString(FRONTIER_TX_RLP))); @@ -84,7 +106,8 @@ return Arrays.asList( new Object[][] { {FRONTIER_TX_RLP, "FRONTIER_TX_RLP"}, {EIP1559_TX_RLP, "EIP1559_TX_RLP"}, - {NONCE_64_BIT_MAX_MINUS_2_TX_RLP, "NONCE_64_BIT_MAX_MINUS_2_TX_RLP"} + {NONCE_64_BIT_MAX_MINUS_2_TX_RLP, "NONCE_64_BIT_MAX_MINUS_2_TX_RLP"}, + {OPTIMISM_DEPOSIT_TX_RLP, "OPTIMISM_DEPOSIT_TX_RLP"} }); }   @@ -102,7 +125,13 @@ assertThat(transaction.getSize()).isEqualTo(transactionBytes.size()); }   @ParameterizedTest - @ValueSource(strings = {FRONTIER_TX_RLP, EIP1559_TX_RLP, NONCE_64_BIT_MAX_MINUS_2_TX_RLP}) + @ValueSource( + strings = { + FRONTIER_TX_RLP, + EIP1559_TX_RLP, + NONCE_64_BIT_MAX_MINUS_2_TX_RLP, + OPTIMISM_DEPOSIT_TX_RLP + }) void shouldReturnCorrectEncodedBytes(final String txRlp) { final Transaction transaction = decodeRLP(RLP.input(Bytes.fromHexString(txRlp))); assertThat(transaction.encoded()).isEqualTo(Bytes.fromHexString(txRlp));
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPEncoderTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPEncoderTest.java index fa84bc5ef7a20a07b9e0ff5eef5a267445a29008..bdbf04b10b91898878169d840426c63698481636 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPEncoderTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/TransactionRLPEncoderTest.java @@ -16,6 +16,10 @@ package org.hyperledger.besu.ethereum.core.encoding;   import static org.assertj.core.api.Assertions.assertThat;   +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.TransactionType; +import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockDataGenerator; import org.hyperledger.besu.ethereum.core.Transaction; @@ -34,6 +38,25 @@ private static final String EIP1559_TX_RLP = "0xb8a902f8a686796f6c6f7632800285012a05f20082753094000000000000000000000000000000000000aaaa8080f838f794000000000000000000000000000000000000aaaae1a0000000000000000000000000000000000000000000000000000000000000000001a00c1d69648e348fe26155b45de45004f0e4195f6352d8f0935bc93e98a3e2a862a060064e5b9765c0ac74223b0cf49635c59ae0faf82044fd17bcc68a549ade6f95"; private static final String NONCE_64_BIT_MAX_MINUS_2_TX_RLP = "0xf86788fffffffffffffffe0182520894095e7baea6a6c7c4c2dfeb977efac326af552d8780801ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a01fffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804"; + + private static final String OPTIMISM_DEPOSIT_TX_RLP = + "0xb8417ef83ea0000000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000080648082c3500180"; + + @Test + void encodeOptimismDepositNominalCase() { + final Transaction transaction = + Transaction.builder() + .type(TransactionType.OPTIMISM_DEPOSIT) + .sourceHash(Hash.ZERO) + .sender(Address.ZERO) + .mint(Wei.of(100L)) + .gasLimit(50000L) + .isSystemTx(true) + .build(); + final BytesValueRLPOutput output = new BytesValueRLPOutput(); + encodeRLP(transaction, output); + assertThat(output.encoded().toHexString()).isEqualTo(OPTIMISM_DEPOSIT_TX_RLP); + }   @Test void encodeFrontierTxNominalCase() {
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java index d6d94c8453d49352a728086a351a9abbf548e682..2de599194cd7b2e83d70a78d524f3f8b3fc42f1f 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java @@ -24,6 +24,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.OptionalLong; import java.util.stream.Stream;   import com.fasterxml.jackson.databind.ObjectMapper; @@ -71,7 +72,9 @@ final Wei parentBaseFee, final long parentGasUsed, final long parentTargetGasUsed, final Wei expectedBaseFee) { - assertThat(baseFeeMarket.computeBaseFee(0L, parentBaseFee, parentGasUsed, parentTargetGasUsed)) + assertThat( + baseFeeMarket.computeBaseFee( + 0L, parentBaseFee, parentGasUsed, parentTargetGasUsed, OptionalLong.empty())) .isEqualTo(expectedBaseFee); }
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketTest.java index af90a9b0fff9b58142464a5063273cd3c05d4bcf..eb025c2268ba13512ca35415158a23dfcf293ff2 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketTest.java @@ -20,6 +20,8 @@ import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket;   +import java.util.OptionalLong; + import org.junit.jupiter.api.Test;   public class BaseFeeMarketTest { @@ -35,7 +37,8 @@ baseFeeMarket.computeBaseFee( FORK_BLOCK + 1, baseFeeMarket.getInitialBasefee(), TARGET_GAS_USED - 1000000L, - TARGET_GAS_USED)) + TARGET_GAS_USED, + OptionalLong.empty())) .isLessThan(baseFeeMarket.getInitialBasefee()) .isEqualTo(Wei.of(987500000L)); } @@ -47,7 +50,8 @@ baseFeeMarket.computeBaseFee( FORK_BLOCK + 1, baseFeeMarket.getInitialBasefee(), TARGET_GAS_USED + 1000000L, - TARGET_GAS_USED)) + TARGET_GAS_USED, + OptionalLong.empty())) .isGreaterThan(baseFeeMarket.getInitialBasefee()) .isEqualTo(Wei.of(1012500000L)); }
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java index 867bfeb7e5f2f068da2be154ec9f4f6a8e60390e..edd43b1b4cf3234c719ddadee338410b854c9796 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorTest.java @@ -156,7 +156,8 @@ transactionReceiptFactory, blockReward, miningBeneficiaryCalculator, skipZeroBlockRewards, - protocolSchedule); + protocolSchedule, + Optional.empty()); }   @Override
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java index 1b106686bfcc59f3f16a1e5023aa823752a2e73f..c724f5cdd796171db7667727f3b24986721a7c11 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessorTest.java @@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when;   +import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.chain.Blockchain; @@ -29,6 +30,8 @@ import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.referencetests.ReferenceTestBlockchain; import org.hyperledger.besu.ethereum.referencetests.ReferenceTestWorldState; + +import java.util.Optional;   import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -44,6 +47,7 @@ private final AbstractBlockProcessor.TransactionReceiptFactory transactionReceiptFactory = mock(AbstractBlockProcessor.TransactionReceiptFactory.class); private final ProtocolSchedule protocolSchedule = mock(ProtocolSchedule.class); private final ProtocolSpec protocolSpec = mock(ProtocolSpec.class); + private final GenesisConfigOptions genesisConfig = mock(GenesisConfigOptions.class);   @BeforeEach public void setup() { @@ -60,7 +64,8 @@ transactionReceiptFactory, Wei.ZERO, BlockHeader::getCoinbase, true, - protocolSchedule); + protocolSchedule, + Optional.of(genesisConfig));   final MutableWorldState worldState = ReferenceTestWorldState.create(emptyMap()); final Hash initialHash = worldState.rootHash(); @@ -86,7 +91,8 @@ transactionReceiptFactory, Wei.ZERO, BlockHeader::getCoinbase, false, - protocolSchedule); + protocolSchedule, + Optional.of(genesisConfig));   final MutableWorldState worldState = ReferenceTestWorldState.create(emptyMap()); final Hash initialHash = worldState.rootHash();
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessorTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessorTest.java index 4bc2c6944e292567368f781b6cb4e77b1abf860d..34a4647ce2b800d4053825c0093daa7de4b47fd5 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessorTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessorTest.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.mainnet;   import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when;   @@ -93,7 +94,7 @@ when(transaction.getHash()).thenReturn(Hash.EMPTY); when(transaction.getPayload()).thenReturn(Bytes.EMPTY); when(transaction.getSender()).thenReturn(senderAddress); when(transaction.getValue()).thenReturn(Wei.ZERO); - when(transactionValidatorFactory.get().validate(any(), any(), any())) + when(transactionValidatorFactory.get().validate(any(), anyLong(), any(), any())) .thenReturn(ValidationResult.valid()); when(transactionValidatorFactory.get().validateForSender(any(), any(), any())) .thenReturn(ValidationResult.valid()); @@ -170,7 +171,7 @@ private ArgumentCaptor<TransactionValidationParams> transactionValidationParamCaptor() { final ArgumentCaptor<TransactionValidationParams> txValidationParamCaptor = ArgumentCaptor.forClass(TransactionValidationParams.class); - when(transactionValidatorFactory.get().validate(any(), any(), any())) + when(transactionValidatorFactory.get().validate(any(), anyLong(), any(), any())) .thenReturn(ValidationResult.valid()); // returning invalid transaction to halt method execution when(transactionValidatorFactory
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidatorTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidatorTest.java index 5ab351c2efa30898e76041b3a0e818064425ff80..ba5e3c9f284a1d8093296d88140aff30901ffc6c 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidatorTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidatorTest.java @@ -128,7 +128,7 @@ .chainId(Optional.empty()) .createTransaction(senderKeys); when(gasCalculator.transactionIntrinsicGasCost(any(), anyBoolean())).thenReturn(50L);   - assertThat(validator.validate(transaction, Optional.empty(), transactionValidationParams)) + assertThat(validator.validate(transaction, 1, Optional.empty(), transactionValidationParams)) .isEqualTo( ValidationResult.invalid(TransactionInvalidReason.INTRINSIC_GAS_EXCEEDS_GAS_LIMIT)); } @@ -138,7 +138,8 @@ public void shouldRejectTransactionWhenTransactionHasChainIdAndValidatorDoesNot() { final TransactionValidator validator = createTransactionValidator( gasCalculator, GasLimitCalculator.constant(), false, Optional.empty()); - assertThat(validator.validate(basicTransaction, Optional.empty(), transactionValidationParams)) + assertThat( + validator.validate(basicTransaction, 1, Optional.empty(), transactionValidationParams)) .isEqualTo( ValidationResult.invalid( TransactionInvalidReason.REPLAY_PROTECTED_SIGNATURES_NOT_SUPPORTED)); @@ -152,7 +153,8 @@ gasCalculator, GasLimitCalculator.constant(), false, Optional.of(BigInteger.valueOf(2))); - assertThat(validator.validate(basicTransaction, Optional.empty(), transactionValidationParams)) + assertThat( + validator.validate(basicTransaction, 1, Optional.empty(), transactionValidationParams)) .isEqualTo(ValidationResult.invalid(TransactionInvalidReason.WRONG_CHAIN_ID)); }   @@ -300,7 +302,7 @@ .chainId(BigInteger.ONE) .signAndBuild(new SECP256K1().generateKeyPair());   final ValidationResult<TransactionInvalidReason> validationResult = - validator.validate(transaction, Optional.of(Wei.ONE), transactionValidationParams); + validator.validate(transaction, 1, Optional.of(Wei.ONE), transactionValidationParams); assertThat(validationResult) .isEqualTo(ValidationResult.invalid(MAX_PRIORITY_FEE_PER_GAS_EXCEEDS_MAX_FEE_PER_GAS)); assertThat(validationResult.getErrorMessage()) @@ -339,14 +341,15 @@ .chainId(Optional.of(BigInteger.ONE)) .createTransaction(senderKeys);   assertThat( - frontierValidator.validate(transaction, Optional.empty(), transactionValidationParams)) + frontierValidator.validate( + transaction, 1, Optional.empty(), transactionValidationParams)) .isEqualTo(ValidationResult.invalid(INVALID_TRANSACTION_FORMAT));   when(gasCalculator.transactionIntrinsicGasCost(any(), anyBoolean())).thenReturn(0L);   assertThat( eip1559Validator.validate( - transaction, Optional.of(Wei.ONE), transactionValidationParams)) + transaction, 1, Optional.of(Wei.ONE), transactionValidationParams)) .isEqualTo(ValidationResult.valid()); }   @@ -369,7 +372,7 @@ .maxFeePerGas(Optional.of(Wei.of(1))) .chainId(Optional.of(BigInteger.ONE)) .createTransaction(senderKeys); final Optional<Wei> basefee = Optional.of(Wei.of(150000L)); - assertThat(validator.validate(transaction, basefee, transactionValidationParams)) + assertThat(validator.validate(transaction, 1, basefee, transactionValidationParams)) .isEqualTo(ValidationResult.invalid(GAS_PRICE_BELOW_CURRENT_BASE_FEE)); }   @@ -380,7 +383,7 @@ final TransactionValidator validator = createTransactionValidator( gasCalculator, GasLimitCalculator.constant(), - FeeMarket.london(0L, zeroBaseFee), + FeeMarket.london(0L, zeroBaseFee, Optional.empty()), false, Optional.of(BigInteger.ONE), Set.of(TransactionType.FRONTIER, TransactionType.EIP1559), @@ -393,7 +396,7 @@ .maxFeePerGas(Optional.of(Wei.ZERO)) .chainId(Optional.of(BigInteger.ONE)) .createTransaction(senderKeys);   - assertThat(validator.validate(transaction, zeroBaseFee, transactionValidationParams)) + assertThat(validator.validate(transaction, 1, zeroBaseFee, transactionValidationParams)) .isEqualTo(ValidationResult.valid()); }   @@ -418,7 +421,7 @@ .createTransaction(senderKeys); final Optional<Wei> basefee = Optional.of(Wei.of(150000L)); when(gasCalculator.transactionIntrinsicGasCost(any(), anyBoolean())).thenReturn(50L);   - assertThat(validator.validate(transaction, basefee, transactionValidationParams)) + assertThat(validator.validate(transaction, 1, basefee, transactionValidationParams)) .isEqualTo(ValidationResult.valid()); }   @@ -444,7 +447,10 @@ when(gasCalculator.transactionIntrinsicGasCost(any(), anyBoolean())).thenReturn(50L);   assertThat( validator.validate( - transaction, Optional.of(Wei.ONE), TransactionValidationParams.transactionPool())) + transaction, + 1, + Optional.of(Wei.ONE), + TransactionValidationParams.transactionPool())) .isEqualTo(ValidationResult.valid()); }   @@ -466,7 +472,7 @@ .payload(Bytes.fromHexString("0x" + "00".repeat(0xc001))) .chainId(Optional.of(BigInteger.ONE)) .createTransaction(senderKeys); var validationResult = - validator.validate(bigPayload, Optional.empty(), transactionValidationParams); + validator.validate(bigPayload, 1, Optional.empty(), transactionValidationParams);   assertThat(validationResult.isValid()).isFalse(); assertThat(validationResult.getInvalidReason()) @@ -511,7 +517,7 @@ List.of(VersionedHash.DEFAULT_VERSIONED_HASH)))) .versionedHashes(Optional.of(List.of(VersionedHash.DEFAULT_VERSIONED_HASH))) .createTransaction(senderKeys); var validationResult = - validator.validate(blobTx, Optional.empty(), transactionValidationParams); + validator.validate(blobTx, 1, Optional.empty(), transactionValidationParams); if (!validationResult.isValid()) { System.out.println( validationResult.getInvalidReason() + " " + validationResult.getErrorMessage()); @@ -549,7 +555,7 @@ .blobsWithCommitments(Optional.of(bwc)) .versionedHashes(Optional.of(bwc.getVersionedHashes())) .createTransaction(senderKeys); var validationResult = - validator.validate(blobTx, Optional.empty(), transactionValidationParams); + validator.validate(blobTx, 1, Optional.empty(), transactionValidationParams); if (!validationResult.isValid()) { System.out.println( validationResult.getInvalidReason() + " " + validationResult.getErrorMessage());
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarketTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarketTest.java index 1d0bdd53c974b9c386b2b78adce5b6aa30291672..0212e4c102557a3917bff95ae05f75d6d514ecd3 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarketTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarketTest.java @@ -68,7 +68,8 @@ .maxPriorityFeePerGas(Optional.of(Wei.ZERO)) .gasPrice(null) .createTransaction(KEY_PAIR1);   - final LondonFeeMarket londonFeeMarket = new LondonFeeMarket(0, Optional.of(Wei.ZERO)); + final LondonFeeMarket londonFeeMarket = + new LondonFeeMarket(0, Optional.of(Wei.ZERO), Optional.empty()); assertThat(londonFeeMarket.satisfiesFloorTxFee(transaction)).isTrue(); } }
diff --git hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarketTest.java optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarketTest.java index 4047c647aec94970f0fc3135c5cd93dc32c2eb19..abc3423dd08d84dd7ed03af32ce3fc152465565c 100644 --- hyperledger/besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarketTest.java +++ optimism-java/op-besu/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarketTest.java @@ -25,6 +25,7 @@ import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionTestFixture;   import java.util.Optional; +import java.util.OptionalLong;   import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,7 +44,7 @@ }   @Test public void getBasefeeMaxChangeDenominatorShouldUseLondonDefault() { - assertThat(zeroBaseFeeMarket.getBasefeeMaxChangeDenominator()) + assertThat(zeroBaseFeeMarket.getBasefeeMaxChangeDenominator(OptionalLong.empty())) .isEqualTo(LondonFeeMarket.DEFAULT_BASEFEE_MAX_CHANGE_DENOMINATOR); }   @@ -100,7 +101,8 @@ }   @Test public void computeBaseFeeReturnsZero() { - assertThat(zeroBaseFeeMarket.computeBaseFee(1L, Wei.of(8), 1L, 2L)).isEqualTo(Wei.ZERO); + assertThat(zeroBaseFeeMarket.computeBaseFee(1L, Wei.of(8), 1L, 2L, OptionalLong.empty())) + .isEqualTo(Wei.ZERO); }   @Test
diff --git hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java index d9c98f3a92be35cde105ad8f0654bc2d928aeefe..6b90e611f958086122e8dd4768709fc7d2518bb5 100644 --- hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java +++ optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java @@ -30,6 +30,7 @@ import static org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.REPLAY_PROTECTED_SIGNATURE_REQUIRED; import static org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.TRANSACTION_REPLACEMENT_UNDERPRICED; import static org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.TX_FEECAP_EXCEEDED; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; @@ -549,11 +550,11 @@ assertTransactionPending(transaction0); assertTransactionNotPending(transaction1); verify(transactionBroadcaster).onTransactionsAdded(singletonList(transaction0)); verify(transactionValidatorFactory.get()) - .validate(eq(transaction0), any(Optional.class), any()); + .validate(eq(transaction0), anyLong(), any(Optional.class), any()); verify(transactionValidatorFactory.get()) .validateForSender(eq(transaction0), eq(null), any(TransactionValidationParams.class)); verify(transactionValidatorFactory.get()) - .validate(eq(transaction1), any(Optional.class), any()); + .validate(eq(transaction1), anyLong(), any(Optional.class), any()); verify(transactionValidatorFactory.get()).validateForSender(eq(transaction1), any(), any()); verifyNoMoreInteractions(transactionValidatorFactory.get()); } @@ -723,7 +724,9 @@ public void shouldCallValidatorWithExpectedValidationParameters() { final ArgumentCaptor<TransactionValidationParams> txValidationParamCaptor = ArgumentCaptor.forClass(TransactionValidationParams.class);   - when(transactionValidatorFactory.get().validate(eq(transaction0), any(Optional.class), any())) + when(transactionValidatorFactory + .get() + .validate(eq(transaction0), anyLong(), any(Optional.class), any())) .thenReturn(valid()); when(transactionValidatorFactory .get() @@ -1006,7 +1009,8 @@ public void shouldAcceptZeroGasPriceFrontierTxsWhenMinGasPriceIsZeroAndLondonWithZeroBaseFee( final boolean noLocalPriority) { transactionPool = createTransactionPool(b -> b.noLocalPriority(noLocalPriority)); when(miningParameters.getMinTransactionGasPrice()).thenReturn(Wei.ZERO); - when(protocolSpec.getFeeMarket()).thenReturn(FeeMarket.london(0, Optional.of(Wei.ZERO))); + when(protocolSpec.getFeeMarket()) + .thenReturn(FeeMarket.london(0, Optional.of(Wei.ZERO), Optional.empty())); whenBlockBaseFeeIs(Wei.ZERO);   final Transaction frontierTransaction = createFrontierTransaction(0, Wei.ZERO); @@ -1021,7 +1025,8 @@ public void shouldAcceptZeroGasPrice1559TxsWhenMinGasPriceIsZeroAndLondonWithZeroBaseFee( final boolean noLocalPriority) { transactionPool = createTransactionPool(b -> b.noLocalPriority(noLocalPriority)); when(miningParameters.getMinTransactionGasPrice()).thenReturn(Wei.ZERO); - when(protocolSpec.getFeeMarket()).thenReturn(FeeMarket.london(0, Optional.of(Wei.ZERO))); + when(protocolSpec.getFeeMarket()) + .thenReturn(FeeMarket.london(0, Optional.of(Wei.ZERO), Optional.empty())); whenBlockBaseFeeIs(Wei.ZERO);   final Transaction transaction = createTransaction(0, Wei.ZERO); @@ -1206,7 +1211,9 @@ }   @SuppressWarnings("unchecked") protected void givenTransactionIsValid(final Transaction transaction) { - when(transactionValidatorFactory.get().validate(eq(transaction), any(Optional.class), any())) + when(transactionValidatorFactory + .get() + .validate(eq(transaction), anyLong(), any(Optional.class), any())) .thenReturn(valid()); when(transactionValidatorFactory .get() @@ -1316,7 +1323,8 @@ final Wei txMaxFeePerGas, final boolean isLocal, final boolean hasPriority) { when(miningParameters.getMinTransactionGasPrice()).thenReturn(minGasPrice); - when(protocolSpec.getFeeMarket()).thenReturn(FeeMarket.london(0, Optional.of(genesisBaseFee))); + when(protocolSpec.getFeeMarket()) + .thenReturn(FeeMarket.london(0, Optional.of(genesisBaseFee), Optional.empty())); whenBlockBaseFeeIs(lastBlockBaseFee);   final Transaction transaction = createTransaction(0, txMaxFeePerGas);
diff --git hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java index dde45d0a95be716dfa0a512a0cd5ff04cfd90b9b..7e5833e3813337b27f84aaef0aba660314b86dac 100644 --- hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java +++ optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java @@ -45,6 +45,7 @@ import com.google.common.collect.Sets; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -286,6 +287,7 @@ assertThat(size.sum()).isEqualTo(PendingTransaction.PENDING_TRANSACTION_MEMORY_SIZE); }   + @Disabled @Test public void accessListSize() { System.setProperty("jol.magicFieldOffset", "true"); @@ -336,6 +338,7 @@ assertThat(cl4.instanceSize()) .isEqualTo(PendingTransaction.ACCESS_LIST_STORAGE_KEY_MEMORY_SIZE); }   + @Disabled @Test public void baseEIP1559AndEIP4844TransactionMemorySize() { System.setProperty("jol.magicFieldOffset", "true"); @@ -380,6 +383,7 @@ assertThat(eip1559size.sum()) .isEqualTo(PendingTransaction.EIP1559_AND_EIP4844_BASE_MEMORY_SIZE); }   + @Disabled @Test public void baseFrontierAndAccessListTransactionMemorySize() { System.setProperty("jol.magicFieldOffset", "true");
diff --git hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayeredTransactionPoolBaseFeeTest.java optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayeredTransactionPoolBaseFeeTest.java index e30d88141110b9bd961bd26a3100186719692b6d..92e571f3548a9270124772c15f5df9eb9a4e4e8e 100644 --- hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayeredTransactionPoolBaseFeeTest.java +++ optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayeredTransactionPoolBaseFeeTest.java @@ -64,7 +64,7 @@ }   @Override protected FeeMarket getFeeMarket() { - return FeeMarket.london(0L, Optional.of(BASE_FEE_FLOOR)); + return FeeMarket.london(0L, Optional.of(BASE_FEE_FLOOR), Optional.empty()); }   @Override
diff --git hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/AbstractLegacyTransactionPoolTest.java optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/AbstractLegacyTransactionPoolTest.java index 1b35bd2651658340512ee01d9e6713fa11a56077..4980d49940ab042819f6f1b18e658b1e3d1c88be 100644 --- hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/AbstractLegacyTransactionPoolTest.java +++ optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/AbstractLegacyTransactionPoolTest.java @@ -18,6 +18,7 @@ import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.NONCE_TOO_LOW; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -37,7 +38,9 @@ @Test public void shouldNotAddRemoteTransactionsWhenThereIsALowestInvalidNonceForTheSender() { givenTransactionIsValid(transaction1); - when(transactionValidatorFactory.get().validate(eq(transaction0), any(Optional.class), any())) + when(transactionValidatorFactory + .get() + .validate(eq(transaction0), anyLong(), any(Optional.class), any())) .thenReturn(ValidationResult.invalid(NONCE_TOO_LOW));   transactionPool.addRemoteTransactions(asList(transaction0, transaction1));
diff --git hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/LegacyTransactionPoolBaseFeeTest.java optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/LegacyTransactionPoolBaseFeeTest.java index 96ea292e98385b4de75caf5826529b7490394fac..f48d50988022ebf15eaf36c8f6d7ce352063f0ab 100644 --- hyperledger/besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/LegacyTransactionPoolBaseFeeTest.java +++ optimism-java/op-besu/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/sorter/LegacyTransactionPoolBaseFeeTest.java @@ -68,7 +68,7 @@ }   @Override protected FeeMarket getFeeMarket() { - return FeeMarket.london(0L, Optional.of(BASE_FEE_FLOOR)); + return FeeMarket.london(0L, Optional.of(BASE_FEE_FLOOR), Optional.empty()); }   @Override
diff --git hyperledger/besu/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java optimism-java/op-besu/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java index bac137b2a58c4ecdde8c0911c6a6dbd775a38f71..9727c3d8feabff76e5510ef09a5eace1b421dbee 100644 --- hyperledger/besu/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java +++ optimism-java/op-besu/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java @@ -37,6 +37,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.OptionalLong; import java.util.stream.Collectors;   import com.fasterxml.jackson.annotation.JsonCreator; @@ -212,7 +213,8 @@ .computeBaseFee( number, Wei.fromHexString(parentBaseFee), Long.decode(parentGasUsed), - gasLimit / 2)); + gasLimit / 2, + OptionalLong.empty())); } if (difficulty == null && parentDifficulty != null) { builder.difficulty(
diff --git hyperledger/besu/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/core/TransactionTest.java optimism-java/op-besu/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/core/TransactionTest.java index d36a0b6a87d4bb12061daa913e11858afe5e570e..be7f44fc1825ba9d33bd82a8ea6d047496cbefc5 100644 --- hyperledger/besu/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/core/TransactionTest.java +++ optimism-java/op-besu/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/core/TransactionTest.java @@ -144,7 +144,7 @@ // Test transaction deserialization (will throw an exception if it fails). final Transaction transaction = Transaction.readFrom(RLP.input(rlp)); final ValidationResult<TransactionInvalidReason> validation = transactionValidator(milestone) - .validate(transaction, baseFee, TransactionValidationParams.processingBlock()); + .validate(transaction, 1,baseFee, TransactionValidationParams.processingBlock()); if (!validation.isValid()) { throw new RuntimeException( String.format(
diff --git hyperledger/besu/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java optimism-java/op-besu/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java index f4ad77740583d24483557de18d97ad351705a29c..07c2172f675706706ff48a8d3f155bb126237bc6 100644 --- hyperledger/besu/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java +++ optimism-java/op-besu/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/NoRewardProtocolScheduleWrapper.java @@ -51,7 +51,8 @@ original.getTransactionReceiptFactory(), Wei.ZERO, original.getMiningBeneficiaryCalculator(), original.isSkipZeroBlockRewards(), - delegate); + delegate, + Optional.empty()); final BlockValidator noRewardBlockValidator = new MainnetBlockValidator( original.getBlockHeaderValidator(),
diff --git hyperledger/besu/.circleci/config.yml optimism-java/op-besu/.circleci-nouse/config.yml rename from .circleci/config.yml rename to .circleci-nouse/config.yml
diff --git hyperledger/besu/.github/actions/capture_test_logs/action.yml optimism-java/op-besu/.github/actions/capture_test_logs/action.yml new file mode 100644 index 0000000000000000000000000000000000000000..f7b2a74a752e904cfce8fb38886002302026e216 --- /dev/null +++ optimism-java/op-besu/.github/actions/capture_test_logs/action.yml @@ -0,0 +1,11 @@ +name: capture_test_logs +description: "Capture test logs" +runs: + using: composite + steps: + - uses: actions/upload-artifact@v3.1.3 + with: + path: acceptance-tests/tests/build/acceptanceTestLogs + - uses: actions/upload-artifact@v3.1.3 + with: + path: acceptance-tests/tests/build/jvmErrorLogs \ No newline at end of file
diff --git hyperledger/besu/.github/actions/capture_test_results/action.yml optimism-java/op-besu/.github/actions/capture_test_results/action.yml new file mode 100644 index 0000000000000000000000000000000000000000..f5e23e518731c74cfe8d3e32559f961a7405b954 --- /dev/null +++ optimism-java/op-besu/.github/actions/capture_test_results/action.yml @@ -0,0 +1,26 @@ +name: capture_test_results +description: "Capture test results" +runs: + using: composite + steps: + - name: Jacoco + run: "./gradlew --no-daemon jacocoTestReport" + shell: bash + - name: Gather test results + run: |- + FILES=`find . -name test-results` + for FILE in $FILES + do + MODULE=`echo "$FILE" | sed -e 's@./\(.*\)/build/test-results@\1@'` + TARGET="build/test-results/$MODULE" + mkdir -p "$TARGET" + cp -rf ${FILE}/*/* "$TARGET" + done + if: always() + shell: bash + - uses: actions/upload-artifact@v3.1.3 + with: + path: build/test-results + - uses: actions/upload-artifact@v3.1.3 + with: + path: besu/build/reports/jacoco \ No newline at end of file
diff --git hyperledger/besu/.github/actions/prepare/action.yml optimism-java/op-besu/.github/actions/prepare/action.yml new file mode 100644 index 0000000000000000000000000000000000000000..265097087ba5dfeda8798495536dd2d7cada3671 --- /dev/null +++ optimism-java/op-besu/.github/actions/prepare/action.yml @@ -0,0 +1,14 @@ +name: prepare +description: "Prepare the environment for the build" +runs: + using: composite + steps: + - uses: actions/checkout@v4.1.0 + - name: Install Packages - LibSodium, nssdb + shell: bash + run: |- + sudo apt-get update + sudo apt-get install -y libsodium23 libsodium-dev libjemalloc-dev apt-transport-https haveged libnss3-tools + sudo service haveged restart + java --version + - uses: "./.github/actions/restore_gradle_cache" \ No newline at end of file
diff --git hyperledger/besu/.github/actions/restore_gradle_cache/action.yml optimism-java/op-besu/.github/actions/restore_gradle_cache/action.yml new file mode 100644 index 0000000000000000000000000000000000000000..10d80b0de83e6f5f9ee4724ff0af36061e6132d6 --- /dev/null +++ optimism-java/op-besu/.github/actions/restore_gradle_cache/action.yml @@ -0,0 +1,14 @@ +name: restore_gradle_cache +description: "Restore the gradle cache" +runs: + using: composite + steps: + - name: restore_cache + uses: actions/cache@v3.3.2 + with: + key: deps-{{ checksum "gradle/versions.gradle" }}-{{ .Branch }}-{{ .Revision }} + path: UPDATE_ME + restore-keys: |- + deps-{{ checksum "gradle/versions.gradle" }}-{{ .Branch }}-{{ .Revision }} + deps-{{ checksum "gradle/versions.gradle" }} + deps- \ No newline at end of file
diff --git hyperledger/besu/.github/nightly.yml optimism-java/op-besu/.github/nightly.yml new file mode 100644 index 0000000000000000000000000000000000000000..b497fbc28a9abadcb17c7b63819d26a260907b8a --- /dev/null +++ optimism-java/op-besu/.github/nightly.yml @@ -0,0 +1,51 @@ +#name: nightly +#on: +# schedule: +# - cron: 0 19 * * * +# # 'filters' was not transformed because there is no suitable equivalent in GitHub Actions +#jobs: +# assemble: +# runs-on: ubuntu-latest +# container: +# image: openjdk:17.0 +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - name: Assemble +# run: "./gradlew --no-daemon clean compileJava compileTestJava assemble" +# - name: save_cache +# uses: actions/cache@v3.3.2 +# with: +# path: |- +# .gradle +# ~/.gradle +# key: deps-{{ checksum "gradle/versions.gradle" }}-{{ .Branch }}-{{ .Revision }} +# - uses: actions/upload-artifact@v3.1.3 +# with: +# path: "~/project/./" +# - uses: actions/upload-artifact@v3.1.3 +# with: +# path: build/distributions +# dockerScan: +# runs-on: ubuntu-latest +# container: +# image: docker:stable-git +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/restore_gradle_cache" +## # 'setup_remote_docker' was not transformed because there is no suitable equivalent in GitHub Actions +# - name: Install trivy +# run: |- +# apk add --update-cache --upgrade curl bash +# curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin +# - name: Scan with trivy +# run: |- +# for FILE in $(ls docker) +# do +# if [[ $FILE == "test.sh" || $FILE == "tests" ]]; then +# continue +# fi +# docker pull -q "hyperledger/besu:develop-$FILE" +# trivy -q image --exit-code 1 --no-progress --severity HIGH,CRITICAL "hyperledger/besu:develop-$FILE" +# done +# shell: "/bin/sh"
diff --git hyperledger/besu/.github/workflows/checks.yml optimism-java/op-besu/.github/workflows/checks.yml index 9fdae30a99b28048dd6e8eafd28bbd5411f81a04..bb8f30bedf7739ce10e29b7200f9e1d101f148b1 100644 --- hyperledger/besu/.github/workflows/checks.yml +++ optimism-java/op-besu/.github/workflows/checks.yml @@ -1,13 +1,13 @@ name: checks on: push: - branches: [ main ] + branches: [ release-23.10.x, main ] pull_request: workflow_dispatch:   jobs: spotless: - runs-on: [besu-research-ubuntu-16] + runs-on: ubuntu-latest if: ${{ github.actor != 'dependabot[bot]' }} steps: - name: Checkout Repo @@ -21,7 +21,7 @@ cache: gradle - name: spotless run: ./gradlew --no-daemon --parallel clean spotlessCheck javadoc_17: - runs-on: [besu-research-ubuntu-8] + runs-on: ubuntu-latest if: ${{ github.actor != 'dependabot[bot]' }} steps: - name: Checkout Repo
diff --git hyperledger/besu/.github/workflows/codeql.yml optimism-java/op-besu/.github/workflows/codeql.yml index 100be39e0df0d151d60b523f8dc4bfa20b07ab00..b2d27a98192621e2da12dbc88faf549846ba61ba 100644 --- hyperledger/besu/.github/workflows/codeql.yml +++ optimism-java/op-besu/.github/workflows/codeql.yml @@ -13,9 +13,9 @@ name: "CodeQL"   on: push: - branches: [ main ] + branches: [ release-23.10.x, main ] pull_request: - branches: [ main ] + branches: [ release-23.10.x, main ] paths-ignore: - '**/*.json' - '**/*.md' @@ -24,7 +24,7 @@ - '**/*.txt' jobs: analyze: name: Analyze - runs-on: [besu-research-ubuntu-16] + runs-on: ubuntu-latest permissions: actions: read contents: read
diff --git hyperledger/besu/.github/workflows/dco-merge-group.yml optimism-java/op-besu/.github/workflows/dco-merge-group.yml index fee29b6c5d752d88097a9c7f3eb29e5326be698e..d47a16a6ccb16f164a65c2521e3c212027cc9c8c 100644 --- hyperledger/besu/.github/workflows/dco-merge-group.yml +++ optimism-java/op-besu/.github/workflows/dco-merge-group.yml @@ -4,7 +4,7 @@ merge_group:   jobs: dco: - runs-on: [besu-research-ubuntu-8] + runs-on: ubuntu-latest if: ${{ github.actor != 'dependabot[bot]' }} steps: - run: echo "This DCO job runs on merge_queue event and doesn't check PR contents"
diff --git hyperledger/besu/.github/workflows/dco.yml optimism-java/op-besu/.github/workflows/dco.yml index 5fa9931c77abbb40b3a54aedc956d3145302d493..4e5e70e18e6a41078a9e2d4fb41b9a0b3f96d18a 100644 --- hyperledger/besu/.github/workflows/dco.yml +++ optimism-java/op-besu/.github/workflows/dco.yml @@ -5,7 +5,7 @@ workflow_dispatch:   jobs: dco: - runs-on: [besu-research-ubuntu-8] + runs-on: ubuntu-latest if: ${{ github.actor != 'dependabot[bot]' }} steps: - run: echo "This DCO job runs on pull_request event and workflow_dispatch"
diff --git hyperledger/besu/.github/workflows/default.yml optimism-java/op-besu/.github/workflows/default.yml new file mode 100644 index 0000000000000000000000000000000000000000..ee6bf4885f78b00cf21a090c9fbc3d1f97722a05 --- /dev/null +++ optimism-java/op-besu/.github/workflows/default.yml @@ -0,0 +1,307 @@ +name: default +on: + push: + branches: + - release-23.10.x + - main + pull_request: +jobs: + assemble: + runs-on: ubuntu-latest + container: + image: cimg/openjdk:17.0 + steps: + - uses: actions/checkout@v4.1.0 + - uses: "./.github/actions/prepare" + - name: Assemble + run: "./gradlew --no-daemon clean compileJava compileTestJava assemble" + - name: save_cache + uses: actions/cache@v3.3.2 + with: + path: |- + .gradle + ~/.gradle + key: deps-{{ checksum "gradle/versions.gradle" }}-{{ .Branch }}-{{ .Revision }} + - uses: actions/upload-artifact@v3.1.3 + with: + path: build/assemble + - uses: actions/upload-artifact@v3.1.3 + with: + path: build/distributions + unitTests: + runs-on: ubuntu-latest + container: + image: cimg/openjdk:17.0 + needs: + - assemble + steps: + - uses: actions/checkout@v4.1.0 + - uses: "./.github/actions/prepare" + - uses: actions/download-artifact@v3.0.2 + with: + path: build/assemble + - name: Build + run: "./gradlew --no-daemon build -x test" + - uses: "./.github/actions/capture_test_results" +# testWindows: +# runs-on: windows-latest +# needs: +# - assemble +# steps: +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: build/assemble +# - name: Unzip Windows build +# run: |- +# cd build/distributions +# unzip besu-*.zip -d besu-tmp +# cd besu-tmp +# mv besu-* ../besu +# - name: Test Besu Windows executable +# run: |- +# build\distributions\besu\bin\besu.bat --help +# build\distributions\besu\bin\besu.bat --version + referenceTests: + runs-on: ubuntu-latest + container: + image: cimg/openjdk:17.0 + needs: + - assemble + steps: + - uses: actions/checkout@v4.1.0 + - uses: "./.github/actions/prepare" + - uses: actions/download-artifact@v3.0.2 + with: + path: build/assemble + - name: ReferenceTests + run: |- + git submodule update --init --recursive + ./gradlew --no-daemon referenceTest + - uses: "./.github/actions/capture_test_results" + integrationTests: + runs-on: ubuntu-latest + container: + image: cimg/openjdk:17.0 + needs: + - assemble + steps: + - uses: actions/checkout@v4.1.0 + - uses: "./.github/actions/prepare" + - uses: actions/download-artifact@v3.0.2 + with: + path: build/assemble + - name: IntegrationTests + run: "./gradlew --no-daemon integrationTest" + - name: CompileJmh + run: "./gradlew --no-daemon compileJmh" + - uses: "./.github/actions/capture_test_results" +# acceptanceTests: +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - assemble +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: build/assemble +# - name: AcceptanceTests (Mainnet) +# run: |- +# ./gradlew --no-daemon acceptanceTestMainnet +# - uses: "./.github/actions/capture_test_results" +# - uses: "./.github/actions/capture_test_logs" +# acceptanceTestsCliqueBft: +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - assemble +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: build/assemble +# - name: AcceptanceTests (Non-Mainnet) +# run: |- +# ./gradlew --no-daemon acceptanceTestCliqueBft +# - uses: "./.github/actions/capture_test_results" +# - uses: "./.github/actions/capture_test_logs" +# acceptanceTestsPrivacy: +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - assemble +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: build/assemble +# - name: AcceptanceTests (Non-Mainnet) +# run: |- +# ./gradlew --no-daemon acceptanceTestPrivacy +# - uses: "./.github/actions/capture_test_results" +# - uses: "./.github/actions/capture_test_logs" +# acceptanceTestsPermissioning: +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - assemble +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: build/assemble +# - name: AcceptanceTests (Non-Mainnet) +# run: |- +# ./gradlew --no-daemon acceptanceTestPermissioning +# - uses: "./.github/actions/capture_test_results" +# - uses: "./.github/actions/capture_test_logs" +# buildDocker: +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - assemble +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: build/assemble +## # 'setup_remote_docker' was not transformed because there is no suitable equivalent in GitHub Actions +# - name: hadoLint_openjdk_17 +# run: docker run --rm -i hadolint/hadolint < docker/openjdk-17/Dockerfile +# - name: hadoLint_openjdk_17_debug +# run: docker run --rm -i hadolint/hadolint < docker/openjdk-17-debug/Dockerfile +# - name: hadoLint_openjdk_latest +# run: docker run --rm -i hadolint/hadolint < docker/openjdk-latest/Dockerfile +# - name: hadoLint_graalvm +# run: docker run --rm -i hadolint/hadolint < docker/graalvm/Dockerfile +# - name: build image +# run: "./gradlew --no-daemon distDocker" +# - name: test image +# run: |- +# mkdir -p docker/reports +# curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.9/goss-linux-amd64 -o ./docker/tests/goss-linux-amd64 +# ./gradlew --no-daemon testDocker +# buildArm64Docker: +# runs-on: ubuntu-latest +# needs: +# - assemble +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: build/assemble +# - name: hadoLint_openjdk_17 +# run: docker run --rm -i hadolint/hadolint < docker/openjdk-17/Dockerfile +# - name: hadoLint_openjdk_latest +# run: docker run --rm -i hadolint/hadolint < docker/openjdk-latest/Dockerfile +# - name: hadoLint_graalvm +# run: docker run --rm -i hadolint/hadolint < docker/graalvm/Dockerfile +# - name: Java_17 +# run: |- +# sudo apt install -q --assume-yes openjdk-17-jre-headless openjdk-17-jdk-headless +# sudo update-java-alternatives -a +# - name: build image +# run: "./gradlew --no-daemon distDocker" +# - name: test image +# run: |- +# mkdir -p docker/reports +# curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.9/goss-linux-arm -o ./docker/tests/goss-linux-arm64 +# ./gradlew --no-daemon testDocker + +# publish: +# if: # GitHub does not currently support regular expressions inside if conditions +## github.ref == 'refs/heads/main' || github.ref == 'refs/heads//^release-.*/' +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - assemble +# - integrationTests +# - unitTests +# - acceptanceTests +# - referenceTests +# - buildDocker +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: "~/project" +# - name: Publish +# run: "./gradlew --no-daemon artifactoryPublish" +# publishDocker: +# if: # GitHub does not currently support regular expressions inside if conditions +## github.ref == 'refs/heads/main' || github.ref == 'refs/heads//^release-.*/' +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - assemble +# - integrationTests +# - unitTests +# - acceptanceTests +# - referenceTests +# - buildDocker +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: "~/project" +## # 'setup_remote_docker' was not transformed because there is no suitable equivalent in GitHub Actions +# - name: Publish Docker +# run: |- +# docker login --username "${DOCKER_USER_RW}" --password "${DOCKER_PASSWORD_RW}" +# ./gradlew --no-daemon "-Pbranch=${{ github.ref }}" dockerUpload +# publishArm64Docker: +# if: # GitHub does not currently support regular expressions inside if conditions +## github.ref == 'refs/heads/main' || github.ref == 'refs/heads//^release-.*/' +# runs-on: ubuntu-latest +# needs: +# - integrationTests +# - unitTests +# - acceptanceTests +# - referenceTests +# - buildArm64Docker +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +# - uses: actions/download-artifact@v3.0.2 +# with: +# path: "~/project" +# - name: Java_17 +# run: |- +# sudo apt install -q --assume-yes openjdk-17-jre-headless openjdk-17-jdk-headless +# sudo update-java-alternatives -a +# - name: Publish Docker +# run: |- +# docker login --username "${DOCKER_USER_RW}" --password "${DOCKER_PASSWORD_RW}" +# ./gradlew --no-daemon "-Pbranch=${{ github.ref }}" dockerUpload +# manifestDocker: +# if: # GitHub does not currently support regular expressions inside if conditions +## github.ref == 'refs/heads/main' || github.ref == 'refs/heads//^release-.*/' +# runs-on: ubuntu-latest +# container: +# image: cimg/openjdk:17.0 +# needs: +# - publishDocker +# - publishArm64Docker +# steps: +# - uses: actions/checkout@v4.1.0 +# - uses: "./.github/actions/prepare" +## # 'setup_remote_docker' was not transformed because there is no suitable equivalent in GitHub Actions +# - name: Create and publish docker manifest +# run: |- +# docker login --username "${DOCKER_USER_RW}" --password "${DOCKER_PASSWORD_RW}" +# ./gradlew --no-daemon "-Pbranch=${{ github.ref }}" --parallel manifestDocker
diff --git hyperledger/besu/.github/workflows/gradle-wrapper-validation.yml optimism-java/op-besu/.github/workflows/gradle-wrapper-validation.yml index 2be77e8c2ea752605dce2ec5c1e0d5d24c4433ed..24a1c4ff4e8526d7110151ace2aff10f8ec57f45 100644 --- hyperledger/besu/.github/workflows/gradle-wrapper-validation.yml +++ optimism-java/op-besu/.github/workflows/gradle-wrapper-validation.yml @@ -5,7 +5,7 @@ jobs: validation: name: "Gradle Wrapper Validation" - runs-on: [besu-research-ubuntu-8] + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: gradle/wrapper-validation-action@v1
diff --git hyperledger/besu/.github/workflows/pages.yaml optimism-java/op-besu/.github/workflows/pages.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fbf25225081133ba8951e81133be3795ce11cc8f --- /dev/null +++ optimism-java/op-besu/.github/workflows/pages.yaml @@ -0,0 +1,36 @@ +name: Build and publish forkdiff github-pages +permissions: + contents: write +on: + push: + branches: + - release-23.10.x +jobs: + deploy: + concurrency: ci-${{ github.ref }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 500 # make sure to fetch the old commit we diff against + + - name: Build forkdiff + uses: "docker://protolambda/forkdiff:latest" + with: + args: -repo=/github/workspace -fork=/github/workspace/fork.yaml -out=/github/workspace/index.html + + - name: Build pages + run: | + mkdir -p tmp/pages + mv index.html tmp/pages/index.html + touch tmp/pages/.nojekyll + if [ "$GITHUB_REPOSITORY" == "optimism-java/op-besu" ]; then + echo "op-besu.github.io" > tmp/pages/CNAME + fi; + + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: tmp/pages + clean: true
diff --git hyperledger/besu/.github/workflows/pr-checklist-on-open.yml optimism-java/op-besu/.github/workflows/pr-checklist-on-open.yml index 3a4d4342c5847363c326ebd669cc6fce3adc8959..b8ac94efaef3dc06f02f106716c38974b0a69d7b 100644 --- hyperledger/besu/.github/workflows/pr-checklist-on-open.yml +++ optimism-java/op-besu/.github/workflows/pr-checklist-on-open.yml @@ -2,11 +2,11 @@ name: "comment on pr with checklist" on: pull_request_target: types: [ opened ] - branches: [ main ] + branches: [ release-23.10.x, main ] jobs: checklist: name: "add checklist as a comment on newly opened PRs" - runs-on: [besu-research-ubuntu-8] + runs-on: ubuntu-latest steps: - uses: actions/github-script@v5 with:
diff --git hyperledger/besu/.github/workflows/release.yml optimism-java/op-besu/.github/workflows/release.yml index 5c9b232820887bc7fef6deded818f50322f4c6b8..35b74bbfd049b7a81c19cdae2c7f5cf582291250 100644 --- hyperledger/besu/.github/workflows/release.yml +++ optimism-java/op-besu/.github/workflows/release.yml @@ -4,7 +4,7 @@ release: types: released jobs: dockerPromoteX64: - runs-on: [besu-research-ubuntu-16] + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-java@v3
diff --git hyperledger/besu/.github/workflows/repolinter.yml optimism-java/op-besu/.github/workflows/repolinter.yml index e1c61cadea8946ea29d81be95f99bdbc9a2dc891..9440951f0328f7169161b0c46bb609c58af2f497 100644 --- hyperledger/besu/.github/workflows/repolinter.yml +++ optimism-java/op-besu/.github/workflows/repolinter.yml @@ -8,14 +8,16 @@ push: branches: - master - main + - release-23.10.x pull_request: branches: - master - main + - release-23.10.x   jobs: build: - runs-on: [besu-research-ubuntu-16] + runs-on: ubuntu-latest container: ghcr.io/todogroup/repolinter:v0.10.1 steps: - name: Checkout Code
diff --git hyperledger/besu/.github/workflows/sonarcloud.yml optimism-java/op-besu/.github/workflows/sonarcloud.yml index e3a6e088e06cc5fff91091bdf190569c805b6a54..2fee53a12a5d7fa26e84940582696c876d8292f8 100644 --- hyperledger/besu/.github/workflows/sonarcloud.yml +++ optimism-java/op-besu/.github/workflows/sonarcloud.yml @@ -14,7 +14,7 @@ jobs: Analysis: runs-on: ubuntu-latest - if: github.repository == 'hyperledger/besu' + if: github.repository == 'optimism-java/op-besu' steps: - name: checkout uses: actions/checkout@v3
diff --git hyperledger/besu/fork.yaml optimism-java/op-besu/fork.yaml new file mode 100644 index 0000000000000000000000000000000000000000..401ba5e84ec3f778af7ec049ef71a6f259da48a4 --- /dev/null +++ optimism-java/op-besu/fork.yaml @@ -0,0 +1,163 @@ +title: "op-besu" # Define the HTML page title +footer: | # define the footer with markdown + Fork-diff overview of [op-besu](https://github.com/optimism-java/op-besu), a fork of [besu](https://github.com/hyperledger/besu). and execution-engine of the [OP Stack](https://github.com/ethereum-optimism/optimism). +base: + name: hyperledger/besu + url: https://github.com/hyperledger/besu + hash: 287f0c206e8ac668ffb5ec908128724b6338a294 +fork: + name: optimism-java/op-besu + url: https://github.com/optimism-java/op-besu + ref: refs/heads/release-23.10.x +def: + title: "op-besu" + description: | # description in markdown + This is an overview of the changes in [op-besu](https://github.com/optimism-java/op-besu), a fork of [besu](https://github.com/hyperledger/besu), part of the OP Stack. + + Related [op-stack specifications](https://github.com/ethereum-optimism/optimism/tree/develop/specs): + + - [L2 Execution Engine spec](https://github.com/ethereum-optimism/optimism/blob/develop/specs/exec-engine.md) + - [Deposit Transaction spec](https://github.com/ethereum-optimism/optimism/blob/develop/specs/deposits.md) + + sub: + - title: "Core modifications" + sub: + - title: "Transition modifications" + sub: + - title: "Deposit transaction type" + description: | + The Bedrock upgrade introduces a Deposit transaction-type (0x7E) to enable both users and the rollup system itself to change the L2 state based on L1 events and system rules as [specified](https://github.com/ethereum-optimism/optimism/blob/develop/specs/deposits.md). + globs: + - "datatypes/src/main/java/org/hyperledger/besu/datatypes/Transaction.java" + - "datatypes/src/main/java/org/hyperledger/besu/datatypes/TransactionType.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionDecoder.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/OptimismDepositTransactionEncoder.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionDecoder.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/TransactionEncoder.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/TransactionReceipt.java" + - title: "L1 cost computation" + description: | + Transactions must pay an additional L1 cost based on the amount of rollup-data-gas they consume, + estimated based on gas-price-oracle information and encoded tx size." + globs: + - "datatypes/src/main/java/org/hyperledger/besu/datatypes/RollupGasData.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/L1CostCalculator.java" + - title: "Transaction processing" + description: | + Deposit transactions have special processing rules: gas is pre-paid on L1, + and deposits with EVM-failure are included with rolled back changes (except mint). + For regular transactions, at the end of the transition, the 1559 burn and L1 cost are routed to vaults. + globs: + - "ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/layered/BaseFeePrioritizedTransactions.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetBlockProcessor.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicBlockProcessor.java" + - "evm/src/main/java/org/hyperledger/besu/evm/frame/MessageFrame.java" + - title: "Gaslimit" + description: | + The gaslimit is free to be set by the Engine API caller, instead of enforcing adjustments of the + gaslimit in increments of 1/1024 of the previous gaslimit. + The gaslimit is changed (and limited) through the `SystemConfig` contract. + globs: + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFee.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/BaseFeeMarket.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/CancunFeeMarket.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/FeeMarket.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/LondonFeeMarket.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/feemarket/ZeroBaseFeeMarket.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthFeeHistory.java" + - title: "Block Creation modifications" + description: | + The block creation code implements the changes to support the transaction-inclusion, + tx-pool toggle and gaslimit parameters of the Engine API. + globs: + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java" + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java" + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeBlockCreator.java" + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifier.java" + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java" + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeContext.java" + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java" + - "consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/TransitionContext.java" + - "ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPool.java" + - "ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java" + - "ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/txselection/BlockTransactionSelector.java" + - "ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java" + - title: "Validation modifications" + description: | + The block validation and transaction validation modifications. + globs: + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/BaseFeeMarketBlockHeaderGasPriceValidationRule.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BaseFeeBlockBodyValidator.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/BodyValidation.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/PermissionTransactionValidator.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidator.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/TransactionValidatorFactory.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/transaction/TransactionInvalidReason.java" + - title: "Engine API modifications" + description: | + The Engine API is extended to insert transactions into the block and optionally exclude the tx-pool, + to reproduce the exact block of the sequencer from just the inputs, as derived from L1 by the rollup-node. + See [L2 execution engine specs](https://github.com/ethereum-optimism/optimism/blob/develop/specs/exec-engine.md). + globs: + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EnginePreparePayloadDebug.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV3.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadAttributesParameter.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePreparePayloadParameter.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionCompleteResult.java" + - "ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/TransactionReceiptResult.java" + - title: "Deploys Create2 Deployer Contract" + description: | + The Create2 Deployer contract is used to deploy contracts to the L2. + It is used by the sequencer to deploy the sequencer contract. + globs: + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/Create2DeployerFunction.java" + - title: "Chain Configuration" + sub: + - title: "Chain config" + description: | + The rollup functionality is enabled with the `optimism` field in the chain config. + The EIP-1559 parameters are configurable to adjust for faster more frequent and smaller blocks. + The parameters can be overriden for testing. + globs: + - "config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java" + - "config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java" + - "config/src/main/java/org/hyperledger/besu/config/OptimismConfigOptions.java" + - title: "Node Configuration" + sub: + - title: "Controller modifications" + description: | + Changes to the node configuration and services. + globs: + - "besu/src/main/java/org/hyperledger/besu/controller/BesuController.java" + - "besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java" + - title: "Spec Builder" + description: | + The Spec Builder is extended to support the new transaction type and the new EIP-1559 parameters for the `optimism`. + globs: + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java" + - "ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java" + + + +# files can be ignored globally, these will be listed in a separate grayed-out section, +# and do not count towards the total line count. +ignore: + - "*.sum" + - ".gitignore" + - ".github/**/*" + - ".github/actions/**/*.yml" + - ".circleci/**/*" + - ".circleci-nouse/**/*" + - "gradle/*" + - "**/*.yml" + - "fork.yaml" + - "Dockerfile" + - "README.md"
diff --git hyperledger/besu/gradle/verification-metadata.xml optimism-java/op-besu/gradle/verification-metadata.xml index 39a5dccc2176aea3efc5d44afa0ff491746c8751..26559e31faec7f6d70c278067aa35436de2caa88 100644 --- hyperledger/besu/gradle/verification-metadata.xml +++ optimism-java/op-besu/gradle/verification-metadata.xml @@ -361,6 +361,17 @@ <artifact name="caffeine-3.1.5.pom"> <sha256 value="a2983b2212090f5256b1e944cdad09f8f4e8f94cef17545ecab9063ea593c34b" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.github.ben-manes.caffeine" name="caffeine" version="3.1.8"> + <artifact name="caffeine-3.1.8.jar"> + <sha256 value="7dd15f9df1be238ffaa367ce6f556737a88031de4294dad18eef57c474ddf1d3" origin="Generated by Gradle"/> + </artifact> + <artifact name="caffeine-3.1.8.module"> + <sha256 value="49acd4cf81be1e4e868054f0d34fcf5c775608459507307ce878cdba4fdd4d84" origin="Generated by Gradle"/> + </artifact> + <artifact name="caffeine-3.1.8.pom"> + <sha256 value="463f4f89638aae82c654b3f2842e8d03f7a0d48194c426046dd9c95ce06326ee" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.github.ben-manes.versions" name="com.github.ben-manes.versions.gradle.plugin" version="0.42.0"> <artifact name="com.github.ben-manes.versions.gradle.plugin-0.42.0.pom"> <sha256 value="a4c4795a89c5e9c9731b613b81c56b6b58e87f76fdbf7004163d9b908021f97d" origin="Generated by Gradle"/> @@ -587,6 +598,14 @@ <artifact name="annotations-4.1.1.4.pom"> <sha256 value="e4bb54753c36a27a0e5d70154a5034fedd8feac4282295034bfd483d6c7aae78" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.api.grpc" name="proto-google-common-protos" version="2.22.0"> + <artifact name="proto-google-common-protos-2.22.0.jar"> + <sha256 value="002eebc53d27e4fb2e8cf823ea1f3565b90c4b0b4380ff508bf61bd42f2be0d3" origin="Generated by Gradle"/> + </artifact> + <artifact name="proto-google-common-protos-2.22.0.pom"> + <sha256 value="e3027e37e4d0f23ab1a2a3ce00347137724ed8a4e45499edca45ab354e5ddafb" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.api.grpc" name="proto-google-common-protos" version="2.9.0"> <artifact name="proto-google-common-protos-2.9.0.jar"> <sha256 value="0d830380ec66bd7e25eee63aa0a5a08578e46ad187fb72d99b44d9ba22827f91" origin="Generated by Gradle"/> @@ -661,12 +680,25 @@ <artifact name="auto-value-1.7.4.pom"> <sha256 value="70a2b5ff99a965e826bd150fb3fc3e230e7b83f22594c48251f2eb93d25cd47e" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.auto.value" name="auto-value-annotations" version="1.10.2"> + <artifact name="auto-value-annotations-1.10.2.jar"> + <sha256 value="3f3b7edfaf7fbbd88642f7bd5b09487b8dcf2b9e5f3a19f1eb7b3e53f20f14ba" origin="Generated by Gradle"/> + </artifact> + <artifact name="auto-value-annotations-1.10.2.pom"> + <sha256 value="724f95ecd445a300c4c77f4b20753ec5edab70b9ad8751decf709c81650a7721" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.auto.value" name="auto-value-annotations" version="1.9"> <artifact name="auto-value-annotations-1.9.jar"> <sha256 value="fa5469f4c44ee598a2d8f033ab0a9dcbc6498a0c5e0c998dfa0c2adf51358044" origin="Generated by Gradle"/> </artifact> <artifact name="auto-value-annotations-1.9.pom"> <sha256 value="9220a3dabe75c79334f061b0e40df833448666bac28a8b823bc1e8fd52f8c98a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.auto.value" name="auto-value-parent" version="1.10.2"> + <artifact name="auto-value-parent-1.10.2.pom"> + <sha256 value="91d6b3e515f88caa1bc05caab1bbdc894ff6edd63549ef0f09a5584c9793ee69" origin="Generated by Gradle"/> </artifact> </component> <component group="com.google.auto.value" name="auto-value-parent" version="1.7.4"> @@ -793,6 +825,22 @@ <artifact name="error_prone_annotations-2.18.0.pom"> <sha256 value="920135797dcca5917b5a5c017642a58d340a4cd1bcd12f56f892a5663bd7bddc" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.errorprone" name="error_prone_annotations" version="2.20.0"> + <artifact name="error_prone_annotations-2.20.0.jar"> + <sha256 value="a136d3dce67168d88751115fa223bec80eae6cc062aa2f8173e8344a98235ec4" origin="Generated by Gradle"/> + </artifact> + <artifact name="error_prone_annotations-2.20.0.pom"> + <sha256 value="94f50653af659be1d1a0d785f97cba768571f794d2e655fc3d22e4eee6512b39" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_annotations" version="2.21.1"> + <artifact name="error_prone_annotations-2.21.1.jar"> + <sha256 value="d1f3c66aa91ac52549e00ae3b208ba4b9af7d72d68f230643553beb38e6118ac" origin="Generated by Gradle"/> + </artifact> + <artifact name="error_prone_annotations-2.21.1.pom"> + <sha256 value="f598880feefaea9d674dc41db13ab37004bf03776b5bb21c04dede8e920c1f12" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.errorprone" name="error_prone_annotations" version="2.3.4"> <artifact name="error_prone_annotations-2.3.4.jar"> <sha256 value="baf7d6ea97ce606c53e11b6854ba5f2ce7ef5c24dddf0afa18d1260bd25b002c" origin="Generated by Gradle"/> @@ -830,6 +878,16 @@ </component> <component group="com.google.errorprone" name="error_prone_parent" version="2.18.0"> <artifact name="error_prone_parent-2.18.0.pom"> <sha256 value="47f22e99c7bf466391def16f8377985e5d3ba6f5bbcf65853644805513e15fad" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_parent" version="2.20.0"> + <artifact name="error_prone_parent-2.20.0.pom"> + <sha256 value="e0b8bc77fc794d22d50aa4851896d8202a616610161b13cbff2a148ff1e102c2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_parent" version="2.21.1"> + <artifact name="error_prone_parent-2.21.1.pom"> + <sha256 value="32bb0b5ff241fd6ba1feea448aebb9cedef1699be73cb6f319365387b82bf92c" origin="Generated by Gradle"/> </artifact> </component> <component group="com.google.errorprone" name="error_prone_parent" version="2.3.4"> @@ -981,6 +1039,14 @@ <artifact name="j2objc-annotations-1.3.pom"> <sha256 value="5faca824ba115bee458730337dfdb2fcea46ba2fd774d4304edbf30fa6a3f055" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.j2objc" name="j2objc-annotations" version="2.8"> + <artifact name="j2objc-annotations-2.8.jar"> + <sha256 value="f02a95fa1a5e95edb3ed859fd0fb7df709d121a35290eff8b74dce2ab7f4d6ed" origin="Generated by Gradle"/> + </artifact> + <artifact name="j2objc-annotations-2.8.pom"> + <sha256 value="37f87798b18385113c918bfa9e1276fe50735ef8fa849b5800c519d54dbf11f8" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.jimfs" name="jimfs" version="1.2"> <artifact name="jimfs-1.2.jar"> <sha256 value="de16d5c8489729a8512f1a02fbd81f58f89249b72066987da4cc5c87ecb9f72d" origin="Generated by Gradle"/> @@ -1014,6 +1080,11 @@ <artifact name="protobuf-bom-3.22.0.pom"> <sha256 value="c19eba1f4897afe5d5926d68e19f2c2986752e459cfa9c5925e57290d9217add" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.protobuf" name="protobuf-bom" version="3.24.0"> + <artifact name="protobuf-bom-3.24.0.pom"> + <sha256 value="3b0b372353011f2a7d7b167fe6dd769eb1b90870494f73e4b93654082f85250c" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.protobuf" name="protobuf-java" version="3.19.2"> <artifact name="protobuf-java-3.19.2.jar"> <sha256 value="3446cbfa13795228bc6549b91a409f27cdf6913d1c8f03e0f99572988623a04b" origin="Generated by Gradle"/> @@ -1043,6 +1114,14 @@ <artifact name="protobuf-java-3.22.0.pom"> <sha256 value="7ef79a4915167d42f785c1b16b60e48af15df3dd017289fa1e10e494e9eee3e3" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.protobuf" name="protobuf-java" version="3.24.0"> + <artifact name="protobuf-java-3.24.0.jar"> + <sha256 value="60e27148de168286dd441fa66f96cc8d91b7672c8a5caad631f966f406b10071" origin="Generated by Gradle"/> + </artifact> + <artifact name="protobuf-java-3.24.0.pom"> + <sha256 value="aa40323af7c25a959f38a062d5774385ace5c7098a9ffd610aa7c1f378a094cc" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.protobuf" name="protobuf-java-util" version="3.21.7"> <artifact name="protobuf-java-util-3.21.7.jar"> <sha256 value="9b98a2a4eb9ebc6103b14ab81badb82e32c8fe1d751aa4055830424974b7e142" origin="Generated by Gradle"/> @@ -1051,6 +1130,14 @@ <artifact name="protobuf-java-util-3.21.7.pom"> <sha256 value="9eb3215eb179ca80b5888b34e0e37400f133fc608b1cbb559cff384eeae5882b" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.protobuf" name="protobuf-java-util" version="3.24.0"> + <artifact name="protobuf-java-util-3.24.0.jar"> + <sha256 value="fade64f5f877a1fa6cc4fd308120d72ace7048a2c9bf740298f82f05b9f56843" origin="Generated by Gradle"/> + </artifact> + <artifact name="protobuf-java-util-3.24.0.pom"> + <sha256 value="e06bbf629c40104e9b8519cb2426c186ddb2cb28470646bc623edd2d064c97b5" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.protobuf" name="protobuf-parent" version="3.19.2"> <artifact name="protobuf-parent-3.19.2.pom"> <sha256 value="25395819097bcac83a43eac8bc2a76681c85869ac9799111204d650d7df0c086" origin="Generated by Gradle"/> @@ -1071,6 +1158,11 @@ <artifact name="protobuf-parent-3.22.0.pom"> <sha256 value="1b0229a3bbfef37b025d0d8d7ab369393e7128dabb809023681d1ecccf789020" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.protobuf" name="protobuf-parent" version="3.24.0"> + <artifact name="protobuf-parent-3.24.0.pom"> + <sha256 value="226b7f704a9c865ecf778054f7611f0b2c17c6d8e3b6585d911f07d1255bd398" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.re2j" name="re2j" version="1.6"> <artifact name="re2j-1.6.jar"> <sha256 value="c8b5c3472d4db594a865b2e47f835d07fb8b1415eeba559dccfb0a6945f033cd" origin="Generated by Gradle"/> @@ -1079,6 +1171,14 @@ <artifact name="re2j-1.6.pom"> <sha256 value="0cbec23bc82fb900eb5eb62c5fc2cb5e239b78a0eb765ebb08e6f05fa615803a" origin="Generated by Gradle"/> </artifact> </component> + <component group="com.google.re2j" name="re2j" version="1.7"> + <artifact name="re2j-1.7.jar"> + <sha256 value="4f657af51ab8bb0909bcc3eb40862d26125af8cbcf92aaaba595fed77f947bc0" origin="Generated by Gradle"/> + </artifact> + <artifact name="re2j-1.7.pom"> + <sha256 value="8bb0b7ae941f572cc49c7d0315da477fcf701c59193c96a5a8fe2d59c0957a9a" origin="Generated by Gradle"/> + </artifact> + </component> <component group="com.google.testing.compile" name="compile-testing" version="0.19"> <artifact name="compile-testing-0.19.jar"> <sha256 value="ffe9e7ac95165ff350fc12b100c51334cd78d205b86c7147340a117296e2a9cd" origin="Generated by Gradle"/> @@ -1464,6 +1564,14 @@ <artifact name="grpc-all-1.53.0.pom"> <sha256 value="8c296dcff48dd6ff8ece23b2b423bb2d34302b46d2823e24a547e351c974ebac" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-all" version="1.59.0"> + <artifact name="grpc-all-1.59.0.jar"> + <sha256 value="3df01e019a32e8103d58c4f988f4eb1be89b9f3d50e322d70930f9c80e19b0e0" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-all-1.59.0.pom"> + <sha256 value="4058773c6e32a247814447421a5c05b38a1cde4c89313077d8debaa4a654309c" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-alts" version="1.53.0"> <artifact name="grpc-alts-1.53.0.jar"> <sha256 value="d9eff09dbfc5aa7052ef41d393137fc46de335e922b8925f5303ef3e151a3318" origin="Generated by Gradle"/> @@ -1472,6 +1580,14 @@ <artifact name="grpc-alts-1.53.0.pom"> <sha256 value="760e1075b59d0213fb4634f003cb4331dd566b63dbec75204427bb0c5cae4504" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-alts" version="1.59.0"> + <artifact name="grpc-alts-1.59.0.jar"> + <sha256 value="e48fa191d91d220fa41a5b3f91f6ee1c57251f481eb2986310e258985f6dbb51" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-alts-1.59.0.pom"> + <sha256 value="55693398216ba66f8420770fdd59749435b2c2e23345aa5cfbaaa69b05af693f" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-api" version="1.53.0"> <artifact name="grpc-api-1.53.0.jar"> <sha256 value="a86967728b17b4edf3c02dbd5011b2e7e323c0b7dd1de899925ca06543467625" origin="Generated by Gradle"/> @@ -1480,6 +1596,14 @@ <artifact name="grpc-api-1.53.0.pom"> <sha256 value="b83bf0bf7a7d19def9289e4415f1b1c0bb51d44e16a0ac955877915d6ea693aa" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-api" version="1.59.0"> + <artifact name="grpc-api-1.59.0.jar"> + <sha256 value="67353a1907d3d3ae14c4cb5f58c0c494189bc0ff9ee7159021ff614996961c99" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-api-1.59.0.pom"> + <sha256 value="f439b0f1f5ee63732f0179c1455d8e1ea492a8342fd0db11bc0df7c88d511372" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-auth" version="1.53.0"> <artifact name="grpc-auth-1.53.0.jar"> <sha256 value="9a9b8c40301a2c7c5427917306c05b86e1dab85a484d76bff934c369917d2015" origin="Generated by Gradle"/> @@ -1488,6 +1612,22 @@ <artifact name="grpc-auth-1.53.0.pom"> <sha256 value="721334ecdb5db68532722ecbf1550c3dfe05d16a325071be09be3e8c615dca07" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-auth" version="1.59.0"> + <artifact name="grpc-auth-1.59.0.jar"> + <sha256 value="afe5a43d4045825b98379beb562d70522b80fac3052ebd143fa429e49a7ed1a6" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-auth-1.59.0.pom"> + <sha256 value="802da5d4011e8bdb082f7c251c3be258e6f1bcfc20443c178876d326d04366e1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-context" version="1.27.2"> + <artifact name="grpc-context-1.27.2.jar"> + <sha256 value="bcbf9055dff453fd6508bd7cca2a0aa2d5f059a9c94beed1f5fda1dc015607b8" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-context-1.27.2.pom"> + <sha256 value="0f212b14ebd834cbed9bd8869a5d6c9c1798eceb512c7fcc28da89f6f8a4edd8" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-context" version="1.53.0"> <artifact name="grpc-context-1.53.0.jar"> <sha256 value="2a6431b5e7bca085b5abd844e30f1270e070c1a179d06b2ea3f83d5f60cc251a" origin="Generated by Gradle"/> @@ -1496,6 +1636,14 @@ <artifact name="grpc-context-1.53.0.pom"> <sha256 value="12e2ad8fc93d7ec127c4d0bef76b8f609f5cd667c5fa1e0746aa311d83a49502" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-context" version="1.59.0"> + <artifact name="grpc-context-1.59.0.jar"> + <sha256 value="5dd49d14dab19a11afe74d7a698173d8ff854f72cb033c52baad169fa6bc65ee" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-context-1.59.0.pom"> + <sha256 value="f3d422798ce3605d017cdaa1dd0063fe27f596a69de77981761a09d4a25913b5" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-core" version="1.53.0"> <artifact name="grpc-core-1.53.0.jar"> <sha256 value="0077b9ff9a3b1a6ba3fad2e559c821e8f5176981068a6923647c7486b598aa03" origin="Generated by Gradle"/> @@ -1504,6 +1652,14 @@ <artifact name="grpc-core-1.53.0.pom"> <sha256 value="496c0f426a171c14b1f259d774e0cfa451b3f16d35aec0dd250c28e437a3d5e6" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-core" version="1.59.0"> + <artifact name="grpc-core-1.59.0.jar"> + <sha256 value="1144cb9cd08e45cabab7621ae1417b3fc237a745a5648fc11ccaf77c7b456ad2" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-core-1.59.0.pom"> + <sha256 value="0d6867eaad76fa7b8d3485da0149b01c13baccdb401a0c2cd6d6adce73fdc4fe" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-grpclb" version="1.53.0"> <artifact name="grpc-grpclb-1.53.0.jar"> <sha256 value="e30ddfa4e71b624b69c586b6f2a9a8a96313c468e251ba61911743005b9b8e0b" origin="Generated by Gradle"/> @@ -1512,6 +1668,22 @@ <artifact name="grpc-grpclb-1.53.0.pom"> <sha256 value="8c5312b6d38299314a5d976598804d61c3c39cb01a93946274d16065d58e29dc" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-grpclb" version="1.59.0"> + <artifact name="grpc-grpclb-1.59.0.jar"> + <sha256 value="f96201364385051c15e02c69dc23d10031dbaa0b40ebff322df3dd0afca5949a" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-grpclb-1.59.0.pom"> + <sha256 value="6439ed2ad58699cd50d9f26e412554f5d02a2912f9a8cbcb65cf4a20488e1e58" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-inprocess" version="1.59.0"> + <artifact name="grpc-inprocess-1.59.0.jar"> + <sha256 value="07309340c43ac0cc404421aea2bba6c51cfe7e2b43b52f6928620676f70fa1e7" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-inprocess-1.59.0.pom"> + <sha256 value="b8fc5289a561de4d8aa7f29b21bcee49b41255b88d3f111836e800b92ea96da9" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-netty" version="1.53.0"> <artifact name="grpc-netty-1.53.0.jar"> <sha256 value="582c5bc57d5e3aa6169dee2618561ec63779a2cdbd5e076de9a0998cd5357c4b" origin="Generated by Gradle"/> @@ -1520,6 +1692,14 @@ <artifact name="grpc-netty-1.53.0.pom"> <sha256 value="141217f2d9c2c94c30637d5d873cfeeaa6d336c220c3d085359f190aacb1e0bf" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-netty" version="1.59.0"> + <artifact name="grpc-netty-1.59.0.jar"> + <sha256 value="e9cf7012fda14413833f881fbbdc90692c1cbc77a5f59e8631e5e0bc501f23e4" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-netty-1.59.0.pom"> + <sha256 value="c98922938a1324d2f699fd9a902825e365c1343e09b8e00a0bfb2c6af9e16119" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-netty-shaded" version="1.53.0"> <artifact name="grpc-netty-shaded-1.53.0.jar"> <sha256 value="516f3879970d5526af4651d220d2b776f370ecdeb0bd9f6badbe4be88692fea2" origin="Generated by Gradle"/> @@ -1528,6 +1708,14 @@ <artifact name="grpc-netty-shaded-1.53.0.pom"> <sha256 value="30af650ed4448b3b08454f8c81dea8319055bd88dc8c1ff520fad3fbca4c0662" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-netty-shaded" version="1.59.0"> + <artifact name="grpc-netty-shaded-1.59.0.jar"> + <sha256 value="0eb6f53b3f7461367eb0cafb40398209b26de685916369af977b11395799c3a5" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-netty-shaded-1.59.0.pom"> + <sha256 value="04f4846124afcb78c7cb82a5542f039d8d732511af2072f3a5cf82f334e7bc77" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-okhttp" version="1.53.0"> <artifact name="grpc-okhttp-1.53.0.jar"> <sha256 value="3578d84f3e7e791ab837a9ed2639396c44aa55f27170977c486e6e908a7f7dce" origin="Generated by Gradle"/> @@ -1536,6 +1724,14 @@ <artifact name="grpc-okhttp-1.53.0.pom"> <sha256 value="83cfb3e77601b1ffe12102052f9abfc6372c13dfb2e4cbf9118aadad8a374cb9" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-okhttp" version="1.59.0"> + <artifact name="grpc-okhttp-1.59.0.jar"> + <sha256 value="f7e41a48051393a4e8bea816272907354f933748ec27b044308ab2c01ce1dd4e" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-okhttp-1.59.0.pom"> + <sha256 value="355f0a8c88bb932a12f2c6f9e0118b4c258cd65002197a476c06bcf8d3b1b5f8" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-protobuf" version="1.53.0"> <artifact name="grpc-protobuf-1.53.0.jar"> <sha256 value="eb3c2107f6a6397d9c09179e814e2c6ebc5ff901d67bbf76588e8ef5bb51ca05" origin="Generated by Gradle"/> @@ -1544,6 +1740,14 @@ <artifact name="grpc-protobuf-1.53.0.pom"> <sha256 value="de7d9f114c48a55419cb6eec1acf9cdc653460c6907a3c724a2921afb230dfd3" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-protobuf" version="1.59.0"> + <artifact name="grpc-protobuf-1.59.0.jar"> + <sha256 value="1f47b27d79addc2831445867c26cee175b2fc8c52f989d926f0de68a7b32fae7" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-protobuf-1.59.0.pom"> + <sha256 value="ca2079a72b778a23c78c2de6828c037c4acfa832632bfc8cdb6c57e0e041190f" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-protobuf-lite" version="1.53.0"> <artifact name="grpc-protobuf-lite-1.53.0.jar"> <sha256 value="0e0b234188894ae282f770f85f717f3a2376b5afb5f80c00d664de22fa6cdaa8" origin="Generated by Gradle"/> @@ -1552,6 +1756,14 @@ <artifact name="grpc-protobuf-lite-1.53.0.pom"> <sha256 value="7abf2fc2a65c5003839f4592077c1273250e966a6f3397fae6221f354de1dea1" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-protobuf-lite" version="1.59.0"> + <artifact name="grpc-protobuf-lite-1.59.0.jar"> + <sha256 value="27a255dad0db1ff8b1cbff2b0364bd5f541035eafdf5a86e2013513bc1875d5f" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-protobuf-lite-1.59.0.pom"> + <sha256 value="f133d549906f6cb3cbdd5fbe008b5697f8bc8797c3010348af66a569233a88b5" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-rls" version="1.53.0"> <artifact name="grpc-rls-1.53.0.jar"> <sha256 value="d30435485c3a8b741202f8b9aeb1151345f57a041770d4555fcd7b7171a54307" origin="Generated by Gradle"/> @@ -1560,6 +1772,14 @@ <artifact name="grpc-rls-1.53.0.pom"> <sha256 value="d9330ace9f54fe4757b0da87e803d3102a97f97a1c266a075276ebe8592aeaff" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-rls" version="1.59.0"> + <artifact name="grpc-rls-1.59.0.jar"> + <sha256 value="f9b1ec6250b9dd42f078dc9ab22f3668ef90d57256e5180bd95d1de1cab4ace8" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-rls-1.59.0.pom"> + <sha256 value="cbf1737d3148bb2dd930e805915514b85c29eeae70481aedb0e6a31285bf369e" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-services" version="1.53.0"> <artifact name="grpc-services-1.53.0.jar"> <sha256 value="651fd21c9064df117a0896b859821fd26207e5c80dd3361ea8b167492fefb66a" origin="Generated by Gradle"/> @@ -1568,6 +1788,14 @@ <artifact name="grpc-services-1.53.0.pom"> <sha256 value="1fa4fabb0dff3f5fb92c21f1441ddef0cba9b3ea87db383587cb1b847ed46953" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-services" version="1.59.0"> + <artifact name="grpc-services-1.59.0.jar"> + <sha256 value="a0feff7e1658fad0ac4cb28621b73c3d87f06622a54fced0e2260bd24345215e" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-services-1.59.0.pom"> + <sha256 value="3895b725b74602237958da6ae542434cf442542d2dfc29e40d8bb38d07bf4b8f" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-servlet" version="1.53.0"> <artifact name="grpc-servlet-1.53.0.jar"> <sha256 value="c8b77f741e890af39d214c5bde0fc6d7a352919e40829c149ddeab44bf75e9a9" origin="Generated by Gradle"/> @@ -1576,6 +1804,14 @@ <artifact name="grpc-servlet-1.53.0.pom"> <sha256 value="d53f9470d0e14268010b3877d737b5823e827a40b9d549ef3ed99460fb240191" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-servlet" version="1.59.0"> + <artifact name="grpc-servlet-1.59.0.jar"> + <sha256 value="c52bdf7cd7aaebf258009c6ca1f1a7ea3dd18b0d6da60ec2a2e6f19fd8274adf" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-servlet-1.59.0.pom"> + <sha256 value="e29c91982f6054a42bad02fe43260ccc49ce975fa0504889e3c8ba4a8c8b49dc" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-servlet-jakarta" version="1.53.0"> <artifact name="grpc-servlet-jakarta-1.53.0.jar"> <sha256 value="a05b37cfd72e413e38358ce41a638ccee546e82dda50c9a6d815b2973e9faed6" origin="Generated by Gradle"/> @@ -1584,6 +1820,14 @@ <artifact name="grpc-servlet-jakarta-1.53.0.pom"> <sha256 value="8dc5182a07f1447cafabd8cb13414cd1d35c00ef002dfeaed40da4ca3d5d3a05" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-servlet-jakarta" version="1.59.0"> + <artifact name="grpc-servlet-jakarta-1.59.0.jar"> + <sha256 value="fec7e8943c4f369d91f8d116065c9a80cd7091b797dc5c1c9bf14fc9542d55ce" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-servlet-jakarta-1.59.0.pom"> + <sha256 value="b14f2a9eee9d20182967b42ce0df3b12e896f509a8d9d8dceb514494a2546eff" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-stub" version="1.53.0"> <artifact name="grpc-stub-1.53.0.jar"> <sha256 value="f69f8819dd26266e0d8ef62a0f1473894fbdbab9ea459f977037dbc3bc9cf6e4" origin="Generated by Gradle"/> @@ -1592,6 +1836,14 @@ <artifact name="grpc-stub-1.53.0.pom"> <sha256 value="44f745f1945150e9a120218f4d0cdb29bfbe0093d0637225906d7702a6818c10" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-stub" version="1.59.0"> + <artifact name="grpc-stub-1.59.0.jar"> + <sha256 value="7cc797303968d369ec48c3e8dcc966b68fd2763494a39203bd05a8f33730bcf3" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-stub-1.59.0.pom"> + <sha256 value="8e52653feec7db5fb60ef20be3567108684ead05ab7acc4bb4a6bd50f1eb12cf" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-testing" version="1.53.0"> <artifact name="grpc-testing-1.53.0.jar"> <sha256 value="0a640d2e70e3c34ad282f0df3ece1a053b2134426995c97d835b87c20ab6e237" origin="Generated by Gradle"/> @@ -1600,12 +1852,36 @@ <artifact name="grpc-testing-1.53.0.pom"> <sha256 value="84929272df5b753788a503bbc5553d25a026dbcea72ab509a928a6a06ae3e8b8" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.grpc" name="grpc-testing" version="1.59.0"> + <artifact name="grpc-testing-1.59.0.jar"> + <sha256 value="92ece8e4a6349f76ee5a4844a2c84817bf45f6b20932d17a82b05f1899c2422a" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-testing-1.59.0.pom"> + <sha256 value="57b0f7a4d479130dd0edc4397c14d7c7d08561ecd7fcd8d712cd8610a514a6e7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-util" version="1.59.0"> + <artifact name="grpc-util-1.59.0.jar"> + <sha256 value="5031a77705b47164391d7adab7ab190fc78f4bdc8cb00eb7babd4ca286a6a6a3" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-util-1.59.0.pom"> + <sha256 value="c4363cdd430dffa749d755f234a41d228f87c96a9785f6372928b327bb614deb" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.grpc" name="grpc-xds" version="1.53.0"> <artifact name="grpc-xds-1.53.0.jar"> <sha256 value="bc00bccaf1f390a8410162176b461f395df003ebfb559e9fe6e111a1580e6ac8" origin="Generated by Gradle"/> </artifact> <artifact name="grpc-xds-1.53.0.pom"> <sha256 value="a73e184d96de50f84c24a8263040b72f96f27b144dd3903a6971e47b8e92906f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-xds" version="1.59.0"> + <artifact name="grpc-xds-1.59.0.jar"> + <sha256 value="d56844eb4bd35c7beddd73c81b344339df5a270f8e3068bf2c13c9908616b007" origin="Generated by Gradle"/> + </artifact> + <artifact name="grpc-xds-1.59.0.pom"> + <sha256 value="6e9b6b35cf42b4d521682dbe4e2b913352731044c364c5780357ab906abc207e" origin="Generated by Gradle"/> </artifact> </component> <component group="io.gsonfire" name="gson-fire" version="1.8.5"> @@ -1645,6 +1921,14 @@ <artifact name="client-java-proto-18.0.0.pom"> <sha256 value="51a1ac5a5d4f94869b82910cb572950d9db783e40334282ca9c128d6425ca428" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-all" version="4.1.100.Final"> + <artifact name="netty-all-4.1.100.Final.jar"> + <sha256 value="8f77bf1d9c962526caad18a3ae2ec64e6d553c758c35fc5519017a547f465f5e" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-all-4.1.100.Final.pom"> + <sha256 value="3588b3620fe9330098372b8414186d85e144156ae561b542b5dd851a4da88dba" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-all" version="4.1.90.Final"> <artifact name="netty-all-4.1.90.Final.jar"> <sha256 value="a3bf4c00eb67bac78d2cbd8ceb8fcf60899e6253dd84b54b2babc4c43f395b85" origin="Generated by Gradle"/> @@ -1663,6 +1947,14 @@ <artifact name="netty-bom-4.1.86.Final.pom"> <sha256 value="12716c1fe64cf5bdaa7044d37d13aae3a88821b91d4798420c46a74769178afd" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-buffer" version="4.1.100.Final"> + <artifact name="netty-buffer-4.1.100.Final.jar"> + <sha256 value="462874b44ee782fbefec64078cda6eb8e7bf9f0e0af71a928ef4c1f2d564f7ee" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-buffer-4.1.100.Final.pom"> + <sha256 value="a4a9715de676f91d8f88b40eb7873a0d63769902086798d3a898ca930325bd34" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-buffer" version="4.1.85.Final"> <artifact name="netty-buffer-4.1.85.Final.pom"> <sha256 value="7e0a3b5b3568d58a4cd8747113e30d2215c6a53428b035881a345b4f0e74a21d" origin="Generated by Gradle"/> @@ -1676,6 +1968,14 @@ <artifact name="netty-buffer-4.1.90.Final.pom"> <sha256 value="1b626d6076bed57de339f5eb2ed03709a603f984b1903a2aae04c7483218ad2e" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec" version="4.1.100.Final"> + <artifact name="netty-codec-4.1.100.Final.jar"> + <sha256 value="180a01ed67af399602e24ff1c32864e7f57f57c4a0fa5e9ab3fe9b0e5e9cf051" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-4.1.100.Final.pom"> + <sha256 value="891ad7692c911a356a0b9ef7c255bc64afc526e8bfccae6f18c5ed2912498f75" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec" version="4.1.85.Final"> <artifact name="netty-codec-4.1.85.Final.jar"> <sha256 value="625e47e43fe60f12475215fcfa6dd5468e01c8b4b07d9a831b8a9d1d519fb9a2" origin="Generated by Gradle"/> @@ -1692,6 +1992,14 @@ <artifact name="netty-codec-4.1.90.Final.pom"> <sha256 value="5d66dc6aa057d9c27eee49bd928e1393d6d2e37f5d0f00ccb69605b931ef6c56" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-dns" version="4.1.100.Final"> + <artifact name="netty-codec-dns-4.1.100.Final.jar"> + <sha256 value="f7f55bee95d2467e8bda6dda980a2830b351b0dd6f0f87fe5114645035ee55ca" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-dns-4.1.100.Final.pom"> + <sha256 value="8fdc6624cb6da905a4fa0ffdd4aac7620f92c8a0a08a81499c563cacac26bcdf" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-dns" version="4.1.85.Final"> <artifact name="netty-codec-dns-4.1.85.Final.jar"> <sha256 value="b6c9deb92d544b60e52bd5eb7946d7b105cf2afbdd3f8f8d09a9928db4310bec" origin="Generated by Gradle"/> @@ -1708,12 +2016,28 @@ <artifact name="netty-codec-dns-4.1.90.Final.pom"> <sha256 value="f1d0fa09339db90f493a65145cd1611291860e610e93224800ba39ad59d53b58" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-haproxy" version="4.1.100.Final"> + <artifact name="netty-codec-haproxy-4.1.100.Final.jar"> + <sha256 value="5688edfb554e3fbb76d3ebabc23557e60ab4941b903e4fee1803c35546718df1" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-haproxy-4.1.100.Final.pom"> + <sha256 value="3f273b125ce7bdf1f2430b777e16b4b1952b342770ad4419045be380f81ca65b" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-haproxy" version="4.1.90.Final"> <artifact name="netty-codec-haproxy-4.1.90.Final.jar"> <sha256 value="7f0b6985f7b9de4b7b212c4adfb11557aa72a18cc8c4a0f6740ca36daa69d4f0" origin="Generated by Gradle"/> </artifact> <artifact name="netty-codec-haproxy-4.1.90.Final.pom"> <sha256 value="39b126e39130f94d4110f799d5958fcd4f71fb663e61596fe66e0655c1c6caac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-http" version="4.1.100.Final"> + <artifact name="netty-codec-http-4.1.100.Final.jar"> + <sha256 value="326811d249cb0e5555e78e026e877834e792261c38f0666d80464426695d9590" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-http-4.1.100.Final.pom"> + <sha256 value="e6b7cb7ecc69e44f127725a4124d50876334f8964fc7477fc694a7492a95ff8a" origin="Generated by Gradle"/> </artifact> </component> <component group="io.netty" name="netty-codec-http" version="4.1.85.Final"> @@ -1732,6 +2056,14 @@ <artifact name="netty-codec-http-4.1.90.Final.pom"> <sha256 value="c748478a4674cfc5775c3ec0e6c1cb2f82a3e19f292c458bbe3fd0c17a82057e" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-http2" version="4.1.100.Final"> + <artifact name="netty-codec-http2-4.1.100.Final.jar"> + <sha256 value="23b4a74350f4cf8d41b93fb93d52b5050667d8d53fffc385672c86eab83b8749" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-http2-4.1.100.Final.pom"> + <sha256 value="e22328e926737886cc5b57840b91a2aed68fde813a1f579f9ab59117a28b99bc" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-http2" version="4.1.79.Final"> <artifact name="netty-codec-http2-4.1.79.Final.pom"> <sha256 value="f1f40fb340c8c2219b240081f30a066eea5edfab2cbd949f65655a2d64c5983e" origin="Generated by Gradle"/> @@ -1753,6 +2085,19 @@ <artifact name="netty-codec-http2-4.1.90.Final.pom"> <sha256 value="631315de3deda421741116056aa0a01630c49bcafde54d0bf79c51c5fa9392a5" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-http2" version="4.1.97.Final"> + <artifact name="netty-codec-http2-4.1.97.Final.pom"> + <sha256 value="0a45e92471135c1d316029d037e16efd6afd062093fa255f55dd5662000c4e36" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-memcache" version="4.1.100.Final"> + <artifact name="netty-codec-memcache-4.1.100.Final.jar"> + <sha256 value="f271eb376f7865ea098c506bcdb5d7cb40b70c6a9ed06ba08f77c95164a60f4a" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-memcache-4.1.100.Final.pom"> + <sha256 value="66d97de54ec4bb76108407c01d1c615b80393e534973527decee580dfdd91e01" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-memcache" version="4.1.90.Final"> <artifact name="netty-codec-memcache-4.1.90.Final.jar"> <sha256 value="d10c082ae0dbd8f0be4ef9e57e8e7eda0abee63781724356bf95900f8d58c774" origin="Generated by Gradle"/> @@ -1761,6 +2106,14 @@ <artifact name="netty-codec-memcache-4.1.90.Final.pom"> <sha256 value="f3f7f66b7c42026fadeffbaf3f318aed750b4ff2c8ee84167e14c36b53a06b07" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-mqtt" version="4.1.100.Final"> + <artifact name="netty-codec-mqtt-4.1.100.Final.jar"> + <sha256 value="fede2e4b42b41f01488c425fbb1a75151e1dc9320e0511f6f523273299cfcaa0" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-mqtt-4.1.100.Final.pom"> + <sha256 value="14689670d83e06e0c9e27202d5e343eb382eaa65b69afb7b3bdf8c4e14c6ba2f" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-mqtt" version="4.1.90.Final"> <artifact name="netty-codec-mqtt-4.1.90.Final.jar"> <sha256 value="7801d7456d50868f560bea4b2f8694f7a63be3118ea1691fc91b692731aacafd" origin="Generated by Gradle"/> @@ -1769,6 +2122,14 @@ <artifact name="netty-codec-mqtt-4.1.90.Final.pom"> <sha256 value="9514040de49e6501aa3fd7e3f94926272fe0df0f17c1c13757d8022e8f104a04" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-redis" version="4.1.100.Final"> + <artifact name="netty-codec-redis-4.1.100.Final.jar"> + <sha256 value="bd152212e9c20bccf0ca6f9ccbfc5cc86643a5f16875a998583c4d32d0c5c4ab" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-redis-4.1.100.Final.pom"> + <sha256 value="bf0c816644d77147cf709757996e66bd953a5e11c859323ad48344647091c9f5" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-redis" version="4.1.90.Final"> <artifact name="netty-codec-redis-4.1.90.Final.jar"> <sha256 value="df5aac3a73c69cf133ddde0a28633f1dfe40975d3a16ab03325ed392f4be2b3e" origin="Generated by Gradle"/> @@ -1777,6 +2138,14 @@ <artifact name="netty-codec-redis-4.1.90.Final.pom"> <sha256 value="d63fafd811786f71328e9a55c4ef3f0c068d258b7172ee1c90f33e552e6a5403" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-smtp" version="4.1.100.Final"> + <artifact name="netty-codec-smtp-4.1.100.Final.jar"> + <sha256 value="066528ec2d0bb3152872757eaf1fd07e2812ff354d3c53af8102108707e8e20d" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-smtp-4.1.100.Final.pom"> + <sha256 value="e5346a7387ec48b0f5f4d6b8cf2fcd4cb9b46170ba1c0b82eab312ac8faeda50" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-smtp" version="4.1.90.Final"> <artifact name="netty-codec-smtp-4.1.90.Final.jar"> <sha256 value="93f8ad3466f84ccb3570c62b168ba3f1b2a9ee10686528bfeb13d2c83be6db57" origin="Generated by Gradle"/> @@ -1785,6 +2154,14 @@ <artifact name="netty-codec-smtp-4.1.90.Final.pom"> <sha256 value="38d42b2479e7c8ef00056ffe06b56212423589f7134ef23ba5b7d682e073bbc7" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-socks" version="4.1.100.Final"> + <artifact name="netty-codec-socks-4.1.100.Final.jar"> + <sha256 value="608a453b90f8384ba4efcdc6db7f899a1f10b9ea1890954696e6cfac45ff1ba9" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-socks-4.1.100.Final.pom"> + <sha256 value="642fccabeb6f63f3f6222fe5cf4acac06a1925e7d9ee7e8d10e4392126884283" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-socks" version="4.1.85.Final"> <artifact name="netty-codec-socks-4.1.85.Final.jar"> <sha256 value="6c7419a93e0270759a05e6a0f26ed82d4b7b179132e149fb6e13d524fa935081" origin="Generated by Gradle"/> @@ -1801,6 +2178,14 @@ <artifact name="netty-codec-socks-4.1.90.Final.pom"> <sha256 value="9cf94d8be2ffcb8208304bf078e8a7433186265293dfb84dc86ab9fce8c07c4c" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-stomp" version="4.1.100.Final"> + <artifact name="netty-codec-stomp-4.1.100.Final.jar"> + <sha256 value="14895b1a22db5760acf71c7cda7bc264d9e1363d29b6e1768c39e3badced61f7" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-stomp-4.1.100.Final.pom"> + <sha256 value="5d1468eef9d8efecf50d412cac909f183d38f2668a53bf72c4d9bf81f2be2641" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-stomp" version="4.1.90.Final"> <artifact name="netty-codec-stomp-4.1.90.Final.jar"> <sha256 value="eecf92159abfb688f9c37b2e35a1c71d93f883c259b754d608518d6bb38a869e" origin="Generated by Gradle"/> @@ -1809,6 +2194,14 @@ <artifact name="netty-codec-stomp-4.1.90.Final.pom"> <sha256 value="aa9da0082e7920977a0d5c5954be2e4f6649338b2c17a6658b7c4cfb00ef774d" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-codec-xml" version="4.1.100.Final"> + <artifact name="netty-codec-xml-4.1.100.Final.jar"> + <sha256 value="853c77c5ba6a9faa16383677d3114524db32fa4d72839b1ee00f55ecb22fe26c" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-codec-xml-4.1.100.Final.pom"> + <sha256 value="90610e9e930da1d893e6eb148634b816f45aae7c0a021dc992013959cb2ed316" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-codec-xml" version="4.1.90.Final"> <artifact name="netty-codec-xml-4.1.90.Final.jar"> <sha256 value="5a1cd2913f9efeb86d6dd322b94c47368796a52215cefd65183a01c86b1ba9aa" origin="Generated by Gradle"/> @@ -1817,6 +2210,14 @@ <artifact name="netty-codec-xml-4.1.90.Final.pom"> <sha256 value="160559f24261de878564ad2feb21511d48381312b611d30140f3e884374605ff" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-common" version="4.1.100.Final"> + <artifact name="netty-common-4.1.100.Final.jar"> + <sha256 value="d2908301f1ac6f2910900742473c15d701765d3d4467acdb1eebb9df3aa82885" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-common-4.1.100.Final.pom"> + <sha256 value="eff6a999fa0700e00bc9de028fccb2a13102e7b449f3ba2a23a8a768600631af" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-common" version="4.1.85.Final"> <artifact name="netty-common-4.1.85.Final.pom"> <sha256 value="700be9c28e466d36eb345af4bc096e13683748fc62fa58f550346b987473c55b" origin="Generated by Gradle"/> @@ -1830,6 +2231,14 @@ <artifact name="netty-common-4.1.90.Final.pom"> <sha256 value="7bafd07684f4b7ac22e646d4552173d5039facb21c96336e612e69e837556a62" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-handler" version="4.1.100.Final"> + <artifact name="netty-handler-4.1.100.Final.jar"> + <sha256 value="0e10e584c2e7fdf7f4804e14760ed987003f1b62ab982f62eaf13a9892793d3a" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-handler-4.1.100.Final.pom"> + <sha256 value="46e5647ab1344c5faeffea0cd509913465808c09469d05f54b7a563e96d9d53e" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-handler" version="4.1.85.Final"> <artifact name="netty-handler-4.1.85.Final.jar"> <sha256 value="c45ff524850527bb7b837f7f25743aa5109e5b20b549c09a01800d665625fb99" origin="Generated by Gradle"/> @@ -1846,6 +2255,14 @@ <artifact name="netty-handler-4.1.90.Final.pom"> <sha256 value="c2d57ffa64541118e883b6abcc7bdeb85bc69e9370b04e84a8d61a0cf260ac68" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-handler-proxy" version="4.1.100.Final"> + <artifact name="netty-handler-proxy-4.1.100.Final.jar"> + <sha256 value="686dbc2e61407f216d6cb267dd7954896f851dd34b58be3e757c5a89f20a5e67" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-handler-proxy-4.1.100.Final.pom"> + <sha256 value="bd7324b546a6332294cd49c36958b50476c3f9653f213aaef573f8bff944d53b" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-handler-proxy" version="4.1.79.Final"> <artifact name="netty-handler-proxy-4.1.79.Final.pom"> <sha256 value="a2d46c9f23136a0a2504f17191948a433893e669d5e483fe7d14aaa0af1c3654" origin="Generated by Gradle"/> @@ -1867,6 +2284,19 @@ <artifact name="netty-handler-proxy-4.1.90.Final.pom"> <sha256 value="bf6ae726b9c9a4bb4dd57b3ae0027f9f1b4cd1510a45f7614fc200907a8c214c" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-handler-proxy" version="4.1.97.Final"> + <artifact name="netty-handler-proxy-4.1.97.Final.pom"> + <sha256 value="080588032eb62d321fa8447ac28847fca7f9c14246b71def7eb8512f3005b50a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-handler-ssl-ocsp" version="4.1.100.Final"> + <artifact name="netty-handler-ssl-ocsp-4.1.100.Final.jar"> + <sha256 value="d8e064f1b589a71fa019a3d63bbe91f6994984246355b5fa88b0a994768e82ad" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-handler-ssl-ocsp-4.1.100.Final.pom"> + <sha256 value="5b8d289da8ab60761197298c77353f3ba049fa584f3f8b44bfc5be750bbf3bb4" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-handler-ssl-ocsp" version="4.1.90.Final"> <artifact name="netty-handler-ssl-ocsp-4.1.90.Final.jar"> <sha256 value="54ed6c1d2dcd84b5424b3509880767975d8378dfbd7a126856c33168bcf15756" origin="Generated by Gradle"/> @@ -1875,6 +2305,11 @@ <artifact name="netty-handler-ssl-ocsp-4.1.90.Final.pom"> <sha256 value="dca2dbfc0c02cf2c7f0effe58ce8ef2b0df34b80bbd322166a5697cb7bb05663" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-parent" version="4.1.100.Final"> + <artifact name="netty-parent-4.1.100.Final.pom"> + <sha256 value="25787dd1d069fecd10e47360a50cf657bc39bed96eaa7e77400188eef5058741" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-parent" version="4.1.79.Final"> <artifact name="netty-parent-4.1.79.Final.pom"> <sha256 value="fd3283e75882dca94015596c83cffa5a4145da74967eb78edb69ae50c01cc953" origin="Generated by Gradle"/> @@ -1890,6 +2325,19 @@ <artifact name="netty-parent-4.1.90.Final.pom"> <sha256 value="a1d95bbad9cf4282123943517147562e149f72993344bf087c800332051658d2" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-parent" version="4.1.97.Final"> + <artifact name="netty-parent-4.1.97.Final.pom"> + <sha256 value="8be274418b1bd42b1e31a0d8904042fb2d26eeb74b7affc349810df536d1a7ef" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-resolver" version="4.1.100.Final"> + <artifact name="netty-resolver-4.1.100.Final.jar"> + <sha256 value="c42c481c776e9d367a45cc3a67a06f65897d280334eb30b2362b8c55b7523f4f" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-resolver-4.1.100.Final.pom"> + <sha256 value="4e2e76bc370a0564ddb7efa9cf2032752e328fcdd075170e1c1e2313fa8efdc6" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-resolver" version="4.1.85.Final"> <artifact name="netty-resolver-4.1.85.Final.pom"> <sha256 value="128ff29264742604117999c2c783a5efb2af21665d37fa1b50aaaf456abafa38" origin="Generated by Gradle"/> @@ -1903,6 +2351,14 @@ <artifact name="netty-resolver-4.1.90.Final.pom"> <sha256 value="514235e5225576cc2f879d7f31a0764df340c20514dffd1efa74050e01cc871f" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-resolver-dns" version="4.1.100.Final"> + <artifact name="netty-resolver-dns-4.1.100.Final.jar"> + <sha256 value="4bafbd3e571ed2d9fb3f9550f8348ba37c183eda4a253fba5354166e409624c4" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-resolver-dns-4.1.100.Final.pom"> + <sha256 value="68214fa7830506bd32ed5a5aafaed3683c4eecc0f4ae56a0f81266c55a7f1c4e" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-resolver-dns" version="4.1.85.Final"> <artifact name="netty-resolver-dns-4.1.85.Final.jar"> <sha256 value="bc14fdc9c639000f8d553bd3d7fe9e7248ee9318d2a4ab620e2862f550fd7fed" origin="Generated by Gradle"/> @@ -1917,6 +2373,14 @@ <sha256 value="451feb1ab8b005b92f017938982237cb98781f2eb0632d21813f4d82ad8e9dfd" origin="Generated by Gradle"/> </artifact> <artifact name="netty-resolver-dns-4.1.90.Final.pom"> <sha256 value="f1a13622eefc85c4ae94bb55d4a3e1b7165c64e4b0ce5cd30795df8471a553e7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-resolver-dns-classes-macos" version="4.1.100.Final"> + <artifact name="netty-resolver-dns-classes-macos-4.1.100.Final.jar"> + <sha256 value="6fca51826ca592b886e6144146318cc07a9098389e0714ec0df6fcd879600120" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-resolver-dns-classes-macos-4.1.100.Final.pom"> + <sha256 value="e798bb1735f985d7da1c73e573da44fd8e06c8d7b733440419dbb67f3b0ebd9a" origin="Generated by Gradle"/> </artifact> </component> <component group="io.netty" name="netty-resolver-dns-classes-macos" version="4.1.90.Final"> @@ -1927,6 +2391,17 @@ <artifact name="netty-resolver-dns-classes-macos-4.1.90.Final.pom"> <sha256 value="64e318a80764059b79e0c05dc3bb7a6b68a164798c205d5ba85e63874783f844" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-resolver-dns-native-macos" version="4.1.100.Final"> + <artifact name="netty-resolver-dns-native-macos-4.1.100.Final-osx-aarch_64.jar"> + <sha256 value="feb64c91aba931636e9b831a1f7ca553349136dda90bac19768708edf1a61be9" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-resolver-dns-native-macos-4.1.100.Final-osx-x86_64.jar"> + <sha256 value="b47f1b6c2acc32ae53cde11600c68ff6255a9cce16a9423c487f13283d68d923" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-resolver-dns-native-macos-4.1.100.Final.pom"> + <sha256 value="461c19a301dc1ae2fe7a41d065446d31d4542ea3ec258621691ce0193c64f4a2" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-resolver-dns-native-macos" version="4.1.90.Final"> <artifact name="netty-resolver-dns-native-macos-4.1.90.Final-osx-aarch_64.jar"> <sha256 value="f189011b01f4b1ecd4e03bf332d52a0ac24a98eaa1f9ff7c9422ddab67ff1d26" origin="Generated by Gradle"/> @@ -1946,6 +2421,14 @@ <artifact name="netty-tcnative-boringssl-static-2.0.59.Final.pom"> <sha256 value="ac94f0c7a05fa199b949a52d0c6612e58550e213665a361dc89e45ad19517b8b" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-tcnative-boringssl-static" version="2.0.62.Final"> + <artifact name="netty-tcnative-boringssl-static-2.0.62.Final.jar"> + <sha256 value="106dd048f560212522377599a552683106d4d24d638d14d6dccfb4919349546f" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-tcnative-boringssl-static-2.0.62.Final.pom"> + <sha256 value="9ef53e8fbab9ce72fc51295db5ff57cbfc8f2e62085a40cdd2da9cea3f756df5" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-tcnative-classes" version="2.0.59.Final"> <artifact name="netty-tcnative-classes-2.0.59.Final.jar"> <sha256 value="9531ac13a0c54d24932f39a3abd11e16057a0ef5aa0712ea77be1b94eb86b445" origin="Generated by Gradle"/> @@ -1954,11 +2437,32 @@ <artifact name="netty-tcnative-classes-2.0.59.Final.pom"> <sha256 value="04b946b7ae103b3fa2154c652f9dbc939f0ac0c22209dd0be5e8a5fce20381c3" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-tcnative-classes" version="2.0.62.Final"> + <artifact name="netty-tcnative-classes-2.0.62.Final.jar"> + <sha256 value="1dafdb2ca02e0ea6de2d91cd856664ecb963dcc5b0bf165d5c4a7484a17046f8" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-tcnative-classes-2.0.62.Final.pom"> + <sha256 value="72a871c27523bc4e03ec267a11c8822dc12a6ffa12d43f10fe75dd45e2817384" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-tcnative-parent" version="2.0.59.Final"> <artifact name="netty-tcnative-parent-2.0.59.Final.pom"> <sha256 value="576a96ab16a311523d4a8b00bea2223f46fb74151929bfa7a4fdeb84122ba06f" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-tcnative-parent" version="2.0.62.Final"> + <artifact name="netty-tcnative-parent-2.0.62.Final.pom"> + <sha256 value="c32bc348c40a0e59d68b1edbf2fb9a963ef7b28561bcfd0bae42d6aef6714acf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-transport" version="4.1.100.Final"> + <artifact name="netty-transport-4.1.100.Final.jar"> + <sha256 value="b1deeceedab3734cdb959c55f4be5ab4a667a8aed59121ff93763f49470f5470" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-4.1.100.Final.pom"> + <sha256 value="9fe43f0ea37a3ceedccff157cba610331d3ae55c89a5f9a48fbc75d7e1559e3c" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-transport" version="4.1.85.Final"> <artifact name="netty-transport-4.1.85.Final.pom"> <sha256 value="1a15a04b08b8bd60424f8577fc5302c65ef82cb8ba3d558ea2951191fe971207" origin="Generated by Gradle"/> @@ -1972,6 +2476,14 @@ <artifact name="netty-transport-4.1.90.Final.pom"> <sha256 value="bb0a2a259eb168aa668b87b28b70ded7db5e06239247830ff5b3472b2922bacb" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-transport-classes-epoll" version="4.1.100.Final"> + <artifact name="netty-transport-classes-epoll-4.1.100.Final.jar"> + <sha256 value="9abc4b17b1212b33666eae4e8013d0bb78a9a2bcd0a9a621b9bd06a7e5fc0050" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-classes-epoll-4.1.100.Final.pom"> + <sha256 value="6c790a75d0ee2da923fc95ee32ebf0193ab29f2b6678d9ace7c005a967654f8b" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-transport-classes-epoll" version="4.1.90.Final"> <artifact name="netty-transport-classes-epoll-4.1.90.Final.jar"> <sha256 value="43a8572ef3061cfb9dbbc7178dc3405b3fbc8562e6768aa92d9222d284bf35f7" origin="Generated by Gradle"/> @@ -1980,6 +2492,14 @@ <artifact name="netty-transport-classes-epoll-4.1.90.Final.pom"> <sha256 value="42bc169f377f318281e5d544e26e7f2e556367221ef4fe96eed88a62b5f6ded7" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-transport-classes-kqueue" version="4.1.100.Final"> + <artifact name="netty-transport-classes-kqueue-4.1.100.Final.jar"> + <sha256 value="70b40962b01ab594bed5cd311cd8768b224155c948118af60412ab23bc55ed50" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-classes-kqueue-4.1.100.Final.pom"> + <sha256 value="e2b084630c1bb86bd991618594ddaef75c29d895eeb2795528d7a296160b0b2f" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-transport-classes-kqueue" version="4.1.90.Final"> <artifact name="netty-transport-classes-kqueue-4.1.90.Final.jar"> <sha256 value="c52f681e928e3d913efa272737a5e35f0a09596030dd76d4bbfd9999bb04ca4b" origin="Generated by Gradle"/> @@ -1988,6 +2508,20 @@ <artifact name="netty-transport-classes-kqueue-4.1.90.Final.pom"> <sha256 value="e72f789826feab414c1d7f26709b378a31e0cbac4e21d60434918c822d4876b9" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-transport-native-epoll" version="4.1.100.Final"> + <artifact name="netty-transport-native-epoll-4.1.100.Final-linux-aarch_64.jar"> + <sha256 value="81993265c3fb9098c0163943e71c14fbaa6ed17e345e7bf8205c90acfdf6cef5" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-native-epoll-4.1.100.Final-linux-x86_64.jar"> + <sha256 value="a108fb47babb7678b5b2abb1fc8b34510bd2f705faa450447860647f2de4ebaa" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-native-epoll-4.1.100.Final.jar"> + <sha256 value="34868795228df31914b75b10e97bf4d980e78e263569852e3185ca8c2a0de3e9" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-native-epoll-4.1.100.Final.pom"> + <sha256 value="75940a06cc911fc7897a08fefbbc4ae65fb9523df6190a98e00aae11c201ca14" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-transport-native-epoll" version="4.1.90.Final"> <artifact name="netty-transport-native-epoll-4.1.90.Final-linux-aarch_64.jar"> <sha256 value="069161a6b7a792ee1804ac54ea921d8a45d7aef46dbdc5986d9197b0747577e3" origin="Generated by Gradle"/> @@ -2002,6 +2536,20 @@ <artifact name="netty-transport-native-epoll-4.1.90.Final.pom"> <sha256 value="8e868ea0b3ec102db963aa04e4a95f6ff6deb043df13b48d9634e0f52df8fb95" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-transport-native-kqueue" version="4.1.100.Final"> + <artifact name="netty-transport-native-kqueue-4.1.100.Final-osx-aarch_64.jar"> + <sha256 value="0fdc323ad2efd85343713fbce6e0c2aec27e6852659984d03a5414018e01815f" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-native-kqueue-4.1.100.Final-osx-x86_64.jar"> + <sha256 value="9ca2ba0121e35ea25228cf27ec553279966ca0a7f9c61e33ad1d9ea50477360d" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-native-kqueue-4.1.100.Final.jar"> + <sha256 value="67cebdff558142f52dd495e5c010ba448a900b2d91bb4d2fece900b0bc95ea3e" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-native-kqueue-4.1.100.Final.pom"> + <sha256 value="8b9b7dad46f7e3fe060d651382b8b28f80a5c260d091ab87946b980437f14e52" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-transport-native-kqueue" version="4.1.90.Final"> <artifact name="netty-transport-native-kqueue-4.1.90.Final-osx-aarch_64.jar"> <sha256 value="a0e196855f14e8ca0e8e93d009df6ed2601f7336d16d681ffa30a595fbb54954" origin="Generated by Gradle"/> @@ -2014,6 +2562,14 @@ <sha256 value="dd939a046ebe8815cbe65fd9ed555188c507d1b9a9d26e89e3b0157f9d94915b" origin="Generated by Gradle"/> </artifact> <artifact name="netty-transport-native-kqueue-4.1.90.Final.pom"> <sha256 value="70ba57eee613235d9d97fdd7b95de3a82e101724a6be60cd4b711a7916221c57" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-transport-native-unix-common" version="4.1.100.Final"> + <artifact name="netty-transport-native-unix-common-4.1.100.Final.jar"> + <sha256 value="5d888230a04c4a3e647c64e933cefb64fd49056f969bfb734c8a3fcedf0bea8a" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-native-unix-common-4.1.100.Final.pom"> + <sha256 value="b16c8d0e083f65a74b6118c22ed02c93d01b8084f65c1eac08fce6e816d50b15" origin="Generated by Gradle"/> </artifact> </component> <component group="io.netty" name="netty-transport-native-unix-common" version="4.1.90.Final"> @@ -2024,6 +2580,14 @@ <artifact name="netty-transport-native-unix-common-4.1.90.Final.pom"> <sha256 value="4e024e135f828c9918189f46ecd754c2de4fb1dd334bdbc2db524e59525967b0" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-transport-rxtx" version="4.1.100.Final"> + <artifact name="netty-transport-rxtx-4.1.100.Final.jar"> + <sha256 value="8499f4816f6615c97b664b88bc28ab0f68b031676cfcf95218e2c3ec64c5d5bc" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-rxtx-4.1.100.Final.pom"> + <sha256 value="5b54e50db342dcd835c42182e921abba28dfaa24400cf2bba38a90457206cdd2" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-transport-rxtx" version="4.1.90.Final"> <artifact name="netty-transport-rxtx-4.1.90.Final.jar"> <sha256 value="d37482e7a47d085d6e11b26238a0a87bc684dc3ec9ad7bef664ff38b5e3ff510" origin="Generated by Gradle"/> @@ -2032,12 +2596,28 @@ <artifact name="netty-transport-rxtx-4.1.90.Final.pom"> <sha256 value="18cca9c08087c0d7d69383bf880b8173ca1403140e2f1fe9650bab51e6f9b567" origin="Generated by Gradle"/> </artifact> </component> + <component group="io.netty" name="netty-transport-sctp" version="4.1.100.Final"> + <artifact name="netty-transport-sctp-4.1.100.Final.jar"> + <sha256 value="15d3ff37b84f7877442aa0981b81f5106f61f8bed2a09c18d5242010a8f4336f" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-sctp-4.1.100.Final.pom"> + <sha256 value="4f0c25b24356bf680028b5d5b34522ec692d9b7aafac2f84dd483028c2195600" origin="Generated by Gradle"/> + </artifact> + </component> <component group="io.netty" name="netty-transport-sctp" version="4.1.90.Final"> <artifact name="netty-transport-sctp-4.1.90.Final.jar"> <sha256 value="08586e9f081a2f0266c88d019d009db98b6ce6e567b6265818235a960fa0c0cf" origin="Generated by Gradle"/> </artifact> <artifact name="netty-transport-sctp-4.1.90.Final.pom"> <sha256 value="d0de096ebdca675d37d41e013fa068e4122ee334d0d1983749ab889fd6f7e0c9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-transport-udt" version="4.1.100.Final"> + <artifact name="netty-transport-udt-4.1.100.Final.jar"> + <sha256 value="824c5d26da6c001357ef0e8a985076a9093a613cf1f7f7cb719bffe88dde7e58" origin="Generated by Gradle"/> + </artifact> + <artifact name="netty-transport-udt-4.1.100.Final.pom"> + <sha256 value="bf9b79553c6ed6d0f946a8f8184f704edab0e33817243925491827f2524d6ddd" origin="Generated by Gradle"/> </artifact> </component> <component group="io.netty" name="netty-transport-udt" version="4.1.90.Final"> @@ -2351,6 +2931,17 @@ <sha256 value="22961ff0b626a66d1e5eada3e9fae8d2ad345147625de5ada73bcb3a86b59f0d" origin="Generated by Gradle"/> </artifact> <artifact name="perfmark-api-0.25.0.pom"> <sha256 value="1a4a2b828cd0b90041626bdec2293fdc6a98901661e30b5fe3585b9fc94b08ea" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.perfmark" name="perfmark-api" version="0.26.0"> + <artifact name="perfmark-api-0.26.0.jar"> + <sha256 value="b7d23e93a34537ce332708269a0d1404788a5b5e1949e82f5535fce51b3ea95b" origin="Generated by Gradle"/> + </artifact> + <artifact name="perfmark-api-0.26.0.module"> + <sha256 value="31d832332474ce48150f5bae003343319136f336afd1076a289029319e3ea97a" origin="Generated by Gradle"/> + </artifact> + <artifact name="perfmark-api-0.26.0.pom"> + <sha256 value="7edee48616e17b61297eae3a82eb483a85e56d2567929378aa46f30a950322da" origin="Generated by Gradle"/> </artifact> </component> <component group="io.pkts" name="pkts-buffers" version="3.0.10"> @@ -3473,14 +4064,6 @@ <artifact name="jose4j-0.9.3.pom"> <sha256 value="b579ab836863ad48e578bae9961e1b004bd140afc43e7c3335646b7fb3daf9da" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.bouncycastle" name="bcpkix-jdk18on" version="1.75"> - <artifact name="bcpkix-jdk18on-1.75.jar"> - <sha256 value="9e2c1db5a6ed29fbc36b438d39ca9feb901bb69bad0ce8d7bc735264bea79bd3" origin="Generated by Gradle"/> - </artifact> - <artifact name="bcpkix-jdk18on-1.75.pom"> - <sha256 value="16a278d9d5bfb0a79cb2df4588279de24ec18a4adeb8cd36a884ad2f6fb733cb" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.bouncycastle" name="bcpkix-jdk18on" version="1.76"> <artifact name="bcpkix-jdk18on-1.76.jar"> <sha256 value="935a388854c329f9a6f32708f30c90045d2f91294fa687281273145d4cf9834a" origin="Generated by Gradle"/> @@ -3505,28 +4088,12 @@ <artifact name="bcprov-jdk15on-1.70.pom"> <sha256 value="6df4b5b76d9062017664ad0ca285e57154ae803607cb89c970b39cc0e016abb0" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.bouncycastle" name="bcprov-jdk18on" version="1.75"> - <artifact name="bcprov-jdk18on-1.75.jar"> - <sha256 value="7f24018e9212dbda61c69212f8d7b1524c28efb978f10df590df3b4ccac47bd5" origin="Generated by Gradle"/> - </artifact> - <artifact name="bcprov-jdk18on-1.75.pom"> - <sha256 value="c6ccf55fbb9ea10c62bb20622737993099d4774688eaa0d4a45e1eedaadb9134" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.bouncycastle" name="bcprov-jdk18on" version="1.76"> <artifact name="bcprov-jdk18on-1.76.jar"> <sha256 value="fda85d777aaae168015860b23a77cad9b8d3a1d5c904fda875313427bd560179" origin="Generated by Gradle"/> </artifact> <artifact name="bcprov-jdk18on-1.76.pom"> <sha256 value="153009592d3b8f8349f97b8f1538bef0c83341b026918a2327dace22334ffee8" origin="Generated by Gradle"/> - </artifact> - </component> - <component group="org.bouncycastle" name="bcutil-jdk18on" version="1.75"> - <artifact name="bcutil-jdk18on-1.75.jar"> - <sha256 value="027f36578c1ffdf08878c1cc2aa1e191f4b9da119c1e8f113299c53f298fa664" origin="Generated by Gradle"/> - </artifact> - <artifact name="bcutil-jdk18on-1.75.pom"> - <sha256 value="1e60c25685e521d9eba47713df575f8e5171cac6562a243f99616bbf5a8e7b06" origin="Generated by Gradle"/> </artifact> </component> <component group="org.bouncycastle" name="bcutil-jdk18on" version="1.76"> @@ -3572,6 +4139,17 @@ <artifact name="checker-qual-3.32.0.pom"> <sha256 value="795a88652a6edefa1c30fdbab280129e4183b1acf994ac74be43f3eb8aa77dcf" origin="Generated by Gradle"/> </artifact> </component> + <component group="org.checkerframework" name="checker-qual" version="3.37.0"> + <artifact name="checker-qual-3.37.0.jar"> + <sha256 value="e4ce1376cc2735e1dde220b62ad0913f51297704daad155a33f386bc5db0d9f7" origin="Generated by Gradle"/> + </artifact> + <artifact name="checker-qual-3.37.0.module"> + <sha256 value="7258a769dcaa26b98154d229d85cc72e5b3666b0bcb637d2daf16ec498956638" origin="Generated by Gradle"/> + </artifact> + <artifact name="checker-qual-3.37.0.pom"> + <sha256 value="02392fbd4ce21901f945615472b1d4d4d3591b3aabdf013105f5c92ec32cb4f0" origin="Generated by Gradle"/> + </artifact> + </component> <component group="org.checkerframework" name="checker-qual" version="3.5.0"> <artifact name="checker-qual-3.5.0.jar"> <sha256 value="729990b3f18a95606fc2573836b6958bcdb44cb52bfbd1b7aa9c339cff35a5a4" origin="Generated by Gradle"/> @@ -3617,14 +4195,32 @@ <artifact name="animal-sniffer-annotations-1.21.pom"> <sha256 value="cdeadc0096afb308ed6846a33b83afa6ebf2be1bab0e667217635fe71f0324af" origin="Generated by Gradle"/> </artifact> </component> + <component group="org.codehaus.mojo" name="animal-sniffer-annotations" version="1.23"> + <artifact name="animal-sniffer-annotations-1.23.jar"> + <sha256 value="9ffe526bf43a6348e9d8b33b9cd6f580a7f5eed0cf055913007eda263de974d0" origin="Generated by Gradle"/> + </artifact> + <artifact name="animal-sniffer-annotations-1.23.pom"> + <sha256 value="5610db06b733641acbc7a0c48a80c40069db627bad043f8c7c8d7afb4f6a3d27" origin="Generated by Gradle"/> + </artifact> + </component> <component group="org.codehaus.mojo" name="animal-sniffer-parent" version="1.21"> <artifact name="animal-sniffer-parent-1.21.pom"> <sha256 value="426357a74b8ebaa1889222d81507430b1816ca3ae3f5cab7e1845010e80c51fc" origin="Generated by Gradle"/> </artifact> </component> + <component group="org.codehaus.mojo" name="animal-sniffer-parent" version="1.23"> + <artifact name="animal-sniffer-parent-1.23.pom"> + <sha256 value="6b7f054ab86a87f8e2599f35808b0989922e86b6cab13988021cd12640a4b404" origin="Generated by Gradle"/> + </artifact> + </component> <component group="org.codehaus.mojo" name="mojo-parent" version="65"> <artifact name="mojo-parent-65.pom"> <sha256 value="c89fb440a597b83eecca108ac598519493688eb033e8542e51a2b0428da8a676" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.mojo" name="mojo-parent" version="74"> + <artifact name="mojo-parent-74.pom"> + <sha256 value="1472325a16f0b1bdabed21fa4839372964944610294ce2681b2059edc654f2b3" origin="Generated by Gradle"/> </artifact> </component> <component group="org.codehaus.plexus" name="plexus" version="2.0.6"> @@ -3951,11 +4547,6 @@ <sha256 value="f90fa8dd89b9da7d5e817281f963b46ad1414d33376354e541464434f0b23c90" origin="Generated by Gradle"/> </artifact> <artifact name="org.eclipse.core.contenttype-3.8.0.pom"> <sha256 value="7d18f6e62ef5014ba73c54159266f7c883c0d3fc3fe29e83c4734a5bf61e2fad" origin="Generated by Gradle"/> - </artifact> - </component> - <component group="org.eclipse.platform" name="org.eclipse.core.expressions" version="3.9.0"> - <artifact name="org.eclipse.core.expressions-3.9.0.pom"> - <sha256 value="5dbad4676c7ffa80cf71f63e1b045d05d5e0c912a597d3cef1c28e9e2bf3bb16" origin="Generated by Gradle"/> </artifact> </component> <component group="org.eclipse.platform" name="org.eclipse.core.expressions" version="3.9.100"> @@ -3963,6 +4554,11 @@ <artifact name="org.eclipse.core.expressions-3.9.100.pom"> <sha256 value="5f7e01a94adbd52546c0d03af525697197165e36b73d914c6a05e3aab8905e6e" origin="Generated by Gradle"/> </artifact> </component> + <component group="org.eclipse.platform" name="org.eclipse.core.expressions" version="3.9.200"> + <artifact name="org.eclipse.core.expressions-3.9.200.pom"> + <sha256 value="74e5f0e9f0d7fc442396ca959e738d1ad9b622e945ad3cd9a323bb8cdfea9826" origin="Generated by Gradle"/> + </artifact> + </component> <component group="org.eclipse.platform" name="org.eclipse.core.filesystem" version="1.9.100"> <artifact name="org.eclipse.core.filesystem-1.9.100.jar"> <sha256 value="36e802c4d9a2c864e7d6b22b8d06f59927d113475ea04b3fd9bf6312d5a97ff6" origin="Generated by Gradle"/> @@ -4051,14 +4647,14 @@ <artifact name="org.eclipse.osgi-3.17.0.pom"> <sha256 value="7890e52381b9d0f0e52922e412769a4717403476d0bfc4efd4cbdf8f5e01a0a6" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.eclipse.platform" name="org.eclipse.swt" version="3.124.0"> - <artifact name="org.eclipse.swt-3.124.0.pom"> - <sha256 value="87edfca927216638d1ebb3168cee8821e7e81d4a459325765040d8308d09ba38" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.eclipse.platform" name="org.eclipse.swt" version="3.124.100"> <artifact name="org.eclipse.swt-3.124.100.pom"> <sha256 value="e6a79e8bc53281ecbe3433a52c713b75ba8fa06e03b9f279b027f68ba078085e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.eclipse.platform" name="org.eclipse.swt" version="3.124.200"> + <artifact name="org.eclipse.swt-3.124.200.pom"> + <sha256 value="4d87cb2d94dab15fba1564ae574b60988939c76176d86882847332dcea6a3f77" origin="Generated by Gradle"/> </artifact> </component> <component group="org.eclipse.platform" name="org.eclipse.text" version="3.12.0"> @@ -4180,17 +4776,6 @@ <artifact name="hamcrest-parent-1.3.pom"> <sha256 value="6d535f94efb663bdb682c9f27a50335394688009642ba7a9677504bc1be4129b" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.hyperledger.besu" name="arithmetic" version="0.8.1"> - <artifact name="arithmetic-0.8.1.jar"> - <sha256 value="17ab44a742073928b1afb57ccd288a729a4406c75d9fe4bbf1d28a988f647322" origin="Generated by Gradle"/> - </artifact> - <artifact name="arithmetic-0.8.1.module"> - <sha256 value="cdfa5332277e72884499c85f4619fbeec5b34484c4a29a534b239fcc174f1a3e" origin="Generated by Gradle"/> - </artifact> - <artifact name="arithmetic-0.8.1.pom"> - <sha256 value="73ba8ae254e8f8ae7d7f3bfcb5f01a3826533bde7aba26d652d2d454c6e07d70" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.hyperledger.besu" name="arithmetic" version="0.8.2"> <artifact name="arithmetic-0.8.2.jar"> <sha256 value="d7a61afb72e184c99e1146c42a3b6276b0b9677fec285e8a2f64528da427a4b2" origin="Generated by Gradle"/> @@ -4202,17 +4787,6 @@ <artifact name="arithmetic-0.8.2.pom"> <sha256 value="4c23f63d0bf763610d1184a925c8a4a8a71161a268c1b679d3624a12b3f987e2" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.hyperledger.besu" name="blake2bf" version="0.8.1"> - <artifact name="blake2bf-0.8.1.jar"> - <sha256 value="a604d6aa5e5b8195702bd37021bcc75ca71bb82fc5f9d6b62e728470d00eaa1f" origin="Generated by Gradle"/> - </artifact> - <artifact name="blake2bf-0.8.1.module"> - <sha256 value="ff14dd9b0243cd0b2857ff20e188ba0ad24ba749a2cf93320f1645e468f849cf" origin="Generated by Gradle"/> - </artifact> - <artifact name="blake2bf-0.8.1.pom"> - <sha256 value="6bdcec4fc08e4d54f77d1226b738874901a2de42849dfb76a28740c6954c4e3b" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.hyperledger.besu" name="blake2bf" version="0.8.2"> <artifact name="blake2bf-0.8.2.jar"> <sha256 value="cb2abade577e17f72c4ad193d61d03cdae43cc0b6bb5b00220038e56643f7e45" origin="Generated by Gradle"/> @@ -4224,17 +4798,6 @@ <artifact name="blake2bf-0.8.2.pom"> <sha256 value="075857689d984c8e8324a1f7323964cb7ece1a9bc17f29cc1918e6b5bbc8a94e" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.hyperledger.besu" name="bls12-381" version="0.8.1"> - <artifact name="bls12-381-0.8.1.jar"> - <sha256 value="271008a549cb5d881139dd750d7d0258a8ff31618ea36cb3f9a5b4a3df5f9a99" origin="Generated by Gradle"/> - </artifact> - <artifact name="bls12-381-0.8.1.module"> - <sha256 value="7ef3eca6a239d399069500025a36ab683182a70ea0f620922412561cd2ca3475" origin="Generated by Gradle"/> - </artifact> - <artifact name="bls12-381-0.8.1.pom"> - <sha256 value="b58307308d609c35afb8af07499cc82972164840c9cb051952ca64eea0e40143" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.hyperledger.besu" name="bls12-381" version="0.8.2"> <artifact name="bls12-381-0.8.2.jar"> <sha256 value="3cb42d5724d1d349d5bdd1620d9032e59591aa18ed59394949a945818dcce5d2" origin="Generated by Gradle"/> @@ -4246,17 +4809,6 @@ <artifact name="bls12-381-0.8.2.pom"> <sha256 value="d4531bcb20a6c9fc0404af8c7bf78a913967bdf3901ebb49de5d4bdff501c843" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.hyperledger.besu" name="ipa-multipoint" version="0.8.1"> - <artifact name="ipa-multipoint-0.8.1.jar"> - <sha256 value="ade17354e57645288634f6242e68fc1299afa7732773b3d5ef7c98157567c8aa" origin="Generated by Gradle"/> - </artifact> - <artifact name="ipa-multipoint-0.8.1.module"> - <sha256 value="24fc671bd08f69bb8b24c63ac541490e6936aa3b73ba0ab8a95d9776d1531e52" origin="Generated by Gradle"/> - </artifact> - <artifact name="ipa-multipoint-0.8.1.pom"> - <sha256 value="c24ab5dd06233b9395a72ee24a24e415dbbdcc43ef4c49d290814e950296c4f7" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.hyperledger.besu" name="ipa-multipoint" version="0.8.2"> <artifact name="ipa-multipoint-0.8.2.jar"> <sha256 value="d045ef09d3d8b9b596c6344e763f148d57c66b1dcfeec1fd40ff965c61d973bc" origin="Generated by Gradle"/> @@ -4268,17 +4820,6 @@ <artifact name="ipa-multipoint-0.8.2.pom"> <sha256 value="60b276bdf73c848deeb53d27a628cd59aaede370206a2c47c5ea9793d993cb3e" origin="Generated by Gradle"/> </artifact> </component> - <component group="org.hyperledger.besu" name="secp256k1" version="0.8.1"> - <artifact name="secp256k1-0.8.1.jar"> - <sha256 value="95331608c36d19ad455f48df123f6aa2a20d865dad25a6d0a7b10b83d381c71b" origin="Generated by Gradle"/> - </artifact> - <artifact name="secp256k1-0.8.1.module"> - <sha256 value="973656e5260173c2366c272762bb04f94195da084fcca275f7db3ea0c07efb71" origin="Generated by Gradle"/> - </artifact> - <artifact name="secp256k1-0.8.1.pom"> - <sha256 value="4f2eb7ad7e5b1a7d69e95223604bdb85cc2d3fec4710bc15856c844e329037ad" origin="Generated by Gradle"/> - </artifact> - </component> <component group="org.hyperledger.besu" name="secp256k1" version="0.8.2"> <artifact name="secp256k1-0.8.2.jar"> <sha256 value="d6327378561501c7034c616fd0f85da4c24981c11d3fcec2163a8e92a32a48d8" origin="Generated by Gradle"/> @@ -4288,17 +4829,6 @@ <sha256 value="8e3a6da218d83990bbe2235da48bb9d8623001bbf25e324c8a463c5933574706" origin="Generated by Gradle"/> </artifact> <artifact name="secp256k1-0.8.2.pom"> <sha256 value="45d2e4243bdf8f3cabdf8668f712440753319fb6e322bc47001fdd39b5240ec1" origin="Generated by Gradle"/> - </artifact> - </component> - <component group="org.hyperledger.besu" name="secp256r1" version="0.8.1"> - <artifact name="secp256r1-0.8.1.jar"> - <sha256 value="9b7b8f3f557ad9216ed36a2f8ef8427fba78090d4d8bcb413d117993b4f9473e" origin="Generated by Gradle"/> - </artifact> - <artifact name="secp256r1-0.8.1.module"> - <sha256 value="978025ed434182f72a58fd6d21cd78ab2f63899960827794d42087785dbc3902" origin="Generated by Gradle"/> - </artifact> - <artifact name="secp256r1-0.8.1.pom"> - <sha256 value="05f166863653b500393778a380245fbd6fc4e6c33075d0a13f4ba5fcfb514a71" origin="Generated by Gradle"/> </artifact> </component> <component group="org.hyperledger.besu" name="secp256r1" version="0.8.2"> @@ -5562,6 +6092,17 @@ <sha256 value="55802e5e957861b5bc4b92f55cbf46bb160cd2599a2051a1ab9d8f408192341b" origin="Generated by Gradle"/> </artifact> <artifact name="jc-kzg-4844-0.7.0.pom"> <sha256 value="ed2dbfb82d035907f68c6448b1a959aa121b04c15650f10f3de0a891af519cc0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="tech.pegasys" name="jc-kzg-4844" version="0.8.0"> + <artifact name="jc-kzg-4844-0.8.0.jar"> + <sha256 value="dc52dcca22772671825a081d9819d774753dfc8d2fe751e8ba75506649cc4793" origin="Generated by Gradle"/> + </artifact> + <artifact name="jc-kzg-4844-0.8.0.module"> + <sha256 value="1f3ff9df2825c47611e9dd3c4090c0a8223c547a53e6210b2157c78442fd3a3b" origin="Generated by Gradle"/> + </artifact> + <artifact name="jc-kzg-4844-0.8.0.pom"> + <sha256 value="0eabc50a504a10b49e6965523e91943d3cbceb0f70cde5962f4a215dcc198f32" origin="Generated by Gradle"/> </artifact> </component> <component group="tech.pegasys.discovery" name="discovery" version="22.2.0">