@aztec/blob-lib 3.0.3 → 3.9.9-nightly.20260312
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/batched_blob.d.ts +6 -1
- package/dest/batched_blob.d.ts.map +1 -1
- package/dest/blob.d.ts +14 -9
- package/dest/blob.d.ts.map +1 -1
- package/dest/blob.js +10 -12
- package/dest/blob_batching.d.ts +13 -1
- package/dest/blob_batching.d.ts.map +1 -1
- package/dest/blob_batching.js +7 -7
- package/dest/blob_utils.d.ts +2 -2
- package/dest/blob_utils.d.ts.map +1 -1
- package/dest/blob_utils.js +3 -3
- package/dest/circuit_types/final_blob_accumulator.js +3 -1
- package/dest/encoding/block_blob_data.d.ts +9 -1
- package/dest/encoding/block_blob_data.d.ts.map +1 -1
- package/dest/encoding/block_blob_data.js +11 -1
- package/dest/encoding/block_end_marker.js +3 -3
- package/dest/encoding/checkpoint_blob_data.d.ts +1 -1
- package/dest/encoding/checkpoint_blob_data.d.ts.map +1 -1
- package/dest/encoding/checkpoint_blob_data.js +5 -5
- package/dest/encoding/checkpoint_end_marker.js +3 -3
- package/dest/encoding/tx_start_marker.js +2 -2
- package/dest/hash.d.ts +2 -2
- package/dest/hash.d.ts.map +1 -1
- package/dest/hash.js +2 -2
- package/dest/interface.d.ts +1 -2
- package/dest/interface.d.ts.map +1 -1
- package/dest/sponge_blob.d.ts +3 -1
- package/dest/sponge_blob.d.ts.map +1 -1
- package/dest/testing.d.ts +2 -2
- package/dest/testing.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/blob.ts +10 -12
- package/src/blob_batching.ts +7 -7
- package/src/blob_utils.ts +5 -3
- package/src/encoding/block_blob_data.ts +13 -1
- package/src/encoding/block_end_marker.ts +3 -3
- package/src/encoding/checkpoint_blob_data.ts +12 -5
- package/src/encoding/checkpoint_end_marker.ts +3 -3
- package/src/encoding/tx_start_marker.ts +2 -2
- package/src/hash.ts +2 -2
- package/src/interface.ts +0 -1
- package/src/testing.ts +1 -1
package/dest/batched_blob.d.ts
CHANGED
|
@@ -5,10 +5,15 @@ import { FinalBlobAccumulator } from './circuit_types/index.js';
|
|
|
5
5
|
* A class to represent the result from accumulating blobs in an epoch using BatchedBlobAccumulator.
|
|
6
6
|
*/
|
|
7
7
|
export declare class BatchedBlob {
|
|
8
|
+
/** Hash of Cs (to link to L1 blob hashes). */
|
|
8
9
|
readonly blobCommitmentsHash: Fr;
|
|
10
|
+
/** Challenge point z such that p_i(z) = y_i. */
|
|
9
11
|
readonly z: Fr;
|
|
12
|
+
/** Evaluation y, linear combination of all evaluations y_i = p_i(z) with gamma. */
|
|
10
13
|
readonly y: BLS12Fr;
|
|
14
|
+
/** Commitment C, linear combination of all commitments C_i = [p_i] with gamma. */
|
|
11
15
|
readonly commitment: BLS12Point;
|
|
16
|
+
/** KZG opening 'proof' Q (commitment to the quotient poly.), linear combination of all blob kzg 'proofs' Q_i with gamma. */
|
|
12
17
|
readonly q: BLS12Point;
|
|
13
18
|
constructor(
|
|
14
19
|
/** Hash of Cs (to link to L1 blob hashes). */
|
|
@@ -23,4 +28,4 @@ export declare class BatchedBlob {
|
|
|
23
28
|
q: BLS12Point);
|
|
24
29
|
toFinalBlobAccumulator(): FinalBlobAccumulator;
|
|
25
30
|
}
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hlZF9ibG9iLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmF0Y2hlZF9ibG9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhFOztHQUVHO0FBQ0gscUJBQWEsV0FBVztJQUVwQiw4Q0FBOEM7YUFDOUIsbUJBQW1CLEVBQUUsRUFBRTtJQUN2QyxnREFBZ0Q7YUFDaEMsQ0FBQyxFQUFFLEVBQUU7SUFDckIsbUZBQW1GO2FBQ25FLENBQUMsRUFBRSxPQUFPO0lBQzFCLGtGQUFrRjthQUNsRSxVQUFVLEVBQUUsVUFBVTtJQUN0Qyw0SEFBNEg7YUFDNUcsQ0FBQyxFQUFFLFVBQVU7SUFWL0I7SUFDRSw4Q0FBOEM7SUFDOUIsbUJBQW1CLEVBQUUsRUFBRTtJQUN2QyxnREFBZ0Q7SUFDaEMsQ0FBQyxFQUFFLEVBQUU7SUFDckIsbUZBQW1GO0lBQ25FLENBQUMsRUFBRSxPQUFPO0lBQzFCLGtGQUFrRjtJQUNsRSxVQUFVLEVBQUUsVUFBVTtJQUN0Qyw0SEFBNEg7SUFDNUcsQ0FBQyxFQUFFLFVBQVUsRUFDM0I7SUFFSixzQkFBc0IseUJBRXJCO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batched_blob.d.ts","sourceRoot":"","sources":["../src/batched_blob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;GAEG;AACH,qBAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"batched_blob.d.ts","sourceRoot":"","sources":["../src/batched_blob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;GAEG;AACH,qBAAa,WAAW;IAEpB,8CAA8C;aAC9B,mBAAmB,EAAE,EAAE;IACvC,gDAAgD;aAChC,CAAC,EAAE,EAAE;IACrB,mFAAmF;aACnE,CAAC,EAAE,OAAO;IAC1B,kFAAkF;aAClE,UAAU,EAAE,UAAU;IACtC,4HAA4H;aAC5G,CAAC,EAAE,UAAU;IAV/B;IACE,8CAA8C;IAC9B,mBAAmB,EAAE,EAAE;IACvC,gDAAgD;IAChC,CAAC,EAAE,EAAE;IACrB,mFAAmF;IACnE,CAAC,EAAE,OAAO;IAC1B,kFAAkF;IAClE,UAAU,EAAE,UAAU;IACtC,4HAA4H;IAC5G,CAAC,EAAE,UAAU,EAC3B;IAEJ,sBAAsB,yBAErB;CACF"}
|
package/dest/blob.d.ts
CHANGED
|
@@ -12,7 +12,13 @@ export { FIELDS_PER_BLOB };
|
|
|
12
12
|
* and is correctly encoded.
|
|
13
13
|
*/
|
|
14
14
|
export declare class Blob {
|
|
15
|
+
/**
|
|
16
|
+
* The data to be broadcast on L1 in bytes form.
|
|
17
|
+
*/
|
|
15
18
|
readonly data: Uint8Array;
|
|
19
|
+
/**
|
|
20
|
+
* Commitment to the blob data. Used in compressed BLS12 point format (48 bytes).
|
|
21
|
+
*/
|
|
16
22
|
readonly commitment: Buffer;
|
|
17
23
|
constructor(
|
|
18
24
|
/**
|
|
@@ -30,7 +36,7 @@ export declare class Blob {
|
|
|
30
36
|
*
|
|
31
37
|
* @throws If data does not match the expected length (BYTES_PER_BLOB).
|
|
32
38
|
*/
|
|
33
|
-
static fromBlobBuffer(data: Uint8Array): Blob
|
|
39
|
+
static fromBlobBuffer(data: Uint8Array): Promise<Blob>;
|
|
34
40
|
/**
|
|
35
41
|
* Create a Blob from an array of fields.
|
|
36
42
|
*
|
|
@@ -39,7 +45,7 @@ export declare class Blob {
|
|
|
39
45
|
* @param fields - The array of fields to create the Blob from.
|
|
40
46
|
* @returns A Blob created from the array of fields.
|
|
41
47
|
*/
|
|
42
|
-
static fromFields(fields: Fr[]): Blob
|
|
48
|
+
static fromFields(fields: Fr[]): Promise<Blob>;
|
|
43
49
|
/**
|
|
44
50
|
* Get the fields from the blob data.
|
|
45
51
|
*
|
|
@@ -51,21 +57,20 @@ export declare class Blob {
|
|
|
51
57
|
/**
|
|
52
58
|
* Create a Blob from a JSON object.
|
|
53
59
|
*
|
|
54
|
-
* Blobs will be in this form when requested from the blob
|
|
60
|
+
* Blobs will be in this form when requested from the blob client, or from
|
|
55
61
|
* the beacon chain via `getBlobSidecars`
|
|
56
62
|
* https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
|
|
57
63
|
*
|
|
58
64
|
* @param json - The JSON object to create the Blob from.
|
|
59
65
|
* @returns A Blob created from the JSON object.
|
|
60
66
|
*/
|
|
61
|
-
static fromJson(json: BlobJson): Blob
|
|
67
|
+
static fromJson(json: BlobJson): Promise<Blob>;
|
|
62
68
|
/**
|
|
63
69
|
* Get the JSON representation of the blob.
|
|
64
70
|
*
|
|
65
|
-
* @param index - optional - The index of the blob in the block.
|
|
66
71
|
* @returns The JSON representation of the blob.
|
|
67
72
|
*/
|
|
68
|
-
|
|
73
|
+
toJSON(): BlobJson;
|
|
69
74
|
getEthVersionedBlobHash(): Buffer;
|
|
70
75
|
/**
|
|
71
76
|
* Challenge point z (= H(H(tx_effects), kzgCommitment)).
|
|
@@ -82,10 +87,10 @@ export declare class Blob {
|
|
|
82
87
|
* y: BLS12Fr - Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts.
|
|
83
88
|
* proof: Buffer - KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes).
|
|
84
89
|
*/
|
|
85
|
-
evaluate(challengeZ: Fr, verifyProof?: boolean): {
|
|
90
|
+
evaluate(challengeZ: Fr, verifyProof?: boolean): Promise<{
|
|
86
91
|
y: BLS12Fr;
|
|
87
92
|
proof: Buffer<ArrayBuffer>;
|
|
88
|
-
}
|
|
93
|
+
}>;
|
|
89
94
|
/**
|
|
90
95
|
* Get the buffer representation of the ENTIRE blob.
|
|
91
96
|
*
|
|
@@ -113,4 +118,4 @@ export declare class Blob {
|
|
|
113
118
|
computeCellsAndKzgProofs: (b: Uint8Array<ArrayBufferLike>) => [Uint8Array<ArrayBufferLike>[], Uint8Array<ArrayBufferLike>[]];
|
|
114
119
|
};
|
|
115
120
|
}
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBcUIsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7QUFFM0I7Ozs7OztHQU1HO0FBQ0gscUJBQWEsSUFBSTtJQUViOztPQUVHO2FBQ2EsSUFBSSxFQUFFLFVBQVU7SUFDaEM7O09BRUc7YUFDYSxVQUFVLEVBQUUsTUFBTTtJQVJwQztJQUNFOztPQUVHO0lBQ2EsSUFBSSxFQUFFLFVBQVU7SUFDaEM7O09BRUc7SUFDYSxVQUFVLEVBQUUsTUFBTSxFQVFuQztJQUVEOzs7Ozs7T0FNRztJQUNILE9BQWEsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUczRDtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFhLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVFuRDtJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FJZjtJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE9BQWEsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVNuRDtJQUVEOzs7O09BSUc7SUFDSCxNQUFNLElBQUksUUFBUSxDQU1qQjtJQUVELHVCQUF1QixJQUFJLE1BQU0sQ0FFaEM7SUFFRDs7O09BR0c7SUFDRyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FFdkQ7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDRyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxXQUFXLFVBQVE7OztPQVVqRDtJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsSUFBSSxNQUFNLENBRWpCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUdsRDtJQUVEOztPQUVHO0lBQ0gsT0FBTyxXQUVOO0lBRUQsTUFBTSxDQUFDLGtCQUFrQjs7OztNQVV4QjtDQUNGIn0=
|
package/dest/blob.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
/**
|
|
@@ -69,15 +69,15 @@ export { FIELDS_PER_BLOB };
|
|
|
69
69
|
/**
|
|
70
70
|
* Create a Blob from a JSON object.
|
|
71
71
|
*
|
|
72
|
-
* Blobs will be in this form when requested from the blob
|
|
72
|
+
* Blobs will be in this form when requested from the blob client, or from
|
|
73
73
|
* the beacon chain via `getBlobSidecars`
|
|
74
74
|
* https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
|
|
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
|
}
|
|
@@ -86,12 +86,10 @@ export { FIELDS_PER_BLOB };
|
|
|
86
86
|
/**
|
|
87
87
|
* Get the JSON representation of the blob.
|
|
88
88
|
*
|
|
89
|
-
* @param index - optional - The index of the blob in the block.
|
|
90
89
|
* @returns The JSON representation of the blob.
|
|
91
|
-
*/
|
|
90
|
+
*/ toJSON() {
|
|
92
91
|
return {
|
|
93
92
|
blob: `0x${Buffer.from(this.data).toString('hex')}`,
|
|
94
|
-
index: index.toString(),
|
|
95
93
|
// eslint-disable-next-line camelcase
|
|
96
94
|
kzg_commitment: `0x${this.commitment.toString('hex')}`
|
|
97
95
|
};
|
|
@@ -114,9 +112,9 @@ export { FIELDS_PER_BLOB };
|
|
|
114
112
|
* @returns
|
|
115
113
|
* y: BLS12Fr - Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts.
|
|
116
114
|
* proof: Buffer - KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes).
|
|
117
|
-
*/ evaluate(challengeZ, verifyProof = false) {
|
|
115
|
+
*/ async evaluate(challengeZ, verifyProof = false) {
|
|
118
116
|
const kzg = getKzg();
|
|
119
|
-
const res = kzg.
|
|
117
|
+
const res = await kzg.asyncComputeKzgProof(this.data, challengeZ.toBuffer());
|
|
120
118
|
if (verifyProof && !kzg.verifyKzgProof(this.commitment, challengeZ.toBuffer(), res[1], res[0])) {
|
|
121
119
|
throw new Error(`KZG proof did not verify.`);
|
|
122
120
|
}
|
package/dest/blob_batching.d.ts
CHANGED
|
@@ -8,13 +8,25 @@ import { BlobAccumulator, FinalBlobAccumulator, FinalBlobBatchingChallenges } fr
|
|
|
8
8
|
* See noir-projects/noir-protocol-circuits/crates/blob/src/abis/blob_accumulator.nr
|
|
9
9
|
*/
|
|
10
10
|
export declare class BatchedBlobAccumulator {
|
|
11
|
+
/** Hash of Cs (to link to L1 blob hashes). */
|
|
11
12
|
readonly blobCommitmentsHashAcc: Fr;
|
|
13
|
+
/** Challenge point z_acc. Final value used such that p_i(z) = y_i. */
|
|
12
14
|
readonly zAcc: Fr;
|
|
15
|
+
/** Evaluation y_acc. Final value is is linear combination of all evaluations y_i = p_i(z) with gamma. */
|
|
13
16
|
readonly yAcc: BLS12Fr;
|
|
17
|
+
/** Commitment c_acc. Final value is linear combination of all commitments C_i = [p_i] with gamma. */
|
|
14
18
|
readonly cAcc: BLS12Point;
|
|
19
|
+
/** KZG opening q_acc. Final value is linear combination of all blob kzg 'proofs' Q_i with gamma. */
|
|
15
20
|
readonly qAcc: BLS12Point;
|
|
21
|
+
/**
|
|
22
|
+
* Challenge point gamma_acc for multi opening. Used with y, C, and kzg 'proof' Q above.
|
|
23
|
+
* TODO(#13608): We calculate this by hashing natively in the circuit (hence Fr representation), but it's actually used
|
|
24
|
+
* as a BLS12Fr field elt. Is this safe? Is there a skew?
|
|
25
|
+
*/
|
|
16
26
|
readonly gammaAcc: Fr;
|
|
27
|
+
/** Simply gamma^(i + 1) at blob i. Used for calculating the i'th element of the above linear comb.s */
|
|
17
28
|
readonly gammaPow: BLS12Fr;
|
|
29
|
+
/** Final challenge values used in evaluation. Optimistically input and checked in the final acc. */
|
|
18
30
|
readonly finalBlobChallenges: FinalBlobBatchingChallenges;
|
|
19
31
|
constructor(
|
|
20
32
|
/** Hash of Cs (to link to L1 blob hashes). */
|
|
@@ -103,4 +115,4 @@ export declare class BatchedBlobAccumulator {
|
|
|
103
115
|
toBlobAccumulator(): BlobAccumulator;
|
|
104
116
|
toFinalBlobAccumulator(): FinalBlobAccumulator;
|
|
105
117
|
}
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYl9iYXRjaGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2JfYmF0Y2hpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSTlHOzs7R0FHRztBQUNILHFCQUFhLHNCQUFzQjtJQUUvQiw4Q0FBOEM7YUFDOUIsc0JBQXNCLEVBQUUsRUFBRTtJQUMxQyxzRUFBc0U7YUFDdEQsSUFBSSxFQUFFLEVBQUU7SUFDeEIseUdBQXlHO2FBQ3pGLElBQUksRUFBRSxPQUFPO0lBQzdCLHFHQUFxRzthQUNyRixJQUFJLEVBQUUsVUFBVTtJQUNoQyxvR0FBb0c7YUFDcEYsSUFBSSxFQUFFLFVBQVU7SUFDaEM7Ozs7T0FJRzthQUNhLFFBQVEsRUFBRSxFQUFFO0lBQzVCLHVHQUF1RzthQUN2RixRQUFRLEVBQUUsT0FBTztJQUNqQyxvR0FBb0c7YUFDcEYsbUJBQW1CLEVBQUUsMkJBQTJCO0lBcEJsRTtJQUNFLDhDQUE4QztJQUM5QixzQkFBc0IsRUFBRSxFQUFFO0lBQzFDLHNFQUFzRTtJQUN0RCxJQUFJLEVBQUUsRUFBRTtJQUN4Qix5R0FBeUc7SUFDekYsSUFBSSxFQUFFLE9BQU87SUFDN0IscUdBQXFHO0lBQ3JGLElBQUksRUFBRSxVQUFVO0lBQ2hDLG9HQUFvRztJQUNwRixJQUFJLEVBQUUsVUFBVTtJQUNoQzs7OztPQUlHO0lBQ2EsUUFBUSxFQUFFLEVBQUU7SUFDNUIsdUdBQXVHO0lBQ3ZGLFFBQVEsRUFBRSxPQUFPO0lBQ2pDLG9HQUFvRztJQUNwRixtQkFBbUIsRUFBRSwyQkFBMkIsRUFDOUQ7SUFFSjs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsMkJBQTJCLEdBQUcsc0JBQXNCLENBV2pHO0lBRUQ7Ozs7T0FJRztJQUNILE9BQWEsY0FBYyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBRzVGO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBYSxLQUFLLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLFVBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBZTdGO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxPQUFhLCtCQUErQixDQUFDLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBbUNsSDtJQUVEOzs7O09BSUc7SUFDRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxtQ0F1Q2xEO0lBRUQ7Ozs7O09BS0c7SUFDRyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLG1DQWtCdEM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0csUUFBUSxDQUFDLFdBQVcsVUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FzQnhEO0lBRUQsTUFBTSxZQU9MO0lBRUQsWUFBWSxZQVVYO0lBRUQsS0FBSywyQkFXSjtJQUVELGlCQUFpQixvQkFTaEI7SUFFRCxzQkFBc0IseUJBRXJCO0NBQ0YifQ==
|
|
@@ -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;
|
|
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"}
|
package/dest/blob_batching.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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 >
|
|
60
|
-
throw new Error(`Too many checkpoints sent to batch(). The maximum is ${
|
|
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
|
}
|
package/dest/blob_utils.d.ts
CHANGED
|
@@ -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,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYl91dGlscy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2JfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFzQyxNQUFNLHFCQUFxQixDQUFDO0FBR2xHOzs7OztHQUtHO0FBQ0gsd0JBQWdCLDZCQUE2QixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLE1BQU0sRUFBRSxDQVMxRTtBQUVEOzs7OztHQUtHO0FBQ0gsd0JBQXNCLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FXdEU7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQWdCLGlDQUFpQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxrQkFBa0IsQ0FHbkY7QUFFRCx3QkFBZ0IseUJBQXlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FFM0Q7QUFFRCx3QkFBZ0IsMkJBQTJCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUV2RTtBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx3QkFBZ0IsMEJBQTBCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxLQUFLLE1BQU0sRUFBRSxDQVNsRiJ9
|
package/dest/blob_utils.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dest/blob_utils.js
CHANGED
|
@@ -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.
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
var _computedKey;
|
|
1
2
|
import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
4
5
|
import { inspect } from 'util';
|
|
6
|
+
_computedKey = inspect.custom;
|
|
5
7
|
/**
|
|
6
8
|
* See `noir-projects/noir-protocol-circuits/crates/blob/src/abis/final_blob_accumulator.nr` for documentation.
|
|
7
9
|
*/ export class FinalBlobAccumulator {
|
|
@@ -53,7 +55,7 @@ import { inspect } from 'util';
|
|
|
53
55
|
static random() {
|
|
54
56
|
return new FinalBlobAccumulator(Fr.random(), Fr.random(), BLS12Fr.random(), BLS12Point.random());
|
|
55
57
|
}
|
|
56
|
-
[
|
|
58
|
+
[_computedKey]() {
|
|
57
59
|
return `FinalBlobAccumulator {
|
|
58
60
|
blobCommitmentsHash: ${inspect(this.blobCommitmentsHash)},
|
|
59
61
|
z: ${inspect(this.z)},
|
|
@@ -3,6 +3,14 @@ import { FieldReader } from '@aztec/foundation/serialize';
|
|
|
3
3
|
import { type BlockEndMarker } from './block_end_marker.js';
|
|
4
4
|
import { type BlockEndStateField } from './block_end_state_field.js';
|
|
5
5
|
import { type TxBlobData } from './tx_blob_data.js';
|
|
6
|
+
export declare const NUM_BLOCK_END_BLOB_FIELDS = 6;
|
|
7
|
+
export declare const NUM_FIRST_BLOCK_END_BLOB_FIELDS = 7;
|
|
8
|
+
export declare const NUM_CHECKPOINT_END_MARKER_FIELDS = 1;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the number of blob fields used for block end data.
|
|
11
|
+
* @param isFirstBlockInCheckpoint - Whether this is the first block in a checkpoint.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getNumBlockEndBlobFields(isFirstBlockInCheckpoint: boolean): number;
|
|
6
14
|
export interface BlockEndBlobData {
|
|
7
15
|
blockEndMarker: BlockEndMarker;
|
|
8
16
|
blockEndStateField: BlockEndStateField;
|
|
@@ -19,4 +27,4 @@ export declare function encodeBlockEndBlobData(blockEndBlobData: BlockEndBlobDat
|
|
|
19
27
|
export declare function decodeBlockEndBlobData(fields: Fr[] | FieldReader, isFirstBlock: boolean): BlockEndBlobData;
|
|
20
28
|
export declare function encodeBlockBlobData(blockBlobData: BlockBlobData): Fr[];
|
|
21
29
|
export declare function decodeBlockBlobData(fields: Fr[] | FieldReader, isFirstBlock: boolean): BlockBlobData;
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfYmxvYl9kYXRhLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jb2RpbmcvYmxvY2tfYmxvYl9kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHMUQsT0FBTyxFQUNMLEtBQUssY0FBYyxFQUlwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxLQUFLLGtCQUFrQixFQUd4QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUl4RixlQUFPLE1BQU0seUJBQXlCLElBQUksQ0FBQztBQUMzQyxlQUFPLE1BQU0sK0JBQStCLElBQUksQ0FBQztBQUNqRCxlQUFPLE1BQU0sZ0NBQWdDLElBQUksQ0FBQztBQUVsRDs7O0dBR0c7QUFDSCx3QkFBZ0Isd0JBQXdCLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxHQUFHLE1BQU0sQ0FFbEY7QUFFRCxNQUFNLFdBQVcsZ0JBQWdCO0lBQy9CLGNBQWMsRUFBRSxjQUFjLENBQUM7SUFDL0Isa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkMsZUFBZSxFQUFFLEVBQUUsQ0FBQztJQUNwQixZQUFZLEVBQUUsRUFBRSxDQUFDO0lBQ2pCLGFBQWEsRUFBRSxFQUFFLENBQUM7SUFDbEIsY0FBYyxFQUFFLEVBQUUsQ0FBQztJQUNuQixpQkFBaUIsRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDO0NBQ25DO0FBRUQsTUFBTSxXQUFXLGFBQWMsU0FBUSxnQkFBZ0I7SUFDckQsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQ25CO0FBRUQsd0JBQWdCLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLEVBQUUsRUFBRSxDQVUvRTtBQUVELHdCQUFnQixzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLEdBQUcsZ0JBQWdCLENBbUIxRztBQUVELHdCQUFnQixtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLEVBQUUsRUFBRSxDQUV0RTtBQUVELHdCQUFnQixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLEdBQUcsYUFBYSxDQStCcEcifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_blob_data.d.ts","sourceRoot":"","sources":["../../src/encoding/block_blob_data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,UAAU,EAAsC,MAAM,mBAAmB,CAAC;AAIxF,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,EAAE,CAAC;IACpB,YAAY,EAAE,EAAE,CAAC;IACjB,aAAa,EAAE,EAAE,CAAC;IAClB,cAAc,EAAE,EAAE,CAAC;IACnB,iBAAiB,EAAE,EAAE,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,GAAG,EAAE,UAAU,EAAE,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,EAAE,EAAE,CAU/E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,gBAAgB,CAmB1G;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,EAAE,EAAE,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,aAAa,CA+BpG"}
|
|
1
|
+
{"version":3,"file":"block_blob_data.d.ts","sourceRoot":"","sources":["../../src/encoding/block_blob_data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,UAAU,EAAsC,MAAM,mBAAmB,CAAC;AAIxF,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAElD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,wBAAwB,EAAE,OAAO,GAAG,MAAM,CAElF;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,EAAE,CAAC;IACpB,YAAY,EAAE,EAAE,CAAC;IACjB,aAAa,EAAE,EAAE,CAAC;IAClB,cAAc,EAAE,EAAE,CAAC;IACnB,iBAAiB,EAAE,EAAE,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,GAAG,EAAE,UAAU,EAAE,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,EAAE,EAAE,CAU/E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,gBAAgB,CAmB1G;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,EAAE,EAAE,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,aAAa,CA+BpG"}
|
|
@@ -3,6 +3,16 @@ import { BlobDeserializationError } from '../errors.js';
|
|
|
3
3
|
import { decodeBlockEndMarker, encodeBlockEndMarker, isBlockEndMarker } from './block_end_marker.js';
|
|
4
4
|
import { decodeBlockEndStateField, encodeBlockEndStateField } from './block_end_state_field.js';
|
|
5
5
|
import { decodeTxBlobData, encodeTxBlobData } from './tx_blob_data.js';
|
|
6
|
+
// Must match the implementation in `noir-protocol-circuits/crates/types/src/blob_data/block_blob_data.nr`.
|
|
7
|
+
export const NUM_BLOCK_END_BLOB_FIELDS = 6;
|
|
8
|
+
export const NUM_FIRST_BLOCK_END_BLOB_FIELDS = 7;
|
|
9
|
+
export const NUM_CHECKPOINT_END_MARKER_FIELDS = 1;
|
|
10
|
+
/**
|
|
11
|
+
* Returns the number of blob fields used for block end data.
|
|
12
|
+
* @param isFirstBlockInCheckpoint - Whether this is the first block in a checkpoint.
|
|
13
|
+
*/ export function getNumBlockEndBlobFields(isFirstBlockInCheckpoint) {
|
|
14
|
+
return isFirstBlockInCheckpoint ? NUM_FIRST_BLOCK_END_BLOB_FIELDS : NUM_BLOCK_END_BLOB_FIELDS;
|
|
15
|
+
}
|
|
6
16
|
export function encodeBlockEndBlobData(blockEndBlobData) {
|
|
7
17
|
return [
|
|
8
18
|
encodeBlockEndMarker(blockEndBlobData.blockEndMarker),
|
|
@@ -18,7 +28,7 @@ export function encodeBlockEndBlobData(blockEndBlobData) {
|
|
|
18
28
|
}
|
|
19
29
|
export function decodeBlockEndBlobData(fields, isFirstBlock) {
|
|
20
30
|
const reader = FieldReader.asReader(fields);
|
|
21
|
-
const numBlockEndData = isFirstBlock
|
|
31
|
+
const numBlockEndData = getNumBlockEndBlobFields(isFirstBlock);
|
|
22
32
|
if (numBlockEndData > reader.remainingFields()) {
|
|
23
33
|
throw new BlobDeserializationError(`Incorrect encoding of blob fields: not enough fields for block end data. Expected ${numBlockEndData} fields, only ${reader.remainingFields()} remaining.`);
|
|
24
34
|
}
|
|
@@ -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
|
}
|
|
@@ -12,4 +12,4 @@ export declare function encodeCheckpointBlobDataFromBlocks(blocks: BlockBlobData
|
|
|
12
12
|
export declare function decodeCheckpointBlobData(fields: Fr[] | FieldReader): CheckpointBlobData;
|
|
13
13
|
export declare function decodeCheckpointBlobDataFromBuffer(buf: Buffer): CheckpointBlobData;
|
|
14
14
|
export declare function getTotalNumBlobFieldsFromTxs(txsPerBlock: TxStartMarker[][]): number;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9ibG9iX2RhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNvZGluZy9jaGVja3BvaW50X2Jsb2JfZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFnQixXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUd4RSxPQUFPLEVBQ0wsS0FBSyxhQUFhLEVBTW5CLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLEtBQUssbUJBQW1CLEVBSXpCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUQsTUFBTSxXQUFXLGtCQUFrQjtJQUNqQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQztJQUN6QyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7Q0FDekI7QUFFRCx3QkFBZ0Isd0JBQXdCLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEdBQUcsRUFBRSxFQUFFLENBS3JGO0FBRUQsd0JBQWdCLGtDQUFrQyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FJaEY7QUFFRCx3QkFBZ0Isd0JBQXdCLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFdBQVcsR0FBRyxrQkFBa0IsQ0EwQ3ZGO0FBRUQsd0JBQWdCLGtDQUFrQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsa0JBQWtCLENBS2xGO0FBRUQsd0JBQWdCLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FZbkYifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_blob_data.d.ts","sourceRoot":"","sources":["../../src/encoding/checkpoint_blob_data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAgB,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGxE,OAAO,
|
|
1
|
+
{"version":3,"file":"checkpoint_blob_data.d.ts","sourceRoot":"","sources":["../../src/encoding/checkpoint_blob_data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAgB,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGxE,OAAO,EACL,KAAK,aAAa,EAMnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,mBAAmB,EAIzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,wBAAgB,wBAAwB,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,EAAE,EAAE,CAKrF;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,CAIhF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,kBAAkB,CA0CvF;AAED,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAKlF;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,aAAa,EAAE,EAAE,GAAG,MAAM,CAYnF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import { BufferReader, FieldReader } from '@aztec/foundation/serialize';
|
|
3
3
|
import { BlobDeserializationError } from '../errors.js';
|
|
4
|
-
import { decodeBlockBlobData, encodeBlockBlobData } from './block_blob_data.js';
|
|
4
|
+
import { NUM_BLOCK_END_BLOB_FIELDS, NUM_CHECKPOINT_END_MARKER_FIELDS, NUM_FIRST_BLOCK_END_BLOB_FIELDS, decodeBlockBlobData, encodeBlockBlobData } from './block_blob_data.js';
|
|
5
5
|
import { decodeCheckpointEndMarker, encodeCheckpointEndMarker, isCheckpointEndMarker } from './checkpoint_end_marker.js';
|
|
6
6
|
export function encodeCheckpointBlobData(checkpointBlobData) {
|
|
7
7
|
return [
|
|
@@ -11,7 +11,7 @@ export function encodeCheckpointBlobData(checkpointBlobData) {
|
|
|
11
11
|
}
|
|
12
12
|
export function encodeCheckpointBlobDataFromBlocks(blocks) {
|
|
13
13
|
const blocksBlobFields = blocks.map((block)=>encodeBlockBlobData(block)).flat();
|
|
14
|
-
const numBlobFields = blocksBlobFields.length +
|
|
14
|
+
const numBlobFields = blocksBlobFields.length + NUM_CHECKPOINT_END_MARKER_FIELDS;
|
|
15
15
|
return blocksBlobFields.concat(encodeCheckpointEndMarker({
|
|
16
16
|
numBlobFields
|
|
17
17
|
}));
|
|
@@ -60,8 +60,8 @@ export function getTotalNumBlobFieldsFromTxs(txsPerBlock) {
|
|
|
60
60
|
if (!numBlocks) {
|
|
61
61
|
return 0;
|
|
62
62
|
}
|
|
63
|
-
return (numBlocks ?
|
|
64
|
-
numBlocks *
|
|
65
|
-
txsPerBlock.reduce((total, txs)=>total + txs.reduce((total, tx)=>total + tx.numBlobFields, 0), 0) +
|
|
63
|
+
return (numBlocks ? NUM_FIRST_BLOCK_END_BLOB_FIELDS - NUM_BLOCK_END_BLOB_FIELDS : 0) + // l1ToL2Messages root in the first block
|
|
64
|
+
numBlocks * NUM_BLOCK_END_BLOB_FIELDS + // 6 fields for each block end blob data.
|
|
65
|
+
txsPerBlock.reduce((total, txs)=>total + txs.reduce((total, tx)=>total + tx.numBlobFields, 0), 0) + NUM_CHECKPOINT_END_MARKER_FIELDS // checkpoint end marker
|
|
66
66
|
;
|
|
67
67
|
}
|
|
@@ -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,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU9wRDs7R0FFRztBQUNILHdCQUFnQiwyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FJdEU7QUFPRCx3QkFBZ0IsZ0JBQWdCLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUVyRTtBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBSXJFO0FBRUQsd0JBQXNCLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQU03RTtBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCx3QkFBZ0Isa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FNL0Q7QUFFRCx3QkFBc0IsaUJBQWlCLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FHM0Y7QUFFRDs7O0dBR0c7QUFDSCx3QkFBc0IsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBR3JFIn0=
|
package/dest/hash.d.ts.map
CHANGED
|
@@ -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,
|
|
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().
|
|
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/interface.d.ts
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export interface BlobJson {
|
|
5
5
|
blob: string;
|
|
6
|
-
index: string;
|
|
7
6
|
kzg_commitment: string;
|
|
8
7
|
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxXQUFXLFFBQVE7SUFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLGNBQWMsRUFBRSxNQUFNLENBQUM7Q0FDeEIifQ==
|
package/dest/interface.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB"}
|
package/dest/sponge_blob.d.ts
CHANGED
|
@@ -6,7 +6,9 @@ import { BufferReader, FieldReader, type Tuple } from '@aztec/foundation/seriali
|
|
|
6
6
|
* See noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr.
|
|
7
7
|
*/
|
|
8
8
|
export declare class SpongeBlob {
|
|
9
|
+
/** Sponge with absorbed fields that will go into one or more blobs. */
|
|
9
10
|
readonly sponge: Poseidon2Sponge;
|
|
11
|
+
/** Number of effects absorbed so far. */
|
|
10
12
|
numAbsorbedFields: number;
|
|
11
13
|
static MAX_FIELDS: number;
|
|
12
14
|
constructor(
|
|
@@ -45,4 +47,4 @@ export declare class Poseidon2Sponge {
|
|
|
45
47
|
absorb(fields: Fr[]): Promise<void>;
|
|
46
48
|
squeeze(): Promise<Fr>;
|
|
47
49
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvbmdlX2Jsb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zcG9uZ2VfYmxvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxLQUFLLEVBR1gsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQzs7O0dBR0c7QUFDSCxxQkFBYSxVQUFVO0lBSW5CLHVFQUF1RTthQUN2RCxNQUFNLEVBQUUsZUFBZTtJQUN2Qyx5Q0FBeUM7SUFDbEMsaUJBQWlCLEVBQUUsTUFBTTtJQU5sQyxNQUFNLENBQUMsVUFBVSxTQUEwQztJQUUzRDtJQUNFLHVFQUF1RTtJQUN2RCxNQUFNLEVBQUUsZUFBZTtJQUN2Qyx5Q0FBeUM7SUFDbEMsaUJBQWlCLEVBQUUsTUFBTSxFQUM5QjtJQUVKOztPQUVHO0lBQ0gsTUFBTSxDQUFDLElBQUksSUFBSSxVQUFVLENBS3hCO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFlBQVksR0FBRyxVQUFVLENBRzNEO0lBRUQsUUFBUSw0QkFFUDtJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0NBRTVDO0lBRUQsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUVmO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FHeEQ7SUFFRCxLQUFLLGVBRUo7SUFFSyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxpQkFReEI7SUFFSyxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUUzQjtJQUVELE1BQU0sQ0FBQyxLQUFLLElBQUksVUFBVSxDQUV6QjtDQUNGO0FBR0QscUJBQWEsZUFBZTtJQUVqQixLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25CLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBSjdCLFlBQ1MsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQ25CLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUNuQixTQUFTLEVBQUUsTUFBTSxFQUNqQixXQUFXLEVBQUUsT0FBTyxFQUN6QjtJQUVKLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsZUFBZSxDQVFoRTtJQUVELFFBQVEsNEJBRVA7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLDBEQUVqRDtJQUVELFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FFZjtJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFdBQVcsR0FBRyxlQUFlLENBUTdEO0lBRUQsTUFBTSxDQUFDLEtBQUssSUFBSSxlQUFlLENBTzlCO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLGVBQWUsQ0FJbkM7SUFLSyxhQUFhLGtCQVNsQjtJQUVLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLGlCQWF4QjtJQUVLLE9BQU8sSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLENBTzNCO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sponge_blob.d.ts","sourceRoot":"","sources":["../src/sponge_blob.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAa,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,KAAK,EAGX,MAAM,6BAA6B,CAAC;AAErC;;;GAGG;AACH,qBAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"sponge_blob.d.ts","sourceRoot":"","sources":["../src/sponge_blob.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAa,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,KAAK,EAGX,MAAM,6BAA6B,CAAC;AAErC;;;GAGG;AACH,qBAAa,UAAU;IAInB,uEAAuE;aACvD,MAAM,EAAE,eAAe;IACvC,yCAAyC;IAClC,iBAAiB,EAAE,MAAM;IANlC,MAAM,CAAC,UAAU,SAA0C;IAE3D;IACE,uEAAuE;IACvD,MAAM,EAAE,eAAe;IACvC,yCAAyC;IAClC,iBAAiB,EAAE,MAAM,EAC9B;IAEJ;;OAEG;IACH,MAAM,CAAC,IAAI,IAAI,UAAU,CAKxB;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,CAG3D;IAED,QAAQ,4BAEP;IAED,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,gCAE5C;IAED,QAAQ,IAAI,EAAE,EAAE,CAEf;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,UAAU,CAGxD;IAED,KAAK,eAEJ;IAEK,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,iBAQxB;IAEK,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAE3B;IAED,MAAM,CAAC,KAAK,IAAI,UAAU,CAEzB;CACF;AAGD,qBAAa,eAAe;IAEjB,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACnB,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,OAAO;IAJ7B,YACS,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EACnB,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,EACzB;IAEJ,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,eAAe,CAQhE;IAED,QAAQ,4BAEP;IAED,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,0DAEjD;IAED,QAAQ,IAAI,EAAE,EAAE,CAEf;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,eAAe,CAQ7D;IAED,MAAM,CAAC,KAAK,IAAI,eAAe,CAO9B;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,eAAe,CAInC;IAKK,aAAa,kBASlB;IAEK,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,iBAaxB;IAEK,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAO3B;CACF"}
|
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,
|
|
30
|
+
export declare function makeRandomBlob(length: number): Promise<Blob>;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDakYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDaEcsT0FBTyxFQUFtQixVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxjQUFjLHdCQUF3QixDQUFDO0FBRXZDOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxJQUFJLFNBQUksR0FBRyxVQUFVLENBVW5EO0FBMEJEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLG1CQUFtQixDQUFDLElBQUksU0FBSSxHQUFHLGVBQWUsQ0FTN0Q7QUFFRCx3QkFBZ0Isd0JBQXdCLENBQUMsSUFBSSxTQUFJLHdCQU9oRDtBQUVELHdCQUFnQiwrQkFBK0IsQ0FBQyxJQUFJLFNBQUksK0JBRXZEO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFNUQifQ==
|
package/dest/testing.d.ts.map
CHANGED
|
@@ -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,
|
|
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": "3.
|
|
3
|
+
"version": "3.9.9-nightly.20260312",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"build": "yarn clean && ../scripts/tsc.sh",
|
|
20
20
|
"build:dev": "../scripts/tsc.sh --watch",
|
|
21
21
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
22
|
-
"start:dev": "concurrently -k \"
|
|
22
|
+
"start:dev": "concurrently -k \"../scripts/tsc.sh --watch\" \"nodemon --watch dest --exec yarn start\"",
|
|
23
23
|
"start": "node ./dest/index.js",
|
|
24
24
|
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
|
|
25
25
|
},
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"../package.common.json"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@aztec/constants": "3.
|
|
31
|
-
"@aztec/foundation": "3.
|
|
30
|
+
"@aztec/constants": "3.9.9-nightly.20260312",
|
|
31
|
+
"@aztec/foundation": "3.9.9-nightly.20260312",
|
|
32
32
|
"@crate-crypto/node-eth-kzg": "^0.10.0",
|
|
33
33
|
"tslib": "^2.4.0"
|
|
34
34
|
},
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@jest/globals": "^30.0.0",
|
|
37
37
|
"@types/jest": "^30.0.0",
|
|
38
38
|
"@types/node": "^22.15.17",
|
|
39
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
39
|
+
"@typescript/native-preview": "7.0.0-dev.20260113.1",
|
|
40
40
|
"get-port": "^7.1.0",
|
|
41
41
|
"jest": "^30.0.0",
|
|
42
42
|
"ts-node": "^10.9.1",
|
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
|
|
|
@@ -81,16 +81,16 @@ export class Blob {
|
|
|
81
81
|
/**
|
|
82
82
|
* Create a Blob from a JSON object.
|
|
83
83
|
*
|
|
84
|
-
* Blobs will be in this form when requested from the blob
|
|
84
|
+
* Blobs will be in this form when requested from the blob client, or from
|
|
85
85
|
* the beacon chain via `getBlobSidecars`
|
|
86
86
|
* https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
|
|
87
87
|
*
|
|
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');
|
|
@@ -102,13 +102,11 @@ export class Blob {
|
|
|
102
102
|
/**
|
|
103
103
|
* Get the JSON representation of the blob.
|
|
104
104
|
*
|
|
105
|
-
* @param index - optional - The index of the blob in the block.
|
|
106
105
|
* @returns The JSON representation of the blob.
|
|
107
106
|
*/
|
|
108
|
-
|
|
107
|
+
toJSON(): BlobJson {
|
|
109
108
|
return {
|
|
110
109
|
blob: `0x${Buffer.from(this.data).toString('hex')}`,
|
|
111
|
-
index: index.toString(),
|
|
112
110
|
// eslint-disable-next-line camelcase
|
|
113
111
|
kzg_commitment: `0x${this.commitment.toString('hex')}`,
|
|
114
112
|
};
|
|
@@ -136,9 +134,9 @@ export class Blob {
|
|
|
136
134
|
* y: BLS12Fr - Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts.
|
|
137
135
|
* proof: Buffer - KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes).
|
|
138
136
|
*/
|
|
139
|
-
evaluate(challengeZ: Fr, verifyProof = false) {
|
|
137
|
+
async evaluate(challengeZ: Fr, verifyProof = false) {
|
|
140
138
|
const kzg = getKzg();
|
|
141
|
-
const res = kzg.
|
|
139
|
+
const res = await kzg.asyncComputeKzgProof(this.data, challengeZ.toBuffer());
|
|
142
140
|
if (verifyProof && !kzg.verifyKzgProof(this.commitment, challengeZ.toBuffer(), res[1], res[0])) {
|
|
143
141
|
throw new Error(`KZG proof did not verify.`);
|
|
144
142
|
}
|
package/src/blob_batching.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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 >
|
|
78
|
+
if (numCheckpoints > MAX_CHECKPOINTS_PER_EPOCH) {
|
|
79
79
|
throw new Error(
|
|
80
|
-
`Too many checkpoints sent to batch(). The maximum is ${
|
|
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
|
|
40
|
-
|
|
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,6 +17,18 @@ import { type TxBlobData, decodeTxBlobData, encodeTxBlobData } from './tx_blob_d
|
|
|
17
17
|
|
|
18
18
|
// Must match the implementation in `noir-protocol-circuits/crates/types/src/blob_data/block_blob_data.nr`.
|
|
19
19
|
|
|
20
|
+
export const NUM_BLOCK_END_BLOB_FIELDS = 6;
|
|
21
|
+
export const NUM_FIRST_BLOCK_END_BLOB_FIELDS = 7;
|
|
22
|
+
export const NUM_CHECKPOINT_END_MARKER_FIELDS = 1;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Returns the number of blob fields used for block end data.
|
|
26
|
+
* @param isFirstBlockInCheckpoint - Whether this is the first block in a checkpoint.
|
|
27
|
+
*/
|
|
28
|
+
export function getNumBlockEndBlobFields(isFirstBlockInCheckpoint: boolean): number {
|
|
29
|
+
return isFirstBlockInCheckpoint ? NUM_FIRST_BLOCK_END_BLOB_FIELDS : NUM_BLOCK_END_BLOB_FIELDS;
|
|
30
|
+
}
|
|
31
|
+
|
|
20
32
|
export interface BlockEndBlobData {
|
|
21
33
|
blockEndMarker: BlockEndMarker;
|
|
22
34
|
blockEndStateField: BlockEndStateField;
|
|
@@ -46,7 +58,7 @@ export function encodeBlockEndBlobData(blockEndBlobData: BlockEndBlobData): Fr[]
|
|
|
46
58
|
export function decodeBlockEndBlobData(fields: Fr[] | FieldReader, isFirstBlock: boolean): BlockEndBlobData {
|
|
47
59
|
const reader = FieldReader.asReader(fields);
|
|
48
60
|
|
|
49
|
-
const numBlockEndData = isFirstBlock
|
|
61
|
+
const numBlockEndData = getNumBlockEndBlobFields(isFirstBlock);
|
|
50
62
|
if (numBlockEndData > reader.remainingFields()) {
|
|
51
63
|
throw new BlobDeserializationError(
|
|
52
64
|
`Incorrect encoding of blob fields: not enough fields for block end data. Expected ${numBlockEndData} fields, only ${reader.remainingFields()} remaining.`,
|
|
@@ -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
|
}
|
|
@@ -2,7 +2,14 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
2
2
|
import { BufferReader, FieldReader } from '@aztec/foundation/serialize';
|
|
3
3
|
|
|
4
4
|
import { BlobDeserializationError } from '../errors.js';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
type BlockBlobData,
|
|
7
|
+
NUM_BLOCK_END_BLOB_FIELDS,
|
|
8
|
+
NUM_CHECKPOINT_END_MARKER_FIELDS,
|
|
9
|
+
NUM_FIRST_BLOCK_END_BLOB_FIELDS,
|
|
10
|
+
decodeBlockBlobData,
|
|
11
|
+
encodeBlockBlobData,
|
|
12
|
+
} from './block_blob_data.js';
|
|
6
13
|
import {
|
|
7
14
|
type CheckpointEndMarker,
|
|
8
15
|
decodeCheckpointEndMarker,
|
|
@@ -25,7 +32,7 @@ export function encodeCheckpointBlobData(checkpointBlobData: CheckpointBlobData)
|
|
|
25
32
|
|
|
26
33
|
export function encodeCheckpointBlobDataFromBlocks(blocks: BlockBlobData[]): Fr[] {
|
|
27
34
|
const blocksBlobFields = blocks.map(block => encodeBlockBlobData(block)).flat();
|
|
28
|
-
const numBlobFields = blocksBlobFields.length +
|
|
35
|
+
const numBlobFields = blocksBlobFields.length + NUM_CHECKPOINT_END_MARKER_FIELDS;
|
|
29
36
|
return blocksBlobFields.concat(encodeCheckpointEndMarker({ numBlobFields }));
|
|
30
37
|
}
|
|
31
38
|
|
|
@@ -87,9 +94,9 @@ export function getTotalNumBlobFieldsFromTxs(txsPerBlock: TxStartMarker[][]): nu
|
|
|
87
94
|
}
|
|
88
95
|
|
|
89
96
|
return (
|
|
90
|
-
(numBlocks ?
|
|
91
|
-
numBlocks *
|
|
97
|
+
(numBlocks ? NUM_FIRST_BLOCK_END_BLOB_FIELDS - NUM_BLOCK_END_BLOB_FIELDS : 0) + // l1ToL2Messages root in the first block
|
|
98
|
+
numBlocks * NUM_BLOCK_END_BLOB_FIELDS + // 6 fields for each block end blob data.
|
|
92
99
|
txsPerBlock.reduce((total, txs) => total + txs.reduce((total, tx) => total + tx.numBlobFields, 0), 0) +
|
|
93
|
-
|
|
100
|
+
NUM_CHECKPOINT_END_MARKER_FIELDS // checkpoint end marker
|
|
94
101
|
);
|
|
95
102
|
}
|
|
@@ -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().
|
|
52
|
+
return Buffer.from(await getKzg().asyncBlobToKzgCommitment(data));
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
/**
|
package/src/interface.ts
CHANGED
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
|
}
|