@aztec/bb.js 0.80.0 → 0.82.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.
@@ -1,24 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.flattenFieldsAsArray = exports.deflattenFields = exports.reconstructUltraPlonkProof = exports.reconstructHonkProof = exports.splitHonkProof = void 0;
4
- // Buffers are prepended with their size. The size takes 4 bytes.
5
- const serializedBufferSize = 4;
4
+ const serialize_js_1 = require("../serialize/serialize.js");
5
+ // Honk proofs start with 4 bytes for the size of the proof in fields
6
+ const metadataOffset = 4;
6
7
  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]);
12
- // Account for the serialized buffer size at start
13
- const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize;
14
- // Get the part before and after the public inputs
15
- const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset);
16
- const publicInputsSplitIndex = numPublicInputs * fieldByteSize;
17
- const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex);
18
- // Construct the proof without the public inputs
19
- const proof = new Uint8Array([...proofStart, ...proofEnd]);
20
- // Fetch the number of public inputs out of the proof string
21
- const publicInputs = proofWithPublicInputs.slice(publicInputsOffset, publicInputsOffset + publicInputsSplitIndex);
8
+ function splitHonkProof(proofWithPublicInputs, numPublicInputs) {
9
+ // Remove the metadata (proof size in fields)
10
+ const proofWithPI = proofWithPublicInputs.slice(metadataOffset);
11
+ const publicInputs = proofWithPI.slice(0, numPublicInputs * fieldByteSize);
12
+ const proof = proofWithPI.slice(numPublicInputs * fieldByteSize);
22
13
  return {
23
14
  proof,
24
15
  publicInputs,
@@ -26,10 +17,9 @@ function splitHonkProof(proofWithPublicInputs) {
26
17
  }
27
18
  exports.splitHonkProof = splitHonkProof;
28
19
  function reconstructHonkProof(publicInputs, proof) {
29
- const proofStart = proof.slice(0, publicInputsOffsetBytes + serializedBufferSize);
30
- const proofEnd = proof.slice(publicInputsOffsetBytes + serializedBufferSize);
31
- // Concatenate publicInputs and proof
32
- const proofWithPublicInputs = Uint8Array.from([...proofStart, ...publicInputs, ...proofEnd]);
20
+ // Append proofWithPublicInputs size in fields
21
+ const proofSize = (0, serialize_js_1.numToUInt32BE)((publicInputs.length + proof.length) / fieldByteSize);
22
+ const proofWithPublicInputs = Uint8Array.from([...proofSize, ...publicInputs, ...proof]);
33
23
  return proofWithPublicInputs;
34
24
  }
35
25
  exports.reconstructHonkProof = reconstructHonkProof;
@@ -90,4 +80,4 @@ function hexToUint8Array(hex) {
90
80
  }
91
81
  return u8;
92
82
  }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0JBLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDNUIsTUFBTSx1QkFBdUIsR0FBRyxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFFbEUsU0FBZ0IsY0FBYyxDQUFDLHFCQUFpQztJQUM5RCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWxELGtEQUFrRDtJQUNsRCxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixHQUFHLG9CQUFvQixDQUFDO0lBQzFFLGtEQUFrRDtJQUNsRCxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDdEUsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLEdBQUcsYUFBYSxDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzFGLGdEQUFnRDtJQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUUzRCw0REFBNEQ7SUFDNUQsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDLENBQUM7SUFFbEgsT0FBTztRQUNMLEtB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
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNERBQTBEO0FBd0IxRCxxRUFBcUU7QUFDckUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUV6QixTQUFnQixjQUFjLENBQzVCLHFCQUFpQyxFQUNqQyxlQUF1QjtJQUV2Qiw2Q0FBNkM7SUFDN0MsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRWhFLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUMzRSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUVqRSxPQUFPO1FBQ0wsS0FBSztRQUNMLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQztBQWRELHdDQWNDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsWUFBd0IsRUFBRSxLQUFpQjtJQUM5RSw4Q0FBOEM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBQSw0QkFBYSxFQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFFdEYsTUFBTSxxQkFBcUIsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLE9BQU8scUJBQXFCLENBQUM7QUFDL0IsQ0FBQztBQU5ELG9EQU1DO0FBRUQsU0FBZ0IsMEJBQTBCLENBQUMsU0FBb0I7SUFDN0QsdUJBQXVCO0lBQ3ZCLE1BQU0sd0JBQXdCLEdBQUcsb0JBQW9CLENBQUMs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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.80.0",
4
+ "version": "0.82.0",
5
5
  "homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/barretenberg/ts",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -8,6 +8,7 @@ import {
8
8
  ProofDataForRecursion,
9
9
  reconstructHonkProof,
10
10
  reconstructUltraPlonkProof,
11
+ splitHonkProof,
11
12
  } from '../proof/index.js';
12
13
 
13
14
  export class AztecClientBackendError extends Error {
@@ -154,12 +155,6 @@ export class UltraPlonkBackend {
154
155
  }
155
156
  }
156
157
 
157
- // Buffers are prepended with their size. The size takes 4 bytes.
158
- const serializedBufferSize = 4;
159
- const fieldByteSize = 32;
160
- const publicInputOffset = 3;
161
- const publicInputsOffsetBytes = publicInputOffset * fieldByteSize;
162
-
163
158
  /**
164
159
  * Options for the UltraHonkBackend.
165
160
  */
@@ -213,26 +208,19 @@ export class UltraHonkBackend {
213
208
  gunzip(compressedWitness),
214
209
  );
215
210
 
216
- const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(4));
211
+ // Write VK to get the number of public inputs
212
+ const writeVKUltraHonk = options?.keccak
213
+ ? this.api.acirWriteVkUltraKeccakHonk.bind(this.api)
214
+ : this.api.acirWriteVkUltraHonk.bind(this.api);
217
215
 
