@aztec/blob-lib 0.0.1-commit.9b94fc1 → 0.0.1-commit.9badcec54

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.
Files changed (83) hide show
  1. package/dest/batched_blob.d.ts +8 -2
  2. package/dest/batched_blob.d.ts.map +1 -1
  3. package/dest/blob.d.ts +17 -11
  4. package/dest/blob.d.ts.map +1 -1
  5. package/dest/blob.js +21 -20
  6. package/dest/blob_batching.d.ts +16 -3
  7. package/dest/blob_batching.d.ts.map +1 -1
  8. package/dest/blob_batching.js +29 -27
  9. package/dest/blob_utils.d.ts +4 -3
  10. package/dest/blob_utils.d.ts.map +1 -1
  11. package/dest/blob_utils.js +4 -4
  12. package/dest/circuit_types/blob_accumulator.d.ts +3 -2
  13. package/dest/circuit_types/blob_accumulator.d.ts.map +1 -1
  14. package/dest/circuit_types/blob_accumulator.js +2 -1
  15. package/dest/circuit_types/final_blob_accumulator.d.ts +3 -2
  16. package/dest/circuit_types/final_blob_accumulator.d.ts.map +1 -1
  17. package/dest/circuit_types/final_blob_accumulator.js +5 -2
  18. package/dest/circuit_types/final_blob_batching_challenges.d.ts +3 -2
  19. package/dest/circuit_types/final_blob_batching_challenges.d.ts.map +1 -1
  20. package/dest/circuit_types/final_blob_batching_challenges.js +2 -1
  21. package/dest/encoding/block_blob_data.d.ts +10 -2
  22. package/dest/encoding/block_blob_data.d.ts.map +1 -1
  23. package/dest/encoding/block_blob_data.js +11 -1
  24. package/dest/encoding/block_end_marker.d.ts +4 -3
  25. package/dest/encoding/block_end_marker.d.ts.map +1 -1
  26. package/dest/encoding/block_end_marker.js +6 -5
  27. package/dest/encoding/block_end_state_field.d.ts +2 -2
  28. package/dest/encoding/block_end_state_field.d.ts.map +1 -1
  29. package/dest/encoding/block_end_state_field.js +1 -1
  30. package/dest/encoding/checkpoint_blob_data.d.ts +2 -2
  31. package/dest/encoding/checkpoint_blob_data.d.ts.map +1 -1
  32. package/dest/encoding/checkpoint_blob_data.js +6 -6
  33. package/dest/encoding/checkpoint_end_marker.d.ts +2 -2
  34. package/dest/encoding/checkpoint_end_marker.d.ts.map +1 -1
  35. package/dest/encoding/checkpoint_end_marker.js +4 -4
  36. package/dest/encoding/fixtures.d.ts +1 -1
  37. package/dest/encoding/fixtures.d.ts.map +1 -1
  38. package/dest/encoding/fixtures.js +3 -2
  39. package/dest/encoding/tx_blob_data.d.ts +2 -2
  40. package/dest/encoding/tx_blob_data.d.ts.map +1 -1
  41. package/dest/encoding/tx_blob_data.js +1 -1
  42. package/dest/encoding/tx_start_marker.d.ts +2 -2
  43. package/dest/encoding/tx_start_marker.d.ts.map +1 -1
  44. package/dest/encoding/tx_start_marker.js +3 -3
  45. package/dest/hash.d.ts +8 -6
  46. package/dest/hash.d.ts.map +1 -1
  47. package/dest/hash.js +19 -16
  48. package/dest/index.d.ts +2 -1
  49. package/dest/index.d.ts.map +1 -1
  50. package/dest/index.js +1 -0
  51. package/dest/interface.d.ts +1 -2
  52. package/dest/interface.d.ts.map +1 -1
  53. package/dest/kzg_context.d.ts +10 -4
  54. package/dest/kzg_context.d.ts.map +1 -1
  55. package/dest/kzg_context.js +29 -5
  56. package/dest/sponge_blob.d.ts +4 -2
  57. package/dest/sponge_blob.d.ts.map +1 -1
  58. package/dest/sponge_blob.js +2 -2
  59. package/dest/testing.d.ts +2 -2
  60. package/dest/testing.d.ts.map +1 -1
  61. package/dest/testing.js +2 -1
  62. package/package.json +7 -7
  63. package/src/batched_blob.ts +2 -1
  64. package/src/blob.ts +21 -20
  65. package/src/blob_batching.ts +31 -21
  66. package/src/blob_utils.ts +7 -4
  67. package/src/circuit_types/blob_accumulator.ts +2 -1
  68. package/src/circuit_types/final_blob_accumulator.ts +2 -1
  69. package/src/circuit_types/final_blob_batching_challenges.ts +2 -1
  70. package/src/encoding/block_blob_data.ts +14 -2
  71. package/src/encoding/block_end_marker.ts +7 -6
  72. package/src/encoding/block_end_state_field.ts +1 -1
  73. package/src/encoding/checkpoint_blob_data.ts +13 -6
  74. package/src/encoding/checkpoint_end_marker.ts +4 -4
  75. package/src/encoding/fixtures.ts +3 -2
  76. package/src/encoding/tx_blob_data.ts +1 -1
  77. package/src/encoding/tx_start_marker.ts +3 -3
  78. package/src/hash.ts +22 -15
  79. package/src/index.ts +1 -0
  80. package/src/interface.ts +0 -1
  81. package/src/kzg_context.ts +39 -3
  82. package/src/sponge_blob.ts +2 -2
  83. package/src/testing.ts +3 -2
