@aztec/bb-prover 0.0.0-test.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.
Files changed (97) hide show
  1. package/dest/avm_proving_tests/avm_proving_tester.d.ts +25 -0
  2. package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -0
  3. package/dest/avm_proving_tests/avm_proving_tester.js +105 -0
  4. package/dest/bb/cli.d.ts +12 -0
  5. package/dest/bb/cli.d.ts.map +1 -0
  6. package/dest/bb/cli.js +19 -0
  7. package/dest/bb/execute.d.ts +140 -0
  8. package/dest/bb/execute.d.ts.map +1 -0
  9. package/dest/bb/execute.js +780 -0
  10. package/dest/bb/index.d.ts +3 -0
  11. package/dest/bb/index.d.ts.map +1 -0
  12. package/dest/bb/index.js +16 -0
  13. package/dest/config.d.ts +13 -0
  14. package/dest/config.d.ts.map +1 -0
  15. package/dest/config.js +1 -0
  16. package/dest/honk.d.ts +13 -0
  17. package/dest/honk.d.ts.map +1 -0
  18. package/dest/honk.js +18 -0
  19. package/dest/index.d.ts +8 -0
  20. package/dest/index.d.ts.map +1 -0
  21. package/dest/index.js +6 -0
  22. package/dest/instrumentation.d.ts +47 -0
  23. package/dest/instrumentation.d.ts.map +1 -0
  24. package/dest/instrumentation.js +100 -0
  25. package/dest/prover/bb_native_private_kernel_prover.d.ts +25 -0
  26. package/dest/prover/bb_native_private_kernel_prover.d.ts.map +1 -0
  27. package/dest/prover/bb_native_private_kernel_prover.js +69 -0
  28. package/dest/prover/bb_private_kernel_prover.d.ts +32 -0
  29. package/dest/prover/bb_private_kernel_prover.d.ts.map +1 -0
  30. package/dest/prover/bb_private_kernel_prover.js +109 -0
  31. package/dest/prover/bb_prover.d.ts +120 -0
  32. package/dest/prover/bb_prover.d.ts.map +1 -0
  33. package/dest/prover/bb_prover.js +423 -0
  34. package/dest/prover/client_ivc_proof_utils.d.ts +25 -0
  35. package/dest/prover/client_ivc_proof_utils.d.ts.map +1 -0
  36. package/dest/prover/client_ivc_proof_utils.js +43 -0
  37. package/dest/prover/index.d.ts +4 -0
  38. package/dest/prover/index.d.ts.map +1 -0
  39. package/dest/prover/index.js +3 -0
  40. package/dest/stats.d.ts +5 -0
  41. package/dest/stats.d.ts.map +1 -0
  42. package/dest/stats.js +62 -0
  43. package/dest/test/delay_values.d.ts +4 -0
  44. package/dest/test/delay_values.d.ts.map +1 -0
  45. package/dest/test/delay_values.js +29 -0
  46. package/dest/test/index.d.ts +3 -0
  47. package/dest/test/index.d.ts.map +1 -0
  48. package/dest/test/index.js +2 -0
  49. package/dest/test/test_circuit_prover.d.ts +81 -0
  50. package/dest/test/test_circuit_prover.d.ts.map +1 -0
  51. package/dest/test/test_circuit_prover.js +175 -0
  52. package/dest/test/test_verifier.d.ts +6 -0
  53. package/dest/test/test_verifier.d.ts.map +1 -0
  54. package/dest/test/test_verifier.js +5 -0
  55. package/dest/verification_key/verification_key_data.d.ts +9 -0
  56. package/dest/verification_key/verification_key_data.d.ts.map +1 -0
  57. package/dest/verification_key/verification_key_data.js +44 -0
  58. package/dest/verifier/bb_verifier.d.ts +17 -0
  59. package/dest/verifier/bb_verifier.d.ts.map +1 -0
  60. package/dest/verifier/bb_verifier.js +86 -0
  61. package/dest/verifier/index.d.ts +2 -0
  62. package/dest/verifier/index.d.ts.map +1 -0
  63. package/dest/verifier/index.js +1 -0
  64. package/dest/wasm/bb_wasm_private_kernel_prover.d.ts +17 -0
  65. package/dest/wasm/bb_wasm_private_kernel_prover.d.ts.map +1 -0
  66. package/dest/wasm/bb_wasm_private_kernel_prover.js +46 -0
  67. package/dest/wasm/bundle.d.ts +6 -0
  68. package/dest/wasm/bundle.d.ts.map +1 -0
  69. package/dest/wasm/bundle.js +8 -0
  70. package/dest/wasm/lazy.d.ts +6 -0
  71. package/dest/wasm/lazy.d.ts.map +1 -0
  72. package/dest/wasm/lazy.js +8 -0
  73. package/package.json +111 -0
  74. package/src/avm_proving_tests/avm_proving_tester.ts +170 -0
  75. package/src/bb/cli.ts +32 -0
  76. package/src/bb/execute.ts +853 -0
  77. package/src/bb/index.ts +23 -0
  78. package/src/config.ts +13 -0
  79. package/src/honk.ts +30 -0
  80. package/src/index.ts +8 -0
  81. package/src/instrumentation.ts +144 -0
  82. package/src/prover/bb_native_private_kernel_prover.ts +119 -0
  83. package/src/prover/bb_private_kernel_prover.ts +249 -0
  84. package/src/prover/bb_prover.ts +781 -0
  85. package/src/prover/client_ivc_proof_utils.ts +42 -0
  86. package/src/prover/index.ts +3 -0
  87. package/src/stats.ts +64 -0
  88. package/src/test/delay_values.ts +31 -0
  89. package/src/test/index.ts +2 -0
  90. package/src/test/test_circuit_prover.ts +368 -0
  91. package/src/test/test_verifier.ts +8 -0
  92. package/src/verification_key/verification_key_data.ts +45 -0
  93. package/src/verifier/bb_verifier.ts +114 -0
  94. package/src/verifier/index.ts +1 -0
  95. package/src/wasm/bb_wasm_private_kernel_prover.ts +55 -0
  96. package/src/wasm/bundle.ts +11 -0
  97. package/src/wasm/lazy.ts +11 -0
