@aztec/bb-prover 0.69.1 → 0.70.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/bb/cli.d.ts +3 -0
- package/dest/bb/cli.d.ts.map +1 -1
- package/dest/bb/cli.js +7 -2
- package/dest/bb/execute.d.ts +14 -3
- package/dest/bb/execute.d.ts.map +1 -1
- package/dest/bb/execute.js +108 -10
- package/dest/honk.d.ts +8 -8
- package/dest/honk.d.ts.map +1 -1
- package/dest/honk.js +2 -7
- package/dest/prover/bb_native_private_kernel_prover.d.ts +25 -0
- package/dest/prover/bb_native_private_kernel_prover.d.ts.map +1 -0
- package/dest/prover/bb_native_private_kernel_prover.js +69 -0
- package/dest/prover/bb_private_kernel_prover.d.ts +26 -41
- package/dest/prover/bb_private_kernel_prover.d.ts.map +1 -1
- package/dest/prover/bb_private_kernel_prover.js +62 -118
- package/dest/prover/bb_prover.d.ts +4 -6
- package/dest/prover/bb_prover.d.ts.map +1 -1
- package/dest/prover/bb_prover.js +13 -34
- package/dest/prover/index.d.ts +1 -1
- package/dest/prover/index.d.ts.map +1 -1
- package/dest/prover/index.js +2 -2
- package/dest/stats.d.ts +3 -3
- package/dest/stats.d.ts.map +1 -1
- package/dest/stats.js +4 -7
- package/dest/test/test_avm.d.ts +1 -1
- package/dest/test/test_avm.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.d.ts +5 -5
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +13 -11
- package/dest/verifier/bb_verifier.d.ts +6 -6
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +5 -8
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts +16 -0
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts.map +1 -0
- package/dest/wasm/bb_wasm_private_kernel_prover.js +31 -0
- package/dest/wasm/bundle.d.ts +6 -0
- package/dest/wasm/bundle.d.ts.map +1 -0
- package/dest/wasm/bundle.js +9 -0
- package/dest/wasm/lazy.d.ts +6 -0
- package/dest/wasm/lazy.d.ts.map +1 -0
- package/dest/wasm/lazy.js +9 -0
- package/package.json +11 -10
- package/src/bb/cli.ts +9 -1
- package/src/bb/execute.ts +134 -11
- package/src/honk.ts +16 -21
- package/src/prover/bb_native_private_kernel_prover.ts +118 -0
- package/src/prover/bb_private_kernel_prover.ts +141 -202
- package/src/prover/bb_prover.ts +29 -77
- package/src/prover/index.ts +1 -1
- package/src/stats.ts +6 -11
- package/src/test/test_avm.ts +1 -1
- package/src/test/test_circuit_prover.ts +26 -41
- package/src/verifier/bb_verifier.ts +12 -15
- package/src/wasm/bb_wasm_private_kernel_prover.ts +42 -0
- package/src/wasm/bundle.ts +11 -0
- package/src/wasm/lazy.ts +11 -0
- package/dest/wasm/index.d.ts +0 -19
- package/dest/wasm/index.d.ts.map +0 -1
- package/dest/wasm/index.js +0 -74
- package/src/wasm/index.ts +0 -155
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Tx } from '@aztec/circuit-types';
|
|
2
2
|
import { runInDirectory } from '@aztec/foundation/fs';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
-
import {
|
|
4
|
+
import { ServerCircuitArtifacts } from '@aztec/noir-protocol-circuits-types/server';
|
|
5
5
|
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';
|
|
@@ -25,7 +25,7 @@ export class BBCircuitVerifier {
|
|
|
25
25
|
return new BBCircuitVerifier(config, keys, logger);
|
|
26
26
|
}
|
|
27
27
|
static async generateVerificationKey(circuit, bbPath, workingDirectory, logFn) {
|
|
28
|
-
return await generateKeyForNoirCircuit(bbPath, workingDirectory, circuit,
|
|
28
|
+
return await generateKeyForNoirCircuit(bbPath, workingDirectory, circuit, ServerCircuitArtifacts[circuit], isProtocolArtifactRecursive(circuit), getUltraHonkFlavorForCircuit(circuit), logFn).then(result => {
|
|
29
29
|
if (result.status === BB_RESULT.FAILURE) {
|
|
30
30
|
throw new Error(`Failed to created verification key for ${circuit}, ${result.reason}`);
|
|
31
31
|
}
|
|
@@ -49,10 +49,7 @@ export class BBCircuitVerifier {
|
|
|
49
49
|
this.logger.debug(`${circuit} Verifying with key: ${verificationKey.keyAsFields.hash.toString()}`);
|
|
50
50
|
await fs.writeFile(proofFileName, proof.buffer);
|
|
51
51
|
await fs.writeFile(verificationKeyPath, verificationKey.keyAsBytes);
|
|
52
|
-
const
|
|
53
|
-
this.logger.debug(`${circuit} BB out - ${message}`);
|
|
54
|
-
};
|
|
55
|
-
const result = await verifyProof(this.config.bbBinaryPath, proofFileName, verificationKeyPath, getUltraHonkFlavorForCircuit(circuit), logFunction);
|
|
52
|
+
const result = await verifyProof(this.config.bbBinaryPath, proofFileName, verificationKeyPath, getUltraHonkFlavorForCircuit(circuit), this.logger);
|
|
56
53
|
if (result.status === BB_RESULT.FAILURE) {
|
|
57
54
|
const errorMessage = `Failed to verify ${circuit} proof!`;
|
|
58
55
|
throw new Error(errorMessage);
|
|
@@ -67,7 +64,7 @@ export class BBCircuitVerifier {
|
|
|
67
64
|
await runInDirectory(this.config.bbWorkingDirectory, operation, this.config.bbSkipCleanup);
|
|
68
65
|
}
|
|
69
66
|
async generateSolidityContract(circuit, contractName) {
|
|
70
|
-
const result = await generateContractForCircuit(this.config.bbBinaryPath, this.config.bbWorkingDirectory, circuit,
|
|
67
|
+
const result = await generateContractForCircuit(this.config.bbBinaryPath, this.config.bbWorkingDirectory, circuit, ServerCircuitArtifacts[circuit], contractName, this.logger.debug);
|
|
71
68
|
if (result.status === BB_RESULT.FAILURE) {
|
|
72
69
|
throw new Error(`Failed to create verifier contract for ${circuit}, ${result.reason}`);
|
|
73
70
|
}
|
|
@@ -110,4 +107,4 @@ export class BBCircuitVerifier {
|
|
|
110
107
|
}
|
|
111
108
|
}
|
|
112
109
|
}
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfdmVyaWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVyaWZpZXIvYmJfdmVyaWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQyxFQUFFLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUc5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUEyQixZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQU9wRixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxXQUFXLEVBQ1gsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIsV0FBVyxHQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUE4Qyw0QkFBNEIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRTdFLE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFDVSxNQUFnQixFQUNoQixtQkFBbUIsSUFBSSxHQUFHLEVBQWtELEVBQzVFLE1BQWM7UUFGZCxXQUFNLEdBQU4sTUFBTSxDQUFVO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBNEQ7UUFDNUUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUNyQixDQUFDO0lBRUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ3JCLE1BQWdC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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { ClientIvcProof } from '@aztec/circuits.js';
|
|
4
|
+
import { type ArtifactProvider } from '@aztec/noir-protocol-circuits-types/types';
|
|
5
|
+
import { type SimulationProvider } from '@aztec/simulator/client';
|
|
6
|
+
import { type WitnessMap } from '@noir-lang/types';
|
|
7
|
+
import { BBPrivateKernelProver } from '../prover/bb_private_kernel_prover.js';
|
|
8
|
+
export declare abstract class BBWASMPrivateKernelProver extends BBPrivateKernelProver {
|
|
9
|
+
protected artifactProvider: ArtifactProvider;
|
|
10
|
+
protected simulationProvider: SimulationProvider;
|
|
11
|
+
private threads;
|
|
12
|
+
protected log: import("@aztec/foundation/log").Logger;
|
|
13
|
+
constructor(artifactProvider: ArtifactProvider, simulationProvider: SimulationProvider, threads?: number, log?: import("@aztec/foundation/log").Logger);
|
|
14
|
+
createClientIvcProof(acirs: Buffer[], witnessStack: WitnessMap[]): Promise<ClientIvcProof>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=bb_wasm_private_kernel_prover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bb_wasm_private_kernel_prover.d.ts","sourceRoot":"","sources":["../../src/wasm/bb_wasm_private_kernel_prover.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,8BAAsB,yBAA0B,SAAQ,qBAAqB;cAEtD,gBAAgB,EAAE,gBAAgB;cAClC,kBAAkB,EAAE,kBAAkB;IACzD,OAAO,CAAC,OAAO;cACI,GAAG;gBAHH,gBAAgB,EAAE,gBAAgB,EAClC,kBAAkB,EAAE,kBAAkB,EACjD,OAAO,GAAE,MAAU,EACR,GAAG,yCAAiC;IAKnC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;CAkBjH"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 { serializeWitness } from '@noir-lang/noirc_abi';
|
|
6
|
+
import { ungzip } from 'pako';
|
|
7
|
+
import { BBPrivateKernelProver } from '../prover/bb_private_kernel_prover.js';
|
|
8
|
+
export class BBWASMPrivateKernelProver extends BBPrivateKernelProver {
|
|
9
|
+
constructor(artifactProvider, simulationProvider, threads = 1, log = createLogger('bb-prover:wasm')) {
|
|
10
|
+
super(artifactProvider, simulationProvider, log);
|
|
11
|
+
this.artifactProvider = artifactProvider;
|
|
12
|
+
this.simulationProvider = simulationProvider;
|
|
13
|
+
this.threads = threads;
|
|
14
|
+
this.log = log;
|
|
15
|
+
}
|
|
16
|
+
async createClientIvcProof(acirs, witnessStack) {
|
|
17
|
+
const timer = new Timer();
|
|
18
|
+
this.log.info(`Generating ClientIVC proof...`);
|
|
19
|
+
const backend = new AztecClientBackend(acirs.map(acir => ungzip(acir)), { threads: this.threads });
|
|
20
|
+
const [proof, vk] = await backend.prove(witnessStack.map(witnessMap => ungzip(serializeWitness(witnessMap))));
|
|
21
|
+
await backend.destroy();
|
|
22
|
+
this.log.info(`Generated ClientIVC proof`, {
|
|
23
|
+
eventName: 'client-ivc-proof-generation',
|
|
24
|
+
duration: timer.ms(),
|
|
25
|
+
proofSize: proof.length,
|
|
26
|
+
vkSize: vk.length,
|
|
27
|
+
});
|
|
28
|
+
return new ClientIvcProof(Buffer.from(proof), Buffer.from(vk));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfd2FzbV9wcml2YXRlX2tlcm5lbF9wcm92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FzbS9iYl93YXNtX3ByaXZhdGVfa2VybmVsX3Byb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUU5RSxNQUFNLE9BQWdCLHlCQUEwQixTQUFRLHFCQUFxQjtJQUMzRSxZQUNxQixnQkFBa0MsRUFDbEMsa0JBQXNDLEVBQ2pELFVBQWtCLENBQUMsRUFDUixNQUFNLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztRQUV2RCxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFMOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ2pELFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDUixRQUFHLEdBQUgsR0FBRyxDQUFpQztJQUd6RCxDQUFDO0lBRWUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQWUsRUFBRSxZQUEwQjtRQUNwRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxrQkFBa0IsQ0FDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUMvQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQzFCLENBQUM7UUFFRixNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlHLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ3pDLFNBQVMsRUFBRSw2QkFBNkI7WUFDeEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDcEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3ZCLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtTQUNsQixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SimulationProvider } from '@aztec/simulator/client';
|
|
2
|
+
import { BBWASMPrivateKernelProver } from './bb_wasm_private_kernel_prover.js';
|
|
3
|
+
export declare class BBWASMBundlePrivateKernelProver extends BBWASMPrivateKernelProver {
|
|
4
|
+
constructor(simulationProvider: SimulationProvider, threads?: number, log?: import("@aztec/foundation/log").Logger);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/wasm/bundle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,qBAAa,+BAAgC,SAAQ,yBAAyB;gBAChE,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,SAAI,EAAE,GAAG,yCAAwC;CAG7G"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { BundleArtifactProvider } from '@aztec/noir-protocol-circuits-types/client/bundle';
|
|
3
|
+
import { BBWASMPrivateKernelProver } from './bb_wasm_private_kernel_prover.js';
|
|
4
|
+
export class BBWASMBundlePrivateKernelProver extends BBWASMPrivateKernelProver {
|
|
5
|
+
constructor(simulationProvider, threads = 1, log = createLogger('bb-prover:wasm:bundle')) {
|
|
6
|
+
super(new BundleArtifactProvider(), simulationProvider, threads, log);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhc20vYnVuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUczRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUUvRSxNQUFNLE9BQU8sK0JBQWdDLFNBQVEseUJBQXlCO0lBQzVFLFlBQVksa0JBQXNDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDO1FBQzFHLEtBQUssQ0FBQyxJQUFJLHNCQUFzQixFQUFFLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SimulationProvider } from '@aztec/simulator/client';
|
|
2
|
+
import { BBWASMPrivateKernelProver } from './bb_wasm_private_kernel_prover.js';
|
|
3
|
+
export declare class BBWASMLazyPrivateKernelProver extends BBWASMPrivateKernelProver {
|
|
4
|
+
constructor(simulationProvider: SimulationProvider, threads?: number, log?: import("@aztec/foundation/log").Logger);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=lazy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/wasm/lazy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,qBAAa,6BAA8B,SAAQ,yBAAyB;gBAC9D,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,SAAI,EAAE,GAAG,yCAAsC;CAG3G"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { LazyArtifactProvider } from '@aztec/noir-protocol-circuits-types/client/lazy';
|
|
3
|
+
import { BBWASMPrivateKernelProver } from './bb_wasm_private_kernel_prover.js';
|
|
4
|
+
export class BBWASMLazyPrivateKernelProver extends BBWASMPrivateKernelProver {
|
|
5
|
+
constructor(simulationProvider, threads = 1, log = createLogger('bb-prover:wasm:lazy')) {
|
|
6
|
+
super(new LazyArtifactProvider(), simulationProvider, threads, log);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93YXNtL2xhenkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBR3ZGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRS9FLE1BQU0sT0FBTyw2QkFBOEIsU0FBUSx5QkFBeUI7SUFDMUUsWUFBWSxrQkFBc0MsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUM7UUFDeEcsS0FBSyxDQUFDLElBQUksb0JBQW9CLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQztDQUNGIn0=
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/bb-prover",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.70.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
|
-
"./wasm": "./dest/wasm/
|
|
7
|
+
"./wasm/bundle": "./dest/wasm/bundle.js",
|
|
8
|
+
"./wasm/lazy": "./dest/wasm/lazy.js",
|
|
8
9
|
"./prover": "./dest/prover/index.js",
|
|
9
10
|
"./verifier": "./dest/verifier/index.js",
|
|
10
11
|
"./test": "./dest/test/index.js",
|
|
@@ -66,14 +67,14 @@
|
|
|
66
67
|
]
|
|
67
68
|
},
|
|
68
69
|
"dependencies": {
|
|
69
|
-
"@aztec/bb.js": "0.
|
|
70
|
-
"@aztec/circuit-types": "0.
|
|
71
|
-
"@aztec/circuits.js": "0.
|
|
72
|
-
"@aztec/foundation": "0.
|
|
73
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
74
|
-
"@aztec/simulator": "0.
|
|
75
|
-
"@aztec/telemetry-client": "0.
|
|
76
|
-
"@aztec/world-state": "0.
|
|
70
|
+
"@aztec/bb.js": "0.70.0",
|
|
71
|
+
"@aztec/circuit-types": "0.70.0",
|
|
72
|
+
"@aztec/circuits.js": "0.70.0",
|
|
73
|
+
"@aztec/foundation": "0.70.0",
|
|
74
|
+
"@aztec/noir-protocol-circuits-types": "0.70.0",
|
|
75
|
+
"@aztec/simulator": "0.70.0",
|
|
76
|
+
"@aztec/telemetry-client": "0.70.0",
|
|
77
|
+
"@aztec/world-state": "0.70.0",
|
|
77
78
|
"@msgpack/msgpack": "^3.0.0-beta2",
|
|
78
79
|
"@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
|
|
79
80
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
package/src/bb/cli.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { type LogFn } from '@aztec/foundation/log';
|
|
2
|
-
import {
|
|
2
|
+
import { ClientCircuitArtifacts } from '@aztec/noir-protocol-circuits-types/client/bundle';
|
|
3
|
+
import { ServerCircuitArtifacts } from '@aztec/noir-protocol-circuits-types/server';
|
|
4
|
+
import { type ProtocolArtifact } from '@aztec/noir-protocol-circuits-types/types';
|
|
5
|
+
import { type NoirCompiledCircuit } from '@aztec/types/noir';
|
|
3
6
|
|
|
4
7
|
import { Command } from 'commander';
|
|
5
8
|
import { promises as fs } from 'fs';
|
|
@@ -8,6 +11,11 @@ import { generateContractForCircuit, generateKeyForNoirCircuit } from './execute
|
|
|
8
11
|
|
|
9
12
|
const { BB_WORKING_DIRECTORY, BB_BINARY_PATH } = process.env;
|
|
10
13
|
|
|
14
|
+
export const ProtocolCircuitArtifacts: Record<ProtocolArtifact, NoirCompiledCircuit> = {
|
|
15
|
+
...ClientCircuitArtifacts,
|
|
16
|
+
...ServerCircuitArtifacts,
|
|
17
|
+
};
|
|
18
|
+
|
|
11
19
|
/**
|
|
12
20
|
* Returns commander program that defines the CLI.
|
|
13
21
|
* @param log - Console logger.
|
package/src/bb/execute.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AvmCircuitInputs } from '@aztec/circuits.js';
|
|
1
|
+
import { type AvmCircuitInputs, serializeWithMessagePack } from '@aztec/circuits.js';
|
|
2
2
|
import { sha256 } from '@aztec/foundation/crypto';
|
|
3
3
|
import { type LogFn, type Logger } from '@aztec/foundation/log';
|
|
4
4
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -75,7 +75,7 @@ export function executeBB(
|
|
|
75
75
|
// spawn the bb process
|
|
76
76
|
const { HARDWARE_CONCURRENCY: _, ...envWithoutConcurrency } = process.env;
|
|
77
77
|
const env = process.env.HARDWARE_CONCURRENCY ? process.env : envWithoutConcurrency;
|
|
78
|
-
logger(`Executing BB with: ${command} ${args.join(' ')}`);
|
|
78
|
+
logger(`Executing BB with: ${pathToBB} ${command} ${args.join(' ')}`);
|
|
79
79
|
const bb = proc.spawn(pathToBB, [command, ...args], {
|
|
80
80
|
env,
|
|
81
81
|
});
|
|
@@ -497,6 +497,86 @@ export async function generateTubeProof(
|
|
|
497
497
|
* It is assumed that the working directory is a temporary and/or random directory used solely for generating this proof.
|
|
498
498
|
* @param pathToBB - The full path to the bb binary
|
|
499
499
|
* @param workingDirectory - A working directory for use by bb
|
|
500
|
+
* @param input - The inputs for the public function to be proven
|
|
501
|
+
* @param log - A logging function
|
|
502
|
+
* @returns An object containing a result indication, the location of the proof and the duration taken
|
|
503
|
+
*/
|
|
504
|
+
export async function generateAvmProofV2(
|
|
505
|
+
pathToBB: string,
|
|
506
|
+
workingDirectory: string,
|
|
507
|
+
input: AvmCircuitInputs,
|
|
508
|
+
logger: Logger,
|
|
509
|
+
): Promise<BBFailure | BBSuccess> {
|
|
510
|
+
// Check that the working directory exists
|
|
511
|
+
try {
|
|
512
|
+
await fs.access(workingDirectory);
|
|
513
|
+
} catch (error) {
|
|
514
|
+
return { status: BB_RESULT.FAILURE, reason: `Working directory ${workingDirectory} does not exist` };
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// The proof is written to e.g. /workingDirectory/proof
|
|
518
|
+
const outputPath = workingDirectory;
|
|
519
|
+
|
|
520
|
+
const filePresent = async (file: string) =>
|
|
521
|
+
await fs
|
|
522
|
+
.access(file, fs.constants.R_OK)
|
|
523
|
+
.then(_ => true)
|
|
524
|
+
.catch(_ => false);
|
|
525
|
+
|
|
526
|
+
const binaryPresent = await filePresent(pathToBB);
|
|
527
|
+
if (!binaryPresent) {
|
|
528
|
+
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
const inputsBuffer = input.serializeForAvm2();
|
|
532
|
+
|
|
533
|
+
try {
|
|
534
|
+
// Write the inputs to the working directory.
|
|
535
|
+
const avmInputsPath = join(workingDirectory, 'avm_inputs.bin');
|
|
536
|
+
await fs.writeFile(avmInputsPath, inputsBuffer);
|
|
537
|
+
if (!filePresent(avmInputsPath)) {
|
|
538
|
+
return { status: BB_RESULT.FAILURE, reason: `Could not write avm inputs to ${avmInputsPath}` };
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
const args = [
|
|
542
|
+
'--avm-inputs',
|
|
543
|
+
avmInputsPath,
|
|
544
|
+
'-o',
|
|
545
|
+
outputPath,
|
|
546
|
+
logger.level === 'debug' || logger.level === 'trace' ? '-d' : logger.level === 'verbose' ? '-v' : '',
|
|
547
|
+
];
|
|
548
|
+
const timer = new Timer();
|
|
549
|
+
const logFunction = (message: string) => {
|
|
550
|
+
logger.verbose(`AvmCircuit (prove) BB out - ${message}`);
|
|
551
|
+
};
|
|
552
|
+
const result = await executeBB(pathToBB, 'avm2_prove', args, logFunction);
|
|
553
|
+
const duration = timer.ms();
|
|
554
|
+
|
|
555
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
556
|
+
return {
|
|
557
|
+
status: BB_RESULT.SUCCESS,
|
|
558
|
+
durationMs: duration,
|
|
559
|
+
proofPath: join(outputPath, PROOF_FILENAME),
|
|
560
|
+
pkPath: undefined,
|
|
561
|
+
vkPath: outputPath,
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
565
|
+
return {
|
|
566
|
+
status: BB_RESULT.FAILURE,
|
|
567
|
+
reason: `Failed to generate proof. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
568
|
+
retry: !!result.signal,
|
|
569
|
+
};
|
|
570
|
+
} catch (error) {
|
|
571
|
+
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Used for generating AVM proofs (or doing check-circuit).
|
|
577
|
+
* It is assumed that the working directory is a temporary and/or random directory used solely for generating this proof.
|
|
578
|
+
* @param pathToBB - The full path to the bb binary
|
|
579
|
+
* @param workingDirectory - A working directory for use by bb
|
|
500
580
|
* @param bytecode - The AVM bytecode for the public function to be proven (expected to be decompressed)
|
|
501
581
|
* @param log - A logging function
|
|
502
582
|
* @returns An object containing a result indication, the location of the proof and the duration taken
|
|
@@ -506,6 +586,7 @@ export async function generateAvmProof(
|
|
|
506
586
|
workingDirectory: string,
|
|
507
587
|
input: AvmCircuitInputs,
|
|
508
588
|
logger: Logger,
|
|
589
|
+
checkCircuitOnly: boolean = false,
|
|
509
590
|
): Promise<BBFailure | BBSuccess> {
|
|
510
591
|
// Check that the working directory exists
|
|
511
592
|
try {
|
|
@@ -553,12 +634,14 @@ export async function generateAvmProof(
|
|
|
553
634
|
'-o',
|
|
554
635
|
outputPath,
|
|
555
636
|
logger.level === 'debug' || logger.level === 'trace' ? '-d' : logger.level === 'verbose' ? '-v' : '',
|
|
637
|
+
checkCircuitOnly ? '--check-circuit-only' : '',
|
|
556
638
|
];
|
|
557
639
|
const timer = new Timer();
|
|
640
|
+
const cmd = checkCircuitOnly ? 'check_circuit' : 'prove';
|
|
558
641
|
const logFunction = (message: string) => {
|
|
559
|
-
logger.verbose(`AvmCircuit (
|
|
642
|
+
logger.verbose(`AvmCircuit (${cmd}) BB out - ${message}`);
|
|
560
643
|
};
|
|
561
|
-
const result = await executeBB(pathToBB,
|
|
644
|
+
const result = await executeBB(pathToBB, `avm_${cmd}`, args, logFunction);
|
|
562
645
|
const duration = timer.ms();
|
|
563
646
|
|
|
564
647
|
if (result.status == BB_RESULT.SUCCESS) {
|
|
@@ -594,7 +677,7 @@ export async function verifyProof(
|
|
|
594
677
|
proofFullPath: string,
|
|
595
678
|
verificationKeyPath: string,
|
|
596
679
|
ultraHonkFlavor: UltraHonkFlavor,
|
|
597
|
-
log:
|
|
680
|
+
log: Logger,
|
|
598
681
|
): Promise<BBFailure | BBSuccess> {
|
|
599
682
|
return await verifyProofInternal(pathToBB, proofFullPath, verificationKeyPath, `verify_${ultraHonkFlavor}`, log);
|
|
600
683
|
}
|
|
@@ -611,9 +694,37 @@ export async function verifyAvmProof(
|
|
|
611
694
|
pathToBB: string,
|
|
612
695
|
proofFullPath: string,
|
|
613
696
|
verificationKeyPath: string,
|
|
614
|
-
|
|
697
|
+
logger: Logger,
|
|
615
698
|
): Promise<BBFailure | BBSuccess> {
|
|
616
|
-
return await verifyProofInternal(pathToBB, proofFullPath, verificationKeyPath, 'avm_verify',
|
|
699
|
+
return await verifyProofInternal(pathToBB, proofFullPath, verificationKeyPath, 'avm_verify', logger);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
export async function verifyAvmProofV2(
|
|
703
|
+
pathToBB: string,
|
|
704
|
+
workingDirectory: string,
|
|
705
|
+
proofFullPath: string,
|
|
706
|
+
publicInputs: any,
|
|
707
|
+
verificationKeyPath: string,
|
|
708
|
+
logger: Logger,
|
|
709
|
+
): Promise<BBFailure | BBSuccess> {
|
|
710
|
+
const inputsBuffer = serializeWithMessagePack(publicInputs);
|
|
711
|
+
|
|
712
|
+
// Write the inputs to the working directory.
|
|
713
|
+
const filePresent = async (file: string) =>
|
|
714
|
+
await fs
|
|
715
|
+
.access(file, fs.constants.R_OK)
|
|
716
|
+
.then(_ => true)
|
|
717
|
+
.catch(_ => false);
|
|
718
|
+
const avmInputsPath = join(workingDirectory, 'avm_public_inputs.bin');
|
|
719
|
+
await fs.writeFile(avmInputsPath, inputsBuffer);
|
|
720
|
+
if (!filePresent(avmInputsPath)) {
|
|
721
|
+
return { status: BB_RESULT.FAILURE, reason: `Could not write avm inputs to ${avmInputsPath}` };
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
return await verifyProofInternal(pathToBB, proofFullPath, verificationKeyPath, 'avm2_verify', logger, [
|
|
725
|
+
'--avm-public-inputs',
|
|
726
|
+
avmInputsPath,
|
|
727
|
+
]);
|
|
617
728
|
}
|
|
618
729
|
|
|
619
730
|
/**
|
|
@@ -670,8 +781,9 @@ async function verifyProofInternal(
|
|
|
670
781
|
pathToBB: string,
|
|
671
782
|
proofFullPath: string,
|
|
672
783
|
verificationKeyPath: string,
|
|
673
|
-
command: 'verify_ultra_honk' | 'verify_ultra_rollup_honk' | 'verify_ultra_keccak_honk' | 'avm_verify',
|
|
674
|
-
|
|
784
|
+
command: 'verify_ultra_honk' | 'verify_ultra_rollup_honk' | 'verify_ultra_keccak_honk' | 'avm_verify' | 'avm2_verify',
|
|
785
|
+
logger: Logger,
|
|
786
|
+
extraArgs: string[] = [],
|
|
675
787
|
): Promise<BBFailure | BBSuccess> {
|
|
676
788
|
const binaryPresent = await fs
|
|
677
789
|
.access(pathToBB, fs.constants.R_OK)
|
|
@@ -681,10 +793,21 @@ async function verifyProofInternal(
|
|
|
681
793
|
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
682
794
|
}
|
|
683
795
|
|
|
796
|
+
const logFunction = (message: string) => {
|
|
797
|
+
logger.verbose(`AvmCircuit (verify) BB out - ${message}`);
|
|
798
|
+
};
|
|
799
|
+
|
|
684
800
|
try {
|
|
685
|
-
const args = [
|
|
801
|
+
const args = [
|
|
802
|
+
'-p',
|
|
803
|
+
proofFullPath,
|
|
804
|
+
'-k',
|
|
805
|
+
verificationKeyPath,
|
|
806
|
+
logger.level === 'debug' || logger.level === 'trace' ? '-d' : logger.level === 'verbose' ? '-v' : '',
|
|
807
|
+
...extraArgs,
|
|
808
|
+
];
|
|
686
809
|
const timer = new Timer();
|
|
687
|
-
const result = await executeBB(pathToBB, command, args,
|
|
810
|
+
const result = await executeBB(pathToBB, command, args, logFunction);
|
|
688
811
|
const duration = timer.ms();
|
|
689
812
|
if (result.status == BB_RESULT.SUCCESS) {
|
|
690
813
|
return { status: BB_RESULT.SUCCESS, durationMs: duration };
|
package/src/honk.ts
CHANGED
|
@@ -1,35 +1,30 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types/server';
|
|
2
2
|
|
|
3
3
|
export type UltraHonkFlavor = 'ultra_honk' | 'ultra_keccak_honk' | 'ultra_rollup_honk';
|
|
4
4
|
|
|
5
|
-
const UltraKeccakHonkCircuits = ['RootRollupArtifact'] as const satisfies
|
|
6
|
-
const UltraHonkCircuits = [
|
|
7
|
-
// 'EmptyNestedArtifact',
|
|
8
|
-
// 'PrivateKernelEmptyArtifact',
|
|
9
|
-
'BaseParityArtifact',
|
|
10
|
-
'RootParityArtifact',
|
|
11
|
-
] as const satisfies ProtocolArtifact[];
|
|
5
|
+
const UltraKeccakHonkCircuits = ['RootRollupArtifact'] as const satisfies ServerProtocolArtifact[];
|
|
6
|
+
const UltraHonkCircuits = ['BaseParityArtifact', 'RootParityArtifact'] as const satisfies ServerProtocolArtifact[];
|
|
12
7
|
|
|
13
|
-
export type
|
|
14
|
-
export type
|
|
15
|
-
export type
|
|
16
|
-
Exclude<
|
|
17
|
-
|
|
8
|
+
export type UltraKeccakHonkServerProtocolArtifact = (typeof UltraKeccakHonkCircuits)[number];
|
|
9
|
+
export type UltraHonkServerProtocolArtifact = (typeof UltraHonkCircuits)[number];
|
|
10
|
+
export type UltraRollupHonkServerProtocolArtifact = Exclude<
|
|
11
|
+
Exclude<ServerProtocolArtifact, UltraKeccakHonkServerProtocolArtifact>,
|
|
12
|
+
UltraHonkServerProtocolArtifact
|
|
18
13
|
>;
|
|
19
14
|
|
|
20
|
-
export function getUltraHonkFlavorForCircuit(artifact:
|
|
21
|
-
export function getUltraHonkFlavorForCircuit(artifact:
|
|
22
|
-
export function getUltraHonkFlavorForCircuit(artifact:
|
|
23
|
-
export function getUltraHonkFlavorForCircuit(artifact:
|
|
24
|
-
export function getUltraHonkFlavorForCircuit(artifact:
|
|
15
|
+
export function getUltraHonkFlavorForCircuit(artifact: UltraKeccakHonkServerProtocolArtifact): 'ultra_keccak_honk';
|
|
16
|
+
export function getUltraHonkFlavorForCircuit(artifact: UltraHonkServerProtocolArtifact): 'ultra_honk';
|
|
17
|
+
export function getUltraHonkFlavorForCircuit(artifact: UltraRollupHonkServerProtocolArtifact): 'ultra_rollup_honk';
|
|
18
|
+
export function getUltraHonkFlavorForCircuit(artifact: ServerProtocolArtifact): UltraHonkFlavor;
|
|
19
|
+
export function getUltraHonkFlavorForCircuit(artifact: ServerProtocolArtifact): UltraHonkFlavor {
|
|
25
20
|
if (isUltraKeccakHonkCircuit(artifact)) {
|
|
26
21
|
return 'ultra_keccak_honk';
|
|
27
|
-
} else if (UltraHonkCircuits.includes(artifact as
|
|
22
|
+
} else if (UltraHonkCircuits.includes(artifact as UltraHonkServerProtocolArtifact)) {
|
|
28
23
|
return 'ultra_honk';
|
|
29
24
|
}
|
|
30
25
|
return 'ultra_rollup_honk';
|
|
31
26
|
}
|
|
32
27
|
|
|
33
|
-
function isUltraKeccakHonkCircuit(artifact:
|
|
34
|
-
return UltraKeccakHonkCircuits.includes(artifact as
|
|
28
|
+
function isUltraKeccakHonkCircuit(artifact: ServerProtocolArtifact): artifact is UltraKeccakHonkServerProtocolArtifact {
|
|
29
|
+
return UltraKeccakHonkCircuits.includes(artifact as UltraKeccakHonkServerProtocolArtifact);
|
|
35
30
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { type ClientIvcProof } from '@aztec/circuits.js';
|
|
2
|
+
import { runInDirectory } from '@aztec/foundation/fs';
|
|
3
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { BundleArtifactProvider } from '@aztec/noir-protocol-circuits-types/client/bundle';
|
|
5
|
+
import { type SimulationProvider } from '@aztec/simulator/server';
|
|
6
|
+
|
|
7
|
+
import { encode } from '@msgpack/msgpack';
|
|
8
|
+
import { serializeWitness } from '@noir-lang/noirc_abi';
|
|
9
|
+
import { type WitnessMap } from '@noir-lang/types';
|
|
10
|
+
import { promises as fs } from 'fs';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
|
|
13
|
+
import { BB_RESULT, computeGateCountForCircuit, executeBbClientIvcProof } from '../bb/execute.js';
|
|
14
|
+
import { type BBConfig } from '../config.js';
|
|
15
|
+
import { BBPrivateKernelProver } from './bb_private_kernel_prover.js';
|
|
16
|
+
import { readFromOutputDirectory } from './client_ivc_proof_utils.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* This proof creator implementation uses the native bb binary.
|
|
20
|
+
*/
|
|
21
|
+
export class BBNativePrivateKernelProver extends BBPrivateKernelProver {
|
|
22
|
+
private constructor(
|
|
23
|
+
private bbBinaryPath: string,
|
|
24
|
+
private bbWorkingDirectory: string,
|
|
25
|
+
private skipCleanup: boolean,
|
|
26
|
+
protected override simulationProvider: SimulationProvider,
|
|
27
|
+
protected override log = createLogger('bb-prover:native'),
|
|
28
|
+
) {
|
|
29
|
+
super(new BundleArtifactProvider(), simulationProvider, log);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public static async new(config: BBConfig, simulationProvider: SimulationProvider, log?: Logger) {
|
|
33
|
+
await fs.mkdir(config.bbWorkingDirectory, { recursive: true });
|
|
34
|
+
return new BBNativePrivateKernelProver(
|
|
35
|
+
config.bbBinaryPath,
|
|
36
|
+
config.bbWorkingDirectory,
|
|
37
|
+
!!config.bbSkipCleanup,
|
|
38
|
+
simulationProvider,
|
|
39
|
+
log,
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private async _createClientIvcProof(
|
|
44
|
+
directory: string,
|
|
45
|
+
acirs: Buffer[],
|
|
46
|
+
witnessStack: WitnessMap[],
|
|
47
|
+
): Promise<ClientIvcProof> {
|
|
48
|
+
// TODO(#7371): Longer term we won't use this hacked together msgpack format
|
|
49
|
+
// and instead properly create the bincode serialization from rust
|
|
50
|
+
await fs.writeFile(path.join(directory, 'acir.msgpack'), encode(acirs));
|
|
51
|
+
await fs.writeFile(
|
|
52
|
+
path.join(directory, 'witnesses.msgpack'),
|
|
53
|
+
encode(witnessStack.map(map => serializeWitness(map))),
|
|
54
|
+
);
|
|
55
|
+
const provingResult = await executeBbClientIvcProof(
|
|
56
|
+
this.bbBinaryPath,
|
|
57
|
+
directory,
|
|
58
|
+
path.join(directory, 'acir.msgpack'),
|
|
59
|
+
path.join(directory, 'witnesses.msgpack'),
|
|
60
|
+
this.log.info,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
if (provingResult.status === BB_RESULT.FAILURE) {
|
|
64
|
+
this.log.error(`Failed to generate client ivc proof`);
|
|
65
|
+
throw new Error(provingResult.reason);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const proof = await readFromOutputDirectory(directory);
|
|
69
|
+
|
|
70
|
+
this.log.info(`Generated IVC proof`, {
|
|
71
|
+
duration: provingResult.durationMs,
|
|
72
|
+
eventName: 'circuit-proving',
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
return proof;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public override async createClientIvcProof(acirs: Buffer[], witnessStack: WitnessMap[]): Promise<ClientIvcProof> {
|
|
79
|
+
this.log.info(`Generating Client IVC proof`);
|
|
80
|
+
const operation = async (directory: string) => {
|
|
81
|
+
return await this._createClientIvcProof(directory, acirs, witnessStack);
|
|
82
|
+
};
|
|
83
|
+
return await this.runInDirectory(operation);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public override async computeGateCountForCircuit(bytecode: Buffer, circuitName: string): Promise<number> {
|
|
87
|
+
const logFunction = (message: string) => {
|
|
88
|
+
this.log.debug(`$bb gates ${circuitName} - ${message}`);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const result = await computeGateCountForCircuit(
|
|
92
|
+
this.bbBinaryPath,
|
|
93
|
+
this.bbWorkingDirectory,
|
|
94
|
+
circuitName,
|
|
95
|
+
bytecode,
|
|
96
|
+
'mega_honk',
|
|
97
|
+
logFunction,
|
|
98
|
+
);
|
|
99
|
+
if (result.status === BB_RESULT.FAILURE) {
|
|
100
|
+
throw new Error(result.reason);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return result.circuitSize as number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private runInDirectory<T>(fn: (dir: string) => Promise<T>) {
|
|
107
|
+
const log = this.log;
|
|
108
|
+
return runInDirectory(
|
|
109
|
+
this.bbWorkingDirectory,
|
|
110
|
+
(dir: string) =>
|
|
111
|
+
fn(dir).catch(err => {
|
|
112
|
+
log.error(`Error running operation at ${dir}: ${err}`);
|
|
113
|
+
throw err;
|
|
114
|
+
}),
|
|
115
|
+
this.skipCleanup,
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
}
|