@@ -1,5 +1,29 @@
1
- import { DasContextJs } from '@crate-crypto/node-eth-kzg';
2
- export * from '@crate-crypto/node-eth-kzg';
3
- export const kzg = DasContextJs.create({
4
- usePrecomp: true
5
- });
1
+ import { createRequire } from 'module';
2
+ let nativeModule;
3
+ /** Lazily loads the @crate-crypto/node-eth-kzg native module. */ function loadNativeModule() {
4
+ if (!nativeModule) {
5
+ const require = createRequire(import.meta.url);
6
+ nativeModule = require('@crate-crypto/node-eth-kzg');
7
+ }
8
+ return nativeModule;
9
+ }
10
+ // Ethereum blob constants, loaded lazily from the native module.
11
+ // Values: BYTES_PER_BLOB=131072, BYTES_PER_COMMITMENT=48
12
+ export function getBytesPerBlob() {
13
+ return loadNativeModule().BYTES_PER_BLOB;
14
+ }
15
+ export function getBytesPerCommitment() {
16
+ return loadNativeModule().BYTES_PER_COMMITMENT;
17
+ }
18
+ let kzgInstance;
19
+ /**
20
+ * Returns the lazily-initialized KZG context.
21
+ * The first call takes ~3 seconds to initialize the precomputation tables.
22
+ */ export function getKzg() {
23
+ if (!kzgInstance) {
24
+ kzgInstance = loadNativeModule().DasContextJs.create({
25
+ usePrecomp: true
26
+ });
27
+ }
28
+ return kzgInstance;
29
+ }
@@ -1,12 +1,14 @@
1
1
  import { type FieldsOf } from '@aztec/foundation/array';
