@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.
Files changed (189) hide show
  1. package/README.md +10 -2
  2. package/dest/browser/522.6386c00ebfb22619e11b.js +3 -0
  3. package/dest/browser/barretenberg/backend.d.ts +7 -2
  4. package/dest/browser/barretenberg/backend.d.ts.map +1 -1
  5. package/dest/browser/barretenberg/index.d.ts +6 -2
  6. package/dest/browser/barretenberg/index.d.ts.map +1 -1
  7. package/dest/browser/barretenberg-threads.js +32 -0
  8. package/dest/browser/barretenberg.js +32 -0
  9. package/dest/browser/barretenberg_api/index.d.ts +5 -2
  10. package/dest/browser/barretenberg_api/index.d.ts.map +1 -1
  11. package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
  12. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +1 -1
  13. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -1
  14. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +1 -1
  15. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
  16. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts +3 -0
  17. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts.map +1 -0
  18. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts +3 -0
  19. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts.map +1 -0
  20. package/dest/browser/barretenberg_wasm/fetch_code/browser/index.d.ts +1 -1
  21. package/dest/browser/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -1
  22. package/dest/browser/barretenberg_wasm/fetch_code/node/index.d.ts +1 -1
  23. package/dest/browser/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -1
  24. package/dest/browser/barretenberg_wasm/index.d.ts +2 -2
  25. package/dest/browser/barretenberg_wasm/index.d.ts.map +1 -1
  26. package/dest/browser/bigint-array/index.d.ts +17 -2
  27. package/dest/browser/bigint-array/index.d.ts.map +1 -1
  28. package/dest/browser/crs/net_crs.d.ts.map +1 -1
  29. package/dest/browser/crs/node/index.d.ts +6 -4
  30. package/dest/browser/crs/node/index.d.ts.map +1 -1
  31. package/dest/browser/index.d.ts.map +1 -1
  32. package/dest/browser/index.js +10583 -16082
  33. package/dest/browser/index.js.LICENSE.txt +16 -0
  34. package/dest/browser/main.worker.worker.js.LICENSE.txt +5 -0
  35. package/dest/browser/proof/index.d.ts +10 -0
  36. package/dest/browser/proof/index.d.ts.map +1 -1
  37. package/dest/browser/retry/index.d.ts +26 -0
  38. package/dest/browser/retry/index.d.ts.map +1 -0
  39. package/dest/browser/thread.worker.worker.js.LICENSE.txt +5 -0
  40. package/dest/browser/thread.worker.worker.worker.js.LICENSE.txt +5 -0
  41. package/dest/browser/types/fields.d.ts +6 -5
  42. package/dest/browser/types/fields.d.ts.map +1 -1
  43. package/dest/node/barretenberg/__snapshots__/pedersen.test.js.snap +156 -0
  44. package/dest/node/barretenberg/__snapshots__/poseidon.test.js.snap +40 -0
  45. package/dest/node/barretenberg/backend.d.ts +7 -2
  46. package/dest/node/barretenberg/backend.d.ts.map +1 -1
  47. package/dest/node/barretenberg/backend.js +54 -4
  48. package/dest/node/barretenberg/blake2s.test.js +2 -2
  49. package/dest/node/barretenberg/index.d.ts +6 -2
  50. package/dest/node/barretenberg/index.d.ts.map +1 -1
  51. package/dest/node/barretenberg/index.js +15 -20
  52. package/dest/node/barretenberg/pedersen.test.js +2 -2
  53. package/dest/node/barretenberg/poseidon.test.js +2 -2
  54. package/dest/node/barretenberg_api/index.d.ts +5 -2
  55. package/dest/node/barretenberg_api/index.d.ts.map +1 -1
  56. package/dest/node/barretenberg_api/index.js +32 -2
  57. package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  58. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
  59. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.js +5 -6
  60. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +1 -1
  61. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -1
  62. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.js +16 -11
  63. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +1 -1
  64. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
  65. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +7 -9
  66. package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts +3 -0
  67. package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts.map +1 -0
  68. package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +3 -0
  69. package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts +3 -0
  70. package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts.map +1 -0
  71. package/dest/node/barretenberg_wasm/fetch_code/browser/barretenberg.js +3 -0
  72. package/dest/node/barretenberg_wasm/fetch_code/browser/index.d.ts +1 -1
  73. package/dest/node/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -1
  74. package/dest/node/barretenberg_wasm/fetch_code/browser/index.js +31 -8
  75. package/dest/node/barretenberg_wasm/fetch_code/node/index.d.ts +1 -1
  76. package/dest/node/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -1
  77. package/dest/node/barretenberg_wasm/fetch_code/node/index.js +3 -3
  78. package/dest/node/barretenberg_wasm/index.d.ts +2 -2
  79. package/dest/node/barretenberg_wasm/index.d.ts.map +1 -1
  80. package/dest/node/barretenberg_wasm/index.js +12 -10
  81. package/dest/node/barretenberg_wasm/index.test.js +3 -3
  82. package/dest/node/bigint-array/index.d.ts +17 -2
  83. package/dest/node/bigint-array/index.d.ts.map +1 -1
  84. package/dest/node/bigint-array/index.js +34 -18
  85. package/dest/node/crs/net_crs.d.ts.map +1 -1
  86. package/dest/node/crs/net_crs.js +6 -5
  87. package/dest/node/crs/node/index.d.ts +6 -4
  88. package/dest/node/crs/node/index.d.ts.map +1 -1
  89. package/dest/node/crs/node/index.js +16 -13
  90. package/dest/node/examples/simple.test.js +2 -2
  91. package/dest/node/index.d.ts.map +1 -1
  92. package/dest/node/index.js +1 -1
  93. package/dest/node/main.d.ts.map +1 -1
  94. package/dest/node/main.js +57 -65
  95. package/dest/node/proof/index.d.ts +10 -0
  96. package/dest/node/proof/index.d.ts.map +1 -1
  97. package/dest/node/proof/index.js +1 -1
  98. package/dest/node/retry/index.d.ts +26 -0
  99. package/dest/node/retry/index.d.ts.map +1 -0
  100. package/dest/node/retry/index.js +50 -0
  101. package/dest/node/types/fields.d.ts +6 -5
  102. package/dest/node/types/fields.d.ts.map +1 -1
  103. package/dest/node/types/fields.js +15 -10
  104. package/dest/node-cjs/barretenberg/backend.d.ts +7 -2
  105. package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
  106. package/dest/node-cjs/barretenberg/backend.js +56 -5
  107. package/dest/node-cjs/barretenberg/blake2s.test.js +2 -2
  108. package/dest/node-cjs/barretenberg/index.d.ts +6 -2
  109. package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
  110. package/dest/node-cjs/barretenberg/index.js +15 -19
  111. package/dest/node-cjs/barretenberg/pedersen.test.js +2 -2
  112. package/dest/node-cjs/barretenberg/poseidon.test.js +2 -2
  113. package/dest/node-cjs/barretenberg_api/index.d.ts +5 -2
  114. package/dest/node-cjs/barretenberg_api/index.d.ts.map +1 -1
  115. package/dest/node-cjs/barretenberg_api/index.js +32 -2
  116. package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  117. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
  118. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.js +5 -6
  119. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +1 -1
  120. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -1
  121. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.js +16 -11
  122. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +1 -1
  123. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
  124. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +7 -9
  125. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts +3 -0
  126. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg-threads.d.ts.map +1 -0
  127. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +6 -0
  128. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts +3 -0
  129. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg.d.ts.map +1 -0
  130. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/barretenberg.js +6 -0
  131. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.d.ts +1 -1
  132. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -1
  133. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.js +31 -8
  134. package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.d.ts +1 -1
  135. package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -1
  136. package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.js +3 -3
  137. package/dest/node-cjs/barretenberg_wasm/index.d.ts +2 -2
  138. package/dest/node-cjs/barretenberg_wasm/index.d.ts.map +1 -1
  139. package/dest/node-cjs/barretenberg_wasm/index.js +12 -10
  140. package/dest/node-cjs/barretenberg_wasm/index.test.js +3 -3
  141. package/dest/node-cjs/bigint-array/index.d.ts +17 -2
  142. package/dest/node-cjs/bigint-array/index.d.ts.map +1 -1
  143. package/dest/node-cjs/bigint-array/index.js +39 -21
  144. package/dest/node-cjs/crs/net_crs.d.ts.map +1 -1
  145. package/dest/node-cjs/crs/net_crs.js +6 -5
  146. package/dest/node-cjs/crs/node/index.d.ts +6 -4
  147. package/dest/node-cjs/crs/node/index.d.ts.map +1 -1
  148. package/dest/node-cjs/crs/node/index.js +16 -13
  149. package/dest/node-cjs/examples/simple.test.js +2 -2
  150. package/dest/node-cjs/index.d.ts.map +1 -1
  151. package/dest/node-cjs/index.js +1 -1
  152. package/dest/node-cjs/main.d.ts.map +1 -1
  153. package/dest/node-cjs/main.js +57 -65
  154. package/dest/node-cjs/proof/index.d.ts +10 -0
  155. package/dest/node-cjs/proof/index.d.ts.map +1 -1
  156. package/dest/node-cjs/proof/index.js +1 -1
  157. package/dest/node-cjs/retry/index.d.ts +26 -0
  158. package/dest/node-cjs/retry/index.d.ts.map +1 -0
  159. package/dest/node-cjs/retry/index.js +56 -0
  160. package/dest/node-cjs/types/fields.d.ts +6 -5
  161. package/dest/node-cjs/types/fields.d.ts.map +1 -1
  162. package/dest/node-cjs/types/fields.js +14 -9
  163. package/package.json +5 -5
  164. package/src/barretenberg/backend.ts +79 -3
  165. package/src/barretenberg/blake2s.test.ts +1 -1
  166. package/src/barretenberg/index.ts +27 -21
  167. package/src/barretenberg/pedersen.test.ts +1 -1
  168. package/src/barretenberg/poseidon.test.ts +1 -1
  169. package/src/barretenberg_api/index.ts +49 -2
  170. package/src/barretenberg_wasm/barretenberg_wasm_base/index.ts +4 -6
  171. package/src/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.ts +14 -10
  172. package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +7 -10
  173. package/src/barretenberg_wasm/fetch_code/browser/barretenberg-threads.ts +3 -0
  174. package/src/barretenberg_wasm/fetch_code/browser/barretenberg.ts +3 -0
  175. package/src/barretenberg_wasm/fetch_code/browser/index.ts +28 -7
  176. package/src/barretenberg_wasm/fetch_code/node/index.ts +2 -2
  177. package/src/barretenberg_wasm/index.test.ts +2 -2
  178. package/src/barretenberg_wasm/index.ts +22 -11
  179. package/src/bigint-array/index.ts +39 -17
  180. package/src/crs/net_crs.ts +18 -9
  181. package/src/crs/node/index.ts +31 -15
  182. package/src/examples/simple.test.ts +1 -1
  183. package/src/index.ts +1 -0
  184. package/src/main.ts +61 -70
  185. package/src/proof/index.ts +11 -0
  186. package/src/retry/index.ts +50 -0
  187. package/src/types/fields.ts +24 -13
  188. package/dest/browser/522.index.js +0 -10
  189. /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
