@aztec/blob-lib 0.0.1-commit.c2eed6949 → 0.0.1-commit.c52d6e7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ import { Blob } from './blob.js';
5
5
  import { BlobAccumulator, FinalBlobAccumulator, FinalBlobBatchingChallenges } from './circuit_types/index.js';
6
6
  /**
7
7
  * A class to create, manage, and prove batched EVM blobs.
8
- * See noir-projects/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr
8
+ * See noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr
9
9
  */
10
10
  export declare class BatchedBlobAccumulator {
11
11
  /** Hash of Cs (to link to L1 blob hashes). */
@@ -103,7 +103,7 @@ export declare class BatchedBlobAccumulator {
103
103
  * - z := z_acc (final challenge, at which all blobs are evaluated)
104
104
  * - y := y_acc (final opening to be checked on L1)
105
105
  * - c := c_acc (final commitment to be checked on L1)
106
- * - gamma := poseidon2(gamma_acc, z) (challenge for linear combination of y and C, above)
106
+ * - gamma := poseidon2(BLOB_GAMMA_FINAL, gamma_acc, z) (challenge for linear combination of y and C, above)
107
107
  *
108
108
  * @param verifyProof - Whether to verify the KZG proof.
109
109
  * @returns A batched blob.
@@ -115,4 +115,4 @@ export declare class BatchedBlobAccumulator {
115
115
  toBlobAccumulator(): BlobAccumulator;
116
116
  toFinalBlobAccumulator(): FinalBlobAccumulator;
117
117
  }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYl9iYXRjaGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2JfYmF0Y2hpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSTlHOzs7R0FHRztBQUNILHFCQUFhLHNCQUFzQjtJQUUvQiw4Q0FBOEM7YUFDOUIsc0JBQXNCLEVBQUUsRUFBRTtJQUMxQyxzRUFBc0U7YUFDdEQsSUFBSSxFQUFFLEVBQUU7SUFDeEIseUdBQXlHO2FBQ3pGLElBQUksRUFBRSxPQUFPO0lBQzdCLHFHQUFxRzthQUNyRixJQUFJLEVBQUUsVUFBVTtJQUNoQyxvR0FBb0c7YUFDcEYsSUFBSSxFQUFFLFVBQVU7SUFDaEM7Ozs7T0FJRzthQUNhLFFBQVEsRUFBRSxFQUFFO0lBQzVCLHVHQUF1RzthQUN2RixRQUFRLEVBQUUsT0FBTztJQUNqQyxvR0FBb0c7YUFDcEYsbUJBQW1CLEVBQUUsMkJBQTJCO0lBcEJsRTtJQUNFLDhDQUE4QztJQUM5QixzQkFBc0IsRUFBRSxFQUFFO0lBQzFDLHNFQUFzRTtJQUN0RCxJQUFJLEVBQUUsRUFBRTtJQUN4Qix5R0FBeUc7SUFDekYsSUFBSSxFQUFFLE9BQU87SUFDN0IscUdBQXFHO0lBQ3JGLElBQUksRUFBRSxVQUFVO0lBQ2hDLG9HQUFvRztJQUNwRixJQUFJLEVBQUUsVUFBVTtJQUNoQzs7OztPQUlHO0lBQ2EsUUFBUSxFQUFFLEVBQUU7SUFDNUIsdUdBQXVHO0lBQ3ZGLFFBQVEsRUFBRSxPQUFPO0lBQ2pDLG9HQUFvRztJQUNwRixtQkFBbUIsRUFBRSwyQkFBMkIsRUFDOUQ7SUFFSjs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsMkJBQTJCLEdBQUcsc0JBQXNCLENBV2pHO0lBRUQ7Ozs7T0FJRztJQUNILE9BQWEsY0FBYyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBRzVGO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBYSxLQUFLLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLFVBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBZTdGO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxPQUFhLCtCQUErQixDQUFDLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBbUNsSDtJQUVEOzs7O09BSUc7SUFDRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxtQ0F1Q2xEO0lBRUQ7Ozs7O09BS0c7SUFDRyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLG1DQWtCdEM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0csUUFBUSxDQUFDLFdBQVcsVUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FzQnhEO0lBRUQsTUFBTSxZQU9MO0lBRUQsWUFBWSxZQVVYO0lBRUQsS0FBSywyQkFXSjtJQUVELGlCQUFpQixvQkFTaEI7SUFFRCxzQkFBc0IseUJBRXJCO0NBQ0YifQ==
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYl9iYXRjaGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2JfYmF0Y2hpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSTlHOzs7R0FHRztBQUNILHFCQUFhLHNCQUFzQjtJQUUvQiw4Q0FBOEM7YUFDOUIsc0JBQXNCLEVBQUUsRUFBRTtJQUMxQyxzRUFBc0U7YUFDdEQsSUFBSSxFQUFFLEVBQUU7SUFDeEIseUdBQXlHO2FBQ3pGLElBQUksRUFBRSxPQUFPO0lBQzdCLHFHQUFxRzthQUNyRixJQUFJLEVBQUUsVUFBVTtJQUNoQyxvR0FBb0c7YUFDcEYsSUFBSSxFQUFFLFVBQVU7SUFDaEM7Ozs7T0FJRzthQUNhLFFBQVEsRUFBRSxFQUFFO0lBQzVCLHVHQUF1RzthQUN2RixRQUFRLEVBQUUsT0FBTztJQUNqQyxvR0FBb0c7YUFDcEYsbUJBQW1CLEVBQUUsMkJBQTJCO0lBcEJsRTtJQUNFLDhDQUE4QztJQUM5QixzQkFBc0IsRUFBRSxFQUFFO0lBQzFDLHNFQUFzRTtJQUN0RCxJQUFJLEVBQUUsRUFBRTtJQUN4Qix5R0FBeUc7SUFDekYsSUFBSSxFQUFFLE9BQU87SUFDN0IscUdBQXFHO0lBQ3JGLElBQUksRUFBRSxVQUFVO0lBQ2hDLG9HQUFvRztJQUNwRixJQUFJLEVBQUUsVUFBVTtJQUNoQzs7OztPQUlHO0lBQ2EsUUFBUSxFQUFFLEVBQUU7SUFDNUIsdUdBQXVHO0lBQ3ZGLFFBQVEsRUFBRSxPQUFPO0lBQ2pDLG9HQUFvRztJQUNwRixtQkFBbUIsRUFBRSwyQkFBMkIsRUFDOUQ7SUFFSjs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsMkJBQTJCLEdBQUcsc0JBQXNCLENBV2pHO0lBRUQ7Ozs7T0FJRztJQUNILE9BQWEsY0FBYyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBRzVGO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBYSxLQUFLLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLFVBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBZTdGO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxPQUFhLCtCQUErQixDQUFDLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBbUNsSDtJQUVEOzs7O09BSUc7SUFDRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxtQ0F1Q2xEO0lBRUQ7Ozs7O09BS0c7SUFDRyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLG1DQWtCdEM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0csUUFBUSxDQUFDLFdBQVcsVUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0F5QnhEO0lBRUQsTUFBTSxZQU9MO0lBRUQsWUFBWSxZQVVYO0lBRUQsS0FBSywyQkFXSjtJQUVELGlCQUFpQixvQkFTaEI7SUFFRCxzQkFBc0IseUJBRXJCO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"blob_batching.d.ts","sourceRoot":"","sources":["../src/blob_batching.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAI9G;;;GAGG;AACH,qBAAa,sBAAsB;IAE/B,8CAA8C;aAC9B,sBAAsB,EAAE,EAAE;IAC1C,sEAAsE;aACtD,IAAI,EAAE,EAAE;IACxB,yGAAyG;aACzF,IAAI,EAAE,OAAO;IAC7B,qGAAqG;aACrF,IAAI,EAAE,UAAU;IAChC,oGAAoG;aACpF,IAAI,EAAE,UAAU;IAChC;;;;OAIG;aACa,QAAQ,EAAE,EAAE;IAC5B,uGAAuG;aACvF,QAAQ,EAAE,OAAO;IACjC,oGAAoG;aACpF,mBAAmB,EAAE,2BAA2B;IApBlE;IACE,8CAA8C;IAC9B,sBAAsB,EAAE,EAAE;IAC1C,sEAAsE;IACtD,IAAI,EAAE,EAAE;IACxB,yGAAyG;IACzF,IAAI,EAAE,OAAO;IAC7B,qGAAqG;IACrF,IAAI,EAAE,UAAU;IAChC,oGAAoG;IACpF,IAAI,EAAE,UAAU;IAChC;;;;OAIG;IACa,QAAQ,EAAE,EAAE;IAC5B,uGAAuG;IACvF,QAAQ,EAAE,OAAO;IACjC,oGAAoG;IACpF,mBAAmB,EAAE,2BAA2B,EAC9D;IAEJ;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,2BAA2B,GAAG,sBAAsB,CAWjG;IAED;;;;OAIG;IACH,OAAa,cAAc,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAG5F;IAED;;;;;;OAMG;IACH,OAAa,KAAK,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAe7F;IAED;;;;;;;;;;;OAWG;IACH,OAAa,+BAA+B,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAmClH;IAED;;;;OAIG;IACG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,mCAuClD;IAED;;;;;OAKG;IACG,gBAAgB,CAAC,UAAU,EAAE,EAAE,EAAE,mCAkBtC;IAED;;;;;;;;;;;;;OAaG;IACG,QAAQ,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBxD;IAED,MAAM,YAOL;IAED,YAAY,YAUX;IAED,KAAK,2BAWJ;IAED,iBAAiB,oBAShB;IAED,sBAAsB,yBAErB;CACF"}
1
+ {"version":3,"file":"blob_batching.d.ts","sourceRoot":"","sources":["../src/blob_batching.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAI9G;;;GAGG;AACH,qBAAa,sBAAsB;IAE/B,8CAA8C;aAC9B,sBAAsB,EAAE,EAAE;IAC1C,sEAAsE;aACtD,IAAI,EAAE,EAAE;IACxB,yGAAyG;aACzF,IAAI,EAAE,OAAO;IAC7B,qGAAqG;aACrF,IAAI,EAAE,UAAU;IAChC,oGAAoG;aACpF,IAAI,EAAE,UAAU;IAChC;;;;OAIG;aACa,QAAQ,EAAE,EAAE;IAC5B,uGAAuG;aACvF,QAAQ,EAAE,OAAO;IACjC,oGAAoG;aACpF,mBAAmB,EAAE,2BAA2B;IApBlE;IACE,8CAA8C;IAC9B,sBAAsB,EAAE,EAAE;IAC1C,sEAAsE;IACtD,IAAI,EAAE,EAAE;IACxB,yGAAyG;IACzF,IAAI,EAAE,OAAO;IAC7B,qGAAqG;IACrF,IAAI,EAAE,UAAU;IAChC,oGAAoG;IACpF,IAAI,EAAE,UAAU;IAChC;;;;OAIG;IACa,QAAQ,EAAE,EAAE;IAC5B,uGAAuG;IACvF,QAAQ,EAAE,OAAO;IACjC,oGAAoG;IACpF,mBAAmB,EAAE,2BAA2B,EAC9D;IAEJ;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,2BAA2B,GAAG,sBAAsB,CAWjG;IAED;;;;OAIG;IACH,OAAa,cAAc,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAG5F;IAED;;;;;;OAMG;IACH,OAAa,KAAK,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAe7F;IAED;;;;;;;;;;;OAWG;IACH,OAAa,+BAA+B,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAmClH;IAED;;;;OAIG;IACG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,mCAuClD;IAED;;;;;OAKG;IACG,gBAAgB,CAAC,UAAU,EAAE,EAAE,EAAE,mCAkBtC;IAED;;;;;;;;;;;;;OAaG;IACG,QAAQ,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAyBxD;IAED,MAAM,YAOL;IAED,YAAY,YAUX;IAED,KAAK,2BAWJ;IAED,iBAAiB,oBAShB;IAED,sBAAsB,yBAErB;CACF"}
@@ -1,16 +1,16 @@
1
- import { BLOBS_PER_CHECKPOINT, MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
2
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
1
+ import { BLOBS_PER_CHECKPOINT, DomainSeparator, MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
2
+ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
3
3
  import { sha256ToField } from '@aztec/foundation/crypto/sha256';
4
4
  import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
5
5
  import { Fr } from '@aztec/foundation/curves/bn254';
6
6
  import { BatchedBlob } from './batched_blob.js';
7
7
  import { getBlobsPerL1Block } from './blob_utils.js';
8
8
  import { BlobAccumulator, FinalBlobAccumulator, FinalBlobBatchingChallenges } from './circuit_types/index.js';
9
- import { computeBlobFieldsHash, hashNoirBigNumLimbs } from './hash.js';
9
+ import { computeBlobFieldsHash, hashBlobYLimbs } from './hash.js';
10
10
  import { getKzg } from './kzg_context.js';
11
11
  /**
12
12
  * A class to create, manage, and prove batched EVM blobs.
13
- * See noir-projects/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr
13
+ * See noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr
14
14
  */ export class BatchedBlobAccumulator {
15
15
  blobCommitmentsHashAcc;
16
16
  zAcc;
@@ -92,10 +92,10 @@ import { getKzg } from './kzg_context.js';
92
92
  if (!z) {
93
93
  z = challengeZ;
94
94
  } else {
95
- z = await poseidon2Hash([
95
+ z = await poseidon2HashWithSeparator([
96
96
  z,
97
97
  challengeZ
98
- ]);
98
+ ], DomainSeparator.BLOB_Z_ACC);
99
99
  }
100
100
  }
101
101
  allBlobs.push(...blobs);
@@ -105,20 +105,20 @@ import { getKzg } from './kzg_context.js';
105
105
  }
106
106
  // Now we have a shared challenge for all blobs, evaluate them...
107
107
  const proofObjects = await Promise.all(allBlobs.map((b)=>b.evaluate(z)));
108
- const evaluations = await Promise.all(proofObjects.map(({ y })=>hashNoirBigNumLimbs(y)));
108
+ const evaluations = await Promise.all(proofObjects.map(({ y })=>hashBlobYLimbs(y)));
109
109
  // ...and find the challenge for the linear combination of blobs.
110
110
  let gamma = evaluations[0];
111
111
  // We start at i = 1, because gamma is initialized as the first blob's evaluation.
112
112
  for(let i = 1; i < allBlobs.length; i++){
113
- gamma = await poseidon2Hash([
113
+ gamma = await poseidon2HashWithSeparator([
114
114
  gamma,
115
115
  evaluations[i]
116
- ]);
116
+ ], DomainSeparator.BLOB_GAMMA_ACC);
117
117
  }
118
- gamma = await poseidon2Hash([
118
+ gamma = await poseidon2HashWithSeparator([
119
119
  gamma,
120
120
  z
121
- ]);
121
+ ], DomainSeparator.BLOB_GAMMA_FINAL);
122
122
  return new FinalBlobBatchingChallenges(z, BLS12Fr.fromBN254Fr(gamma));
123
123
  }
124
124
  /**
@@ -141,19 +141,19 @@ import { getKzg } from './kzg_context.js';
141
141
  * - gamma^(i + 1) = gamma^1 = gamma // denoted gamma_pow_acc
142
142
  */ return new BatchedBlobAccumulator(sha256ToField([
143
143
  blob.commitment
144
- ]), blobChallengeZ, thisY, thisC, thisQ, await hashNoirBigNumLimbs(thisY), this.finalBlobChallenges.gamma, this.finalBlobChallenges);
144
+ ]), blobChallengeZ, thisY, thisC, thisQ, await hashBlobYLimbs(thisY), this.finalBlobChallenges.gamma, this.finalBlobChallenges);
145
145
  } else {
146
146
  // Moving from i - 1 to i, so:
147
147
  return new BatchedBlobAccumulator(sha256ToField([
148
148
  this.blobCommitmentsHashAcc,
149
149
  blob.commitment
150
- ]), await poseidon2Hash([
150
+ ]), await poseidon2HashWithSeparator([
151
151
  this.zAcc,
152
152
  blobChallengeZ
153
- ]), this.yAcc.add(thisY.mul(this.gammaPow)), this.cAcc.add(thisC.mul(this.gammaPow)), this.qAcc.add(thisQ.mul(this.gammaPow)), await poseidon2Hash([
153
+ ], DomainSeparator.BLOB_Z_ACC), this.yAcc.add(thisY.mul(this.gammaPow)), this.cAcc.add(thisC.mul(this.gammaPow)), this.qAcc.add(thisQ.mul(this.gammaPow)), await poseidon2HashWithSeparator([
154
154
  this.gammaAcc,
155
- await hashNoirBigNumLimbs(thisY)
156
- ]), this.gammaPow.mul(this.finalBlobChallenges.gamma), this.finalBlobChallenges);
155
+ await hashBlobYLimbs(thisY)
156
+ ], DomainSeparator.BLOB_GAMMA_ACC), this.gammaPow.mul(this.finalBlobChallenges.gamma), this.finalBlobChallenges);
157
157
  }