218
- const numPublicInputs = Number(proofAsStrings[1]);
216
+ const vk = await writeVKUltraHonk(this.acirUncompressedBytecode, this.circuitOptions.recursive);
217
+ const vkAsFields = await this.api.acirVkAsFieldsUltraHonk(new RawBuffer(vk));
219
218
 
220
- // Account for the serialized buffer size at start
221
- const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize;
222
- // Get the part before and after the public inputs
223
- const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset);
224
- const publicInputsSplitIndex = numPublicInputs * fieldByteSize;
225
- const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex);
219
+ // Item at index 1 in VK is the number of public inputs
220
+ const numPublicInputs = Number(vkAsFields[1].toString());
226
221
 
227
- // Construct the proof without the public inputs
228
- const proof = new Uint8Array([...proofStart, ...proofEnd]);
229
-
230
- // Fetch the number of public inputs out of the proof string
231
- const publicInputsConcatenated = proofWithPublicInputs.slice(
232
- publicInputsOffset,
233
- publicInputsOffset + publicInputsSplitIndex,
234
- );
235
- const publicInputs = deflattenFields(publicInputsConcatenated);
222
+ const { proof, publicInputs: publicInputsBytes } = splitHonkProof(proofWithPublicInputs, numPublicInputs);
223
+ const publicInputs = deflattenFields(publicInputsBytes);
236
224
 
237
225
  return { proof, publicInputs };
238
226
  }
@@ -252,42 +240,23 @@ export class UltraHonkBackend {
252
240
  this.circuitOptions.recursive,
253
241
  gunzip(compressedWitness),
254
242
  );
243
+ // Write VK to get the number of public inputs
244
+ const writeVKUltraHonk = options?.keccak
245
+ ? this.api.acirWriteVkUltraKeccakHonk.bind(this.api)
246
+ : this.api.acirWriteVkUltraHonk.bind(this.api);
247
+
248
+ const vk = await writeVKUltraHonk(this.acirUncompressedBytecode, this.circuitOptions.recursive);
249
+ const vkAsFields = await this.api.acirVkAsFieldsUltraHonk(new RawBuffer(vk));
255
250
 
256
- // proofWithPublicInputs starts with a four-byte size
257
- const numSerdeHeaderBytes = 4;
258
251
  // some public inputs are handled specially
259
252
  const numKZGAccumulatorFieldElements = 16;
260
- // proof begins with: size, num public inputs, public input offset
261
- const numProofPreambleElements = 3;
262
- const publicInputsSizeIndex = 1;
263
-
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;
271
-
272
- // Construct the proof without the public inputs
273
- const numPublicInputsBytes = numPublicInputs * fieldByteSize;
274
- const numHeaderPlusPreambleBytes = numSerdeHeaderBytes + numProofPreambleElements * fieldByteSize;
275
- const proofNoPIs = new Uint8Array(proofWithPublicInputs.length - numPublicInputsBytes);
276
- // copy the elements before the public inputs
277
- proofNoPIs.set(proofWithPublicInputs.subarray(0, numHeaderPlusPreambleBytes), 0);
278
- // copy the elements after the public inputs
279
- proofNoPIs.set(
280
- proofWithPublicInputs.subarray(numHeaderPlusPreambleBytes + numPublicInputsBytes),
281
- numHeaderPlusPreambleBytes,
282
- );
283
- const proof: string[] = deflattenFields(proofNoPIs.slice(numSerdeHeaderBytes));
253
+ const publicInputsSizeIndex = 1; // index into VK for numPublicInputs
254
+ const numPublicInputs = Number(vkAsFields[publicInputsSizeIndex].toString()) - numKZGAccumulatorFieldElements;
284
255
 
