@aztec/blob-lib 0.0.1-commit.e6bd8901 → 0.0.1-commit.ec5f612

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.
package/dest/blob.d.ts CHANGED
@@ -36,7 +36,7 @@ export declare class Blob {
36
36
  *
37
37
  * @throws If data does not match the expected length (BYTES_PER_BLOB).
38
38
  */
39
- static fromBlobBuffer(data: Uint8Array): Blob;
39
+ static fromBlobBuffer(data: Uint8Array): Promise<Blob>;
40
40
  /**
41
41
  * Create a Blob from an array of fields.
42
42
  *
@@ -45,7 +45,7 @@ export declare class Blob {
45
45
  * @param fields - The array of fields to create the Blob from.
46
46
  * @returns A Blob created from the array of fields.
47
47
  */
48
- static fromFields(fields: Fr[]): Blob;
48
+ static fromFields(fields: Fr[]): Promise<Blob>;
49
49
  /**
50
50
  * Get the fields from the blob data.
51
51
  *
@@ -64,7 +64,7 @@ export declare class Blob {
64
64
  * @param json - The JSON object to create the Blob from.
65
65
  * @returns A Blob created from the JSON object.
66
66
  */
67
- static fromJson(json: BlobJson): Blob;
67
+ static fromJson(json: BlobJson): Promise<Blob>;
68
68
  /**
69
69
  * Get the JSON representation of the blob.
70
70
  *
@@ -87,10 +87,10 @@ export declare class Blob {
87
87
  * y: BLS12Fr - Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts.
88
88
  * proof: Buffer - KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes).
89
89
  */
90
- evaluate(challengeZ: Fr, verifyProof?: boolean): {
90
+ evaluate(challengeZ: Fr, verifyProof?: boolean): Promise<{
91
91
  y: BLS12Fr;
92
92
  proof: Buffer<ArrayBuffer>;
93
- };
93
+ }>;
94
94
  /**
95
95
  * Get the buffer representation of the ENTIRE blob.
96
96
  *
@@ -118,4 +118,4 @@ export declare class Blob {
118
118
  computeCellsAndKzgProofs: (b: Uint8Array<ArrayBufferLike>) => [Uint8Array<ArrayBufferLike>[], Uint8Array<ArrayBufferLike>[]];
119
119
  };
120
120
  }
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBcUIsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7QUFFM0I7Ozs7OztHQU1HO0FBQ0gscUJBQWEsSUFBSTtJQUViOztPQUVHO2FBQ2EsSUFBSSxFQUFFLFVBQVU7SUFDaEM7O09BRUc7YUFDYSxVQUFVLEVBQUUsTUFBTTtJQVJwQztJQUNFOztPQUVHO0lBQ2EsSUFBSSxFQUFFLFVBQVU7SUFDaEM7O09BRUc7SUFDYSxVQUFVLEVBQUUsTUFBTSxFQVFuQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxJQUFJLENBRzVDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FRcEM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRLElBQUksRUFBRSxFQUFFLENBSWY7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxDQVNwQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLElBQUksUUFBUSxDQU1qQjtJQUVELHVCQUF1QixJQUFJLE1BQU0sQ0FFaEM7SUFFRDs7O09BR0c7SUFDRyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FFdkQ7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxXQUFXLFVBQVE7OztNQVUzQztJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsSUFBSSxNQUFNLENBRWpCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUdsRDtJQUVEOztPQUVHO0lBQ0gsT0FBTyxXQUVOO0lBRUQsTUFBTSxDQUFDLGtCQUFrQjs7OztNQVV4QjtDQUNGIn0=
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBcUIsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7QUFFM0I7Ozs7OztHQU1HO0FBQ0gscUJBQWEsSUFBSTtJQUViOztPQUVHO2FBQ2EsSUFBSSxFQUFFLFVBQVU7SUFDaEM7O09BRUc7YUFDYSxVQUFVLEVBQUUsTUFBTTtJQVJwQztJQUNFOztPQUVHO0lBQ2EsSUFBSSxFQUFFLFVBQVU7SUFDaEM7O09BRUc7SUFDYSxVQUFVLEVBQUUsTUFBTSxFQVFuQztJQUVEOzs7Ozs7T0FNRztJQUNILE9BQWEsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUczRDtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFhLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVFuRDtJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FJZjtJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE9BQWEsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVNuRDtJQUVEOzs7O09BSUc7SUFDSCxNQUFNLElBQUksUUFBUSxDQU1qQjtJQUVELHVCQUF1QixJQUFJLE1BQU0sQ0FFaEM7SUFFRDs7O09BR0c7SUFDRyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FFdkQ7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDRyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxXQUFXLFVBQVE7OztPQVVqRDtJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsSUFBSSxNQUFNLENBRWpCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUdsRDtJQUVEOztPQUVHO0lBQ0gsT0FBTyxXQUVOO0lBRUQsTUFBTSxDQUFDLGtCQUFrQjs7OztNQVV4QjtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAG9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B;;;;;;GAMG;AACH,qBAAa,IAAI;IAEb;;OAEG;aACa,IAAI,EAAE,UAAU;IAChC;;OAEG;aACa,UAAU,EAAE,MAAM;IARpC;IACE;;OAEG;IACa,IAAI,EAAE,UAAU;IAChC;;OAEG;IACa,UAAU,EAAE,MAAM,EAQnC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG5C;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAQpC;IAED;;;;;;OAMG;IACH,QAAQ,IAAI,EAAE,EAAE,CAIf;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CASpC;IAED;;;;OAIG;IACH,MAAM,IAAI,QAAQ,CAMjB;IAED,uBAAuB,IAAI,MAAM,CAEhC;IAED;;;OAGG;IACG,iBAAiB,CAAC,cAAc,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAEvD;IAED;;;;;;;;;OASG;IACH,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,WAAW,UAAQ;;;MAU3C;IAED;;;;;;OAMG;IACH,QAAQ,IAAI,MAAM,CAEjB;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGlD;IAED;;OAEG;IACH,OAAO,WAEN;IAED,MAAM,CAAC,kBAAkB;;;;MAUxB;CACF"}
1
+ {"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAG9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B;;;;;;GAMG;AACH,qBAAa,IAAI;IAEb;;OAEG;aACa,IAAI,EAAE,UAAU;IAChC;;OAEG;aACa,UAAU,EAAE,MAAM;IARpC;IACE;;OAEG;IACa,IAAI,EAAE,UAAU;IAChC;;OAEG;IACa,UAAU,EAAE,MAAM,EAQnC;IAED;;;;;;OAMG;IACH,OAAa,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D;IAED;;;;;;;OAOG;IACH,OAAa,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnD;IAED;;;;;;OAMG;IACH,QAAQ,IAAI,EAAE,EAAE,CAIf;IAED;;;;;;;;;OASG;IACH,OAAa,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CASnD;IAED;;;;OAIG;IACH,MAAM,IAAI,QAAQ,CAMjB;IAED,uBAAuB,IAAI,MAAM,CAEhC;IAED;;;OAGG;IACG,iBAAiB,CAAC,cAAc,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAEvD;IAED;;;;;;;;;OASG;IACG,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,WAAW,UAAQ;;;OAUjD;IAED;;;;;;OAMG;IACH,QAAQ,IAAI,MAAM,CAEjB;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGlD;IAED;;OAEG;IACH,OAAO,WAEN;IAED,MAAM,CAAC,kBAAkB;;;;MAUxB;CACF"}
package/dest/blob.js CHANGED
@@ -34,8 +34,8 @@ export { FIELDS_PER_BLOB };
34
34
  * @returns A Blob created from the buffer.
35
35
  *
36
36
  * @throws If data does not match the expected length (BYTES_PER_BLOB).
37
- */ static fromBlobBuffer(data) {
38
- const commitment = computeBlobCommitment(data);
37
+ */ static async fromBlobBuffer(data) {
38
+ const commitment = await computeBlobCommitment(data);
39
39
  return new Blob(data, commitment);
40
40
  }
41
41
  /**
@@ -45,14 +45,14 @@ export { FIELDS_PER_BLOB };
45
45
  *
46
46
  * @param fields - The array of fields to create the Blob from.
47
47
  * @returns A Blob created from the array of fields.
48
- */ static fromFields(fields) {
48
+ */ static async fromFields(fields) {
49
49
  if (fields.length > FIELDS_PER_BLOB) {
50
50
  throw new Error(`Attempted to overfill blob with ${fields.length} fields. The maximum is ${FIELDS_PER_BLOB}.`);
51
51
  }
52
52
  const data = Buffer.concat([
53
53
  serializeToBuffer(fields)
54
54
  ], BYTES_PER_BLOB);
55
- const commitment = computeBlobCommitment(data);
55
+ const commitment = await computeBlobCommitment(data);
56
56
  return new Blob(data, commitment);
57
57
  }
58
58
  /**
@@ -75,9 +75,9 @@ export { FIELDS_PER_BLOB };
75
75
  *
76
76
  * @param json - The JSON object to create the Blob from.
77
77
  * @returns A Blob created from the JSON object.
78
- */ static fromJson(json) {
78
+ */ static async fromJson(json) {
79
79
  const blobBuffer = Buffer.from(json.blob.slice(2), 'hex');
80
- const blob = Blob.fromBlobBuffer(blobBuffer);
80
+ const blob = await Blob.fromBlobBuffer(blobBuffer);
81
81
  if (blob.commitment.toString('hex') !== json.kzg_commitment.slice(2)) {
82
82
  throw new Error('KZG commitment does not match');
83
83
  }
@@ -112,9 +112,9 @@ export { FIELDS_PER_BLOB };
112
112
  * @returns
113
113
  * y: BLS12Fr - Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts.
114
114
  * proof: Buffer - KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes).
115
- */ evaluate(challengeZ, verifyProof = false) {
115
+ */ async evaluate(challengeZ, verifyProof = false) {
116
116
  const kzg = getKzg();
117
- const res = kzg.computeKzgProof(this.data, challengeZ.toBuffer());
117
+ const res = await kzg.asyncComputeKzgProof(this.data, challengeZ.toBuffer());
118
118
  if (verifyProof && !kzg.verifyKzgProof(this.commitment, challengeZ.toBuffer(), res[1], res[0])) {
119
119
  throw new Error(`KZG proof did not verify.`);
120
120
  }
@@ -1,4 +1,4 @@
1
- import { AZTEC_MAX_EPOCH_DURATION, BLOBS_PER_CHECKPOINT } from '@aztec/constants';
1
+ import { BLOBS_PER_CHECKPOINT, MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
2
2
  import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
3
3
  import { sha256ToField } from '@aztec/foundation/crypto/sha256';
4
4
  import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
@@ -56,8 +56,8 @@ import { getKzg } from './kzg_context.js';
56
56
  * @returns A batched blob.
57
57
  */ static async batch(blobFieldsPerCheckpoint, verifyProof = false) {
58
58
  const numCheckpoints = blobFieldsPerCheckpoint.length;
59
- if (numCheckpoints > AZTEC_MAX_EPOCH_DURATION) {
60
- throw new Error(`Too many checkpoints sent to batch(). The maximum is ${AZTEC_MAX_EPOCH_DURATION}. Got ${numCheckpoints}.`);
59
+ if (numCheckpoints > MAX_CHECKPOINTS_PER_EPOCH) {
60
+ throw new Error(`Too many checkpoints sent to batch(). The maximum is ${MAX_CHECKPOINTS_PER_EPOCH}. Got ${numCheckpoints}.`);
61
61
  }
62
62
  // Precalculate the values (z and gamma) and initialize the accumulator:
63
63
  let acc = await this.fromBlobFields(blobFieldsPerCheckpoint);
@@ -85,7 +85,7 @@ import { getKzg } from './kzg_context.js';
85
85
  for (const blobFields of blobFieldsPerCheckpoint){
86
86
  // Compute the hash of all the fields in the block.
87
87
  const blobFieldsHash = await computeBlobFieldsHash(blobFields);
88
- const blobs = getBlobsPerL1Block(blobFields);
88
+ const blobs = await getBlobsPerL1Block(blobFields);
89
89
  for (const blob of blobs){
90
90
  // Compute the challenge z for each blob and accumulate it.
91
91
  const challengeZ = await blob.computeChallengeZ(blobFieldsHash);
@@ -104,7 +104,7 @@ import { getKzg } from './kzg_context.js';
104
104
  throw new Error('No blobs to precompute challenges for.');
105
105
  }
106
106
  // Now we have a shared challenge for all blobs, evaluate them...
107
- const proofObjects = allBlobs.map((b)=>b.evaluate(z));
107
+ const proofObjects = await Promise.all(allBlobs.map((b)=>b.evaluate(z)));
108
108
  const evaluations = await Promise.all(proofObjects.map(({ y })=>hashNoirBigNumLimbs(y)));
109
109
  // ...and find the challenge for the linear combination of blobs.
110
110
  let gamma = evaluations[0];
@@ -126,7 +126,7 @@ import { getKzg } from './kzg_context.js';
126
126
  * We assume the input blob has not been evaluated at z.
127
127
  * @returns An updated blob accumulator.
128
128
  */ async accumulateBlob(blob, blobFieldsHash) {
129
- const { proof, y: thisY } = blob.evaluate(this.finalBlobChallenges.z);
129
+ const { proof, y: thisY } = await blob.evaluate(this.finalBlobChallenges.z);
130
130
  const thisC = BLS12Point.decompress(blob.commitment);
131
131
  const thisQ = BLS12Point.decompress(proof);
132
132
  const blobChallengeZ = await blob.computeChallengeZ(blobFieldsHash);
@@ -162,7 +162,7 @@ import { getKzg } from './kzg_context.js';
162
162
  * @param blobFields - The blob fields of a checkpoint to accumulate.
163
163
  * @returns An updated blob accumulator.
164
164
  */ async accumulateFields(blobFields) {
165
- const blobs = getBlobsPerL1Block(blobFields);
165
+ const blobs = await getBlobsPerL1Block(blobFields);
166
166
  if (blobs.length > BLOBS_PER_CHECKPOINT) {
167
167
  throw new Error(`Too many blobs to accumulate. The maximum is ${BLOBS_PER_CHECKPOINT} per checkpoint. Got ${blobs.length}.`);
168
168
  }
@@ -16,7 +16,7 @@ export declare function getPrefixedEthBlobCommitments(blobs: Blob[]): `0x${strin
16
16
  *
17
17
  * @throws If the number of fields does not match what's indicated by the checkpoint prefix.
18
18
  */
19
- export declare function getBlobsPerL1Block(fields: Fr[]): Blob[];
19
+ export declare function getBlobsPerL1Block(fields: Fr[]): Promise<Blob[]>;
20
20
  /**
21
21
  * Get the encoded data from all blobs in the checkpoint.
22
22
  * @param blobs - The blobs to read data from. Should be all the blobs for the L1 block proposing the checkpoint.
@@ -37,4 +37,4 @@ export declare function getBlobCommitmentsFromBlobs(blobs: Blob[]): BLS12Point[]
37
37
  * See https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile
38
38
  */
39
39
  export declare function getEthBlobEvaluationInputs(batchedBlob: BatchedBlob): `0x${string}`;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYl91dGlscy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2JfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFzQyxNQUFNLHFCQUFxQixDQUFDO0FBR2xHOzs7OztHQUtHO0FBQ0gsd0JBQWdCLDZCQUE2QixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLE1BQU0sRUFBRSxDQVMxRTtBQUVEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FTdkQ7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQWdCLGlDQUFpQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxrQkFBa0IsQ0FHbkY7QUFFRCx3QkFBZ0IseUJBQXlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FFM0Q7QUFFRCx3QkFBZ0IsMkJBQTJCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUV2RTtBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx3QkFBZ0IsMEJBQTBCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxLQUFLLE1BQU0sRUFBRSxDQVNsRiJ9
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYl91dGlscy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2JfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFzQyxNQUFNLHFCQUFxQixDQUFDO0FBR2xHOzs7OztHQUtHO0FBQ0gsd0JBQWdCLDZCQUE2QixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLE1BQU0sRUFBRSxDQVMxRTtBQUVEOzs7OztHQUtHO0FBQ0gsd0JBQXNCLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FXdEU7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQWdCLGlDQUFpQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxrQkFBa0IsQ0FHbkY7QUFFRCx3QkFBZ0IseUJBQXlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FFM0Q7QUFFRCx3QkFBZ0IsMkJBQTJCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUV2RTtBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx3QkFBZ0IsMEJBQTBCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxLQUFLLE1BQU0sRUFBRSxDQVNsRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"blob_utils.d.ts","sourceRoot":"","sources":["../src/blob_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,kBAAkB,EAAsC,MAAM,qBAAqB,CAAC;AAGlG;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,MAAM,EAAE,CAS1E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CASvD;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAGnF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAE3D;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAEvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,WAAW,GAAG,KAAK,MAAM,EAAE,CASlF"}
1
+ {"version":3,"file":"blob_utils.d.ts","sourceRoot":"","sources":["../src/blob_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,kBAAkB,EAAsC,MAAM,qBAAqB,CAAC;AAGlG;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,MAAM,EAAE,CAS1E;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAWtE;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAGnF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAE3D;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAEvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,WAAW,GAAG,KAAK,MAAM,EAAE,CASlF"}
@@ -24,14 +24,14 @@ import { computeBlobsHash, computeEthVersionedBlobHash } from './hash.js';
24
24
  * @returns As many blobs as required to broadcast the given fields to an L1 block.
25
25
  *
26
26
  * @throws If the number of fields does not match what's indicated by the checkpoint prefix.
27
- */ export function getBlobsPerL1Block(fields) {
27
+ */ export async function getBlobsPerL1Block(fields) {
28
28
  if (!fields.length) {
29
29
  throw new Error('Cannot create blobs from empty fields.');
30
30
  }
31
31
  const numBlobs = Math.ceil(fields.length / FIELDS_PER_BLOB);
32
- return Array.from({
32
+ return await Promise.all(Array.from({
33
33
  length: numBlobs
34
- }, (_, i)=>Blob.fromFields(fields.slice(i * FIELDS_PER_BLOB, (i + 1) * FIELDS_PER_BLOB)));
34
+ }, (_, i)=>Blob.fromFields(fields.slice(i * FIELDS_PER_BLOB, (i + 1) * FIELDS_PER_BLOB))));
35
35
  }
36
36
  /**
37
37
  * Get the encoded data from all blobs in the checkpoint.
@@ -7,7 +7,7 @@ const BLOCK_NUMBER_BIT_SIZE = 32n;
7
7
  const TIMESTAMP_BIT_SIZE = 64n;
8
8
  const NUM_TXS_BIT_SIZE = 16n;
9
9
  export function encodeBlockEndMarker(blockEndMarker) {
10
- let value = BLOCK_END_PREFIX;
10
+ let value = BigInt(BLOCK_END_PREFIX);
11
11
  value <<= TIMESTAMP_BIT_SIZE;
12
12
  value += blockEndMarker.timestamp;
13
13
  value <<= BLOCK_NUMBER_BIT_SIZE;
@@ -25,7 +25,7 @@ export function decodeBlockEndMarker(field) {
25
25
  const timestamp = value & 2n ** TIMESTAMP_BIT_SIZE - 1n;
26
26
  value >>= TIMESTAMP_BIT_SIZE;
27
27
  const prefix = value;
28
- if (prefix !== BLOCK_END_PREFIX) {
28
+ if (prefix !== BigInt(BLOCK_END_PREFIX)) {
29
29
  throw new BlobDeserializationError(`Incorrect encoding of blob fields: invalid block end marker.`);
30
30
  }
31
31
  return {
@@ -37,5 +37,5 @@ export function decodeBlockEndMarker(field) {
37
37
  // Check if a field is a block end marker. Used before decoding to check if it has reached the end of the block.
38
38
  export function isBlockEndMarker(field) {
39
39
  const prefix = field.toBigInt() >> NUM_TXS_BIT_SIZE + BLOCK_NUMBER_BIT_SIZE + TIMESTAMP_BIT_SIZE;
40
- return prefix === BLOCK_END_PREFIX;
40
+ return prefix === BigInt(BLOCK_END_PREFIX);
41
41
  }
@@ -4,7 +4,7 @@ import { BlobDeserializationError } from '../errors.js';
4
4
  // Must match the implementation in `noir-protocol-circuits/crates/types/src/blob_data/checkpoint_blob_data.nr`.
5
5
  const NUM_BLOB_FIELDS_BIT_SIZE = 32n;
6
6
  export function encodeCheckpointEndMarker(checkpointEndMarker) {
7
- let value = CHECKPOINT_END_PREFIX;
7
+ let value = BigInt(CHECKPOINT_END_PREFIX);
8
8
  value <<= NUM_BLOB_FIELDS_BIT_SIZE;
9
9
  value += BigInt(checkpointEndMarker.numBlobFields);
10
10
  return new Fr(value);
@@ -14,7 +14,7 @@ export function decodeCheckpointEndMarker(field) {
14
14
  const numBlobFields = Number(value & 2n ** NUM_BLOB_FIELDS_BIT_SIZE - 1n);
15
15
  value >>= NUM_BLOB_FIELDS_BIT_SIZE;
16
16
  const prefix = value;
17
- if (prefix !== CHECKPOINT_END_PREFIX) {
17
+ if (prefix !== BigInt(CHECKPOINT_END_PREFIX)) {
18
18
  throw new BlobDeserializationError(`Incorrect encoding of blob fields: invalid checkpoint end marker.`);
19
19
  }
20
20
  return {
@@ -24,5 +24,5 @@ export function decodeCheckpointEndMarker(field) {
24
24
  // Check if a field is a checkpoint end marker. Used to check if it has reached the end of the blob fields.
25
25
  export function isCheckpointEndMarker(field) {
26
26
  const prefix = field.toBigInt() >> NUM_BLOB_FIELDS_BIT_SIZE;
27
- return prefix === CHECKPOINT_END_PREFIX;
27
+ return prefix === BigInt(CHECKPOINT_END_PREFIX);
28
28
  }
@@ -13,7 +13,7 @@ const PRIVATE_LOGS_LENGTH_BIT_SIZE = 16n;
13
13
  const PUBLIC_LOGS_LENGTH_BIT_SIZE = 32n;
14
14
  const CONTRACT_CLASS_LOG_LENGTH_BIT_SIZE = 16n;
15
15
  export function encodeTxStartMarker(txStartMarker) {
16
- let value = TX_START_PREFIX;
16
+ let value = BigInt(TX_START_PREFIX);
17
17
  value <<= NUM_NOTE_HASH_BIT_SIZE;
18
18
  value += BigInt(txStartMarker.numNoteHashes);
19
19
  value <<= NUM_NULLIFIER_BIT_SIZE;
@@ -59,7 +59,7 @@ export function decodeTxStartMarker(field) {
59
59
  const numNoteHashes = Number(value & 2n ** NUM_NOTE_HASH_BIT_SIZE - 1n);
60
60
  value >>= NUM_NOTE_HASH_BIT_SIZE;
61
61
  const prefix = value;
62
- if (prefix !== TX_START_PREFIX) {
62
+ if (prefix !== BigInt(TX_START_PREFIX)) {
63
63
  throw new BlobDeserializationError(`Incorrect encoding of blob fields: invalid tx start marker.`);
64
64
  }
65
65
  return {
package/dest/hash.d.ts CHANGED
@@ -18,7 +18,7 @@ export declare function computeBlobsHash(evmVersionedBlobHashes: Buffer[]): Fr;
18
18
  * This hash is included in the block header.
19
19
  */
20
20
  export declare function computeBlobFieldsHash(fields: Fr[]): Promise<Fr>;
21
- export declare function computeBlobCommitment(data: Uint8Array): Buffer;
21
+ export declare function computeBlobCommitment(data: Uint8Array): Promise<Buffer>;
22
22
  /**
23
23
  * Get the commitment fields of the blob, to compute the challenge z.
24
24
  *
@@ -40,4 +40,4 @@ export declare function computeChallengeZ(blobFieldsHash: Fr, commitment: Buffer
40
40
  * rollup circuits.
41
41
  */
42
42
  export declare function hashNoirBigNumLimbs(field: BLS12Fr): Promise<Fr>;
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU9wRDs7R0FFRztBQUNILHdCQUFnQiwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FJdEU7QUFPRCx3QkFBZ0IsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUVyRTtBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBSXJFO0FBRUQsd0JBQWdCLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsTUFBTSxDQU05RDtBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCx3QkFBZ0Isa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FNL0Q7QUFFRCx3QkFBc0IsaUJBQWlCLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FHM0Y7QUFFRDs7O0dBR0c7QUFDSCx3QkFBc0IsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBR3JFIn0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU9wRDs7R0FFRztBQUNILHdCQUFnQiwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FJdEU7QUFPRCx3QkFBZ0IsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUVyRTtBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBSXJFO0FBRUQsd0JBQXNCLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQU03RTtBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCx3QkFBZ0Isa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FNL0Q7QUFFRCx3QkFBc0IsaUJBQWlCLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FHM0Y7QUFFRDs7O0dBR0c7QUFDSCx3QkFBc0IsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBR3JFIn0=
@@ -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,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAM9D;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":"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"}
package/dest/hash.js CHANGED
@@ -35,11 +35,11 @@ export function computeBlobsHash(evmVersionedBlobHashes) {
35
35
  await sponge.absorb(fields);
36
36
  return sponge.squeeze();
37
37
  }
38
- export function computeBlobCommitment(data) {
38
+ export async function computeBlobCommitment(data) {
39
39
  if (data.length !== BYTES_PER_BLOB) {
40
40
  throw new Error(`Expected ${BYTES_PER_BLOB} bytes per blob. Got ${data.length}.`);
41
41
  }
42
- return Buffer.from(getKzg().blobToKzgCommitment(data));
42
+ return Buffer.from(await getKzg().asyncBlobToKzgCommitment(data));
43
43
  }
44
44
  /**
45
45
  * Get the commitment fields of the blob, to compute the challenge z.
package/dest/testing.d.ts CHANGED
@@ -27,5 +27,5 @@ export declare function makeFinalBlobBatchingChallenges(seed?: number): FinalBlo
27
27
  * @param length
28
28
  * @returns
29
29
  */
30
- export declare function makeRandomBlob(length: number): Blob;
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDakYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDaEcsT0FBTyxFQUFtQixVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxjQUFjLHdCQUF3QixDQUFDO0FBRXZDOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxJQUFJLFNBQUksR0FBRyxVQUFVLENBVW5EO0FBMEJEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLG1CQUFtQixDQUFDLElBQUksU0FBSSxHQUFHLGVBQWUsQ0FTN0Q7QUFFRCx3QkFBZ0Isd0JBQXdCLENBQUMsSUFBSSxTQUFJLHdCQU9oRDtBQUVELHdCQUFnQiwrQkFBK0IsQ0FBQyxJQUFJLFNBQUksK0JBRXZEO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFbkQifQ==
30
+ export declare function makeRandomBlob(length: number): Promise<Blob>;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDakYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDaEcsT0FBTyxFQUFtQixVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxjQUFjLHdCQUF3QixDQUFDO0FBRXZDOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxJQUFJLFNBQUksR0FBRyxVQUFVLENBVW5EO0FBMEJEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLG1CQUFtQixDQUFDLElBQUksU0FBSSxHQUFHLGVBQWUsQ0FTN0Q7QUFFRCx3QkFBZ0Isd0JBQXdCLENBQUMsSUFBSSxTQUFJLHdCQU9oRDtBQUVELHdCQUFnQiwrQkFBK0IsQ0FBQyxJQUFJLFNBQUksK0JBRXZEO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFNUQifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAmB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/D,cAAc,wBAAwB,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,SAAI,GAAG,UAAU,CAUnD;AA0BD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,SAAI,GAAG,eAAe,CAS7D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAI,wBAOhD;AAED,wBAAgB,+BAA+B,CAAC,IAAI,SAAI,+BAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEnD"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAmB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/D,cAAc,wBAAwB,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,SAAI,GAAG,UAAU,CAUnD;AA0BD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,SAAI,GAAG,eAAe,CAS7D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAI,wBAOhD;AAED,wBAAgB,+BAA+B,CAAC,IAAI,SAAI,+BAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/blob-lib",
3
- "version": "0.0.1-commit.e6bd8901",
3
+ "version": "0.0.1-commit.ec5f612",
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.e6bd8901",
31
- "@aztec/foundation": "0.0.1-commit.e6bd8901",
30
+ "@aztec/constants": "0.0.1-commit.ec5f612",
31
+ "@aztec/foundation": "0.0.1-commit.ec5f612",
32
32
  "@crate-crypto/node-eth-kzg": "^0.10.0",
33
33
  "tslib": "^2.4.0"
34
34
  },
package/src/blob.ts CHANGED
@@ -42,8 +42,8 @@ export class Blob {
42
42
  *
43
43
  * @throws If data does not match the expected length (BYTES_PER_BLOB).
44
44
  */
45
- static fromBlobBuffer(data: Uint8Array): Blob {
46
- const commitment = computeBlobCommitment(data);
45
+ static async fromBlobBuffer(data: Uint8Array): Promise<Blob> {
46
+ const commitment = await computeBlobCommitment(data);
47
47
  return new Blob(data, commitment);
48
48
  }
49
49
 
@@ -55,13 +55,13 @@ export class Blob {
55
55
  * @param fields - The array of fields to create the Blob from.
56
56
  * @returns A Blob created from the array of fields.
57
57
  */
58
- static fromFields(fields: Fr[]): Blob {
58
+ static async fromFields(fields: Fr[]): Promise<Blob> {
59
59
  if (fields.length > FIELDS_PER_BLOB) {
60
60
  throw new Error(`Attempted to overfill blob with ${fields.length} fields. The maximum is ${FIELDS_PER_BLOB}.`);
61
61
  }
62
62
 
63
63
  const data = Buffer.concat([serializeToBuffer(fields)], BYTES_PER_BLOB);
64
- const commitment = computeBlobCommitment(data);
64
+ const commitment = await computeBlobCommitment(data);
65
65
  return new Blob(data, commitment);
66
66
  }
67
67
 
@@ -88,9 +88,9 @@ export class Blob {
88
88
  * @param json - The JSON object to create the Blob from.
89
89
  * @returns A Blob created from the JSON object.
90
90
  */
91
- static fromJson(json: BlobJson): Blob {
91
+ static async fromJson(json: BlobJson): Promise<Blob> {
92
92
  const blobBuffer = Buffer.from(json.blob.slice(2), 'hex');
93
- const blob = Blob.fromBlobBuffer(blobBuffer);
93
+ const blob = await Blob.fromBlobBuffer(blobBuffer);
94
94
 
95
95
  if (blob.commitment.toString('hex') !== json.kzg_commitment.slice(2)) {
96
96
  throw new Error('KZG commitment does not match');
@@ -134,9 +134,9 @@ export class Blob {
134
134
  * y: BLS12Fr - Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts.
135
135
  * proof: Buffer - KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes).
136
136
  */
137
- evaluate(challengeZ: Fr, verifyProof = false) {
137
+ async evaluate(challengeZ: Fr, verifyProof = false) {
138
138
  const kzg = getKzg();
139
- const res = kzg.computeKzgProof(this.data, challengeZ.toBuffer());
139
+ const res = await kzg.asyncComputeKzgProof(this.data, challengeZ.toBuffer());
140
140
  if (verifyProof && !kzg.verifyKzgProof(this.commitment, challengeZ.toBuffer(), res[1], res[0])) {
141
141
  throw new Error(`KZG proof did not verify.`);
142
142
  }
@@ -1,4 +1,4 @@
1
- import { AZTEC_MAX_EPOCH_DURATION, BLOBS_PER_CHECKPOINT } from '@aztec/constants';
1
+ import { BLOBS_PER_CHECKPOINT, MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
2
2
  import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
3
3
  import { sha256ToField } from '@aztec/foundation/crypto/sha256';
4
4
  import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
@@ -75,9 +75,9 @@ export class BatchedBlobAccumulator {
75
75
  */
76
76
  static async batch(blobFieldsPerCheckpoint: Fr[][], verifyProof = false): Promise<BatchedBlob> {
77
77
  const numCheckpoints = blobFieldsPerCheckpoint.length;
78
- if (numCheckpoints > AZTEC_MAX_EPOCH_DURATION) {
78
+ if (numCheckpoints > MAX_CHECKPOINTS_PER_EPOCH) {
79
79
  throw new Error(
80
- `Too many checkpoints sent to batch(). The maximum is ${AZTEC_MAX_EPOCH_DURATION}. Got ${numCheckpoints}.`,
80
+ `Too many checkpoints sent to batch(). The maximum is ${MAX_CHECKPOINTS_PER_EPOCH}. Got ${numCheckpoints}.`,
81
81
  );
82
82
  }
83
83
 
@@ -109,7 +109,7 @@ export class BatchedBlobAccumulator {
109
109
  for (const blobFields of blobFieldsPerCheckpoint) {
110
110
  // Compute the hash of all the fields in the block.
111
111
  const blobFieldsHash = await computeBlobFieldsHash(blobFields);
112
- const blobs = getBlobsPerL1Block(blobFields);
112
+ const blobs = await getBlobsPerL1Block(blobFields);
113
113
  for (const blob of blobs) {
114
114
  // Compute the challenge z for each blob and accumulate it.
115
115
  const challengeZ = await blob.computeChallengeZ(blobFieldsHash);
@@ -126,7 +126,7 @@ export class BatchedBlobAccumulator {
126
126
  }
127
127
 
128
128
  // Now we have a shared challenge for all blobs, evaluate them...
129
- const proofObjects = allBlobs.map(b => b.evaluate(z));
129
+ const proofObjects = await Promise.all(allBlobs.map(b => b.evaluate(z)));
130
130
  const evaluations = await Promise.all(proofObjects.map(({ y }) => hashNoirBigNumLimbs(y)));
131
131
  // ...and find the challenge for the linear combination of blobs.
132
132
  let gamma = evaluations[0];
@@ -145,7 +145,7 @@ export class BatchedBlobAccumulator {
145
145
  * @returns An updated blob accumulator.
146
146
  */
147
147
  async accumulateBlob(blob: Blob, blobFieldsHash: Fr) {
148
- const { proof, y: thisY } = blob.evaluate(this.finalBlobChallenges.z);
148
+ const { proof, y: thisY } = await blob.evaluate(this.finalBlobChallenges.z);
149
149
  const thisC = BLS12Point.decompress(blob.commitment);
150
150
  const thisQ = BLS12Point.decompress(proof);
151
151
  const blobChallengeZ = await blob.computeChallengeZ(blobFieldsHash);
@@ -192,7 +192,7 @@ export class BatchedBlobAccumulator {
192
192
  * @returns An updated blob accumulator.
193
193
  */
194
194
  async accumulateFields(blobFields: Fr[]) {
195
- const blobs = getBlobsPerL1Block(blobFields);
195
+ const blobs = await getBlobsPerL1Block(blobFields);
196
196
 
197
197
  if (blobs.length > BLOBS_PER_CHECKPOINT) {
198
198
  throw new Error(
package/src/blob_utils.ts CHANGED
@@ -30,14 +30,16 @@ export function getPrefixedEthBlobCommitments(blobs: Blob[]): `0x${string}` {
30
30
  *
31
31
  * @throws If the number of fields does not match what's indicated by the checkpoint prefix.
32
32
  */
33
- export function getBlobsPerL1Block(fields: Fr[]): Blob[] {
33
+ export async function getBlobsPerL1Block(fields: Fr[]): Promise<Blob[]> {
34
34
  if (!fields.length) {
35
35
  throw new Error('Cannot create blobs from empty fields.');
36
36
  }
37
37
 
38
38
  const numBlobs = Math.ceil(fields.length / FIELDS_PER_BLOB);
39
- return Array.from({ length: numBlobs }, (_, i) =>
40
- Blob.fromFields(fields.slice(i * FIELDS_PER_BLOB, (i + 1) * FIELDS_PER_BLOB)),
39
+ return await Promise.all(
40
+ Array.from({ length: numBlobs }, (_, i) =>
41
+ Blob.fromFields(fields.slice(i * FIELDS_PER_BLOB, (i + 1) * FIELDS_PER_BLOB)),
42
+ ),
41
43
  );
42
44
  }
43
45
 
@@ -17,7 +17,7 @@ export interface BlockEndMarker {
17
17
  }
18
18
 
19
19
  export function encodeBlockEndMarker(blockEndMarker: BlockEndMarker) {
20
- let value = BLOCK_END_PREFIX;
20
+ let value = BigInt(BLOCK_END_PREFIX);
21
21
  value <<= TIMESTAMP_BIT_SIZE;
22
22
  value += blockEndMarker.timestamp;
23
23
  value <<= BLOCK_NUMBER_BIT_SIZE;
@@ -37,7 +37,7 @@ export function decodeBlockEndMarker(field: Fr): BlockEndMarker {
37
37
  value >>= TIMESTAMP_BIT_SIZE;
38
38
 
39
39
  const prefix = value;
40
- if (prefix !== BLOCK_END_PREFIX) {
40
+ if (prefix !== BigInt(BLOCK_END_PREFIX)) {
41
41
  throw new BlobDeserializationError(`Incorrect encoding of blob fields: invalid block end marker.`);
42
42
  }
43
43
 
@@ -51,5 +51,5 @@ export function decodeBlockEndMarker(field: Fr): BlockEndMarker {
51
51
  // Check if a field is a block end marker. Used before decoding to check if it has reached the end of the block.
52
52
  export function isBlockEndMarker(field: Fr): boolean {
53
53
  const prefix = field.toBigInt() >> (NUM_TXS_BIT_SIZE + BLOCK_NUMBER_BIT_SIZE + TIMESTAMP_BIT_SIZE);
54
- return prefix === BLOCK_END_PREFIX;
54
+ return prefix === BigInt(BLOCK_END_PREFIX);
55
55
  }
@@ -12,7 +12,7 @@ export interface CheckpointEndMarker {
12
12
  }
13
13
 
14
14
  export function encodeCheckpointEndMarker(checkpointEndMarker: CheckpointEndMarker) {
15
- let value = CHECKPOINT_END_PREFIX;
15
+ let value = BigInt(CHECKPOINT_END_PREFIX);
16
16
  value <<= NUM_BLOB_FIELDS_BIT_SIZE;
17
17
  value += BigInt(checkpointEndMarker.numBlobFields);
18
18
  return new Fr(value);
@@ -24,7 +24,7 @@ export function decodeCheckpointEndMarker(field: Fr): CheckpointEndMarker {
24
24
  value >>= NUM_BLOB_FIELDS_BIT_SIZE;
25
25
 
26
26
  const prefix = value;
27
- if (prefix !== CHECKPOINT_END_PREFIX) {
27
+ if (prefix !== BigInt(CHECKPOINT_END_PREFIX)) {
28
28
  throw new BlobDeserializationError(`Incorrect encoding of blob fields: invalid checkpoint end marker.`);
29
29
  }
30
30
 
@@ -36,5 +36,5 @@ export function decodeCheckpointEndMarker(field: Fr): CheckpointEndMarker {
36
36
  // Check if a field is a checkpoint end marker. Used to check if it has reached the end of the blob fields.
37
37
  export function isCheckpointEndMarker(field: Fr): boolean {
38
38
  const prefix = field.toBigInt() >> NUM_BLOB_FIELDS_BIT_SIZE;
39
- return prefix === CHECKPOINT_END_PREFIX;
39
+ return prefix === BigInt(CHECKPOINT_END_PREFIX);
40
40
  }
@@ -30,7 +30,7 @@ export interface TxStartMarker {
30
30
  }
31
31
 
32
32
  export function encodeTxStartMarker(txStartMarker: TxStartMarker): Fr {
33
- let value = TX_START_PREFIX;
33
+ let value = BigInt(TX_START_PREFIX);
34
34
  value <<= NUM_NOTE_HASH_BIT_SIZE;
35
35
  value += BigInt(txStartMarker.numNoteHashes);
36
36
  value <<= NUM_NULLIFIER_BIT_SIZE;
@@ -78,7 +78,7 @@ export function decodeTxStartMarker(field: Fr): TxStartMarker {
78
78
  value >>= NUM_NOTE_HASH_BIT_SIZE;
79
79
 
80
80
  const prefix = value;
81
- if (prefix !== TX_START_PREFIX) {
81
+ if (prefix !== BigInt(TX_START_PREFIX)) {
82
82
  throw new BlobDeserializationError(`Incorrect encoding of blob fields: invalid tx start marker.`);
83
83
  }
84
84
 
package/src/hash.ts CHANGED
@@ -44,12 +44,12 @@ export async function computeBlobFieldsHash(fields: Fr[]): Promise<Fr> {
44
44
  return sponge.squeeze();
45
45
  }
46
46
 
47
- export function computeBlobCommitment(data: Uint8Array): Buffer {
47
+ export async function computeBlobCommitment(data: Uint8Array): Promise<Buffer> {
48
48
  if (data.length !== BYTES_PER_BLOB) {
49
49
  throw new Error(`Expected ${BYTES_PER_BLOB} bytes per blob. Got ${data.length}.`);
50
50
  }
51
51
 
52
- return Buffer.from(getKzg().blobToKzgCommitment(data));
52
+ return Buffer.from(await getKzg().asyncBlobToKzgCommitment(data));
53
53
  }
54
54
 
55
55
  /**
package/src/testing.ts CHANGED
@@ -89,6 +89,6 @@ export function makeFinalBlobBatchingChallenges(seed = 1) {
89
89
  * @param length
90
90
  * @returns
91
91
  */
92
- export function makeRandomBlob(length: number): Blob {
92
+ export function makeRandomBlob(length: number): Promise<Blob> {
93
93
  return Blob.fromFields([...Array.from({ length: length }, () => Fr.random())]);
94
94
  }