@aztec/bb.js 0.0.0-devnet → 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.
- package/README.md +10 -2
- package/dest/browser/522.6386c00ebfb22619e11b.js +3 -0
- package/dest/browser/barretenberg/backend.d.ts +7 -2
- package/dest/browser/barretenberg/backend.d.ts.map +1 -1
- package/dest/browser/barretenberg/index.d.ts +6 -2
- package/dest/browser/barretenberg/index.d.ts.map +1 -1
- package/dest/browser/barretenberg-threads.js +32 -0
- package/dest/browser/barretenberg.js +32 -0
- package/dest/browser/barretenberg_api/index.d.ts +5 -2
- package/dest/browser/barretenberg_api/index.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +1 -1
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts +3 -0
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts.map +1 -0
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts +3 -0
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts.map +1 -0
- package/dest/browser/barretenberg_wasm/fetch_code/browser/index.d.ts +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/node/index.d.ts +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -1
- package/dest/browser/barretenberg_wasm/index.d.ts +2 -2
- package/dest/browser/barretenberg_wasm/index.d.ts.map +1 -1
- package/dest/browser/bigint-array/index.d.ts +17 -2
- package/dest/browser/bigint-array/index.d.ts.map +1 -1
- package/dest/browser/crs/net_crs.d.ts.map +1 -1
- package/dest/browser/crs/node/index.d.ts +6 -4
- package/dest/browser/crs/node/index.d.ts.map +1 -1
- package/dest/browser/index.d.ts.map +1 -1
- package/dest/browser/index.js +10583 -16082
- package/dest/browser/index.js.LICENSE.txt +16 -0
- package/dest/browser/main.worker.worker.js.LICENSE.txt +5 -0
- package/dest/browser/proof/index.d.ts +10 -0
- package/dest/browser/proof/index.d.ts.map +1 -1
- package/dest/browser/retry/index.d.ts +26 -0
- package/dest/browser/retry/index.d.ts.map +1 -0
- package/dest/browser/thread.worker.worker.js.LICENSE.txt +5 -0
- package/dest/browser/thread.worker.worker.worker.js.LICENSE.txt +5 -0
- package/dest/browser/types/fields.d.ts +6 -5
- package/dest/browser/types/fields.d.ts.map +1 -1
- package/dest/node/barretenberg/__snapshots__/pedersen.test.js.snap +156 -0
- package/dest/node/barretenberg/__snapshots__/poseidon.test.js.snap +40 -0
- package/dest/node/barretenberg/backend.d.ts +7 -2
- package/dest/node/barretenberg/backend.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.js +54 -4
- package/dest/node/barretenberg/blake2s.test.js +2 -2
- package/dest/node/barretenberg/index.d.ts +6 -2
- package/dest/node/barretenberg/index.d.ts.map +1 -1
- package/dest/node/barretenberg/index.js +15 -20
- package/dest/node/barretenberg/pedersen.test.js +2 -2
- package/dest/node/barretenberg/poseidon.test.js +2 -2
- package/dest/node/barretenberg_api/index.d.ts +5 -2
- package/dest/node/barretenberg_api/index.d.ts.map +1 -1
- package/dest/node/barretenberg_api/index.js +32 -2
- package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.js +5 -6
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +1 -1
- 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 +16 -11
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +1 -1
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +7 -9
- package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts +3 -0
- package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts.map +1 -0
- package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +3 -0
- package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts +3 -0
- package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts.map +1 -0
- package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg.js +3 -0
- package/dest/node/barretenberg_wasm/fetch_code/browser/index.d.ts +1 -1
- package/dest/node/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/fetch_code/browser/index.js +31 -8
- package/dest/node/barretenberg_wasm/fetch_code/node/index.d.ts +1 -1
- package/dest/node/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/fetch_code/node/index.js +3 -3
- package/dest/node/barretenberg_wasm/index.d.ts +2 -2
- package/dest/node/barretenberg_wasm/index.d.ts.map +1 -1
- package/dest/node/barretenberg_wasm/index.js +12 -10
- package/dest/node/barretenberg_wasm/index.test.js +3 -3
- package/dest/node/bigint-array/index.d.ts +17 -2
- package/dest/node/bigint-array/index.d.ts.map +1 -1
- package/dest/node/bigint-array/index.js +34 -18
- package/dest/node/crs/net_crs.d.ts.map +1 -1
- package/dest/node/crs/net_crs.js +6 -5
- package/dest/node/crs/node/index.d.ts +6 -4
- package/dest/node/crs/node/index.d.ts.map +1 -1
- package/dest/node/crs/node/index.js +16 -13
- package/dest/node/examples/simple.test.js +2 -2
- package/dest/node/index.d.ts.map +1 -1
- package/dest/node/index.js +1 -1
- package/dest/node/main.d.ts.map +1 -1
- package/dest/node/main.js +57 -65
- package/dest/node/proof/index.d.ts +10 -0
- package/dest/node/proof/index.d.ts.map +1 -1
- package/dest/node/proof/index.js +1 -1
- package/dest/node/retry/index.d.ts +26 -0
- package/dest/node/retry/index.d.ts.map +1 -0
- package/dest/node/retry/index.js +50 -0
- package/dest/node/types/fields.d.ts +6 -5
- package/dest/node/types/fields.d.ts.map +1 -1
- package/dest/node/types/fields.js +15 -10
- package/dest/node-cjs/barretenberg/backend.d.ts +7 -2
- package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/backend.js +56 -5
- package/dest/node-cjs/barretenberg/blake2s.test.js +2 -2
- package/dest/node-cjs/barretenberg/index.d.ts +6 -2
- package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/index.js +15 -19
- package/dest/node-cjs/barretenberg/pedersen.test.js +2 -2
- package/dest/node-cjs/barretenberg/poseidon.test.js +2 -2
- package/dest/node-cjs/barretenberg_api/index.d.ts +5 -2
- package/dest/node-cjs/barretenberg_api/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_api/index.js +32 -2
- package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- 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 +5 -6
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +1 -1
- 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 +16 -11
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +1 -1
- 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 +7 -9
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts +3 -0
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts.map +1 -0
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +6 -0
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts +3 -0
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts.map +1 -0
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg.js +6 -0
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.d.ts +1 -1
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.js +31 -8
- package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.d.ts +1 -1
- package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.js +3 -3
- package/dest/node-cjs/barretenberg_wasm/index.d.ts +2 -2
- package/dest/node-cjs/barretenberg_wasm/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_wasm/index.js +12 -10
- package/dest/node-cjs/barretenberg_wasm/index.test.js +3 -3
- package/dest/node-cjs/bigint-array/index.d.ts +17 -2
- package/dest/node-cjs/bigint-array/index.d.ts.map +1 -1
- package/dest/node-cjs/bigint-array/index.js +39 -21
- package/dest/node-cjs/crs/net_crs.d.ts.map +1 -1
- package/dest/node-cjs/crs/net_crs.js +6 -5
- package/dest/node-cjs/crs/node/index.d.ts +6 -4
- package/dest/node-cjs/crs/node/index.d.ts.map +1 -1
- package/dest/node-cjs/crs/node/index.js +16 -13
- package/dest/node-cjs/examples/simple.test.js +2 -2
- package/dest/node-cjs/index.d.ts.map +1 -1
- package/dest/node-cjs/index.js +1 -1
- package/dest/node-cjs/main.d.ts.map +1 -1
- package/dest/node-cjs/main.js +57 -65
- package/dest/node-cjs/proof/index.d.ts +10 -0
- package/dest/node-cjs/proof/index.d.ts.map +1 -1
- package/dest/node-cjs/proof/index.js +1 -1
- package/dest/node-cjs/retry/index.d.ts +26 -0
- package/dest/node-cjs/retry/index.d.ts.map +1 -0
- package/dest/node-cjs/retry/index.js +56 -0
- package/dest/node-cjs/types/fields.d.ts +6 -5
- package/dest/node-cjs/types/fields.d.ts.map +1 -1
- package/dest/node-cjs/types/fields.js +14 -9
- package/package.json +5 -5
- package/src/barretenberg/backend.ts +79 -3
- package/src/barretenberg/blake2s.test.ts +1 -1
- package/src/barretenberg/index.ts +27 -21
- package/src/barretenberg/pedersen.test.ts +1 -1
- package/src/barretenberg/poseidon.test.ts +1 -1
- package/src/barretenberg_api/index.ts +49 -2
- package/src/barretenberg_wasm/barretenberg_wasm_base/index.ts +4 -6
- package/src/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.ts +14 -10
- package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +7 -10
- 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 +28 -7
- package/src/barretenberg_wasm/fetch_code/node/index.ts +2 -2
- package/src/barretenberg_wasm/index.test.ts +2 -2
- package/src/barretenberg_wasm/index.ts +22 -11
- package/src/bigint-array/index.ts +39 -17
- package/src/crs/net_crs.ts +18 -9
- package/src/crs/node/index.ts +31 -15
- package/src/examples/simple.test.ts +1 -1
- package/src/index.ts +1 -0
- package/src/main.ts +61 -70
- package/src/proof/index.ts +11 -0
- package/src/retry/index.ts +50 -0
- package/src/types/fields.ts +24 -13
- package/dest/browser/522.index.js +0 -10
- /package/src/barretenberg_wasm/fetch_code/{browser/wasm-module.d.ts → wasm-module.d.ts} +0 -0
|
@@ -15,17 +15,21 @@ export class HeapAllocator {
|
|
|
15
15
|
|
|
16
16
|
constructor(private wasm: BarretenbergWasmMain) {}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
return buffers.map(
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
getInputs(buffers: (Uint8Array | number)[]) {
|
|
19
|
+
return buffers.map(bufOrNum => {
|
|
20
|
+
if (typeof bufOrNum === 'object') {
|
|
21
|
+
if (bufOrNum.length <= this.inScratchRemaining) {
|
|
22
|
+
const ptr = (this.inScratchRemaining -= bufOrNum.length);
|
|
23
|
+
this.wasm.writeMemory(ptr, bufOrNum);
|
|
24
|
+
return ptr;
|
|
25
|
+
} else {
|
|
26
|
+
const ptr = this.wasm.call('bbmalloc', bufOrNum.length);
|
|
27
|
+
this.wasm.writeMemory(ptr, bufOrNum);
|
|
28
|
+
this.allocs.push(ptr);
|
|
29
|
+
return ptr;
|
|
30
|
+
}
|
|
24
31
|
} else {
|
|
25
|
-
|
|
26
|
-
this.wasm.writeMemory(ptr, buf);
|
|
27
|
-
this.allocs.push(ptr);
|
|
28
|
-
return ptr;
|
|
32
|
+
return bufOrNum;
|
|
29
33
|
}
|
|
30
34
|
});
|
|
31
35
|
}
|
|
@@ -7,8 +7,6 @@ import { type BarretenbergWasmThreadWorker } from '../barretenberg_wasm_thread/i
|
|
|
7
7
|
import { BarretenbergWasmBase } from '../barretenberg_wasm_base/index.js';
|
|
8
8
|
import { HeapAllocator } from './heap_allocator.js';
|
|
9
9
|
|
|
10
|
-
const debug = createDebug('bb.js:wasm');
|
|
11
|
-
|
|
12
10
|
/**
|
|
13
11
|
* This is the "main thread" implementation of BarretenbergWasm.
|
|
14
12
|
* It spawns a bunch of "child thread" implementations.
|
|
@@ -31,7 +29,7 @@ export class BarretenbergWasmMain extends BarretenbergWasmBase {
|
|
|
31
29
|
public async init(
|
|
32
30
|
module: WebAssembly.Module,
|
|
33
31
|
threads = Math.min(getNumCpu(), BarretenbergWasmMain.MAX_THREADS),
|
|
34
|
-
logger: (msg: string) => void =
|
|
32
|
+
logger: (msg: string) => void = createDebug('bb.js:bb_wasm'),
|
|
35
33
|
initial = 32,
|
|
36
34
|
maximum = 2 ** 16,
|
|
37
35
|
) {
|
|
@@ -42,9 +40,9 @@ export class BarretenbergWasmMain extends BarretenbergWasmBase {
|
|
|
42
40
|
const shared = getSharedMemoryAvailable();
|
|
43
41
|
|
|
44
42
|
this.logger(
|
|
45
|
-
`
|
|
46
|
-
`max
|
|
47
|
-
`threads: ${threads}
|
|
43
|
+
`Initializing bb wasm: initial memory ${initial} pages ${initialMb}MiB; ` +
|
|
44
|
+
`max memory: ${maximum} pages, ${maxMb}MiB; ` +
|
|
45
|
+
`threads: ${threads}; shared memory: ${shared}`,
|
|
48
46
|
);
|
|
49
47
|
|
|
50
48
|
this.memory = new WebAssembly.Memory({ initial, maximum, shared });
|
|
@@ -58,12 +56,11 @@ export class BarretenbergWasmMain extends BarretenbergWasmBase {
|
|
|
58
56
|
|
|
59
57
|
// Create worker threads. Create 1 less than requested, as main thread counts as a thread.
|
|
60
58
|
if (threads > 1) {
|
|
61
|
-
this.logger(`
|
|
59
|
+
this.logger(`Creating ${threads} worker threads`);
|
|
62
60
|
this.workers = await Promise.all(Array.from({ length: threads - 1 }).map(createThreadWorker));
|
|
63
61
|
this.remoteWasms = await Promise.all(this.workers.map(getRemoteBarretenbergWasm<BarretenbergWasmThreadWorker>));
|
|
64
62
|
await Promise.all(this.remoteWasms.map(w => w.initThread(module, this.memory)));
|
|
65
63
|
}
|
|
66
|
-
this.logger('init complete.');
|
|
67
64
|
}
|
|
68
65
|
|
|
69
66
|
/**
|
|
@@ -102,9 +99,9 @@ export class BarretenbergWasmMain extends BarretenbergWasmBase {
|
|
|
102
99
|
/* eslint-enable camelcase */
|
|
103
100
|
}
|
|
104
101
|
|
|
105
|
-
callWasmExport(funcName: string, inArgs: Uint8Array[], outLens: (number | undefined)[]) {
|
|
102
|
+
callWasmExport(funcName: string, inArgs: (Uint8Array | number)[], outLens: (number | undefined)[]) {
|
|
106
103
|
const alloc = new HeapAllocator(this);
|
|
107
|
-
const inPtrs = alloc.
|
|
104
|
+
const inPtrs = alloc.getInputs(inArgs);
|
|
108
105
|
const outPtrs = alloc.getOutputPtrs(outLens);
|
|
109
106
|
this.call(funcName, ...inPtrs, ...outPtrs);
|
|
110
107
|
const outArgs = this.getOutputArgs(outLens, outPtrs, alloc);
|
|
@@ -1,12 +1,33 @@
|
|
|
1
|
-
import barretenbergModule from '../../barretenberg.wasm.gz';
|
|
2
|
-
import barretenbergThreadsModule from '../../barretenberg-threads.wasm.gz';
|
|
3
1
|
import pako from 'pako';
|
|
4
2
|
|
|
5
3
|
// Annoyingly the wasm declares if it's memory is shared or not. So now we need two wasms if we want to be
|
|
6
4
|
// able to fallback on "non shared memory" situations.
|
|
7
|
-
export async function fetchCode(multithreaded: boolean) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
export async function fetchCode(multithreaded: boolean, wasmPath?: string) {
|
|
6
|
+
let url: string;
|
|
7
|
+
if (wasmPath) {
|
|
8
|
+
const suffix = multithreaded ? '-threads' : '';
|
|
9
|
+
const filePath = wasmPath.split('/').slice(0, -1).join('/');
|
|
10
|
+
const fileNameWithExtensions = wasmPath.split('/').pop();
|
|
11
|
+
const [fileName, ...extensions] = fileNameWithExtensions!.split('.');
|
|
12
|
+
url = `${filePath}/${fileName}${suffix}.${extensions.join('.')}`;
|
|
13
|
+
} else {
|
|
14
|
+
url = multithreaded
|
|
15
|
+
? (await import(/* webpackIgnore: true */ './barretenberg-threads.js')).default
|
|
16
|
+
: (await import(/* webpackIgnore: true */ './barretenberg.js')).default;
|
|
17
|
+
}
|
|
18
|
+
const res = await fetch(url);
|
|
19
|
+
const maybeCompressedData = await res.arrayBuffer();
|
|
20
|
+
const buffer = new Uint8Array(maybeCompressedData);
|
|
21
|
+
const isGzip =
|
|
22
|
+
// Check magic number
|
|
23
|
+
buffer[0] === 0x1f &&
|
|
24
|
+
buffer[1] === 0x8b &&
|
|
25
|
+
// Check compression method:
|
|
26
|
+
buffer[2] === 0x08;
|
|
27
|
+
if (isGzip) {
|
|
28
|
+
const decompressedData = pako.ungzip(buffer);
|
|
29
|
+
return decompressedData.buffer;
|
|
30
|
+
} else {
|
|
31
|
+
return buffer;
|
|
32
|
+
}
|
|
12
33
|
}
|
|
@@ -14,8 +14,8 @@ function getCurrentDir() {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
17
|
-
export async function fetchCode(multithreaded: boolean) {
|
|
18
|
-
const path = getCurrentDir() + '/../../barretenberg-threads.wasm.gz';
|
|
17
|
+
export async function fetchCode(multithreaded: boolean, wasmPath?: string) {
|
|
18
|
+
const path = wasmPath ?? getCurrentDir() + '/../../barretenberg-threads.wasm.gz';
|
|
19
19
|
const compressedData = await readFile(path);
|
|
20
20
|
const decompressedData = pako.ungzip(new Uint8Array(compressedData));
|
|
21
21
|
return decompressedData.buffer;
|
|
@@ -18,7 +18,7 @@ describe('barretenberg wasm', () => {
|
|
|
18
18
|
const length = 1024;
|
|
19
19
|
const ptr = await wasm.call('bbmalloc', length);
|
|
20
20
|
const buf = Buffer.alloc(length, 128);
|
|
21
|
-
await wasm.writeMemory(ptr, buf);
|
|
21
|
+
await wasm.writeMemory(ptr, Uint8Array.from(buf));
|
|
22
22
|
const result = Buffer.from(await wasm.getMemorySlice(ptr, ptr + length));
|
|
23
23
|
await wasm.call('bbfree', ptr);
|
|
24
24
|
expect(result).toStrictEqual(buf);
|
|
@@ -37,7 +37,7 @@ describe('barretenberg wasm', () => {
|
|
|
37
37
|
const length = 1024;
|
|
38
38
|
const ptr = await wasm.call('bbmalloc', length);
|
|
39
39
|
const buf = Buffer.alloc(length, 128);
|
|
40
|
-
await wasm.writeMemory(ptr, buf);
|
|
40
|
+
await wasm.writeMemory(ptr, Uint8Array.from(buf));
|
|
41
41
|
const result = Buffer.from(await wasm.getMemorySlice(ptr, ptr + length));
|
|
42
42
|
await wasm.call('bbfree', ptr);
|
|
43
43
|
expect(result).toStrictEqual(buf);
|
|
@@ -5,29 +5,36 @@ import { getRemoteBarretenbergWasm, getSharedMemoryAvailable } from './helpers/n
|
|
|
5
5
|
import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from './barretenberg_wasm_main/index.js';
|
|
6
6
|
import { fetchCode } from './fetch_code/index.js';
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
export async function fetchModuleAndThreads(
|
|
9
|
+
desiredThreads = 32,
|
|
10
|
+
wasmPath?: string,
|
|
11
|
+
logger: (msg: string) => void = createDebug('bb.js:fetch_mat'),
|
|
12
|
+
) {
|
|
11
13
|
const shared = getSharedMemoryAvailable();
|
|
12
14
|
|
|
13
|
-
const availableThreads = shared ? await getAvailableThreads() : 1;
|
|
15
|
+
const availableThreads = shared ? await getAvailableThreads(logger) : 1;
|
|
14
16
|
// We limit the number of threads to 32 as we do not benefit from greater numbers.
|
|
15
17
|
const limitedThreads = Math.min(desiredThreads, availableThreads, 32);
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
logger(`Fetching bb wasm from ${wasmPath ?? 'default location'}`);
|
|
20
|
+
const code = await fetchCode(shared, wasmPath);
|
|
21
|
+
logger(`Compiling bb wasm of ${code.byteLength} bytes`);
|
|
18
22
|
const module = await WebAssembly.compile(code);
|
|
23
|
+
logger('Compilation of bb wasm complete');
|
|
19
24
|
return { module, threads: limitedThreads };
|
|
20
25
|
}
|
|
21
26
|
|
|
22
|
-
async function getAvailableThreads(): Promise<number> {
|
|
27
|
+
async function getAvailableThreads(logger: (msg: string) => void): Promise<number> {
|
|
23
28
|
if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) {
|
|
24
29
|
return navigator.hardwareConcurrency;
|
|
25
30
|
} else {
|
|
26
31
|
try {
|
|
27
32
|
const os = await import('os');
|
|
28
33
|
return os.cpus().length;
|
|
29
|
-
} catch (e) {
|
|
30
|
-
|
|
34
|
+
} catch (e: any) {
|
|
35
|
+
logger(
|
|
36
|
+
`Could not detect environment to query number of threads. Falling back to one thread. Error: ${e.message ?? e}`,
|
|
37
|
+
);
|
|
31
38
|
return 1;
|
|
32
39
|
}
|
|
33
40
|
}
|
|
@@ -38,11 +45,15 @@ export class BarretenbergWasm extends BarretenbergWasmMain {
|
|
|
38
45
|
* Construct and initialize BarretenbergWasm within a Worker. Return both the worker and the wasm proxy.
|
|
39
46
|
* Used when running in the browser, because we can't block the main thread.
|
|
40
47
|
*/
|
|
41
|
-
public static async new(
|
|
48
|
+
public static async new(
|
|
49
|
+
desiredThreads?: number,
|
|
50
|
+
wasmPath?: string,
|
|
51
|
+
logger: (msg: string) => void = createDebug('bb.js:bb_wasm_main'),
|
|
52
|
+
) {
|
|
42
53
|
const worker = createMainWorker();
|
|
43
54
|
const wasm = getRemoteBarretenbergWasm<BarretenbergWasmMainWorker>(worker);
|
|
44
|
-
const { module, threads } = await fetchModuleAndThreads(desiredThreads);
|
|
45
|
-
await wasm.init(module, threads, proxy(
|
|
55
|
+
const { module, threads } = await fetchModuleAndThreads(desiredThreads, wasmPath, logger);
|
|
56
|
+
await wasm.init(module, threads, proxy(logger));
|
|
46
57
|
return { worker, wasm };
|
|
47
58
|
}
|
|
48
59
|
}
|
|
@@ -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/crs/net_crs.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { retry, makeBackoff } from '../retry/index.js';
|
|
1
2
|
/**
|
|
2
3
|
* Downloader for CRS from the web or local.
|
|
3
4
|
*/
|
|
@@ -28,12 +29,16 @@ export class NetCrs {
|
|
|
28
29
|
|
|
29
30
|
const g1End = this.numPoints * 64 - 1;
|
|
30
31
|
|
|
31
|
-
const response = await
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
const response = await retry(
|
|
33
|
+
() =>
|
|
34
|
+
fetch('https://aztec-ignition.s3.amazonaws.com/MAIN%20IGNITION/flat/g1.dat', {
|
|
35
|
+
headers: {
|
|
36
|
+
Range: `bytes=0-${g1End}`,
|
|
37
|
+
},
|
|
38
|
+
cache: 'force-cache',
|
|
39
|
+
}),
|
|
40
|
+
makeBackoff([5, 5, 5]),
|
|
41
|
+
);
|
|
37
42
|
|
|
38
43
|
return (this.data = new Uint8Array(await response.arrayBuffer()));
|
|
39
44
|
}
|
|
@@ -42,9 +47,13 @@ export class NetCrs {
|
|
|
42
47
|
* Download the G2 points data.
|
|
43
48
|
*/
|
|
44
49
|
async downloadG2Data() {
|
|
45
|
-
const response2 = await
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
const response2 = await retry(
|
|
51
|
+
() =>
|
|
52
|
+
fetch('https://aztec-ignition.s3.amazonaws.com/MAIN%20IGNITION/flat/g2.dat', {
|
|
53
|
+
cache: 'force-cache',
|
|
54
|
+
}),
|
|
55
|
+
makeBackoff([5, 5, 5]),
|
|
56
|
+
);
|
|
48
57
|
|
|
49
58
|
return (this.g2Data = new Uint8Array(await response2.arrayBuffer()));
|
|
50
59
|
}
|
package/src/crs/node/index.ts
CHANGED
|
@@ -4,16 +4,22 @@ import { stat } from 'fs/promises';
|
|
|
4
4
|
import createDebug from 'debug';
|
|
5
5
|
import { homedir } from 'os';
|
|
6
6
|
|
|
7
|
-
const debug = createDebug('bb.js:crs');
|
|
8
|
-
|
|
9
7
|
/**
|
|
10
8
|
* Generic CRS finder utility class.
|
|
11
9
|
*/
|
|
12
10
|
export class Crs {
|
|
13
|
-
constructor(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
constructor(
|
|
12
|
+
public readonly numPoints: number,
|
|
13
|
+
public readonly path: string,
|
|
14
|
+
private readonly logger: (msg: string) => void = createDebug('bb.js:crs'),
|
|
15
|
+
) {}
|
|
16
|
+
|
|
17
|
+
static async new(
|
|
18
|
+
numPoints: number,
|
|
19
|
+
crsPath = homedir() + '/.bb-crs',
|
|
20
|
+
logger: (msg: string) => void = createDebug('bb.js:crs'),
|
|
21
|
+
) {
|
|
22
|
+
const crs = new Crs(numPoints, crsPath, logger);
|
|
17
23
|
await crs.init();
|
|
18
24
|
return crs;
|
|
19
25
|
}
|
|
@@ -29,11 +35,11 @@ export class Crs {
|
|
|
29
35
|
.catch(() => 0);
|
|
30
36
|
|
|
31
37
|
if (g1FileSize >= this.numPoints * 64 && g1FileSize % 64 == 0 && g2FileSize == 128) {
|
|
32
|
-
|
|
38
|
+
this.logger(`Using cached CRS of size ${g1FileSize / 64}`);
|
|
33
39
|
return;
|
|
34
40
|
}
|
|
35
41
|
|
|
36
|
-
|
|
42
|
+
this.logger(`Downloading CRS of size ${this.numPoints} into ${this.path}`);
|
|
37
43
|
const crs = new NetCrs(this.numPoints);
|
|
38
44
|
await crs.init();
|
|
39
45
|
writeFileSync(this.path + '/bn254_g1.dat', crs.getG1Data());
|
|
@@ -45,7 +51,9 @@ export class Crs {
|
|
|
45
51
|
* @returns The points data.
|
|
46
52
|
*/
|
|
47
53
|
getG1Data(): Uint8Array {
|
|
48
|
-
|
|
54
|
+
// Ensure length > 0, otherwise we might read a huge file.
|
|
55
|
+
// This is a backup.
|
|
56
|
+
const length = Math.max(this.numPoints, 1) * 64;
|
|
49
57
|
const fd = openSync(this.path + '/bn254_g1.dat', 'r');
|
|
50
58
|
const buffer = new Uint8Array(length);
|
|
51
59
|
readSync(fd, buffer, 0, length, 0);
|
|
@@ -66,10 +74,18 @@ export class Crs {
|
|
|
66
74
|
* Generic Grumpkin CRS finder utility class.
|
|
67
75
|
*/
|
|
68
76
|
export class GrumpkinCrs {
|
|
69
|
-
constructor(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
constructor(
|
|
78
|
+
public readonly numPoints: number,
|
|
79
|
+
public readonly path: string,
|
|
80
|
+
private readonly logger: (msg: string) => void = createDebug('bb.js:crs'),
|
|
81
|
+
) {}
|
|
82
|
+
|
|
83
|
+
static async new(
|
|
84
|
+
numPoints: number,
|
|
85
|
+
crsPath = homedir() + '/.bb-crs',
|
|
86
|
+
logger: (msg: string) => void = createDebug('bb.js:crs'),
|
|
87
|
+
) {
|
|
88
|
+
const crs = new GrumpkinCrs(numPoints, crsPath, logger);
|
|
73
89
|
await crs.init();
|
|
74
90
|
return crs;
|
|
75
91
|
}
|
|
@@ -82,11 +98,11 @@ export class GrumpkinCrs {
|
|
|
82
98
|
.catch(() => 0);
|
|
83
99
|
|
|
84
100
|
if (g1FileSize >= this.numPoints * 64 && g1FileSize % 64 == 0) {
|
|
85
|
-
|
|
101
|
+
this.logger(`Using cached Grumpkin CRS of size ${g1FileSize / 64}`);
|
|
86
102
|
return;
|
|
87
103
|
}
|
|
88
104
|
|
|
89
|
-
|
|
105
|
+
this.logger(`Downloading Grumpkin CRS of size ${this.numPoints} into ${this.path}`);
|
|
90
106
|
const crs = new NetGrumpkinCrs(this.numPoints);
|
|
91
107
|
await crs.init();
|
|
92
108
|
writeFileSync(this.path + '/grumpkin_g1.dat', crs.getG1Data());
|