@aztec/simulator 0.0.1-commit.9ef841308 → 0.0.1-commit.a4600f49

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 (359) hide show
  1. package/dest/client.d.ts +1 -3
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +0 -2
  4. package/dest/private/acvm_wasm.d.ts +1 -1
  5. package/dest/private/acvm_wasm.d.ts.map +1 -1
  6. package/dest/private/acvm_wasm.js +3 -1
  7. package/dest/private/circuit_recording/circuit_recorder.d.ts +36 -23
  8. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  9. package/dest/private/circuit_recording/circuit_recorder.js +65 -69
  10. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +7 -19
  11. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  12. package/dest/private/circuit_recording/file_circuit_recorder.js +38 -42
  13. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
  14. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
  15. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +11 -14
  16. package/dest/public/avm/testing/account_proof_fetcher.d.ts +2 -0
  17. package/dest/public/avm/testing/account_proof_fetcher.d.ts.map +1 -0
  18. package/dest/public/avm/{fixtures → testing}/base_avm_simulation_tester.d.ts +2 -1
  19. package/dest/public/avm/testing/base_avm_simulation_tester.d.ts.map +1 -0
  20. package/dest/public/avm/{fixtures → testing}/base_avm_simulation_tester.js +18 -3
  21. package/dest/public/avm/testing/utils.d.ts +32 -0
  22. package/dest/public/avm/testing/utils.d.ts.map +1 -0
  23. package/dest/public/avm/{fixtures → testing}/utils.js +4 -34
  24. package/dest/public/avm_simulator.d.ts +28 -0
  25. package/dest/public/avm_simulator.d.ts.map +1 -0
  26. package/dest/public/avm_simulator.js +4 -0
  27. package/dest/public/avm_simulator_pool.d.ts +45 -0
  28. package/dest/public/avm_simulator_pool.d.ts.map +1 -0
  29. package/dest/public/avm_simulator_pool.js +197 -0
  30. package/dest/public/cdb/generated/api_types.d.ts +171 -0
  31. package/dest/public/cdb/generated/api_types.d.ts.map +1 -0
  32. package/dest/public/cdb/generated/api_types.js +314 -0
  33. package/dest/public/cdb/generated/server.d.ts +26 -0
  34. package/dest/public/cdb/generated/server.d.ts.map +1 -0
  35. package/dest/public/cdb/generated/server.js +135 -0
  36. package/dest/public/cdb_ipc_server.d.ts +33 -0
  37. package/dest/public/cdb_ipc_server.d.ts.map +1 -0
  38. package/dest/public/cdb_ipc_server.js +153 -0
  39. package/dest/public/fixtures/amm_test.js +2 -2
  40. package/dest/public/fixtures/bulk_test.d.ts +1 -1
  41. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  42. package/dest/public/fixtures/bulk_test.js +33 -6
  43. package/dest/public/fixtures/custom_bytecode_tester.d.ts +1 -1
  44. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
  45. package/dest/public/fixtures/custom_bytecode_tester.js +2 -2
  46. package/dest/public/fixtures/index.d.ts +2 -4
  47. package/dest/public/fixtures/index.d.ts.map +1 -1
  48. package/dest/public/fixtures/index.js +1 -3
  49. package/dest/public/fixtures/public_processor_test_env.d.ts +30 -0
  50. package/dest/public/fixtures/public_processor_test_env.d.ts.map +1 -0
  51. package/dest/public/fixtures/public_processor_test_env.js +73 -0
  52. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +11 -7
  53. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  54. package/dest/public/fixtures/public_tx_simulation_tester.js +33 -43
  55. package/dest/public/fixtures/simple_contract_data_source.js +1 -1
  56. package/dest/public/fixtures/token_test.js +3 -3
  57. package/dest/public/fixtures/utils.d.ts +1 -1
  58. package/dest/public/fixtures/utils.d.ts.map +1 -1
  59. package/dest/public/fixtures/utils.js +16 -15
  60. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +11 -4
  61. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
  62. package/dest/public/fuzzing/avm_fuzzer_simulator.js +24 -10
  63. package/dest/public/fuzzing/avm_simulator_bin.js +4 -4
  64. package/dest/public/index.d.ts +5 -2
  65. package/dest/public/index.d.ts.map +1 -1
  66. package/dest/public/index.js +2 -1
  67. package/dest/public/public_db_sources.d.ts +5 -2
  68. package/dest/public/public_db_sources.d.ts.map +1 -1
  69. package/dest/public/public_db_sources.js +9 -3
  70. package/dest/public/public_processor/guarded_merkle_tree.d.ts +4 -3
  71. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  72. package/dest/public/public_processor/guarded_merkle_tree.js +3 -0
  73. package/dest/public/public_processor/public_processor.d.ts +11 -6
  74. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  75. package/dest/public/public_processor/public_processor.js +67 -38
  76. package/dest/public/public_processor/public_processor_metrics.d.ts +4 -1
  77. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  78. package/dest/public/public_processor/public_processor_metrics.js +8 -0
  79. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts +17 -0
  80. package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts.map +1 -0
  81. package/dest/public/public_tx_simulator/{dumping_cpp_public_tx_simulator.js → dumping_public_tx_simulator.js} +10 -23
  82. package/dest/public/public_tx_simulator/factories.d.ts +8 -8
  83. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  84. package/dest/public/public_tx_simulator/factories.js +8 -8
  85. package/dest/public/public_tx_simulator/index.d.ts +4 -6
  86. package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
  87. package/dest/public/public_tx_simulator/index.js +2 -4
  88. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +42 -71
  89. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  90. package/dest/public/public_tx_simulator/public_tx_simulator.js +98 -318
  91. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts +24 -0
  92. package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts.map +1 -0
  93. package/dest/public/public_tx_simulator/public_tx_simulator_base.js +31 -0
  94. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +5 -5
  95. package/dest/public/test_executor_metrics.d.ts +1 -6
  96. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  97. package/dest/public/test_executor_metrics.js +0 -22
  98. package/package.json +22 -18
  99. package/src/client.ts +0 -2
  100. package/src/private/acvm_wasm.ts +4 -1
  101. package/src/private/circuit_recording/circuit_recorder.ts +84 -78
  102. package/src/private/circuit_recording/file_circuit_recorder.ts +38 -48
  103. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +9 -15
  104. package/src/public/avm/{fixtures → testing}/base_avm_simulation_tester.ts +23 -3
  105. package/src/public/avm/{fixtures → testing}/utils.ts +4 -40
  106. package/src/public/avm_simulator.ts +29 -0
  107. package/src/public/avm_simulator_pool.ts +226 -0
  108. package/src/public/cdb/generated/api_types.ts +457 -0
  109. package/src/public/cdb/generated/server.ts +109 -0
  110. package/src/public/cdb_ipc_server.ts +197 -0
  111. package/src/public/fixtures/amm_test.ts +2 -2
  112. package/src/public/fixtures/bulk_test.ts +31 -6
  113. package/src/public/fixtures/custom_bytecode_tester.ts +2 -2
  114. package/src/public/fixtures/index.ts +1 -3
  115. package/src/public/fixtures/public_processor_test_env.ts +88 -0
  116. package/src/public/fixtures/public_tx_simulation_tester.ts +41 -60
  117. package/src/public/fixtures/simple_contract_data_source.ts +1 -1
  118. package/src/public/fixtures/token_test.ts +3 -3
  119. package/src/public/fixtures/utils.ts +18 -20
  120. package/src/public/fuzzing/avm_fuzzer_simulator.ts +25 -10
  121. package/src/public/fuzzing/avm_simulator_bin.ts +3 -5
  122. package/src/public/index.ts +7 -3
  123. package/src/public/public_db_sources.ts +12 -3
  124. package/src/public/public_processor/guarded_merkle_tree.ts +5 -2
  125. package/src/public/public_processor/public_processor.ts +89 -46
  126. package/src/public/public_processor/public_processor_metrics.ts +12 -0
  127. package/src/public/public_tx_simulator/{dumping_cpp_public_tx_simulator.ts → dumping_public_tx_simulator.ts} +15 -31
  128. package/src/public/public_tx_simulator/factories.ts +27 -10
  129. package/src/public/public_tx_simulator/index.ts +6 -5
  130. package/src/public/public_tx_simulator/public_tx_simulator.ts +139 -476
  131. package/src/public/public_tx_simulator/public_tx_simulator_base.ts +37 -0
  132. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +5 -5
  133. package/src/public/test_executor_metrics.ts +0 -24
  134. package/dest/public/avm/avm_context.d.ts +0 -41
  135. package/dest/public/avm/avm_context.d.ts.map +0 -1
  136. package/dest/public/avm/avm_context.js +0 -44
  137. package/dest/public/avm/avm_contract_call_result.d.ts +0 -32
  138. package/dest/public/avm/avm_contract_call_result.d.ts.map +0 -1
  139. package/dest/public/avm/avm_contract_call_result.js +0 -54
  140. package/dest/public/avm/avm_execution_environment.d.ts +0 -24
  141. package/dest/public/avm/avm_execution_environment.d.ts.map +0 -1
  142. package/dest/public/avm/avm_execution_environment.js +0 -33
  143. package/dest/public/avm/avm_gas.d.ts +0 -44
  144. package/dest/public/avm/avm_gas.d.ts.map +0 -1
  145. package/dest/public/avm/avm_gas.js +0 -195
  146. package/dest/public/avm/avm_machine_state.d.ts +0 -98
  147. package/dest/public/avm/avm_machine_state.d.ts.map +0 -1
  148. package/dest/public/avm/avm_machine_state.js +0 -110
  149. package/dest/public/avm/avm_memory_types.d.ts +0 -275
  150. package/dest/public/avm/avm_memory_types.d.ts.map +0 -1
  151. package/dest/public/avm/avm_memory_types.js +0 -354
  152. package/dest/public/avm/avm_simulator.d.ts +0 -41
  153. package/dest/public/avm/avm_simulator.d.ts.map +0 -1
  154. package/dest/public/avm/avm_simulator.js +0 -192
  155. package/dest/public/avm/avm_simulator_interface.d.ts +0 -9
  156. package/dest/public/avm/avm_simulator_interface.d.ts.map +0 -1
  157. package/dest/public/avm/avm_simulator_interface.js +0 -3
  158. package/dest/public/avm/calldata.d.ts +0 -51
  159. package/dest/public/avm/calldata.d.ts.map +0 -1
  160. package/dest/public/avm/calldata.js +0 -64
  161. package/dest/public/avm/errors.d.ts +0 -104
  162. package/dest/public/avm/errors.d.ts.map +0 -1
  163. package/dest/public/avm/errors.js +0 -141
  164. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +0 -2
  165. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +0 -1
  166. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +0 -22
  167. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
  168. package/dest/public/avm/fixtures/avm_simulation_tester.js +0 -84
  169. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
  170. package/dest/public/avm/fixtures/initializers.d.ts +0 -42
  171. package/dest/public/avm/fixtures/initializers.d.ts.map +0 -1
  172. package/dest/public/avm/fixtures/initializers.js +0 -45
  173. package/dest/public/avm/fixtures/utils.d.ts +0 -39
  174. package/dest/public/avm/fixtures/utils.d.ts.map +0 -1
  175. package/dest/public/avm/index.d.ts +0 -2
  176. package/dest/public/avm/index.d.ts.map +0 -1
  177. package/dest/public/avm/index.js +0 -1
  178. package/dest/public/avm/opcodes/accrued_substate.d.ts +0 -74
  179. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +0 -1
  180. package/dest/public/avm/opcodes/accrued_substate.js +0 -254
  181. package/dest/public/avm/opcodes/addressing_mode.d.ts +0 -31
  182. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +0 -1
  183. package/dest/public/avm/opcodes/addressing_mode.js +0 -94
  184. package/dest/public/avm/opcodes/arithmetic.d.ts +0 -49
  185. package/dest/public/avm/opcodes/arithmetic.d.ts.map +0 -1
  186. package/dest/public/avm/opcodes/arithmetic.js +0 -97
  187. package/dest/public/avm/opcodes/bitwise.d.ts +0 -42
  188. package/dest/public/avm/opcodes/bitwise.d.ts.map +0 -1
  189. package/dest/public/avm/opcodes/bitwise.js +0 -99
  190. package/dest/public/avm/opcodes/comparators.d.ts +0 -25
  191. package/dest/public/avm/opcodes/comparators.d.ts.map +0 -1
  192. package/dest/public/avm/opcodes/comparators.js +0 -43
  193. package/dest/public/avm/opcodes/contract.d.ts +0 -20
  194. package/dest/public/avm/opcodes/contract.d.ts.map +0 -1
  195. package/dest/public/avm/opcodes/contract.js +0 -65
  196. package/dest/public/avm/opcodes/control_flow.d.ts +0 -41
  197. package/dest/public/avm/opcodes/control_flow.d.ts.map +0 -1
  198. package/dest/public/avm/opcodes/control_flow.js +0 -107
  199. package/dest/public/avm/opcodes/conversion.d.ts +0 -18
  200. package/dest/public/avm/opcodes/conversion.d.ts.map +0 -1
  201. package/dest/public/avm/opcodes/conversion.js +0 -333
  202. package/dest/public/avm/opcodes/ec_add.d.ts +0 -19
  203. package/dest/public/avm/opcodes/ec_add.d.ts.map +0 -1
  204. package/dest/public/avm/opcodes/ec_add.js +0 -93
  205. package/dest/public/avm/opcodes/environment_getters.d.ts +0 -28
  206. package/dest/public/avm/opcodes/environment_getters.d.ts.map +0 -1
  207. package/dest/public/avm/opcodes/environment_getters.js +0 -77
  208. package/dest/public/avm/opcodes/external_calls.d.ts +0 -59
  209. package/dest/public/avm/opcodes/external_calls.d.ts.map +0 -1
  210. package/dest/public/avm/opcodes/external_calls.js +0 -210
  211. package/dest/public/avm/opcodes/hashing.d.ts +0 -36
  212. package/dest/public/avm/opcodes/hashing.d.ts.map +0 -1
  213. package/dest/public/avm/opcodes/hashing.js +0 -119
  214. package/dest/public/avm/opcodes/index.d.ts +0 -16
  215. package/dest/public/avm/opcodes/index.d.ts.map +0 -1
  216. package/dest/public/avm/opcodes/index.js +0 -15
  217. package/dest/public/avm/opcodes/instruction.d.ts +0 -74
  218. package/dest/public/avm/opcodes/instruction.d.ts.map +0 -1
  219. package/dest/public/avm/opcodes/instruction.js +0 -95
  220. package/dest/public/avm/opcodes/instruction_impl.d.ts +0 -19
  221. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +0 -1
  222. package/dest/public/avm/opcodes/instruction_impl.js +0 -30
  223. package/dest/public/avm/opcodes/memory.d.ts +0 -74
  224. package/dest/public/avm/opcodes/memory.d.ts.map +0 -1
  225. package/dest/public/avm/opcodes/memory.js +0 -257
  226. package/dest/public/avm/opcodes/misc.d.ts +0 -18
  227. package/dest/public/avm/opcodes/misc.d.ts.map +0 -1
  228. package/dest/public/avm/opcodes/misc.js +0 -73
  229. package/dest/public/avm/opcodes/storage.d.ts +0 -25
  230. package/dest/public/avm/opcodes/storage.d.ts.map +0 -1
  231. package/dest/public/avm/opcodes/storage.js +0 -78
  232. package/dest/public/avm/revert_reason.d.ts +0 -18
  233. package/dest/public/avm/revert_reason.d.ts.map +0 -1
  234. package/dest/public/avm/revert_reason.js +0 -39
  235. package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -26
  236. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +0 -1
  237. package/dest/public/avm/serialization/buffer_cursor.js +0 -99
  238. package/dest/public/avm/serialization/bytecode_serialization.d.ts +0 -17
  239. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +0 -1
  240. package/dest/public/avm/serialization/bytecode_serialization.js +0 -336
  241. package/dest/public/avm/serialization/instruction_serialization.d.ts +0 -114
  242. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +0 -1
  243. package/dest/public/avm/serialization/instruction_serialization.js +0 -261
  244. package/dest/public/avm/test_utils.d.ts +0 -15
  245. package/dest/public/avm/test_utils.d.ts.map +0 -1
  246. package/dest/public/avm/test_utils.js +0 -44
  247. package/dest/public/debug_fn_name.d.ts +0 -18
  248. package/dest/public/debug_fn_name.d.ts.map +0 -1
  249. package/dest/public/debug_fn_name.js +0 -37
  250. package/dest/public/fixtures/custom_bytecode_tests.d.ts +0 -12
  251. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +0 -1
  252. package/dest/public/fixtures/custom_bytecode_tests.js +0 -174
  253. package/dest/public/fixtures/minimal_public_tx.d.ts +0 -4
  254. package/dest/public/fixtures/minimal_public_tx.d.ts.map +0 -1
  255. package/dest/public/fixtures/minimal_public_tx.js +0 -19
  256. package/dest/public/fixtures/opcode_spammer.d.ts +0 -122
  257. package/dest/public/fixtures/opcode_spammer.d.ts.map +0 -1
  258. package/dest/public/fixtures/opcode_spammer.js +0 -1653
  259. package/dest/public/hinting_db_sources.d.ts +0 -80
  260. package/dest/public/hinting_db_sources.d.ts.map +0 -1
  261. package/dest/public/hinting_db_sources.js +0 -356
  262. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +0 -19
  263. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +0 -1
  264. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +0 -99
  265. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +0 -53
  266. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +0 -1
  267. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +0 -131
  268. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +0 -42
  269. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +0 -1
  270. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +0 -86
  271. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +0 -30
  272. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +0 -1
  273. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +0 -171
  274. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +0 -23
  275. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +0 -1
  276. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +0 -31
  277. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +0 -1
  278. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +0 -51
  279. package/dest/public/public_tx_simulator/public_tx_context.d.ts +0 -135
  280. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +0 -1
  281. package/dest/public/public_tx_simulator/public_tx_context.js +0 -304
  282. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +0 -21
  283. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +0 -1
  284. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +0 -415
  285. package/dest/public/side_effect_trace.d.ts +0 -87
  286. package/dest/public/side_effect_trace.d.ts.map +0 -1
  287. package/dest/public/side_effect_trace.js +0 -199
  288. package/dest/public/side_effect_trace_interface.d.ts +0 -22
  289. package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
  290. package/dest/public/side_effect_trace_interface.js +0 -1
  291. package/dest/public/state_manager/index.d.ts +0 -2
  292. package/dest/public/state_manager/index.d.ts.map +0 -1
  293. package/dest/public/state_manager/index.js +0 -1
  294. package/dest/public/state_manager/nullifiers.d.ts +0 -61
  295. package/dest/public/state_manager/nullifiers.d.ts.map +0 -1
  296. package/dest/public/state_manager/nullifiers.js +0 -92
  297. package/dest/public/state_manager/public_storage.d.ts +0 -66
  298. package/dest/public/state_manager/public_storage.d.ts.map +0 -1
  299. package/dest/public/state_manager/public_storage.js +0 -145
  300. package/dest/public/state_manager/state_manager.d.ts +0 -170
  301. package/dest/public/state_manager/state_manager.d.ts.map +0 -1
  302. package/dest/public/state_manager/state_manager.js +0 -402
  303. package/src/public/avm/avm_context.ts +0 -61
  304. package/src/public/avm/avm_contract_call_result.ts +0 -69
  305. package/src/public/avm/avm_execution_environment.ts +0 -51
  306. package/src/public/avm/avm_gas.ts +0 -183
  307. package/src/public/avm/avm_machine_state.ts +0 -170
  308. package/src/public/avm/avm_memory_types.ts +0 -440
  309. package/src/public/avm/avm_simulator.ts +0 -279
  310. package/src/public/avm/avm_simulator_interface.ts +0 -8
  311. package/src/public/avm/calldata.ts +0 -101
  312. package/src/public/avm/errors.ts +0 -177
  313. package/src/public/avm/fixtures/avm_simulation_tester.ts +0 -122
  314. package/src/public/avm/fixtures/initializers.ts +0 -103
  315. package/src/public/avm/index.ts +0 -1
  316. package/src/public/avm/opcodes/accrued_substate.ts +0 -285
  317. package/src/public/avm/opcodes/addressing_mode.ts +0 -111
  318. package/src/public/avm/opcodes/arithmetic.ts +0 -129
  319. package/src/public/avm/opcodes/bitwise.ts +0 -113
  320. package/src/public/avm/opcodes/comparators.ts +0 -55
  321. package/src/public/avm/opcodes/contract.ts +0 -72
  322. package/src/public/avm/opcodes/control_flow.ts +0 -123
  323. package/src/public/avm/opcodes/conversion.ts +0 -104
  324. package/src/public/avm/opcodes/ec_add.ts +0 -105
  325. package/src/public/avm/opcodes/environment_getters.ts +0 -87
  326. package/src/public/avm/opcodes/external_calls.ts +0 -262
  327. package/src/public/avm/opcodes/hashing.ts +0 -151
  328. package/src/public/avm/opcodes/index.ts +0 -15
  329. package/src/public/avm/opcodes/instruction.ts +0 -136
  330. package/src/public/avm/opcodes/instruction_impl.ts +0 -36
  331. package/src/public/avm/opcodes/memory.ts +0 -293
  332. package/src/public/avm/opcodes/misc.ts +0 -102
  333. package/src/public/avm/opcodes/storage.ts +0 -95
  334. package/src/public/avm/revert_reason.ts +0 -58
  335. package/src/public/avm/serialization/buffer_cursor.ts +0 -118
  336. package/src/public/avm/serialization/bytecode_serialization.ts +0 -215
  337. package/src/public/avm/serialization/instruction_serialization.ts +0 -249
  338. package/src/public/avm/test_utils.ts +0 -64
  339. package/src/public/debug_fn_name.ts +0 -52
  340. package/src/public/fixtures/custom_bytecode_tests.ts +0 -228
  341. package/src/public/fixtures/minimal_public_tx.ts +0 -26
  342. package/src/public/fixtures/opcode_spammer.ts +0 -1717
  343. package/src/public/hinting_db_sources.ts +0 -609
  344. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +0 -125
  345. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +0 -210
  346. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +0 -134
  347. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +0 -239
  348. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +0 -105
  349. package/src/public/public_tx_simulator/public_tx_context.ts +0 -488
  350. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +0 -63
  351. package/src/public/side_effect_trace.ts +0 -293
  352. package/src/public/side_effect_trace_interface.ts +0 -28
  353. package/src/public/state_manager/index.ts +0 -1
  354. package/src/public/state_manager/nullifiers.ts +0 -103
  355. package/src/public/state_manager/public_storage.ts +0 -174
  356. package/src/public/state_manager/state_manager.ts +0 -569
  357. /package/dest/public/avm/{fixtures → testing}/account_proof_fetcher.js +0 -0
  358. /package/src/public/avm/{fixtures → testing}/account_proof.json +0 -0
  359. /package/src/public/avm/{fixtures → testing}/account_proof_fetcher.ts +0 -0
