Skip to content

Commit

Permalink
verfifying kzg proof (#4994)
Browse files Browse the repository at this point in the history
Signed-off-by: Jiri Peinlich <jiri.peinlich@gmail.com>
(cherry picked from commit 8e3a912)
(cherry picked from commit c325682b0f8acadc411acd6daafb55f5941785a0)
  • Loading branch information
gezero authored and jflo committed Jun 15, 2023
1 parent 437c76b commit 82efda6
Showing 1 changed file with 27 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -130,6 +130,14 @@ public ValidationResult<TransactionInvalidReason> validate(
if (!signatureResult.isValid()) {
return signatureResult;
}
if (transaction.getType().equals(TransactionType.BLOB)
&& transaction.getBlobsWithCommitments().isPresent()) {
final ValidationResult<TransactionInvalidReason> blobsResult =
validateTransactionsBlobs(transaction);
if (!blobsResult.isValid()) {
return blobsResult;
}
}

if (transaction.getType().supportsBlob() && transaction.getBlobsWithCommitments().isPresent()) {
final ValidationResult<TransactionInvalidReason> blobsResult =
Expand Down Expand Up @@ -330,14 +338,14 @@ public ValidationResult<TransactionInvalidReason> 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()
Expand All @@ -361,49 +369,43 @@ public ValidationResult<TransactionInvalidReason> validateTransactionsBlobs(
TransactionInvalidReason.INVALID_BLOBS,
"transaction versioned hashes are empty, cannot verify without versioned hashes");
}
final List<Hash> versionedHashes = transaction.getVersionedHashes().get();
List<Hash> 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,
"transaction blobs commitment hash does not match commitment");
}
}

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,
Expand All @@ -414,7 +416,7 @@ public ValidationResult<TransactionInvalidReason> 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()];
Expand Down

0 comments on commit 82efda6

Please sign in to comment.