@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.
- package/dest/browser/barretenberg/backend.d.ts.map +1 -1
- package/dest/browser/barretenberg-threads.js +1 -1
- package/dest/browser/barretenberg.js +1 -1
- package/dest/browser/index.js +20 -42
- package/dest/browser/proof/index.d.ts +1 -1
- package/dest/browser/proof/index.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.js +25 -45
- package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node/proof/index.d.ts +1 -1
- package/dest/node/proof/index.d.ts.map +1 -1
- package/dest/node/proof/index.js +12 -22
- package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/backend.js +24 -44
- package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node-cjs/proof/index.d.ts +1 -1
- package/dest/node-cjs/proof/index.d.ts.map +1 -1
- package/dest/node-cjs/proof/index.js +12 -22
- package/package.json +1 -1
- package/src/barretenberg/backend.ts +26 -57
- package/src/proof/index.ts +15 -24
|
@@ -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
|
-
|
|
5
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
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
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
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,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNERBQTBEO0FBd0IxRCxxRUFBcUU7QUFDckUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUV6QixTQUFnQixjQUFjLENBQzVCLHFCQUFpQyxFQUNqQyxlQUF1QjtJQUV2Qiw2Q0FBNkM7SUFDN0MsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRWhFLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUMzRSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUVqRSxPQUFPO1FBQ0wsS0FBSztRQUNMLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQztBQWRELHdDQWNDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsWUFBd0IsRUFBRSxLQUFpQjtJQUM5RSw4Q0FBOEM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBQSw0QkFBYSxFQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFFdEYsTUFBTSxxQkFBcUIsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLE9BQU8scUJBQXFCLENBQUM7QUFDL0IsQ0FBQztBQU5ELG9EQU1DO0FBRUQsU0FBZ0IsMEJBQTBCLENBQUMsU0FBb0I7SUFDN0QsdUJBQXVCO0lBQ3ZCLE1BQU0sd0JBQXdCLEdBQUcsb0JBQW9CLENBQUMs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
|
package/package.json
CHANGED
|
@@ -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
|
-
|
|
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
|
|
216
|
+
const vk = await writeVKUltraHonk(this.acirUncompressedBytecode, this.circuitOptions.recursive);
|
|
217
|
+
const vkAsFields = await this.api.acirVkAsFieldsUltraHonk(new RawBuffer(vk));
|
|
219
218
|
|
|
220
|
-
//
|
|
221
|
-
const
|
|
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
|
-
|
|
228
|
-
const
|
|
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
|
-
|
|
261
|
-
const
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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(
|
|
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
|
}
|
package/src/proof/index.ts
CHANGED
|
@@ -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
|
-
//
|
|
24
|
-
const
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
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
|
-
|
|
44
|
-
const
|
|
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
|
-
|
|
54
|
-
const
|
|
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
|
|