@aztec/foundation 0.0.0-test.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dest/array/array.d.ts +71 -0
- package/dest/array/array.d.ts.map +1 -0
- package/dest/array/array.js +100 -0
- package/dest/array/index.d.ts +2 -0
- package/dest/array/index.d.ts.map +1 -0
- package/dest/array/index.js +1 -0
- package/dest/async-map/index.d.ts +13 -0
- package/dest/async-map/index.d.ts.map +1 -0
- package/dest/async-map/index.js +17 -0
- package/dest/async-pool/index.d.ts +3 -0
- package/dest/async-pool/index.d.ts.map +1 -0
- package/dest/async-pool/index.js +47 -0
- package/dest/bigint-buffer/index.d.ts +42 -0
- package/dest/bigint-buffer/index.d.ts.map +1 -0
- package/dest/bigint-buffer/index.js +76 -0
- package/dest/buffer/buffer32.d.ts +91 -0
- package/dest/buffer/buffer32.d.ts.map +1 -0
- package/dest/buffer/buffer32.js +115 -0
- package/dest/buffer/index.d.ts +2 -0
- package/dest/buffer/index.d.ts.map +1 -0
- package/dest/buffer/index.js +1 -0
- package/dest/collection/array.d.ts +101 -0
- package/dest/collection/array.d.ts.map +1 -0
- package/dest/collection/array.js +164 -0
- package/dest/collection/index.d.ts +3 -0
- package/dest/collection/index.d.ts.map +1 -0
- package/dest/collection/index.js +2 -0
- package/dest/collection/object.d.ts +14 -0
- package/dest/collection/object.d.ts.map +1 -0
- package/dest/collection/object.js +32 -0
- package/dest/committable/committable.d.ts +28 -0
- package/dest/committable/committable.d.ts.map +1 -0
- package/dest/committable/committable.js +36 -0
- package/dest/committable/index.d.ts +2 -0
- package/dest/committable/index.d.ts.map +1 -0
- package/dest/committable/index.js +1 -0
- package/dest/config/env_var.d.ts +2 -0
- package/dest/config/env_var.d.ts.map +1 -0
- package/dest/config/env_var.js +1 -0
- package/dest/config/index.d.ts +66 -0
- package/dest/config/index.d.ts.map +1 -0
- package/dest/config/index.js +125 -0
- package/dest/crypto/aes128/index.d.ts +34 -0
- package/dest/crypto/aes128/index.d.ts.map +1 -0
- package/dest/crypto/aes128/index.js +49 -0
- package/dest/crypto/ecdsa/index.d.ts +39 -0
- package/dest/crypto/ecdsa/index.d.ts.map +1 -0
- package/dest/crypto/ecdsa/index.js +88 -0
- package/dest/crypto/ecdsa/signature.d.ts +71 -0
- package/dest/crypto/ecdsa/signature.d.ts.map +1 -0
- package/dest/crypto/ecdsa/signature.js +92 -0
- package/dest/crypto/grumpkin/index.d.ts +47 -0
- package/dest/crypto/grumpkin/index.d.ts.map +1 -0
- package/dest/crypto/grumpkin/index.js +154 -0
- package/dest/crypto/index.d.ts +15 -0
- package/dest/crypto/index.d.ts.map +1 -0
- package/dest/crypto/index.js +14 -0
- package/dest/crypto/keccak/index.d.ts +28 -0
- package/dest/crypto/keccak/index.d.ts.map +1 -0
- package/dest/crypto/keccak/index.js +248 -0
- package/dest/crypto/keys/index.d.ts +5 -0
- package/dest/crypto/keys/index.d.ts.map +1 -0
- package/dest/crypto/keys/index.js +7 -0
- package/dest/crypto/pedersen/index.d.ts +2 -0
- package/dest/crypto/pedersen/index.d.ts.map +1 -0
- package/dest/crypto/pedersen/index.js +1 -0
- package/dest/crypto/pedersen/pedersen.elliptic.d.ts +13 -0
- package/dest/crypto/pedersen/pedersen.elliptic.d.ts.map +1 -0
- package/dest/crypto/pedersen/pedersen.elliptic.js +582 -0
- package/dest/crypto/pedersen/pedersen.noble.d.ts +11 -0
- package/dest/crypto/pedersen/pedersen.noble.d.ts.map +1 -0
- package/dest/crypto/pedersen/pedersen.noble.js +558 -0
- package/dest/crypto/pedersen/pedersen.wasm.d.ts +21 -0
- package/dest/crypto/pedersen/pedersen.wasm.d.ts.map +1 -0
- package/dest/crypto/pedersen/pedersen.wasm.js +41 -0
- package/dest/crypto/poseidon/index.d.ts +26 -0
- package/dest/crypto/poseidon/index.d.ts.map +1 -0
- package/dest/crypto/poseidon/index.js +58 -0
- package/dest/crypto/random/index.d.ts +25 -0
- package/dest/crypto/random/index.d.ts.map +1 -0
- package/dest/crypto/random/index.js +70 -0
- package/dest/crypto/random/randomness_singleton.d.ts +25 -0
- package/dest/crypto/random/randomness_singleton.d.ts.map +1 -0
- package/dest/crypto/random/randomness_singleton.js +55 -0
- package/dest/crypto/schnorr/index.d.ts +30 -0
- package/dest/crypto/schnorr/index.d.ts.map +1 -0
- package/dest/crypto/schnorr/index.js +68 -0
- package/dest/crypto/schnorr/signature.d.ts +70 -0
- package/dest/crypto/schnorr/signature.d.ts.map +1 -0
- package/dest/crypto/schnorr/signature.js +93 -0
- package/dest/crypto/secp256k1/index.d.ts +32 -0
- package/dest/crypto/secp256k1/index.d.ts.map +1 -0
- package/dest/crypto/secp256k1/index.js +116 -0
- package/dest/crypto/secp256k1-signer/index.d.ts +3 -0
- package/dest/crypto/secp256k1-signer/index.d.ts.map +1 -0
- package/dest/crypto/secp256k1-signer/index.js +2 -0
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts +24 -0
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts.map +1 -0
- package/dest/crypto/secp256k1-signer/secp256k1_signer.js +30 -0
- package/dest/crypto/secp256k1-signer/utils.d.ts +40 -0
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -0
- package/dest/crypto/secp256k1-signer/utils.js +84 -0
- package/dest/crypto/serialize.d.ts +53 -0
- package/dest/crypto/serialize.d.ts.map +1 -0
- package/dest/crypto/serialize.js +68 -0
- package/dest/crypto/sha256/index.d.ts +20 -0
- package/dest/crypto/sha256/index.d.ts.map +1 -0
- package/dest/crypto/sha256/index.js +166 -0
- package/dest/crypto/sha512/index.d.ts +11 -0
- package/dest/crypto/sha512/index.d.ts.map +1 -0
- package/dest/crypto/sha512/index.js +12 -0
- package/dest/crypto/signature/index.d.ts +19 -0
- package/dest/crypto/signature/index.d.ts.map +1 -0
- package/dest/crypto/signature/index.js +3 -0
- package/dest/crypto/sync/index.d.ts +3 -0
- package/dest/crypto/sync/index.d.ts.map +1 -0
- package/dest/crypto/sync/index.js +4 -0
- package/dest/crypto/sync/pedersen/index.d.ts +21 -0
- package/dest/crypto/sync/pedersen/index.d.ts.map +1 -0
- package/dest/crypto/sync/pedersen/index.js +38 -0
- package/dest/crypto/sync/poseidon/index.d.ts +26 -0
- package/dest/crypto/sync/poseidon/index.d.ts.map +1 -0
- package/dest/crypto/sync/poseidon/index.js +53 -0
- package/dest/decorators/index.d.ts +2 -0
- package/dest/decorators/index.d.ts.map +1 -0
- package/dest/decorators/index.js +1 -0
- package/dest/decorators/memoize.d.ts +2 -0
- package/dest/decorators/memoize.d.ts.map +1 -0
- package/dest/decorators/memoize.js +11 -0
- package/dest/error/index.d.ts +21 -0
- package/dest/error/index.d.ts.map +1 -0
- package/dest/error/index.js +17 -0
- package/dest/eth-address/index.d.ts +134 -0
- package/dest/eth-address/index.d.ts.map +1 -0
- package/dest/eth-address/index.js +198 -0
- package/dest/eth-signature/eth_signature.d.ts +62 -0
- package/dest/eth-signature/eth_signature.d.ts.map +1 -0
- package/dest/eth-signature/eth_signature.js +91 -0
- package/dest/eth-signature/index.d.ts +2 -0
- package/dest/eth-signature/index.d.ts.map +1 -0
- package/dest/eth-signature/index.js +1 -0
- package/dest/fields/coordinate.d.ts +68 -0
- package/dest/fields/coordinate.d.ts.map +1 -0
- package/dest/fields/coordinate.js +96 -0
- package/dest/fields/fields.d.ts +176 -0
- package/dest/fields/fields.d.ts.map +1 -0
- package/dest/fields/fields.js +383 -0
- package/dest/fields/index.d.ts +4 -0
- package/dest/fields/index.d.ts.map +1 -0
- package/dest/fields/index.js +3 -0
- package/dest/fields/point.d.ts +175 -0
- package/dest/fields/point.d.ts.map +1 -0
- package/dest/fields/point.js +260 -0
- package/dest/fs/index.d.ts +2 -0
- package/dest/fs/index.d.ts.map +1 -0
- package/dest/fs/index.js +1 -0
- package/dest/fs/run_in_dir.d.ts +2 -0
- package/dest/fs/run_in_dir.d.ts.map +1 -0
- package/dest/fs/run_in_dir.js +31 -0
- package/dest/index.d.ts +31 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +31 -0
- package/dest/iterable/all.d.ts +9 -0
- package/dest/iterable/all.d.ts.map +1 -0
- package/dest/iterable/all.js +18 -0
- package/dest/iterable/filter.d.ts +10 -0
- package/dest/iterable/filter.d.ts.map +1 -0
- package/dest/iterable/filter.js +48 -0
- package/dest/iterable/index.d.ts +8 -0
- package/dest/iterable/index.d.ts.map +1 -0
- package/dest/iterable/index.js +7 -0
- package/dest/iterable/isAsyncIt.d.ts +7 -0
- package/dest/iterable/isAsyncIt.d.ts.map +1 -0
- package/dest/iterable/isAsyncIt.js +7 -0
- package/dest/iterable/map.d.ts +12 -0
- package/dest/iterable/map.d.ts.map +1 -0
- package/dest/iterable/map.js +36 -0
- package/dest/iterable/peek.d.ts +19 -0
- package/dest/iterable/peek.d.ts.map +1 -0
- package/dest/iterable/peek.js +33 -0
- package/dest/iterable/sort.d.ts +14 -0
- package/dest/iterable/sort.d.ts.map +1 -0
- package/dest/iterable/sort.js +15 -0
- package/dest/iterable/take.d.ts +10 -0
- package/dest/iterable/take.d.ts.map +1 -0
- package/dest/iterable/take.js +32 -0
- package/dest/iterable/toArray.d.ts +2 -0
- package/dest/iterable/toArray.d.ts.map +1 -0
- package/dest/iterable/toArray.js +7 -0
- package/dest/jest/setup.js +7 -0
- package/dest/json-rpc/client/fetch.d.ts +32 -0
- package/dest/json-rpc/client/fetch.d.ts.map +1 -0
- package/dest/json-rpc/client/fetch.js +77 -0
- package/dest/json-rpc/client/index.d.ts +3 -0
- package/dest/json-rpc/client/index.d.ts.map +1 -0
- package/dest/json-rpc/client/index.js +2 -0
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +26 -0
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -0
- package/dest/json-rpc/client/safe_json_rpc_client.js +57 -0
- package/dest/json-rpc/client/undici.d.ts +5 -0
- package/dest/json-rpc/client/undici.d.ts.map +1 -0
- package/dest/json-rpc/client/undici.js +63 -0
- package/dest/json-rpc/convert.d.ts +27 -0
- package/dest/json-rpc/convert.d.ts.map +1 -0
- package/dest/json-rpc/convert.js +48 -0
- package/dest/json-rpc/fixtures/class_a.d.ts +11 -0
- package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/class_a.js +20 -0
- package/dest/json-rpc/fixtures/class_b.d.ts +11 -0
- package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/class_b.js +20 -0
- package/dest/json-rpc/fixtures/test_state.d.ts +89 -0
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/test_state.js +131 -0
- package/dest/json-rpc/index.d.ts +2 -0
- package/dest/json-rpc/index.d.ts.map +1 -0
- package/dest/json-rpc/index.js +1 -0
- package/dest/json-rpc/js_utils.d.ts +13 -0
- package/dest/json-rpc/js_utils.d.ts.map +1 -0
- package/dest/json-rpc/js_utils.js +16 -0
- package/dest/json-rpc/server/index.d.ts +2 -0
- package/dest/json-rpc/server/index.d.ts.map +1 -0
- package/dest/json-rpc/server/index.js +1 -0
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +140 -0
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -0
- package/dest/json-rpc/server/safe_json_rpc_server.js +346 -0
- package/dest/json-rpc/server/telemetry.d.ts +2 -0
- package/dest/json-rpc/server/telemetry.d.ts.map +1 -0
- package/dest/json-rpc/server/telemetry.js +0 -0
- package/dest/json-rpc/test/index.d.ts +2 -0
- package/dest/json-rpc/test/index.d.ts.map +1 -0
- package/dest/json-rpc/test/index.js +1 -0
- package/dest/json-rpc/test/integration.d.ts +15 -0
- package/dest/json-rpc/test/integration.d.ts.map +1 -0
- package/dest/json-rpc/test/integration.js +21 -0
- package/dest/log/console.d.ts +11 -0
- package/dest/log/console.d.ts.map +1 -0
- package/dest/log/console.js +36 -0
- package/dest/log/debug.d.ts +56 -0
- package/dest/log/debug.d.ts.map +1 -0
- package/dest/log/debug.js +75 -0
- package/dest/log/gcloud-logger-config.d.ts +14 -0
- package/dest/log/gcloud-logger-config.d.ts.map +1 -0
- package/dest/log/gcloud-logger-config.js +66 -0
- package/dest/log/index.d.ts +7 -0
- package/dest/log/index.d.ts.map +1 -0
- package/dest/log/index.js +6 -0
- package/dest/log/libp2p_logger.d.ts +7 -0
- package/dest/log/libp2p_logger.d.ts.map +1 -0
- package/dest/log/libp2p_logger.js +55 -0
- package/dest/log/log-filters.d.ts +7 -0
- package/dest/log/log-filters.d.ts.map +1 -0
- package/dest/log/log-filters.js +59 -0
- package/dest/log/log-levels.d.ts +3 -0
- package/dest/log/log-levels.d.ts.map +1 -0
- package/dest/log/log-levels.js +10 -0
- package/dest/log/log_fn.d.ts +7 -0
- package/dest/log/log_fn.d.ts.map +1 -0
- package/dest/log/log_fn.js +1 -0
- package/dest/log/log_history.d.ts +31 -0
- package/dest/log/log_history.d.ts.map +1 -0
- package/dest/log/log_history.js +38 -0
- package/dest/log/pino-logger.d.ts +57 -0
- package/dest/log/pino-logger.d.ts.map +1 -0
- package/dest/log/pino-logger.js +207 -0
- package/dest/message/index.d.ts +32 -0
- package/dest/message/index.d.ts.map +1 -0
- package/dest/message/index.js +27 -0
- package/dest/mutex/index.d.ts +53 -0
- package/dest/mutex/index.d.ts.map +1 -0
- package/dest/mutex/index.js +78 -0
- package/dest/mutex/mutex_database.d.ts +10 -0
- package/dest/mutex/mutex_database.d.ts.map +1 -0
- package/dest/mutex/mutex_database.js +4 -0
- package/dest/noir/index.d.ts +2 -0
- package/dest/noir/index.d.ts.map +1 -0
- package/dest/noir/index.js +1 -0
- package/dest/noir/noir_package_config.d.ts +129 -0
- package/dest/noir/noir_package_config.d.ts.map +1 -0
- package/dest/noir/noir_package_config.js +36 -0
- package/dest/promise/index.d.ts +3 -0
- package/dest/promise/index.d.ts.map +1 -0
- package/dest/promise/index.js +2 -0
- package/dest/promise/running-promise.d.ts +47 -0
- package/dest/promise/running-promise.d.ts.map +1 -0
- package/dest/promise/running-promise.js +110 -0
- package/dest/promise/utils.d.ts +12 -0
- package/dest/promise/utils.d.ts.map +1 -0
- package/dest/promise/utils.js +20 -0
- package/dest/queue/base_memory_queue.d.ts +65 -0
- package/dest/queue/base_memory_queue.d.ts.map +1 -0
- package/dest/queue/base_memory_queue.js +116 -0
- package/dest/queue/batch_queue.d.ts +47 -0
- package/dest/queue/batch_queue.d.ts.map +1 -0
- package/dest/queue/batch_queue.js +105 -0
- package/dest/queue/bounded_serial_queue.d.ts +56 -0
- package/dest/queue/bounded_serial_queue.d.ts.map +1 -0
- package/dest/queue/bounded_serial_queue.js +84 -0
- package/dest/queue/fifo_memory_queue.d.ts +21 -0
- package/dest/queue/fifo_memory_queue.d.ts.map +1 -0
- package/dest/queue/fifo_memory_queue.js +29 -0
- package/dest/queue/index.d.ts +7 -0
- package/dest/queue/index.d.ts.map +1 -0
- package/dest/queue/index.js +6 -0
- package/dest/queue/priority_memory_queue.d.ts +13 -0
- package/dest/queue/priority_memory_queue.d.ts.map +1 -0
- package/dest/queue/priority_memory_queue.js +16 -0
- package/dest/queue/priority_queue.d.ts +14 -0
- package/dest/queue/priority_queue.d.ts.map +1 -0
- package/dest/queue/priority_queue.js +29 -0
- package/dest/queue/semaphore.d.ts +23 -0
- package/dest/queue/semaphore.d.ts.map +1 -0
- package/dest/queue/semaphore.js +26 -0
- package/dest/queue/serial_queue.d.ts +49 -0
- package/dest/queue/serial_queue.d.ts.map +1 -0
- package/dest/queue/serial_queue.js +72 -0
- package/dest/retry/index.d.ts +44 -0
- package/dest/retry/index.d.ts.map +1 -0
- package/dest/retry/index.js +93 -0
- package/dest/running-promise/index.d.ts +2 -0
- package/dest/running-promise/index.d.ts.map +1 -0
- package/dest/running-promise/index.js +1 -0
- package/dest/schemas/api.d.ts +21 -0
- package/dest/schemas/api.d.ts.map +1 -0
- package/dest/schemas/api.js +3 -0
- package/dest/schemas/index.d.ts +6 -0
- package/dest/schemas/index.d.ts.map +1 -0
- package/dest/schemas/index.js +5 -0
- package/dest/schemas/parse.d.ts +9 -0
- package/dest/schemas/parse.d.ts.map +1 -0
- package/dest/schemas/parse.js +22 -0
- package/dest/schemas/schemas.d.ts +45 -0
- package/dest/schemas/schemas.d.ts.map +1 -0
- package/dest/schemas/schemas.js +38 -0
- package/dest/schemas/types.d.ts +3 -0
- package/dest/schemas/types.d.ts.map +1 -0
- package/dest/schemas/types.js +1 -0
- package/dest/schemas/utils.d.ts +53 -0
- package/dest/schemas/utils.d.ts.map +1 -0
- package/dest/schemas/utils.js +60 -0
- package/dest/serialize/buffer_reader.d.ts +239 -0
- package/dest/serialize/buffer_reader.d.ts.map +1 -0
- package/dest/serialize/buffer_reader.js +290 -0
- package/dest/serialize/field_reader.d.ts +112 -0
- package/dest/serialize/field_reader.d.ts.map +1 -0
- package/dest/serialize/field_reader.js +147 -0
- package/dest/serialize/free_funcs.d.ts +105 -0
- package/dest/serialize/free_funcs.d.ts.map +1 -0
- package/dest/serialize/free_funcs.js +189 -0
- package/dest/serialize/index.d.ts +7 -0
- package/dest/serialize/index.d.ts.map +1 -0
- package/dest/serialize/index.js +6 -0
- package/dest/serialize/serialize.d.ts +182 -0
- package/dest/serialize/serialize.d.ts.map +1 -0
- package/dest/serialize/serialize.js +248 -0
- package/dest/serialize/type_registry.d.ts +23 -0
- package/dest/serialize/type_registry.d.ts.map +1 -0
- package/dest/serialize/type_registry.js +61 -0
- package/dest/serialize/types.d.ts +33 -0
- package/dest/serialize/types.d.ts.map +1 -0
- package/dest/serialize/types.js +21 -0
- package/dest/sleep/index.d.ts +51 -0
- package/dest/sleep/index.d.ts.map +1 -0
- package/dest/sleep/index.js +67 -0
- package/dest/string/index.d.ts +11 -0
- package/dest/string/index.d.ts.map +1 -0
- package/dest/string/index.js +24 -0
- package/dest/testing/files/index.d.ts +20 -0
- package/dest/testing/files/index.d.ts.map +1 -0
- package/dest/testing/files/index.js +58 -0
- package/dest/testing/index.d.ts +4 -0
- package/dest/testing/index.d.ts.map +1 -0
- package/dest/testing/index.js +3 -0
- package/dest/testing/port_allocator.d.ts +10 -0
- package/dest/testing/port_allocator.d.ts.map +1 -0
- package/dest/testing/port_allocator.js +29 -0
- package/dest/testing/snapshot_serializer.d.ts +5 -0
- package/dest/testing/snapshot_serializer.d.ts.map +1 -0
- package/dest/testing/snapshot_serializer.js +32 -0
- package/dest/testing/test_data.d.ts +7 -0
- package/dest/testing/test_data.d.ts.map +1 -0
- package/dest/testing/test_data.js +29 -0
- package/dest/timer/date.d.ts +13 -0
- package/dest/timer/date.d.ts.map +1 -0
- package/dest/timer/date.js +24 -0
- package/dest/timer/elapsed.d.ts +13 -0
- package/dest/timer/elapsed.d.ts.map +1 -0
- package/dest/timer/elapsed.js +25 -0
- package/dest/timer/index.d.ts +5 -0
- package/dest/timer/index.d.ts.map +1 -0
- package/dest/timer/index.js +4 -0
- package/dest/timer/timeout.d.ts +41 -0
- package/dest/timer/timeout.d.ts.map +1 -0
- package/dest/timer/timeout.js +66 -0
- package/dest/timer/timer.d.ts +37 -0
- package/dest/timer/timer.d.ts.map +1 -0
- package/dest/timer/timer.js +40 -0
- package/dest/transport/browser/index.d.ts +5 -0
- package/dest/transport/browser/index.d.ts.map +1 -0
- package/dest/transport/browser/index.js +4 -0
- package/dest/transport/browser/message_port_socket.d.ts +37 -0
- package/dest/transport/browser/message_port_socket.d.ts.map +1 -0
- package/dest/transport/browser/message_port_socket.js +42 -0
- package/dest/transport/browser/shared_worker_connector.d.ts +19 -0
- package/dest/transport/browser/shared_worker_connector.d.ts.map +1 -0
- package/dest/transport/browser/shared_worker_connector.js +19 -0
- package/dest/transport/browser/shared_worker_listener.d.ts +38 -0
- package/dest/transport/browser/shared_worker_listener.d.ts.map +1 -0
- package/dest/transport/browser/shared_worker_listener.js +33 -0
- package/dest/transport/browser/worker_connector.d.ts +26 -0
- package/dest/transport/browser/worker_connector.d.ts.map +1 -0
- package/dest/transport/browser/worker_connector.js +30 -0
- package/dest/transport/browser/worker_listener.d.ts +39 -0
- package/dest/transport/browser/worker_listener.d.ts.map +1 -0
- package/dest/transport/browser/worker_listener.js +35 -0
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +25 -0
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +1 -0
- package/dest/transport/dispatch/create_dispatch_fn.js +17 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +102 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -0
- package/dest/transport/dispatch/create_dispatch_proxy.js +59 -0
- package/dest/transport/dispatch/messages.d.ts +52 -0
- package/dest/transport/dispatch/messages.d.ts.map +1 -0
- package/dest/transport/dispatch/messages.js +13 -0
- package/dest/transport/index.d.ts +12 -0
- package/dest/transport/index.d.ts.map +1 -0
- package/dest/transport/index.js +11 -0
- package/dest/transport/interface/connector.d.ts +8 -0
- package/dest/transport/interface/connector.d.ts.map +1 -0
- package/dest/transport/interface/connector.js +3 -0
- package/dest/transport/interface/listener.d.ts +13 -0
- package/dest/transport/interface/listener.d.ts.map +1 -0
- package/dest/transport/interface/listener.js +4 -0
- package/dest/transport/interface/socket.d.ts +13 -0
- package/dest/transport/interface/socket.d.ts.map +1 -0
- package/dest/transport/interface/socket.js +7 -0
- package/dest/transport/interface/transferable.d.ts +68 -0
- package/dest/transport/interface/transferable.d.ts.map +1 -0
- package/dest/transport/interface/transferable.js +63 -0
- package/dest/transport/node/index.d.ts +3 -0
- package/dest/transport/node/index.d.ts.map +1 -0
- package/dest/transport/node/index.js +2 -0
- package/dest/transport/node/node_connector.d.ts +28 -0
- package/dest/transport/node/node_connector.d.ts.map +1 -0
- package/dest/transport/node/node_connector.js +26 -0
- package/dest/transport/node/node_connector_socket.d.ts +42 -0
- package/dest/transport/node/node_connector_socket.d.ts.map +1 -0
- package/dest/transport/node/node_connector_socket.js +44 -0
- package/dest/transport/node/node_listener.d.ts +26 -0
- package/dest/transport/node/node_listener.d.ts.map +1 -0
- package/dest/transport/node/node_listener.js +26 -0
- package/dest/transport/node/node_listener_socket.d.ts +37 -0
- package/dest/transport/node/node_listener_socket.d.ts.map +1 -0
- package/dest/transport/node/node_listener_socket.js +40 -0
- package/dest/transport/transport_client.d.ts +61 -0
- package/dest/transport/transport_client.d.ts.map +1 -0
- package/dest/transport/transport_client.js +96 -0
- package/dest/transport/transport_server.d.ts +56 -0
- package/dest/transport/transport_server.d.ts.map +1 -0
- package/dest/transport/transport_server.js +114 -0
- package/dest/trees/hasher.d.ts +39 -0
- package/dest/trees/hasher.d.ts.map +1 -0
- package/dest/trees/hasher.js +5 -0
- package/dest/trees/index.d.ts +11 -0
- package/dest/trees/index.d.ts.map +1 -0
- package/dest/trees/index.js +10 -0
- package/dest/trees/indexed_merkle_tree.d.ts +13 -0
- package/dest/trees/indexed_merkle_tree.d.ts.map +1 -0
- package/dest/trees/indexed_merkle_tree.js +27 -0
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +23 -0
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -0
- package/dest/trees/indexed_merkle_tree_calculator.js +83 -0
- package/dest/trees/indexed_tree_leaf.d.ts +57 -0
- package/dest/trees/indexed_tree_leaf.d.ts.map +1 -0
- package/dest/trees/indexed_tree_leaf.js +5 -0
- package/dest/trees/membership_witness.d.ts +62 -0
- package/dest/trees/membership_witness.d.ts.map +1 -0
- package/dest/trees/membership_witness.js +70 -0
- package/dest/trees/merkle_tree.d.ts +18 -0
- package/dest/trees/merkle_tree.d.ts.map +1 -0
- package/dest/trees/merkle_tree.js +58 -0
- package/dest/trees/merkle_tree_calculator.d.ts +16 -0
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -0
- package/dest/trees/merkle_tree_calculator.js +61 -0
- package/dest/trees/sibling_path.d.ts +132 -0
- package/dest/trees/sibling_path.d.ts.map +1 -0
- package/dest/trees/sibling_path.js +144 -0
- package/dest/trees/unbalanced_merkle_tree.d.ts +17 -0
- package/dest/trees/unbalanced_merkle_tree.d.ts.map +1 -0
- package/dest/trees/unbalanced_merkle_tree.js +100 -0
- package/dest/trees/unbalanced_tree_store.d.ts +19 -0
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -0
- package/dest/trees/unbalanced_tree_store.js +94 -0
- package/dest/types/index.d.ts +19 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +3 -0
- package/dest/url/index.d.ts +9 -0
- package/dest/url/index.d.ts.map +1 -0
- package/dest/url/index.js +62 -0
- package/dest/validation/index.d.ts +9 -0
- package/dest/validation/index.d.ts.map +1 -0
- package/dest/validation/index.js +15 -0
- package/dest/wasm/empty_wasi_sdk.d.ts +130 -0
- package/dest/wasm/empty_wasi_sdk.d.ts.map +1 -0
- package/dest/wasm/empty_wasi_sdk.js +148 -0
- package/dest/wasm/index.d.ts +2 -0
- package/dest/wasm/index.d.ts.map +1 -0
- package/dest/wasm/index.js +1 -0
- package/dest/wasm/wasm_module.d.ts +136 -0
- package/dest/wasm/wasm_module.d.ts.map +1 -0
- package/dest/wasm/wasm_module.js +196 -0
- package/dest/worker/browser/index.d.ts +3 -0
- package/dest/worker/browser/index.d.ts.map +1 -0
- package/dest/worker/browser/index.js +2 -0
- package/dest/worker/browser/start_web_module.d.ts +7 -0
- package/dest/worker/browser/start_web_module.d.ts.map +1 -0
- package/dest/worker/browser/start_web_module.js +27 -0
- package/dest/worker/browser/web_data_store.d.ts +24 -0
- package/dest/worker/browser/web_data_store.d.ts.map +1 -0
- package/dest/worker/browser/web_data_store.js +29 -0
- package/dest/worker/browser/web_worker.d.ts +10 -0
- package/dest/worker/browser/web_worker.d.ts.map +1 -0
- package/dest/worker/browser/web_worker.js +25 -0
- package/dest/worker/data_store.d.ts +21 -0
- package/dest/worker/data_store.d.ts.map +1 -0
- package/dest/worker/data_store.js +3 -0
- package/dest/worker/index.d.ts +3 -0
- package/dest/worker/index.d.ts.map +1 -0
- package/dest/worker/index.js +1 -0
- package/dest/worker/node/index.d.ts +3 -0
- package/dest/worker/node/index.d.ts.map +1 -0
- package/dest/worker/node/index.js +2 -0
- package/dest/worker/node/node_data_store.d.ts +13 -0
- package/dest/worker/node/node_data_store.d.ts.map +1 -0
- package/dest/worker/node/node_data_store.js +20 -0
- package/dest/worker/node/node_worker.d.ts +6 -0
- package/dest/worker/node/node_worker.d.ts.map +1 -0
- package/dest/worker/node/node_worker.js +22 -0
- package/dest/worker/node/start_node_module.d.ts +7 -0
- package/dest/worker/node/start_node_module.d.ts.map +1 -0
- package/dest/worker/node/start_node_module.js +31 -0
- package/dest/worker/wasm_worker.d.ts +9 -0
- package/dest/worker/wasm_worker.d.ts.map +1 -0
- package/dest/worker/wasm_worker.js +3 -0
- package/dest/worker/worker_pool.d.ts +40 -0
- package/dest/worker/worker_pool.d.ts.map +1 -0
- package/dest/worker/worker_pool.js +51 -0
- package/package.json +176 -0
- package/src/array/array.ts +150 -0
- package/src/array/index.ts +1 -0
- package/src/async-map/index.ts +18 -0
- package/src/async-pool/index.ts +50 -0
- package/src/bigint-buffer/index.ts +87 -0
- package/src/buffer/buffer32.ts +144 -0
- package/src/buffer/index.ts +1 -0
- package/src/collection/array.ts +203 -0
- package/src/collection/index.ts +2 -0
- package/src/collection/object.ts +52 -0
- package/src/committable/committable.ts +46 -0
- package/src/committable/index.ts +1 -0
- package/src/config/env_var.ts +207 -0
- package/src/config/index.ts +167 -0
- package/src/crypto/aes128/index.ts +59 -0
- package/src/crypto/ecdsa/index.ts +70 -0
- package/src/crypto/ecdsa/signature.ts +100 -0
- package/src/crypto/grumpkin/index.ts +97 -0
- package/src/crypto/index.ts +14 -0
- package/src/crypto/keccak/index.ts +283 -0
- package/src/crypto/keys/index.ts +10 -0
- package/src/crypto/pedersen/index.ts +1 -0
- package/src/crypto/pedersen/pedersen.elliptic.ts +584 -0
- package/src/crypto/pedersen/pedersen.noble.ts +573 -0
- package/src/crypto/pedersen/pedersen.wasm.ts +48 -0
- package/src/crypto/poseidon/index.ts +77 -0
- package/src/crypto/random/index.ts +85 -0
- package/src/crypto/random/randomness_singleton.ts +62 -0
- package/src/crypto/schnorr/index.ts +55 -0
- package/src/crypto/schnorr/signature.ts +116 -0
- package/src/crypto/secp256k1/index.ts +57 -0
- package/src/crypto/secp256k1-signer/index.ts +2 -0
- package/src/crypto/secp256k1-signer/secp256k1_signer.ts +38 -0
- package/src/crypto/secp256k1-signer/utils.ts +99 -0
- package/src/crypto/serialize.ts +85 -0
- package/src/crypto/sha256/index.ts +147 -0
- package/src/crypto/sha512/index.ts +16 -0
- package/src/crypto/signature/index.ts +17 -0
- package/src/crypto/sync/index.ts +6 -0
- package/src/crypto/sync/pedersen/index.ts +45 -0
- package/src/crypto/sync/poseidon/index.ts +76 -0
- package/src/decorators/index.ts +1 -0
- package/src/decorators/memoize.ts +11 -0
- package/src/error/index.ts +22 -0
- package/src/eth-address/index.ts +241 -0
- package/src/eth-signature/eth_signature.ts +128 -0
- package/src/eth-signature/index.ts +1 -0
- package/src/fields/coordinate.ts +104 -0
- package/src/fields/fields.ts +505 -0
- package/src/fields/index.ts +3 -0
- package/src/fields/point.ts +300 -0
- package/src/fs/index.ts +1 -0
- package/src/fs/run_in_dir.ts +33 -0
- package/src/index.ts +31 -0
- package/src/iterable/all.ts +32 -0
- package/src/iterable/filter.ts +77 -0
- package/src/iterable/index.ts +7 -0
- package/src/iterable/isAsyncIt.ts +8 -0
- package/src/iterable/map.ts +66 -0
- package/src/iterable/peek.ts +58 -0
- package/src/iterable/sort.ts +39 -0
- package/src/iterable/take.ts +54 -0
- package/src/iterable/toArray.ts +9 -0
- package/src/jest/setup.mjs +9 -0
- package/src/json-rpc/README.md +55 -0
- package/src/json-rpc/client/fetch.ts +103 -0
- package/src/json-rpc/client/index.ts +2 -0
- package/src/json-rpc/client/safe_json_rpc_client.ts +67 -0
- package/src/json-rpc/client/undici.ts +75 -0
- package/src/json-rpc/convert.ts +61 -0
- package/src/json-rpc/fixtures/class_a.ts +15 -0
- package/src/json-rpc/fixtures/class_b.ts +15 -0
- package/src/json-rpc/fixtures/test_state.ts +143 -0
- package/src/json-rpc/index.ts +1 -0
- package/src/json-rpc/js_utils.ts +21 -0
- package/src/json-rpc/server/index.ts +1 -0
- package/src/json-rpc/server/safe_json_rpc_server.ts +376 -0
- package/src/json-rpc/server/telemetry.ts +0 -0
- package/src/json-rpc/test/index.ts +1 -0
- package/src/json-rpc/test/integration.ts +35 -0
- package/src/log/console.ts +39 -0
- package/src/log/debug.ts +104 -0
- package/src/log/gcloud-logger-config.ts +71 -0
- package/src/log/index.ts +6 -0
- package/src/log/libp2p_logger.ts +67 -0
- package/src/log/log-filters.ts +63 -0
- package/src/log/log-levels.ts +3 -0
- package/src/log/log_fn.ts +5 -0
- package/src/log/log_history.ts +44 -0
- package/src/log/pino-logger.ts +243 -0
- package/src/message/index.ts +43 -0
- package/src/mutex/index.ts +84 -0
- package/src/mutex/mutex_database.ts +12 -0
- package/src/noir/index.ts +1 -0
- package/src/noir/noir_package_config.ts +54 -0
- package/src/promise/index.ts +2 -0
- package/src/promise/running-promise.ts +125 -0
- package/src/promise/utils.ts +29 -0
- package/src/queue/base_memory_queue.ts +138 -0
- package/src/queue/batch_queue.ts +120 -0
- package/src/queue/bounded_serial_queue.ts +100 -0
- package/src/queue/fifo_memory_queue.ts +39 -0
- package/src/queue/index.ts +6 -0
- package/src/queue/priority_memory_queue.ts +20 -0
- package/src/queue/priority_queue.ts +34 -0
- package/src/queue/semaphore.ts +33 -0
- package/src/queue/serial_queue.ts +86 -0
- package/src/retry/index.ts +100 -0
- package/src/running-promise/index.ts +1 -0
- package/src/schemas/api.ts +47 -0
- package/src/schemas/index.ts +5 -0
- package/src/schemas/parse.ts +29 -0
- package/src/schemas/schemas.ts +64 -0
- package/src/schemas/types.ts +3 -0
- package/src/schemas/utils.ts +112 -0
- package/src/serialize/buffer_reader.ts +383 -0
- package/src/serialize/field_reader.ts +184 -0
- package/src/serialize/free_funcs.ts +204 -0
- package/src/serialize/index.ts +6 -0
- package/src/serialize/serialize.ts +336 -0
- package/src/serialize/type_registry.ts +75 -0
- package/src/serialize/types.ts +40 -0
- package/src/sleep/index.ts +75 -0
- package/src/string/index.ts +31 -0
- package/src/testing/files/index.ts +69 -0
- package/src/testing/index.ts +3 -0
- package/src/testing/port_allocator.ts +31 -0
- package/src/testing/snapshot_serializer.ts +33 -0
- package/src/testing/test_data.ts +36 -0
- package/src/timer/date.ts +24 -0
- package/src/timer/elapsed.ts +23 -0
- package/src/timer/index.ts +4 -0
- package/src/timer/timeout.ts +70 -0
- package/src/timer/timer.ts +48 -0
- package/src/transport/browser/index.ts +4 -0
- package/src/transport/browser/message_port_socket.ts +48 -0
- package/src/transport/browser/shared_worker_connector.ts +21 -0
- package/src/transport/browser/shared_worker_listener.ts +53 -0
- package/src/transport/browser/worker_connector.ts +30 -0
- package/src/transport/browser/worker_listener.ts +54 -0
- package/src/transport/dispatch/create_dispatch_fn.ts +35 -0
- package/src/transport/dispatch/create_dispatch_proxy.ts +141 -0
- package/src/transport/dispatch/messages.ts +58 -0
- package/src/transport/index.ts +11 -0
- package/src/transport/interface/connector.ts +9 -0
- package/src/transport/interface/listener.ts +16 -0
- package/src/transport/interface/socket.ts +15 -0
- package/src/transport/interface/transferable.ts +125 -0
- package/src/transport/node/index.ts +2 -0
- package/src/transport/node/node_connector.ts +30 -0
- package/src/transport/node/node_connector_socket.ts +52 -0
- package/src/transport/node/node_listener.ts +34 -0
- package/src/transport/node/node_listener_socket.ts +48 -0
- package/src/transport/transport_client.ts +131 -0
- package/src/transport/transport_server.ts +108 -0
- package/src/trees/hasher.ts +39 -0
- package/src/trees/index.ts +10 -0
- package/src/trees/indexed_merkle_tree.ts +36 -0
- package/src/trees/indexed_merkle_tree_calculator.ts +94 -0
- package/src/trees/indexed_tree_leaf.ts +56 -0
- package/src/trees/membership_witness.ts +99 -0
- package/src/trees/merkle_tree.ts +72 -0
- package/src/trees/merkle_tree_calculator.ts +67 -0
- package/src/trees/sibling_path.ts +183 -0
- package/src/trees/unbalanced_merkle_tree.ts +103 -0
- package/src/trees/unbalanced_tree_store.ts +102 -0
- package/src/types/index.ts +25 -0
- package/src/url/index.ts +73 -0
- package/src/validation/index.ts +18 -0
- package/src/wasm/README.md +6 -0
- package/src/wasm/empty_wasi_sdk.ts +166 -0
- package/src/wasm/fixtures/gcd.wasm +0 -0
- package/src/wasm/fixtures/gcd.wat +27 -0
- package/src/wasm/index.ts +1 -0
- package/src/wasm/wasm_module.ts +260 -0
- package/src/worker/browser/index.ts +2 -0
- package/src/worker/browser/start_web_module.ts +24 -0
- package/src/worker/browser/web_data_store.ts +38 -0
- package/src/worker/browser/web_worker.ts +25 -0
- package/src/worker/data_store.ts +19 -0
- package/src/worker/index.ts +2 -0
- package/src/worker/node/index.ts +2 -0
- package/src/worker/node/node_data_store.ts +27 -0
- package/src/worker/node/node_worker.ts +23 -0
- package/src/worker/node/start_node_module.ts +30 -0
- package/src/worker/wasm_worker.ts +7 -0
- package/src/worker/worker_pool.ts +73 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import EventEmitter from 'events';
|
|
2
|
+
import { format } from 'util';
|
|
3
|
+
|
|
4
|
+
import { createLogger } from '../log/index.js';
|
|
5
|
+
import { type EventMessage, type ResponseMessage, isEventMessage } from './dispatch/messages.js';
|
|
6
|
+
import type { Connector } from './interface/connector.js';
|
|
7
|
+
import type { Socket } from './interface/socket.js';
|
|
8
|
+
|
|
9
|
+
const log = createLogger('foundation:transport_client');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Represents a pending request in the TransportClient.
|
|
13
|
+
* Contains information about the message ID, and resolve/reject functions for handling responses.
|
|
14
|
+
* Used to track and manage asynchronous request/response communication with the TransportServer.
|
|
15
|
+
*/
|
|
16
|
+
interface PendingRequest {
|
|
17
|
+
/**
|
|
18
|
+
* The unique message identifier used for tracking and matching request/response pairs.
|
|
19
|
+
*/
|
|
20
|
+
msgId: number;
|
|
21
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
22
|
+
resolve(data: any): void;
|
|
23
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
24
|
+
reject(error: Error): void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Represents a transport client for communication between TransportServer and clients.
|
|
29
|
+
* Provides request/response functionality, event handling, and multiplexing support
|
|
30
|
+
* for efficient and concurrent communication with a corresponding TransportServer.
|
|
31
|
+
*/
|
|
32
|
+
export interface ITransportClient<Payload> extends EventEmitter {
|
|
33
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
34
|
+
on(name: 'event_msg', handler: (payload: Payload) => void): this;
|
|
35
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
36
|
+
emit(name: 'event_msg', payload: Payload): boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A TransportClient provides a request/response and event api to a corresponding TransportServer.
|
|
41
|
+
* If `broadcast` is called on TransportServer, TransportClients will emit an `event_msg`.
|
|
42
|
+
* The `request` method will block until a response is returned from the TransportServer's dispatch function.
|
|
43
|
+
* Request multiplexing is supported.
|
|
44
|
+
*/
|
|
45
|
+
export class TransportClient<Payload> extends EventEmitter {
|
|
46
|
+
private msgId = 0;
|
|
47
|
+
private pendingRequests: PendingRequest[] = [];
|
|
48
|
+
private socket?: Socket;
|
|
49
|
+
|
|
50
|
+
constructor(private transportConnect: Connector) {
|
|
51
|
+
super();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Initializes and opens the socket connection for the TransportClient.
|
|
56
|
+
* This method creates a new Socket instance using the provided Connector,
|
|
57
|
+
* registers a handler for incoming messages, and establishes the connection.
|
|
58
|
+
* It should be called before making any requests or handling events.
|
|
59
|
+
*
|
|
60
|
+
* @throws An error if the socket is already open or there's an issue opening the connection.
|
|
61
|
+
* @returns A Promise that resolves when the socket connection is successfully opened.
|
|
62
|
+
*/
|
|
63
|
+
async open() {
|
|
64
|
+
this.socket = await this.transportConnect.createSocket();
|
|
65
|
+
this.socket.registerHandler(msg => this.handleSocketMessage(msg));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Close the transport client's socket connection and remove all event listeners.
|
|
70
|
+
* This method should be called when the client is no longer needed to ensure proper cleanup
|
|
71
|
+
* and prevent potential memory leaks. Once closed, the client cannot be reused and a new
|
|
72
|
+
* instance must be created if another connection is needed.
|
|
73
|
+
*/
|
|
74
|
+
close() {
|
|
75
|
+
this.socket?.close();
|
|
76
|
+
this.socket = undefined;
|
|
77
|
+
this.removeAllListeners();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Sends a request to the TransportServer with the given payload and transferable objects.
|
|
82
|
+
* The method will block until a response from the TransportServer's dispatch function is returned.
|
|
83
|
+
* Request multiplexing is supported, allowing multiple requests to be sent concurrently.
|
|
84
|
+
*
|
|
85
|
+
* @param payload - The message payload to send to the server.
|
|
86
|
+
* @param transfer - An optional array of ArrayBuffer, MessagePort, or ImageBitmap objects to transfer ownership.
|
|
87
|
+
* @returns A Promise that resolves with the server's response data or rejects with an error message.
|
|
88
|
+
*/
|
|
89
|
+
request(payload: Payload, transfer?: Transferable[]) {
|
|
90
|
+
if (!this.socket) {
|
|
91
|
+
throw new Error('Socket not open.');
|
|
92
|
+
}
|
|
93
|
+
const msgId = this.msgId++;
|
|
94
|
+
const msg = { msgId, payload };
|
|
95
|
+
log.debug(format(`->`, msg));
|
|
96
|
+
return new Promise<any>((resolve, reject) => {
|
|
97
|
+
this.pendingRequests.push({ resolve, reject, msgId });
|
|
98
|
+
this.socket!.send(msg, transfer).catch(reject);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Handles incoming socket messages from the TransportServer, such as ResponseMessage and EventMessage.
|
|
104
|
+
* If it's an EventMessage, emits an 'event_msg' event with the payload.
|
|
105
|
+
* If it's a ResponseMessage, resolves or rejects the corresponding pending request based on the message content.
|
|
106
|
+
*
|
|
107
|
+
* @param msg - The ResponseMessage or EventMessage received from the TransportServer, or undefined if the remote socket closed.
|
|
108
|
+
*/
|
|
109
|
+
private handleSocketMessage(msg: ResponseMessage<Payload> | EventMessage<Payload> | undefined) {
|
|
110
|
+
if (msg === undefined) {
|
|
111
|
+
// The remote socket closed.
|
|
112
|
+
this.close();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
log.debug(format(`<-`, msg));
|
|
116
|
+
if (isEventMessage(msg)) {
|
|
117
|
+
this.emit('event_msg', msg.payload);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const reqIndex = this.pendingRequests.findIndex(r => r.msgId === msg.msgId);
|
|
121
|
+
if (reqIndex === -1) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const [pending] = this.pendingRequests.splice(reqIndex, 1);
|
|
125
|
+
if (msg.error) {
|
|
126
|
+
pending.reject(new Error(msg.error));
|
|
127
|
+
} else {
|
|
128
|
+
pending.resolve(msg.payload);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { RequestMessage, ResponseMessage } from './dispatch/messages.js';
|
|
2
|
+
import type { Listener } from './interface/listener.js';
|
|
3
|
+
import type { Socket } from './interface/socket.js';
|
|
4
|
+
import { isTransferDescriptor } from './interface/transferable.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Keeps track of clients, providing a broadcast, and request/response api with multiplexing.
|
|
8
|
+
*/
|
|
9
|
+
export class TransportServer<Payload> {
|
|
10
|
+
private sockets: Socket[] = [];
|
|
11
|
+
|
|
12
|
+
constructor(private listener: Listener, private msgHandlerFn: (msg: Payload) => Promise<any>) {}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Starts the TransportServer, allowing it to accept new connections and handle incoming messages.
|
|
16
|
+
* The server will listen for 'new_socket' events from the underlying listener and invoke the provided message handler function
|
|
17
|
+
* for each received message. The server remains active until the 'stop' method is called.
|
|
18
|
+
*/
|
|
19
|
+
start() {
|
|
20
|
+
this.listener.on('new_socket', client => this.handleNewSocket(client));
|
|
21
|
+
this.listener.open();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Stops accepting new connections. It doesn't close existing sockets.
|
|
26
|
+
* It's expected the clients will gracefully complete by closing their end, sending an `undefined` message.
|
|
27
|
+
*/
|
|
28
|
+
stop() {
|
|
29
|
+
this.listener.close();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Sends a broadcast message to all connected clients.
|
|
34
|
+
* The given payload will be sent to all the clients currently connected to the TransportServer.
|
|
35
|
+
* It waits for all the messages to be sent and resolves when they are all sent successfully.
|
|
36
|
+
*
|
|
37
|
+
* @param msg - The payload to broadcast to all connected clients.
|
|
38
|
+
* @returns A Promise that resolves when all messages have been sent successfully.
|
|
39
|
+
*/
|
|
40
|
+
async broadcast(msg: Payload) {
|
|
41
|
+
await Promise.all(this.sockets.map(s => s.send({ payload: msg })));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Handles the addition of a new socket to the server by registering a message handler for the client
|
|
46
|
+
* and adding the socket to the list of active sockets. The message handler processes incoming messages
|
|
47
|
+
* from the client, including detecting client disconnection and removing the closed socket.
|
|
48
|
+
*
|
|
49
|
+
* @param socket - The new Socket instance that has connected to the server.
|
|
50
|
+
*/
|
|
51
|
+
private handleNewSocket(socket: Socket) {
|
|
52
|
+
socket.registerHandler(async msg => {
|
|
53
|
+
if (msg === undefined) {
|
|
54
|
+
// Client socket has closed. Remove it from the list of sockets. Call close on it for any cleanup.
|
|
55
|
+
const socketIndex = this.sockets.findIndex(s => s === socket);
|
|
56
|
+
const [closingSocket] = this.sockets.splice(socketIndex, 1);
|
|
57
|
+
closingSocket.close();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
return await this.handleSocketMessage(socket, msg);
|
|
61
|
+
});
|
|
62
|
+
this.sockets.push(socket);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Detect the 'transferables' argument to our socket from our message
|
|
67
|
+
* handler return type.
|
|
68
|
+
* @param data - The compound payload data.
|
|
69
|
+
* @returns The split data and transferables.
|
|
70
|
+
*/
|
|
71
|
+
private getPayloadAndTransfers(data: any): [any, Transferable[]] {
|
|
72
|
+
if (isTransferDescriptor(data)) {
|
|
73
|
+
// We treat PayloadWithTransfers specially so that we're able to
|
|
74
|
+
// attach transferables while keeping a simple return-type based usage
|
|
75
|
+
return [data.send, data.transferables];
|
|
76
|
+
}
|
|
77
|
+
if (data instanceof Uint8Array) {
|
|
78
|
+
// We may want to devise a better solution to this. We maybe given a view over a non cloneable/transferrable
|
|
79
|
+
// ArrayBuffer (such as a view over wasm memory). In this case we want to take a copy, and then transfer it.
|
|
80
|
+
const respPayload = data instanceof Uint8Array && ArrayBuffer.isView(data) ? new Uint8Array(data) : data;
|
|
81
|
+
const transferables = data instanceof Uint8Array ? [respPayload.buffer] : [];
|
|
82
|
+
return [respPayload, transferables];
|
|
83
|
+
}
|
|
84
|
+
return [data, []];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Handles incoming socket messages, processing the request and sending back a response.
|
|
88
|
+
* This function is responsible for invoking the registered message handler function with the received
|
|
89
|
+
* payload, extracting the result and transferables, and sending a response message back to the client.
|
|
90
|
+
* In case of an error during message handling, it sends an error response with the stack trace.
|
|
91
|
+
*
|
|
92
|
+
* @param socket - The Socket instance from which the message was received.
|
|
93
|
+
* @param msg - The RequestMessage object containing the message ID and payload.
|
|
94
|
+
*/
|
|
95
|
+
private async handleSocketMessage(socket: Socket, { msgId, payload }: RequestMessage<Payload>) {
|
|
96
|
+
try {
|
|
97
|
+
const data = await this.msgHandlerFn(payload);
|
|
98
|
+
|
|
99
|
+
const [respPayload, transferables] = this.getPayloadAndTransfers(data);
|
|
100
|
+
const rep: ResponseMessage<Payload> = { msgId, payload: respPayload };
|
|
101
|
+
|
|
102
|
+
await socket.send(rep, transferables);
|
|
103
|
+
} catch (err: any) {
|
|
104
|
+
const rep: ResponseMessage<Payload> = { msgId, error: err.stack };
|
|
105
|
+
await socket.send(rep);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines hasher interface used by Merkle trees.
|
|
3
|
+
*/
|
|
4
|
+
export interface Hasher {
|
|
5
|
+
/**
|
|
6
|
+
* Hash two arrays.
|
|
7
|
+
* @param lhs - The first array.
|
|
8
|
+
* @param rhs - The second array.
|
|
9
|
+
* @returns The new 32-byte hash.
|
|
10
|
+
*/
|
|
11
|
+
hash(lhs: Uint8Array, rhs: Uint8Array): Buffer;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Hashes an array of buffers.
|
|
15
|
+
* @param inputs - The array of buffers to hash.
|
|
16
|
+
* @returns The resulting 32-byte hash.
|
|
17
|
+
*/
|
|
18
|
+
hashInputs(inputs: Buffer[]): Buffer;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Defines an async hasher interface used by Merkle trees.
|
|
23
|
+
*/
|
|
24
|
+
export interface AsyncHasher {
|
|
25
|
+
/**
|
|
26
|
+
* Hash two arrays.
|
|
27
|
+
* @param lhs - The first array.
|
|
28
|
+
* @param rhs - The second array.
|
|
29
|
+
* @returns The new 32-byte hash.
|
|
30
|
+
*/
|
|
31
|
+
hash(lhs: Uint8Array, rhs: Uint8Array): Promise<Buffer>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Hashes an array of buffers.
|
|
35
|
+
* @param inputs - The array of buffers to hash.
|
|
36
|
+
* @returns The resulting 32-byte hash.
|
|
37
|
+
*/
|
|
38
|
+
hashInputs(inputs: Buffer[]): Promise<Buffer>;
|
|
39
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './unbalanced_merkle_tree.js';
|
|
2
|
+
export * from './unbalanced_tree_store.js';
|
|
3
|
+
export * from './merkle_tree_calculator.js';
|
|
4
|
+
export * from './merkle_tree.js';
|
|
5
|
+
export * from './indexed_merkle_tree_calculator.js';
|
|
6
|
+
export * from './indexed_merkle_tree.js';
|
|
7
|
+
export * from './sibling_path.js';
|
|
8
|
+
export * from './membership_witness.js';
|
|
9
|
+
export * from './hasher.js';
|
|
10
|
+
export * from './indexed_tree_leaf.js';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Fr } from '../fields/index.js';
|
|
2
|
+
import { assertLength } from '../serialize/index.js';
|
|
3
|
+
import type { IndexedTreeLeafPreimage } from './indexed_tree_leaf.js';
|
|
4
|
+
import { MembershipWitness } from './membership_witness.js';
|
|
5
|
+
import { MerkleTree } from './merkle_tree.js';
|
|
6
|
+
|
|
7
|
+
/** A simple immutable indexed merkle tree container. Use a IndexedMerkleTreeCalculator to create a new instance from a set of leaves. */
|
|
8
|
+
export class IndexedMerkleTree<T extends IndexedTreeLeafPreimage, N extends number> extends MerkleTree {
|
|
9
|
+
constructor(height: N, nodes: Buffer[], public readonly leafPreimages: T[]) {
|
|
10
|
+
super(height, nodes);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public getLowLeaf(value: bigint): T {
|
|
14
|
+
let lowLeaf: T | undefined;
|
|
15
|
+
this.leafPreimages.forEach(leaf => {
|
|
16
|
+
if (leaf.getKey() < value && (leaf.getNextKey() > value || leaf.getNextKey() == BigInt(0))) {
|
|
17
|
+
lowLeaf = leaf;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
if (!lowLeaf) {
|
|
21
|
+
throw new Error(`Couldn't find low leaf for ${value}`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return lowLeaf;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public getMembershipWitness(leafIndexOrLeaf: number | Buffer): MembershipWitness<N> {
|
|
28
|
+
const index = Buffer.isBuffer(leafIndexOrLeaf) ? this.getIndex(leafIndexOrLeaf) : leafIndexOrLeaf;
|
|
29
|
+
const siblingPath = this.getSiblingPath(index);
|
|
30
|
+
return new MembershipWitness<N>(
|
|
31
|
+
this.height as N,
|
|
32
|
+
BigInt(index),
|
|
33
|
+
assertLength<Fr, N>(siblingPath.map(Fr.fromBuffer), this.height as N),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
|
|
2
|
+
import { numToUInt32BE } from '@aztec/foundation/serialize';
|
|
3
|
+
import type { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
4
|
+
|
|
5
|
+
import type { AsyncHasher } from './hasher.js';
|
|
6
|
+
import { IndexedMerkleTree } from './indexed_merkle_tree.js';
|
|
7
|
+
|
|
8
|
+
interface LeafPreimageFactory<T extends IndexedTreeLeafPreimage> {
|
|
9
|
+
fromBuffer(buffer: Buffer): T;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Indexed merkle tree calculator.
|
|
14
|
+
*/
|
|
15
|
+
export class IndexedMerkleTreeCalculator<T extends IndexedTreeLeafPreimage, N extends number> {
|
|
16
|
+
private constructor(
|
|
17
|
+
private height: N,
|
|
18
|
+
private zeroHashes: Buffer[],
|
|
19
|
+
private hasher: AsyncHasher,
|
|
20
|
+
private factory: LeafPreimageFactory<T>,
|
|
21
|
+
) {}
|
|
22
|
+
|
|
23
|
+
static async create<T extends IndexedTreeLeafPreimage, N extends number>(
|
|
24
|
+
height: N,
|
|
25
|
+
hasher: AsyncHasher,
|
|
26
|
+
factory: LeafPreimageFactory<T>,
|
|
27
|
+
zeroLeaf = Buffer.alloc(32),
|
|
28
|
+
) {
|
|
29
|
+
const zeroHashes = [zeroLeaf];
|
|
30
|
+
for (let i = 0; i < height; i++) {
|
|
31
|
+
zeroHashes.push(await hasher.hash(zeroHashes[i], zeroHashes[i]));
|
|
32
|
+
}
|
|
33
|
+
return new IndexedMerkleTreeCalculator(height, zeroHashes, hasher, factory);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async computeTree(values: Buffer[]): Promise<IndexedMerkleTree<T, N>> {
|
|
37
|
+
if (!values.find(v => toBigIntBE(v) == BigInt(0))) {
|
|
38
|
+
// If we have no zero value, add one to form the zero leaf
|
|
39
|
+
values = [Buffer.alloc(32), ...values];
|
|
40
|
+
}
|
|
41
|
+
const sorted = values
|
|
42
|
+
.map((v, i) => ({ value: v, index: i }))
|
|
43
|
+
.sort((a, b) => Number(toBigIntBE(b.value) - toBigIntBE(a.value)));
|
|
44
|
+
const indexedLeaves = sorted.map((item, i) => ({
|
|
45
|
+
leaf: this.factory.fromBuffer(
|
|
46
|
+
Buffer.concat([
|
|
47
|
+
item.value,
|
|
48
|
+
...(i == 0
|
|
49
|
+
? [Buffer.alloc(32), Buffer.alloc(32)]
|
|
50
|
+
: [sorted[i - 1].value, numToUInt32BE(sorted[i - 1].index, 32)]),
|
|
51
|
+
]),
|
|
52
|
+
),
|
|
53
|
+
index: item.index,
|
|
54
|
+
}));
|
|
55
|
+
const resortedIndexedLeaves = indexedLeaves.sort((a, b) => a.index - b.index).map(item => item.leaf);
|
|
56
|
+
let leaves = await Promise.all(resortedIndexedLeaves.map(l => this.hasher.hashInputs(l.toHashInputs())));
|
|
57
|
+
|
|
58
|
+
let result = leaves.slice();
|
|
59
|
+
|
|
60
|
+
for (let i = 0; i < this.height; ++i) {
|
|
61
|
+
const numLeaves = 2 ** (this.height - i);
|
|
62
|
+
const newLeaves: Buffer[] = [];
|
|
63
|
+
for (let j = 0; j < leaves.length / 2; ++j) {
|
|
64
|
+
const l = leaves[j * 2];
|
|
65
|
+
const r = leaves[j * 2 + 1] || this.zeroHashes[i];
|
|
66
|
+
newLeaves[j] = await this.hasher.hash(l, r);
|
|
67
|
+
}
|
|
68
|
+
result = result.concat(new Array(numLeaves - leaves.length).fill(this.zeroHashes[i]), newLeaves);
|
|
69
|
+
leaves = newLeaves;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return new IndexedMerkleTree(this.height, result, resortedIndexedLeaves);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async computeTreeRoot(leaves: Buffer[] = []): Promise<Buffer> {
|
|
76
|
+
if (leaves.length === 0) {
|
|
77
|
+
return this.zeroHashes[this.zeroHashes.length - 1];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
leaves = leaves.slice();
|
|
81
|
+
|
|
82
|
+
for (let i = 0; i < this.height; ++i) {
|
|
83
|
+
let j = 0;
|
|
84
|
+
for (; j < leaves.length / 2; ++j) {
|
|
85
|
+
const l = leaves[j * 2];
|
|
86
|
+
const r = leaves[j * 2 + 1] || this.zeroHashes[i];
|
|
87
|
+
leaves[j] = await this.hasher.hash(l, r);
|
|
88
|
+
}
|
|
89
|
+
leaves = leaves.slice(0, j);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return leaves[0];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A leaf of an indexed merkle tree.
|
|
3
|
+
*/
|
|
4
|
+
export interface IndexedTreeLeaf {
|
|
5
|
+
/**
|
|
6
|
+
* Returns key of the leaf. It's used for indexing.
|
|
7
|
+
*/
|
|
8
|
+
getKey(): bigint;
|
|
9
|
+
/**
|
|
10
|
+
* Serializes the leaf into a buffer.
|
|
11
|
+
*/
|
|
12
|
+
toBuffer(): Buffer;
|
|
13
|
+
/**
|
|
14
|
+
* Returns true if the leaf is empty.
|
|
15
|
+
*/
|
|
16
|
+
isEmpty(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Updates the leaf with the data of another leaf.
|
|
19
|
+
* @param another - The leaf to update to.
|
|
20
|
+
* @returns The updated leaf.
|
|
21
|
+
*/
|
|
22
|
+
updateTo(another: IndexedTreeLeaf): IndexedTreeLeaf;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Preimage of a merkle tree leaf.
|
|
27
|
+
*/
|
|
28
|
+
export interface TreeLeafPreimage {
|
|
29
|
+
/**
|
|
30
|
+
* Returns key of the leaf corresponding to this preimage.
|
|
31
|
+
*/
|
|
32
|
+
getKey(): bigint;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the preimage as a leaf.
|
|
35
|
+
*/
|
|
36
|
+
asLeaf(): IndexedTreeLeaf;
|
|
37
|
+
/**
|
|
38
|
+
* Serializes the preimage into a buffer.
|
|
39
|
+
*/
|
|
40
|
+
toBuffer(): Buffer;
|
|
41
|
+
/**
|
|
42
|
+
* Serializes the preimage to an array of buffers for hashing.
|
|
43
|
+
*/
|
|
44
|
+
toHashInputs(): Buffer[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Preimage of an indexed merkle tree leaf.
|
|
49
|
+
*/
|
|
50
|
+
export interface IndexedTreeLeafPreimage extends TreeLeafPreimage {
|
|
51
|
+
getNextKey(): bigint;
|
|
52
|
+
/**
|
|
53
|
+
* Returns the index of the next leaf.
|
|
54
|
+
*/
|
|
55
|
+
getNextIndex(): bigint;
|
|
56
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { assertMemberLength } from '../array/array.js';
|
|
2
|
+
import { toBigIntBE, toBufferBE } from '../bigint-buffer/index.js';
|
|
3
|
+
import { Fr } from '../fields/fields.js';
|
|
4
|
+
import { BufferReader, type Tuple, serializeToBuffer } from '../serialize/index.js';
|
|
5
|
+
import type { SiblingPath } from './sibling_path.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Contains information which can be used to prove that a leaf is a member of a Merkle tree.
|
|
9
|
+
*/
|
|
10
|
+
export class MembershipWitness<N extends number> {
|
|
11
|
+
constructor(
|
|
12
|
+
/**
|
|
13
|
+
* Size of the sibling path (number of fields it contains).
|
|
14
|
+
*/
|
|
15
|
+
pathSize: N,
|
|
16
|
+
/**
|
|
17
|
+
* Index of a leaf in the Merkle tree.
|
|
18
|
+
*/
|
|
19
|
+
public leafIndex: bigint,
|
|
20
|
+
/**
|
|
21
|
+
* Sibling path of the leaf in the Merkle tree.
|
|
22
|
+
*/
|
|
23
|
+
public siblingPath: Tuple<Fr, N>,
|
|
24
|
+
) {
|
|
25
|
+
assertMemberLength(this, 'siblingPath', pathSize);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
toBuffer() {
|
|
29
|
+
return serializeToBuffer(toBufferBE(this.leafIndex, 32), ...this.siblingPath);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Creates a random membership witness. Used for testing purposes.
|
|
34
|
+
* @param pathSize - Number of fields in the sibling path.
|
|
35
|
+
* @returns Random membership witness.
|
|
36
|
+
*/
|
|
37
|
+
public static random<N extends number>(pathSize: N) {
|
|
38
|
+
return new MembershipWitness<N>(
|
|
39
|
+
pathSize,
|
|
40
|
+
0n,
|
|
41
|
+
Array(pathSize)
|
|
42
|
+
.fill(0)
|
|
43
|
+
.map(() => Fr.random()) as Tuple<Fr, N>,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates a membership witness whose sibling path is full of zero fields.
|
|
49
|
+
* @param pathSize - Number of fields in the sibling path.
|
|
50
|
+
* @param leafIndex - Index of the leaf in the Merkle tree.
|
|
51
|
+
* @returns Membership witness with zero sibling path.
|
|
52
|
+
*/
|
|
53
|
+
public static empty<N extends number>(pathSize: N, leafIndex = 0n): MembershipWitness<N> {
|
|
54
|
+
const arr = Array(pathSize)
|
|
55
|
+
.fill(0)
|
|
56
|
+
.map(() => Fr.ZERO) as Tuple<Fr, N>;
|
|
57
|
+
return new MembershipWitness<N>(pathSize, leafIndex, arr);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static fromBufferArray<N extends number>(leafIndex: bigint, siblingPath: Tuple<Buffer, N>): MembershipWitness<N> {
|
|
61
|
+
return new MembershipWitness<N>(
|
|
62
|
+
siblingPath.length as N,
|
|
63
|
+
leafIndex,
|
|
64
|
+
siblingPath.map(x => Fr.fromBuffer(x)) as Tuple<Fr, N>,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Deserializes from a buffer or reader, corresponding to a write in cpp.
|
|
70
|
+
* @param buffer - Buffer or reader to read from.
|
|
71
|
+
* @returns The deserialized `MembershipWitness`.
|
|
72
|
+
*/
|
|
73
|
+
static fromBuffer<N extends number>(buffer: Buffer | BufferReader, size: N): MembershipWitness<N> {
|
|
74
|
+
const reader = BufferReader.asReader(buffer);
|
|
75
|
+
const leafIndex = toBigIntBE(reader.readBytes(32));
|
|
76
|
+
const siblingPath = reader.readArray(size, Fr);
|
|
77
|
+
return new MembershipWitness(size, leafIndex, siblingPath);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Creates a deserializer object for a MembershipWitness with a given size.
|
|
82
|
+
* @param size - Expected size of the witness.
|
|
83
|
+
* @returns A deserializer object.
|
|
84
|
+
*/
|
|
85
|
+
static deserializer<N extends number>(size: N): { fromBuffer(buffer: Buffer | BufferReader): MembershipWitness<N> } {
|
|
86
|
+
return {
|
|
87
|
+
fromBuffer: (buffer: Buffer | BufferReader) => {
|
|
88
|
+
const reader = BufferReader.asReader(buffer);
|
|
89
|
+
const leafIndex = toBigIntBE(reader.readBytes(32));
|
|
90
|
+
const siblingPath = reader.readArray(size, Fr);
|
|
91
|
+
return new MembershipWitness(size, leafIndex, siblingPath);
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static fromSiblingPath<N extends number>(leafIndex: bigint, siblingPath: SiblingPath<N>): MembershipWitness<N> {
|
|
97
|
+
return new MembershipWitness<N>(siblingPath.pathSize, leafIndex, siblingPath.toFields() as Tuple<Fr, N>);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** A simple immutable Merkle tree container. Use a MerkleTreeCalculator to create a new instance from a set of leaves. */
|
|
2
|
+
export class MerkleTree {
|
|
3
|
+
constructor(public readonly height: number, public readonly nodes: Buffer[]) {
|
|
4
|
+
const expectedNodeCount = 2 ** (height + 1) - 1;
|
|
5
|
+
if (nodes.length !== expectedNodeCount) {
|
|
6
|
+
throw new Error(`Invalid node count for Merkle tree: got ${nodes.length} but expected ${expectedNodeCount}`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
get root(): Buffer {
|
|
11
|
+
return this.nodes[this.nodes.length - 1];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
get leaves(): Buffer[] {
|
|
15
|
+
return this.nodes.slice(0, 2 ** this.height);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Returns a sibling path to the given element or to the element in the given index. */
|
|
19
|
+
public getSiblingPath(leafIndex: number): Buffer[];
|
|
20
|
+
public getSiblingPath(leaf: Buffer): Buffer[];
|
|
21
|
+
public getSiblingPath(leafIndexOrLeaf: number | Buffer): Buffer[] {
|
|
22
|
+
if (Buffer.isBuffer(leafIndexOrLeaf)) {
|
|
23
|
+
return this.getSiblingPath(this.getIndex(leafIndexOrLeaf));
|
|
24
|
+
}
|
|
25
|
+
const leafIndex = leafIndexOrLeaf;
|
|
26
|
+
if (leafIndex < 0 || leafIndex >= 2 ** this.height) {
|
|
27
|
+
throw new Error(`Invalid leaf index: got ${leafIndex} but leaves count is ${2 ** this.height}`);
|
|
28
|
+
}
|
|
29
|
+
const tree = this.nodes;
|
|
30
|
+
let rowSize = Math.ceil(tree.length / 2);
|
|
31
|
+
let rowOffset = 0;
|
|
32
|
+
let index = leafIndex;
|
|
33
|
+
const siblingPath: Buffer[] = [];
|
|
34
|
+
while (rowSize > 1) {
|
|
35
|
+
const isRight = index & 1;
|
|
36
|
+
siblingPath.push(tree[rowOffset + index + (isRight ? -1 : 1)]);
|
|
37
|
+
rowOffset += rowSize;
|
|
38
|
+
rowSize >>= 1;
|
|
39
|
+
index >>= 1;
|
|
40
|
+
}
|
|
41
|
+
return siblingPath;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Returns the leaf index for a given element. */
|
|
45
|
+
public getIndex(element: Buffer) {
|
|
46
|
+
return this.leaves.findIndex(leaf => leaf.equals(element));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Returns a nice string representation of the tree, useful for debugging purposes. */
|
|
50
|
+
public drawTree(elemSize = 8) {
|
|
51
|
+
const levels: string[][] = [];
|
|
52
|
+
const tree = this.nodes;
|
|
53
|
+
const maxRowSize = Math.ceil(tree.length / 2);
|
|
54
|
+
let paddingSize = 1;
|
|
55
|
+
let rowSize = maxRowSize;
|
|
56
|
+
let rowOffset = 0;
|
|
57
|
+
while (rowSize > 0) {
|
|
58
|
+
levels.push(
|
|
59
|
+
tree
|
|
60
|
+
.slice(rowOffset, rowOffset + rowSize)
|
|
61
|
+
.map(n => n.toString('hex').slice(0, elemSize) + ' '.repeat((paddingSize - 1) * (elemSize + 1))),
|
|
62
|
+
);
|
|
63
|
+
rowOffset += rowSize;
|
|
64
|
+
paddingSize <<= 1;
|
|
65
|
+
rowSize >>= 1;
|
|
66
|
+
}
|
|
67
|
+
return levels
|
|
68
|
+
.reverse()
|
|
69
|
+
.map(row => row.join(' '))
|
|
70
|
+
.join('\n');
|
|
71
|
+
}
|
|
72
|
+
}
|