@aztec/bb-prover 0.69.0-devnet → 0.69.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/bb/cli.d.ts +3 -0
- package/dest/bb/cli.d.ts.map +1 -1
- package/dest/bb/cli.js +7 -2
- 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 +23 -0
- package/dest/prover/bb_native_private_kernel_prover.d.ts.map +1 -0
- package/dest/prover/bb_native_private_kernel_prover.js +68 -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 -117
- 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 +9 -30
- 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_circuit_prover.d.ts +4 -4
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +11 -9
- 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 +4 -4
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts +14 -0
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts.map +1 -0
- package/dest/wasm/bb_wasm_private_kernel_prover.js +30 -0
- package/dest/wasm/bundle.d.ts +5 -0
- package/dest/wasm/bundle.d.ts.map +1 -0
- package/dest/wasm/bundle.js +9 -0
- package/dest/wasm/lazy.d.ts +5 -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/honk.ts +16 -21
- package/src/prover/bb_native_private_kernel_prover.ts +110 -0
- package/src/prover/bb_private_kernel_prover.ts +138 -201
- package/src/prover/bb_prover.ts +25 -67
- package/src/prover/index.ts +1 -1
- package/src/stats.ts +6 -11
- package/src/test/test_circuit_prover.ts +21 -36
- package/src/verifier/bb_verifier.ts +11 -10
- package/src/wasm/bb_wasm_private_kernel_prover.ts +40 -0
- package/src/wasm/bundle.ts +10 -0
- package/src/wasm/lazy.ts +10 -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
|
@@ -0,0 +1,30 @@
|
|
|
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, threads = 1, log = createLogger('bb-prover:wasm')) {
|
|
10
|
+
super(artifactProvider, log);
|
|
11
|
+
this.artifactProvider = artifactProvider;
|
|
12
|
+
this.threads = threads;
|
|
13
|
+
this.log = log;
|
|
14
|
+
}
|
|
15
|
+
async createClientIvcProof(acirs, witnessStack) {
|
|
16
|
+
const timer = new Timer();
|
|
17
|
+
this.log.info(`Generating ClientIVC proof...`);
|
|
18
|
+
const backend = new AztecClientBackend(acirs.map(acir => ungzip(acir)), { threads: this.threads });
|
|
19
|
+
const [proof, vk] = await backend.prove(witnessStack.map(witnessMap => ungzip(serializeWitness(witnessMap))));
|
|
20
|
+
await backend.destroy();
|
|
21
|
+
this.log.info(`Generated ClientIVC proof`, {
|
|
22
|
+
eventName: 'client-ivc-proof-generation',
|
|
23
|
+
duration: timer.ms(),
|
|
24
|
+
proofSize: proof.length,
|
|
25
|
+
vkSize: vk.length,
|
|
26
|
+
});
|
|
27
|
+
return new ClientIvcProof(Buffer.from(proof), Buffer.from(vk));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfd2FzbV9wcml2YXRlX2tlcm5lbF9wcm92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FzbS9iYl93YXNtX3ByaXZhdGVfa2VybmVsX3Byb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUU5RSxNQUFNLE9BQWdCLHlCQUEwQixTQUFRLHFCQUFxQjtJQUMzRSxZQUNxQixnQkFBa0MsRUFDN0MsVUFBa0IsQ0FBQyxFQUNSLE1BQU0sWUFBWSxDQUFDLGdCQUFnQixDQUFDO1FBRXZELEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUpWLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDN0MsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNSLFFBQUcsR0FBSCxHQUFHLENBQWlDO0lBR3pELENBQUM7SUFFZSxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBZSxFQUFFLFlBQTBCO1FBQ3BGLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGtCQUFrQixDQUNwQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQy9CLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FDMUIsQ0FBQztRQUVGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7WUFDekMsU0FBUyxFQUFFLDZCQUE2QjtZQUN4QyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNwQixTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDdkIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO1NBQ2xCLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BBWASMPrivateKernelProver } from './bb_wasm_private_kernel_prover.js';
|
|
2
|
+
export declare class BBWASMBundlePrivateKernelProver extends BBWASMPrivateKernelProver {
|
|
3
|
+
constructor(threads?: number, log?: import("@aztec/foundation/log").Logger);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/wasm/bundle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,qBAAa,+BAAgC,SAAQ,yBAAyB;gBAChE,OAAO,SAAI,EAAE,GAAG,yCAAwC;CAGrE"}
|
|
@@ -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(threads = 1, log = createLogger('bb-prover:wasm:bundle')) {
|
|
6
|
+
super(new BundleArtifactProvider(), threads, log);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dhc20vYnVuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUUzRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUUvRSxNQUFNLE9BQU8sK0JBQWdDLFNBQVEseUJBQXlCO0lBQzVFLFlBQVksT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDO1FBQ2xFLEtBQUssQ0FBQyxJQUFJLHNCQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BBWASMPrivateKernelProver } from './bb_wasm_private_kernel_prover.js';
|
|
2
|
+
export declare class BBWASMLazyPrivateKernelProver extends BBWASMPrivateKernelProver {
|
|
3
|
+
constructor(threads?: number, log?: import("@aztec/foundation/log").Logger);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=lazy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/wasm/lazy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,qBAAa,6BAA8B,SAAQ,yBAAyB;gBAC9D,OAAO,SAAI,EAAE,GAAG,yCAAsC;CAGnE"}
|
|
@@ -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(threads = 1, log = createLogger('bb-prover:wasm:lazy')) {
|
|
6
|
+
super(new LazyArtifactProvider(), threads, log);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93YXNtL2xhenkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRXZGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRS9FLE1BQU0sT0FBTyw2QkFBOEIsU0FBUSx5QkFBeUI7SUFDMUUsWUFBWSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUM7UUFDaEUsS0FBSyxDQUFDLElBQUksb0JBQW9CLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIn0=
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/bb-prover",
|
|
3
|
-
"version": "0.69.
|
|
3
|
+
"version": "0.69.1-devnet",
|
|
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.69.
|
|
70
|
-
"@aztec/circuit-types": "0.69.
|
|
71
|
-
"@aztec/circuits.js": "0.69.
|
|
72
|
-
"@aztec/foundation": "0.69.
|
|
73
|
-
"@aztec/noir-protocol-circuits-types": "0.69.
|
|
74
|
-
"@aztec/simulator": "0.69.
|
|
75
|
-
"@aztec/telemetry-client": "0.69.
|
|
76
|
-
"@aztec/world-state": "0.69.
|
|
70
|
+
"@aztec/bb.js": "0.69.1-devnet",
|
|
71
|
+
"@aztec/circuit-types": "0.69.1-devnet",
|
|
72
|
+
"@aztec/circuits.js": "0.69.1-devnet",
|
|
73
|
+
"@aztec/foundation": "0.69.1-devnet",
|
|
74
|
+
"@aztec/noir-protocol-circuits-types": "0.69.1-devnet",
|
|
75
|
+
"@aztec/simulator": "0.69.1-devnet",
|
|
76
|
+
"@aztec/telemetry-client": "0.69.1-devnet",
|
|
77
|
+
"@aztec/world-state": "0.69.1-devnet",
|
|
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/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,110 @@
|
|
|
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
|
+
|
|
6
|
+
import { encode } from '@msgpack/msgpack';
|
|
7
|
+
import { serializeWitness } from '@noir-lang/noirc_abi';
|
|
8
|
+
import { type WitnessMap } from '@noir-lang/types';
|
|
9
|
+
import { promises as fs } from 'fs';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
|
|
12
|
+
import { BB_RESULT, computeGateCountForCircuit, executeBbClientIvcProof } from '../bb/execute.js';
|
|
13
|
+
import { type BBConfig } from '../config.js';
|
|
14
|
+
import { BBPrivateKernelProver } from './bb_private_kernel_prover.js';
|
|
15
|
+
import { readFromOutputDirectory } from './client_ivc_proof_utils.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* This proof creator implementation uses the native bb binary.
|
|
19
|
+
*/
|
|
20
|
+
export class BBNativePrivateKernelProver extends BBPrivateKernelProver {
|
|
21
|
+
private constructor(
|
|
22
|
+
private bbBinaryPath: string,
|
|
23
|
+
private bbWorkingDirectory: string,
|
|
24
|
+
private skipCleanup: boolean,
|
|
25
|
+
protected override log = createLogger('bb-prover:native'),
|
|
26
|
+
) {
|
|
27
|
+
super(new BundleArtifactProvider(), log);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public static async new(config: BBConfig, log?: Logger) {
|
|
31
|
+
await fs.mkdir(config.bbWorkingDirectory, { recursive: true });
|
|
32
|
+
return new BBNativePrivateKernelProver(config.bbBinaryPath, config.bbWorkingDirectory, !!config.bbSkipCleanup, log);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private async _createClientIvcProof(
|
|
36
|
+
directory: string,
|
|
37
|
+
acirs: Buffer[],
|
|
38
|
+
witnessStack: WitnessMap[],
|
|
39
|
+
): Promise<ClientIvcProof> {
|
|
40
|
+
// TODO(#7371): Longer term we won't use this hacked together msgpack format
|
|
41
|
+
// and instead properly create the bincode serialization from rust
|
|
42
|
+
await fs.writeFile(path.join(directory, 'acir.msgpack'), encode(acirs));
|
|
43
|
+
await fs.writeFile(
|
|
44
|
+
path.join(directory, 'witnesses.msgpack'),
|
|
45
|
+
encode(witnessStack.map(map => serializeWitness(map))),
|
|
46
|
+
);
|
|
47
|
+
const provingResult = await executeBbClientIvcProof(
|
|
48
|
+
this.bbBinaryPath,
|
|
49
|
+
directory,
|
|
50
|
+
path.join(directory, 'acir.msgpack'),
|
|
51
|
+
path.join(directory, 'witnesses.msgpack'),
|
|
52
|
+
this.log.info,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
if (provingResult.status === BB_RESULT.FAILURE) {
|
|
56
|
+
this.log.error(`Failed to generate client ivc proof`);
|
|
57
|
+
throw new Error(provingResult.reason);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const proof = await readFromOutputDirectory(directory);
|
|
61
|
+
|
|
62
|
+
this.log.info(`Generated IVC proof`, {
|
|
63
|
+
duration: provingResult.durationMs,
|
|
64
|
+
eventName: 'circuit-proving',
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return proof;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public override async createClientIvcProof(acirs: Buffer[], witnessStack: WitnessMap[]): Promise<ClientIvcProof> {
|
|
71
|
+
this.log.info(`Generating Client IVC proof`);
|
|
72
|
+
const operation = async (directory: string) => {
|
|
73
|
+
return await this._createClientIvcProof(directory, acirs, witnessStack);
|
|
74
|
+
};
|
|
75
|
+
return await this.runInDirectory(operation);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public override async computeGateCountForCircuit(bytecode: Buffer, circuitName: string): Promise<number> {
|
|
79
|
+
const logFunction = (message: string) => {
|
|
80
|
+
this.log.debug(`$bb gates ${circuitName} - ${message}`);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const result = await computeGateCountForCircuit(
|
|
84
|
+
this.bbBinaryPath,
|
|
85
|
+
this.bbWorkingDirectory,
|
|
86
|
+
circuitName,
|
|
87
|
+
bytecode,
|
|
88
|
+
'mega_honk',
|
|
89
|
+
logFunction,
|
|
90
|
+
);
|
|
91
|
+
if (result.status === BB_RESULT.FAILURE) {
|
|
92
|
+
throw new Error(result.reason);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return result.circuitSize as number;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private runInDirectory<T>(fn: (dir: string) => Promise<T>) {
|
|
99
|
+
const log = this.log;
|
|
100
|
+
return runInDirectory(
|
|
101
|
+
this.bbWorkingDirectory,
|
|
102
|
+
(dir: string) =>
|
|
103
|
+
fn(dir).catch(err => {
|
|
104
|
+
log.error(`Error running operation at ${dir}: ${err}`);
|
|
105
|
+
throw err;
|
|
106
|
+
}),
|
|
107
|
+
this.skipCleanup,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|