@aztec/foundation 0.0.0-test.1 → 0.0.1-commit.0b941701
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/dest/array/array.d.ts +6 -9
- package/dest/array/array.d.ts.map +1 -1
- package/dest/array/array.js +11 -11
- package/dest/array/index.d.ts +2 -1
- package/dest/array/index.d.ts.map +1 -1
- package/dest/array/index.js +1 -0
- package/dest/array/sorted_array.d.ts +10 -0
- package/dest/array/sorted_array.d.ts.map +1 -0
- package/dest/array/sorted_array.js +106 -0
- package/dest/async-map/index.d.ts +1 -1
- package/dest/async-pool/index.d.ts +1 -1
- package/dest/async-pool/index.d.ts.map +1 -1
- package/dest/async-pool/index.js +1 -0
- package/dest/bigint/index.d.ts +7 -0
- package/dest/bigint/index.d.ts.map +1 -0
- package/dest/bigint/index.js +15 -0
- package/dest/bigint-buffer/index.d.ts +1 -3
- package/dest/bigint-buffer/index.d.ts.map +1 -1
- package/dest/branded-types/block_number.d.ts +56 -0
- package/dest/branded-types/block_number.d.ts.map +1 -0
- package/dest/branded-types/block_number.js +78 -0
- package/dest/branded-types/checkpoint_number.d.ts +54 -0
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -0
- package/dest/branded-types/checkpoint_number.js +77 -0
- package/dest/branded-types/epoch.d.ts +42 -0
- package/dest/branded-types/epoch.d.ts.map +1 -0
- package/dest/branded-types/epoch.js +59 -0
- package/dest/branded-types/index.d.ts +7 -0
- package/dest/branded-types/index.d.ts.map +1 -0
- package/dest/branded-types/index.js +5 -0
- package/dest/branded-types/index_within_checkpoint.d.ts +42 -0
- package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -0
- package/dest/branded-types/index_within_checkpoint.js +59 -0
- package/dest/branded-types/slot.d.ts +42 -0
- package/dest/branded-types/slot.d.ts.map +1 -0
- package/dest/branded-types/slot.js +59 -0
- package/dest/branded-types/types.d.ts +5 -0
- package/dest/branded-types/types.d.ts.map +1 -0
- package/dest/branded-types/types.js +1 -0
- package/dest/buffer/buffer16.d.ts +80 -0
- package/dest/buffer/buffer16.d.ts.map +1 -0
- package/dest/buffer/buffer16.js +102 -0
- package/dest/buffer/buffer32.d.ts +5 -9
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/buffer32.js +9 -7
- package/dest/buffer/index.d.ts +2 -1
- package/dest/buffer/index.d.ts.map +1 -1
- package/dest/buffer/index.js +1 -0
- package/dest/collection/array.d.ts +22 -4
- package/dest/collection/array.d.ts.map +1 -1
- package/dest/collection/array.js +84 -3
- package/dest/collection/index.d.ts +1 -1
- package/dest/collection/object.d.ts +17 -1
- package/dest/collection/object.d.ts.map +1 -1
- package/dest/collection/object.js +25 -0
- package/dest/committable/committable.d.ts +1 -1
- package/dest/committable/committable.d.ts.map +1 -1
- package/dest/committable/index.d.ts +1 -1
- package/dest/config/env_var.d.ts +2 -2
- package/dest/config/env_var.d.ts.map +1 -1
- package/dest/config/index.d.ts +62 -4
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +143 -12
- package/dest/config/network_config.d.ts +54 -0
- package/dest/config/network_config.d.ts.map +1 -0
- package/dest/config/network_config.js +11 -0
- package/dest/config/network_name.d.ts +3 -0
- package/dest/config/network_name.d.ts.map +1 -0
- package/dest/config/network_name.js +19 -0
- package/dest/config/parse-env.d.ts +3 -0
- package/dest/config/parse-env.d.ts.map +1 -0
- package/dest/config/parse-env.js +7 -0
- package/dest/config/secret_value.d.ts +28 -0
- package/dest/config/secret_value.d.ts.map +1 -0
- package/dest/config/secret_value.js +36 -0
- package/dest/crypto/aes128/index.d.ts +3 -5
- package/dest/crypto/aes128/index.d.ts.map +1 -1
- package/dest/crypto/aes128/index.js +19 -6
- package/dest/crypto/bls/bn254_keystore.d.ts +296 -0
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -0
- package/dest/crypto/bls/bn254_keystore.js +218 -0
- package/dest/crypto/bls/index.d.ts +13 -0
- package/dest/crypto/bls/index.d.ts.map +1 -0
- package/dest/crypto/bls/index.js +87 -0
- package/dest/crypto/bn254/index.d.ts +39 -0
- package/dest/crypto/bn254/index.d.ts.map +1 -0
- package/dest/crypto/bn254/index.js +56 -0
- package/dest/crypto/ecdsa/index.d.ts +3 -3
- package/dest/crypto/ecdsa/index.d.ts.map +1 -1
- package/dest/crypto/ecdsa/index.js +62 -48
- package/dest/crypto/ecdsa/signature.d.ts +3 -5
- package/dest/crypto/ecdsa/signature.d.ts.map +1 -1
- package/dest/crypto/ecdsa/signature.js +2 -2
- package/dest/crypto/grumpkin/index.d.ts +10 -15
- package/dest/crypto/grumpkin/index.d.ts.map +1 -1
- package/dest/crypto/grumpkin/index.js +61 -55
- package/dest/crypto/keccak/index.d.ts +3 -5
- package/dest/crypto/keccak/index.d.ts.map +1 -1
- package/dest/crypto/keys/index.d.ts +2 -4
- package/dest/crypto/keys/index.d.ts.map +1 -1
- package/dest/crypto/keys/index.js +8 -5
- package/dest/crypto/pedersen/index.d.ts +1 -1
- package/dest/crypto/pedersen/pedersen.noble.d.ts +3 -5
- package/dest/crypto/pedersen/pedersen.noble.d.ts.map +1 -1
- package/dest/crypto/pedersen/pedersen.wasm.d.ts +4 -6
- package/dest/crypto/pedersen/pedersen.wasm.d.ts.map +1 -1
- package/dest/crypto/pedersen/pedersen.wasm.js +24 -14
- package/dest/crypto/poseidon/index.d.ts +2 -5
- package/dest/crypto/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/poseidon/index.js +27 -21
- package/dest/crypto/random/index.d.ts +2 -4
- package/dest/crypto/random/index.d.ts.map +1 -1
- package/dest/crypto/random/index.js +2 -34
- package/dest/crypto/random/randomness_singleton.d.ts +2 -4
- package/dest/crypto/random/randomness_singleton.d.ts.map +1 -1
- package/dest/crypto/random/randomness_singleton.js +3 -3
- package/dest/crypto/schnorr/index.d.ts +3 -2
- package/dest/crypto/schnorr/index.d.ts.map +1 -1
- package/dest/crypto/schnorr/index.js +30 -38
- package/dest/crypto/schnorr/signature.d.ts +5 -7
- package/dest/crypto/schnorr/signature.d.ts.map +1 -1
- package/dest/crypto/schnorr/signature.js +2 -2
- package/dest/crypto/secp256k1/index.d.ts +5 -7
- package/dest/crypto/secp256k1/index.d.ts.map +1 -1
- package/dest/crypto/secp256k1/index.js +23 -18
- package/dest/crypto/secp256k1-signer/index.d.ts +1 -1
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts +1 -1
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts.map +1 -1
- package/dest/crypto/secp256k1-signer/utils.d.ts +56 -5
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
- package/dest/crypto/secp256k1-signer/utils.js +92 -6
- package/dest/crypto/serialize.d.ts +5 -7
- package/dest/crypto/serialize.d.ts.map +1 -1
- package/dest/crypto/sha256/index.d.ts +23 -6
- package/dest/crypto/sha256/index.d.ts.map +1 -1
- package/dest/crypto/sha256/index.js +43 -1
- package/dest/crypto/sha512/index.d.ts +3 -5
- package/dest/crypto/sha512/index.d.ts.map +1 -1
- package/dest/crypto/sha512/index.js +1 -1
- package/dest/crypto/signature/index.d.ts +2 -4
- package/dest/crypto/signature/index.d.ts.map +1 -1
- package/dest/crypto/sync/index.d.ts +1 -1
- package/dest/crypto/sync/index.js +1 -1
- package/dest/crypto/sync/pedersen/index.d.ts +4 -6
- package/dest/crypto/sync/pedersen/index.d.ts.map +1 -1
- package/dest/crypto/sync/pedersen/index.js +18 -11
- package/dest/crypto/sync/poseidon/index.d.ts +2 -5
- package/dest/crypto/sync/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/sync/poseidon/index.js +23 -16
- package/dest/curves/bls12/field.d.ts +148 -0
- package/dest/curves/bls12/field.d.ts.map +1 -0
- package/dest/curves/bls12/field.js +362 -0
- package/dest/curves/bls12/index.d.ts +3 -0
- package/dest/curves/bls12/index.d.ts.map +1 -0
- package/dest/curves/bls12/index.js +2 -0
- package/dest/curves/bls12/point.d.ts +229 -0
- package/dest/curves/bls12/point.d.ts.map +1 -0
- package/dest/curves/bls12/point.js +400 -0
- package/dest/curves/bn254/field.d.ts +180 -0
- package/dest/curves/bn254/field.d.ts.map +1 -0
- package/dest/{fields/fields.js → curves/bn254/field.js} +90 -62
- package/dest/curves/bn254/index.d.ts +3 -0
- package/dest/curves/bn254/index.d.ts.map +1 -0
- package/dest/curves/bn254/index.js +2 -0
- package/dest/curves/bn254/point.d.ts +54 -0
- package/dest/curves/bn254/point.d.ts.map +1 -0
- package/dest/curves/bn254/point.js +143 -0
- package/dest/curves/grumpkin/index.d.ts +10 -0
- package/dest/curves/grumpkin/index.d.ts.map +1 -0
- package/dest/curves/grumpkin/index.js +3 -0
- package/dest/{fields → curves/grumpkin}/point.d.ts +14 -7
- package/dest/curves/grumpkin/point.d.ts.map +1 -0
- package/dest/{fields → curves/grumpkin}/point.js +27 -10
- package/dest/decorators/index.d.ts +1 -1
- package/dest/decorators/memoize.d.ts +1 -1
- package/dest/decorators/memoize.d.ts.map +1 -1
- package/dest/error/index.d.ts +1 -1
- package/dest/eth-address/index.d.ts +18 -9
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +31 -2
- package/dest/eth-signature/eth_signature.d.ts +17 -15
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/eth-signature/eth_signature.js +31 -17
- package/dest/eth-signature/index.d.ts +1 -1
- package/dest/fs/index.d.ts +2 -1
- package/dest/fs/index.d.ts.map +1 -1
- package/dest/fs/index.js +1 -0
- package/dest/fs/run_in_dir.d.ts +1 -1
- package/dest/fs/try_rm_dir.d.ts +3 -0
- package/dest/fs/try_rm_dir.d.ts.map +1 -0
- package/dest/fs/try_rm_dir.js +16 -0
- package/dest/iterable/all.d.ts +1 -1
- package/dest/iterable/filter.d.ts +1 -1
- package/dest/iterable/filter.js +1 -1
- package/dest/iterable/index.d.ts +1 -1
- package/dest/iterable/isAsyncIt.d.ts +1 -1
- package/dest/iterable/map.d.ts +1 -1
- package/dest/iterable/map.js +1 -1
- package/dest/iterable/peek.d.ts +1 -1
- package/dest/iterable/sort.d.ts +1 -1
- package/dest/iterable/take.d.ts +1 -1
- package/dest/iterable/toArray.d.ts +1 -1
- package/dest/iterator/filter.d.ts +3 -0
- package/dest/iterator/filter.d.ts.map +1 -0
- package/dest/iterator/filter.js +7 -0
- package/dest/iterator/index.d.ts +2 -0
- package/dest/iterator/index.d.ts.map +1 -0
- package/dest/iterator/index.js +1 -0
- package/dest/jest/env.js +48 -0
- package/dest/jest/setupAfterEnv.js +3 -0
- package/dest/json-rpc/client/fetch.d.ts +3 -3
- package/dest/json-rpc/client/fetch.d.ts.map +1 -1
- package/dest/json-rpc/client/fetch.js +16 -30
- package/dest/json-rpc/client/index.d.ts +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +10 -4
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.js +173 -13
- package/dest/json-rpc/client/undici.d.ts +1 -1
- package/dest/json-rpc/client/undici.d.ts.map +1 -1
- package/dest/json-rpc/client/undici.js +27 -11
- package/dest/json-rpc/convert.d.ts +3 -10
- package/dest/json-rpc/convert.d.ts.map +1 -1
- package/dest/json-rpc/convert.js +1 -9
- package/dest/json-rpc/errors.d.ts +4 -0
- package/dest/json-rpc/errors.d.ts.map +1 -0
- package/dest/json-rpc/errors.js +6 -0
- package/dest/json-rpc/fixtures/class_a.d.ts +6 -4
- package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/class_b.d.ts +6 -4
- package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/test_state.d.ts +1 -1
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
- package/dest/json-rpc/index.d.ts +3 -2
- package/dest/json-rpc/index.d.ts.map +1 -1
- package/dest/json-rpc/index.js +2 -1
- package/dest/json-rpc/js_utils.d.ts +1 -1
- package/dest/json-rpc/js_utils.d.ts.map +1 -1
- package/dest/json-rpc/server/index.d.ts +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +22 -23
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.js +161 -56
- package/dest/json-rpc/test/index.d.ts +1 -1
- package/dest/json-rpc/test/integration.d.ts +2 -3
- package/dest/json-rpc/test/integration.d.ts.map +1 -1
- package/dest/log/console.d.ts +1 -1
- package/dest/log/console.d.ts.map +1 -1
- package/dest/log/gcloud-logger-config.d.ts +1 -2
- package/dest/log/gcloud-logger-config.d.ts.map +1 -1
- package/dest/log/gcloud-logger-config.js +1 -9
- package/dest/log/index.d.ts +5 -5
- package/dest/log/index.d.ts.map +1 -1
- package/dest/log/index.js +4 -4
- package/dest/log/libp2p_logger.d.ts +1 -1
- package/dest/log/libp2p_logger.js +13 -2
- package/dest/log/log-filters.d.ts +1 -1
- package/dest/log/log-levels.d.ts +1 -1
- package/dest/log/log_fn.d.ts +2 -2
- package/dest/log/log_fn.d.ts.map +1 -1
- package/dest/log/noir_debug_log_util.d.ts +14 -0
- package/dest/log/noir_debug_log_util.d.ts.map +1 -0
- package/dest/log/noir_debug_log_util.js +14 -0
- package/dest/log/pino-logger.d.ts +4 -4
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +29 -3
- package/dest/message/index.d.ts +1 -1
- package/dest/message/index.d.ts.map +1 -1
- package/dest/mutex/index.d.ts +1 -1
- package/dest/mutex/index.d.ts.map +1 -1
- package/dest/mutex/mutex_database.d.ts +1 -1
- package/dest/mutex/mutex_database.d.ts.map +1 -1
- package/dest/noir/index.d.ts +1 -1
- package/dest/noir/noir_package_config.d.ts +9 -9
- package/dest/number/index.d.ts +3 -0
- package/dest/number/index.d.ts.map +1 -0
- package/dest/number/index.js +12 -0
- package/dest/profiler/index.d.ts +2 -0
- package/dest/profiler/index.d.ts.map +1 -0
- package/dest/profiler/index.js +1 -0
- package/dest/profiler/profiler.d.ts +8 -0
- package/dest/profiler/profiler.d.ts.map +1 -0
- package/dest/profiler/profiler.js +97 -0
- package/dest/promise/index.d.ts +1 -1
- package/dest/promise/running-promise.d.ts +2 -2
- package/dest/promise/running-promise.d.ts.map +1 -1
- package/dest/promise/running-promise.js +2 -2
- package/dest/promise/utils.d.ts +1 -1
- package/dest/queue/base_memory_queue.d.ts +1 -1
- package/dest/queue/base_memory_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.d.ts +2 -2
- package/dest/queue/batch_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.js +1 -1
- package/dest/queue/bounded_serial_queue.d.ts +1 -1
- package/dest/queue/bounded_serial_queue.d.ts.map +1 -1
- package/dest/queue/fifo_memory_queue.d.ts +1 -1
- package/dest/queue/fifo_memory_queue.d.ts.map +1 -1
- package/dest/queue/index.d.ts +1 -1
- package/dest/queue/priority_memory_queue.d.ts +1 -1
- package/dest/queue/priority_memory_queue.d.ts.map +1 -1
- package/dest/queue/priority_queue.d.ts +1 -1
- package/dest/queue/priority_queue.d.ts.map +1 -1
- package/dest/queue/semaphore.d.ts +1 -1
- package/dest/queue/semaphore.d.ts.map +1 -1
- package/dest/queue/serial_queue.d.ts +3 -3
- package/dest/queue/serial_queue.d.ts.map +1 -1
- package/dest/queue/serial_queue.js +7 -5
- package/dest/retry/index.d.ts +14 -3
- package/dest/retry/index.d.ts.map +1 -1
- package/dest/retry/index.js +13 -2
- package/dest/running-promise/index.d.ts +1 -1
- package/dest/schemas/api.d.ts +1 -1
- package/dest/schemas/api.d.ts.map +1 -1
- package/dest/schemas/index.d.ts +1 -1
- package/dest/schemas/parse.d.ts +1 -1
- package/dest/schemas/parse.js +1 -1
- package/dest/schemas/schemas.d.ts +21 -20
- package/dest/schemas/schemas.d.ts.map +1 -1
- package/dest/schemas/schemas.js +29 -11
- package/dest/schemas/types.d.ts +31 -1
- package/dest/schemas/types.d.ts.map +1 -1
- package/dest/schemas/types.js +25 -1
- package/dest/schemas/utils.d.ts +4 -6
- package/dest/schemas/utils.d.ts.map +1 -1
- package/dest/schemas/utils.js +15 -5
- package/dest/serialize/buffer_reader.d.ts +34 -6
- package/dest/serialize/buffer_reader.d.ts.map +1 -1
- package/dest/serialize/buffer_reader.js +57 -6
- package/dest/serialize/field_reader.d.ts +12 -3
- package/dest/serialize/field_reader.d.ts.map +1 -1
- package/dest/serialize/field_reader.js +19 -2
- package/dest/serialize/free_funcs.d.ts +25 -23
- package/dest/serialize/free_funcs.d.ts.map +1 -1
- package/dest/serialize/free_funcs.js +22 -28
- package/dest/serialize/index.d.ts +1 -1
- package/dest/serialize/serialize.d.ts +6 -7
- package/dest/serialize/serialize.d.ts.map +1 -1
- package/dest/serialize/serialize.js +1 -1
- package/dest/serialize/type_registry.d.ts +1 -1
- package/dest/serialize/type_registry.d.ts.map +1 -1
- package/dest/serialize/types.d.ts +1 -1
- package/dest/sleep/index.d.ts +3 -1
- package/dest/sleep/index.d.ts.map +1 -1
- package/dest/sleep/index.js +4 -0
- package/dest/string/index.d.ts +8 -3
- package/dest/string/index.d.ts.map +1 -1
- package/dest/string/index.js +27 -1
- package/dest/testing/files/index.d.ts +2 -3
- package/dest/testing/files/index.d.ts.map +1 -1
- package/dest/testing/files/index.js +3 -3
- package/dest/testing/formatting.d.ts +4 -0
- package/dest/testing/formatting.d.ts.map +1 -0
- package/dest/testing/formatting.js +3 -0
- package/dest/testing/index.d.ts +2 -1
- package/dest/testing/index.d.ts.map +1 -1
- package/dest/testing/index.js +1 -0
- package/dest/testing/port_allocator.d.ts +1 -1
- package/dest/testing/snapshot_serializer.d.ts +1 -1
- package/dest/testing/test_data.d.ts +1 -1
- package/dest/timer/date.d.ts +4 -2
- package/dest/timer/date.d.ts.map +1 -1
- package/dest/timer/date.js +8 -3
- package/dest/timer/elapsed.d.ts +1 -1
- package/dest/timer/index.d.ts +2 -2
- package/dest/timer/index.d.ts.map +1 -1
- package/dest/timer/index.js +1 -1
- package/dest/timer/timeout.d.ts +19 -6
- package/dest/timer/timeout.d.ts.map +1 -1
- package/dest/timer/timeout.js +43 -22
- package/dest/timer/timer.d.ts +1 -1
- package/dest/timer/timer.d.ts.map +1 -1
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +1 -1
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +1 -1
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +1 -1
- package/dest/transport/dispatch/messages.d.ts +1 -1
- package/dest/transport/index.d.ts +1 -2
- package/dest/transport/index.d.ts.map +1 -1
- package/dest/transport/index.js +0 -1
- package/dest/transport/interface/connector.d.ts +1 -1
- package/dest/transport/interface/connector.d.ts.map +1 -1
- package/dest/transport/interface/listener.d.ts +1 -2
- package/dest/transport/interface/listener.d.ts.map +1 -1
- package/dest/transport/interface/socket.d.ts +1 -1
- package/dest/transport/interface/socket.d.ts.map +1 -1
- package/dest/transport/interface/transferable.d.ts +1 -1
- package/dest/transport/node/index.d.ts +1 -1
- package/dest/transport/node/node_connector.d.ts +1 -2
- package/dest/transport/node/node_connector.d.ts.map +1 -1
- package/dest/transport/node/node_connector_socket.d.ts +1 -2
- package/dest/transport/node/node_connector_socket.d.ts.map +1 -1
- package/dest/transport/node/node_listener.d.ts +1 -2
- package/dest/transport/node/node_listener.d.ts.map +1 -1
- package/dest/transport/node/node_listener_socket.d.ts +1 -2
- package/dest/transport/node/node_listener_socket.d.ts.map +1 -1
- package/dest/transport/transport_client.d.ts +1 -2
- package/dest/transport/transport_client.d.ts.map +1 -1
- package/dest/transport/transport_server.d.ts +1 -10
- package/dest/transport/transport_server.d.ts.map +1 -1
- package/dest/trees/balanced_merkle_tree_root.d.ts +17 -0
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/balanced_merkle_tree_root.js +51 -0
- package/dest/trees/hasher.d.ts +7 -7
- package/dest/trees/hasher.d.ts.map +1 -1
- package/dest/trees/hasher.js +10 -5
- package/dest/trees/index.d.ts +5 -3
- package/dest/trees/index.d.ts.map +1 -1
- package/dest/trees/index.js +4 -2
- package/dest/trees/indexed_merkle_tree.d.ts +1 -3
- package/dest/trees/indexed_merkle_tree.d.ts.map +1 -1
- package/dest/trees/indexed_merkle_tree.js +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +2 -4
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/indexed_tree_leaf.d.ts +1 -3
- package/dest/trees/indexed_tree_leaf.d.ts.map +1 -1
- package/dest/trees/membership_witness.d.ts +10 -5
- package/dest/trees/membership_witness.d.ts.map +1 -1
- package/dest/trees/membership_witness.js +23 -1
- package/dest/trees/merkle_tree.d.ts +1 -3
- package/dest/trees/merkle_tree.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.d.ts +2 -4
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.js +2 -2
- package/dest/trees/sibling_path.d.ts +6 -41
- package/dest/trees/sibling_path.d.ts.map +1 -1
- package/dest/trees/sibling_path.js +3 -3
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts +48 -0
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts.map +1 -0
- package/dest/trees/unbalanced_merkle_tree_calculator.js +154 -0
- package/dest/trees/unbalanced_merkle_tree_root.d.ts +28 -0
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/unbalanced_merkle_tree_root.js +84 -0
- package/dest/trees/unbalanced_tree_store.d.ts +6 -1
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -1
- package/dest/trees/unbalanced_tree_store.js +55 -1
- package/dest/types/index.d.ts +28 -3
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +3 -0
- package/dest/url/index.d.ts +1 -1
- package/dest/url/index.d.ts.map +1 -1
- package/dest/url/index.js +1 -1
- package/dest/validation/index.d.ts +1 -1
- package/package.json +59 -45
- package/src/array/array.ts +13 -16
- package/src/array/index.ts +1 -0
- package/src/array/sorted_array.ts +133 -0
- package/src/async-pool/index.ts +1 -0
- package/src/bigint/index.ts +20 -0
- package/src/branded-types/block_number.ts +117 -0
- package/src/branded-types/checkpoint_number.ts +115 -0
- package/src/branded-types/epoch.ts +88 -0
- package/src/branded-types/index.ts +7 -0
- package/src/branded-types/index_within_checkpoint.ts +88 -0
- package/src/branded-types/slot.ts +88 -0
- package/src/branded-types/types.ts +2 -0
- package/src/buffer/buffer16.ts +133 -0
- package/src/buffer/buffer32.ts +10 -8
- package/src/buffer/index.ts +1 -0
- package/src/collection/array.ts +97 -4
- package/src/collection/object.ts +37 -0
- package/src/config/env_var.ts +180 -59
- package/src/config/index.ts +226 -10
- package/src/config/network_config.ts +18 -0
- package/src/config/network_name.ts +28 -0
- package/src/config/parse-env.ts +4 -0
- package/src/config/secret_value.ts +49 -0
- package/src/crypto/aes128/index.ts +19 -10
- package/src/crypto/bls/bn254_keystore.ts +287 -0
- package/src/crypto/bls/index.ts +77 -0
- package/src/crypto/bn254/index.ts +64 -0
- package/src/crypto/ecdsa/index.ts +41 -23
- package/src/crypto/ecdsa/signature.ts +2 -2
- package/src/crypto/grumpkin/index.ts +38 -46
- package/src/crypto/keys/index.ts +6 -6
- package/src/crypto/pedersen/pedersen.wasm.ts +23 -19
- package/src/crypto/poseidon/index.ts +27 -29
- package/src/crypto/random/index.ts +2 -40
- package/src/crypto/random/randomness_singleton.ts +2 -4
- package/src/crypto/schnorr/index.ts +22 -18
- package/src/crypto/schnorr/signature.ts +2 -2
- package/src/crypto/secp256k1/index.ts +15 -11
- package/src/crypto/secp256k1-signer/utils.ts +120 -7
- package/src/crypto/sha256/index.ts +48 -1
- package/src/crypto/sha512/index.ts +1 -1
- package/src/crypto/signature/index.ts +1 -1
- package/src/crypto/sync/index.ts +1 -1
- package/src/crypto/sync/pedersen/index.ts +17 -16
- package/src/crypto/sync/poseidon/index.ts +23 -27
- package/src/curves/bls12/field.ts +463 -0
- package/src/curves/bls12/index.ts +2 -0
- package/src/curves/bls12/point.ts +450 -0
- package/src/{fields/fields.ts → curves/bn254/field.ts} +84 -63
- package/src/curves/bn254/index.ts +2 -0
- package/src/curves/bn254/point.ts +170 -0
- package/src/curves/grumpkin/index.ts +11 -0
- package/src/{fields → curves/grumpkin}/point.ts +27 -10
- package/src/eth-address/index.ts +35 -3
- package/src/eth-signature/eth_signature.ts +44 -22
- package/src/fs/index.ts +1 -0
- package/src/fs/try_rm_dir.ts +15 -0
- package/src/iterable/filter.ts +1 -1
- package/src/iterable/map.ts +1 -1
- package/src/iterator/filter.ts +11 -0
- package/src/iterator/index.ts +1 -0
- package/src/jest/env.mjs +52 -0
- package/src/jest/setupAfterEnv.mjs +3 -0
- package/src/json-rpc/client/fetch.ts +14 -33
- package/src/json-rpc/client/safe_json_rpc_client.ts +226 -13
- package/src/json-rpc/client/undici.ts +29 -18
- package/src/json-rpc/convert.ts +3 -12
- package/src/json-rpc/errors.ts +6 -0
- package/src/json-rpc/fixtures/class_a.ts +4 -1
- package/src/json-rpc/fixtures/class_b.ts +4 -1
- package/src/json-rpc/index.ts +2 -1
- package/src/json-rpc/server/safe_json_rpc_server.ts +141 -48
- package/src/json-rpc/test/integration.ts +1 -1
- package/src/log/console.ts +4 -1
- package/src/log/gcloud-logger-config.ts +3 -7
- package/src/log/index.ts +4 -4
- package/src/log/libp2p_logger.ts +21 -2
- package/src/log/log_fn.ts +1 -1
- package/src/log/noir_debug_log_util.ts +21 -0
- package/src/log/pino-logger.ts +35 -3
- package/src/message/index.ts +5 -1
- package/src/mutex/mutex_database.ts +2 -3
- package/src/number/index.ts +14 -0
- package/src/profiler/index.ts +1 -0
- package/src/profiler/profiler.ts +125 -0
- package/src/promise/running-promise.ts +2 -2
- package/src/queue/batch_queue.ts +1 -1
- package/src/queue/bounded_serial_queue.ts +4 -1
- package/src/queue/serial_queue.ts +5 -5
- package/src/retry/index.ts +28 -5
- package/src/schemas/api.ts +4 -4
- package/src/schemas/parse.ts +1 -1
- package/src/schemas/schemas.ts +42 -13
- package/src/schemas/types.ts +33 -0
- package/src/schemas/utils.ts +21 -8
- package/src/serialize/buffer_reader.ts +81 -12
- package/src/serialize/field_reader.ts +28 -4
- package/src/serialize/free_funcs.ts +26 -32
- package/src/serialize/serialize.ts +3 -1
- package/src/sleep/index.ts +6 -0
- package/src/string/index.ts +36 -1
- package/src/testing/files/index.ts +7 -3
- package/src/testing/formatting.ts +3 -0
- package/src/testing/index.ts +1 -0
- package/src/timer/date.ts +13 -3
- package/src/timer/index.ts +1 -1
- package/src/timer/timeout.ts +54 -19
- package/src/transport/index.ts +0 -1
- package/src/transport/interface/connector.ts +0 -1
- package/src/transport/interface/listener.ts +2 -3
- package/src/transport/interface/socket.ts +2 -3
- package/src/transport/transport_client.ts +3 -4
- package/src/transport/transport_server.ts +4 -1
- package/src/trees/balanced_merkle_tree_root.ts +68 -0
- package/src/trees/hasher.ts +13 -4
- package/src/trees/index.ts +4 -2
- package/src/trees/indexed_merkle_tree.ts +6 -2
- package/src/trees/indexed_merkle_tree_calculator.ts +2 -2
- package/src/trees/membership_witness.ts +22 -1
- package/src/trees/merkle_tree.ts +4 -1
- package/src/trees/merkle_tree_calculator.ts +10 -5
- package/src/trees/sibling_path.ts +3 -3
- package/src/trees/unbalanced_merkle_tree_calculator.ts +176 -0
- package/src/trees/unbalanced_merkle_tree_root.ts +115 -0
- package/src/trees/unbalanced_tree_store.ts +62 -3
- package/src/types/index.ts +30 -4
- package/src/url/index.ts +0 -1
- package/dest/crypto/index.d.ts +0 -15
- package/dest/crypto/index.d.ts.map +0 -1
- package/dest/crypto/index.js +0 -14
- package/dest/crypto/pedersen/pedersen.elliptic.d.ts +0 -13
- package/dest/crypto/pedersen/pedersen.elliptic.d.ts.map +0 -1
- package/dest/crypto/pedersen/pedersen.elliptic.js +0 -582
- package/dest/fields/coordinate.d.ts +0 -68
- package/dest/fields/coordinate.d.ts.map +0 -1
- package/dest/fields/coordinate.js +0 -96
- package/dest/fields/fields.d.ts +0 -176
- package/dest/fields/fields.d.ts.map +0 -1
- package/dest/fields/index.d.ts +0 -4
- package/dest/fields/index.d.ts.map +0 -1
- package/dest/fields/index.js +0 -3
- package/dest/fields/point.d.ts.map +0 -1
- package/dest/index.d.ts +0 -31
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -31
- package/dest/json-rpc/server/telemetry.d.ts +0 -2
- package/dest/json-rpc/server/telemetry.d.ts.map +0 -1
- package/dest/json-rpc/server/telemetry.js +0 -0
- package/dest/log/debug.d.ts +0 -56
- package/dest/log/debug.d.ts.map +0 -1
- package/dest/log/debug.js +0 -75
- package/dest/log/log_history.d.ts +0 -31
- package/dest/log/log_history.d.ts.map +0 -1
- package/dest/log/log_history.js +0 -38
- package/dest/transport/browser/index.d.ts +0 -5
- package/dest/transport/browser/index.d.ts.map +0 -1
- package/dest/transport/browser/index.js +0 -4
- package/dest/transport/browser/message_port_socket.d.ts +0 -37
- package/dest/transport/browser/message_port_socket.d.ts.map +0 -1
- package/dest/transport/browser/message_port_socket.js +0 -42
- package/dest/transport/browser/shared_worker_connector.d.ts +0 -19
- package/dest/transport/browser/shared_worker_connector.d.ts.map +0 -1
- package/dest/transport/browser/shared_worker_connector.js +0 -19
- package/dest/transport/browser/shared_worker_listener.d.ts +0 -38
- package/dest/transport/browser/shared_worker_listener.d.ts.map +0 -1
- package/dest/transport/browser/shared_worker_listener.js +0 -33
- package/dest/transport/browser/worker_connector.d.ts +0 -26
- package/dest/transport/browser/worker_connector.d.ts.map +0 -1
- package/dest/transport/browser/worker_connector.js +0 -30
- package/dest/transport/browser/worker_listener.d.ts +0 -39
- package/dest/transport/browser/worker_listener.d.ts.map +0 -1
- package/dest/transport/browser/worker_listener.js +0 -35
- package/dest/trees/unbalanced_merkle_tree.d.ts +0 -17
- package/dest/trees/unbalanced_merkle_tree.d.ts.map +0 -1
- package/dest/trees/unbalanced_merkle_tree.js +0 -100
- package/dest/wasm/empty_wasi_sdk.d.ts +0 -130
- package/dest/wasm/empty_wasi_sdk.d.ts.map +0 -1
- package/dest/wasm/empty_wasi_sdk.js +0 -148
- package/dest/wasm/index.d.ts +0 -2
- package/dest/wasm/index.d.ts.map +0 -1
- package/dest/wasm/index.js +0 -1
- package/dest/wasm/wasm_module.d.ts +0 -136
- package/dest/wasm/wasm_module.d.ts.map +0 -1
- package/dest/wasm/wasm_module.js +0 -196
- package/dest/worker/browser/index.d.ts +0 -3
- package/dest/worker/browser/index.d.ts.map +0 -1
- package/dest/worker/browser/index.js +0 -2
- package/dest/worker/browser/start_web_module.d.ts +0 -7
- package/dest/worker/browser/start_web_module.d.ts.map +0 -1
- package/dest/worker/browser/start_web_module.js +0 -27
- package/dest/worker/browser/web_data_store.d.ts +0 -24
- package/dest/worker/browser/web_data_store.d.ts.map +0 -1
- package/dest/worker/browser/web_data_store.js +0 -29
- package/dest/worker/browser/web_worker.d.ts +0 -10
- package/dest/worker/browser/web_worker.d.ts.map +0 -1
- package/dest/worker/browser/web_worker.js +0 -25
- package/dest/worker/data_store.d.ts +0 -21
- package/dest/worker/data_store.d.ts.map +0 -1
- package/dest/worker/data_store.js +0 -3
- package/dest/worker/index.d.ts +0 -3
- package/dest/worker/index.d.ts.map +0 -1
- package/dest/worker/index.js +0 -1
- package/dest/worker/node/index.d.ts +0 -3
- package/dest/worker/node/index.d.ts.map +0 -1
- package/dest/worker/node/index.js +0 -2
- package/dest/worker/node/node_data_store.d.ts +0 -13
- package/dest/worker/node/node_data_store.d.ts.map +0 -1
- package/dest/worker/node/node_data_store.js +0 -20
- package/dest/worker/node/node_worker.d.ts +0 -6
- package/dest/worker/node/node_worker.d.ts.map +0 -1
- package/dest/worker/node/node_worker.js +0 -22
- package/dest/worker/node/start_node_module.d.ts +0 -7
- package/dest/worker/node/start_node_module.d.ts.map +0 -1
- package/dest/worker/node/start_node_module.js +0 -31
- package/dest/worker/wasm_worker.d.ts +0 -9
- package/dest/worker/wasm_worker.d.ts.map +0 -1
- package/dest/worker/wasm_worker.js +0 -3
- package/dest/worker/worker_pool.d.ts +0 -40
- package/dest/worker/worker_pool.d.ts.map +0 -1
- package/dest/worker/worker_pool.js +0 -51
- package/src/crypto/index.ts +0 -14
- package/src/crypto/pedersen/pedersen.elliptic.ts +0 -584
- package/src/fields/coordinate.ts +0 -104
- package/src/fields/index.ts +0 -3
- package/src/index.ts +0 -31
- package/src/json-rpc/server/telemetry.ts +0 -0
- package/src/log/debug.ts +0 -104
- package/src/log/log_history.ts +0 -44
- package/src/transport/browser/index.ts +0 -4
- package/src/transport/browser/message_port_socket.ts +0 -48
- package/src/transport/browser/shared_worker_connector.ts +0 -21
- package/src/transport/browser/shared_worker_listener.ts +0 -53
- package/src/transport/browser/worker_connector.ts +0 -30
- package/src/transport/browser/worker_listener.ts +0 -54
- package/src/trees/unbalanced_merkle_tree.ts +0 -103
- package/src/wasm/README.md +0 -6
- package/src/wasm/empty_wasi_sdk.ts +0 -166
- package/src/wasm/fixtures/gcd.wasm +0 -0
- package/src/wasm/fixtures/gcd.wat +0 -27
- package/src/wasm/index.ts +0 -1
- package/src/wasm/wasm_module.ts +0 -260
- package/src/worker/browser/index.ts +0 -2
- package/src/worker/browser/start_web_module.ts +0 -24
- package/src/worker/browser/web_data_store.ts +0 -38
- package/src/worker/browser/web_worker.ts +0 -25
- package/src/worker/data_store.ts +0 -19
- package/src/worker/index.ts +0 -2
- package/src/worker/node/index.ts +0 -2
- package/src/worker/node/node_data_store.ts +0 -27
- package/src/worker/node/node_worker.ts +0 -23
- package/src/worker/node/start_node_module.ts +0 -30
- package/src/worker/wasm_worker.ts +0 -7
- package/src/worker/worker_pool.ts +0 -73
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { poseidonMerkleHash, shaMerkleHash } from './hasher.js';
|
|
2
|
+
|
|
3
|
+
export const computeBalancedShaRoot = (leaves: Buffer[]) => computeBalancedMerkleTreeRoot(leaves);
|
|
4
|
+
|
|
5
|
+
export const computeBalancedPoseidonRoot = async (leaves: Buffer[]) =>
|
|
6
|
+
await computeBalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Computes the Merkle root with the provided leaves **synchronously**.
|
|
10
|
+
* This method uses a synchronous hash function (defaults to `sha256Trunc`).
|
|
11
|
+
*
|
|
12
|
+
* @throws If the number of leaves is not a power of two.
|
|
13
|
+
*/
|
|
14
|
+
export function computeBalancedMerkleTreeRoot(leaves: Buffer[], hasher = shaMerkleHash): Buffer {
|
|
15
|
+
const height = getTreeHeight(leaves);
|
|
16
|
+
let nodes = leaves.slice();
|
|
17
|
+
|
|
18
|
+
for (let i = 0; i < height; ++i) {
|
|
19
|
+
let j = 0;
|
|
20
|
+
for (; j < nodes.length / 2; ++j) {
|
|
21
|
+
const l = nodes[j * 2];
|
|
22
|
+
const r = nodes[j * 2 + 1];
|
|
23
|
+
nodes[j] = hasher(l, r);
|
|
24
|
+
}
|
|
25
|
+
nodes = nodes.slice(0, j);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return nodes[0];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Computes the Merkle root with the provided leaves **asynchronously**.
|
|
33
|
+
* This method uses an asynchronous hash function (defaults to `poseidon2Hash`).
|
|
34
|
+
*
|
|
35
|
+
* @throws If the number of leaves is not a power of two.
|
|
36
|
+
*/
|
|
37
|
+
export async function computeBalancedMerkleTreeRootAsync(
|
|
38
|
+
leaves: Buffer[],
|
|
39
|
+
hasher = poseidonMerkleHash,
|
|
40
|
+
): Promise<Buffer> {
|
|
41
|
+
const height = getTreeHeight(leaves);
|
|
42
|
+
let nodes = leaves.slice();
|
|
43
|
+
|
|
44
|
+
for (let i = 0; i < height; ++i) {
|
|
45
|
+
let j = 0;
|
|
46
|
+
for (; j < nodes.length / 2; ++j) {
|
|
47
|
+
const l = nodes[j * 2];
|
|
48
|
+
const r = nodes[j * 2 + 1];
|
|
49
|
+
nodes[j] = await hasher(l, r);
|
|
50
|
+
}
|
|
51
|
+
nodes = nodes.slice(0, j);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return nodes[0];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function getTreeHeight(leaves: Buffer[]) {
|
|
58
|
+
if (leaves.length === 0) {
|
|
59
|
+
throw new Error('Cannot compute a Merkle root with no leaves');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const height = Math.log2(leaves.length);
|
|
63
|
+
if (!Number.isInteger(height)) {
|
|
64
|
+
throw new Error('Cannot compute a Merkle root with a non-power-of-two number of leaves');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return height;
|
|
68
|
+
}
|
package/src/trees/hasher.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { poseidon2Hash } from '../crypto/poseidon/index.js';
|
|
2
|
+
import { sha256Trunc } from '../crypto/sha256/index.js';
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* Defines hasher interface used by Merkle trees.
|
|
3
6
|
*/
|
|
@@ -8,14 +11,14 @@ export interface Hasher {
|
|
|
8
11
|
* @param rhs - The second array.
|
|
9
12
|
* @returns The new 32-byte hash.
|
|
10
13
|
*/
|
|
11
|
-
hash(lhs: Uint8Array, rhs: Uint8Array): Buffer
|
|
14
|
+
hash(lhs: Uint8Array, rhs: Uint8Array): Buffer<ArrayBuffer>;
|
|
12
15
|
|
|
13
16
|
/**
|
|
14
17
|
* Hashes an array of buffers.
|
|
15
18
|
* @param inputs - The array of buffers to hash.
|
|
16
19
|
* @returns The resulting 32-byte hash.
|
|
17
20
|
*/
|
|
18
|
-
hashInputs(inputs: Buffer[]): Buffer
|
|
21
|
+
hashInputs(inputs: Buffer[]): Buffer<ArrayBuffer>;
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
/**
|
|
@@ -28,12 +31,18 @@ export interface AsyncHasher {
|
|
|
28
31
|
* @param rhs - The second array.
|
|
29
32
|
* @returns The new 32-byte hash.
|
|
30
33
|
*/
|
|
31
|
-
hash(lhs: Uint8Array, rhs: Uint8Array): Promise<Buffer
|
|
34
|
+
hash(lhs: Uint8Array, rhs: Uint8Array): Promise<Buffer<ArrayBuffer>>;
|
|
32
35
|
|
|
33
36
|
/**
|
|
34
37
|
* Hashes an array of buffers.
|
|
35
38
|
* @param inputs - The array of buffers to hash.
|
|
36
39
|
* @returns The resulting 32-byte hash.
|
|
37
40
|
*/
|
|
38
|
-
hashInputs(inputs: Buffer[]): Promise<Buffer
|
|
41
|
+
hashInputs(inputs: Buffer[]): Promise<Buffer<ArrayBuffer>>;
|
|
39
42
|
}
|
|
43
|
+
|
|
44
|
+
export const shaMerkleHash: Hasher['hash'] = (left: Buffer, right: Buffer) =>
|
|
45
|
+
sha256Trunc(Buffer.concat([left, right])) as Buffer<ArrayBuffer>;
|
|
46
|
+
|
|
47
|
+
export const poseidonMerkleHash: AsyncHasher['hash'] = async (left: Buffer, right: Buffer) =>
|
|
48
|
+
(await poseidon2Hash([left, right])).toBuffer() as Buffer<ArrayBuffer>;
|
package/src/trees/index.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './unbalanced_tree_store.js';
|
|
1
|
+
export * from './balanced_merkle_tree_root.js';
|
|
3
2
|
export * from './merkle_tree_calculator.js';
|
|
4
3
|
export * from './merkle_tree.js';
|
|
5
4
|
export * from './indexed_merkle_tree_calculator.js';
|
|
@@ -8,3 +7,6 @@ export * from './sibling_path.js';
|
|
|
8
7
|
export * from './membership_witness.js';
|
|
9
8
|
export * from './hasher.js';
|
|
10
9
|
export * from './indexed_tree_leaf.js';
|
|
10
|
+
export * from './unbalanced_merkle_tree_calculator.js';
|
|
11
|
+
export * from './unbalanced_merkle_tree_root.js';
|
|
12
|
+
export * from './unbalanced_tree_store.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fr } from '../
|
|
1
|
+
import { Fr } from '../curves/bn254/index.js';
|
|
2
2
|
import { assertLength } from '../serialize/index.js';
|
|
3
3
|
import type { IndexedTreeLeafPreimage } from './indexed_tree_leaf.js';
|
|
4
4
|
import { MembershipWitness } from './membership_witness.js';
|
|
@@ -6,7 +6,11 @@ import { MerkleTree } from './merkle_tree.js';
|
|
|
6
6
|
|
|
7
7
|
/** A simple immutable indexed merkle tree container. Use a IndexedMerkleTreeCalculator to create a new instance from a set of leaves. */
|
|
8
8
|
export class IndexedMerkleTree<T extends IndexedTreeLeafPreimage, N extends number> extends MerkleTree {
|
|
9
|
-
constructor(
|
|
9
|
+
constructor(
|
|
10
|
+
height: N,
|
|
11
|
+
nodes: Buffer[],
|
|
12
|
+
public readonly leafPreimages: T[],
|
|
13
|
+
) {
|
|
10
14
|
super(height, nodes);
|
|
11
15
|
}
|
|
12
16
|
|
|
@@ -28,7 +28,7 @@ export class IndexedMerkleTreeCalculator<T extends IndexedTreeLeafPreimage, N ex
|
|
|
28
28
|
) {
|
|
29
29
|
const zeroHashes = [zeroLeaf];
|
|
30
30
|
for (let i = 0; i < height; i++) {
|
|
31
|
-
zeroHashes.push(await hasher.hash(zeroHashes[i], zeroHashes[i]));
|
|
31
|
+
zeroHashes.push((await hasher.hash(zeroHashes[i], zeroHashes[i])) as Buffer<ArrayBuffer>);
|
|
32
32
|
}
|
|
33
33
|
return new IndexedMerkleTreeCalculator(height, zeroHashes, hasher, factory);
|
|
34
34
|
}
|
|
@@ -59,7 +59,7 @@ export class IndexedMerkleTreeCalculator<T extends IndexedTreeLeafPreimage, N ex
|
|
|
59
59
|
|
|
60
60
|
for (let i = 0; i < this.height; ++i) {
|
|
61
61
|
const numLeaves = 2 ** (this.height - i);
|
|
62
|
-
const newLeaves: Buffer[] = [];
|
|
62
|
+
const newLeaves: Buffer<ArrayBuffer>[] = [];
|
|
63
63
|
for (let j = 0; j < leaves.length / 2; ++j) {
|
|
64
64
|
const l = leaves[j * 2];
|
|
65
65
|
const r = leaves[j * 2 + 1] || this.zeroHashes[i];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { assertMemberLength } from '../array/array.js';
|
|
2
2
|
import { toBigIntBE, toBufferBE } from '../bigint-buffer/index.js';
|
|
3
|
-
import { Fr } from '../
|
|
3
|
+
import { Fr } from '../curves/bn254/field.js';
|
|
4
|
+
import { schemas } from '../schemas/schemas.js';
|
|
4
5
|
import { BufferReader, type Tuple, serializeToBuffer } from '../serialize/index.js';
|
|
5
6
|
import type { SiblingPath } from './sibling_path.js';
|
|
6
7
|
|
|
@@ -29,6 +30,26 @@ export class MembershipWitness<N extends number> {
|
|
|
29
30
|
return serializeToBuffer(toBufferBE(this.leafIndex, 32), ...this.siblingPath);
|
|
30
31
|
}
|
|
31
32
|
|
|
33
|
+
toJSON() {
|
|
34
|
+
return this.toBuffer();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
toFields(): Fr[] {
|
|
38
|
+
return [new Fr(this.leafIndex), ...this.siblingPath];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Returns a representation of the membership witness as expected by intrinsic Noir deserialization.
|
|
43
|
+
*/
|
|
44
|
+
public toNoirRepresentation(): (string | string[])[] {
|
|
45
|
+
// TODO(#12874): remove the stupid as string conversion by modifying ForeignCallOutput type in acvm.js
|
|
46
|
+
return [new Fr(this.leafIndex).toString() as string, this.siblingPath.map(fr => fr.toString()) as string[]];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static schemaFor<N extends number>(size: N) {
|
|
50
|
+
return schemas.Buffer.transform(b => MembershipWitness.fromBuffer(b, size));
|
|
51
|
+
}
|
|
52
|
+
|
|
32
53
|
/**
|
|
33
54
|
* Creates a random membership witness. Used for testing purposes.
|
|
34
55
|
* @param pathSize - Number of fields in the sibling path.
|
package/src/trees/merkle_tree.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/** A simple immutable Merkle tree container. Use a MerkleTreeCalculator to create a new instance from a set of leaves. */
|
|
2
2
|
export class MerkleTree {
|
|
3
|
-
constructor(
|
|
3
|
+
constructor(
|
|
4
|
+
public readonly height: number,
|
|
5
|
+
public readonly nodes: Buffer[],
|
|
6
|
+
) {
|
|
4
7
|
const expectedNodeCount = 2 ** (height + 1) - 1;
|
|
5
8
|
if (nodes.length !== expectedNodeCount) {
|
|
6
9
|
throw new Error(`Invalid node count for Merkle tree: got ${nodes.length} but expected ${expectedNodeCount}`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
|
|
2
2
|
|
|
3
3
|
import type { AsyncHasher } from './hasher.js';
|
|
4
4
|
import { MerkleTree } from './merkle_tree.js';
|
|
@@ -7,18 +7,23 @@ import { MerkleTree } from './merkle_tree.js';
|
|
|
7
7
|
* Merkle tree calculator.
|
|
8
8
|
*/
|
|
9
9
|
export class MerkleTreeCalculator {
|
|
10
|
-
private constructor(
|
|
10
|
+
private constructor(
|
|
11
|
+
private height: number,
|
|
12
|
+
private zeroHashes: Buffer[],
|
|
13
|
+
private hasher: AsyncHasher['hash'],
|
|
14
|
+
) {
|
|
11
15
|
this.hasher = hasher;
|
|
12
16
|
}
|
|
13
17
|
|
|
14
18
|
static async create(
|
|
15
19
|
height: number,
|
|
16
|
-
zeroLeaf = Buffer.alloc(32),
|
|
17
|
-
hasher = async (left: Buffer, right: Buffer) =>
|
|
20
|
+
zeroLeaf: Buffer = Buffer.alloc(32),
|
|
21
|
+
hasher = async (left: Buffer, right: Buffer) =>
|
|
22
|
+
(await poseidon2Hash([left, right])).toBuffer() as Buffer<ArrayBuffer>,
|
|
18
23
|
) {
|
|
19
24
|
const zeroHashes = [zeroLeaf];
|
|
20
25
|
for (let i = 0; i < height; i++) {
|
|
21
|
-
zeroHashes.push(await hasher(zeroHashes[i], zeroHashes[i]));
|
|
26
|
+
zeroHashes.push((await hasher(zeroHashes[i], zeroHashes[i])) as Buffer<ArrayBuffer>);
|
|
22
27
|
}
|
|
23
28
|
return new MerkleTreeCalculator(height, zeroHashes, hasher);
|
|
24
29
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { makeTuple } from '../array/array.js';
|
|
2
|
-
import {
|
|
3
|
-
import { Fr } from '../
|
|
2
|
+
import { poseidon2Hash } from '../crypto/poseidon/index.js';
|
|
3
|
+
import { Fr } from '../curves/bn254/index.js';
|
|
4
4
|
import { schemas } from '../schemas/index.js';
|
|
5
5
|
import {
|
|
6
6
|
type Tuple,
|
|
@@ -172,7 +172,7 @@ export async function computeRootFromSiblingPath(
|
|
|
172
172
|
leaf: Buffer,
|
|
173
173
|
siblingPath: Buffer[],
|
|
174
174
|
index: number,
|
|
175
|
-
hasher = async (left: Buffer, right: Buffer) => (await
|
|
175
|
+
hasher = async (left: Buffer, right: Buffer) => (await poseidon2Hash([left, right])).toBuffer(),
|
|
176
176
|
) {
|
|
177
177
|
let result = leaf;
|
|
178
178
|
for (const sibling of siblingPath) {
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { type Hasher, shaMerkleHash } from './hasher.js';
|
|
2
|
+
import { SiblingPath } from './sibling_path.js';
|
|
3
|
+
import { type TreeNodeLocation, UnbalancedTreeStore } from './unbalanced_tree_store.js';
|
|
4
|
+
|
|
5
|
+
interface TreeNode {
|
|
6
|
+
value: Buffer;
|
|
7
|
+
leafIndex?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* An ephemeral unbalanced Merkle tree implementation.
|
|
12
|
+
* Follows the rollup implementation which greedily hashes pairs of nodes up the tree.
|
|
13
|
+
* Remaining rightmost nodes are shifted up until they can be paired.
|
|
14
|
+
* The values that match the `valueToCompress` are skipped and the sibling of the compressed leaf are shifted up until
|
|
15
|
+
* they can be paired.
|
|
16
|
+
* If there is only one leaf, the root is the leaf.
|
|
17
|
+
*/
|
|
18
|
+
export class UnbalancedMerkleTreeCalculator {
|
|
19
|
+
private store: UnbalancedTreeStore<TreeNode>;
|
|
20
|
+
private leafLocations: TreeNodeLocation[] = [];
|
|
21
|
+
|
|
22
|
+
public constructor(
|
|
23
|
+
private readonly leaves: Buffer[],
|
|
24
|
+
private readonly valueToCompress: Buffer,
|
|
25
|
+
private readonly emptyRoot: Buffer,
|
|
26
|
+
private readonly hasher: Hasher['hash'],
|
|
27
|
+
) {
|
|
28
|
+
this.store = new UnbalancedTreeStore(leaves.length);
|
|
29
|
+
this.buildTree();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static create(
|
|
33
|
+
leaves: Buffer[],
|
|
34
|
+
valueToCompress = Buffer.alloc(0),
|
|
35
|
+
emptyRoot = Buffer.alloc(32),
|
|
36
|
+
hasher = shaMerkleHash,
|
|
37
|
+
) {
|
|
38
|
+
return new UnbalancedMerkleTreeCalculator(leaves, valueToCompress, emptyRoot, hasher);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Returns the root of the tree.
|
|
43
|
+
* @returns The root of the tree.
|
|
44
|
+
*/
|
|
45
|
+
public getRoot(): Buffer {
|
|
46
|
+
return this.store.getRoot()!.value;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns a sibling path for the element.
|
|
51
|
+
* @param value - The value of the element.
|
|
52
|
+
* @returns A sibling path for the element.
|
|
53
|
+
* Note: The sibling path is an array of sibling hashes, with the lowest hash (leaf hash) first, and the highest hash last.
|
|
54
|
+
*/
|
|
55
|
+
public getSiblingPath<N extends number>(value: Buffer): SiblingPath<N> {
|
|
56
|
+
const leafIndex = this.leaves.findIndex(leaf => leaf.equals(value));
|
|
57
|
+
if (leafIndex === -1) {
|
|
58
|
+
throw Error(`Leaf value ${value.toString('hex')} not found in tree.`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return this.getSiblingPathByLeafIndex(leafIndex);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns a sibling path for the leaf at the given index.
|
|
66
|
+
* @param leafIndex - The index of the leaf.
|
|
67
|
+
* @returns A sibling path for the leaf.
|
|
68
|
+
*/
|
|
69
|
+
public getSiblingPathByLeafIndex<N extends number>(leafIndex: number): SiblingPath<N> {
|
|
70
|
+
if (leafIndex >= this.leaves.length) {
|
|
71
|
+
throw Error(`Leaf index ${leafIndex} out of bounds. Tree has ${this.leaves.length} leaves.`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const leaf = this.leaves[leafIndex];
|
|
75
|
+
if (leaf.equals(this.valueToCompress)) {
|
|
76
|
+
throw Error(`Leaf at index ${leafIndex} has been compressed.`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const path: Buffer[] = [];
|
|
80
|
+
let location = this.leafLocations[leafIndex];
|
|
81
|
+
while (location.level > 0) {
|
|
82
|
+
const sibling = this.store.getSibling(location)!;
|
|
83
|
+
path.push(sibling.value);
|
|
84
|
+
location = this.store.getParentLocation(location);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return new SiblingPath<N>(path.length as N, path);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public getLeafLocation(leafIndex: number) {
|
|
91
|
+
return this.leafLocations[leafIndex];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Adds leaves and nodes to the store. Updates the leafLocations.
|
|
96
|
+
* @param leaves - The leaves of the tree.
|
|
97
|
+
*/
|
|
98
|
+
private buildTree() {
|
|
99
|
+
this.leafLocations = this.leaves.map((value, i) => this.store.setLeaf(i, { value, leafIndex: i }));
|
|
100
|
+
|
|
101
|
+
// Start with the leaves that are not compressed.
|
|
102
|
+
let toProcess = this.leafLocations.filter((_, i) => !this.leaves[i].equals(this.valueToCompress));
|
|
103
|
+
if (!toProcess.length) {
|
|
104
|
+
// All leaves are compressed. Set empty root to the root.
|
|
105
|
+
this.store.setNode({ level: 0, index: 0 }, { value: this.emptyRoot });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const level = toProcess[0].level;
|
|
110
|
+
for (let i = level; i > 0; i--) {
|
|
111
|
+
const toProcessNext = [];
|
|
112
|
+
for (const location of toProcess) {
|
|
113
|
+
if (location.level !== i) {
|
|
114
|
+
toProcessNext.push(location);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const parentLocation = this.store.getParentLocation(location);
|
|
119
|
+
if (this.store.getNode(parentLocation)) {
|
|
120
|
+
// Parent has been updated by its (left) sibling.
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const sibling = this.store.getSibling(location);
|
|
125
|
+
// If sibling is undefined, all its children are compressed.
|
|
126
|
+
const shouldShiftUp = !sibling || sibling.value.equals(this.valueToCompress);
|
|
127
|
+
if (shouldShiftUp) {
|
|
128
|
+
// The node becomes the parent if the sibling is a compressed leaf.
|
|
129
|
+
this.shiftNodeUp(location, parentLocation);
|
|
130
|
+
} else {
|
|
131
|
+
// Hash the value with the (right) sibling and update the parent node.
|
|
132
|
+
const node = this.store.getNode(location)!;
|
|
133
|
+
const parentValue = this.hasher(node.value, sibling.value);
|
|
134
|
+
this.store.setNode(parentLocation, { value: parentValue });
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Add the parent location to be processed next.
|
|
138
|
+
toProcessNext.push(parentLocation);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
toProcess = toProcessNext;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private shiftNodeUp(from: TreeNodeLocation, to: TreeNodeLocation) {
|
|
146
|
+
// Collect all nodes that need to shift.
|
|
147
|
+
const nodesToShift = this.collectNodesToShift(from, to);
|
|
148
|
+
// Move all nodes to their new locations.
|
|
149
|
+
for (const { node, newLocation } of nodesToShift) {
|
|
150
|
+
this.store.setNode(newLocation, node);
|
|
151
|
+
if (node.leafIndex !== undefined) {
|
|
152
|
+
this.leafLocations[node.leafIndex] = newLocation;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private collectNodesToShift(from: TreeNodeLocation, to: TreeNodeLocation) {
|
|
158
|
+
const node = this.store.getNode(from);
|
|
159
|
+
if (!node) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
let result = [{ node, newLocation: to }];
|
|
164
|
+
|
|
165
|
+
// If not a leaf, collect its children.
|
|
166
|
+
if (node.leafIndex === undefined) {
|
|
167
|
+
const [leftChild, rightChild] = this.store.getChildLocations(from);
|
|
168
|
+
const [leftChildNew, rightChildNew] = this.store.getChildLocations(to);
|
|
169
|
+
result = result
|
|
170
|
+
.concat(this.collectNodesToShift(leftChild, leftChildNew))
|
|
171
|
+
.concat(this.collectNodesToShift(rightChild, rightChildNew));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { computeBalancedMerkleTreeRoot, computeBalancedMerkleTreeRootAsync } from './balanced_merkle_tree_root.js';
|
|
2
|
+
import { poseidonMerkleHash, shaMerkleHash } from './hasher.js';
|
|
3
|
+
import { UnbalancedMerkleTreeCalculator } from './unbalanced_merkle_tree_calculator.js';
|
|
4
|
+
|
|
5
|
+
export const computeUnbalancedShaRoot = (leaves: Buffer[]) => computeUnbalancedMerkleTreeRoot(leaves, shaMerkleHash);
|
|
6
|
+
|
|
7
|
+
export const computeUnbalancedPoseidonRoot = async (leaves: Buffer[]) =>
|
|
8
|
+
await computeUnbalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
|
|
9
|
+
|
|
10
|
+
export const computeWonkyShaRoot = (leaves: Buffer[]) => computeWonkyMerkleTreeRoot(leaves);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Computes the Merkle root of an unbalanced tree.
|
|
14
|
+
*
|
|
15
|
+
* Unlike a balanced Merkle tree, which requires the number of leaves to be a power of two, an unbalanced tree can have
|
|
16
|
+
* any number of leaves.
|
|
17
|
+
*
|
|
18
|
+
* The tree is constructed by iteratively extracting the smallest power-of-two-sized subtrees from **right to left**.
|
|
19
|
+
* For each such subtree, it computes the subtree root and then combines all subtree roots (again from right to left)
|
|
20
|
+
* into a single root using the provided hash function.
|
|
21
|
+
*
|
|
22
|
+
* Note: We need the final tree to be as shallow as possible, to minimize the size of the sibling path required to prove
|
|
23
|
+
* membership of a leaf. Therefor, the computation proceeds from right to left - smaller subtrees must always be
|
|
24
|
+
* combined before being merged with a larger sibling on their left.
|
|
25
|
+
*
|
|
26
|
+
* For example, consider an unbalanced tree made of three subtrees of sizes 2, 4, and 8. If we combine the size-2 and
|
|
27
|
+
* size-4 subtrees first (producing a subtree of depth 3), and then merge it with the size-8 subtree (also depth 3), the
|
|
28
|
+
* resulting tree has a maximum depth of 4.
|
|
29
|
+
*
|
|
30
|
+
* But if we instead combine the size-4 and size-8 subtrees first (depth 4), and then merge with the size-2 subtree
|
|
31
|
+
* (depth 1), the final tree has a depth of 5.
|
|
32
|
+
*/
|
|
33
|
+
export function computeUnbalancedMerkleTreeRoot(
|
|
34
|
+
leaves: Buffer[],
|
|
35
|
+
hasher = shaMerkleHash,
|
|
36
|
+
emptyRoot = Buffer.alloc(32),
|
|
37
|
+
): Buffer {
|
|
38
|
+
if (!leaves.length) {
|
|
39
|
+
return emptyRoot;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (leaves.length === 1) {
|
|
43
|
+
return leaves[0];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let numRemainingLeaves = leaves.length;
|
|
47
|
+
let subtreeSize = 1;
|
|
48
|
+
let root: Buffer | undefined;
|
|
49
|
+
while (numRemainingLeaves > 1) {
|
|
50
|
+
if ((numRemainingLeaves & subtreeSize) !== 0) {
|
|
51
|
+
const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
|
|
52
|
+
const subtreeRoot = computeBalancedMerkleTreeRoot(subtreeLeaves, hasher);
|
|
53
|
+
if (!root) {
|
|
54
|
+
root = subtreeRoot;
|
|
55
|
+
} else {
|
|
56
|
+
root = hasher(subtreeRoot, root);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
numRemainingLeaves -= subtreeSize;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
subtreeSize *= 2;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return root!;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function computeUnbalancedMerkleTreeRootAsync(
|
|
69
|
+
leaves: Buffer[],
|
|
70
|
+
hasher = poseidonMerkleHash,
|
|
71
|
+
emptyRoot = Buffer.alloc(32),
|
|
72
|
+
): Promise<Buffer> {
|
|
73
|
+
if (!leaves.length) {
|
|
74
|
+
return emptyRoot;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (leaves.length === 1) {
|
|
78
|
+
return leaves[0];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
let numRemainingLeaves = leaves.length;
|
|
82
|
+
let subtreeSize = 1;
|
|
83
|
+
let root: Buffer | undefined;
|
|
84
|
+
while (numRemainingLeaves > 1) {
|
|
85
|
+
if ((numRemainingLeaves & subtreeSize) !== 0) {
|
|
86
|
+
const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
|
|
87
|
+
const subtreeRoot = await computeBalancedMerkleTreeRootAsync(subtreeLeaves, hasher);
|
|
88
|
+
if (!root) {
|
|
89
|
+
root = subtreeRoot;
|
|
90
|
+
} else {
|
|
91
|
+
root = await hasher(subtreeRoot, root);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
numRemainingLeaves -= subtreeSize;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
subtreeSize *= 2;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return root!;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// A **wonky** tree is a "compressed" unbalanced Merkle tree.
|
|
104
|
+
// It is constructed in the same way as an unbalanced tree: by first creating the largest possible left subtree, with
|
|
105
|
+
// the remaining leaves forming a right subtree that follows the same process recursively.
|
|
106
|
+
// During construction, leaves equal to `valueToCompress` are skipped (compressed) and do not contribute to the tree.
|
|
107
|
+
export function computeWonkyMerkleTreeRoot(
|
|
108
|
+
leaves: Buffer[],
|
|
109
|
+
valueToCompress = Buffer.alloc(32),
|
|
110
|
+
emptyRoot = Buffer.alloc(32),
|
|
111
|
+
hasher = shaMerkleHash,
|
|
112
|
+
): Buffer {
|
|
113
|
+
const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, emptyRoot, hasher);
|
|
114
|
+
return calculator.getRoot();
|
|
115
|
+
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { findLeafLevelAndIndex } from './unbalanced_merkle_tree.js';
|
|
2
|
-
|
|
3
1
|
export interface TreeNodeLocation {
|
|
4
2
|
level: number;
|
|
5
3
|
index: number;
|
|
@@ -68,7 +66,7 @@ export class UnbalancedTreeStore<T> {
|
|
|
68
66
|
return [left, right];
|
|
69
67
|
}
|
|
70
68
|
|
|
71
|
-
getLeaf(leafIndex: number) {
|
|
69
|
+
getLeaf(leafIndex: number): T | undefined {
|
|
72
70
|
const { level, indexAtLevel } = findLeafLevelAndIndex(this.#numLeaves, leafIndex);
|
|
73
71
|
const location = {
|
|
74
72
|
level,
|
|
@@ -81,6 +79,10 @@ export class UnbalancedTreeStore<T> {
|
|
|
81
79
|
return this.#nodeMapping.get(this.#getKey(location))?.value;
|
|
82
80
|
}
|
|
83
81
|
|
|
82
|
+
getRoot(): T | undefined {
|
|
83
|
+
return this.getNode({ level: 0, index: 0 });
|
|
84
|
+
}
|
|
85
|
+
|
|
84
86
|
getParent(location: TreeNodeLocation): T | undefined {
|
|
85
87
|
const parentLocation = this.getParentLocation(location);
|
|
86
88
|
return this.getNode(parentLocation);
|
|
@@ -100,3 +102,60 @@ export class UnbalancedTreeStore<T> {
|
|
|
100
102
|
return `${location.level}-${location.index}`;
|
|
101
103
|
}
|
|
102
104
|
}
|
|
105
|
+
|
|
106
|
+
/// Get the depth of the maximum balanced tree that can be created with the given number of leaves. The subtree will be
|
|
107
|
+
/// the left most subtree of the unbalanced tree with a total of `numLeaves` leaves.
|
|
108
|
+
///
|
|
109
|
+
/// Note: All the leaves may not be used to form the tree. For example, if there are 5 leaves, the maximum depth is 2,
|
|
110
|
+
/// only 4 leaves are used to form a balanced tree.
|
|
111
|
+
function getMaxBalancedSubtreeDepth(numLeaves: number) {
|
|
112
|
+
return Math.floor(Math.log2(numLeaves));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/// Get the maximum depth of an unbalanced tree that can be created with the given number of leaves.
|
|
116
|
+
function getMaxUnbalancedTreeDepth(numLeaves: number) {
|
|
117
|
+
return Math.ceil(Math.log2(numLeaves));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function findPosition(
|
|
121
|
+
rootLevel: number,
|
|
122
|
+
leafLevel: number,
|
|
123
|
+
numLeaves: number,
|
|
124
|
+
indexOffset: number,
|
|
125
|
+
targetIndex: number,
|
|
126
|
+
): { level: number; indexAtLevel: number } {
|
|
127
|
+
if (numLeaves <= 1) {
|
|
128
|
+
// Single leaf.
|
|
129
|
+
return { level: rootLevel, indexAtLevel: indexOffset };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The largest balanced tree that can be created with the given number of leaves.
|
|
133
|
+
const maxBalancedTreeDepth = getMaxBalancedSubtreeDepth(numLeaves);
|
|
134
|
+
const numBalancedLeaves = 2 ** maxBalancedTreeDepth;
|
|
135
|
+
const numRemainingLeaves = numLeaves - numBalancedLeaves;
|
|
136
|
+
|
|
137
|
+
if (targetIndex < numBalancedLeaves) {
|
|
138
|
+
// Target is in the balanced tree.
|
|
139
|
+
|
|
140
|
+
// - If numRemainingLeaves is 0: this balanced tree is grown from the current root.
|
|
141
|
+
// - If numRemainingLeaves is not 0: the remaining leaves will form another tree, which will become the right child of the root.
|
|
142
|
+
// And the balanced tree will be the left child of the root.
|
|
143
|
+
// There will be an extra level between the root of the balanced tree and the current root.
|
|
144
|
+
const extraLevel = numRemainingLeaves ? 1 : 0;
|
|
145
|
+
|
|
146
|
+
return { level: rootLevel + maxBalancedTreeDepth + extraLevel, indexAtLevel: indexOffset + targetIndex };
|
|
147
|
+
} else {
|
|
148
|
+
// Target is in the right branch.
|
|
149
|
+
const rightBranchMaxLevel = getMaxUnbalancedTreeDepth(numRemainingLeaves);
|
|
150
|
+
const shiftedUp = leafLevel - rootLevel - rightBranchMaxLevel - 1;
|
|
151
|
+
const nextLeafLevel = leafLevel - shiftedUp;
|
|
152
|
+
const newIndexOffset = (indexOffset + numBalancedLeaves) >> shiftedUp;
|
|
153
|
+
const shiftedTargetIndex = targetIndex - numBalancedLeaves;
|
|
154
|
+
return findPosition(rootLevel + 1, nextLeafLevel, numRemainingLeaves, newIndexOffset, shiftedTargetIndex);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function findLeafLevelAndIndex(numLeaves: number, leafIndex: number) {
|
|
159
|
+
const maxLevel = getMaxUnbalancedTreeDepth(numLeaves);
|
|
160
|
+
return findPosition(0, maxLevel, numLeaves, 0, leafIndex);
|
|
161
|
+
}
|