@@ -1,293 +0,0 @@
1
- import {
2
- FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH,
3
- MAX_L2_TO_L1_MSGS_PER_TX,
4
- MAX_NOTE_HASHES_PER_TX,
5
- MAX_NULLIFIERS_PER_TX,
6
- MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS,
7
- MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
8
- PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
9
- } from '@aztec/constants';
10
- import { Fr } from '@aztec/foundation/curves/bn254';
11
- import { EthAddress } from '@aztec/foundation/eth-address';
12
- import { type LogLevel, type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
13
- import { PublicDataUpdateRequest } from '@aztec/stdlib/avm';
14
- import type { AztecAddress } from '@aztec/stdlib/aztec-address';
15
- import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
16
- import { NoteHash, Nullifier } from '@aztec/stdlib/kernel';
17
- import { DebugLog, PublicLog } from '@aztec/stdlib/logs';
18
- import { L2ToL1Message, ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
19
-
20
- import { strict as assert } from 'assert';
21
-
22
- import {
23
- L2ToL1MessageLimitReachedError,
24
- MaxCallsToUniqueContractClassIdsError,
25
- NoteHashLimitReachedError,
26
- NullifierLimitReachedError,
27
- SideEffectLimitReachedError,
28
- } from './side_effect_errors.js';
29
- import type { PublicSideEffectTraceInterface } from './side_effect_trace_interface.js';
30
- import { UniqueClassIds } from './unique_class_ids.js';
31
-
32
- /**
33
- * A struct containing just the side effects as regular arrays
34
- * as opposed to "Tuple" arrays used by circuit public inputs.
35
- * This struct is helpful for testing and checking array lengths.
36
- **/
37
- export type SideEffects = {
38
- publicDataWrites: PublicDataUpdateRequest[];
39
- noteHashes: NoteHash[];
40
- nullifiers: Nullifier[];
41
- l2ToL1Msgs: ScopedL2ToL1Message[];
42
- publicLogs: PublicLog[];
43
- };
44
-
45
- export class SideEffectArrayLengths {
46
- constructor(
47
- public readonly publicDataWrites: number,
48
- public readonly protocolPublicDataWrites: number,
49
- public readonly noteHashes: number,
50
- public readonly nullifiers: number,
51
- public readonly l2ToL1Msgs: number,
52
- public readonly publicLogFields: number,
53
- ) {}
54
-
55
- static empty() {
56
- return new this(0, 0, 0, 0, 0, 0);
57
- }
58
- }
59
-
60
- /**
61
- * Trace side effects for an enqueued public call's execution.
62
- */
63
- export class SideEffectTrace implements PublicSideEffectTraceInterface {
64
- public log: Logger;
65
-
66
- /** The side effect counter increments with every call to the trace. */
67
- private sideEffectCounter: number;
68
-
69
- private publicDataWrites: PublicDataUpdateRequest[] = [];
70
- private protocolPublicDataWritesLength: number = 0;
71
- private userPublicDataWritesLength: number = 0;
72
- private noteHashes: NoteHash[] = [];
73
- private nullifiers: Nullifier[] = [];
74
- private l2ToL1Messages: ScopedL2ToL1Message[] = [];
75
- private publicLogs: PublicLog[] = [];
76
- /** Make sure a forked trace is never merged twice. */
77
- private alreadyMergedIntoParent = false;
78
-
79
- constructor(
80
- /** The counter of this trace's first side effect. */
81
- public readonly startSideEffectCounter: number = 0,
82
- bindings?: LoggerBindings,
83
- /** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
84
- * otherwise the public kernel can fail to prove because TX limits are breached.
85
- */
86
- private readonly previousSideEffectArrayLengths: SideEffectArrayLengths = SideEffectArrayLengths.empty(),
87
- /** We need to track the set of class IDs used, to enforce limits. */
88
- private uniqueClassIds: UniqueClassIds = new UniqueClassIds(),
89
- private writtenPublicDataSlots: Set<string> = new Set(),
90
- private debugLogs: DebugLog[] = [],
91
- private debugLogMemoryReads: number = 0,
92
- ) {
93
- this.sideEffectCounter = startSideEffectCounter;
94
- this.log = createLogger('simulator:side_effect_trace', bindings);
95
- }
96
-
97
- public fork() {
98
- return new SideEffectTrace(
99
- this.sideEffectCounter,
100
- this.log.getBindings(),
101
- new SideEffectArrayLengths(
102
- this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength,
103
- this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength,
104
- this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length,
105
- this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length,
106
- this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length,
107
- this.previousSideEffectArrayLengths.publicLogFields +
108
- this.publicLogs.reduce((acc, log) => acc + log.sizeInFields(), 0),
109
- ),
110
- this.uniqueClassIds.fork(),
111
- new Set(this.writtenPublicDataSlots),
112
- this.debugLogs.slice(),
113
- this.debugLogMemoryReads,
114
- );
115
- }
116
-
117
- public merge(forkedTrace: this, reverted: boolean = false) {
118
- // sanity check to avoid merging the same forked trace twice
119
- assert(
120
- !forkedTrace.alreadyMergedIntoParent,
121
- 'Bug! Cannot merge a forked trace that has already been merged into its parent!',
122
- );
123
- forkedTrace.alreadyMergedIntoParent = true;
124
-
125
- this.sideEffectCounter = forkedTrace.sideEffectCounter;
126
- this.uniqueClassIds.acceptAndMerge(forkedTrace.uniqueClassIds);
127
- this.debugLogs = forkedTrace.debugLogs;
128
- this.debugLogMemoryReads = forkedTrace.debugLogMemoryReads;
129
-
130
- if (!reverted) {
131
- this.publicDataWrites.push(...forkedTrace.publicDataWrites);
132
- this.noteHashes.push(...forkedTrace.noteHashes);
133
- this.nullifiers.push(...forkedTrace.nullifiers);
134
- this.l2ToL1Messages.push(...forkedTrace.l2ToL1Messages);
135
- this.publicLogs.push(...forkedTrace.publicLogs);
136
- this.userPublicDataWritesLength += forkedTrace.userPublicDataWritesLength;
137
- this.protocolPublicDataWritesLength += forkedTrace.protocolPublicDataWritesLength;
138
- for (const slot of forkedTrace.writtenPublicDataSlots) {
139
- this.writtenPublicDataSlots.add(slot);
140
- }
141
- }
142
- }
143
-
144
- public getCounter() {
145
- return this.sideEffectCounter;
146
- }
147
-
148
- private incrementSideEffectCounter() {
149
- this.sideEffectCounter++;
150
- }
151
-
152
- public getNoteHashCount() {
153
- return this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length;
154
- }
155
-
156
- public async tracePublicStorageWrite(
157
- contractAddress: AztecAddress,
158
- slot: Fr,
159
- value: Fr,
160
- protocolWrite: boolean,
161
- ): Promise<void> {
162
- // Only increment counts if the storage slot has not been written to before.
163
- if (this.isStorageCold(contractAddress, slot)) {
164
- if (protocolWrite) {
165
- if (
166
- this.protocolPublicDataWritesLength + this.previousSideEffectArrayLengths.protocolPublicDataWrites >=
167
- PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
168
- ) {
169
- throw new SideEffectLimitReachedError(
170
- 'protocol public data (contract storage) write',
171
- PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
172
- );
173
- }
174
- this.protocolPublicDataWritesLength++;
175
- } else {
176
- if (
177
- this.userPublicDataWritesLength + this.previousSideEffectArrayLengths.publicDataWrites >=
178
- MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
179
- ) {
180
- throw new SideEffectLimitReachedError(
181
- 'public data (contract storage) write',
182
- MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
183
- );
184
- }
185
- this.userPublicDataWritesLength++;
186
- }
187
- }
188
-
189
- const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
190
- this.publicDataWrites.push(new PublicDataUpdateRequest(leafSlot, value, this.sideEffectCounter));
191
-
192
- this.log.trace(
193
- `Traced public data write (address=${contractAddress}, slot=${slot}): value=${value} (counter=${this.sideEffectCounter}, isProtocol:${protocolWrite})`,
194
- );
195
- this.incrementSideEffectCounter();
196
- this.writtenPublicDataSlots.add(this.computePublicDataSlotKey(contractAddress, slot));
197
- }
198
-
199
- private computePublicDataSlotKey(contractAddress: AztecAddress, slot: Fr): string {
200
- return `${contractAddress.toString()}:${slot.toString()}`;
201
- }
202
-
203
- public isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean {
204
- return !this.writtenPublicDataSlots.has(this.computePublicDataSlotKey(contractAddress, slot));
205
- }
206
-
207
- public traceNewNoteHash(noteHash: Fr) {
208
- if (this.noteHashes.length + this.previousSideEffectArrayLengths.noteHashes >= MAX_NOTE_HASHES_PER_TX) {
209
- throw new NoteHashLimitReachedError();
210
- }
211
-
212
- this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter));
213
- this.log.trace(`Tracing new note hash (counter=${this.sideEffectCounter})`);
214
- this.incrementSideEffectCounter();
215
- }
216
-
217
- public traceNewNullifier(siloedNullifier: Fr) {
218
- if (this.nullifiers.length + this.previousSideEffectArrayLengths.nullifiers >= MAX_NULLIFIERS_PER_TX) {
219
- throw new NullifierLimitReachedError();
220
- }
221
-
222
- this.nullifiers.push(new Nullifier(siloedNullifier, /*noteHash=*/ Fr.ZERO, this.sideEffectCounter));
223
-
224
- this.log.trace(`Tracing new nullifier (counter=${this.sideEffectCounter})`);
225
- this.incrementSideEffectCounter();
226
- }
227
-
228
- public traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr) {
229
- if (this.l2ToL1Messages.length + this.previousSideEffectArrayLengths.l2ToL1Msgs >= MAX_L2_TO_L1_MSGS_PER_TX) {
230
- throw new L2ToL1MessageLimitReachedError();
231
- }
232
-
233
- const recipientAddress = EthAddress.fromField(recipient);
234
- this.l2ToL1Messages.push(new L2ToL1Message(recipientAddress, content).scope(contractAddress));
235
- this.log.trace(`Tracing new l2 to l1 message (counter=${this.sideEffectCounter})`);
236
- this.incrementSideEffectCounter();
237
- }
238
-
239
- public tracePublicLog(contractAddress: AztecAddress, log: Fr[]) {
240
- const previouslyEmittedPublicLogFieldsCount =
241
- this.previousSideEffectArrayLengths.publicLogFields +
242
- this.publicLogs.reduce((acc, log) => acc + log.sizeInFields(), 0);
243
-
244
- const publicLog = new PublicLog(contractAddress, log);
245
-
246
- if (previouslyEmittedPublicLogFieldsCount + publicLog.sizeInFields() > FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH) {
247
- throw new SideEffectLimitReachedError('public log fields', FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH);
248
- }
249
-
250
- this.publicLogs.push(publicLog);
251
- this.log.trace(`Tracing new public log (counter=${this.sideEffectCounter})`);
252
- this.incrementSideEffectCounter();
253
- }
254
-
255
- public traceDebugLog(contractAddress: AztecAddress, level: LogLevel, message: string, fields: Fr[]) {
256
- this.debugLogs.push(new DebugLog(contractAddress, level, message, fields));
257
- }
258
-
259
- public getDebugLogs() {
260
- return this.debugLogs;
261
- }
262
-
263
- public getDebugLogMemoryReads() {
264
- return this.debugLogMemoryReads;
265
- }
266
-
267
- public traceDebugLogMemoryReads(memoryReads: number) {
268
- this.debugLogMemoryReads += memoryReads;
269
- }
270
-
271
- public traceGetContractClass(contractClassId: Fr, exists: boolean) {
272
- // We limit the number of unique contract class IDs due to hashing and the trace length limit.
273
- if (exists && !this.uniqueClassIds.has(contractClassId.toString())) {
274
- if (this.uniqueClassIds.size() >= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS) {
275
- this.log.debug(`Bytecode retrieval failure for contract class ID ${contractClassId} (limit reached)`);
276
- throw new MaxCallsToUniqueContractClassIdsError();
277
- }
278
- this.log.trace(`Adding contract class ID ${contractClassId} (counter=${this.sideEffectCounter})`);
279
- this.uniqueClassIds.add(contractClassId.toString());
280
- this.incrementSideEffectCounter();
281
- }
282
- }
283
-
284
- public getSideEffects(): SideEffects {
285
- return {
286
- publicDataWrites: this.publicDataWrites,
287
- noteHashes: this.noteHashes,
288
- nullifiers: this.nullifiers,
289
- l2ToL1Msgs: this.l2ToL1Messages,
290
- publicLogs: this.publicLogs,
291
- };
292
- }
293
- }
@@ -1,28 +0,0 @@
1
- import type { Fr } from '@aztec/foundation/curves/bn254';
2
- import type { LogLevel } from '@aztec/foundation/log';
3
- import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
- import type { DebugLog } from '@aztec/stdlib/logs';
5
-
6
- export interface PublicSideEffectTraceInterface {
7
- fork(): PublicSideEffectTraceInterface;
8
- merge(nestedTrace: PublicSideEffectTraceInterface, reverted?: boolean): void;
9
- getCounter(): number;
10
- // all "trace*" functions can throw SideEffectLimitReachedError
11
- tracePublicStorageWrite(
12
- contractAddress: AztecAddress,
13
- slot: Fr, // This is the storage slot not the computed leaf slot
14
- value: Fr,
15
- protocolWrite: boolean,
16
- ): Promise<void>;
17
- isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean;
18
- traceNewNoteHash(uniqueNoteHash: Fr): void;
19
- getNoteHashCount(): number;
20
- traceNewNullifier(siloedNullifier: Fr): void;
21
- traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr): void;
22
- tracePublicLog(contractAddress: AztecAddress, log: Fr[]): void;
23
- traceDebugLog(contractAddress: AztecAddress, level: LogLevel, message: string, fields: Fr[]): void;
24
- getDebugLogs(): DebugLog[];
25
- getDebugLogMemoryReads(): number;
26
- traceDebugLogMemoryReads(memoryReads: number): void;
27
- traceGetContractClass(contractClassId: Fr, exists: boolean): void;
28
- }
@@ -1 +0,0 @@
1
- export * from './state_manager.js';
@@ -1,103 +0,0 @@
1
- import type { Fr } from '@aztec/foundation/curves/bn254';
2
-
3
- import type { PublicTreesDB } from '../public_db_sources.js';
4
- import { NullifierCollisionError } from '../side_effect_errors.js';
5
-
6
- /**
7
- * A class to manage new nullifier staging and existence checks during a contract call's AVM simulation.
8
- * Maintains a siloed nullifier cache, and ensures that existence checks fall back to the correct source.
9
- * When a contract call completes, its cached nullifier set can be merged into its parent's.
10
- */
11
- export class NullifierManager {
12
- constructor(
13
- /** Reference to node storage. Checked on parent cache-miss. */
14
- private readonly hostNullifiers: PublicTreesDB,
15
- /** Cache of siloed nullifiers. */
16
- private cache: Set<bigint> = new Set(),
17
- /** Parent nullifier manager to fall back on */
18
- private readonly parent?: NullifierManager,
19
- ) {}
20
-
21
- /**
22
- * Create a new nullifiers manager forked from this one
23
- */
24
- public fork() {
25
- return new NullifierManager(this.hostNullifiers, new Set(), this);
26
- }
27
-
28
- /**
29
- * Get a nullifier's existence in this' cache or parent's (recursively).
30
- * DOES NOT CHECK HOST STORAGE!
31
- * @param siloedNullifier - the nullifier to check for
32
- * @returns exists: whether the nullifier exists in cache here or in parent's
33
- */
34
- private checkExistsHereOrParent(siloedNullifier: Fr): boolean {
35
- // First check this cache
36
- let existsAsPending = this.cache.has(siloedNullifier.toBigInt());
37
- // Then try parent's nullifier cache
38
- if (!existsAsPending && this.parent) {
39
- // Note: this will recurse to grandparent/etc until a cache-hit is encountered.
40
- existsAsPending = this.parent.checkExistsHereOrParent(siloedNullifier);
41
- }
42
- return existsAsPending;
43
- }
44
-
45
- /**
46
- * Get a nullifier's existence status.
47
- * 1. Check cache.
48
- * 2. Check parent cache.
49
- * 3. Fall back to the host state.
50
- * 4. Not found! Nullifier does not exist.
51
- *
52
- * @param siloedNullifier - the nullifier to check for
53
- * @returns exists: whether the nullifier exists at all,
54
- * cacheHit: whether the nullifier was found in a cache,
55
- */
56
- public async checkExists(siloedNullifier: Fr): Promise<{ exists: boolean; cacheHit: boolean }> {
57
- // Check this cache and parent's (recursively)
58
- const cacheHit = this.checkExistsHereOrParent(siloedNullifier);
59
- let existsInTree = false;
60
- if (!cacheHit) {
61
- // Finally try the host's Aztec state (a trip to the database)
62
- //const leafOrLowLeafIndex = await this.hostNullifiers.db.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, siloedNullifier.toBigInt());
63
- //assert(
64
- // leafOrLowLeafIndex !== undefined,
65
- // `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]} low leaf index should always be found (even if target leaf does not exist)`,
66
- //);
67
- //existsInTree = leafOrLowLeafIndex.alreadyPresent;
68
- const exists = await this.hostNullifiers.checkNullifierExists(siloedNullifier);
69
- existsInTree = exists;
70
- }
71
- const exists = cacheHit || existsInTree;
72
- return Promise.resolve({ exists, cacheHit });
73
- }
74
-
75
- /**
76
- * Stage a new nullifier (append it to the cache).
77
- *
78
- * @param siloedNullifier - the nullifier to stage
79
- */
80
- public async append(siloedNullifier: Fr) {
81
- const { exists } = await this.checkExists(siloedNullifier);
82
- if (exists) {
83
- throw new NullifierCollisionError(`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`);
84
- }
85
- this.cache.add(siloedNullifier.toBigInt());
86
- }
87
-
88
- /**
89
- * Merges another nullifier cache into this one.
90
- *
91
- * @param incomingNullifiers - the incoming cached nullifiers to merge into this instance's
92
- */
93
- public acceptAndMerge(incomingNullifiers: NullifierManager) {
94
- for (const incomingNullifier of incomingNullifiers.cache) {
95
- if (this.cache.has(incomingNullifier)) {
96
- throw new NullifierCollisionError(
97
- `Failed to merge in fork's cached nullifiers. Siloed nullifier ${incomingNullifier} already exists in parent cache.`,
98
- );
99
- }
100
- }
101
- this.cache = new Set([...this.cache, ...incomingNullifiers.cache]);
102
- }
103
- }
@@ -1,174 +0,0 @@
1
- import { Fr } from '@aztec/foundation/curves/bn254';
2
- import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
-
4
- import type { PublicStateDBInterface } from '../db_interfaces.js';
5
-
6
- type PublicStorageReadResult = {
7
- value: Fr;
8
- cached: boolean;
9
- };
10
-
11
- /**
12
- * A class to manage public storage reads and writes during a contract call's AVM simulation.
13
- * Maintains a storage write cache, and ensures that reads fall back to the correct source.
14
- * When a contract call completes, its storage cache can be merged into its parent's.
15
- */
16
- export class PublicStorage {
17
- /** Cached storage writes. */
18
- private readonly cache: PublicStorageCache;
19
-
20
- constructor(
21
- /** Reference to node storage. Checked on parent cache-miss. */
22
- private readonly hostPublicStorage: PublicStateDBInterface,
23
- /** Parent's storage. Checked on this' cache-miss. */
24
- private readonly parent?: PublicStorage,
25
- ) {
26
- this.cache = new PublicStorageCache();
27
- }
28
-
29
- /**
30
- * Create a new public storage manager forked from this one
31
- */
32
- public fork() {
33
- return new PublicStorage(this.hostPublicStorage, this);
34
- }
35
-
36
- /**
37
- * Read a storage value from this' cache or parent's (recursively).
38
- * DOES NOT CHECK HOST STORAGE!
39
- *
40
- * @param contractAddress - the address of the contract whose storage is being read from
41
- * @param slot - the slot in the contract's storage being read from
42
- * @returns value: the latest value written according to this cache or the parent's. undefined on cache miss.
43
- */
44
- public readHereOrParent(contractAddress: AztecAddress, slot: Fr): Fr | undefined {
45
- // First try check this storage cache
46
- let value = this.cache.read(contractAddress, slot);
47
- // Then try parent's storage cache
48
- if (!value && this.parent) {
49
- // Note: this will recurse to grandparent/etc until a cache-hit is encountered.
50
- value = this.parent.readHereOrParent(contractAddress, slot);
51
- }
52
- return value;
53
- }
54
-
55
- /**
56
- * Read a value from storage.
57
- * 1. Check cache.
58
- * 2. Check parent cache.
59
- * 3. Fall back to the host state.
60
- * 4. Not found! Value has never been written to before. Flag it as non-existent and return value zero.
61
- *
62
- * @param contractAddress - the address of the contract whose storage is being read from
63
- * @param slot - the slot in the contract's storage being read from
64
- * @returns exists: whether the slot has EVER been written to before, value: the latest value written to slot, or 0 if never written to before
65
- */
66
- public async read(contractAddress: AztecAddress, slot: Fr): Promise<PublicStorageReadResult> {
67
- let cached = false;
68
- // Check this cache and parent's (recursively)
69
- let value = this.readHereOrParent(contractAddress, slot);
70
- // Finally try the host's Aztec state (a trip to the database)
71
- if (!value) {
72
- // This functions returns Fr.ZERO if it has never been written to before
73
- // we explicity coalesce to Fr.ZERO in case we have some implementations that cause this to return undefined
74
- value = (await this.hostPublicStorage.storageRead(contractAddress, slot)) ?? Fr.ZERO;
75
- // TODO(dbanks12): if value retrieved from host storage, we can cache it here
76
- // any future reads to the same slot can read from cache instead of more expensive
77
- // DB access
78
- } else {
79
- cached = true;
80
- }
81
- // if value is Fr.ZERO here, it that means this slot has never been written to!
82
- return Promise.resolve({ value, cached });
83
- }
84
-
85
- /**
86
- * Stage a storage write.
87
- *
88
- * @param contractAddress - the address of the contract whose storage is being written to
89
- * @param slot - the slot in the contract's storage being written to
90
- * @param value - the value being written to the slot
91
- */
92
- public write(contractAddress: AztecAddress, slot: Fr, value: Fr) {
93
- this.cache.write(contractAddress, slot, value);
94
- }
95
-
96
- /**
97
- * Merges another PublicStorage's cache (pending writes) into this one.
98
- *
99
- * @param incomingPublicStorage - the incoming public storage to merge into this instance's
100
- */
101
- public acceptAndMerge(incomingPublicStorage: PublicStorage) {
102
- this.cache.acceptAndMerge(incomingPublicStorage.cache);
103
- }
104
- }
105
-
106
- /**
107
- * A class to cache writes to public storage during a contract call's AVM simulation.
108
- * "Writes" update a map, "reads" check that map or return undefined.
109
- * An instance of this class can merge another instance's staged writes into its own.
110
- */
111
- class PublicStorageCache {
112
- /**
113
- * Map for staging storage writes.
114
- * One inner-map per contract storage address,
115
- * mapping storage slot to latest staged write value.
116
- */
117
- private cachePerContract: Map<bigint, Map<bigint, Fr>> = new Map();
118
-
119
- /**
120
- * Read a staged value from storage, if it has been previously written to.
121
- *
122
- * @param contractAddress - the address of the contract whose storage is being read from
123
- * @param slot - the slot in the contract's storage being read from
124
- * @returns the latest value written to slot, or undefined if no value has been written
125
- */
126
- public read(contractAddress: AztecAddress, slot: Fr): Fr | undefined {
127
- return this.cachePerContract.get(contractAddress.toBigInt())?.get(slot.toBigInt());
128
- }
129
-
130
- /**
131
- * Stage a storage write.
132
- *
133
- * @param contractAddress - the address of the contract whose storage is being written to
134
- * @param slot - the slot in the contract's storage being written to
135
- * @param value - the value being written to the slot
136
- */
137
- public write(contractAddress: AztecAddress, slot: Fr, value: Fr) {
138
- let cacheAtContract = this.cachePerContract.get(contractAddress.toBigInt());
139
- if (!cacheAtContract) {
140
- // If this contract's storage has no staged modifications, create a new inner map to store them
141
- cacheAtContract = new Map();
142
- this.cachePerContract.set(contractAddress.toBigInt(), cacheAtContract);
143
- }
144
- cacheAtContract.set(slot.toBigInt(), value);
145
- }
146
-
147
- /**
148
- * Merges another cache's staged writes into this instance's cache.
149
- *
150
- * Staged modifications in "incoming" take precedence over those
151
- * present in "this" as they are assumed to occur after this' writes.
152
- *
153
- * In practice, "this" is a parent call's storage cache, and "incoming" is a nested call's.
154
- *
155
- * @param incomingStorageCache - the incoming storage write cache to merge into this instance's
156
- */
157
- public acceptAndMerge(incomingStorageCache: PublicStorageCache) {
158
- // Iterate over all incoming contracts with staged writes.
159
- for (const [incomingAddress, incomingCacheAtContract] of incomingStorageCache.cachePerContract) {
160
- const thisCacheAtContract = this.cachePerContract.get(incomingAddress);
161
- if (!thisCacheAtContract) {
162
- // The contract has no storage writes staged here
163
- // so just accept the incoming cache as-is for this contract.
164
- this.cachePerContract.set(incomingAddress, incomingCacheAtContract);
165
- } else {
166
- // "Incoming" and "this" both have staged writes for this contract.
167
- // Merge in incoming staged writes, giving them precedence over this'.
168
- for (const [slot, value] of incomingCacheAtContract) {
169
- thisCacheAtContract.set(slot, value);
170
- }
171
- }
172
- }
173
- }
174
- }