@aztec/bb.js 0.79.0 → 0.81.0

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.
@@ -4,21 +4,16 @@ exports.flattenFieldsAsArray = exports.deflattenFields = exports.reconstructUltr
4
4
  // Buffers are prepended with their size. The size takes 4 bytes.
5
5
  const serializedBufferSize = 4;
6
6
  const fieldByteSize = 32;
7
- const publicInputOffset = 3;
8
- const publicInputsOffsetBytes = publicInputOffset * fieldByteSize;
9
- function splitHonkProof(proofWithPublicInputs) {
10
- const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(4));
11
- const numPublicInputs = Number(proofAsStrings[1]);
7
+ function splitHonkProof(proofWithPublicInputs, numPublicInputs) {
12
8
  // Account for the serialized buffer size at start
13
- const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize;
14
9
  // Get the part before and after the public inputs
15
- const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset);
10
+ const proofStart = proofWithPublicInputs.slice(0, serializedBufferSize);
16
11
  const publicInputsSplitIndex = numPublicInputs * fieldByteSize;
17
- const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex);
12
+ const proofEnd = proofWithPublicInputs.slice(serializedBufferSize + publicInputsSplitIndex);
18
13
  // Construct the proof without the public inputs
19
14
  const proof = new Uint8Array([...proofStart, ...proofEnd]);
20
15
  // Fetch the number of public inputs out of the proof string