- copyToMemory(buffers: Uint8Array[]) {
19
- return buffers.map(buf => {
20
- if (buf.length <= this.inScratchRemaining) {
21
- const ptr = (this.inScratchRemaining -= buf.length);
22
- this.wasm.writeMemory(ptr, buf);
23
- return ptr;
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
- const ptr = this.wasm.call('bbmalloc', buf.length);
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 = debug,
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
- `initial mem: ${initial} pages, ${initialMb}MiB. ` +
46
- `max mem: ${maximum} pages, ${maxMb}MiB. ` +
47
- `threads: ${threads}, shared: ${shared}`,
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(`creating ${threads} worker threads...`);
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.copyToMemory(inArgs);
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);
@@ -0,0 +1,3 @@
1
+ import barretenbergThreadsModule from '../../barretenberg-threads.wasm.gz';
2
+
3
+ export default barretenbergThreadsModule;
@@ -0,0 +1,3 @@
1
+ import barretenbergModule from '../../barretenberg.wasm.gz';
2
+
3
+ export default barretenbergModule;
@@ -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
- const res = await fetch(multithreaded ? barretenbergThreadsModule : barretenbergModule);
9
- const compressedData = await res.arrayBuffer();
10
- const decompressedData = pako.ungzip(new Uint8Array(compressedData));
11
- return decompressedData.buffer;
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
- const debug = createDebug('bb.js:wasm');
9
-
10
- export async function fetchModuleAndThreads(desiredThreads = 32) {
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
- const code = await fetchCode(shared);
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
- debug(`Could not detect environment. Falling back to one thread.: {e}`);
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(desiredThreads?: number) {
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(debug));
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
- export function toBigIntBE(bytes: Uint8Array) {
2
- // A Buffer in node, *is* a Uint8Array. We can't refuse it's type.
3
- // However the algo below only works on an actual Uint8Array, hence we make a new one to be safe.
4
- bytes = new Uint8Array(bytes);
5
- let bigint = BigInt(0);
6
- const view = new DataView(bytes.buffer);
7
- for (let i = 0; i < bytes.byteLength; i++) {
8
- bigint = (bigint << BigInt(8)) + BigInt(view.getUint8(i));
9
- }
10
- return bigint;
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
- export function toBufferBE(value: bigint, byteLength = 32) {
14
- const bytes = new Uint8Array(byteLength);
15
- const view = new DataView(bytes.buffer);
16
- for (let i = 0; i < byteLength; i++) {
17
- view.setUint8(byteLength - i - 1, Number(value & BigInt(0xff)));
18
- value >>= BigInt(8);
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
- return bytes;
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
  }
@@ -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 fetch('https://aztec-ignition.s3.amazonaws.com/MAIN%20IGNITION/flat/g1.dat', {
32
- headers: {
33
- Range: `bytes=0-${g1End}`,
34
- },
35
- cache: 'force-cache',
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 fetch('https://aztec-ignition.s3.amazonaws.com/MAIN%20IGNITION/flat/g2.dat', {
46
- cache: 'force-cache',
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
  }
@@ -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(public readonly numPoints: number, public readonly path: string) {}
14
-
15
- static async new(numPoints: number, crsPath = homedir() + '/.bb-crs') {
16
- const crs = new Crs(numPoints, crsPath);
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
- debug(`using cached crs of size: ${g1FileSize / 64}`);
38
+ this.logger(`Using cached CRS of size ${g1FileSize / 64}`);
33
39
  return;
34
40
  }
35
41
 
36
- debug(`downloading crs of size: ${this.numPoints}`);
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
- const length = this.numPoints * 64;
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(public readonly numPoints: number, public readonly path: string) {}
70
-
71
- static async new(numPoints: number, crsPath = homedir() + '/.bb-crs') {
72
- const crs = new GrumpkinCrs(numPoints, crsPath);
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
- debug(`using cached crs of size: ${g1FileSize / 64}`);
101
+ this.logger(`Using cached Grumpkin CRS of size ${g1FileSize / 64}`);
86
102
  return;
87
103
  }
88
104
 
89
- debug(`downloading crs of size: ${this.numPoints}`);
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());
@@ -19,7 +19,7 @@ describe('simple', () => {
19
19
 
20
20
  afterAll(async () => {
21
21
  await api.destroy();
22
- });
22
+ }, 10000);
23
23
 
24
24
  it('should construct 512k gate proof', async () => {
25
25
  const valid = await api.examplesSimpleCreateAndVerifyProof();
package/src/index.ts CHANGED
@@ -8,5 +8,6 @@ export {
8
8
  UltraHonkBackend,
9
9
  AztecClientBackend,
10
10
  } from './barretenberg/index.js';
11
+
11
12
  export { RawBuffer, Fr } from './types/index.js';
12
13
  export { splitHonkProof, reconstructHonkProof, ProofData } from './proof/index.js';