From e5e4eca4ab3dcfc4dfc164a5ecf23a35b2a067ae Mon Sep 17 00:00:00 2001 From: Jiri Peinlich Date: Tue, 24 Jan 2023 15:48:35 +0100 Subject: [PATCH] verfifying kzg proof (#4994) Signed-off-by: Jiri Peinlich (cherry picked from commit 8e3a912b283424c3ffbfe93619407e2167db601e) (cherry picked from commit c325682b0f8acadc411acd6daafb55f5941785a0) --- .../mainnet/MainnetTransactionValidator.java | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java index 81a86db02e5..8940f6b8026 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionValidator.java @@ -48,8 +48,8 @@ */ public class MainnetTransactionValidator { - // private final long MAX_DATA_GAS_PER_BLOCK = 524_288; // 2**19 - // private final long DATA_GAS_PER_BLOB = 131_072; // 2**17 + private final long MAX_DATA_GAS_PER_BLOCK = 524_288; // 2**19 + private final long DATA_GAS_PER_BLOB = 131_072; // 2**17 private final byte BLOB_COMMITMENT_VERSION_KZG = 0x01; private final GasCalculator gasCalculator; @@ -130,6 +130,14 @@ public ValidationResult validate( if (!signatureResult.isValid()) { return signatureResult; } + if (transaction.getType().equals(TransactionType.BLOB) + && transaction.getBlobsWithCommitments().isPresent()) { + final ValidationResult blobsResult = + validateTransactionsBlobs(transaction); + if (!blobsResult.isValid()) { + return blobsResult; + } + } if (transaction.getType().supportsBlob() && transaction.getBlobsWithCommitments().isPresent()) { final ValidationResult blobsResult = @@ -330,14 +338,14 @@ public ValidationResult validateTransactionsBlobs( Transaction.BlobsWithCommitments blobsWithCommitments = transaction.getBlobsWithCommitments().get(); - final long blobsLimit = gasLimitCalculator.currentDataGasLimit() / gasCalculator.dataGasCost(1); - if (blobsWithCommitments.blobs.getElements().size() > blobsLimit) { + if (blobsWithCommitments.blobs.getElements().size() + > MAX_DATA_GAS_PER_BLOCK / DATA_GAS_PER_BLOB) { return ValidationResult.invalid( TransactionInvalidReason.INVALID_BLOBS, "Too many transaction blobs (" + blobsWithCommitments.blobs.getElements().size() + ") in transaction, max is " - + blobsLimit); + + MAX_DATA_GAS_PER_BLOCK / DATA_GAS_PER_BLOB); } if (blobsWithCommitments.blobs.getElements().size() @@ -361,23 +369,13 @@ public ValidationResult validateTransactionsBlobs( TransactionInvalidReason.INVALID_BLOBS, "transaction versioned hashes are empty, cannot verify without versioned hashes"); } - final List versionedHashes = transaction.getVersionedHashes().get(); + List versionedHashes = transaction.getVersionedHashes().get(); for (int i = 0; i < versionedHashes.size(); i++) { - final TransactionNetworkPayload.KZGCommitment commitment = + TransactionNetworkPayload.KZGCommitment commitment = blobsWithCommitments.kzgCommitments.getElements().get(i); - final Hash versionedHash = versionedHashes.get(i); - - if (versionedHash.get(0) != BLOB_COMMITMENT_VERSION_KZG) { - return ValidationResult.invalid( - TransactionInvalidReason.INVALID_BLOBS, - "transaction blobs commitment version is not supported. Expected " - + BLOB_COMMITMENT_VERSION_KZG - + ", found " - + versionedHash.get(0)); - } - - final Hash calculatedVersionedHash = hashCommitment(commitment); + Hash versionedHash = versionedHashes.get(i); + Hash calculatedVersionedHash = hashCommitment(commitment); if (!calculatedVersionedHash.equals(versionedHash)) { return ValidationResult.invalid( TransactionInvalidReason.INVALID_BLOBS, @@ -385,25 +383,29 @@ public ValidationResult validateTransactionsBlobs( } } - final Bytes blobs = + Bytes blobs = blobsWithCommitments.blobs.getElements().stream() - .map(TransactionNetworkPayload.Blob::getBytes) + .map( + blob -> + blob.getElements().stream() + .map(sszuInt256Wrapper -> (Bytes) sszuInt256Wrapper.getData().toBytes()) + .reduce(Bytes::concatenate) + .orElseThrow()) .reduce(Bytes::concatenate) .orElseThrow(); - final Bytes kzgCommitments = + Bytes kzgCommitments = blobsWithCommitments.kzgCommitments.getElements().stream() .map(commitment -> commitment.getData()) .reduce(Bytes::concatenate) .orElseThrow(); - final boolean kzgVerification = + boolean kzgVerification = CKZG4844JNI.verifyAggregateKzgProof( blobs.toArrayUnsafe(), kzgCommitments.toArrayUnsafe(), blobsWithCommitments.blobs.getElements().size(), blobsWithCommitments.kzgProof.getBytes().toArrayUnsafe()); - if (!kzgVerification) { return ValidationResult.invalid( TransactionInvalidReason.INVALID_BLOBS, @@ -414,7 +416,7 @@ public ValidationResult validateTransactionsBlobs( } private Hash hashCommitment(final TransactionNetworkPayload.KZGCommitment commitment) { - final SHA256Digest digest = new SHA256Digest(); + SHA256Digest digest = new SHA256Digest(); digest.update(commitment.getData().toArrayUnsafe(), 0, commitment.getData().size()); final byte[] dig = new byte[digest.getDigestSize()];