@aztec/bb.js 3.0.0-nightly.20251015 → 3.0.0-nightly.20251022

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