@aztec/bb-prover 0.67.0 → 0.67.1-devnet
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/prover/bb_private_kernel_prover.d.ts +2 -11
- package/dest/prover/bb_private_kernel_prover.d.ts.map +1 -1
- package/dest/prover/bb_private_kernel_prover.js +4 -69
- package/dest/prover/bb_prover.d.ts +1 -1
- package/dest/prover/bb_prover.d.ts.map +1 -1
- package/dest/prover/bb_prover.js +3 -2
- package/dest/prover/client_ivc_proof_utils.d.ts +23 -0
- package/dest/prover/client_ivc_proof_utils.d.ts.map +1 -0
- package/dest/prover/client_ivc_proof_utils.js +35 -0
- package/dest/prover/index.d.ts +1 -0
- package/dest/prover/index.d.ts.map +1 -1
- package/dest/prover/index.js +2 -1
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +9 -4
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +3 -2
- package/dest/wasm/index.d.ts +19 -0
- package/dest/wasm/index.d.ts.map +1 -0
- package/dest/wasm/index.js +74 -0
- package/package.json +13 -9
- package/src/prover/bb_private_kernel_prover.ts +7 -131
- package/src/prover/bb_prover.ts +2 -1
- package/src/prover/client_ivc_proof_utils.ts +39 -0
- package/src/prover/index.ts +1 -0
- package/src/test/test_circuit_prover.ts +10 -5
- package/src/verifier/bb_verifier.ts +2 -1
- package/src/wasm/index.ts +155 -0
|
@@ -6,6 +6,7 @@ import { promises as fs } from 'fs';
|
|
|
6
6
|
import * as path from 'path';
|
|
7
7
|
import { BB_RESULT, PROOF_FILENAME, VK_FILENAME, generateContractForCircuit, generateKeyForNoirCircuit, verifyClientIvcProof, verifyProof, } from '../bb/execute.js';
|
|
8
8
|
import { getUltraHonkFlavorForCircuit } from '../honk.js';
|
|
9
|
+
import { writeToOutputDirectory } from '../prover/client_ivc_proof_utils.js';
|
|
9
10
|
import { isProtocolArtifactRecursive, mapProtocolArtifactNameToCircuitName } from '../stats.js';
|
|
10
11
|
import { extractVkData } from '../verification_key/verification_key_data.js';
|
|
11
12
|
export class BBCircuitVerifier {
|
|
@@ -87,7 +88,7 @@ export class BBCircuitVerifier {
|
|
|
87
88
|
const logFunction = (message) => {
|
|
88
89
|
this.logger.debug(`${circuit} BB out - ${message}`);
|
|
89
90
|
};
|
|
90
|
-
await tx.clientIvcProof
|
|
91
|
+
await writeToOutputDirectory(tx.clientIvcProof, bbWorkingDirectory);
|
|
91
92
|
const result = await verifyClientIvcProof(this.config.bbBinaryPath, bbWorkingDirectory, logFunction);
|
|
92
93
|
if (result.status === BB_RESULT.FAILURE) {
|
|
93
94
|
const errorMessage = `Failed to verify ${circuit} proof!`;
|
|
@@ -109,4 +110,4 @@ export class BBCircuitVerifier {
|
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfdmVyaWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVyaWZpZXIvYmJfdmVyaWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQyxFQUFFLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUc5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUEyQixZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBR0wsd0JBQXdCLEdBQ3pCLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUNMLFNBQVMsRUFDVCxjQUFjLEVBQ2QsV0FBVyxFQUNYLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLFdBQVcsR0FDWixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBd0MsNEJBQTRCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLG9DQUFvQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUU3RSxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQ1UsTUFBZ0IsRUFDaEIsbUJBQW1CLElBQUksR0FBRyxFQUFrRCxFQUM1RSxNQUFjO1FBRmQsV0FBTSxHQUFOLE1BQU0sQ0FBVTtRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTREO1FBQzVFLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDckIsQ0FBQztJQUVHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNyQixNQUFn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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { type PrivateKernelProver, type PrivateKernelSimulateOutput } from '@aztec/circuit-types';
|
|
4
|
+
import { ClientIvcProof, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, type PrivateKernelResetCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs } from '@aztec/circuits.js';
|
|
5
|
+
import { type WitnessMap } from '@noir-lang/noir_js';
|
|
6
|
+
export declare class BBWasmPrivateKernelProver implements PrivateKernelProver {
|
|
7
|
+
private threads;
|
|
8
|
+
private log;
|
|
9
|
+
private simulator;
|
|
10
|
+
constructor(threads?: number, log?: import("@aztec/foundation/log").Logger);
|
|
11
|
+
simulateProofInit(inputs: PrivateKernelInitCircuitPrivateInputs): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>>;
|
|
12
|
+
simulateProofInner(inputs: PrivateKernelInnerCircuitPrivateInputs): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>>;
|
|
13
|
+
simulateProofReset(inputs: PrivateKernelResetCircuitPrivateInputs): Promise<PrivateKernelSimulateOutput<PrivateKernelCircuitPublicInputs>>;
|
|
14
|
+
simulateProofTail(inputs: PrivateKernelTailCircuitPrivateInputs): Promise<PrivateKernelSimulateOutput<PrivateKernelTailCircuitPublicInputs>>;
|
|
15
|
+
private simulate;
|
|
16
|
+
createClientIvcProof(acirs: Buffer[], witnessStack: WitnessMap[]): Promise<ClientIvcProof>;
|
|
17
|
+
computeGateCountForCircuit(_bytecode: Buffer, _circuitName: string): Promise<number>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wasm/index.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EACL,cAAc,EACd,KAAK,gCAAgC,EACrC,KAAK,qCAAqC,EAC1C,KAAK,sCAAsC,EAC3C,KAAK,sCAAsC,EAC3C,KAAK,qCAAqC,EAC1C,KAAK,oCAAoC,EAC1C,MAAM,oBAAoB,CAAC;AAsB5B,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,qBAAa,yBAA0B,YAAW,mBAAmB;IAGvD,OAAO,CAAC,OAAO;IAAc,OAAO,CAAC,GAAG;IAFpD,OAAO,CAAC,SAAS,CAAuB;gBAEpB,OAAO,GAAE,MAAU,EAAU,GAAG,yCAAiC;IAExE,iBAAiB,CAC5B,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,2BAA2B,CAAC,gCAAgC,CAAC,CAAC;IAS5D,kBAAkB,CAC7B,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,2BAA2B,CAAC,gCAAgC,CAAC,CAAC;IAS5D,kBAAkB,CAC7B,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,2BAA2B,CAAC,gCAAgC,CAAC,CAAC;IAW5D,iBAAiB,CAC5B,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,2BAA2B,CAAC,oCAAoC,CAAC,CAAC;YAiB/D,QAAQ;IAqChB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAmBhG,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAGrF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { AztecClientBackend } from '@aztec/bb.js';
|
|
2
|
+
import { ClientIvcProof, } from '@aztec/circuits.js';
|
|
3
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
5
|
+
import { ClientCircuitArtifacts, ClientCircuitVks, convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap, convertPrivateKernelInnerInputsToWitnessMap, convertPrivateKernelInnerOutputsFromWitnessMap, convertPrivateKernelResetInputsToWitnessMap, convertPrivateKernelResetOutputsFromWitnessMap, convertPrivateKernelTailForPublicOutputsFromWitnessMap, convertPrivateKernelTailInputsToWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap, convertPrivateKernelTailToPublicInputsToWitnessMap, getPrivateKernelResetArtifactName, } from '@aztec/noir-protocol-circuits-types/client';
|
|
6
|
+
import { WASMSimulator } from '@aztec/simulator/client';
|
|
7
|
+
import { serializeWitness } from '@noir-lang/noirc_abi';
|
|
8
|
+
import { ungzip } from 'pako';
|
|
9
|
+
export class BBWasmPrivateKernelProver {
|
|
10
|
+
constructor(threads = 1, log = createLogger('bb-prover:wasm')) {
|
|
11
|
+
this.threads = threads;
|
|
12
|
+
this.log = log;
|
|
13
|
+
this.simulator = new WASMSimulator();
|
|
14
|
+
}
|
|
15
|
+
async simulateProofInit(inputs) {
|
|
16
|
+
return await this.simulate(inputs, 'PrivateKernelInitArtifact', convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap);
|
|
17
|
+
}
|
|
18
|
+
async simulateProofInner(inputs) {
|
|
19
|
+
return await this.simulate(inputs, 'PrivateKernelInnerArtifact', convertPrivateKernelInnerInputsToWitnessMap, convertPrivateKernelInnerOutputsFromWitnessMap);
|
|
20
|
+
}
|
|
21
|
+
async simulateProofReset(inputs) {
|
|
22
|
+
const variantInputs = inputs.trimToSizes();
|
|
23
|
+
const artifactName = getPrivateKernelResetArtifactName(inputs.dimensions);
|
|
24
|
+
return await this.simulate(variantInputs, artifactName, variantInputs => convertPrivateKernelResetInputsToWitnessMap(variantInputs, artifactName), output => convertPrivateKernelResetOutputsFromWitnessMap(output, artifactName));
|
|
25
|
+
}
|
|
26
|
+
async simulateProofTail(inputs) {
|
|
27
|
+
if (!inputs.isForPublic()) {
|
|
28
|
+
return await this.simulate(inputs, 'PrivateKernelTailArtifact', convertPrivateKernelTailInputsToWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap);
|
|
29
|
+
}
|
|
30
|
+
return await this.simulate(inputs, 'PrivateKernelTailToPublicArtifact', convertPrivateKernelTailToPublicInputsToWitnessMap, convertPrivateKernelTailForPublicOutputsFromWitnessMap);
|
|
31
|
+
}
|
|
32
|
+
async simulate(inputs, circuitType, convertInputs, convertOutputs) {
|
|
33
|
+
this.log.debug(`Generating witness for ${circuitType}`);
|
|
34
|
+
const compiledCircuit = ClientCircuitArtifacts[circuitType];
|
|
35
|
+
const witnessMap = convertInputs(inputs);
|
|
36
|
+
const timer = new Timer();
|
|
37
|
+
const outputWitness = await this.simulator.simulateCircuit(witnessMap, compiledCircuit);
|
|
38
|
+
const output = convertOutputs(outputWitness);
|
|
39
|
+
this.log.debug(`Generated witness for ${circuitType}`, {
|
|
40
|
+
eventName: 'circuit-witness-generation',
|
|
41
|
+
circuitName: circuitType,
|
|
42
|
+
duration: timer.ms(),
|
|
43
|
+
inputSize: inputs.toBuffer().length,
|
|
44
|
+
outputSize: output.toBuffer().length,
|
|
45
|
+
});
|
|
46
|
+
const verificationKey = ClientCircuitVks[circuitType].keyAsFields;
|
|
47
|
+
const bytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
|
|
48
|
+
const kernelOutput = {
|
|
49
|
+
publicInputs: output,
|
|
50
|
+
verificationKey,
|
|
51
|
+
outputWitness,
|
|
52
|
+
bytecode,
|
|
53
|
+
};
|
|
54
|
+
return kernelOutput;
|
|
55
|
+
}
|
|
56
|
+
async createClientIvcProof(acirs, witnessStack) {
|
|
57
|
+
const timer = new Timer();
|
|
58
|
+
this.log.info(`Generating ClientIVC proof...`);
|
|
59
|
+
const backend = new AztecClientBackend(acirs.map(acir => ungzip(acir)), { threads: this.threads });
|
|
60
|
+
const [proof, vk] = await backend.prove(witnessStack.map(witnessMap => ungzip(serializeWitness(witnessMap))));
|
|
61
|
+
await backend.destroy();
|
|
62
|
+
this.log.info(`Generated ClientIVC proof`, {
|
|
63
|
+
eventName: 'client-ivc-proof-generation',
|
|
64
|
+
duration: timer.ms(),
|
|
65
|
+
proofSize: proof.length,
|
|
66
|
+
vkSize: vk.length,
|
|
67
|
+
});
|
|
68
|
+
return new ClientIvcProof(Buffer.from(proof), Buffer.from(vk));
|
|
69
|
+
}
|
|
70
|
+
computeGateCountForCircuit(_bytecode, _circuitName) {
|
|
71
|
+
return Promise.resolve(0);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FzbS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbEQsT0FBTyxFQUNMLGNBQWMsR0FPZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFFaEIsMENBQTBDLEVBQzFDLDZDQUE2QyxFQUM3QywyQ0FBMkMsRUFDM0MsOENBQThDLEVBQzlDLDJDQUEyQyxFQUMzQyw4Q0FBOEMsRUFDOUMsc0RBQXNELEVBQ3RELDBDQUEwQyxFQUMxQyw2Q0FBNkMsRUFDN0Msa0RBQWtELEVBQ2xELGlDQUFpQyxHQUNsQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUl4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlCLE1BQU0sT0FBTyx5QkFBeUI7SUFHcEMsWUFBb0IsVUFBa0IsQ0FBQyxFQUFVLE1BQU0sWUFBWSxDQUFDLGdCQUFnQixDQUFDO1FBQWpFLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFpQztRQUY3RSxjQUFTLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUVnRCxDQUFDO0lBRWxGLEtBQUssQ0FBQyxpQkFBaUIsQ0FDNUIsTUFBNkM7UUFFN0MsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQ3hCLE1BQU0sRUFDTiwyQkFBMkIsRUFDM0IsMENBQTBDLEVBQzFDLDZDQUE2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
|
package/package.json
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/bb-prover",
|
|
3
|
-
"version": "0.67.
|
|
3
|
+
"version": "0.67.1-devnet",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
|
+
"./wasm": "./dest/wasm/index.js",
|
|
7
8
|
"./prover": "./dest/prover/index.js",
|
|
8
9
|
"./verifier": "./dest/verifier/index.js",
|
|
9
|
-
"./test": "./dest/test/index.js"
|
|
10
|
+
"./test": "./dest/test/index.js",
|
|
11
|
+
"./config": "./dest/config.js"
|
|
10
12
|
},
|
|
11
13
|
"bin": {
|
|
12
14
|
"bb-cli": "./dest/bb/index.js"
|
|
@@ -69,17 +71,19 @@
|
|
|
69
71
|
]
|
|
70
72
|
},
|
|
71
73
|
"dependencies": {
|
|
72
|
-
"@aztec/
|
|
73
|
-
"@aztec/
|
|
74
|
-
"@aztec/
|
|
75
|
-
"@aztec/
|
|
76
|
-
"@aztec/
|
|
77
|
-
"@aztec/
|
|
78
|
-
"@aztec/
|
|
74
|
+
"@aztec/bb.js": "0.67.1-devnet",
|
|
75
|
+
"@aztec/circuit-types": "0.67.1-devnet",
|
|
76
|
+
"@aztec/circuits.js": "0.67.1-devnet",
|
|
77
|
+
"@aztec/foundation": "0.67.1-devnet",
|
|
78
|
+
"@aztec/noir-protocol-circuits-types": "0.67.1-devnet",
|
|
79
|
+
"@aztec/simulator": "0.67.1-devnet",
|
|
80
|
+
"@aztec/telemetry-client": "0.67.1-devnet",
|
|
81
|
+
"@aztec/world-state": "0.67.1-devnet",
|
|
79
82
|
"@msgpack/msgpack": "^3.0.0-beta2",
|
|
80
83
|
"@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
|
|
81
84
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
82
85
|
"commander": "^12.1.0",
|
|
86
|
+
"pako": "^2.1.0",
|
|
83
87
|
"source-map-support": "^0.5.21",
|
|
84
88
|
"tslib": "^2.4.0"
|
|
85
89
|
},
|
|
@@ -1,22 +1,14 @@
|
|
|
1
|
+
import { type PrivateKernelProver, type PrivateKernelSimulateOutput } from '@aztec/circuit-types';
|
|
2
|
+
import { type CircuitWitnessGenerationStats } from '@aztec/circuit-types/stats';
|
|
1
3
|
import {
|
|
2
|
-
type
|
|
3
|
-
type PrivateKernelProver,
|
|
4
|
-
type PrivateKernelSimulateOutput,
|
|
5
|
-
} from '@aztec/circuit-types';
|
|
6
|
-
import { type CircuitSimulationStats, type CircuitWitnessGenerationStats } from '@aztec/circuit-types/stats';
|
|
7
|
-
import {
|
|
8
|
-
AGGREGATION_OBJECT_LENGTH,
|
|
9
|
-
ClientIvcProof,
|
|
10
|
-
Fr,
|
|
4
|
+
type ClientIvcProof,
|
|
11
5
|
type PrivateKernelCircuitPublicInputs,
|
|
12
6
|
type PrivateKernelInitCircuitPrivateInputs,
|
|
13
7
|
type PrivateKernelInnerCircuitPrivateInputs,
|
|
14
8
|
type PrivateKernelResetCircuitPrivateInputs,
|
|
15
9
|
type PrivateKernelTailCircuitPrivateInputs,
|
|
16
10
|
type PrivateKernelTailCircuitPublicInputs,
|
|
17
|
-
Proof,
|
|
18
|
-
RecursiveProof,
|
|
19
|
-
type VerificationKeyAsFields,
|
|
11
|
+
type Proof,
|
|
20
12
|
type VerificationKeyData,
|
|
21
13
|
} from '@aztec/circuits.js';
|
|
22
14
|
import { runInDirectory } from '@aztec/foundation/fs';
|
|
@@ -48,19 +40,12 @@ import { type WitnessMap } from '@noir-lang/types';
|
|
|
48
40
|
import { promises as fs } from 'fs';
|
|
49
41
|
import path from 'path';
|
|
50
42
|
|
|
51
|
-
import {
|
|
52
|
-
BB_RESULT,
|
|
53
|
-
PROOF_FIELDS_FILENAME,
|
|
54
|
-
PROOF_FILENAME,
|
|
55
|
-
computeGateCountForCircuit,
|
|
56
|
-
computeVerificationKey,
|
|
57
|
-
executeBbClientIvcProof,
|
|
58
|
-
verifyProof,
|
|
59
|
-
} from '../bb/execute.js';
|
|
43
|
+
import { BB_RESULT, computeGateCountForCircuit, executeBbClientIvcProof, verifyProof } from '../bb/execute.js';
|
|
60
44
|
import { type BBConfig } from '../config.js';
|
|
61
45
|
import { type UltraHonkFlavor, getUltraHonkFlavorForCircuit } from '../honk.js';
|
|
62
46
|
import { mapProtocolArtifactNameToCircuitName } from '../stats.js';
|
|
63
47
|
import { extractVkData } from '../verification_key/verification_key_data.js';
|
|
48
|
+
import { readFromOutputDirectory } from './client_ivc_proof_utils.js';
|
|
64
49
|
|
|
65
50
|
/**
|
|
66
51
|
* This proof creator implementation uses the native bb binary.
|
|
@@ -112,7 +97,7 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver {
|
|
|
112
97
|
throw new Error(provingResult.reason);
|
|
113
98
|
}
|
|
114
99
|
|
|
115
|
-
const proof = await
|
|
100
|
+
const proof = await readFromOutputDirectory(directory);
|
|
116
101
|
|
|
117
102
|
this.log.info(`Generated IVC proof`, {
|
|
118
103
|
duration: provingResult.durationMs,
|
|
@@ -184,22 +169,6 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver {
|
|
|
184
169
|
);
|
|
185
170
|
}
|
|
186
171
|
|
|
187
|
-
public async computeAppCircuitVerificationKey(
|
|
188
|
-
bytecode: Buffer,
|
|
189
|
-
appCircuitName?: string,
|
|
190
|
-
): Promise<AppCircuitSimulateOutput> {
|
|
191
|
-
const operation = async (directory: string) => {
|
|
192
|
-
this.log.debug(`Proving app circuit`);
|
|
193
|
-
// App circuits are always recursive; the #[recursive] attribute used to be applied automatically
|
|
194
|
-
// by the `private` comptime macro in noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr
|
|
195
|
-
// Yet, inside `computeVerificationKey` the `mega_honk` flavor is used, which doesn't use the recursive flag.
|
|
196
|
-
const recursive = true;
|
|
197
|
-
return await this.computeVerificationKey(directory, bytecode, recursive, 'App', appCircuitName);
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
return await this.runInDirectory(operation);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
172
|
/**
|
|
204
173
|
* Verifies a proof, will generate the verification key if one is not cached internally
|
|
205
174
|
* @param circuitType - The type of circuit whose proof is to be verified
|
|
@@ -313,99 +282,6 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver {
|
|
|
313
282
|
return kernelOutput;
|
|
314
283
|
}
|
|
315
284
|
|
|
316
|
-
private async computeVerificationKey(
|
|
317
|
-
directory: string,
|
|
318
|
-
bytecode: Buffer,
|
|
319
|
-
recursive: boolean,
|
|
320
|
-
circuitType: ClientProtocolArtifact | 'App',
|
|
321
|
-
appCircuitName?: string,
|
|
322
|
-
): Promise<{
|
|
323
|
-
verificationKey: VerificationKeyAsFields;
|
|
324
|
-
}> {
|
|
325
|
-
const dbgCircuitName = appCircuitName ? `(${appCircuitName})` : '';
|
|
326
|
-
this.log.info(`Computing VK of ${circuitType}${dbgCircuitName} circuit...`);
|
|
327
|
-
|
|
328
|
-
const timer = new Timer();
|
|
329
|
-
|
|
330
|
-
const vkResult = await computeVerificationKey(
|
|
331
|
-
this.bbBinaryPath,
|
|
332
|
-
directory,
|
|
333
|
-
circuitType,
|
|
334
|
-
bytecode,
|
|
335
|
-
recursive,
|
|
336
|
-
circuitType === 'App' ? 'mega_honk' : getUltraHonkFlavorForCircuit(circuitType),
|
|
337
|
-
this.log.debug,
|
|
338
|
-
);
|
|
339
|
-
|
|
340
|
-
if (vkResult.status === BB_RESULT.FAILURE) {
|
|
341
|
-
this.log.error(`Failed to generate verification key for ${circuitType}${dbgCircuitName}: ${vkResult.reason}`);
|
|
342
|
-
throw new Error(vkResult.reason);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
this.log.info(`Generated ${circuitType}${dbgCircuitName} VK in ${Math.ceil(timer.ms())} ms`);
|
|
346
|
-
|
|
347
|
-
if (circuitType === 'App') {
|
|
348
|
-
const vkData = await extractVkData(directory);
|
|
349
|
-
|
|
350
|
-
this.log.debug(`Computed verification key`, {
|
|
351
|
-
circuitName: 'app-circuit',
|
|
352
|
-
duration: vkResult.durationMs,
|
|
353
|
-
eventName: 'circuit-simulation',
|
|
354
|
-
inputSize: bytecode.length,
|
|
355
|
-
outputSize: vkData.keyAsBytes.length,
|
|
356
|
-
circuitSize: vkData.circuitSize,
|
|
357
|
-
numPublicInputs: vkData.numPublicInputs,
|
|
358
|
-
} as CircuitSimulationStats);
|
|
359
|
-
|
|
360
|
-
return { verificationKey: vkData.keyAsFields };
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
const vkData = await this.updateVerificationKeyAfterSimulation(directory, circuitType);
|
|
364
|
-
|
|
365
|
-
this.log.debug(`Computed verification key`, {
|
|
366
|
-
circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
|
|
367
|
-
duration: vkResult.durationMs,
|
|
368
|
-
eventName: 'circuit-simulation',
|
|
369
|
-
inputSize: bytecode.length,
|
|
370
|
-
outputSize: vkData.keyAsBytes.length,
|
|
371
|
-
circuitSize: vkData.circuitSize,
|
|
372
|
-
numPublicInputs: vkData.numPublicInputs,
|
|
373
|
-
} as CircuitSimulationStats);
|
|
374
|
-
|
|
375
|
-
return { verificationKey: vkData.keyAsFields };
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
/**
|
|
379
|
-
* Parses and returns the proof data stored at the specified directory
|
|
380
|
-
* @param filePath - The directory containing the proof data
|
|
381
|
-
* @param circuitType - The type of circuit proven
|
|
382
|
-
* @returns The proof
|
|
383
|
-
*/
|
|
384
|
-
private async readProofAsFields<PROOF_LENGTH extends number>(
|
|
385
|
-
filePath: string,
|
|
386
|
-
circuitType: ClientProtocolArtifact | 'App',
|
|
387
|
-
vkData: VerificationKeyData,
|
|
388
|
-
): Promise<RecursiveProof<PROOF_LENGTH>> {
|
|
389
|
-
const [binaryProof, proofString] = await Promise.all([
|
|
390
|
-
fs.readFile(`${filePath}/${PROOF_FILENAME}`),
|
|
391
|
-
fs.readFile(`${filePath}/${PROOF_FIELDS_FILENAME}`, { encoding: 'utf-8' }),
|
|
392
|
-
]);
|
|
393
|
-
const json = JSON.parse(proofString);
|
|
394
|
-
const fields = json.map(Fr.fromHexString);
|
|
395
|
-
const numPublicInputs = vkData.numPublicInputs - AGGREGATION_OBJECT_LENGTH;
|
|
396
|
-
const fieldsWithoutPublicInputs = fields.slice(numPublicInputs);
|
|
397
|
-
this.log.info(
|
|
398
|
-
`Circuit type: ${circuitType}, complete proof length: ${fields.length}, without public inputs: ${fieldsWithoutPublicInputs.length}, num public inputs: ${numPublicInputs}, circuit size: ${vkData.circuitSize}, is recursive: ${vkData.isRecursive}, raw length: ${binaryProof.length}`,
|
|
399
|
-
);
|
|
400
|
-
const proof = new RecursiveProof<PROOF_LENGTH>(
|
|
401
|
-
fieldsWithoutPublicInputs,
|
|
402
|
-
new Proof(binaryProof, vkData.numPublicInputs),
|
|
403
|
-
true,
|
|
404
|
-
fieldsWithoutPublicInputs.length,
|
|
405
|
-
);
|
|
406
|
-
return proof;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
285
|
private runInDirectory<T>(fn: (dir: string) => Promise<T>) {
|
|
410
286
|
const log = this.log;
|
|
411
287
|
return runInDirectory(
|
package/src/prover/bb_prover.ts
CHANGED
|
@@ -99,6 +99,7 @@ import { type UltraHonkFlavor, getUltraHonkFlavorForCircuit } from '../honk.js';
|
|
|
99
99
|
import { ProverInstrumentation } from '../instrumentation.js';
|
|
100
100
|
import { mapProtocolArtifactNameToCircuitName } from '../stats.js';
|
|
101
101
|
import { extractAvmVkData, extractVkData } from '../verification_key/verification_key_data.js';
|
|
102
|
+
import { writeToOutputDirectory } from './client_ivc_proof_utils.js';
|
|
102
103
|
|
|
103
104
|
const logger = createLogger('bb-prover');
|
|
104
105
|
|
|
@@ -551,7 +552,7 @@ export class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
551
552
|
const hasher = crypto.createHash('sha256');
|
|
552
553
|
hasher.update(input.toBuffer());
|
|
553
554
|
|
|
554
|
-
await input.clientIVCData
|
|
555
|
+
await writeToOutputDirectory(input.clientIVCData, bbWorkingDirectory);
|
|
555
556
|
const provingResult = await generateTubeProof(this.config.bbBinaryPath, bbWorkingDirectory, logger.verbose);
|
|
556
557
|
|
|
557
558
|
if (provingResult.status === BB_RESULT.FAILURE) {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ClientIvcProof } from '@aztec/circuits.js';
|
|
2
|
+
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* TODO(#7371): eventually remove client_ivc_prove_output_all_msgpack and properly handle these accumulators and VKs
|
|
8
|
+
* Create a ClientIvcProof from the result of client_ivc_prove_output_all or client_ivc_prove_output_all_msgpack
|
|
9
|
+
* @param directory the directory of results
|
|
10
|
+
* @returns the encapsulated client ivc proof
|
|
11
|
+
*/
|
|
12
|
+
export async function readFromOutputDirectory(directory: string) {
|
|
13
|
+
const [clientIvcVkBuffer, clientIvcProofBuffer] = await Promise.all(
|
|
14
|
+
['client_ivc_vk', 'client_ivc_proof'].map(fileName => fs.readFile(join(directory, fileName))),
|
|
15
|
+
);
|
|
16
|
+
return new ClientIvcProof(clientIvcProofBuffer, clientIvcVkBuffer);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* TODO(#7371): eventually remove client_ivc_prove_output_all_msgpack and properly handle these accumulators and VKs
|
|
21
|
+
* Serialize a ClientIvcProof to the files expected by prove_tube
|
|
22
|
+
*
|
|
23
|
+
* Example usage:
|
|
24
|
+
* await runInDirectory(bbWorkingDirectory, async (dir: string) => {
|
|
25
|
+
* await privateTx.clientIvcProof!.writeToOutputDirectory(bbWorkingDirectory);
|
|
26
|
+
* const result = await generateTubeProof(bbPath, dir, logger.info)
|
|
27
|
+
* expect(result.status).toBe(BB_RESULT.SUCCESS)
|
|
28
|
+
* });
|
|
29
|
+
* @param proof the ClientIvcProof from readFromOutputDirectory
|
|
30
|
+
* @param directory the directory of results
|
|
31
|
+
*/
|
|
32
|
+
export async function writeToOutputDirectory(clientIvcProof: ClientIvcProof, directory: string) {
|
|
33
|
+
const { clientIvcProofBuffer, clientIvcVkBuffer } = clientIvcProof;
|
|
34
|
+
const fileData = [
|
|
35
|
+
['client_ivc_proof', clientIvcProofBuffer],
|
|
36
|
+
['client_ivc_vk', clientIvcVkBuffer],
|
|
37
|
+
] as const;
|
|
38
|
+
await Promise.all(fileData.map(([fileName, buffer]) => fs.writeFile(join(directory, fileName), buffer)));
|
|
39
|
+
}
|
package/src/prover/index.ts
CHANGED
|
@@ -46,8 +46,6 @@ import {
|
|
|
46
46
|
convertBaseParityOutputsFromWitnessMap,
|
|
47
47
|
convertBlockMergeRollupInputsToWitnessMap,
|
|
48
48
|
convertBlockMergeRollupOutputsFromWitnessMap,
|
|
49
|
-
convertBlockRootRollupInputsToWitnessMap,
|
|
50
|
-
convertBlockRootRollupOutputsFromWitnessMap,
|
|
51
49
|
convertEmptyBlockRootRollupInputsToWitnessMap,
|
|
52
50
|
convertEmptyBlockRootRollupOutputsFromWitnessMap,
|
|
53
51
|
convertMergeRollupInputsToWitnessMap,
|
|
@@ -57,6 +55,8 @@ import {
|
|
|
57
55
|
convertRootParityOutputsFromWitnessMap,
|
|
58
56
|
convertRootRollupInputsToWitnessMap,
|
|
59
57
|
convertRootRollupOutputsFromWitnessMap,
|
|
58
|
+
convertSimulatedBlockRootRollupInputsToWitnessMap,
|
|
59
|
+
convertSimulatedBlockRootRollupOutputsFromWitnessMap,
|
|
60
60
|
convertSimulatedPrivateBaseRollupInputsToWitnessMap,
|
|
61
61
|
convertSimulatedPrivateBaseRollupOutputsFromWitnessMap,
|
|
62
62
|
convertSimulatedPrivateKernelEmptyOutputsFromWitnessMap,
|
|
@@ -215,8 +215,8 @@ export class TestCircuitProver implements ServerCircuitProver {
|
|
|
215
215
|
input,
|
|
216
216
|
'BlockRootRollupArtifact',
|
|
217
217
|
NESTED_RECURSIVE_PROOF_LENGTH,
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
convertSimulatedBlockRootRollupInputsToWitnessMap,
|
|
219
|
+
convertSimulatedBlockRootRollupOutputsFromWitnessMap,
|
|
220
220
|
);
|
|
221
221
|
}
|
|
222
222
|
|
|
@@ -313,7 +313,12 @@ export class TestCircuitProver implements ServerCircuitProver {
|
|
|
313
313
|
const witnessMap = convertInput(input);
|
|
314
314
|
const circuitName = mapProtocolArtifactNameToCircuitName(artifactName);
|
|
315
315
|
|
|
316
|
-
|
|
316
|
+
let simulationProvider = this.simulationProvider ?? this.wasmSimulator;
|
|
317
|
+
if (artifactName == 'BlockRootRollupArtifact') {
|
|
318
|
+
// TODO(#10323): temporarily force block root to use wasm while we simulate
|
|
319
|
+
// the blob operations with an oracle. Appears to be no way to provide nativeACVM with a foreign call hander.
|
|
320
|
+
simulationProvider = this.wasmSimulator;
|
|
321
|
+
}
|
|
317
322
|
const witness = await simulationProvider.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts[artifactName]);
|
|
318
323
|
|
|
319
324
|
const result = convertOutput(witness);
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
} from '../bb/execute.js';
|
|
24
24
|
import { type BBConfig } from '../config.js';
|
|
25
25
|
import { type UltraKeccakHonkProtocolArtifact, getUltraHonkFlavorForCircuit } from '../honk.js';
|
|
26
|
+
import { writeToOutputDirectory } from '../prover/client_ivc_proof_utils.js';
|
|
26
27
|
import { isProtocolArtifactRecursive, mapProtocolArtifactNameToCircuitName } from '../stats.js';
|
|
27
28
|
import { extractVkData } from '../verification_key/verification_key_data.js';
|
|
28
29
|
|
|
@@ -162,7 +163,7 @@ export class BBCircuitVerifier implements ClientProtocolCircuitVerifier {
|
|
|
162
163
|
this.logger.debug(`${circuit} BB out - ${message}`);
|
|
163
164
|
};
|
|
164
165
|
|
|
165
|
-
await tx.clientIvcProof
|
|
166
|
+
await writeToOutputDirectory(tx.clientIvcProof, bbWorkingDirectory);
|
|
166
167
|
const result = await verifyClientIvcProof(this.config.bbBinaryPath, bbWorkingDirectory, logFunction);
|
|
167
168
|
|
|
168
169
|
if (result.status === BB_RESULT.FAILURE) {
|