2
- import { Fr } from '@aztec/foundation/fields';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { BufferReader, FieldReader, type Tuple } from '@aztec/foundation/serialize';
4
4
  /**
5
5
  * A Poseidon2 sponge used to accumulate data that will be added to blobs.
6
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvbmdlX2Jsb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zcG9uZ2VfYmxvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUMsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxLQUFLLEVBR1gsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQzs7O0dBR0c7QUFDSCxxQkFBYSxVQUFVO2FBS0gsTUFBTSxFQUFFLGVBQWU7SUFFaEMsaUJBQWlCLEVBQUUsTUFBTTtJQU5sQyxNQUFNLENBQUMsVUFBVSxTQUEwQztJQUUzRDtJQUNFLHVFQUF1RTtJQUN2RCxNQUFNLEVBQUUsZUFBZTtJQUN2Qyx5Q0FBeUM7SUFDbEMsaUJBQWlCLEVBQUUsTUFBTSxFQUM5QjtJQUVKOztPQUVHO0lBQ0gsTUFBTSxDQUFDLElBQUksSUFBSSxVQUFVLENBS3hCO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFlBQVksR0FBRyxVQUFVLENBRzNEO0lBRUQsUUFBUSw0QkFFUDtJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0NBRTVDO0lBRUQsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUVmO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FHeEQ7SUFFRCxLQUFLLGVBRUo7SUFFSyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxpQkFReEI7SUFFSyxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUUzQjtJQUVELE1BQU0sQ0FBQyxLQUFLLElBQUksVUFBVSxDQUV6QjtDQUNGO0FBR0QscUJBQWEsZUFBZTtJQUVqQixLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25CLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBSjdCLFlBQ1MsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQ25CLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUNuQixTQUFTLEVBQUUsTUFBTSxFQUNqQixXQUFXLEVBQUUsT0FBTyxFQUN6QjtJQUVKLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsZUFBZSxDQVFoRTtJQUVELFFBQVEsNEJBRVA7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLDBEQUVqRDtJQUVELFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FFZjtJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFdBQVcsR0FBRyxlQUFlLENBUTdEO0lBRUQsTUFBTSxDQUFDLEtBQUssSUFBSSxlQUFlLENBTzlCO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLGVBQWUsQ0FJbkM7SUFLSyxhQUFhLGtCQVNsQjtJQUVLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLGlCQWF4QjtJQUVLLE9BQU8sSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLENBTzNCO0NBQ0YifQ==
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,0BAA0B,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,KAAK,EAGX,MAAM,6BAA6B,CAAC;AAErC;;;GAGG;AACH,qBAAa,UAAU;aAKH,MAAM,EAAE,eAAe;IAEhC,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"}
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"}
@@ -1,7 +1,7 @@
1
1
  import { BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB, TWO_POW_64 } from '@aztec/constants';
2
2
  import { makeTuple } from '@aztec/foundation/array';
3
- import { poseidon2Permutation } from '@aztec/foundation/crypto';
4
- import { Fr } from '@aztec/foundation/fields';
3
+ import { poseidon2Permutation } from '@aztec/foundation/crypto/poseidon';
4
+ import { Fr } from '@aztec/foundation/curves/bn254';
5
5
  import { BufferReader, FieldReader, serializeToBuffer, serializeToFields } from '@aztec/foundation/serialize';
6
6
  /**
7
7
  * A Poseidon2 sponge used to accumulate data that will be added to blobs.
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDakYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDaEcsT0FBTyxFQUFtQixVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxjQUFjLHdCQUF3QixDQUFDO0FBRXZDOzs7OztHQUtHO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxJQUFJLFNBQUksR0FBRyxVQUFVLENBVW5EO0FBMEJEOzs7OztHQUtHO0FBQ0gsd0JBQWdCLG1CQUFtQixDQUFDLElBQUksU0FBSSxHQUFHLGVBQWUsQ0FTN0Q7QUFFRCx3QkFBZ0Isd0JBQXdCLENBQUMsSUFBSSxTQUFJLHdCQU9oRDtBQUVELHdCQUFnQiwrQkFBK0IsQ0FBQyxJQUFJLFNBQUksK0JBRXZEO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFbkQifQ==
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":"AAGA,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/dest/testing.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { makeTuple } from '@aztec/foundation/array';
2
- import { BLS12Fq, BLS12Fr, BLS12Point, BLSPointNotOnCurveError, Fr } from '@aztec/foundation/fields';
2
+ import { BLS12Fq, BLS12Fr, BLS12Point, BLSPointNotOnCurveError } from '@aztec/foundation/curves/bls12';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { Blob } from './blob.js';
4
5
  import { BlobAccumulator } from './circuit_types/blob_accumulator.js';
5
6
  import { FinalBlobAccumulator } from './circuit_types/final_blob_accumulator.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/blob-lib",
3
- "version": "0.0.1-commit.9b94fc1",
3
+ "version": "0.0.1-commit.9badcec54",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -16,10 +16,10 @@
16
16
  "tsconfig": "./tsconfig.json"
17
17
  },
18
18
  "scripts": {
19
- "build": "yarn clean && tsgo -b",
20
- "build:dev": "tsgo -b --watch",
19
+ "build": "yarn clean && ../scripts/tsc.sh",
20
+ "build:dev": "../scripts/tsc.sh --watch",
21
21
  "clean": "rm -rf ./dest .tsbuildinfo",
22
- "start:dev": "concurrently -k \"tsgo -b -w\" \"nodemon --watch dest --exec yarn start\"",
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": "0.0.1-commit.9b94fc1",
31
- "@aztec/foundation": "0.0.1-commit.9b94fc1",
30
+ "@aztec/constants": "0.0.1-commit.9badcec54",
31
+ "@aztec/foundation": "0.0.1-commit.9badcec54",
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.20251126.1",
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",
@@ -1,4 +1,5 @@
1
- import { BLS12Fr, BLS12Point, Fr } from '@aztec/foundation/fields';
1
+ import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
3
 
3
4
  import { FinalBlobAccumulator } from './circuit_types/index.js';
4
5
 
package/src/blob.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import { FIELDS_PER_BLOB } from '@aztec/constants';
2
- import { BLS12Fr, Fr } from '@aztec/foundation/fields';
2
+ import { BLS12Fr } from '@aztec/foundation/curves/bls12';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
4
5
 
5
6
  import { computeBlobCommitment, computeChallengeZ, computeEthVersionedBlobHash } from './hash.js';
6
7
  import type { BlobJson } from './interface.js';
7
- import { BYTES_PER_BLOB, BYTES_PER_COMMITMENT, kzg } from './kzg_context.js';
8
+ import { getBytesPerBlob, getBytesPerCommitment, getKzg } from './kzg_context.js';
8
9
 
9
10
  export { FIELDS_PER_BLOB };
10
11
 
@@ -26,11 +27,11 @@ export class Blob {
26
27
  */