package/package.json ADDED
@@ -0,0 +1,111 @@
1
+ {
2
+ "name": "@aztec/bb-prover",
3
+ "version": "0.0.0-test.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./dest/index.js",
7
+ "./wasm/bundle": "./dest/wasm/bundle.js",
8
+ "./wasm/lazy": "./dest/wasm/lazy.js",
9
+ "./prover": "./dest/prover/index.js",
10
+ "./verifier": "./dest/verifier/index.js",
11
+ "./test": "./dest/test/index.js",
12
+ "./config": "./dest/config.js"
13
+ },
14
+ "bin": {
15
+ "bb-cli": "./dest/bb/index.js"
16
+ },
17
+ "typedocOptions": {
18
+ "entryPoints": [
19
+ "./src/index.ts"
20
+ ],
21
+ "name": "BB Prover",
22
+ "tsconfig": "./tsconfig.json"
23
+ },
24
+ "inherits": [
25
+ "../package.common.json"
26
+ ],
27
+ "scripts": {
28
+ "build": "yarn clean && tsc -b",
29
+ "build:dev": "tsc -b --watch",
30
+ "clean": "rm -rf ./dest .tsbuildinfo",
31
+ "formatting": "run -T prettier --check ./src && run -T eslint ./src",
32
+ "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
33
+ "bb": "node --no-warnings ./dest/bb/index.js",
34
+ "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
35
+ },
36
+ "jest": {
37
+ "moduleNameMapper": {
38
+ "^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
39
+ },
40
+ "testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
41
+ "rootDir": "./src",
42
+ "transform": {
43
+ "^.+\\.tsx?$": [
44
+ "@swc/jest",
45
+ {
46
+ "jsc": {
47
+ "parser": {
48
+ "syntax": "typescript",
49
+ "decorators": true
50
+ },
51
+ "transform": {
52
+ "decoratorVersion": "2022-03"
53
+ }
54
+ }
55
+ }
56
+ ]
57
+ },
58
+ "extensionsToTreatAsEsm": [
59
+ ".ts"
60
+ ],
61
+ "reporters": [
62
+ "default"
63
+ ],
64
+ "testTimeout": 120000,
65
+ "setupFiles": [
66
+ "../../foundation/src/jest/setup.mjs"
67
+ ]
68
+ },
69
+ "dependencies": {
70
+ "@aztec/bb.js": "0.0.0-test.0",
71
+ "@aztec/constants": "0.0.0-test.0",
72
+ "@aztec/foundation": "0.0.0-test.0",
73
+ "@aztec/noir-protocol-circuits-types": "0.0.0-test.0",
74
+ "@aztec/simulator": "0.0.0-test.0",
75
+ "@aztec/stdlib": "0.0.0-test.0",
76
+ "@aztec/telemetry-client": "0.0.0-test.0",
77
+ "@aztec/world-state": "0.0.0-test.0",
78
+ "@msgpack/msgpack": "^3.0.0-beta2",
79
+ "commander": "^12.1.0",
80
+ "pako": "^2.1.0",
81
+ "source-map-support": "^0.5.21",
82
+ "tslib": "^2.4.0",
83
+ "@aztec/noir-noirc_abi": "0.0.0-test.0",
84
+ "@aztec/noir-types": "0.0.0-test.0"
85
+ },
86
+ "devDependencies": {
87
+ "@aztec/ethereum": "0.0.0-test.0",
88
+ "@aztec/kv-store": "0.0.0-test.0",
89
+ "@aztec/noir-contracts.js": "0.0.0-test.0",
90
+ "@aztec/protocol-contracts": "0.0.0-test.0",
91
+ "@jest/globals": "^29.5.0",
92
+ "@types/jest": "^29.5.0",
93
+ "@types/memdown": "^3.0.0",
94
+ "@types/node": "^18.7.23",
95
+ "@types/source-map-support": "^0.5.10",
96
+ "jest": "^29.5.0",
97
+ "jest-mock-extended": "^3.0.3",
98
+ "ts-node": "^10.9.1",
99
+ "typescript": "^5.0.4",
100
+ "viem": "2.22.8"
101
+ },
102
+ "files": [
103
+ "dest",
104
+ "src",
105
+ "!*.test.*"
106
+ ],
107
+ "types": "./dest/index.d.ts",
108
+ "engines": {
109
+ "node": ">=18"
110
+ }
111
+ }
@@ -0,0 +1,170 @@
1
+ import { PublicTxSimulationTester, type TestEnqueuedCall } from '@aztec/simulator/public/fixtures';
2
+ import { SimpleContractDataSource, WorldStateDB } from '@aztec/simulator/server';
3
+ import type { AvmCircuitInputs } from '@aztec/stdlib/avm';
4
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
6
+ import { makeAvmCircuitInputs } from '@aztec/stdlib/testing';
7
+ import { VerificationKeyData } from '@aztec/stdlib/vks';
8
+ import { NativeWorldStateService } from '@aztec/world-state';
9
+
10
+ import fs from 'node:fs/promises';
11
+ import { tmpdir } from 'node:os';
12
+ import path from 'path';
13
+
14
+ import {
15
+ type BBResult,
16
+ type BBSuccess,
17
+ BB_RESULT,
18
+ generateAvmProof,
19
+ generateAvmProofV2,
20
+ verifyAvmProof,
21
+ verifyAvmProofV2,
22
+ } from '../bb/execute.js';
23
+ import { extractAvmVkData } from '../verification_key/verification_key_data.js';
24
+
25
+ const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb');
26
+
27
+ export class AvmProvingTester extends PublicTxSimulationTester {
28
+ constructor(
29
+ private bbWorkingDirectory: string,
30
+ private checkCircuitOnly: boolean,
31
+ worldStateDB: WorldStateDB,
32
+ contractDataSource: SimpleContractDataSource,
33
+ merkleTrees: MerkleTreeWriteOperations,
34
+ ) {
35
+ super(worldStateDB, contractDataSource, merkleTrees);
36
+ }
37
+
38
+ static override async create(checkCircuitOnly: boolean = false) {
39
+ const bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
40
+
41
+ const contractDataSource = new SimpleContractDataSource();
42
+ const merkleTrees = await (await NativeWorldStateService.tmp()).fork();
43
+ const worldStateDB = new WorldStateDB(merkleTrees, contractDataSource);
44
+ return new AvmProvingTester(bbWorkingDirectory, checkCircuitOnly, worldStateDB, contractDataSource, merkleTrees);
45
+ }
46
+
47
+ async prove(avmCircuitInputs: AvmCircuitInputs): Promise<BBResult> {
48
+ // Then we prove.
49
+ const proofRes = await generateAvmProof(
50
+ BB_PATH,
51
+ this.bbWorkingDirectory,
52
+ avmCircuitInputs,
53
+ this.logger,
54
+ this.checkCircuitOnly,
55
+ );
56
+ if (proofRes.status === BB_RESULT.FAILURE) {
57
+ this.logger.error(`Proof generation failed: ${proofRes.reason}`);
58
+ }
59
+ return proofRes;
60
+ }
61
+
62
+ async verify(proofRes: BBSuccess): Promise<BBResult> {
63
+ if (this.checkCircuitOnly) {
64
+ // Skip verification if we're only checking the circuit.
65
+ // Check-circuit doesn't generate a proof to verify.
66
+ return proofRes;
67
+ }
68
+ // Then we test VK extraction and serialization.
69
+ const succeededRes = proofRes as BBSuccess;
70
+ const vkData = await extractAvmVkData(succeededRes.vkPath!);
71
+ VerificationKeyData.fromBuffer(vkData.toBuffer());
72
+
73
+ // Then we verify.
74
+ const rawVkPath = path.join(succeededRes.vkPath!, 'vk');
75
+ return await verifyAvmProof(BB_PATH, succeededRes.proofPath!, rawVkPath, this.logger);
76
+ }
77
+
78
+ public async simProveVerify(
79
+ sender: AztecAddress,
80
+ setupCalls: TestEnqueuedCall[],
81
+ appCalls: TestEnqueuedCall[],
82
+ teardownCall: TestEnqueuedCall | undefined,
83
+ expectRevert: boolean | undefined,
84
+ feePayer = sender,
85
+ ) {
86
+ const simRes = await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer);
87
+ expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
88
+ const avmCircuitInputs = simRes.avmProvingRequest.inputs;
89
+ const provingRes = await this.prove(avmCircuitInputs);
90
+ expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
91
+ const verificationRes = await this.verify(provingRes as BBSuccess);
92
+ expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
93
+ }
94
+
95
+ public async simProveVerifyAppLogic(appCall: TestEnqueuedCall, expectRevert?: boolean) {
96
+ const simRes = await this.simulateTx(/*sender=*/ AztecAddress.fromNumber(42), /*setupCalls=*/ [], [appCall]);
97
+ expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
98
+
99
+ const avmCircuitInputs = simRes.avmProvingRequest.inputs;
100
+ const provingRes = await this.prove(avmCircuitInputs);
101
+ expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
102
+
103
+ const verificationRes = await this.verify(provingRes as BBSuccess);
104
+ expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
105
+ }
106
+ }
107
+
108
+ export class AvmProvingTesterV2 extends PublicTxSimulationTester {
109
+ constructor(
110
+ private bbWorkingDirectory: string,
111
+ worldStateDB: WorldStateDB,
112
+ contractDataSource: SimpleContractDataSource,
113
+ merkleTrees: MerkleTreeWriteOperations,
114
+ ) {
115
+ super(worldStateDB, contractDataSource, merkleTrees);
116
+ }
117
+
118
+ static override async create() {
119
+ const bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
120
+
121
+ const contractDataSource = new SimpleContractDataSource();
122
+ const merkleTrees = await (await NativeWorldStateService.tmp()).fork();
123
+ const worldStateDB = new WorldStateDB(merkleTrees, contractDataSource);
124
+ return new AvmProvingTesterV2(bbWorkingDirectory, worldStateDB, contractDataSource, merkleTrees);
125
+ }
126
+
127
+ async proveV2(avmCircuitInputs: AvmCircuitInputs): Promise<BBResult> {
128
+ // Then we prove.
129
+ const proofRes = await generateAvmProofV2(BB_PATH, this.bbWorkingDirectory, avmCircuitInputs, this.logger);
130
+ if (proofRes.status === BB_RESULT.FAILURE) {
131
+ this.logger.error(`Proof generation failed: ${proofRes.reason}`);
132
+ }
133
+ expect(proofRes.status).toEqual(BB_RESULT.SUCCESS);
134
+ return proofRes as BBSuccess;
135
+ }
136
+
137
+ async verifyV2(proofRes: BBSuccess): Promise<BBResult> {
138
+ // TODO: Placeholder for now. They get ignored in C++.
139
+ const inputs = await makeAvmCircuitInputs();
140
+
141
+ const rawVkPath = path.join(proofRes.vkPath!, 'vk');
142
+ return await verifyAvmProofV2(
143
+ BB_PATH,
144
+ this.bbWorkingDirectory,
145
+ proofRes.proofPath!,
146
+ inputs.publicInputs,
147
+ rawVkPath,
148
+ this.logger,
149
+ );
150
+ }
151
+
152
+ public async simProveVerifyV2(
153
+ sender: AztecAddress,
154
+ setupCalls: TestEnqueuedCall[],
155
+ appCalls: TestEnqueuedCall[],
156
+ teardownCall: TestEnqueuedCall | undefined,
157
+ expectRevert: boolean | undefined,
158
+ feePayer = sender,
159
+ ) {
160
+ const simRes = await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer);
161
+ expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
162
+
163
+ const avmCircuitInputs = simRes.avmProvingRequest.inputs;
164
+ const provingRes = await this.proveV2(avmCircuitInputs);
165
+ expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
166
+
167
+ const verificationRes = await this.verifyV2(provingRes as BBSuccess);
168
+ expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
169
+ }
170
+ }
package/src/bb/cli.ts ADDED
@@ -0,0 +1,32 @@
1
+ import type { LogFn } from '@aztec/foundation/log';
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/stdlib/noir';
6
+
7
+ import { Command } from 'commander';
8
+
9
+ export const ProtocolCircuitArtifacts: Record<ProtocolArtifact, NoirCompiledCircuit> = {
10
+ ...ClientCircuitArtifacts,
11
+ ...ServerCircuitArtifacts,
12
+ };
13
+
14
+ /**
15
+ * Returns commander program that defines the CLI.
16
+ * @param log - Console logger.
17
+ * @returns The CLI.
18
+ */
19
+ export function getProgram(log: LogFn): Command {
20
+ const program = new Command('bb-cli');
21
+
22
+ program.description('CLI for interacting with Barretenberg.');
23
+
24
+ program
25
+ .command('protocol-circuits')
26
+ .description('Lists the available protocol circuit artifacts')
27
+ .action(() => {
28
+ log(Object.keys(ProtocolCircuitArtifacts).reduce((prev: string, x: string) => prev.concat(`\n${x}`)));
29
+ });
30
+
31
+ return program;
32
+ }