@aztec/bb.js 0.0.1-alpha.6 → 0.0.1-fake-ceab37513c
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 +69 -33
- package/package.json +56 -41
- package/src/barretenberg/__snapshots__/pedersen.test.ts.snap +156 -0
- package/src/barretenberg/__snapshots__/poseidon.test.ts.snap +40 -0
- package/src/barretenberg/backend.ts +378 -0
- package/src/barretenberg/blake2s.test.ts +70 -0
- package/src/{barretenberg_api → barretenberg}/common.test.ts +7 -5
- package/src/barretenberg/index.ts +204 -0
- package/src/barretenberg/pedersen.test.ts +62 -0
- package/src/barretenberg/poseidon.test.ts +39 -0
- package/src/barretenberg_api/index.ts +1128 -383
- package/src/barretenberg_wasm/barretenberg_wasm_base/index.ts +138 -0
- package/src/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.ts +11 -0
- package/src/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.ts +13 -0
- package/src/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.ts +21 -0
- package/src/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.ts +19 -0
- package/src/{barretenberg_binder/heap_allocator_sync.ts → barretenberg_wasm/barretenberg_wasm_main/heap_allocator.ts} +20 -17
- package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +167 -0
- package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.ts +11 -0
- package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.ts +13 -0
- package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.ts +21 -0
- package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.ts +19 -0
- package/src/barretenberg_wasm/barretenberg_wasm_thread/index.ts +47 -0
- package/src/barretenberg_wasm/fetch_code/browser/barretenberg-threads.ts +3 -0
- package/src/barretenberg_wasm/fetch_code/browser/barretenberg.ts +3 -0
- package/src/barretenberg_wasm/fetch_code/browser/index.ts +34 -0
- package/src/barretenberg_wasm/fetch_code/index.ts +1 -0
- package/src/barretenberg_wasm/fetch_code/node/index.ts +34 -0
- package/src/barretenberg_wasm/fetch_code/wasm-module.d.ts +4 -0
- package/src/barretenberg_wasm/helpers/browser/index.ts +47 -0
- package/src/barretenberg_wasm/helpers/index.ts +1 -0
- package/src/barretenberg_wasm/{node → helpers/node}/index.ts +24 -15
- package/src/barretenberg_wasm/index.test.ts +45 -0
- package/src/barretenberg_wasm/index.ts +22 -1
- package/src/benchmark/index.ts +26 -0
- package/src/benchmark/timer.ts +45 -0
- package/src/bigint-array/index.ts +39 -17
- package/src/bindgen/index.ts +2 -2
- package/src/bindgen/mappings.ts +3 -2
- package/src/bindgen/typescript.ts +50 -25
- package/src/cbind/README.md +1 -0
- package/src/cbind/generate.ts +89 -0
- package/src/cbind/schema_compiler.ts +833 -0
- package/src/crs/browser/cached_net_crs.ts +41 -2
- package/src/crs/browser/index.ts +1 -1
- package/src/crs/index.ts +1 -1
- package/src/crs/net_crs.ts +114 -19
- package/src/crs/node/index.ts +98 -20
- package/src/index.html +1 -1
- package/src/index.ts +13 -5
- package/src/log/browser/index.ts +35 -0
- package/src/log/index.ts +1 -0
- package/src/log/node/index.ts +52 -0
- package/src/log/types.ts +6 -0
- package/src/main.ts +395 -185
- package/src/proof/index.ts +94 -0
- package/src/random/browser/index.ts +1 -1
- package/src/retry/index.ts +50 -0
- package/src/serialize/buffer_reader.ts +4 -1
- package/src/types/fields.ts +46 -18
- package/src/types/point.ts +4 -1
- package/dest/async_map/index.d.ts +0 -10
- package/dest/async_map/index.d.ts.map +0 -1
- package/dest/async_map/index.js +0 -16
- package/dest/barretenberg-threads.wasm +0 -0
- package/dest/barretenberg.wasm +0 -0
- package/dest/barretenberg_api/blake2s.test.d.ts +0 -2
- package/dest/barretenberg_api/blake2s.test.d.ts.map +0 -1
- package/dest/barretenberg_api/blake2s.test.js +0 -30
- package/dest/barretenberg_api/common.test.d.ts +0 -2
- package/dest/barretenberg_api/common.test.d.ts.map +0 -1
- package/dest/barretenberg_api/common.test.js +0 -18
- package/dest/barretenberg_api/index.d.ts +0 -103
- package/dest/barretenberg_api/index.d.ts.map +0 -1
- package/dest/barretenberg_api/index.js +0 -379
- package/dest/barretenberg_api/pedersen.test.d.ts +0 -2
- package/dest/barretenberg_api/pedersen.test.d.ts.map +0 -1
- package/dest/barretenberg_api/pedersen.test.js +0 -69
- package/dest/barretenberg_api/schnorr.test.d.ts +0 -2
- package/dest/barretenberg_api/schnorr.test.d.ts.map +0 -1
- package/dest/barretenberg_api/schnorr.test.js +0 -113
- package/dest/barretenberg_binder/heap_allocator.d.ts +0 -22
- package/dest/barretenberg_binder/heap_allocator.d.ts.map +0 -1
- package/dest/barretenberg_binder/heap_allocator.js +0 -59
- package/dest/barretenberg_binder/heap_allocator_sync.d.ts +0 -22
- package/dest/barretenberg_binder/heap_allocator_sync.d.ts.map +0 -1
- package/dest/barretenberg_binder/heap_allocator_sync.js +0 -58
- package/dest/barretenberg_binder/index.d.ts +0 -32
- package/dest/barretenberg_binder/index.d.ts.map +0 -1
- package/dest/barretenberg_binder/index.js +0 -73
- package/dest/barretenberg_wasm/barretenberg_wasm.d.ts +0 -50
- package/dest/barretenberg_wasm/barretenberg_wasm.d.ts.map +0 -1
- package/dest/barretenberg_wasm/barretenberg_wasm.js +0 -212
- package/dest/barretenberg_wasm/barretenberg_wasm.test.d.ts +0 -2
- package/dest/barretenberg_wasm/barretenberg_wasm.test.d.ts.map +0 -1
- package/dest/barretenberg_wasm/barretenberg_wasm.test.js +0 -43
- package/dest/barretenberg_wasm/browser/index.d.ts +0 -8
- package/dest/barretenberg_wasm/browser/index.d.ts.map +0 -1
- package/dest/barretenberg_wasm/browser/index.js +0 -26
- package/dest/barretenberg_wasm/browser/worker.d.ts +0 -2
- package/dest/barretenberg_wasm/browser/worker.d.ts.map +0 -1
- package/dest/barretenberg_wasm/browser/worker.js +0 -11
- package/dest/barretenberg_wasm/index.d.ts +0 -2
- package/dest/barretenberg_wasm/index.d.ts.map +0 -1
- package/dest/barretenberg_wasm/index.js +0 -2
- package/dest/barretenberg_wasm/node/index.d.ts +0 -17
- package/dest/barretenberg_wasm/node/index.d.ts.map +0 -1
- package/dest/barretenberg_wasm/node/index.js +0 -40
- package/dest/barretenberg_wasm/node/node_endpoint.d.ts +0 -8
- package/dest/barretenberg_wasm/node/node_endpoint.d.ts.map +0 -1
- package/dest/barretenberg_wasm/node/node_endpoint.js +0 -28
- package/dest/barretenberg_wasm/node/worker.d.ts +0 -2
- package/dest/barretenberg_wasm/node/worker.d.ts.map +0 -1
- package/dest/barretenberg_wasm/node/worker.js +0 -9
- package/dest/barretenberg_wasm.js +0 -2
- package/dest/barretenberg_wasm.js.LICENSE.txt +0 -5
- package/dest/bigint-array/index.d.ts +0 -3
- package/dest/bigint-array/index.d.ts.map +0 -1
- package/dest/bigint-array/index.js +0 -21
- package/dest/bindgen/function_declaration.d.ts +0 -11
- package/dest/bindgen/function_declaration.d.ts.map +0 -1
- package/dest/bindgen/function_declaration.js +0 -2
- package/dest/bindgen/index.d.ts +0 -2
- package/dest/bindgen/index.d.ts.map +0 -1
- package/dest/bindgen/index.js +0 -15
- package/dest/bindgen/mappings.d.ts +0 -4
- package/dest/bindgen/mappings.d.ts.map +0 -1
- package/dest/bindgen/mappings.js +0 -63
- package/dest/bindgen/rust.d.ts +0 -2
- package/dest/bindgen/rust.d.ts.map +0 -1
- package/dest/bindgen/rust.js +0 -43
- package/dest/bindgen/to_camel_case.d.ts +0 -2
- package/dest/bindgen/to_camel_case.d.ts.map +0 -1
- package/dest/bindgen/to_camel_case.js +0 -11
- package/dest/bindgen/typescript.d.ts +0 -2
- package/dest/bindgen/typescript.d.ts.map +0 -1
- package/dest/bindgen/typescript.js +0 -80
- package/dest/crs/browser/cached_net_crs.d.ts +0 -25
- package/dest/crs/browser/cached_net_crs.d.ts.map +0 -1
- package/dest/crs/browser/cached_net_crs.js +0 -54
- package/dest/crs/browser/index.d.ts +0 -2
- package/dest/crs/browser/index.d.ts.map +0 -1
- package/dest/crs/browser/index.js +0 -2
- package/dest/crs/index.d.ts +0 -2
- package/dest/crs/index.d.ts.map +0 -1
- package/dest/crs/index.js +0 -2
- package/dest/crs/net_crs.d.ts +0 -36
- package/dest/crs/net_crs.d.ts.map +0 -1
- package/dest/crs/net_crs.js +0 -59
- package/dest/crs/node/file_crs.d.ts +0 -37
- package/dest/crs/node/file_crs.d.ts.map +0 -1
- package/dest/crs/node/file_crs.js +0 -51
- package/dest/crs/node/index.d.ts +0 -31
- package/dest/crs/node/index.d.ts.map +0 -1
- package/dest/crs/node/index.js +0 -41
- package/dest/examples/simple.rawtest.d.ts +0 -2
- package/dest/examples/simple.rawtest.d.ts.map +0 -1
- package/dest/examples/simple.rawtest.js +0 -29
- package/dest/examples/simple.test.d.ts +0 -2
- package/dest/examples/simple.test.d.ts.map +0 -1
- package/dest/examples/simple.test.js +0 -22
- package/dest/factory/index.d.ts +0 -21
- package/dest/factory/index.d.ts.map +0 -1
- package/dest/factory/index.js +0 -34
- package/dest/index.d.ts +0 -6
- package/dest/index.d.ts.map +0 -1
- package/dest/index.html +0 -1
- package/dest/index.js +0 -6
- package/dest/main.d.ts +0 -10
- package/dest/main.d.ts.map +0 -1
- package/dest/main.js +0 -280
- package/dest/random/browser/index.d.ts +0 -2
- package/dest/random/browser/index.d.ts.map +0 -1
- package/dest/random/browser/index.js +0 -31
- package/dest/random/index.d.ts +0 -2
- package/dest/random/index.d.ts.map +0 -1
- package/dest/random/index.js +0 -2
- package/dest/random/node/index.d.ts +0 -2
- package/dest/random/node/index.d.ts.map +0 -1
- package/dest/random/node/index.js +0 -5
- package/dest/serialize/buffer_reader.d.ts +0 -28
- package/dest/serialize/buffer_reader.d.ts.map +0 -1
- package/dest/serialize/buffer_reader.js +0 -66
- package/dest/serialize/index.d.ts +0 -4
- package/dest/serialize/index.d.ts.map +0 -1
- package/dest/serialize/index.js +0 -4
- package/dest/serialize/output_type.d.ts +0 -11
- package/dest/serialize/output_type.d.ts.map +0 -1
- package/dest/serialize/output_type.js +0 -44
- package/dest/serialize/serialize.d.ts +0 -53
- package/dest/serialize/serialize.d.ts.map +0 -1
- package/dest/serialize/serialize.js +0 -139
- package/dest/simple_test.js +0 -2
- package/dest/simple_test.js.LICENSE.txt +0 -14
- package/dest/types/fields.d.ts +0 -33
- package/dest/types/fields.d.ts.map +0 -1
- package/dest/types/fields.js +0 -86
- package/dest/types/fixed_size_buffer.d.ts +0 -26
- package/dest/types/fixed_size_buffer.d.ts.map +0 -1
- package/dest/types/fixed_size_buffer.js +0 -54
- package/dest/types/index.d.ts +0 -6
- package/dest/types/index.d.ts.map +0 -1
- package/dest/types/index.js +0 -6
- package/dest/types/point.d.ts +0 -17
- package/dest/types/point.d.ts.map +0 -1
- package/dest/types/point.js +0 -32
- package/dest/types/ptr.d.ts +0 -13
- package/dest/types/ptr.d.ts.map +0 -1
- package/dest/types/ptr.js +0 -20
- package/dest/types/raw_buffer.d.ts +0 -3
- package/dest/types/raw_buffer.d.ts.map +0 -1
- package/dest/types/raw_buffer.js +0 -5
- package/src/barretenberg_api/blake2s.test.ts +0 -39
- package/src/barretenberg_api/pedersen.test.ts +0 -84
- package/src/barretenberg_api/schnorr.test.ts +0 -169
- package/src/barretenberg_binder/heap_allocator.ts +0 -62
- package/src/barretenberg_binder/index.ts +0 -76
- package/src/barretenberg_wasm/barretenberg_wasm.test.ts +0 -52
- package/src/barretenberg_wasm/barretenberg_wasm.ts +0 -246
- package/src/barretenberg_wasm/browser/index.ts +0 -32
- package/src/barretenberg_wasm/browser/worker.ts +0 -13
- package/src/barretenberg_wasm/node/worker.ts +0 -10
- package/src/crs/node/file_crs.ts +0 -60
- package/src/examples/simple.rawtest.ts +0 -37
- package/src/examples/simple.test.ts +0 -27
- package/src/factory/index.ts +0 -36
- /package/src/barretenberg_wasm/{node → helpers/node}/node_endpoint.ts +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { wrap } from 'comlink';
|
|
2
|
+
|
|
3
|
+
export function getSharedMemoryAvailable() {
|
|
4
|
+
const globalScope = typeof window !== 'undefined' ? window : globalThis;
|
|
5
|
+
return typeof SharedArrayBuffer !== 'undefined' && globalScope.crossOriginIsolated;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function getRemoteBarretenbergWasm<T>(worker: Worker) {
|
|
9
|
+
return wrap<T>(worker);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function getNumCpu() {
|
|
13
|
+
return navigator.hardwareConcurrency;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function threadLogger(): ((msg: string) => void) | undefined {
|
|
17
|
+
return console.log;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function killSelf() {
|
|
21
|
+
self.close();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function getAvailableThreads(logger: (msg: string) => void): number {
|
|
25
|
+
if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) {
|
|
26
|
+
return navigator.hardwareConcurrency;
|
|
27
|
+
} else {
|
|
28
|
+
logger(`Could not detect environment to query number of threads. Falling back to one thread.`);
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Solution to async initialization of workers, taken from
|
|
34
|
+
// https://github.com/GoogleChromeLabs/comlink/issues/635#issuecomment-1598913044
|
|
35
|
+
|
|
36
|
+
/** The message expected by the `readinessListener`. */
|
|
37
|
+
export const Ready = { ready: true };
|
|
38
|
+
|
|
39
|
+
/** Listen for the readiness message from the Worker and call the `callback` once. */
|
|
40
|
+
export function readinessListener(worker: Worker, callback: () => void) {
|
|
41
|
+
worker.addEventListener('message', function ready(event: MessageEvent<typeof Ready>) {
|
|
42
|
+
if (!!event.data && event.data.ready === true) {
|
|
43
|
+
worker.removeEventListener('message', ready);
|
|
44
|
+
callback();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './node/index.js';
|
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
import { Worker } from 'worker_threads';
|
|
2
|
-
import { dirname } from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { readFile } from 'fs/promises';
|
|
5
2
|
import os from 'os';
|
|
6
|
-
import { type BarretenbergWasm, type BarretenbergWasmWorker } from '../barretenberg_wasm.js';
|
|
7
3
|
import { wrap } from 'comlink';
|
|
8
4
|
import { nodeEndpoint } from './node_endpoint.js';
|
|
9
5
|
import { writeSync } from 'fs';
|
|
10
6
|
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
return await readFile(__dirname + '/../../' + name);
|
|
7
|
+
export function getSharedMemoryAvailable() {
|
|
8
|
+
return true;
|
|
14
9
|
}
|
|
15
10
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export function getRemoteBarretenbergWasm(worker: Worker)
|
|
22
|
-
return wrap<
|
|
11
|
+
/**
|
|
12
|
+
* Comlink allows you to produce a Proxy to the worker, enabling you to call methods as if it were a normal class.
|
|
13
|
+
* Note we give it the type information it needs so the returned Proxy object looks like that type.
|
|
14
|
+
* Node has a different implementation, needing this nodeEndpoint wrapper, hence this function exists here.
|
|
15
|
+
*/
|
|
16
|
+
export function getRemoteBarretenbergWasm<T>(worker: Worker) {
|
|
17
|
+
return wrap<T>(nodeEndpoint(worker));
|
|
23
18
|
}
|
|
24
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Returns number of cpus as reported by the system, unless overriden by HARDWARE_CONCURRENCY env var.
|
|
22
|
+
*/
|
|
25
23
|
export function getNumCpu() {
|
|
26
|
-
return os.cpus().length;
|
|
24
|
+
return +process.env.HARDWARE_CONCURRENCY! || os.cpus().length;
|
|
27
25
|
}
|
|
28
26
|
|
|
29
27
|
/**
|
|
@@ -44,3 +42,14 @@ export function killSelf(): never {
|
|
|
44
42
|
process.kill(process.pid);
|
|
45
43
|
throw new Error();
|
|
46
44
|
}
|
|
45
|
+
|
|
46
|
+
export function getAvailableThreads(logger: (msg: string) => void): number {
|
|
47
|
+
try {
|
|
48
|
+
return os.cpus().length;
|
|
49
|
+
} catch (e: any) {
|
|
50
|
+
logger(
|
|
51
|
+
`Could not detect environment to query number of threads. Falling back to one thread. Error: ${e.message ?? e}`,
|
|
52
|
+
);
|
|
53
|
+
return 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from './barretenberg_wasm_main/index.js';
|
|
2
|
+
import { Barretenberg } from '../index.js';
|
|
3
|
+
|
|
4
|
+
describe('barretenberg wasm', () => {
|
|
5
|
+
let api: Barretenberg;
|
|
6
|
+
let wasm: BarretenbergWasmMainWorker;
|
|
7
|
+
|
|
8
|
+
beforeAll(async () => {
|
|
9
|
+
api = await Barretenberg.new({ threads: 2 });
|
|
10
|
+
wasm = api.getWasm();
|
|
11
|
+
}, 20000);
|
|
12
|
+
|
|
13
|
+
afterAll(async () => {
|
|
14
|
+
await api.destroy();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should new malloc, transfer and slice mem', async () => {
|
|
18
|
+
const length = 1024;
|
|
19
|
+
const ptr = await wasm.call('bbmalloc', length);
|
|
20
|
+
const buf = Buffer.alloc(length, 128);
|
|
21
|
+
await wasm.writeMemory(ptr, Uint8Array.from(buf));
|
|
22
|
+
const result = Buffer.from(await wasm.getMemorySlice(ptr, ptr + length));
|
|
23
|
+
await wasm.call('bbfree', ptr);
|
|
24
|
+
expect(result).toStrictEqual(buf);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('test abort', async () => {
|
|
28
|
+
await expect(() => wasm.call('test_abort')).rejects.toThrow();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('test c/c++ stdout/stderr', async () => {
|
|
32
|
+
// We're checking we don't crash, but you can manually confirm you see log lines handled by logstr.
|
|
33
|
+
await wasm.call('test_stdout_stderr');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should new malloc, transfer and slice mem', async () => {
|
|
37
|
+
const length = 1024;
|
|
38
|
+
const ptr = await wasm.call('bbmalloc', length);
|
|
39
|
+
const buf = Buffer.alloc(length, 128);
|
|
40
|
+
await wasm.writeMemory(ptr, Uint8Array.from(buf));
|
|
41
|
+
const result = Buffer.from(await wasm.getMemorySlice(ptr, ptr + length));
|
|
42
|
+
await wasm.call('bbfree', ptr);
|
|
43
|
+
expect(result).toStrictEqual(buf);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -1 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
import { getSharedMemoryAvailable, getAvailableThreads } from './helpers/node/index.js';
|
|
2
|
+
import { fetchCode } from './fetch_code/index.js';
|
|
3
|
+
import { createDebugLogger } from '../log/index.js';
|
|
4
|
+
|
|
5
|
+
export async function fetchModuleAndThreads(
|
|
6
|
+
desiredThreads = 32,
|
|
7
|
+
wasmPath?: string,
|
|
8
|
+
logger: (msg: string) => void = createDebugLogger('fetch_mat'),
|
|
9
|
+
) {
|
|
10
|
+
const shared = getSharedMemoryAvailable();
|
|
11
|
+
|
|
12
|
+
const availableThreads = shared ? await getAvailableThreads(logger) : 1;
|
|
13
|
+
// We limit the number of threads to 32 as we do not benefit from greater numbers.
|
|
14
|
+
const limitedThreads = Math.min(desiredThreads, availableThreads, 32);
|
|
15
|
+
|
|
16
|
+
logger(`Fetching bb wasm from ${wasmPath ?? 'default location'}`);
|
|
17
|
+
const code = await fetchCode(shared, wasmPath);
|
|
18
|
+
logger(`Compiling bb wasm of ${code.byteLength} bytes`);
|
|
19
|
+
const module = await WebAssembly.compile(code);
|
|
20
|
+
logger('Compilation of bb wasm complete');
|
|
21
|
+
return { module, threads: limitedThreads };
|
|
22
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
export * from './timer.js';
|
|
3
|
+
|
|
4
|
+
const bfd = (() => {
|
|
5
|
+
const bfdStr = process.env.BENCHMARK_FD;
|
|
6
|
+
const bfd = bfdStr ? parseInt(bfdStr) : -1;
|
|
7
|
+
if (bfd >= 0 && !fs.fstatSync(bfd)) {
|
|
8
|
+
throw new Error('fd is not open. Did you redirect in your shell?');
|
|
9
|
+
}
|
|
10
|
+
return bfd;
|
|
11
|
+
})();
|
|
12
|
+
|
|
13
|
+
export function writeBenchmark<T>(name: string, value: T, labels: Record<string, any> = {}) {
|
|
14
|
+
if (bfd === -1) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const data = {
|
|
18
|
+
timestamp: new Date().toISOString(),
|
|
19
|
+
name,
|
|
20
|
+
type: typeof value,
|
|
21
|
+
value,
|
|
22
|
+
...labels,
|
|
23
|
+
};
|
|
24
|
+
const jsonl = JSON.stringify(data) + '\n';
|
|
25
|
+
fs.writeSync(bfd, jsonl);
|
|
26
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timer class to measure time intervals in milliseconds and seconds.
|
|
3
|
+
* Upon instantiation, it stores the current timestamp as the starting point.
|
|
4
|
+
* The 'ms()' method returns the elapsed time in milliseconds,
|
|
5
|
+
* while the 's()' method returns the elapsed time in seconds.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const timer = new Timer();
|
|
9
|
+
* setTimeout(() =\> \{
|
|
10
|
+
* console.log(`Elapsed time: ${timer.ms()} ms`);
|
|
11
|
+
* \}, 1000);
|
|
12
|
+
*/
|
|
13
|
+
export class Timer {
|
|
14
|
+
private start: number;
|
|
15
|
+
|
|
16
|
+
constructor() {
|
|
17
|
+
this.start = performance.now();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public us() {
|
|
21
|
+
return this.ms() * 1000;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Returns the elapsed time in milliseconds since the Timer instance was created.
|
|
26
|
+
* Provides a simple and convenient way to measure the time duration between two events
|
|
27
|
+
* or monitor performance of specific code sections.
|
|
28
|
+
*
|
|
29
|
+
* @returns The elapsed time in milliseconds.
|
|
30
|
+
*/
|
|
31
|
+
public ms() {
|
|
32
|
+
return performance.now() - this.start;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Returns the time elapsed since the Timer instance was created, in seconds.
|
|
37
|
+
* The value is calculated by subtracting the initial start time from the current time
|
|
38
|
+
* and dividing the result by 1000 to convert milliseconds to seconds.
|
|
39
|
+
*
|
|
40
|
+
* @returns The elapsed time in seconds.
|
|
41
|
+
*/
|
|
42
|
+
public s() {
|
|
43
|
+
return this.ms() / 1000;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -1,21 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Convert a 32-byte BE Buffer to a BigInt.
|
|
3
|
+
*/
|
|
4
|
+
export function buffer32BytesToBigIntBE(buf: Buffer): bigint {
|
|
5
|
+
return (
|
|
6
|
+
(buf.readBigUInt64BE(0) << 192n) +
|
|
7
|
+
(buf.readBigUInt64BE(8) << 128n) +
|
|
8
|
+
(buf.readBigUInt64BE(16) << 64n) +
|
|
9
|
+
buf.readBigUInt64BE(24)
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Convert a BE Uint8Array to a BigInt.
|
|
15
|
+
*/
|
|
16
|
+
export function uint8ArrayToBigIntBE(bytes: Uint8Array): bigint {
|
|
17
|
+
const buffer = Buffer.from(bytes);
|
|
18
|
+
return buffer32BytesToBigIntBE(buffer);
|
|
11
19
|
}
|
|
12
20
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Convert a BigInt to a 32-byte BE Buffer.
|
|
23
|
+
*/
|
|
24
|
+
export function bigIntToBufferBE(value: bigint, byteLength = 32): Buffer {
|
|
25
|
+
if (byteLength != 32) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`Only 32 bytes supported for conversion from bigint to buffer, attempted byte length: ${byteLength}`,
|
|
28
|
+
);
|
|
19
29
|
}
|
|
20
|
-
|
|
30
|
+
const buf = Buffer.alloc(byteLength);
|
|
31
|
+
buf.writeBigUInt64BE(value >> 192n, 0);
|
|
32
|
+
buf.writeBigUInt64BE((value >> 128n) & 0xffffffffffffffffn, 8);
|
|
33
|
+
buf.writeBigUInt64BE((value >> 64n) & 0xffffffffffffffffn, 16);
|
|
34
|
+
buf.writeBigUInt64BE(value & 0xffffffffffffffffn, 24);
|
|
35
|
+
return buf;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Convert a BigInt to a 32-byte BE Uint8Array.
|
|
40
|
+
*/
|
|
41
|
+
export function bigIntToUint8ArrayBE(value: bigint, byteLength = 32): Uint8Array {
|
|
42
|
+
return new Uint8Array(bigIntToBufferBE(value, byteLength));
|
|
21
43
|
}
|
package/src/bindgen/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { generateRustCode } from './rust.js';
|
|
2
2
|
import { generateTypeScriptCode } from './typescript.js';
|
|
3
3
|
|
|
4
|
-
const [, ,
|
|
4
|
+
const [, , exp = '../exports.json', lang = 'ts'] = process.argv;
|
|
5
5
|
|
|
6
6
|
function generateCode(exports: string, lang: string) {
|
|
7
7
|
switch (lang) {
|
|
@@ -14,4 +14,4 @@ function generateCode(exports: string, lang: string) {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
console.log(generateCode(
|
|
17
|
+
console.log(generateCode(exp, lang));
|
package/src/bindgen/mappings.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
const typeMap: { [key: string]: string } = {
|
|
3
3
|
in_ptr: 'Ptr',
|
|
4
4
|
out_ptr: 'Ptr',
|
|
5
|
-
'
|
|
6
|
-
'
|
|
5
|
+
'bb::fr::in_buf': 'Fr',
|
|
6
|
+
'bb::fr::vec_in_buf': 'Fr[]',
|
|
7
7
|
'fr::in_buf': 'Fr',
|
|
8
8
|
'fr::out_buf': 'Fr',
|
|
9
9
|
'fr::vec_in_buf': 'Fr[]',
|
|
@@ -13,6 +13,7 @@ const typeMap: { [key: string]: string } = {
|
|
|
13
13
|
'fq::vec_in_buf': 'Fq[]',
|
|
14
14
|
'fq::vec_out_buf': 'Fq[]',
|
|
15
15
|
'const uint8_t *': 'Uint8Array',
|
|
16
|
+
uint8_vec_vec_in_buf: 'Uint8Array[]',
|
|
16
17
|
'uint8_t **': 'Uint8Array',
|
|
17
18
|
in_str_buf: 'string',
|
|
18
19
|
out_str_buf: 'string',
|
|
@@ -9,37 +9,52 @@ export function generateTypeScriptCode(filename: string) {
|
|
|
9
9
|
|
|
10
10
|
let output = `// WARNING: FILE CODE GENERATED BY BINDGEN UTILITY. DO NOT EDIT!
|
|
11
11
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
12
|
-
import {
|
|
13
|
-
import { BufferDeserializer, NumberDeserializer, VectorDeserializer, BoolDeserializer, StringDeserializer } from '../serialize/index.js';
|
|
14
|
-
import { Fr,
|
|
12
|
+
import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
|
|
13
|
+
import { BufferDeserializer, NumberDeserializer, VectorDeserializer, BoolDeserializer, StringDeserializer, serializeBufferable, OutputType } from '../serialize/index.js';
|
|
14
|
+
import { Fr, Point, Buffer32, Ptr } from '../types/index.js';
|
|
15
15
|
|
|
16
|
+
`;
|
|
17
|
+
|
|
18
|
+
output += generateClass(functionDeclarations);
|
|
19
|
+
output += generateSyncClass(functionDeclarations);
|
|
20
|
+
|
|
21
|
+
return output;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function generateClass(functionDeclarations: FunctionDeclaration[]) {
|
|
25
|
+
let output = `
|
|
16
26
|
export class BarretenbergApi {
|
|
17
|
-
constructor(
|
|
27
|
+
constructor(protected wasm: BarretenbergWasmMainWorker) {}
|
|
18
28
|
|
|
19
|
-
async destroy() {
|
|
20
|
-
await this.binder.wasm.destroy();
|
|
21
|
-
}
|
|
22
29
|
`;
|
|
23
30
|
|
|
24
31
|
for (const { functionName, inArgs, outArgs } of functionDeclarations) {
|
|
25
32
|
try {
|
|
26
33
|
const parameters = inArgs.map(({ name, type }) => `${toCamelCase(name)}: ${mapType(type)}`).join(', ');
|
|
27
|
-
const inArgsVar = `[${inArgs
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
const inArgsVar = `const inArgs = [${inArgs
|
|
35
|
+
.map(arg => toCamelCase(arg.name))
|
|
36
|
+
.join(', ')}].map(serializeBufferable);`;
|
|
37
|
+
const outTypesVar = `const outTypes: OutputType[] = [${outArgs
|
|
38
|
+
.map(arg => mapDeserializer(arg.type))
|
|
39
|
+
.join(', ')}];`;
|
|
40
|
+
const wasmCall = `const result = await this.wasm.callWasmExport('${functionName}', inArgs, outTypes.map(t=>t.SIZE_IN_BYTES));`;
|
|
41
|
+
const outVar = `const out = result.map((r, i) => outTypes[i].fromBuffer(r));`;
|
|
30
42
|
|
|
31
43
|
const n = outArgs.length;
|
|
32
|
-
const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return
|
|
44
|
+
const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return out[0];' : 'return out as any;';
|
|
33
45
|
const returnType =
|
|
34
46
|
outArgs.length === 0
|
|
35
47
|
? 'void'
|
|
36
48
|
: outArgs.length === 1
|
|
37
|
-
|
|
38
|
-
|
|
49
|
+
? `${mapType(outArgs[0].type)}`
|
|
50
|
+
: `[${outArgs.map(a => mapType(a.type)).join(', ')}]`;
|
|
39
51
|
|
|
40
52
|
output += `
|
|
41
53
|
async ${toCamelCase(functionName)}(${parameters}): Promise<${returnType}> {
|
|
54
|
+
${inArgsVar}
|
|
55
|
+
${outTypesVar}
|
|
42
56
|
${wasmCall}
|
|
57
|
+
${outVar}
|
|
43
58
|
${returnStmt}
|
|
44
59
|
}
|
|
45
60
|
`;
|
|
@@ -48,35 +63,45 @@ export class BarretenbergApi {
|
|
|
48
63
|
}
|
|
49
64
|
}
|
|
50
65
|
|
|
51
|
-
output += `}
|
|
66
|
+
output += `}`;
|
|
52
67
|
|
|
68
|
+
return output;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function generateSyncClass(functionDeclarations: FunctionDeclaration[]) {
|
|
72
|
+
let output = `
|
|
53
73
|
export class BarretenbergApiSync {
|
|
54
|
-
constructor(
|
|
74
|
+
constructor(protected wasm: BarretenbergWasmMain) {}
|
|
55
75
|
|
|
56
|
-
async destroy() {
|
|
57
|
-
await this.binder.wasm.destroy();
|
|
58
|
-
}
|
|
59
76
|
`;
|
|
60
77
|
|
|
61
78
|
for (const { functionName, inArgs, outArgs } of functionDeclarations) {
|
|
62
79
|
try {
|
|
63
80
|
const parameters = inArgs.map(({ name, type }) => `${toCamelCase(name)}: ${mapType(type)}`).join(', ');
|
|
64
|
-
const inArgsVar = `[${inArgs
|
|
65
|
-
|
|
66
|
-
|
|
81
|
+
const inArgsVar = `const inArgs = [${inArgs
|
|
82
|
+
.map(arg => toCamelCase(arg.name))
|
|
83
|
+
.join(', ')}].map(serializeBufferable);`;
|
|
84
|
+
const outTypesVar = `const outTypes: OutputType[] = [${outArgs
|
|
85
|
+
.map(arg => mapDeserializer(arg.type))
|
|
86
|
+
.join(', ')}];`;
|
|
87
|
+
const wasmCall = `const result = this.wasm.callWasmExport('${functionName}', inArgs, outTypes.map(t=>t.SIZE_IN_BYTES));`;
|
|
88
|
+
const outVar = `const out = result.map((r, i) => outTypes[i].fromBuffer(r));`;
|
|
67
89
|
|
|
68
90
|
const n = outArgs.length;
|
|
69
|
-
const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return
|
|
91
|
+
const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return out[0];' : 'return out as any;';
|
|
70
92
|
const returnType =
|
|
71
93
|
outArgs.length === 0
|
|
72
94
|
? 'void'
|
|
73
95
|
: outArgs.length === 1
|
|
74
|
-
|
|
75
|
-
|
|
96
|
+
? `${mapType(outArgs[0].type)}`
|
|
97
|
+
: `[${outArgs.map(a => mapType(a.type)).join(', ')}]`;
|
|
76
98
|
|
|
77
99
|
output += `
|
|
78
100
|
${toCamelCase(functionName)}(${parameters}): ${returnType} {
|
|
101
|
+
${inArgsVar}
|
|
102
|
+
${outTypesVar}
|
|
79
103
|
${wasmCall}
|
|
104
|
+
${outVar}
|
|
80
105
|
${returnStmt}
|
|
81
106
|
}
|
|
82
107
|
`;
|
|
@@ -85,7 +110,7 @@ export class BarretenbergApiSync {
|
|
|
85
110
|
}
|
|
86
111
|
}
|
|
87
112
|
|
|
88
|
-
output +=
|
|
113
|
+
output += `}`;
|
|
89
114
|
|
|
90
115
|
return output;
|
|
91
116
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Derive bindings from the reported scheme of msgpack from bb. Currently redundant with bindgen, until that is supplanted.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate TypeScript bindings from msgpack schema
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { writeFileSync, mkdirSync } from 'fs';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { exec } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import {
|
|
11
|
+
createSharedTypesCompiler,
|
|
12
|
+
createSyncApiCompiler,
|
|
13
|
+
createAsyncApiCompiler,
|
|
14
|
+
createNativeApiCompiler,
|
|
15
|
+
type SchemaCompiler,
|
|
16
|
+
} from './schema_compiler.js';
|
|
17
|
+
|
|
18
|
+
const execAsync = promisify(exec);
|
|
19
|
+
|
|
20
|
+
interface GeneratorConfig {
|
|
21
|
+
name: string;
|
|
22
|
+
outputFile: string;
|
|
23
|
+
createCompiler: () => SchemaCompiler;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const GENERATORS: GeneratorConfig[] = [
|
|
27
|
+
{
|
|
28
|
+
name: 'Shared types',
|
|
29
|
+
outputFile: 'generated/api_types.ts',
|
|
30
|
+
createCompiler: createSharedTypesCompiler,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Sync API',
|
|
34
|
+
outputFile: 'generated/sync.ts',
|
|
35
|
+
createCompiler: createSyncApiCompiler,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Async API',
|
|
39
|
+
outputFile: 'generated/async.ts',
|
|
40
|
+
createCompiler: createAsyncApiCompiler,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Native API',
|
|
44
|
+
outputFile: 'generated/native.ts',
|
|
45
|
+
createCompiler: createNativeApiCompiler,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
// @ts-ignore
|
|
50
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
51
|
+
|
|
52
|
+
async function generate() {
|
|
53
|
+
const bbBuildPath = process.env.BB_BINARY_PATH || join(__dirname, '../../../cpp/build/bin/bb');
|
|
54
|
+
|
|
55
|
+
// Get schema from bb
|
|
56
|
+
console.log('Fetching msgpack schema from bb...');
|
|
57
|
+
const { stdout } = await execAsync(`${bbBuildPath} msgpack schema`);
|
|
58
|
+
const schema = JSON.parse(stdout.trim());
|
|
59
|
+
|
|
60
|
+
if (!schema.commands || !schema.responses) {
|
|
61
|
+
throw new Error('Invalid schema: missing commands or responses');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
console.log('Generating TypeScript bindings...\n');
|
|
65
|
+
|
|
66
|
+
// Ensure output directory exists
|
|
67
|
+
const outputDir = join(__dirname, 'generated');
|
|
68
|
+
mkdirSync(outputDir, { recursive: true });
|
|
69
|
+
|
|
70
|
+
// Generate each output file
|
|
71
|
+
for (const config of GENERATORS) {
|
|
72
|
+
const compiler = config.createCompiler();
|
|
73
|
+
compiler.processApiSchema(schema.commands, schema.responses);
|
|
74
|
+
|
|
75
|
+
const outputPath = join(__dirname, config.outputFile);
|
|
76
|
+
const content = compiler.compile();
|
|
77
|
+
writeFileSync(outputPath, content);
|
|
78
|
+
|
|
79
|
+
console.log(`✓ ${config.name}: ${outputPath}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
console.log('\nGeneration complete!');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Run the generator
|
|
86
|
+
generate().catch(error => {
|
|
87
|
+
console.error('Generation failed:', error);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
});
|