285
- // Fetch the number of public inputs out of the proof string
286
- const publicInputsConcatenated = proofWithPublicInputs.slice(
287
- publicInputsOffset,
288
- publicInputsOffset + publicInputsSplitIndex,
289
- );
290
- const publicInputs = deflattenFields(publicInputsConcatenated);
256
+ const { proof: proofBytes, publicInputs: publicInputsBytes } = splitHonkProof(proofWithPublicInputs, numPublicInputs);
257
+
258
+ const publicInputs = deflattenFields(publicInputsBytes);
259
+ const proof = deflattenFields(proofBytes);
291
260
 
292
261
  return { proof, publicInputs };
293
262
  }
@@ -386,8 +355,8 @@ export class AztecClientBackend {
386
355
  await this.instantiate();
387
356
  const proofAndVk = await this.api.acirProveAztecClient(this.acirMsgpack, witnessMsgpack);
388
357
  const [proof, vk] = proofAndVk;
389
- if (!await this.verify(proof, vk)) {
390
- throw new AztecClientBackendError("Failed to verify the private (ClientIVC) transaction proof!");
358
+ if (!(await this.verify(proof, vk))) {
359
+ throw new AztecClientBackendError('Failed to verify the private (ClientIVC) transaction proof!');
391
360
  }
392
361
  return proofAndVk;
393
362
  }
@@ -1,3 +1,5 @@
1
+ import { numToUInt32BE } from "../serialize/serialize.js";
2
+
1
3
  /**
2
4
  * @description
3
5
  * The representation of a proof
@@ -20,28 +22,19 @@ export type ProofDataForRecursion = {
20
22
  proof: string[];
21
23
  };
22
24
 
23
- // Buffers are prepended with their size. The size takes 4 bytes.
24
- const serializedBufferSize = 4;
25
+ // Honk proofs start with 4 bytes for the size of the proof in fields
26
+ const metadataOffset = 4;
25
27
  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
28
 
34
- // Account for the serialized buffer size at start
35
- const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize;
36
- // Get the part before and after the public inputs
37
- const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset);
38
- const publicInputsSplitIndex = numPublicInputs * fieldByteSize;
39
- const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex);
40
- // Construct the proof without the public inputs
41
- const proof = new Uint8Array([...proofStart, ...proofEnd]);
29
+ export function splitHonkProof(
30
+ proofWithPublicInputs: Uint8Array,
31
+ numPublicInputs: number,
32
+ ): { publicInputs: Uint8Array; proof: Uint8Array } {
33
+ // Remove the metadata (proof size in fields)
34
+ const proofWithPI = proofWithPublicInputs.slice(metadataOffset);
42
35
 
43
- // Fetch the number of public inputs out of the proof string
44
- const publicInputs = proofWithPublicInputs.slice(publicInputsOffset, publicInputsOffset + publicInputsSplitIndex);
36
+ const publicInputs = proofWithPI.slice(0, numPublicInputs * fieldByteSize);
37
+ const proof = proofWithPI.slice(numPublicInputs * fieldByteSize);
45
38
 
46
39
  return {
47
40
  proof,
@@ -50,12 +43,10 @@ export function splitHonkProof(proofWithPublicInputs: Uint8Array): { publicInput
50
43
  }
51
44
 
52
45
  export function reconstructHonkProof(publicInputs: Uint8Array, proof: Uint8Array): Uint8Array {
53
- const proofStart = proof.slice(0, publicInputsOffsetBytes + serializedBufferSize);
54
- const proofEnd = proof.slice(publicInputsOffsetBytes + serializedBufferSize);
55
-
56
- // Concatenate publicInputs and proof
57
- const proofWithPublicInputs = Uint8Array.from([...proofStart, ...publicInputs, ...proofEnd]);
46
+ // Append proofWithPublicInputs size in fields
47
+ const proofSize = numToUInt32BE((publicInputs.length + proof.length) / fieldByteSize);
58
48
 
49
+ const proofWithPublicInputs = Uint8Array.from([...proofSize, ...publicInputs, ...proof]);
59
50
  return proofWithPublicInputs;
60
51
  }
61
52