158
158
  }
159
159
  /**
@@ -184,16 +184,16 @@ import { getKzg } from './kzg_context.js';
184
184
  * - z := z_acc (final challenge, at which all blobs are evaluated)
185
185
  * - y := y_acc (final opening to be checked on L1)
186
186
  * - c := c_acc (final commitment to be checked on L1)
187
- * - gamma := poseidon2(gamma_acc, z) (challenge for linear combination of y and C, above)
187
+ * - gamma := poseidon2(BLOB_GAMMA_FINAL, gamma_acc, z) (challenge for linear combination of y and C, above)
188
188
  *
189
189
  * @param verifyProof - Whether to verify the KZG proof.
190
190
  * @returns A batched blob.
191
191
  */ async finalize(verifyProof = false) {
192
192
  // All values in acc are final, apart from gamma := poseidon2(gammaAcc, z):
193
- const calculatedGamma = await poseidon2Hash([
193
+ const calculatedGamma = await poseidon2HashWithSeparator([
194
194
  this.gammaAcc,
195
195
  this.zAcc
196
- ]);
196
+ ], DomainSeparator.BLOB_GAMMA_FINAL);
197
197
  // Check final values:
198
198
  if (!this.zAcc.equals(this.finalBlobChallenges.z)) {
199
199
  throw new Error(`Blob batching mismatch: accumulated z ${this.zAcc} does not equal injected z ${this.finalBlobChallenges.z}`);
@@ -2,7 +2,7 @@ import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { BufferReader, FieldReader } from '@aztec/foundation/serialize';
4
4
  /**
5
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr` for documentation.
5
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr` for documentation.
6
6
  */
7
7
  export declare class BlobAccumulator {
8
8
  blobCommitmentsHashAcc: Fr;
@@ -3,7 +3,7 @@ import { BLS12Fq, BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
4
  import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize';
5
5
  /**
6
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr` for documentation.
6
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr` for documentation.
7
7
  */ export class BlobAccumulator {
8
8
  blobCommitmentsHashAcc;
9
9
  zAcc;
@@ -3,7 +3,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { BufferReader } from '@aztec/foundation/serialize';
4
4
  import { inspect } from 'util';
5
5
  /**
6
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/final_blob_accumulator.nr` for documentation.
6
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/final_blob_accumulator.nr` for documentation.
7
7
  */
8
8
  export declare class FinalBlobAccumulator {
9
9
  blobCommitmentsHash: Fr;
@@ -5,7 +5,7 @@ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
5
5
  import { inspect } from 'util';
6
6
  _computedKey = inspect.custom;
7
7
  /**
8
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/final_blob_accumulator.nr` for documentation.
8
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/final_blob_accumulator.nr` for documentation.
9
9
  */ export class FinalBlobAccumulator {
10
10
  blobCommitmentsHash;
11
11
  z;
@@ -2,7 +2,7 @@ import { BLS12Fr } from '@aztec/foundation/curves/bls12';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { BufferReader } from '@aztec/foundation/serialize';
4
4
  /**
5
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/final_blob_batching_challenges.nr` for documentation.
5
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/final_blob_batching_challenges.nr` for documentation.
6
6
  */
7
7
  export declare class FinalBlobBatchingChallenges {
8
8
  readonly z: Fr;
@@ -2,7 +2,7 @@ import { BLS12Fr } from '@aztec/foundation/curves/bls12';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
4
4
  /**
5
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/final_blob_batching_challenges.nr` for documentation.
5
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/final_blob_batching_challenges.nr` for documentation.
6
6
  */ export class FinalBlobBatchingChallenges {
7
7
  z;
8
8
  gamma;
package/dest/hash.d.ts CHANGED
@@ -36,8 +36,9 @@ export declare function computeBlobCommitment(data: Uint8Array): Promise<Buffer>
36
36
  export declare function commitmentToFields(commitment: Buffer): [Fr, Fr];
37
37
  export declare function computeChallengeZ(blobFieldsHash: Fr, commitment: Buffer): Promise<Fr>;
38
38
  /**
39
- * Hash each u128 limb of the noir bignum struct representing the BLS field, to mimic the hash accumulation in the
40
- * rollup circuits.
39
+ * Hash the u128 limbs of a BLS field's noir bignum representation under the `BLOB_HASHED_Y_LIMBS` separator.
40
+ * Used to commit to blob evaluation values `y_i` before folding them into the gamma accumulator; mirrors the
41
+ * hash accumulation performed in the rollup circuits.
41
42
  */
42
- export declare function hashNoirBigNumLimbs(field: BLS12Fr): Promise<Fr>;
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU9wRDs7R0FFRztBQUNILHdCQUFnQiwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FJdEU7QUFPRCx3QkFBZ0IsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUVyRTtBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBSXJFO0FBRUQsd0JBQXNCLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQU03RTtBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCx3QkFBZ0Isa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FNL0Q7QUFFRCx3QkFBc0IsaUJBQWlCLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FHM0Y7QUFFRDs7O0dBR0c7QUFDSCx3QkFBc0IsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBR3JFIn0=
43
+ export declare function hashBlobYLimbs(field: BLS12Fr): Promise<Fr>;
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU9wRDs7R0FFRztBQUNILHdCQUFnQiwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FJdEU7QUFPRCx3QkFBZ0IsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUVyRTtBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBSXJFO0FBRUQsd0JBQXNCLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQU03RTtBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCx3QkFBZ0Isa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FNL0Q7QUFFRCx3QkFBc0IsaUJBQWlCLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FNM0Y7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQXNCLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FHaEUifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAOpD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAItE;AAOD,wBAAgB,gBAAgB,CAAC,sBAAsB,EAAE,MAAM,EAAE,GAAG,EAAE,CAErE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAIrE;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAM/D;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAG3F;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAGrE"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAOpD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAItE;AAOD,wBAAgB,gBAAgB,CAAC,sBAAsB,EAAE,MAAM,EAAE,GAAG,EAAE,CAErE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAIrE;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAM/D;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAM3F;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAGhE"}
package/dest/hash.js CHANGED
@@ -1,4 +1,5 @@
1
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
1
+ import { DomainSeparator } from '@aztec/constants';
2
+ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
2
3
  import { sha256, sha256ToField } from '@aztec/foundation/crypto/sha256';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { getBytesPerBlob, getBytesPerCommitment, getKzg } from './kzg_context.js';
@@ -65,16 +66,17 @@ export async function computeBlobCommitment(data) {
65
66
  }
66
67
  export async function computeChallengeZ(blobFieldsHash, commitment) {
67
68
  const commitmentFields = commitmentToFields(commitment);
68
- return await poseidon2Hash([
69
+ return await poseidon2HashWithSeparator([
69
70
  blobFieldsHash,
70
71
  commitmentFields[0],
71
72
  commitmentFields[1]
72
- ]);
73
+ ], DomainSeparator.BLOB_CHALLENGE_Z);
73
74
  }
74
75
  /**
75
- * Hash each u128 limb of the noir bignum struct representing the BLS field, to mimic the hash accumulation in the
76
- * rollup circuits.
77
- */ export async function hashNoirBigNumLimbs(field) {
76
+ * Hash the u128 limbs of a BLS field's noir bignum representation under the `BLOB_HASHED_Y_LIMBS` separator.
77
+ * Used to commit to blob evaluation values `y_i` before folding them into the gamma accumulator; mirrors the
78
+ * hash accumulation performed in the rollup circuits.
79
+ */ export async function hashBlobYLimbs(field) {
78
80
  const num = field.toNoirBigNum();
79
- return await poseidon2Hash(num.limbs.map(Fr.fromHexString));
81
+ return await poseidon2HashWithSeparator(num.limbs.map(Fr.fromHexString), DomainSeparator.BLOB_HASHED_Y_LIMBS);
80
82
  }
@@ -1,10 +1,14 @@
1
+ import type { Logger } from '@aztec/foundation/log';
1
2
  import type { DasContextJs } from '@crate-crypto/node-eth-kzg';
2
3
  export type { DasContextJs } from '@crate-crypto/node-eth-kzg';
3
4
  export declare function getBytesPerBlob(): number;
4
5
  export declare function getBytesPerCommitment(): number;
5
6
  /**
6
- * Returns the lazily-initialized KZG context.
7
- * The first call takes ~3 seconds to initialize the precomputation tables.
7
+ * Returns the lazily-initialized KZG context. The first call synchronously builds the
8
+ * precomputation tables (~2s locally, blocking the event loop; longer under constrained CPU), so
9
+ * callers on a latency-sensitive path should warm it ahead of time. Pass a logger to record how
10
+ * long that first build took.
11
+ * @param logger - Optional logger; when provided, the initial table build is timed and logged.
8
12
  */
9
- export declare function getKzg(): DasContextJs;
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3pnX2NvbnRleHQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9remdfY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFlL0Qsd0JBQWdCLGVBQWUsSUFBSSxNQUFNLENBRXhDO0FBRUQsd0JBQWdCLHFCQUFxQixJQUFJLE1BQU0sQ0FFOUM7QUFJRDs7O0dBR0c7QUFDSCx3QkFBZ0IsTUFBTSxJQUFJLFlBQVksQ0FLckMifQ==
13
+ export declare function getKzg(logger?: Logger): DasContextJs;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3pnX2NvbnRleHQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9remdfY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFlL0Qsd0JBQWdCLGVBQWUsSUFBSSxNQUFNLENBRXhDO0FBRUQsd0JBQWdCLHFCQUFxQixJQUFJLE1BQU0sQ0FFOUM7QUFJRDs7Ozs7O0dBTUc7QUFDSCx3QkFBZ0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxZQUFZLENBT3BEIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"kzg_context.d.ts","sourceRoot":"","sources":["../src/kzg_context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM/D,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAe/D,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAID;;;GAGG;AACH,wBAAgB,MAAM,IAAI,YAAY,CAKrC"}
1
+ {"version":3,"file":"kzg_context.d.ts","sourceRoot":"","sources":["../src/kzg_context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM/D,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAe/D,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAID;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAOpD"}
@@ -1,3 +1,4 @@
1
+ import { elapsedSync } from '@aztec/foundation/timer';
1
2
  import { createRequire } from 'module';
2
3
  let nativeModule;
3
4
  /** Lazily loads the @crate-crypto/node-eth-kzg native module. */ function loadNativeModule() {
@@ -17,12 +18,19 @@ export function getBytesPerCommitment() {
17
18
  }
18
19
  let kzgInstance;
19
20
  /**
20
- * Returns the lazily-initialized KZG context.
21
- * The first call takes ~3 seconds to initialize the precomputation tables.
22
- */ export function getKzg() {
21
+ * Returns the lazily-initialized KZG context. The first call synchronously builds the
22
+ * precomputation tables (~2s locally, blocking the event loop; longer under constrained CPU), so
23
+ * callers on a latency-sensitive path should warm it ahead of time. Pass a logger to record how
24
+ * long that first build took.
25
+ * @param logger - Optional logger; when provided, the initial table build is timed and logged.
26
+ */ export function getKzg(logger) {
23
27
  if (!kzgInstance) {
24
- kzgInstance = loadNativeModule().DasContextJs.create({
25
- usePrecomp: true
28
+ const [durationMs, instance] = elapsedSync(()=>loadNativeModule().DasContextJs.create({
29
+ usePrecomp: true
30
+ }));
31
+ kzgInstance = instance;
32
+ logger?.verbose(`Loaded KZG trusted setup`, {
33
+ durationMs
26
34
  });
27
35
  }
28
36
  return kzgInstance;
@@ -3,7 +3,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { BufferReader, FieldReader, type Tuple } from '@aztec/foundation/serialize';
4
4
  /**
5
5
  * A Poseidon2 sponge used to accumulate data that will be added to blobs.
6
- * See noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr.
6
+ * See noir-projects/fnd/noir-protocol-circuits/crates/types/src/blob_data/sponge_blob.nr.
7
7
  */
8
8
  export declare class SpongeBlob {
9
9
  /** Sponge with absorbed fields that will go into one or more blobs. */
@@ -5,7 +5,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
5
5
  import { BufferReader, FieldReader, serializeToBuffer, serializeToFields } from '@aztec/foundation/serialize';
6
6
  /**
7
7
  * A Poseidon2 sponge used to accumulate data that will be added to blobs.
8
- * See noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr.
8
+ * See noir-projects/fnd/noir-protocol-circuits/crates/types/src/blob_data/sponge_blob.nr.
9
9
  */ export class SpongeBlob {
10
10
  sponge;
11
11
  numAbsorbedFields;
@@ -17,7 +17,7 @@ import { BufferReader, FieldReader, serializeToBuffer, serializeToFields } from
17
17
  /**
18
18
  * Initialize the sponge blob to absorb data for a checkpoint.
19
19
  */ static init() {
20
- // This must match the implementation in noir-projects/noir-protocol-circuits/types/src/abis/sponge_blob.nr
20
+ // This must match the implementation in noir-projects/fnd/noir-protocol-circuits/crates/types/src/blob_data/sponge_blob.nr
21
21
  const iv = new Fr(BigInt(SpongeBlob.MAX_FIELDS) * TWO_POW_64);
22
22
  const sponge = Poseidon2Sponge.init(iv);
23
23
  return new SpongeBlob(sponge, 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/blob-lib",
3
- "version": "0.0.1-commit.c2eed6949",
3
+ "version": "0.0.1-commit.c52d6e7",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -27,8 +27,8 @@
27
27
  "../package.common.json"
28
28
  ],
29
29
  "dependencies": {
30
- "@aztec/constants": "0.0.1-commit.c2eed6949",
31
- "@aztec/foundation": "0.0.1-commit.c2eed6949",
30
+ "@aztec/constants": "0.0.1-commit.c52d6e7",
31
+ "@aztec/foundation": "0.0.1-commit.c52d6e7",
32
32
  "@crate-crypto/node-eth-kzg": "^0.10.0",
33
33
  "tslib": "^2.4.0"
34
34
  },
@@ -1,5 +1,5 @@
1
- import { BLOBS_PER_CHECKPOINT, MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
2
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
1
+ import { BLOBS_PER_CHECKPOINT, DomainSeparator, MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
2
+ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
3
3
  import { sha256ToField } from '@aztec/foundation/crypto/sha256';
4
4
  import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
5
5
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -8,12 +8,12 @@ import { BatchedBlob } from './batched_blob.js';
8
8
  import { Blob } from './blob.js';
9
9
  import { getBlobsPerL1Block } from './blob_utils.js';
10
10
  import { BlobAccumulator, FinalBlobAccumulator, FinalBlobBatchingChallenges } from './circuit_types/index.js';
11
- import { computeBlobFieldsHash, hashNoirBigNumLimbs } from './hash.js';
11
+ import { computeBlobFieldsHash, hashBlobYLimbs } from './hash.js';
12
12
  import { getKzg } from './kzg_context.js';
13
13
 
14
14
  /**
15
15
  * A class to create, manage, and prove batched EVM blobs.
16
- * See noir-projects/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr
16
+ * See noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr
17
17
  */
18
18
  export class BatchedBlobAccumulator {
19
19
  constructor(
@@ -116,7 +116,7 @@ export class BatchedBlobAccumulator {
116
116
  if (!z) {
117
117
  z = challengeZ;
118
118
  } else {
119
- z = await poseidon2Hash([z, challengeZ]);
119
+ z = await poseidon2HashWithSeparator([z, challengeZ], DomainSeparator.BLOB_Z_ACC);
120
120
  }
121
121
  }
122
122
  allBlobs.push(...blobs);
@@ -127,14 +127,14 @@ export class BatchedBlobAccumulator {
127
127
 
128
128
  // Now we have a shared challenge for all blobs, evaluate them...
129
129
  const proofObjects = await Promise.all(allBlobs.map(b => b.evaluate(z)));
130
- const evaluations = await Promise.all(proofObjects.map(({ y }) => hashNoirBigNumLimbs(y)));
130
+ const evaluations = await Promise.all(proofObjects.map(({ y }) => hashBlobYLimbs(y)));
131
131
  // ...and find the challenge for the linear combination of blobs.
132
132
  let gamma = evaluations[0];
133
133
  // We start at i = 1, because gamma is initialized as the first blob's evaluation.
134
134
  for (let i = 1; i < allBlobs.length; i++) {
135
- gamma = await poseidon2Hash([gamma, evaluations[i]]);
135
+ gamma = await poseidon2HashWithSeparator([gamma, evaluations[i]], DomainSeparator.BLOB_GAMMA_ACC);
136
136
  }
137
- gamma = await poseidon2Hash([gamma, z]);
137
+ gamma = await poseidon2HashWithSeparator([gamma, z], DomainSeparator.BLOB_GAMMA_FINAL);
138
138
 
139
139
  return new FinalBlobBatchingChallenges(z, BLS12Fr.fromBN254Fr(gamma));
140
140
  }
@@ -166,7 +166,7 @@ export class BatchedBlobAccumulator {
166
166
  thisY, // yAcc = gamma^0 * y_0 = 1 * y_0
167
167
  thisC, // cAcc = gamma^0 * C_0 = 1 * C_0
168
168
  thisQ, // qAcc = gamma^0 * Q_0 = 1 * Q_0
169
- await hashNoirBigNumLimbs(thisY), // gammaAcc = poseidon2(y_0.limbs)
169
+ await hashBlobYLimbs(thisY), // gammaAcc = poseidon2(y_0.limbs)
170
170
  this.finalBlobChallenges.gamma, // gammaPow = gamma^(i + 1) = gamma^1 = gamma
171
171
  this.finalBlobChallenges,
172
172
  );
@@ -174,11 +174,11 @@ export class BatchedBlobAccumulator {
174
174
  // Moving from i - 1 to i, so:
175
175
  return new BatchedBlobAccumulator(
176
176
  sha256ToField([this.blobCommitmentsHashAcc, blob.commitment]), // blobCommitmentsHashAcc := sha256(blobCommitmentsHashAcc, C_i)
177
- await poseidon2Hash([this.zAcc, blobChallengeZ]), // zAcc := poseidon2(zAcc, z_i)
177
+ await poseidon2HashWithSeparator([this.zAcc, blobChallengeZ], DomainSeparator.BLOB_Z_ACC), // zAcc := poseidon2(BLOB_Z_ACC, zAcc, z_i)
178
178
  this.yAcc.add(thisY.mul(this.gammaPow)), // yAcc := yAcc + (gamma^i * y_i)
179
179
  this.cAcc.add(thisC.mul(this.gammaPow)), // cAcc := cAcc + (gamma^i * C_i)
180
180
  this.qAcc.add(thisQ.mul(this.gammaPow)), // qAcc := qAcc + (gamma^i * C_i)
181
- await poseidon2Hash([this.gammaAcc, await hashNoirBigNumLimbs(thisY)]), // gammaAcc := poseidon2(gammaAcc, poseidon2(y_i.limbs))
181
+ await poseidon2HashWithSeparator([this.gammaAcc, await hashBlobYLimbs(thisY)], DomainSeparator.BLOB_GAMMA_ACC), // gammaAcc := poseidon2(BLOB_GAMMA_ACC, gammaAcc, poseidon2(y_i.limbs))
182
182
  this.gammaPow.mul(this.finalBlobChallenges.gamma), // gammaPow = gamma^(i + 1) = gamma^i * final_gamma
183
183
  this.finalBlobChallenges,
184
184
  );
@@ -220,14 +220,17 @@ export class BatchedBlobAccumulator {
220
220
  * - z := z_acc (final challenge, at which all blobs are evaluated)
221
221
  * - y := y_acc (final opening to be checked on L1)
222
222
  * - c := c_acc (final commitment to be checked on L1)
223
- * - gamma := poseidon2(gamma_acc, z) (challenge for linear combination of y and C, above)
223
+ * - gamma := poseidon2(BLOB_GAMMA_FINAL, gamma_acc, z) (challenge for linear combination of y and C, above)
224
224
  *
225
225
  * @param verifyProof - Whether to verify the KZG proof.
226
226
  * @returns A batched blob.
227
227
  */
228
228
  async finalize(verifyProof = false): Promise<BatchedBlob> {
229
229
  // All values in acc are final, apart from gamma := poseidon2(gammaAcc, z):
230
- const calculatedGamma = await poseidon2Hash([this.gammaAcc, this.zAcc]);
230
+ const calculatedGamma = await poseidon2HashWithSeparator(
231
+ [this.gammaAcc, this.zAcc],
232
+ DomainSeparator.BLOB_GAMMA_FINAL,
233
+ );
231
234
  // Check final values:
232
235
  if (!this.zAcc.equals(this.finalBlobChallenges.z)) {
233
236
  throw new Error(
@@ -4,7 +4,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
4
4
  import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize';
5
5
 
6
6
  /**
7
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr` for documentation.
7
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr` for documentation.
8
8
  */
9
9
  export class BlobAccumulator {
10
10
  constructor(
@@ -5,7 +5,7 @@ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
5
5
  import { inspect } from 'util';
6
6
 
7
7
  /**
8
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/final_blob_accumulator.nr` for documentation.
8
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/final_blob_accumulator.nr` for documentation.
9
9
  */
10
10
  export class FinalBlobAccumulator {
11
11
  constructor(
@@ -3,7 +3,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
4
4
 
5
5
  /**
6
- * See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/final_blob_batching_challenges.nr` for documentation.
6
+ * See `noir-projects/fnd/noir-protocol-circuits/crates/blob/src/abis/final_blob_batching_challenges.nr` for documentation.
7
7
  */
8
8
  export class FinalBlobBatchingChallenges {
9
9
  constructor(
package/src/hash.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
1
+ import { DomainSeparator } from '@aztec/constants';
2
+ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
2
3
  import { sha256, sha256ToField } from '@aztec/foundation/crypto/sha256';
3
4
  import { BLS12Fr } from '@aztec/foundation/curves/bls12';
4
5
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -76,14 +77,18 @@ export function commitmentToFields(commitment: Buffer): [Fr, Fr] {
76
77
 
77
78
  export async function computeChallengeZ(blobFieldsHash: Fr, commitment: Buffer): Promise<Fr> {
78
79
  const commitmentFields = commitmentToFields(commitment);
79
- return await poseidon2Hash([blobFieldsHash, commitmentFields[0], commitmentFields[1]]);
80
+ return await poseidon2HashWithSeparator(
81
+ [blobFieldsHash, commitmentFields[0], commitmentFields[1]],
82
+ DomainSeparator.BLOB_CHALLENGE_Z,
83
+ );
80
84
  }
81
85
 
82
86
  /**
83
- * Hash each u128 limb of the noir bignum struct representing the BLS field, to mimic the hash accumulation in the
84
- * rollup circuits.
87
+ * Hash the u128 limbs of a BLS field's noir bignum representation under the `BLOB_HASHED_Y_LIMBS` separator.
88
+ * Used to commit to blob evaluation values `y_i` before folding them into the gamma accumulator; mirrors the
89
+ * hash accumulation performed in the rollup circuits.
85
90
  */
86
- export async function hashNoirBigNumLimbs(field: BLS12Fr): Promise<Fr> {
91
+ export async function hashBlobYLimbs(field: BLS12Fr): Promise<Fr> {
87
92
  const num = field.toNoirBigNum();
88
- return await poseidon2Hash(num.limbs.map(Fr.fromHexString));
93
+ return await poseidon2HashWithSeparator(num.limbs.map(Fr.fromHexString), DomainSeparator.BLOB_HASHED_Y_LIMBS);
89
94
  }
@@ -1,3 +1,6 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ import { elapsedSync } from '@aztec/foundation/timer';
3
+
1
4
  import type { DasContextJs } from '@crate-crypto/node-eth-kzg';
2
5
  import { createRequire } from 'module';
3
6
 
@@ -30,12 +33,17 @@ export function getBytesPerCommitment(): number {
30
33
  let kzgInstance: DasContextJs | undefined;
31
34
 
32
35
  /**
33
- * Returns the lazily-initialized KZG context.
34
- * The first call takes ~3 seconds to initialize the precomputation tables.
36
+ * Returns the lazily-initialized KZG context. The first call synchronously builds the
37
+ * precomputation tables (~2s locally, blocking the event loop; longer under constrained CPU), so
38
+ * callers on a latency-sensitive path should warm it ahead of time. Pass a logger to record how
39
+ * long that first build took.
40
+ * @param logger - Optional logger; when provided, the initial table build is timed and logged.
35
41
  */
36
- export function getKzg(): DasContextJs {
42
+ export function getKzg(logger?: Logger): DasContextJs {
37
43
  if (!kzgInstance) {
38
- kzgInstance = loadNativeModule().DasContextJs.create({ usePrecomp: true });
44
+ const [durationMs, instance] = elapsedSync(() => loadNativeModule().DasContextJs.create({ usePrecomp: true }));
45
+ kzgInstance = instance;
46
+ logger?.verbose(`Loaded KZG trusted setup`, { durationMs });
39
47
  }
40
48
  return kzgInstance;
41
49
  }
@@ -12,7 +12,7 @@ import {
12
12
 
13
13
  /**
14
14
  * A Poseidon2 sponge used to accumulate data that will be added to blobs.
15
- * See noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr.
15
+ * See noir-projects/fnd/noir-protocol-circuits/crates/types/src/blob_data/sponge_blob.nr.
16
16
  */
17
17
  export class SpongeBlob {
18
18
  static MAX_FIELDS = BLOBS_PER_CHECKPOINT * FIELDS_PER_BLOB;
@@ -28,7 +28,7 @@ export class SpongeBlob {
28
28
  * Initialize the sponge blob to absorb data for a checkpoint.
29
29
  */
30
30
  static init(): SpongeBlob {
31
- // This must match the implementation in noir-projects/noir-protocol-circuits/types/src/abis/sponge_blob.nr
31
+ // This must match the implementation in noir-projects/fnd/noir-protocol-circuits/crates/types/src/blob_data/sponge_blob.nr
32
32
  const iv = new Fr(BigInt(SpongeBlob.MAX_FIELDS) * TWO_POW_64);
33
33
  const sponge = Poseidon2Sponge.init(iv);
34
34
  return new SpongeBlob(sponge, 0);