27
28
  public readonly commitment: Buffer,
28
29
  ) {
29
- if (data.length !== BYTES_PER_BLOB) {
30
- throw new Error(`Blob data must be ${BYTES_PER_BLOB} bytes. Got ${data.length}.`);
30
+ if (data.length !== getBytesPerBlob()) {
31
+ throw new Error(`Blob data must be ${getBytesPerBlob()} bytes. Got ${data.length}.`);
31
32
  }
32
- if (commitment.length !== BYTES_PER_COMMITMENT) {
33
- throw new Error(`Blob commitment must be ${BYTES_PER_COMMITMENT} bytes. Got ${commitment.length}.`);
33
+ if (commitment.length !== getBytesPerCommitment()) {
34
+ throw new Error(`Blob commitment must be ${getBytesPerCommitment()} bytes. Got ${commitment.length}.`);
34
35
  }
35
36
  }
36
37
 
@@ -39,10 +40,10 @@ export class Blob {
39
40
  * @param data - The buffer of the Blob.
40
41
  * @returns A Blob created from the buffer.
41
42
  *
42
- * @throws If data does not match the expected length (BYTES_PER_BLOB).
43
+ * @throws If data does not match the expected length (getBytesPerBlob()).
43
44
  */
44
- static fromBlobBuffer(data: Uint8Array): Blob {
45
- const commitment = computeBlobCommitment(data);
45
+ static async fromBlobBuffer(data: Uint8Array): Promise<Blob> {
46
+ const commitment = await computeBlobCommitment(data);
46
47
  return new Blob(data, commitment);
47
48
  }
48
49
 
@@ -54,13 +55,13 @@ export class Blob {
54
55
  * @param fields - The array of fields to create the Blob from.
55
56
  * @returns A Blob created from the array of fields.
56
57
  */
57
- static fromFields(fields: Fr[]): Blob {
58
+ static async fromFields(fields: Fr[]): Promise<Blob> {
58
59
  if (fields.length > FIELDS_PER_BLOB) {
59
60
  throw new Error(`Attempted to overfill blob with ${fields.length} fields. The maximum is ${FIELDS_PER_BLOB}.`);
60
61
  }
61
62
 
62
- const data = Buffer.concat([serializeToBuffer(fields)], BYTES_PER_BLOB);
63
- const commitment = computeBlobCommitment(data);
63
+ const data = Buffer.concat([serializeToBuffer(fields)], getBytesPerBlob());
64
+ const commitment = await computeBlobCommitment(data);
64
65
  return new Blob(data, commitment);
65
66
  }
66
67
 
@@ -80,16 +81,16 @@ export class Blob {
80
81
  /**
81
82
  * Create a Blob from a JSON object.
82
83
  *
83
- * Blobs will be in this form when requested from the blob sink, or from
84
+ * Blobs will be in this form when requested from the blob client, or from
84
85
  * the beacon chain via `getBlobSidecars`
85
86
  * https://ethereum.github.io/beacon-APIs/?urls.primaryName=dev#/Beacon/getBlobSidecars
86
87
  *
87
88
  * @param json - The JSON object to create the Blob from.
88
89
  * @returns A Blob created from the JSON object.
89
90
  */
90
- static fromJson(json: BlobJson): Blob {
91
+ static async fromJson(json: BlobJson): Promise<Blob> {
91
92
  const blobBuffer = Buffer.from(json.blob.slice(2), 'hex');
92
- const blob = Blob.fromBlobBuffer(blobBuffer);
93
+ const blob = await Blob.fromBlobBuffer(blobBuffer);
93
94
 
94
95
  if (blob.commitment.toString('hex') !== json.kzg_commitment.slice(2)) {
95
96
  throw new Error('KZG commitment does not match');
@@ -101,13 +102,11 @@ export class Blob {
101
102
  /**
102
103
  * Get the JSON representation of the blob.
103
104
  *
104
- * @param index - optional - The index of the blob in the block.
105
105
  * @returns The JSON representation of the blob.
106
106
  */
107
- toJson(index: number): BlobJson {
107
+ toJSON(): BlobJson {
108
108
  return {
109
109
  blob: `0x${Buffer.from(this.data).toString('hex')}`,
110
- index: index.toString(),
111
110
  // eslint-disable-next-line camelcase
112
111
  kzg_commitment: `0x${this.commitment.toString('hex')}`,
113
112
  };
@@ -135,8 +134,9 @@ export class Blob {
135
134
  * y: BLS12Fr - Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts.
136
135
  * proof: Buffer - KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes).
137
136
  */
138
- evaluate(challengeZ: Fr, verifyProof = false) {
139
- const res = kzg.computeKzgProof(this.data, challengeZ.toBuffer());
137
+ async evaluate(challengeZ: Fr, verifyProof = false) {
138
+ const kzg = getKzg();
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
  }
@@ -178,6 +178,7 @@ export class Blob {
178
178
  }
179
179
 
180
180
  static getViemKzgInstance() {
181
+ const kzg = getKzg();
181
182
  return {
182
183
  blobToKzgCommitment: kzg.blobToKzgCommitment.bind(kzg),
183
184
  computeBlobKzgProof: kzg.computeBlobKzgProof.bind(kzg),
@@ -1,13 +1,15 @@
1
- import { AZTEC_MAX_EPOCH_DURATION, BLOBS_PER_CHECKPOINT } from '@aztec/constants';
2
- import { poseidon2Hash, sha256ToField } from '@aztec/foundation/crypto';
3
- import { BLS12Fr, BLS12Point, Fr } from '@aztec/foundation/fields';
1
+ import { BLOBS_PER_CHECKPOINT, DomainSeparator, MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
2
+ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
3
+ import { sha256ToField } from '@aztec/foundation/crypto/sha256';
4
+ import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
5
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
6
 
5
7
  import { BatchedBlob } from './batched_blob.js';
6
8
  import { Blob } from './blob.js';
7
9
  import { getBlobsPerL1Block } from './blob_utils.js';
8
10
  import { BlobAccumulator, FinalBlobAccumulator, FinalBlobBatchingChallenges } from './circuit_types/index.js';
9
- import { computeBlobFieldsHash, hashNoirBigNumLimbs } from './hash.js';
10
- import { kzg } from './kzg_context.js';
11
+ import { computeBlobFieldsHash, hashBlobYLimbs } from './hash.js';
12
+ import { getKzg } from './kzg_context.js';
11
13
 
12
14
  /**
13
15
  * A class to create, manage, and prove batched EVM blobs.
@@ -73,9 +75,9 @@ export class BatchedBlobAccumulator {
73
75
  */
74
76
  static async batch(blobFieldsPerCheckpoint: Fr[][], verifyProof = false): Promise<BatchedBlob> {
75
77
  const numCheckpoints = blobFieldsPerCheckpoint.length;
76
- if (numCheckpoints > AZTEC_MAX_EPOCH_DURATION) {
78
+ if (numCheckpoints > MAX_CHECKPOINTS_PER_EPOCH) {
77
79
  throw new Error(
78
- `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}.`,
79
81
  );
80
82
  }
81
83
 
@@ -107,14 +109,14 @@ export class BatchedBlobAccumulator {
107
109
  for (const blobFields of blobFieldsPerCheckpoint) {
108
110
  // Compute the hash of all the fields in the block.
109
111
  const blobFieldsHash = await computeBlobFieldsHash(blobFields);
110
- const blobs = getBlobsPerL1Block(blobFields);
112
+ const blobs = await getBlobsPerL1Block(blobFields);
111
113
  for (const blob of blobs) {
112
114
  // Compute the challenge z for each blob and accumulate it.
113
115
  const challengeZ = await blob.computeChallengeZ(blobFieldsHash);
114
116
  if (!z) {
115
117
  z = challengeZ;
116
118
  } else {
117
- z = await poseidon2Hash([z, challengeZ]);
119
+ z = await poseidon2HashWithSeparator([z, challengeZ], DomainSeparator.BLOB_Z_ACC);
118
120
  }
119
121
  }
120
122
  allBlobs.push(...blobs);
@@ -124,15 +126,15 @@ export class BatchedBlobAccumulator {
124
126
  }
125
127
 
126
128
  // Now we have a shared challenge for all blobs, evaluate them...
127
- const proofObjects = allBlobs.map(b => b.evaluate(z));
128
- const evaluations = await Promise.all(proofObjects.map(({ y }) => hashNoirBigNumLimbs(y)));
129
+ const proofObjects = await Promise.all(allBlobs.map(b => b.evaluate(z)));
130
+ const evaluations = await Promise.all(proofObjects.map(({ y }) => hashBlobYLimbs(y)));
129
131
  // ...and find the challenge for the linear combination of blobs.
130
132
  let gamma = evaluations[0];
131
133
  // We start at i = 1, because gamma is initialized as the first blob's evaluation.
132
134
  for (let i = 1; i < allBlobs.length; i++) {
133
- gamma = await poseidon2Hash([gamma, evaluations[i]]);
135
+ gamma = await poseidon2HashWithSeparator([gamma, evaluations[i]], DomainSeparator.BLOB_GAMMA_ACC);
134
136
  }
135
- gamma = await poseidon2Hash([gamma, z]);
137
+ gamma = await poseidon2HashWithSeparator([gamma, z], DomainSeparator.BLOB_GAMMA_FINAL);
136
138
 
137
139
  return new FinalBlobBatchingChallenges(z, BLS12Fr.fromBN254Fr(gamma));
138
140
  }
@@ -143,7 +145,7 @@ export class BatchedBlobAccumulator {
143
145
  * @returns An updated blob accumulator.
144
146
  */
145
147
  async accumulateBlob(blob: Blob, blobFieldsHash: Fr) {
146
- const { proof, y: thisY } = blob.evaluate(this.finalBlobChallenges.z);
148
+ const { proof, y: thisY } = await blob.evaluate(this.finalBlobChallenges.z);
147
149
  const thisC = BLS12Point.decompress(blob.commitment);
148
150
  const thisQ = BLS12Point.decompress(proof);
149
151
  const blobChallengeZ = await blob.computeChallengeZ(blobFieldsHash);
@@ -164,7 +166,7 @@ export class BatchedBlobAccumulator {
164
166
  thisY, // yAcc = gamma^0 * y_0 = 1 * y_0
165
167
  thisC, // cAcc = gamma^0 * C_0 = 1 * C_0
166
168
  thisQ, // qAcc = gamma^0 * Q_0 = 1 * Q_0
167
- await hashNoirBigNumLimbs(thisY), // gammaAcc = poseidon2(y_0.limbs)
169
+ await hashBlobYLimbs(thisY), // gammaAcc = poseidon2(y_0.limbs)
168
170
  this.finalBlobChallenges.gamma, // gammaPow = gamma^(i + 1) = gamma^1 = gamma
169
171
  this.finalBlobChallenges,
170
172
  );
@@ -172,11 +174,11 @@ export class BatchedBlobAccumulator {
172
174
  // Moving from i - 1 to i, so:
173
175
  return new BatchedBlobAccumulator(
174
176
  sha256ToField([this.blobCommitmentsHashAcc, blob.commitment]), // blobCommitmentsHashAcc := sha256(blobCommitmentsHashAcc, C_i)
175
- await poseidon2Hash([this.zAcc, blobChallengeZ]), // zAcc := poseidon2(zAcc, z_i)
177
+ await poseidon2HashWithSeparator([this.zAcc, blobChallengeZ], DomainSeparator.BLOB_Z_ACC), // zAcc := poseidon2(BLOB_Z_ACC, zAcc, z_i)
176
178
  this.yAcc.add(thisY.mul(this.gammaPow)), // yAcc := yAcc + (gamma^i * y_i)
177
179
  this.cAcc.add(thisC.mul(this.gammaPow)), // cAcc := cAcc + (gamma^i * C_i)
178
180
  this.qAcc.add(thisQ.mul(this.gammaPow)), // qAcc := qAcc + (gamma^i * C_i)
179
- await poseidon2Hash([this.gammaAcc, await hashNoirBigNumLimbs(thisY)]), // gammaAcc := poseidon2(gammaAcc, poseidon2(y_i.limbs))
181
+ await poseidon2HashWithSeparator([this.gammaAcc, await hashBlobYLimbs(thisY)], DomainSeparator.BLOB_GAMMA_ACC), // gammaAcc := poseidon2(BLOB_GAMMA_ACC, gammaAcc, poseidon2(y_i.limbs))
180
182
  this.gammaPow.mul(this.finalBlobChallenges.gamma), // gammaPow = gamma^(i + 1) = gamma^i * final_gamma
181
183
  this.finalBlobChallenges,
182
184
  );
@@ -190,7 +192,7 @@ export class BatchedBlobAccumulator {
190
192
  * @returns An updated blob accumulator.
191
193
  */
192
194
  async accumulateFields(blobFields: Fr[]) {
193
- const blobs = getBlobsPerL1Block(blobFields);
195
+ const blobs = await getBlobsPerL1Block(blobFields);
194
196
 
195
197
  if (blobs.length > BLOBS_PER_CHECKPOINT) {
196
198
  throw new Error(
@@ -218,14 +220,17 @@ export class BatchedBlobAccumulator {
218
220
  * - z := z_acc (final challenge, at which all blobs are evaluated)
219
221
  * - y := y_acc (final opening to be checked on L1)
220
222
  * - c := c_acc (final commitment to be checked on L1)
221
- * - gamma := poseidon2(gamma_acc, z) (challenge for linear combination of y and C, above)
223
+ * - gamma := poseidon2(BLOB_GAMMA_FINAL, gamma_acc, z) (challenge for linear combination of y and C, above)
222
224
  *
223
225
  * @param verifyProof - Whether to verify the KZG proof.
224
226
  * @returns A batched blob.
225
227
  */
226
228
  async finalize(verifyProof = false): Promise<BatchedBlob> {
227
229
  // All values in acc are final, apart from gamma := poseidon2(gammaAcc, z):
228
- const calculatedGamma = await poseidon2Hash([this.gammaAcc, this.zAcc]);
230
+ const calculatedGamma = await poseidon2HashWithSeparator(
231
+ [this.gammaAcc, this.zAcc],
232
+ DomainSeparator.BLOB_GAMMA_FINAL,
233
+ );
229
234
  // Check final values:
230
235
  if (!this.zAcc.equals(this.finalBlobChallenges.z)) {
231
236
  throw new Error(
@@ -248,7 +253,12 @@ export class BatchedBlobAccumulator {
248
253
  }
249
254
 
250
255
  verify() {
251
- return kzg.verifyKzgProof(this.cAcc.compress(), this.zAcc.toBuffer(), this.yAcc.toBuffer(), this.qAcc.compress());
256
+ return getKzg().verifyKzgProof(
257
+ this.cAcc.compress(),
258
+ this.zAcc.toBuffer(),
259
+ this.yAcc.toBuffer(),
260
+ this.qAcc.compress(),
261
+ );
252
262
  }
253
263
 
254
264
  isEmptyState() {
package/src/blob_utils.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { FIELDS_PER_BLOB } from '@aztec/constants';
2
- import { BLS12Point, Fr } from '@aztec/foundation/fields';
2
+ import { BLS12Point } from '@aztec/foundation/curves/bls12';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
 
4
5
  import type { BatchedBlob } from './batched_blob.js';
5
6
  import { Blob } from './blob.js';
@@ -29,14 +30,16 @@ export function getPrefixedEthBlobCommitments(blobs: Blob[]): `0x${string}` {
29
30
  *
30
31
  * @throws If the number of fields does not match what's indicated by the checkpoint prefix.
31
32
  */
32
- export function getBlobsPerL1Block(fields: Fr[]): Blob[] {
33
+ export async function getBlobsPerL1Block(fields: Fr[]): Promise<Blob[]> {
33
34
  if (!fields.length) {
34
35
  throw new Error('Cannot create blobs from empty fields.');
35
36
  }
36
37
 
37
38
  const numBlobs = Math.ceil(fields.length / FIELDS_PER_BLOB);
38
- return Array.from({ length: numBlobs }, (_, i) =>
39
- 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
+ ),
40
43
  );
41
44
  }
42
45
 
@@ -1,5 +1,6 @@
1
1
  import { BLS12_FQ_LIMBS, BLS12_FR_LIMBS } from '@aztec/constants';
2
- import { BLS12Fq, BLS12Fr, BLS12Point, Fr } from '@aztec/foundation/fields';
2
+ import { BLS12Fq, BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize';
4
5
 
5
6
  /**
@@ -1,4 +1,5 @@
1
- import { BLS12Fr, BLS12Point, Fr } from '@aztec/foundation/fields';
1
+ import { BLS12Fr, BLS12Point } from '@aztec/foundation/curves/bls12';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
3
4
 
4
5
  import { inspect } from 'util';
@@ -1,4 +1,5 @@
1
- import { BLS12Fr, Fr } from '@aztec/foundation/fields';
1
+ import { BLS12Fr } from '@aztec/foundation/curves/bls12';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
3
4
 
4
5
  /**
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { FieldReader } from '@aztec/foundation/serialize';
3
3
 
4
4
  import { BlobDeserializationError } from '../errors.js';
@@ -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 ? 7 : 6;
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.`,
@@ -1,5 +1,6 @@
1
1
  import { BLOCK_END_PREFIX } from '@aztec/constants';
2
- import { Fr } from '@aztec/foundation/fields';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
4
 
4
5
  import { BlobDeserializationError } from '../errors.js';
5
6
 
@@ -11,12 +12,12 @@ const NUM_TXS_BIT_SIZE = 16n;
11
12
 
12
13
  export interface BlockEndMarker {
13
14
  timestamp: bigint;
14
- blockNumber: number;
15
+ blockNumber: BlockNumber;
15
16
  numTxs: number;
16
17
  }
17
18
 
18
19
  export function encodeBlockEndMarker(blockEndMarker: BlockEndMarker) {
19
- let value = BLOCK_END_PREFIX;
20
+ let value = BigInt(BLOCK_END_PREFIX);
20
21
  value <<= TIMESTAMP_BIT_SIZE;
21
22
  value += blockEndMarker.timestamp;
22
23
  value <<= BLOCK_NUMBER_BIT_SIZE;
@@ -30,13 +31,13 @@ export function decodeBlockEndMarker(field: Fr): BlockEndMarker {
30
31
  let value = field.toBigInt();
31
32
  const numTxs = Number(value & (2n ** NUM_TXS_BIT_SIZE - 1n));
32
33
  value >>= NUM_TXS_BIT_SIZE;
33
- const blockNumber = Number(value & (2n ** BLOCK_NUMBER_BIT_SIZE - 1n));
34
+ const blockNumber = BlockNumber(Number(value & (2n ** BLOCK_NUMBER_BIT_SIZE - 1n)));
34
35
  value >>= BLOCK_NUMBER_BIT_SIZE;
35
36
  const timestamp = value & (2n ** TIMESTAMP_BIT_SIZE - 1n);
36
37
  value >>= TIMESTAMP_BIT_SIZE;
37
38
 
38
39
  const prefix = value;
39
- if (prefix !== BLOCK_END_PREFIX) {
40
+ if (prefix !== BigInt(BLOCK_END_PREFIX)) {
40
41
  throw new BlobDeserializationError(`Incorrect encoding of blob fields: invalid block end marker.`);
41
42
  }
42
43
 
@@ -50,5 +51,5 @@ export function decodeBlockEndMarker(field: Fr): BlockEndMarker {
50
51
  // Check if a field is a block end marker. Used before decoding to check if it has reached the end of the block.
51
52
  export function isBlockEndMarker(field: Fr): boolean {
52
53
  const prefix = field.toBigInt() >> (NUM_TXS_BIT_SIZE + BLOCK_NUMBER_BIT_SIZE + TIMESTAMP_BIT_SIZE);
53
- return prefix === BLOCK_END_PREFIX;
54
+ return prefix === BigInt(BLOCK_END_PREFIX);
54
55
  }
@@ -4,7 +4,7 @@ import {
4
4
  NULLIFIER_TREE_HEIGHT,
5
5
  PUBLIC_DATA_TREE_HEIGHT,
6
6
  } from '@aztec/constants';
7
- import { Fr } from '@aztec/foundation/fields';
7
+ import { Fr } from '@aztec/foundation/curves/bn254';
8
8
 
9
9
  import { BlobDeserializationError } from '../errors.js';
10
10
 
@@ -1,8 +1,15 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ 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 { type BlockBlobData, decodeBlockBlobData, encodeBlockBlobData } from './block_blob_data.js';
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 + 1; // +1 for the checkpoint end marker.
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 ? 1 : 0) + // l1ToL2Messages root in the first block
91
- numBlocks * 6 + // 6 fields for each block end blob data.
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
- 1 // checkpoint end marker
100
+ NUM_CHECKPOINT_END_MARKER_FIELDS // checkpoint end marker
94
101
  );
95
102
  }
@@ -1,5 +1,5 @@
1
1
  import { CHECKPOINT_END_PREFIX } from '@aztec/constants';
2
- import { Fr } from '@aztec/foundation/fields';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
 
4
4
  import { BlobDeserializationError } from '../errors.js';
5
5
 
@@ -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
  }