@aztec/bb.js 3.0.0-nightly.20251016 → 3.0.0-nightly.20251022
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/README.md +12 -78
- package/dest/browser/barretenberg/backend.d.ts +1 -1
- package/dest/browser/barretenberg/backend.d.ts.map +1 -1
- package/dest/browser/barretenberg/backend.js +21 -13
- package/dest/browser/barretenberg/index.d.ts +44 -43
- package/dest/browser/barretenberg/index.d.ts.map +1 -1
- package/dest/browser/barretenberg/index.js +130 -79
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.js +2 -2
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +4 -4
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.js +18 -10
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +3 -0
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.js +51 -13
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.js +1 -1
- package/dest/browser/bb_backends/browser/index.d.ts +11 -0
- package/dest/browser/bb_backends/browser/index.d.ts.map +1 -0
- package/dest/browser/bb_backends/browser/index.js +39 -0
- package/dest/browser/bb_backends/index.d.ts +45 -0
- package/dest/browser/bb_backends/index.d.ts.map +1 -0
- package/dest/browser/bb_backends/index.js +15 -0
- package/dest/browser/bb_backends/interface.d.ts +33 -0
- package/dest/browser/bb_backends/interface.d.ts.map +1 -0
- package/dest/browser/bb_backends/interface.js +2 -0
- package/dest/browser/bb_backends/sync_to_async_adapter.d.ts +15 -0
- package/dest/browser/bb_backends/sync_to_async_adapter.d.ts.map +1 -0
- package/dest/browser/bb_backends/sync_to_async_adapter.js +20 -0
- package/dest/browser/bb_backends/wasm.d.ts +56 -0
- package/dest/browser/bb_backends/wasm.d.ts.map +1 -0
- package/dest/browser/bb_backends/wasm.js +90 -0
- package/dest/browser/cbind/generate.js +2 -7
- package/dest/browser/cbind/generated/api_types.d.ts +1167 -0
- package/dest/browser/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/browser/cbind/generated/api_types.js +1609 -47
- package/dest/browser/cbind/generated/async.d.ts +38 -4
- package/dest/browser/cbind/generated/async.d.ts.map +1 -1
- package/dest/browser/cbind/generated/async.js +327 -21
- package/dest/browser/cbind/generated/sync.d.ts +39 -5
- package/dest/browser/cbind/generated/sync.d.ts.map +1 -1
- package/dest/browser/cbind/generated/sync.js +294 -21
- package/dest/browser/cbind/schema_compiler.d.ts +2 -4
- package/dest/browser/cbind/schema_compiler.d.ts.map +1 -1
- package/dest/browser/cbind/schema_compiler.js +74 -178
- package/dest/browser/index.d.ts +2 -2
- package/dest/browser/index.d.ts.map +1 -1
- package/dest/browser/index.js +3 -3
- package/dest/browser/serialize/index.d.ts +0 -1
- package/dest/browser/serialize/index.d.ts.map +1 -1
- package/dest/browser/serialize/index.js +1 -2
- package/dest/browser/serialize/serialize.d.ts +0 -35
- package/dest/browser/serialize/serialize.d.ts.map +1 -1
- package/dest/browser/serialize/serialize.js +1 -68
- package/dest/browser/types/fields.d.ts.map +1 -1
- package/dest/browser/types/fields.js +3 -3
- package/dest/browser/types/index.d.ts +0 -3
- package/dest/browser/types/index.d.ts.map +1 -1
- package/dest/browser/types/index.js +1 -4
- package/dest/node/barretenberg/__snapshots__/pedersen.test.js.snap +2 -2
- package/dest/node/barretenberg/__snapshots__/poseidon.test.js.snap +3 -3
- package/dest/node/barretenberg/backend.d.ts +1 -1
- package/dest/node/barretenberg/backend.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.js +21 -13
- package/dest/node/barretenberg/blake2s.test.js +21 -18
- package/dest/node/barretenberg/index.d.ts +44 -43
- package/dest/node/barretenberg/index.d.ts.map +1 -1
- package/dest/node/barretenberg/index.js +130 -79
- package/dest/node/barretenberg/pedersen.test.js +24 -17
- package/dest/node/barretenberg/poseidon.bench.test.d.ts +2 -0
- package/dest/node/barretenberg/poseidon.bench.test.d.ts.map +1 -0
- package/dest/node/barretenberg/poseidon.bench.test.js +216 -0
- package/dest/node/barretenberg/poseidon.test.js +15 -15
- package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +1 -1
- package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.js +2 -2
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +4 -4
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.js +18 -10
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +3 -0
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +51 -13
- package/dest/node/barretenberg_wasm/index.test.js +11 -10
- package/dest/node/bb_backends/browser/index.d.ts +11 -0
- package/dest/node/bb_backends/browser/index.d.ts.map +1 -0
- package/dest/node/bb_backends/browser/index.js +39 -0
- package/dest/node/bb_backends/index.d.ts +45 -0
- package/dest/node/bb_backends/index.d.ts.map +1 -0
- package/dest/node/bb_backends/index.js +15 -0
- package/dest/node/bb_backends/interface.d.ts +33 -0
- package/dest/node/bb_backends/interface.d.ts.map +1 -0
- package/dest/node/bb_backends/interface.js +2 -0
- package/dest/node/bb_backends/node/index.d.ts +11 -0
- package/dest/node/bb_backends/node/index.d.ts.map +1 -0
- package/dest/node/bb_backends/node/index.js +80 -0
- package/dest/node/bb_backends/node/native_pipe.d.ts +25 -0
- package/dest/node/bb_backends/node/native_pipe.d.ts.map +1 -0
- package/dest/node/bb_backends/node/native_pipe.js +113 -0
- package/dest/node/bb_backends/node/native_shm.d.ts +28 -0
- package/dest/node/bb_backends/node/native_shm.d.ts.map +1 -0
- package/dest/node/bb_backends/node/native_shm.js +150 -0
- package/dest/node/bb_backends/node/native_socket.d.ts +34 -0
- package/dest/node/bb_backends/node/native_socket.d.ts.map +1 -0
- package/dest/node/bb_backends/node/native_socket.js +269 -0
- package/dest/node/bb_backends/node/platform.d.ts +27 -0
- package/dest/node/bb_backends/node/platform.d.ts.map +1 -0
- package/dest/node/bb_backends/node/platform.js +124 -0
- package/dest/node/bb_backends/sync_to_async_adapter.d.ts +15 -0
- package/dest/node/bb_backends/sync_to_async_adapter.d.ts.map +1 -0
- package/dest/node/bb_backends/sync_to_async_adapter.js +20 -0
- package/dest/node/bb_backends/wasm.d.ts +56 -0
- package/dest/node/bb_backends/wasm.d.ts.map +1 -0
- package/dest/node/bb_backends/wasm.js +90 -0
- package/dest/node/cbind/generate.js +2 -7
- package/dest/node/cbind/generated/api_types.d.ts +1167 -0
- package/dest/node/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/node/cbind/generated/api_types.js +1609 -47
- package/dest/node/cbind/generated/async.d.ts +38 -4
- package/dest/node/cbind/generated/async.d.ts.map +1 -1
- package/dest/node/cbind/generated/async.js +327 -21
- package/dest/node/cbind/generated/sync.d.ts +39 -5
- package/dest/node/cbind/generated/sync.d.ts.map +1 -1
- package/dest/node/cbind/generated/sync.js +294 -21
- package/dest/node/cbind/schema_compiler.d.ts +2 -4
- package/dest/node/cbind/schema_compiler.d.ts.map +1 -1
- package/dest/node/cbind/schema_compiler.js +74 -178
- package/dest/node/index.d.ts +2 -2
- package/dest/node/index.d.ts.map +1 -1
- package/dest/node/index.js +3 -3
- package/dest/node/serialize/index.d.ts +0 -1
- package/dest/node/serialize/index.d.ts.map +1 -1
- package/dest/node/serialize/index.js +1 -2
- package/dest/node/serialize/serialize.d.ts +0 -35
- package/dest/node/serialize/serialize.d.ts.map +1 -1
- package/dest/node/serialize/serialize.js +1 -68
- package/dest/node/types/fields.d.ts.map +1 -1
- package/dest/node/types/fields.js +3 -3
- package/dest/node/types/index.d.ts +0 -3
- package/dest/node/types/index.d.ts.map +1 -1
- package/dest/node/types/index.js +1 -4
- package/dest/node-cjs/barretenberg/backend.d.ts +1 -1
- package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/backend.js +20 -12
- package/dest/node-cjs/barretenberg/blake2s.test.js +19 -16
- package/dest/node-cjs/barretenberg/index.d.ts +44 -43
- package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/index.js +136 -84
- package/dest/node-cjs/barretenberg/pedersen.test.js +24 -17
- package/dest/node-cjs/barretenberg/poseidon.bench.test.d.ts +2 -0
- package/dest/node-cjs/barretenberg/poseidon.bench.test.d.ts.map +1 -0
- package/dest/node-cjs/barretenberg/poseidon.bench.test.js +218 -0
- package/dest/node-cjs/barretenberg/poseidon.test.js +15 -15
- package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +1 -1
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.js +2 -2
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +4 -4
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.js +18 -10
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +3 -0
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +51 -13
- package/dest/node-cjs/barretenberg_wasm/index.test.js +11 -10
- package/dest/node-cjs/bb_backends/browser/index.d.ts +11 -0
- package/dest/node-cjs/bb_backends/browser/index.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/browser/index.js +43 -0
- package/dest/node-cjs/bb_backends/index.d.ts +45 -0
- package/dest/node-cjs/bb_backends/index.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/index.js +18 -0
- package/dest/node-cjs/bb_backends/interface.d.ts +33 -0
- package/dest/node-cjs/bb_backends/interface.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/interface.js +3 -0
- package/dest/node-cjs/bb_backends/node/index.d.ts +11 -0
- package/dest/node-cjs/bb_backends/node/index.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/node/index.js +84 -0
- package/dest/node-cjs/bb_backends/node/native_pipe.d.ts +25 -0
- package/dest/node-cjs/bb_backends/node/native_pipe.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/node/native_pipe.js +117 -0
- package/dest/node-cjs/bb_backends/node/native_shm.d.ts +28 -0
- package/dest/node-cjs/bb_backends/node/native_shm.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/node/native_shm.js +154 -0
- package/dest/node-cjs/bb_backends/node/native_socket.d.ts +34 -0
- package/dest/node-cjs/bb_backends/node/native_socket.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/node/native_socket.js +274 -0
- package/dest/node-cjs/bb_backends/node/platform.d.ts +27 -0
- package/dest/node-cjs/bb_backends/node/platform.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/node/platform.js +131 -0
- package/dest/node-cjs/bb_backends/sync_to_async_adapter.d.ts +15 -0
- package/dest/node-cjs/bb_backends/sync_to_async_adapter.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/sync_to_async_adapter.js +24 -0
- package/dest/node-cjs/bb_backends/wasm.d.ts +56 -0
- package/dest/node-cjs/bb_backends/wasm.d.ts.map +1 -0
- package/dest/node-cjs/bb_backends/wasm.js +95 -0
- package/dest/node-cjs/cbind/generate.js +1 -6
- package/dest/node-cjs/cbind/generated/api_types.d.ts +1167 -0
- package/dest/node-cjs/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/api_types.js +1747 -47
- package/dest/node-cjs/cbind/generated/async.d.ts +38 -4
- package/dest/node-cjs/cbind/generated/async.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/async.js +326 -20
- package/dest/node-cjs/cbind/generated/sync.d.ts +39 -5
- package/dest/node-cjs/cbind/generated/sync.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/sync.js +293 -20
- package/dest/node-cjs/cbind/schema_compiler.d.ts +2 -4
- package/dest/node-cjs/cbind/schema_compiler.d.ts.map +1 -1
- package/dest/node-cjs/cbind/schema_compiler.js +74 -179
- package/dest/node-cjs/index.d.ts +2 -2
- package/dest/node-cjs/index.d.ts.map +1 -1
- package/dest/node-cjs/index.js +3 -3
- package/dest/node-cjs/serialize/index.d.ts +0 -1
- package/dest/node-cjs/serialize/index.d.ts.map +1 -1
- package/dest/node-cjs/serialize/index.js +1 -2
- package/dest/node-cjs/serialize/serialize.d.ts +0 -35
- package/dest/node-cjs/serialize/serialize.d.ts.map +1 -1
- package/dest/node-cjs/serialize/serialize.js +1 -79
- package/dest/node-cjs/types/fields.d.ts.map +1 -1
- package/dest/node-cjs/types/fields.js +2 -2
- package/dest/node-cjs/types/index.d.ts +0 -3
- package/dest/node-cjs/types/index.d.ts.map +1 -1
- package/dest/node-cjs/types/index.js +1 -4
- package/package.json +3 -4
- package/src/barretenberg/__snapshots__/pedersen.test.ts.snap +2 -2
- package/src/barretenberg/__snapshots__/poseidon.test.ts.snap +3 -3
- package/src/barretenberg/backend.ts +37 -32
- package/src/barretenberg/blake2s.test.ts +20 -21
- package/src/barretenberg/index.ts +136 -117
- package/src/barretenberg/pedersen.test.ts +23 -16
- package/src/barretenberg/poseidon.bench.test.ts +267 -0
- package/src/barretenberg/poseidon.test.ts +14 -14
- package/src/barretenberg_wasm/barretenberg_wasm_base/index.ts +3 -3
- package/src/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.ts +17 -9
- package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +62 -15
- package/src/barretenberg_wasm/index.test.ts +12 -11
- package/src/bb_backends/browser/index.ts +50 -0
- package/src/bb_backends/index.ts +49 -0
- package/src/bb_backends/interface.ts +35 -0
- package/src/bb_backends/node/index.ts +94 -0
- package/src/bb_backends/node/native_pipe.ts +127 -0
- package/src/bb_backends/node/native_shm.ts +171 -0
- package/src/bb_backends/node/native_socket.ts +312 -0
- package/src/bb_backends/node/platform.ts +151 -0
- package/src/bb_backends/sync_to_async_adapter.ts +21 -0
- package/src/bb_backends/wasm.ts +110 -0
- package/src/cbind/README.md +1 -1
- package/src/cbind/generate.ts +0 -6
- package/src/cbind/schema_compiler.ts +131 -241
- package/src/index.ts +2 -1
- package/src/serialize/index.ts +0 -1
- package/src/serialize/serialize.ts +0 -82
- package/src/types/fields.ts +2 -2
- package/src/types/index.ts +0 -3
- package/dest/browser/barretenberg_api/index.d.ts +0 -109
- package/dest/browser/barretenberg_api/index.d.ts.map +0 -1
- package/dest/browser/barretenberg_api/index.js +0 -699
- package/dest/browser/cbind/generated/native.d.ts +0 -31
- package/dest/browser/cbind/generated/native.d.ts.map +0 -1
- package/dest/browser/cbind/generated/native.js +0 -234
- package/dest/browser/serialize/output_type.d.ts +0 -11
- package/dest/browser/serialize/output_type.d.ts.map +0 -1
- package/dest/browser/serialize/output_type.js +0 -44
- package/dest/browser/types/fixed_size_buffer.d.ts +0 -26
- package/dest/browser/types/fixed_size_buffer.d.ts.map +0 -1
- package/dest/browser/types/fixed_size_buffer.js +0 -51
- package/dest/browser/types/ptr.d.ts +0 -13
- package/dest/browser/types/ptr.d.ts.map +0 -1
- package/dest/browser/types/ptr.js +0 -19
- package/dest/browser/types/raw_buffer.d.ts +0 -3
- package/dest/browser/types/raw_buffer.d.ts.map +0 -1
- package/dest/browser/types/raw_buffer.js +0 -5
- package/dest/node/barretenberg/common.test.d.ts +0 -2
- package/dest/node/barretenberg/common.test.d.ts.map +0 -1
- package/dest/node/barretenberg/common.test.js +0 -20
- package/dest/node/barretenberg_api/index.d.ts +0 -109
- package/dest/node/barretenberg_api/index.d.ts.map +0 -1
- package/dest/node/barretenberg_api/index.js +0 -699
- package/dest/node/bindgen/function_declaration.d.ts +0 -11
- package/dest/node/bindgen/function_declaration.d.ts.map +0 -1
- package/dest/node/bindgen/function_declaration.js +0 -2
- package/dest/node/bindgen/index.d.ts +0 -2
- package/dest/node/bindgen/index.d.ts.map +0 -1
- package/dest/node/bindgen/index.js +0 -15
- package/dest/node/bindgen/mappings.d.ts +0 -4
- package/dest/node/bindgen/mappings.d.ts.map +0 -1
- package/dest/node/bindgen/mappings.js +0 -64
- package/dest/node/bindgen/rust.d.ts +0 -2
- package/dest/node/bindgen/rust.d.ts.map +0 -1
- package/dest/node/bindgen/rust.js +0 -43
- package/dest/node/bindgen/to_camel_case.d.ts +0 -2
- package/dest/node/bindgen/to_camel_case.d.ts.map +0 -1
- package/dest/node/bindgen/to_camel_case.js +0 -11
- package/dest/node/bindgen/typescript.d.ts +0 -2
- package/dest/node/bindgen/typescript.d.ts.map +0 -1
- package/dest/node/bindgen/typescript.js +0 -100
- package/dest/node/cbind/generated/native.d.ts +0 -31
- package/dest/node/cbind/generated/native.d.ts.map +0 -1
- package/dest/node/cbind/generated/native.js +0 -234
- package/dest/node/main.d.ts +0 -13
- package/dest/node/main.d.ts.map +0 -1
- package/dest/node/main.js +0 -459
- package/dest/node/serialize/output_type.d.ts +0 -11
- package/dest/node/serialize/output_type.d.ts.map +0 -1
- package/dest/node/serialize/output_type.js +0 -44
- package/dest/node/types/fixed_size_buffer.d.ts +0 -26
- package/dest/node/types/fixed_size_buffer.d.ts.map +0 -1
- package/dest/node/types/fixed_size_buffer.js +0 -51
- package/dest/node/types/ptr.d.ts +0 -13
- package/dest/node/types/ptr.d.ts.map +0 -1
- package/dest/node/types/ptr.js +0 -19
- package/dest/node/types/raw_buffer.d.ts +0 -3
- package/dest/node/types/raw_buffer.d.ts.map +0 -1
- package/dest/node/types/raw_buffer.js +0 -5
- package/dest/node-cjs/barretenberg/common.test.d.ts +0 -2
- package/dest/node-cjs/barretenberg/common.test.d.ts.map +0 -1
- package/dest/node-cjs/barretenberg/common.test.js +0 -22
- package/dest/node-cjs/barretenberg_api/index.d.ts +0 -109
- package/dest/node-cjs/barretenberg_api/index.d.ts.map +0 -1
- package/dest/node-cjs/barretenberg_api/index.js +0 -704
- package/dest/node-cjs/bindgen/function_declaration.d.ts +0 -11
- package/dest/node-cjs/bindgen/function_declaration.d.ts.map +0 -1
- package/dest/node-cjs/bindgen/function_declaration.js +0 -3
- package/dest/node-cjs/bindgen/index.d.ts +0 -2
- package/dest/node-cjs/bindgen/index.d.ts.map +0 -1
- package/dest/node-cjs/bindgen/index.js +0 -17
- package/dest/node-cjs/bindgen/mappings.d.ts +0 -4
- package/dest/node-cjs/bindgen/mappings.d.ts.map +0 -1
- package/dest/node-cjs/bindgen/mappings.js +0 -69
- package/dest/node-cjs/bindgen/rust.d.ts +0 -2
- package/dest/node-cjs/bindgen/rust.d.ts.map +0 -1
- package/dest/node-cjs/bindgen/rust.js +0 -47
- package/dest/node-cjs/bindgen/to_camel_case.d.ts +0 -2
- package/dest/node-cjs/bindgen/to_camel_case.d.ts.map +0 -1
- package/dest/node-cjs/bindgen/to_camel_case.js +0 -14
- package/dest/node-cjs/bindgen/typescript.d.ts +0 -2
- package/dest/node-cjs/bindgen/typescript.d.ts.map +0 -1
- package/dest/node-cjs/bindgen/typescript.js +0 -104
- package/dest/node-cjs/cbind/generated/native.d.ts +0 -31
- package/dest/node-cjs/cbind/generated/native.d.ts.map +0 -1
- package/dest/node-cjs/cbind/generated/native.js +0 -238
- package/dest/node-cjs/main.d.ts +0 -13
- package/dest/node-cjs/main.d.ts.map +0 -1
- package/dest/node-cjs/main.js +0 -470
- package/dest/node-cjs/serialize/output_type.d.ts +0 -11
- package/dest/node-cjs/serialize/output_type.d.ts.map +0 -1
- package/dest/node-cjs/serialize/output_type.js +0 -51
- package/dest/node-cjs/types/fixed_size_buffer.d.ts +0 -26
- package/dest/node-cjs/types/fixed_size_buffer.d.ts.map +0 -1
- package/dest/node-cjs/types/fixed_size_buffer.js +0 -57
- package/dest/node-cjs/types/ptr.d.ts +0 -13
- package/dest/node-cjs/types/ptr.d.ts.map +0 -1
- package/dest/node-cjs/types/ptr.js +0 -23
- package/dest/node-cjs/types/raw_buffer.d.ts +0 -3
- package/dest/node-cjs/types/raw_buffer.d.ts.map +0 -1
- package/dest/node-cjs/types/raw_buffer.js +0 -9
- package/src/barretenberg/common.test.ts +0 -23
- package/src/barretenberg_api/index.ts +0 -1216
- package/src/bindgen/function_declaration.ts +0 -11
- package/src/bindgen/index.ts +0 -17
- package/src/bindgen/mappings.ts +0 -67
- package/src/bindgen/rust.ts +0 -52
- package/src/bindgen/to_camel_case.ts +0 -10
- package/src/bindgen/typescript.ts +0 -116
- package/src/main.ts +0 -534
- package/src/serialize/output_type.ts +0 -53
- package/src/types/fixed_size_buffer.ts +0 -59
- package/src/types/ptr.ts +0 -20
- package/src/types/raw_buffer.ts +0 -3
|
@@ -1,33 +1,13 @@
|
|
|
1
|
-
import { proxy } from 'comlink';
|
|
2
|
-
import { BarretenbergApi, BarretenbergApiSync } from '../barretenberg_api/index.js';
|
|
3
|
-
import { createMainWorker } from '../barretenberg_wasm/barretenberg_wasm_main/factory/node/index.js';
|
|
4
|
-
import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
|
|
5
|
-
import { getRemoteBarretenbergWasm } from '../barretenberg_wasm/helpers/index.js';
|
|
6
1
|
import { Crs, GrumpkinCrs } from '../crs/index.js';
|
|
7
|
-
import { RawBuffer } from '../types/raw_buffer.js';
|
|
8
|
-
import { fetchModuleAndThreads } from '../barretenberg_wasm/index.js';
|
|
9
2
|
import { createDebugLogger } from '../log/index.js';
|
|
10
3
|
import { AsyncApi } from '../cbind/generated/async.js';
|
|
11
|
-
import {
|
|
4
|
+
import { SyncApi } from '../cbind/generated/sync.js';
|
|
5
|
+
import { IMsgpackBackendSync, IMsgpackBackendAsync } from '../bb_backends/interface.js';
|
|
6
|
+
import { BackendOptions, BackendType } from '../bb_backends/index.js';
|
|
7
|
+
import { createAsyncBackend, createSyncBackend } from '../bb_backends/node/index.js';
|
|
12
8
|
|
|
13
9
|
export { UltraHonkBackend, UltraHonkVerifierBackend, AztecClientBackend } from './backend.js';
|
|
14
|
-
|
|
15
|
-
export type BackendOptions = {
|
|
16
|
-
/** @description Number of threads to run the backend worker on */
|
|
17
|
-
threads?: number;
|
|
18
|
-
|
|
19
|
-
/** @description Initial and Maximum memory to be alloted to the backend worker */
|
|
20
|
-
memory?: { initial?: number; maximum?: number };
|
|
21
|
-
|
|
22
|
-
/** @description Path to download CRS files */
|
|
23
|
-
crsPath?: string;
|
|
24
|
-
|
|
25
|
-
/** @description Path to download WASM files */
|
|
26
|
-
wasmPath?: string;
|
|
27
|
-
|
|
28
|
-
/** @description Logging function */
|
|
29
|
-
logger?: (msg: string) => void;
|
|
30
|
-
};
|
|
10
|
+
export * from '../bb_backends/index.js';
|
|
31
11
|
|
|
32
12
|
export type CircuitOptions = {
|
|
33
13
|
/** @description Whether to produce SNARK friendly proofs */
|
|
@@ -38,42 +18,46 @@ export type CircuitOptions = {
|
|
|
38
18
|
* The main class library consumers interact with.
|
|
39
19
|
* It extends the generated api, and provides a static constructor "new" to compose components.
|
|
40
20
|
*/
|
|
41
|
-
export class Barretenberg extends
|
|
21
|
+
export class Barretenberg extends AsyncApi {
|
|
42
22
|
private options: BackendOptions;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
private worker: any,
|
|
47
|
-
wasm: BarretenbergWasmMainWorker,
|
|
48
|
-
options: BackendOptions,
|
|
49
|
-
) {
|
|
50
|
-
super(wasm);
|
|
23
|
+
|
|
24
|
+
constructor(backend: IMsgpackBackendAsync, options: BackendOptions) {
|
|
25
|
+
super(backend);
|
|
51
26
|
this.options = options;
|
|
52
|
-
this.bbApi = new AsyncApi(wasm);
|
|
53
27
|
}
|
|
54
28
|
|
|
55
29
|
/**
|
|
56
30
|
* Constructs an instance of Barretenberg.
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
31
|
+
*
|
|
32
|
+
* If options.backend is set: uses that specific backend (throws if unavailable)
|
|
33
|
+
* If options.backend is unset: tries backends in order with fallback:
|
|
34
|
+
* 1. NativeSharedMemory (if bb binary available)
|
|
35
|
+
* 2. WasmWorker (in browser) or Wasm (in Node.js)
|
|
60
36
|
*/
|
|
61
37
|
static async new(options: BackendOptions = {}) {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
proxy(options.logger ?? createDebugLogger('bb_wasm_async')),
|
|
69
|
-
options.memory?.initial,
|
|
70
|
-
options.memory?.maximum,
|
|
71
|
-
);
|
|
72
|
-
return new Barretenberg(worker, wasm, options);
|
|
73
|
-
}
|
|
38
|
+
const logger = options.logger ?? createDebugLogger('bb_async');
|
|
39
|
+
|
|
40
|
+
if (options.backend) {
|
|
41
|
+
// Explicit backend required - no fallback
|
|
42
|
+
return await createAsyncBackend(options.backend, options, logger);
|
|
43
|
+
}
|
|
74
44
|
|
|
75
|
-
|
|
76
|
-
|
|
45
|
+
if (typeof window === 'undefined') {
|
|
46
|
+
try {
|
|
47
|
+
return await createAsyncBackend(BackendType.NativeSharedMemory, options, logger);
|
|
48
|
+
} catch (err: any) {
|
|
49
|
+
logger(`Shared memory unavailable (${err.message}), falling back to other backends`);
|
|
50
|
+
try {
|
|
51
|
+
return await createAsyncBackend(BackendType.NativeUnixSocket, options, logger);
|
|
52
|
+
} catch (err: any) {
|
|
53
|
+
logger(`Unix socket unavailable (${err.message}), falling back to WASM`);
|
|
54
|
+
return await createAsyncBackend(BackendType.Wasm, options, logger);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
logger(`In browser, using WASM over worker backend.`);
|
|
59
|
+
return await createAsyncBackend(BackendType.WasmWorker, options, logger);
|
|
60
|
+
}
|
|
77
61
|
}
|
|
78
62
|
|
|
79
63
|
async initSRSForCircuitSize(circuitSize: number): Promise<void> {
|
|
@@ -81,7 +65,7 @@ export class Barretenberg extends BarretenbergApi {
|
|
|
81
65
|
const crs = await Crs.new(Math.max(circuitSize, minSRSSize) + 1, this.options.crsPath, this.options.logger);
|
|
82
66
|
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1129): Do slab allocator initialization?
|
|
83
67
|
// await this.commonInitSlabAllocator(circuitSize);
|
|
84
|
-
await this.srsInitSrs(
|
|
68
|
+
await this.srsInitSrs({ pointsBuf: crs.getG1Data(), numPoints: crs.numPoints, g2Point: crs.getG2Data() });
|
|
85
69
|
}
|
|
86
70
|
|
|
87
71
|
async initSRSClientIVC(srsSize = this.getDefaultSrsSize()): Promise<void> {
|
|
@@ -91,8 +75,8 @@ export class Barretenberg extends BarretenbergApi {
|
|
|
91
75
|
|
|
92
76
|
// Load CRS into wasm global CRS state.
|
|
93
77
|
// TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed.
|
|
94
|
-
await this.srsInitSrs(
|
|
95
|
-
await this.srsInitGrumpkinSrs(
|
|
78
|
+
await this.srsInitSrs({ pointsBuf: crs.getG1Data(), numPoints: crs.numPoints, g2Point: crs.getG2Data() });
|
|
79
|
+
await this.srsInitGrumpkinSrs({ pointsBuf: grumpkinCrs.getG1Data(), numPoints: grumpkinCrs.numPoints });
|
|
96
80
|
}
|
|
97
81
|
|
|
98
82
|
getDefaultSrsSize(): number {
|
|
@@ -104,101 +88,136 @@ export class Barretenberg extends BarretenbergApi {
|
|
|
104
88
|
return 2 ** 20;
|
|
105
89
|
}
|
|
106
90
|
|
|
91
|
+
async acirGetCircuitSizes(
|
|
92
|
+
bytecode: Uint8Array,
|
|
93
|
+
recursive: boolean,
|
|
94
|
+
honkRecursion: boolean,
|
|
95
|
+
): Promise<[number, number]> {
|
|
96
|
+
const response = await this.circuitStats({
|
|
97
|
+
circuit: { name: '', bytecode, verificationKey: new Uint8Array() },
|
|
98
|
+
includeGatesPerOpcode: false,
|
|
99
|
+
settings: {
|
|
100
|
+
ipaAccumulation: false,
|
|
101
|
+
oracleHashType: honkRecursion ? 'poseidon2' : 'keccak',
|
|
102
|
+
disableZk: !recursive,
|
|
103
|
+
optimizedSolidityVerifier: false,
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
return [response.numGates, response.numGatesDyadic];
|
|
107
|
+
}
|
|
108
|
+
|
|
107
109
|
async acirInitSRS(bytecode: Uint8Array, recursive: boolean, honkRecursion: boolean): Promise<void> {
|
|
108
|
-
|
|
109
|
-
const [_total, subgroupSize] = await this.acirGetCircuitSizes(bytecode, recursive, honkRecursion);
|
|
110
|
+
const [_, subgroupSize] = await this.acirGetCircuitSizes(bytecode, recursive, honkRecursion);
|
|
110
111
|
return this.initSRSForCircuitSize(subgroupSize);
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
async destroy() {
|
|
114
|
-
|
|
115
|
-
await this.worker.terminate();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
getWasm() {
|
|
119
|
-
return this.wasm;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Wrap ClientIVC methods used by AztecClientBackend and UltraHonkBackend
|
|
123
|
-
async clientIvcStart(command: ClientIvcStart) {
|
|
124
|
-
return this.bbApi.clientIvcStart(command);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async clientIvcLoad(command: ClientIvcLoad) {
|
|
128
|
-
return this.bbApi.clientIvcLoad(command);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
async clientIvcAccumulate(command: ClientIvcAccumulate) {
|
|
132
|
-
return this.bbApi.clientIvcAccumulate(command);
|
|
115
|
+
return super.destroy();
|
|
133
116
|
}
|
|
134
117
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
async
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Initialize the singleton instance of Barretenberg.
|
|
120
|
+
* @param options Backend configuration options
|
|
121
|
+
*/
|
|
122
|
+
static async initSingleton(options: BackendOptions = {}) {
|
|
123
|
+
if (!barretenbergSingletonPromise) {
|
|
124
|
+
barretenbergSingletonPromise = Barretenberg.new(options);
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
barretenbergSingleton = await barretenbergSingletonPromise;
|
|
128
|
+
return barretenbergSingleton;
|
|
129
|
+
} catch (error) {
|
|
130
|
+
// If initialization fails, clear the singleton so next call can retry
|
|
131
|
+
barretenbergSingleton = undefined!;
|
|
132
|
+
barretenbergSingletonPromise = undefined!;
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
145
135
|
}
|
|
146
136
|
|
|
147
|
-
async
|
|
148
|
-
|
|
137
|
+
static async destroySingleton() {
|
|
138
|
+
if (barretenbergSingleton) {
|
|
139
|
+
await barretenbergSingleton.destroy();
|
|
140
|
+
barretenbergSingleton = undefined!;
|
|
141
|
+
barretenbergSingletonPromise = undefined!;
|
|
142
|
+
}
|
|
149
143
|
}
|
|
150
144
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
145
|
+
/**
|
|
146
|
+
* Get the singleton instance of Barretenberg.
|
|
147
|
+
* Must call initSingleton() first.
|
|
148
|
+
*/
|
|
149
|
+
static getSingleton() {
|
|
150
|
+
if (!barretenbergSingleton) {
|
|
151
|
+
throw new Error('First call Barretenberg.initSingleton() on @aztec/bb.js module.');
|
|
152
|
+
}
|
|
153
|
+
return barretenbergSingleton;
|
|
154
154
|
}
|
|
155
|
+
}
|
|
155
156
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
157
|
+
let barretenbergSingletonPromise: Promise<Barretenberg>;
|
|
158
|
+
let barretenbergSingleton: Barretenberg;
|
|
159
159
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
160
|
+
let barretenbergSyncSingletonPromise: Promise<BarretenbergSync>;
|
|
161
|
+
let barretenbergSyncSingleton: BarretenbergSync;
|
|
163
162
|
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
export class BarretenbergSync extends SyncApi {
|
|
164
|
+
constructor(backend: IMsgpackBackendSync) {
|
|
165
|
+
super(backend);
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Create a new BarretenbergSync instance.
|
|
170
|
+
*
|
|
171
|
+
* If options.backend is set: uses that specific backend (throws if unavailable)
|
|
172
|
+
* If options.backend is unset: tries backends in order with fallback:
|
|
173
|
+
* 1. NativeSharedMem (if bb binary + NAPI module available)
|
|
174
|
+
* 2. Wasm
|
|
175
|
+
*
|
|
176
|
+
* Supported backends: Wasm, NativeSharedMem
|
|
177
|
+
* Not supported: WasmWorker (no workers in sync), NativeUnixSocket (async only)
|
|
178
|
+
*/
|
|
179
|
+
static async new(options: BackendOptions = {}) {
|
|
180
|
+
const logger = options.logger ?? createDebugLogger('bb_sync');
|
|
169
181
|
|
|
170
|
-
|
|
171
|
-
|
|
182
|
+
if (options.backend) {
|
|
183
|
+
return await createSyncBackend(options.backend, options, logger);
|
|
184
|
+
}
|
|
172
185
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
186
|
+
// Try native, fallback to WASM.
|
|
187
|
+
try {
|
|
188
|
+
return await createSyncBackend(BackendType.NativeSharedMemory, options, logger);
|
|
189
|
+
} catch (err: any) {
|
|
190
|
+
logger(`Shared memory unavailable (${err.message}), falling back to WASM`);
|
|
191
|
+
}
|
|
177
192
|
|
|
178
|
-
|
|
179
|
-
const wasm = new BarretenbergWasmMain();
|
|
180
|
-
const { module, threads } = await fetchModuleAndThreads(1, wasmPath, logger);
|
|
181
|
-
await wasm.init(module, threads, logger);
|
|
182
|
-
return new BarretenbergSync(wasm);
|
|
193
|
+
return await createSyncBackend(BackendType.Wasm, options, logger);
|
|
183
194
|
}
|
|
184
195
|
|
|
185
|
-
|
|
196
|
+
/**
|
|
197
|
+
* Initialize the singleton instance.
|
|
198
|
+
* @param options Backend configuration options
|
|
199
|
+
*/
|
|
200
|
+
static async initSingleton(options: BackendOptions = {}) {
|
|
186
201
|
if (!barretenbergSyncSingletonPromise) {
|
|
187
|
-
barretenbergSyncSingletonPromise = BarretenbergSync.new(
|
|
202
|
+
barretenbergSyncSingletonPromise = BarretenbergSync.new(options);
|
|
188
203
|
}
|
|
189
204
|
|
|
190
205
|
barretenbergSyncSingleton = await barretenbergSyncSingletonPromise;
|
|
191
206
|
return barretenbergSyncSingleton;
|
|
192
207
|
}
|
|
193
208
|
|
|
209
|
+
static destroySingleton() {
|
|
210
|
+
if (barretenbergSyncSingleton) {
|
|
211
|
+
barretenbergSyncSingleton.destroy();
|
|
212
|
+
barretenbergSyncSingleton = undefined!;
|
|
213
|
+
barretenbergSyncSingletonPromise = undefined!;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
194
217
|
static getSingleton() {
|
|
195
218
|
if (!barretenbergSyncSingleton) {
|
|
196
219
|
throw new Error('First call BarretenbergSync.initSingleton() on @aztec/bb.js module.');
|
|
197
220
|
}
|
|
198
221
|
return barretenbergSyncSingleton;
|
|
199
222
|
}
|
|
200
|
-
|
|
201
|
-
getWasm() {
|
|
202
|
-
return this.wasm;
|
|
203
|
-
}
|
|
204
223
|
}
|
|
@@ -10,7 +10,8 @@ describe('pedersen sync', () => {
|
|
|
10
10
|
});
|
|
11
11
|
|
|
12
12
|
it('pedersenHash', () => {
|
|
13
|
-
const
|
|
13
|
+
const response = api.pedersenHash({ inputs: [new Fr(4n).toBuffer(), new Fr(8n).toBuffer()], hashIndex: 7 });
|
|
14
|
+
const result = Fr.fromBuffer(response.hash);
|
|
14
15
|
expect(result).toMatchSnapshot();
|
|
15
16
|
});
|
|
16
17
|
|
|
@@ -19,34 +20,40 @@ describe('pedersen sync', () => {
|
|
|
19
20
|
const fields = Array.from({ length: loops * 2 }).map(() => Fr.random());
|
|
20
21
|
const t = new Timer();
|
|
21
22
|
for (let i = 0; i < loops; ++i) {
|
|
22
|
-
api.pedersenHash([fields[i * 2], fields[i * 2 + 1]], 0);
|
|
23
|
+
api.pedersenHash({ inputs: [fields[i * 2].toBuffer(), fields[i * 2 + 1].toBuffer()], hashIndex: 0 });
|
|
23
24
|
}
|
|
24
25
|
const us = t.us() / loops;
|
|
25
26
|
console.log(`Executed ${loops} hashes at an average ${us}us / hash`);
|
|
26
27
|
});
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
29
|
+
// TODO: pedersenHashes not yet in new msgpack API
|
|
30
|
+
// it.skip('pedersenHashes perf test', () => {
|
|
31
|
+
// const loops = 10;
|
|
32
|
+
// const numHashesPerLoop = 1024;
|
|
33
|
+
// const fields = Array.from({ length: numHashesPerLoop * 2 }).map(() => Fr.random());
|
|
34
|
+
// const t = new Timer();
|
|
35
|
+
// for (let i = 0; i < loops; ++i) {
|
|
36
|
+
// // api.pedersenHashes(fields, 0); // Not in new API yet
|
|
37
|
+
// }
|
|
38
|
+
// const us = t.us() / (numHashesPerLoop * loops);
|
|
39
|
+
// console.log(`Executed ${numHashesPerLoop * loops} hashes at an average ${us}us / hash`);
|
|
40
|
+
// });
|
|
39
41
|
|
|
40
42
|
it('pedersenHashBuffer', () => {
|
|
41
43
|
const input = Buffer.alloc(123);
|
|
42
44
|
input.writeUint32BE(321, 0);
|
|
43
45
|
input.writeUint32BE(456, 119);
|
|
44
|
-
const
|
|
46
|
+
const response = api.pedersenHashBuffer({ input, hashIndex: 0 });
|
|
47
|
+
const r = Fr.fromBuffer(response.hash);
|
|
45
48
|
expect(r).toMatchSnapshot();
|
|
46
49
|
});
|
|
47
50
|
|
|
48
51
|
it('pedersenCommit', () => {
|
|
49
|
-
const
|
|
52
|
+
const response = api.pedersenCommit({
|
|
53
|
+
inputs: [new Fr(4n).toBuffer(), new Fr(8n).toBuffer(), new Fr(12n).toBuffer()],
|
|
54
|
+
hashIndex: 0,
|
|
55
|
+
});
|
|
56
|
+
const result = { x: Fr.fromBuffer(response.point.x), y: Fr.fromBuffer(response.point.y) };
|
|
50
57
|
expect(result).toMatchSnapshot();
|
|
51
58
|
});
|
|
52
59
|
|
|
@@ -55,7 +62,7 @@ describe('pedersen sync', () => {
|
|
|
55
62
|
const fields = Array.from({ length: loops * 2 }).map(() => Fr.random());
|
|
56
63
|
const t = new Timer();
|
|
57
64
|
for (let i = 0; i < loops; ++i) {
|
|
58
|
-
api.pedersenCommit([fields[i * 2], fields[i * 2 + 1]], 0);
|
|
65
|
+
api.pedersenCommit({ inputs: [fields[i * 2].toBuffer(), fields[i * 2 + 1].toBuffer()], hashIndex: 0 });
|
|
59
66
|
}
|
|
60
67
|
console.log(t.us() / loops);
|
|
61
68
|
});
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { Barretenberg, BarretenbergSync, Fr } from '../index.js';
|
|
2
|
+
import { serializeBufferable } from '../serialize/index.js';
|
|
3
|
+
import { BarretenbergWasmMain } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
|
|
4
|
+
import { fetchModuleAndThreads } from '../barretenberg_wasm/index.js';
|
|
5
|
+
import { BackendType } from './index.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Async API benchmark test: WASM vs Native backends with proper non-blocking I/O
|
|
9
|
+
*
|
|
10
|
+
* This test uses the async Barretenberg API which properly handles:
|
|
11
|
+
* - Non-blocking I/O for native backend (event-based)
|
|
12
|
+
* - Concurrent operations via promises
|
|
13
|
+
* - Better performance for native backend compared to sync API
|
|
14
|
+
*/
|
|
15
|
+
describe('poseidon2Hash benchmark (Async API): WASM vs Native', () => {
|
|
16
|
+
const ITERATIONS = 10000;
|
|
17
|
+
const SIZES = [2, 4, 8];
|
|
18
|
+
|
|
19
|
+
let wasmApi: Barretenberg | null = null;
|
|
20
|
+
let nativeSocketApi: Barretenberg | null = null;
|
|
21
|
+
let nativeShmApi: Barretenberg | null = null;
|
|
22
|
+
let nativeShmSyncApi: BarretenbergSync | null = null;
|
|
23
|
+
let wasm: BarretenbergWasmMain;
|
|
24
|
+
|
|
25
|
+
beforeAll(async () => {
|
|
26
|
+
// Setup direct WASM access for baseline benchmark (always required)
|
|
27
|
+
wasm = new BarretenbergWasmMain();
|
|
28
|
+
const { module } = await fetchModuleAndThreads(1);
|
|
29
|
+
await wasm.init(module, 1);
|
|
30
|
+
|
|
31
|
+
// Setup WASM API
|
|
32
|
+
try {
|
|
33
|
+
wasmApi = await Barretenberg.new({ backend: BackendType.Wasm, threads: 1 });
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.warn('Failed to initialize WASM backend:', error instanceof Error ? error.message : String(error));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Setup native socket API
|
|
39
|
+
try {
|
|
40
|
+
nativeSocketApi = await Barretenberg.new({ backend: BackendType.NativeUnixSocket, threads: 1 });
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.warn(
|
|
43
|
+
'Failed to initialize Native Socket backend:',
|
|
44
|
+
error instanceof Error ? error.message : String(error),
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Setup native shared memory API (async)
|
|
49
|
+
try {
|
|
50
|
+
nativeShmApi = await Barretenberg.new({ backend: BackendType.NativeSharedMemory, threads: 1 });
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.warn(
|
|
53
|
+
'Failed to initialize Native Shared Memory (async) backend:',
|
|
54
|
+
error instanceof Error ? error.message : String(error),
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Setup native shared memory API (sync)
|
|
59
|
+
try {
|
|
60
|
+
nativeShmSyncApi = await BarretenbergSync.new({ backend: BackendType.NativeSharedMemory, threads: 1 });
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.warn(
|
|
63
|
+
'Failed to initialize Native Shared Memory (sync) backend:',
|
|
64
|
+
error instanceof Error ? error.message : String(error),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
}, 20000);
|
|
68
|
+
|
|
69
|
+
afterAll(async () => {
|
|
70
|
+
await wasm.destroy();
|
|
71
|
+
if (wasmApi) {
|
|
72
|
+
await wasmApi.destroy();
|
|
73
|
+
}
|
|
74
|
+
if (nativeSocketApi) {
|
|
75
|
+
await nativeSocketApi.destroy();
|
|
76
|
+
}
|
|
77
|
+
if (nativeShmApi) {
|
|
78
|
+
await nativeShmApi.destroy();
|
|
79
|
+
}
|
|
80
|
+
if (nativeShmSyncApi) {
|
|
81
|
+
nativeShmSyncApi.destroy();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
async function directPoseidon2Hash(inputsBuffer: Fr[]): Promise<Fr> {
|
|
86
|
+
const inArgs = [inputsBuffer].map(serializeBufferable);
|
|
87
|
+
const outTypes = [Fr];
|
|
88
|
+
const result = wasm.callWasmExport(
|
|
89
|
+
'poseidon2_hash',
|
|
90
|
+
inArgs,
|
|
91
|
+
outTypes.map(t => t.SIZE_IN_BYTES),
|
|
92
|
+
);
|
|
93
|
+
const out = result.map((r, i) => outTypes[i].fromBuffer(r));
|
|
94
|
+
return Promise.resolve(out[0]);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
it.each(SIZES)('benchmark with %p field elements', async size => {
|
|
98
|
+
// Generate random inputs
|
|
99
|
+
const inputs = Array(size)
|
|
100
|
+
.fill(0)
|
|
101
|
+
.map(() => Fr.random());
|
|
102
|
+
|
|
103
|
+
// Benchmark 1: Direct WASM (baseline - always available)
|
|
104
|
+
const directStart = performance.now();
|
|
105
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
106
|
+
await directPoseidon2Hash(inputs);
|
|
107
|
+
}
|
|
108
|
+
const directTime = performance.now() - directStart;
|
|
109
|
+
|
|
110
|
+
// Benchmark 2: WASM (async)
|
|
111
|
+
let wasmTime = 0;
|
|
112
|
+
if (wasmApi) {
|
|
113
|
+
const wasmStart = performance.now();
|
|
114
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
115
|
+
await wasmApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
116
|
+
}
|
|
117
|
+
wasmTime = performance.now() - wasmStart;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Benchmark 3: Native Socket (async with non-blocking I/O)
|
|
121
|
+
let nativeSocketTime = 0;
|
|
122
|
+
if (nativeSocketApi) {
|
|
123
|
+
const nativeSocketStart = performance.now();
|
|
124
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
125
|
+
await nativeSocketApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
126
|
+
}
|
|
127
|
+
nativeSocketTime = performance.now() - nativeSocketStart;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Benchmark 4: Native Shared Memory (async)
|
|
131
|
+
let nativeShmTime = 0;
|
|
132
|
+
if (nativeShmApi) {
|
|
133
|
+
const nativeShmStart = performance.now();
|
|
134
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
135
|
+
await nativeShmApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
136
|
+
}
|
|
137
|
+
nativeShmTime = performance.now() - nativeShmStart;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Benchmark 5: Native Shared Memory (sync)
|
|
141
|
+
let nativeShmSyncTime = 0;
|
|
142
|
+
if (nativeShmSyncApi) {
|
|
143
|
+
const nativeShmSyncStart = performance.now();
|
|
144
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
145
|
+
nativeShmSyncApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
146
|
+
}
|
|
147
|
+
nativeShmSyncTime = performance.now() - nativeShmSyncStart;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Calculate metrics (all relative to WASM baseline)
|
|
151
|
+
const directOverhead = ((directTime - wasmTime) / wasmTime) * 100;
|
|
152
|
+
const nativeSocketOverhead = ((nativeSocketTime - wasmTime) / wasmTime) * 100;
|
|
153
|
+
const nativeShmOverhead = ((nativeShmTime - wasmTime) / wasmTime) * 100;
|
|
154
|
+
const nativeShmSyncOverhead = ((nativeShmSyncTime - wasmTime) / wasmTime) * 100;
|
|
155
|
+
|
|
156
|
+
const avgDirectTimeUs = (directTime / ITERATIONS) * 1000; // microseconds
|
|
157
|
+
const avgWasmTimeUs = (wasmTime / ITERATIONS) * 1000;
|
|
158
|
+
const avgNativeSocketTimeUs = (nativeSocketTime / ITERATIONS) * 1000;
|
|
159
|
+
const avgNativeShmTimeUs = (nativeShmTime / ITERATIONS) * 1000;
|
|
160
|
+
const avgNativeShmSyncTimeUs = (nativeShmSyncTime / ITERATIONS) * 1000;
|
|
161
|
+
|
|
162
|
+
process.stdout.write(`┌─ Size ${size.toString().padStart(3)} field elements ──────────────────────────────────┐\n`);
|
|
163
|
+
const formatOverhead = (overhead: number): string => {
|
|
164
|
+
const sign = overhead >= 0 ? '+' : '-';
|
|
165
|
+
const value = Math.abs(overhead).toFixed(1).padStart(6);
|
|
166
|
+
return `${sign}${value}%`;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
if (wasmApi) {
|
|
170
|
+
process.stdout.write(
|
|
171
|
+
`│ WASM: ${wasmTime.toFixed(2).padStart(8)}ms (${avgWasmTimeUs.toFixed(2).padStart(7)}µs/call) [baseline] │\n`,
|
|
172
|
+
);
|
|
173
|
+
} else {
|
|
174
|
+
process.stdout.write(`│ WASM: unavailable │\n`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
process.stdout.write(
|
|
178
|
+
`│ Direct WASM: ${directTime.toFixed(2).padStart(8)}ms (${avgDirectTimeUs.toFixed(2).padStart(7)}µs/call) ${formatOverhead(directOverhead)} │\n`,
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
if (nativeSocketApi) {
|
|
182
|
+
process.stdout.write(
|
|
183
|
+
`│ Native Socket: ${nativeSocketTime.toFixed(2).padStart(8)}ms (${avgNativeSocketTimeUs.toFixed(2).padStart(7)}µs/call) ${formatOverhead(nativeSocketOverhead)} │\n`,
|
|
184
|
+
);
|
|
185
|
+
} else {
|
|
186
|
+
process.stdout.write(`│ Native Socket: unavailable │\n`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (nativeShmApi) {
|
|
190
|
+
process.stdout.write(
|
|
191
|
+
`│ Native Shared: ${nativeShmTime.toFixed(2).padStart(8)}ms (${avgNativeShmTimeUs.toFixed(2).padStart(7)}µs/call) ${formatOverhead(nativeShmOverhead)} │\n`,
|
|
192
|
+
);
|
|
193
|
+
} else {
|
|
194
|
+
process.stdout.write(`│ Native Shared: unavailable │\n`);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (nativeShmSyncApi) {
|
|
198
|
+
process.stdout.write(
|
|
199
|
+
`│ Native Shared Sync: ${nativeShmSyncTime.toFixed(2).padStart(8)}ms (${avgNativeShmSyncTimeUs.toFixed(2).padStart(7)}µs/call) ${formatOverhead(nativeShmSyncOverhead)} │\n`,
|
|
200
|
+
);
|
|
201
|
+
} else {
|
|
202
|
+
process.stdout.write(`│ Native Shared Sync: unavailable │\n`);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
process.stdout.write(`└────────────────────────────────────────────────────────────┘\n`);
|
|
206
|
+
|
|
207
|
+
// Sanity check: verify all backends produce same result as direct WASM
|
|
208
|
+
const directResult = await directPoseidon2Hash(inputs);
|
|
209
|
+
|
|
210
|
+
if (wasmApi) {
|
|
211
|
+
const wasmResult = await wasmApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
212
|
+
expect(Buffer.from(wasmResult.hash)).toEqual(directResult.toBuffer());
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (nativeSocketApi) {
|
|
216
|
+
const nativeSocketResult = await nativeSocketApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
217
|
+
expect(Buffer.from(nativeSocketResult.hash)).toEqual(directResult.toBuffer());
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (nativeShmApi) {
|
|
221
|
+
const nativeShmResult = await nativeShmApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
222
|
+
expect(Buffer.from(nativeShmResult.hash)).toEqual(directResult.toBuffer());
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (nativeShmSyncApi) {
|
|
226
|
+
const nativeShmSyncResult = nativeShmSyncApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
227
|
+
expect(Buffer.from(nativeShmSyncResult.hash)).toEqual(directResult.toBuffer());
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Test always passes, this is just for measuring performance
|
|
231
|
+
expect(true).toBe(true);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
const TEST_VECTORS = [1, 2, 3, 5, 10, 50, 100];
|
|
235
|
+
const NUM_RANDOM_TESTS = 10;
|
|
236
|
+
|
|
237
|
+
it.each(TEST_VECTORS)('produces identical results for %p field elements', async size => {
|
|
238
|
+
// Test with multiple random input vectors
|
|
239
|
+
for (let test = 0; test < NUM_RANDOM_TESTS; test++) {
|
|
240
|
+
const inputs = Array(size)
|
|
241
|
+
.fill(0)
|
|
242
|
+
.map(() => Fr.random());
|
|
243
|
+
|
|
244
|
+
const directResult = await directPoseidon2Hash(inputs);
|
|
245
|
+
|
|
246
|
+
if (wasmApi) {
|
|
247
|
+
const wasmResult = await wasmApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
248
|
+
expect(Buffer.from(wasmResult.hash)).toEqual(directResult.toBuffer());
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (nativeSocketApi) {
|
|
252
|
+
const nativeSocketResult = await nativeSocketApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
253
|
+
expect(Buffer.from(nativeSocketResult.hash)).toEqual(directResult.toBuffer());
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (nativeShmApi) {
|
|
257
|
+
const nativeShmResult = await nativeShmApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
258
|
+
expect(Buffer.from(nativeShmResult.hash)).toEqual(directResult.toBuffer());
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (nativeShmSyncApi) {
|
|
262
|
+
const nativeShmSyncResult = nativeShmSyncApi.poseidon2Hash({ inputs: inputs.map(fr => fr.toBuffer()) });
|
|
263
|
+
expect(Buffer.from(nativeShmSyncResult.hash)).toEqual(directResult.toBuffer());
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
});
|