@aztec/blob-lib 3.0.0-nightly.20251121 → 3.0.0-nightly.20251122

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 (42) hide show
  1. package/dest/blob_batching.d.ts +6 -6
  2. package/dest/blob_batching.d.ts.map +1 -1
  3. package/dest/blob_batching.js +24 -20
  4. package/dest/blob_utils.d.ts +0 -1
  5. package/dest/blob_utils.d.ts.map +1 -1
  6. package/dest/blob_utils.js +1 -9
  7. package/dest/encoding/block_end_marker.js +1 -1
  8. package/dest/encoding/block_end_state_field.js +1 -1
  9. package/dest/encoding/checkpoint_blob_data.d.ts +4 -2
  10. package/dest/encoding/checkpoint_blob_data.d.ts.map +1 -1
  11. package/dest/encoding/checkpoint_blob_data.js +42 -29
  12. package/dest/encoding/checkpoint_end_marker.d.ts +8 -0
  13. package/dest/encoding/checkpoint_end_marker.d.ts.map +1 -0
  14. package/dest/encoding/checkpoint_end_marker.js +28 -0
  15. package/dest/encoding/fixtures.js +5 -3
  16. package/dest/encoding/index.d.ts +1 -0
  17. package/dest/encoding/index.d.ts.map +1 -1
  18. package/dest/encoding/index.js +1 -0
  19. package/dest/encoding/tx_start_marker.js +1 -1
  20. package/dest/hash.d.ts +10 -3
  21. package/dest/hash.d.ts.map +1 -1
  22. package/dest/hash.js +14 -4
  23. package/dest/sponge_blob.d.ts +7 -11
  24. package/dest/sponge_blob.d.ts.map +1 -1
  25. package/dest/sponge_blob.js +19 -34
  26. package/dest/testing.d.ts.map +1 -1
  27. package/dest/testing.js +1 -1
  28. package/package.json +3 -3
  29. package/src/blob_batching.ts +25 -20
  30. package/src/blob_utils.ts +1 -11
  31. package/src/encoding/block_blob_data.ts +1 -1
  32. package/src/encoding/block_end_marker.ts +1 -1
  33. package/src/encoding/block_end_state_field.ts +1 -1
  34. package/src/encoding/checkpoint_blob_data.ts +54 -34
  35. package/src/encoding/checkpoint_end_marker.ts +40 -0
  36. package/src/encoding/fixtures.ts +3 -3
  37. package/src/encoding/index.ts +1 -0
  38. package/src/encoding/tx_blob_data.ts +1 -1
  39. package/src/encoding/tx_start_marker.ts +1 -1
  40. package/src/hash.ts +14 -4
  41. package/src/sponge_blob.ts +21 -34
  42. package/src/testing.ts +0 -1
@@ -1,4 +1,4 @@
1
- import { TWO_POW_64 } from '@aztec/constants';
1
+ import { BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB, TWO_POW_64 } from '@aztec/constants';
2
2
  import { type FieldsOf, makeTuple } from '@aztec/foundation/array';
3
3
  import { poseidon2Permutation } from '@aztec/foundation/crypto';
4
4
  import { Fr } from '@aztec/foundation/fields';