21
- const publicInputs = proofWithPublicInputs.slice(publicInputsOffset, publicInputsOffset + publicInputsSplitIndex);
16
+ const publicInputs = proofWithPublicInputs.slice(serializedBufferSize, serializedBufferSize + publicInputsSplitIndex);
22
17
  return {
23
18
  proof,
24
19
  publicInputs,
@@ -26,8 +21,8 @@ function splitHonkProof(proofWithPublicInputs) {
26
21
  }
27
22
  exports.splitHonkProof = splitHonkProof;
28
23
  function reconstructHonkProof(publicInputs, proof) {
29
- const proofStart = proof.slice(0, publicInputsOffsetBytes + serializedBufferSize);
30
- const proofEnd = proof.slice(publicInputsOffsetBytes + serializedBufferSize);
24
+ const proofStart = proof.slice(0, serializedBufferSize);
25
+ const proofEnd = proof.slice(serializedBufferSize);
31
26
  // Concatenate publicInputs and proof
32
27
  const proofWithPublicInputs = Uint8Array.from([...proofStart, ...publicInputs, ...proofEnd]);
33
28
  return proofWithPublicInputs;
@@ -90,4 +85,4 @@ function hexToUint8Array(hex) {
90
85
  }
91
86
  return u8;
92
87
  }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0JBLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDNUIsTUFBTSx1QkFBdUIsR0FBRyxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFFbEUsU0FBZ0IsY0FBYyxDQUFDLHFCQUFpQztJQUM5RCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWxELGtEQUFrRDtJQUNsRCxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixHQUFHLG9CQUFvQixDQUFDO0lBQzFFLGtEQUFrRDtJQUNsRCxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDdEUsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLEdBQUcsYUFBYSxDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzFGLGdEQUFnRDtJQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUUzRCw0REFBNEQ7SUFDNUQsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDLENBQUM7SUFFbEgsT0FBTztRQUNMLEtB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
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0JBLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekIsU0FBZ0IsY0FBYyxDQUM1QixxQkFBaUMsRUFDakMsZUFBdUI7SUFFdkIsa0RBQWtEO0lBQ2xELGtEQUFrRDtJQUNsRCxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDeEUsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLEdBQUcsYUFBYSxDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzVGLGdEQUFnRDtJQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUUzRCw0REFBNEQ7SUFDNUQsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDLENBQUM7SUFFdEgsT0FBTztRQUNMLEtBQUs7UUFDTCxZQUFZO0tBQ2IsQ0FBQztBQUNKLENBQUM7QUFuQkQsd0NBbUJDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsWUFBd0IsRUFBRSxLQUFpQjtJQUM5RSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUVuRCxxQ0FBcUM7SUFDckMsTUFBTSxxQkFBcUIsR0FB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aztec/bb.js",
3
3
  "packageManager": "yarn@4.5.2",
4
- "version": "0.79.0",
4
+ "version": "0.81.0",
5
5
  "homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/barretenberg/ts",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -157,8 +157,6 @@ export class UltraPlonkBackend {
157
157
  // Buffers are prepended with their size. The size takes 4 bytes.
158
158
  const serializedBufferSize = 4;
159
159
  const fieldByteSize = 32;
160
- const publicInputOffset = 3;
161
- const publicInputsOffsetBytes = publicInputOffset * fieldByteSize;
162
160
 
163
161
  /**
164
162
  * Options for the UltraHonkBackend.
@@ -213,24 +211,31 @@ export class UltraHonkBackend {
213
211
  gunzip(compressedWitness),
214
212
  );
215
213
 
216
- const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(4));
214
+ // Write VK to get the number of public inputs
215
+ const writeVKUltraHonk = options?.keccak
216
+ ? this.api.acirWriteVkUltraKeccakHonk.bind(this.api)
217
+ : this.api.acirWriteVkUltraHonk.bind(this.api);
218
+
219
+ const vk = await writeVKUltraHonk(this.acirUncompressedBytecode, this.circuitOptions.recursive);
220
+ const vkAsFields = await this.api.acirVkAsFieldsUltraHonk(new RawBuffer(vk));
221
+
222
+ // Item at index 1 in VK is the number of public inputs
223
+ const numPublicInputs = Number(vkAsFields[1].toString());
217
224
 
218
- const numPublicInputs = Number(proofAsStrings[1]);
219
225
 
220
226
  // Account for the serialized buffer size at start
221
- const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize;
222
227
  // Get the part before and after the public inputs
223
- const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset);
228
+ const proofStart = proofWithPublicInputs.slice(0, serializedBufferSize);
224
229
  const publicInputsSplitIndex = numPublicInputs * fieldByteSize;
225
- const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex);
230
+ const proofEnd = proofWithPublicInputs.slice(serializedBufferSize + publicInputsSplitIndex);
226
231
 
227
232
  // Construct the proof without the public inputs
228
233
  const proof = new Uint8Array([...proofStart, ...proofEnd]);
229
234
 
230
235
  // Fetch the number of public inputs out of the proof string
231
236
  const publicInputsConcatenated = proofWithPublicInputs.slice(
232
- publicInputsOffset,
233
- publicInputsOffset + publicInputsSplitIndex,
237
+ serializedBufferSize,
238
+ serializedBufferSize + publicInputsSplitIndex,
234
239
  );
235
240
  const publicInputs = deflattenFields(publicInputsConcatenated);
236
241
 
@@ -252,40 +257,35 @@ export class UltraHonkBackend {
252
257
  this.circuitOptions.recursive,
253
258
  gunzip(compressedWitness),
254
259
  );
260
+ // Write VK to get the number of public inputs
261
+ const writeVKUltraHonk = options?.keccak
262
+ ? this.api.acirWriteVkUltraKeccakHonk.bind(this.api)
263
+ : this.api.acirWriteVkUltraHonk.bind(this.api);
264
+
265
+ const vk = await writeVKUltraHonk(this.acirUncompressedBytecode, this.circuitOptions.recursive);
266
+ const vkAsFields = await this.api.acirVkAsFieldsUltraHonk(new RawBuffer(vk));
255
267
 
256
268
  // proofWithPublicInputs starts with a four-byte size
257
269
  const numSerdeHeaderBytes = 4;
258
270
  // some public inputs are handled specially
259
271
  const numKZGAccumulatorFieldElements = 16;
260
- // proof begins with: size, num public inputs, public input offset
261
- const numProofPreambleElements = 3;
262
- const publicInputsSizeIndex = 1;
272
+ const publicInputsSizeIndex = 1; // index into VK for numPublicInputs
263
273
 
264
- // Slice serde header and convert to fields
265
- const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(numSerdeHeaderBytes));
266
- const numPublicInputs = Number(proofAsStrings[publicInputsSizeIndex]) - numKZGAccumulatorFieldElements;
267
-
268
- // Account for the serialized buffer size at start
269
- const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize;
270
- const publicInputsSplitIndex = numPublicInputs * fieldByteSize;
274
+ const numPublicInputs = Number(vkAsFields[publicInputsSizeIndex].toString()) - numKZGAccumulatorFieldElements;
271
275
 
272
276
  // Construct the proof without the public inputs
273
277
  const numPublicInputsBytes = numPublicInputs * fieldByteSize;
274
- const numHeaderPlusPreambleBytes = numSerdeHeaderBytes + numProofPreambleElements * fieldByteSize;
275
278
  const proofNoPIs = new Uint8Array(proofWithPublicInputs.length - numPublicInputsBytes);
276
279
  // copy the elements before the public inputs
277
- proofNoPIs.set(proofWithPublicInputs.subarray(0, numHeaderPlusPreambleBytes), 0);
280
+ proofNoPIs.set(proofWithPublicInputs.subarray(0, numSerdeHeaderBytes), 0);
278
281
  // copy the elements after the public inputs
279
- proofNoPIs.set(
280
- proofWithPublicInputs.subarray(numHeaderPlusPreambleBytes + numPublicInputsBytes),
281
- numHeaderPlusPreambleBytes,
282
- );
282
+ proofNoPIs.set(proofWithPublicInputs.subarray(numSerdeHeaderBytes + numPublicInputsBytes), numSerdeHeaderBytes);
283
283
  const proof: string[] = deflattenFields(proofNoPIs.slice(numSerdeHeaderBytes));
284
284
 
285
285
  // Fetch the number of public inputs out of the proof string
286
286
  const publicInputsConcatenated = proofWithPublicInputs.slice(
287
- publicInputsOffset,
288
- publicInputsOffset + publicInputsSplitIndex,
287
+ serializedBufferSize,
288
+ serializedBufferSize + numPublicInputsBytes,
289
289
  );
290
290
  const publicInputs = deflattenFields(publicInputsConcatenated);
291
291
 
@@ -386,8 +386,8 @@ export class AztecClientBackend {
386
386
  await this.instantiate();
387
387
  const proofAndVk = await this.api.acirProveAztecClient(this.acirMsgpack, witnessMsgpack);
388
388
  const [proof, vk] = proofAndVk;
389
- if (!await this.verify(proof, vk)) {
390
- throw new AztecClientBackendError("Failed to verify the private (ClientIVC) transaction proof!");
389
+ if (!(await this.verify(proof, vk))) {
390
+ throw new AztecClientBackendError('Failed to verify the private (ClientIVC) transaction proof!');
391
391
  }
392
392
  return proofAndVk;
393
393
  }
@@ -23,25 +23,21 @@ export type ProofDataForRecursion = {
23
23
  // Buffers are prepended with their size. The size takes 4 bytes.
24
24
  const serializedBufferSize = 4;
25
25
  const fieldByteSize = 32;
26
- const publicInputOffset = 3;
27
- const publicInputsOffsetBytes = publicInputOffset * fieldByteSize;
28
-
29
- export function splitHonkProof(proofWithPublicInputs: Uint8Array): { publicInputs: Uint8Array; proof: Uint8Array } {
30
- const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(4));
31
-
32
- const numPublicInputs = Number(proofAsStrings[1]);
33
26
 
27
+ export function splitHonkProof(
28
+ proofWithPublicInputs: Uint8Array,
29
+ numPublicInputs: number,
30
+ ): { publicInputs: Uint8Array; proof: Uint8Array } {
34
31
  // Account for the serialized buffer size at start
35
- const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize;
36
32
  // Get the part before and after the public inputs
37
- const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset);
33
+ const proofStart = proofWithPublicInputs.slice(0, serializedBufferSize);
38
34
  const publicInputsSplitIndex = numPublicInputs * fieldByteSize;
39
- const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex);
35
+ const proofEnd = proofWithPublicInputs.slice(serializedBufferSize + publicInputsSplitIndex);
40
36
  // Construct the proof without the public inputs
41
37
  const proof = new Uint8Array([...proofStart, ...proofEnd]);
42
38
 
43
39
  // Fetch the number of public inputs out of the proof string
44
- const publicInputs = proofWithPublicInputs.slice(publicInputsOffset, publicInputsOffset + publicInputsSplitIndex);
40
+ const publicInputs = proofWithPublicInputs.slice(serializedBufferSize, serializedBufferSize + publicInputsSplitIndex);
45
41
 
46
42
  return {
47
43
  proof,
@@ -50,8 +46,8 @@ export function splitHonkProof(proofWithPublicInputs: Uint8Array): { publicInput
50
46
  }
51
47
 
52
48
  export function reconstructHonkProof(publicInputs: Uint8Array, proof: Uint8Array): Uint8Array {
53
- const proofStart = proof.slice(0, publicInputsOffsetBytes + serializedBufferSize);
54
- const proofEnd = proof.slice(publicInputsOffsetBytes + serializedBufferSize);
49
+ const proofStart = proof.slice(0, serializedBufferSize);
50
+ const proofEnd = proof.slice(serializedBufferSize);
55
51
 
56
52
  // Concatenate publicInputs and proof
57
53
  const proofWithPublicInputs = Uint8Array.from([...proofStart, ...publicInputs, ...proofEnd]);