@@ -15,18 +15,28 @@ import {
15
15
  * See noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr.
16
16
  */
17
17
  export class SpongeBlob {
18
+ static MAX_FIELDS = BLOBS_PER_CHECKPOINT * FIELDS_PER_BLOB;
19
+
18
20
  constructor(
19
21
  /** Sponge with absorbed fields that will go into one or more blobs. */
20
22
  public readonly sponge: Poseidon2Sponge,
21
23
  /** Number of effects absorbed so far. */
22
24
  public numAbsorbedFields: number,
23
- /** Number of effects that will be absorbed. */
24
- public readonly numExpectedFields: number,
25
25
  ) {}
26
26
 
27
+ /**
28
+ * Initialize the sponge blob to absorb data for a checkpoint.
29
+ */
30
+ static init(): SpongeBlob {
31
+ // This must match the implementation in noir-projects/noir-protocol-circuits/types/src/abis/sponge_blob.nr
32
+ const iv = new Fr(BigInt(SpongeBlob.MAX_FIELDS) * TWO_POW_64);
33
+ const sponge = Poseidon2Sponge.init(iv);
34
+ return new SpongeBlob(sponge, 0);
35
+ }
36
+
27
37
  static fromBuffer(buffer: Buffer | BufferReader): SpongeBlob {
28
38
  const reader = BufferReader.asReader(buffer);
29
- return new SpongeBlob(reader.readObject(Poseidon2Sponge), reader.readNumber(), reader.readNumber());
39
+ return new SpongeBlob(reader.readObject(Poseidon2Sponge), reader.readNumber());
30
40
  }
31
41
 
32
42
  toBuffer() {
@@ -34,7 +44,7 @@ export class SpongeBlob {
34
44
  }
35
45
 
36
46
  static getFields(fields: FieldsOf<SpongeBlob>) {
37
- return [fields.sponge, fields.numAbsorbedFields, fields.numExpectedFields];
47
+ return [fields.sponge, fields.numAbsorbedFields];
38
48
  }
39
49
 
40
50
  toFields(): Fr[] {
@@ -43,11 +53,7 @@ export class SpongeBlob {
43
53
 
44
54
  static fromFields(fields: Fr[] | FieldReader): SpongeBlob {
45
55
  const reader = FieldReader.asReader(fields);
46
- return new SpongeBlob(
47
- reader.readObject(Poseidon2Sponge),
48
- reader.readField().toNumber(),
49
- reader.readField().toNumber(),
50
- );
56
+ return new SpongeBlob(reader.readObject(Poseidon2Sponge), reader.readField().toNumber());
51
57
  }
52
58
 
53
59
  clone() {
@@ -55,9 +61,9 @@ export class SpongeBlob {
55
61
  }
56
62
 
57
63
  async absorb(fields: Fr[]) {
58
- if (this.numAbsorbedFields + fields.length > this.numExpectedFields) {
64
+ if (this.numAbsorbedFields + fields.length > SpongeBlob.MAX_FIELDS) {
59
65
  throw new Error(
60
- `Attempted to fill spongeBlob with ${this.numAbsorbedFields + fields.length}, but it has a max of ${this.numExpectedFields}`,
66
+ `Attempted to fill spongeBlob with ${this.numAbsorbedFields + fields.length}, but it has a max of ${SpongeBlob.MAX_FIELDS}`,
61
67
  );
62
68
  }
63
69
  await this.sponge.absorb(fields);
@@ -65,29 +71,11 @@ export class SpongeBlob {
65
71
  }
66
72
 
67
73
  async squeeze(): Promise<Fr> {
68
- // If the blob sponge is not 'full', we append 1 to match Poseidon2::hash_internal()
69
- // NB: There is currently no use case in which we don't 'fill' a blob sponge, but adding for completeness
70
- if (this.numAbsorbedFields != this.numExpectedFields) {
71
- await this.sponge.absorb([Fr.ONE]);
72
- }
73
- return this.sponge.squeeze();
74
+ return await this.sponge.squeeze();
74
75
  }
75
76
 
76
77
  static empty(): SpongeBlob {
77
- return new SpongeBlob(Poseidon2Sponge.empty(), 0, 0);
78
- }
79
-
80
- /**
81
- * Initialize the sponge blob with the number of expected fields in the checkpoint and absorb it as the first field.
82
- * Note: `numExpectedFields` includes the first field absorbed in this method.
83
- */
84
- static async init(numExpectedFields: number): Promise<SpongeBlob> {
85
- // This must match what the checkpoint root rollup circuit expects.
86
- // See noir-projects/noir-protocol-circuits/types/src/abis/sponge_blob.nr -> init_for_checkpoint.
87
- const sponge = Poseidon2Sponge.init(numExpectedFields);
88
- await sponge.absorb([new Fr(numExpectedFields)]);
89
- const numAbsorbedFields = 1;
90
- return new SpongeBlob(sponge, numAbsorbedFields, numExpectedFields);
78
+ return new SpongeBlob(Poseidon2Sponge.empty(), 0);
91
79
  }
92
80
  }
93
81
 
@@ -141,8 +129,7 @@ export class Poseidon2Sponge {
141
129
  );
142
130
  }
143
131
 
144
- static init(numExpectedFields: number): Poseidon2Sponge {
145
- const iv = new Fr(numExpectedFields).mul(new Fr(TWO_POW_64));
132
+ static init(iv: Fr): Poseidon2Sponge {
146
133
  const sponge = Poseidon2Sponge.empty();
147
134
  sponge.state[3] = iv;
148
135
  return sponge;
package/src/testing.ts CHANGED
@@ -23,7 +23,6 @@ export function makeSpongeBlob(seed = 1): SpongeBlob {
23
23
  false,
24
24
  ),
25
25
  seed,
26
- seed + 1,
27
26
  );
28
27
  }
29
28