@aztec-labs/foundation 6.0.0-nightly.20260829
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 +68 -0
- package/dest/array/array.d.ts.map +1 -0
- package/dest/array/array.js +100 -0
- package/dest/array/index.d.ts +3 -0
- package/dest/array/index.d.ts.map +1 -0
- package/dest/array/index.js +2 -0
- package/dest/array/sorted_array.d.ts +15 -0
- package/dest/array/sorted_array.d.ts.map +1 -0
- package/dest/array/sorted_array.js +109 -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 +48 -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 +40 -0
- package/dest/bigint-buffer/index.d.ts.map +1 -0
- package/dest/bigint-buffer/index.js +81 -0
- 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 +89 -0
- package/dest/branded-types/buffer32_hash.d.ts +27 -0
- package/dest/branded-types/buffer32_hash.d.ts.map +1 -0
- package/dest/branded-types/buffer32_hash.js +12 -0
- package/dest/branded-types/checkpoint_number.d.ts +60 -0
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -0
- package/dest/branded-types/checkpoint_number.js +88 -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 +8 -0
- package/dest/branded-types/index.d.ts.map +1 -0
- package/dest/branded-types/index.js +6 -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 +45 -0
- package/dest/branded-types/slot.d.ts.map +1 -0
- package/dest/branded-types/slot.js +62 -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 +82 -0
- package/dest/buffer/buffer16.d.ts.map +1 -0
- package/dest/buffer/buffer16.js +102 -0
- package/dest/buffer/buffer32.d.ts +54 -0
- package/dest/buffer/buffer32.d.ts.map +1 -0
- package/dest/buffer/buffer32.js +83 -0
- package/dest/buffer/index.d.ts +4 -0
- package/dest/buffer/index.d.ts.map +1 -0
- package/dest/buffer/index.js +3 -0
- package/dest/buffer/utils.d.ts +3 -0
- package/dest/buffer/utils.d.ts.map +1 -0
- package/dest/buffer/utils.js +7 -0
- package/dest/collection/array.d.ts +135 -0
- package/dest/collection/array.d.ts.map +1 -0
- package/dest/collection/array.js +302 -0
- package/dest/collection/index.d.ts +5 -0
- package/dest/collection/index.d.ts.map +1 -0
- package/dest/collection/index.js +4 -0
- package/dest/collection/lru_map.d.ts +41 -0
- package/dest/collection/lru_map.d.ts.map +1 -0
- package/dest/collection/lru_map.js +119 -0
- package/dest/collection/lru_set.d.ts +35 -0
- package/dest/collection/lru_set.d.ts.map +1 -0
- package/dest/collection/lru_set.js +95 -0
- package/dest/collection/object.d.ts +30 -0
- package/dest/collection/object.d.ts.map +1 -0
- package/dest/collection/object.js +57 -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 +154 -0
- package/dest/config/index.d.ts.map +1 -0
- package/dest/config/index.js +272 -0
- package/dest/config/network_config.d.ts +28 -0
- package/dest/config/network_config.d.ts.map +1 -0
- package/dest/config/network_config.js +14 -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 +33 -0
- package/dest/crypto/aes128/index.d.ts.map +1 -0
- package/dest/crypto/aes128/index.js +71 -0
- package/dest/crypto/bls/bn254_keystore.d.ts +129 -0
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -0
- package/dest/crypto/bls/bn254_keystore.js +206 -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 +39 -0
- package/dest/crypto/ecdsa/index.d.ts.map +1 -0
- package/dest/crypto/ecdsa/index.js +102 -0
- package/dest/crypto/ecdsa/signature.d.ts +69 -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 +42 -0
- package/dest/crypto/grumpkin/index.d.ts.map +1 -0
- package/dest/crypto/grumpkin/index.js +160 -0
- package/dest/crypto/keccak/index.d.ts +26 -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 +4 -0
- package/dest/crypto/keys/index.d.ts.map +1 -0
- package/dest/crypto/keys/index.js +34 -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.noble.d.ts +9 -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 +19 -0
- package/dest/crypto/pedersen/pedersen.wasm.d.ts.map +1 -0
- package/dest/crypto/pedersen/pedersen.wasm.js +51 -0
- package/dest/crypto/poseidon/index.d.ts +23 -0
- package/dest/crypto/poseidon/index.d.ts.map +1 -0
- package/dest/crypto/poseidon/index.js +71 -0
- package/dest/crypto/random/index.d.ts +23 -0
- package/dest/crypto/random/index.d.ts.map +1 -0
- package/dest/crypto/random/index.js +38 -0
- package/dest/crypto/random/randomness_singleton.d.ts +24 -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 +32 -0
- package/dest/crypto/schnorr/index.d.ts.map +1 -0
- package/dest/crypto/schnorr/index.js +60 -0
- package/dest/crypto/schnorr/signature.d.ts +48 -0
- package/dest/crypto/schnorr/signature.d.ts.map +1 -0
- package/dest/crypto/schnorr/signature.js +77 -0
- package/dest/crypto/secp256k1/index.d.ts +30 -0
- package/dest/crypto/secp256k1/index.d.ts.map +1 -0
- package/dest/crypto/secp256k1/index.js +121 -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 +102 -0
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -0
- package/dest/crypto/secp256k1-signer/utils.js +196 -0
- package/dest/crypto/sha256/index.d.ts +37 -0
- package/dest/crypto/sha256/index.d.ts.map +1 -0
- package/dest/crypto/sha256/index.js +208 -0
- package/dest/crypto/sha512/index.d.ts +9 -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 +17 -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 +19 -0
- package/dest/crypto/sync/pedersen/index.d.ts.map +1 -0
- package/dest/crypto/sync/pedersen/index.js +45 -0
- package/dest/crypto/sync/poseidon/index.d.ts +23 -0
- package/dest/crypto/sync/poseidon/index.d.ts.map +1 -0
- package/dest/crypto/sync/poseidon/index.js +60 -0
- 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 +357 -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 +185 -0
- package/dest/curves/bn254/field.d.ts.map +1 -0
- package/dest/curves/bn254/field.js +420 -0
- 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/curves/grumpkin/point.d.ts +168 -0
- package/dest/curves/grumpkin/point.d.ts.map +1 -0
- package/dest/curves/grumpkin/point.js +263 -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 +143 -0
- package/dest/eth-address/index.d.ts.map +1 -0
- package/dest/eth-address/index.js +224 -0
- package/dest/eth-signature/eth_signature.d.ts +65 -0
- package/dest/eth-signature/eth_signature.d.ts.map +1 -0
- package/dest/eth-signature/eth_signature.js +110 -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/fifo/fifo_frame_reader.d.ts +41 -0
- package/dest/fifo/fifo_frame_reader.d.ts.map +1 -0
- package/dest/fifo/fifo_frame_reader.js +91 -0
- package/dest/fifo/index.d.ts +2 -0
- package/dest/fifo/index.d.ts.map +1 -0
- package/dest/fifo/index.js +1 -0
- package/dest/fifo_set/fifo_set.d.ts +15 -0
- package/dest/fifo_set/fifo_set.d.ts.map +1 -0
- package/dest/fifo_set/fifo_set.js +39 -0
- package/dest/fifo_set/index.d.ts +2 -0
- package/dest/fifo_set/index.d.ts.map +1 -0
- package/dest/fifo_set/index.js +1 -0
- package/dest/fs/index.d.ts +3 -0
- package/dest/fs/index.d.ts.map +1 -0
- package/dest/fs/index.js +2 -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/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 +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/first.d.ts +8 -0
- package/dest/iterable/first.d.ts.map +1 -0
- package/dest/iterable/first.js +11 -0
- package/dest/iterable/index.d.ts +9 -0
- package/dest/iterable/index.d.ts.map +1 -0
- package/dest/iterable/index.js +8 -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/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/setup.js +34 -0
- package/dest/jest/setupAfterEnv.js +3 -0
- package/dest/json-rpc/client/fetch.d.ts +37 -0
- package/dest/json-rpc/client/fetch.d.ts.map +1 -0
- package/dest/json-rpc/client/fetch.js +67 -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 +33 -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 +218 -0
- package/dest/json-rpc/client/undici.d.ts +16 -0
- package/dest/json-rpc/client/undici.d.ts.map +1 -0
- package/dest/json-rpc/client/undici.js +112 -0
- package/dest/json-rpc/convert.d.ts +20 -0
- package/dest/json-rpc/convert.d.ts.map +1 -0
- package/dest/json-rpc/convert.js +40 -0
- 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 +13 -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 +13 -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 +85 -0
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/test_state.js +171 -0
- package/dest/json-rpc/index.d.ts +3 -0
- package/dest/json-rpc/index.d.ts.map +1 -0
- package/dest/json-rpc/index.js +2 -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/api_key_auth.d.ts +19 -0
- package/dest/json-rpc/server/api_key_auth.d.ts.map +1 -0
- package/dest/json-rpc/server/api_key_auth.js +57 -0
- package/dest/json-rpc/server/index.d.ts +3 -0
- package/dest/json-rpc/server/index.d.ts.map +1 -0
- package/dest/json-rpc/server/index.js +2 -0
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +177 -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 +570 -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 +14 -0
- package/dest/json-rpc/test/integration.d.ts.map +1 -0
- package/dest/json-rpc/test/integration.js +21 -0
- package/dest/log/aws-logger-config.d.ts +8 -0
- package/dest/log/aws-logger-config.d.ts.map +1 -0
- package/dest/log/aws-logger-config.js +55 -0
- package/dest/log/bigint-utils.d.ts +5 -0
- package/dest/log/bigint-utils.d.ts.map +1 -0
- package/dest/log/bigint-utils.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/gcloud-logger-config.d.ts +13 -0
- package/dest/log/gcloud-logger-config.d.ts.map +1 -0
- package/dest/log/gcloud-logger-config.js +61 -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 +10 -0
- package/dest/log/libp2p_logger.d.ts.map +1 -0
- package/dest/log/libp2p_logger.js +76 -0
- package/dest/log/log-filters.d.ts +20 -0
- package/dest/log/log-filters.d.ts.map +1 -0
- package/dest/log/log-filters.js +73 -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/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-server.d.ts +9 -0
- package/dest/log/pino-logger-server.d.ts.map +1 -0
- package/dest/log/pino-logger-server.js +18 -0
- package/dest/log/pino-logger.d.ts +86 -0
- package/dest/log/pino-logger.d.ts.map +1 -0
- package/dest/log/pino-logger.js +347 -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 +44 -0
- package/dest/noir/noir_package_config.d.ts.map +1 -0
- package/dest/noir/noir_package_config.js +36 -0
- 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 +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 +53 -0
- package/dest/promise/running-promise.d.ts.map +1 -0
- package/dest/promise/running-promise.js +122 -0
- package/dest/promise/utils.d.ts +25 -0
- package/dest/promise/utils.d.ts.map +1 -0
- package/dest/promise/utils.js +40 -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 +106 -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 +27 -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 +74 -0
- package/dest/retry/index.d.ts +83 -0
- package/dest/retry/index.d.ts.map +1 -0
- package/dest/retry/index.js +146 -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 +23 -0
- package/dest/schemas/api.d.ts.map +1 -0
- package/dest/schemas/api.js +9 -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 +23 -0
- package/dest/schemas/schemas.d.ts +46 -0
- package/dest/schemas/schemas.d.ts.map +1 -0
- package/dest/schemas/schemas.js +56 -0
- package/dest/schemas/types.d.ts +33 -0
- package/dest/schemas/types.d.ts.map +1 -0
- package/dest/schemas/types.js +25 -0
- package/dest/schemas/utils.d.ts +47 -0
- package/dest/schemas/utils.d.ts.map +1 -0
- package/dest/schemas/utils.js +54 -0
- package/dest/serialize/buffer_reader.d.ts +274 -0
- package/dest/serialize/buffer_reader.d.ts.map +1 -0
- package/dest/serialize/buffer_reader.js +359 -0
- package/dest/serialize/buffer_sink.d.ts +134 -0
- package/dest/serialize/buffer_sink.d.ts.map +1 -0
- package/dest/serialize/buffer_sink.js +297 -0
- package/dest/serialize/field_reader.d.ts +121 -0
- package/dest/serialize/field_reader.d.ts.map +1 -0
- package/dest/serialize/field_reader.js +164 -0
- package/dest/serialize/free_funcs.d.ts +107 -0
- package/dest/serialize/free_funcs.d.ts.map +1 -0
- package/dest/serialize/free_funcs.js +183 -0
- package/dest/serialize/index.d.ts +8 -0
- package/dest/serialize/index.d.ts.map +1 -0
- package/dest/serialize/index.js +7 -0
- package/dest/serialize/serialize.d.ts +168 -0
- package/dest/serialize/serialize.d.ts.map +1 -0
- package/dest/serialize/serialize.js +258 -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 +54 -0
- package/dest/sleep/index.d.ts.map +1 -0
- package/dest/sleep/index.js +80 -0
- package/dest/string/index.d.ts +18 -0
- package/dest/string/index.d.ts.map +1 -0
- package/dest/string/index.js +62 -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 +59 -0
- 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 +5 -0
- package/dest/testing/index.d.ts.map +1 -0
- package/dest/testing/index.js +4 -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 +39 -0
- package/dest/timer/date.d.ts.map +1 -0
- package/dest/timer/date.js +62 -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 +56 -0
- package/dest/timer/timeout.d.ts.map +1 -0
- package/dest/timer/timeout.js +113 -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/dispatch/create_dispatch_proxy.d.ts +111 -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 +10 -0
- package/dest/transport/index.d.ts.map +1 -0
- package/dest/transport/index.js +9 -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 +12 -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 +27 -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 +41 -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 +25 -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 +36 -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 +60 -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 +47 -0
- package/dest/transport/transport_server.d.ts.map +1 -0
- package/dest/transport/transport_server.js +114 -0
- package/dest/trees/balanced_merkle_tree_root.d.ts +16 -0
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/balanced_merkle_tree_root.js +50 -0
- package/dest/trees/hasher.d.ts +40 -0
- package/dest/trees/hasher.d.ts.map +1 -0
- package/dest/trees/hasher.js +10 -0
- package/dest/trees/index.d.ts +13 -0
- package/dest/trees/index.d.ts.map +1 -0
- package/dest/trees/index.js +12 -0
- package/dest/trees/indexed_merkle_tree.d.ts +11 -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 +21 -0
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -0
- package/dest/trees/indexed_merkle_tree_calculator.js +87 -0
- package/dest/trees/indexed_tree_leaf.d.ts +55 -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 +63 -0
- package/dest/trees/membership_witness.d.ts.map +1 -0
- package/dest/trees/membership_witness.js +83 -0
- package/dest/trees/merkle_tree.d.ts +16 -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 +57 -0
- package/dest/trees/sibling_path.d.ts +96 -0
- package/dest/trees/sibling_path.d.ts.map +1 -0
- package/dest/trees/sibling_path.js +139 -0
- 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 +27 -0
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/unbalanced_merkle_tree_root.js +83 -0
- package/dest/trees/unbalanced_tree_store.d.ts +24 -0
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -0
- package/dest/trees/unbalanced_tree_store.js +148 -0
- package/dest/types/index.d.ts +68 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +24 -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/package.json +213 -0
- package/src/array/array.ts +147 -0
- package/src/array/index.ts +2 -0
- package/src/array/sorted_array.ts +138 -0
- package/src/async-map/index.ts +18 -0
- package/src/async-pool/index.ts +51 -0
- package/src/bigint/index.ts +20 -0
- package/src/bigint-buffer/index.ts +92 -0
- package/src/branded-types/block_number.ts +135 -0
- package/src/branded-types/buffer32_hash.ts +38 -0
- package/src/branded-types/checkpoint_number.ts +130 -0
- package/src/branded-types/epoch.ts +88 -0
- package/src/branded-types/index.ts +8 -0
- package/src/branded-types/index_within_checkpoint.ts +88 -0
- package/src/branded-types/slot.ts +93 -0
- package/src/branded-types/types.ts +2 -0
- package/src/buffer/buffer16.ts +135 -0
- package/src/buffer/buffer32.ts +116 -0
- package/src/buffer/index.ts +3 -0
- package/src/buffer/utils.ts +8 -0
- package/src/collection/array.ts +351 -0
- package/src/collection/index.ts +4 -0
- package/src/collection/lru_map.ts +143 -0
- package/src/collection/lru_set.ts +115 -0
- package/src/collection/object.ts +89 -0
- package/src/committable/committable.ts +46 -0
- package/src/committable/index.ts +1 -0
- package/src/config/env_var.ts +412 -0
- package/src/config/index.ts +419 -0
- package/src/config/network_config.ts +21 -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 +77 -0
- package/src/crypto/bls/bn254_keystore.ts +276 -0
- package/src/crypto/bls/index.ts +76 -0
- package/src/crypto/bn254/index.ts +64 -0
- package/src/crypto/ecdsa/index.ts +88 -0
- package/src/crypto/ecdsa/signature.ts +100 -0
- package/src/crypto/grumpkin/index.ts +90 -0
- package/src/crypto/keccak/index.ts +283 -0
- package/src/crypto/keys/index.ts +26 -0
- package/src/crypto/pedersen/index.ts +1 -0
- package/src/crypto/pedersen/pedersen.noble.ts +573 -0
- package/src/crypto/pedersen/pedersen.wasm.ts +52 -0
- package/src/crypto/poseidon/index.ts +83 -0
- package/src/crypto/random/index.ts +47 -0
- package/src/crypto/random/randomness_singleton.ts +64 -0
- package/src/crypto/schnorr/index.ts +61 -0
- package/src/crypto/schnorr/signature.ts +87 -0
- package/src/crypto/secp256k1/index.ts +61 -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 +244 -0
- package/src/crypto/sha256/index.ts +194 -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 +46 -0
- package/src/crypto/sync/poseidon/index.ts +72 -0
- package/src/curves/bls12/field.ts +456 -0
- package/src/curves/bls12/index.ts +2 -0
- package/src/curves/bls12/point.ts +450 -0
- package/src/curves/bn254/field.ts +531 -0
- 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/curves/grumpkin/point.ts +300 -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 +269 -0
- package/src/eth-signature/eth_signature.ts +155 -0
- package/src/eth-signature/index.ts +1 -0
- package/src/fifo/fifo_frame_reader.ts +113 -0
- package/src/fifo/index.ts +1 -0
- package/src/fifo_set/fifo_set.ts +52 -0
- package/src/fifo_set/index.ts +1 -0
- package/src/fs/index.ts +2 -0
- package/src/fs/run_in_dir.ts +33 -0
- package/src/fs/try_rm_dir.ts +15 -0
- package/src/iterable/all.ts +32 -0
- package/src/iterable/filter.ts +77 -0
- package/src/iterable/first.ts +14 -0
- package/src/iterable/index.ts +8 -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/iterator/filter.ts +11 -0
- package/src/iterator/index.ts +1 -0
- package/src/jest/env.mjs +52 -0
- package/src/jest/setup.mjs +38 -0
- package/src/jest/setupAfterEnv.mjs +3 -0
- package/src/json-rpc/README.md +55 -0
- package/src/json-rpc/client/fetch.ts +98 -0
- package/src/json-rpc/client/index.ts +2 -0
- package/src/json-rpc/client/safe_json_rpc_client.ts +283 -0
- package/src/json-rpc/client/undici.ts +128 -0
- package/src/json-rpc/convert.ts +52 -0
- package/src/json-rpc/errors.ts +6 -0
- package/src/json-rpc/fixtures/class_a.ts +18 -0
- package/src/json-rpc/fixtures/class_b.ts +18 -0
- package/src/json-rpc/fixtures/test_state.ts +143 -0
- package/src/json-rpc/index.ts +2 -0
- package/src/json-rpc/js_utils.ts +21 -0
- package/src/json-rpc/server/api_key_auth.ts +63 -0
- package/src/json-rpc/server/index.ts +2 -0
- package/src/json-rpc/server/safe_json_rpc_server.ts +626 -0
- package/src/json-rpc/test/index.ts +1 -0
- package/src/json-rpc/test/integration.ts +35 -0
- package/src/log/aws-logger-config.ts +32 -0
- package/src/log/bigint-utils.ts +25 -0
- package/src/log/console.ts +42 -0
- package/src/log/gcloud-logger-config.ts +72 -0
- package/src/log/index.ts +6 -0
- package/src/log/libp2p_logger.ts +93 -0
- package/src/log/log-filters.ts +81 -0
- package/src/log/log-levels.ts +3 -0
- package/src/log/log_fn.ts +5 -0
- package/src/log/noir_debug_log_util.ts +21 -0
- package/src/log/pino-logger-server.ts +25 -0
- package/src/log/pino-logger.ts +406 -0
- package/src/message/index.ts +47 -0
- package/src/mutex/index.ts +84 -0
- package/src/mutex/mutex_database.ts +11 -0
- package/src/noir/index.ts +1 -0
- package/src/noir/noir_package_config.ts +66 -0
- package/src/number/index.ts +14 -0
- package/src/profiler/index.ts +1 -0
- package/src/profiler/profiler.ts +125 -0
- package/src/promise/index.ts +2 -0
- package/src/promise/running-promise.ts +138 -0
- package/src/promise/utils.ts +60 -0
- package/src/queue/base_memory_queue.ts +138 -0
- package/src/queue/batch_queue.ts +121 -0
- package/src/queue/bounded_serial_queue.ts +103 -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 +38 -0
- package/src/queue/serial_queue.ts +86 -0
- package/src/retry/index.ts +185 -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 +32 -0
- package/src/schemas/schemas.ts +93 -0
- package/src/schemas/types.ts +36 -0
- package/src/schemas/utils.ts +91 -0
- package/src/serialize/buffer_reader.ts +472 -0
- package/src/serialize/buffer_sink.ts +350 -0
- package/src/serialize/field_reader.ts +208 -0
- package/src/serialize/free_funcs.ts +198 -0
- package/src/serialize/index.ts +7 -0
- package/src/serialize/serialize.ts +320 -0
- package/src/serialize/type_registry.ts +75 -0
- package/src/serialize/types.ts +40 -0
- package/src/sleep/index.ts +90 -0
- package/src/string/index.ts +80 -0
- package/src/testing/files/index.ts +74 -0
- package/src/testing/formatting.ts +3 -0
- package/src/testing/index.ts +4 -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 +82 -0
- package/src/timer/elapsed.ts +23 -0
- package/src/timer/index.ts +4 -0
- package/src/timer/timeout.ts +136 -0
- package/src/timer/timer.ts +48 -0
- package/src/transport/dispatch/create_dispatch_proxy.ts +151 -0
- package/src/transport/dispatch/messages.ts +58 -0
- package/src/transport/index.ts +9 -0
- package/src/transport/interface/connector.ts +8 -0
- package/src/transport/interface/listener.ts +15 -0
- package/src/transport/interface/socket.ts +14 -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 +130 -0
- package/src/transport/transport_server.ts +111 -0
- package/src/trees/balanced_merkle_tree_root.ts +65 -0
- package/src/trees/hasher.ts +51 -0
- package/src/trees/index.ts +12 -0
- package/src/trees/indexed_merkle_tree.ts +40 -0
- package/src/trees/indexed_merkle_tree_calculator.ts +98 -0
- package/src/trees/indexed_tree_leaf.ts +56 -0
- package/src/trees/membership_witness.ts +112 -0
- package/src/trees/merkle_tree.ts +75 -0
- package/src/trees/merkle_tree_calculator.ts +66 -0
- package/src/trees/sibling_path.ts +177 -0
- package/src/trees/unbalanced_merkle_tree_calculator.ts +176 -0
- package/src/trees/unbalanced_merkle_tree_root.ts +112 -0
- package/src/trees/unbalanced_tree_store.ts +161 -0
- package/src/types/index.ts +103 -0
- package/src/url/index.ts +72 -0
- package/src/validation/index.ts +18 -0
|
@@ -0,0 +1,75 @@
|
|
|
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(
|
|
4
|
+
public readonly height: number,
|
|
5
|
+
public readonly nodes: Buffer[],
|
|
6
|
+
) {
|
|
7
|
+
const expectedNodeCount = 2 ** (height + 1) - 1;
|
|
8
|
+
if (nodes.length !== expectedNodeCount) {
|
|
9
|
+
throw new Error(`Invalid node count for Merkle tree: got ${nodes.length} but expected ${expectedNodeCount}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
get root(): Buffer {
|
|
14
|
+
return this.nodes[this.nodes.length - 1];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get leaves(): Buffer[] {
|
|
18
|
+
return this.nodes.slice(0, 2 ** this.height);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Returns a sibling path to the given element or to the element in the given index. */
|
|
22
|
+
public getSiblingPath(leafIndex: number): Buffer[];
|
|
23
|
+
public getSiblingPath(leaf: Buffer): Buffer[];
|
|
24
|
+
public getSiblingPath(leafIndexOrLeaf: number | Buffer): Buffer[] {
|
|
25
|
+
if (Buffer.isBuffer(leafIndexOrLeaf)) {
|
|
26
|
+
return this.getSiblingPath(this.getIndex(leafIndexOrLeaf));
|
|
27
|
+
}
|
|
28
|
+
const leafIndex = leafIndexOrLeaf;
|
|
29
|
+
if (leafIndex < 0 || leafIndex >= 2 ** this.height) {
|
|
30
|
+
throw new Error(`Invalid leaf index: got ${leafIndex} but leaves count is ${2 ** this.height}`);
|
|
31
|
+
}
|
|
32
|
+
const tree = this.nodes;
|
|
33
|
+
let rowSize = Math.ceil(tree.length / 2);
|
|
34
|
+
let rowOffset = 0;
|
|
35
|
+
let index = leafIndex;
|
|
36
|
+
const siblingPath: Buffer[] = [];
|
|
37
|
+
while (rowSize > 1) {
|
|
38
|
+
const isRight = index & 1;
|
|
39
|
+
siblingPath.push(tree[rowOffset + index + (isRight ? -1 : 1)]);
|
|
40
|
+
rowOffset += rowSize;
|
|
41
|
+
rowSize >>= 1;
|
|
42
|
+
index >>= 1;
|
|
43
|
+
}
|
|
44
|
+
return siblingPath;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Returns the leaf index for a given element. */
|
|
48
|
+
public getIndex(element: Buffer) {
|
|
49
|
+
return this.leaves.findIndex(leaf => leaf.equals(element));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Returns a nice string representation of the tree, useful for debugging purposes. */
|
|
53
|
+
public drawTree(elemSize = 8) {
|
|
54
|
+
const levels: string[][] = [];
|
|
55
|
+
const tree = this.nodes;
|
|
56
|
+
const maxRowSize = Math.ceil(tree.length / 2);
|
|
57
|
+
let paddingSize = 1;
|
|
58
|
+
let rowSize = maxRowSize;
|
|
59
|
+
let rowOffset = 0;
|
|
60
|
+
while (rowSize > 0) {
|
|
61
|
+
levels.push(
|
|
62
|
+
tree
|
|
63
|
+
.slice(rowOffset, rowOffset + rowSize)
|
|
64
|
+
.map(n => n.toString('hex').slice(0, elemSize) + ' '.repeat((paddingSize - 1) * (elemSize + 1))),
|
|
65
|
+
);
|
|
66
|
+
rowOffset += rowSize;
|
|
67
|
+
paddingSize <<= 1;
|
|
68
|
+
rowSize >>= 1;
|
|
69
|
+
}
|
|
70
|
+
return levels
|
|
71
|
+
.reverse()
|
|
72
|
+
.map(row => row.join(' '))
|
|
73
|
+
.join('\n');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { MerkleTree } from './merkle_tree.js';
|
|
2
|
+
|
|
3
|
+
type MerkleHashFn = (left: Buffer, right: Buffer) => Promise<Buffer<ArrayBuffer>>;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Merkle tree calculator.
|
|
7
|
+
*/
|
|
8
|
+
export class MerkleTreeCalculator {
|
|
9
|
+
private constructor(
|
|
10
|
+
private height: number,
|
|
11
|
+
private zeroHashes: Buffer[],
|
|
12
|
+
private hasher: MerkleHashFn,
|
|
13
|
+
) {
|
|
14
|
+
this.hasher = hasher;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
static async create(height: number, zeroLeaf: Buffer = Buffer.alloc(32), hasher: MerkleHashFn) {
|
|
18
|
+
const zeroHashes = [zeroLeaf];
|
|
19
|
+
for (let i = 0; i < height; i++) {
|
|
20
|
+
zeroHashes.push((await hasher(zeroHashes[i], zeroHashes[i])) as Buffer<ArrayBuffer>);
|
|
21
|
+
}
|
|
22
|
+
return new MerkleTreeCalculator(height, zeroHashes, hasher);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async computeTree(leaves: Buffer[] = []): Promise<MerkleTree> {
|
|
26
|
+
if (leaves.length === 0) {
|
|
27
|
+
leaves = new Array(2 ** this.height).fill(this.zeroHashes[0]);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let result = leaves.slice();
|
|
31
|
+
|
|
32
|
+
for (let i = 0; i < this.height; ++i) {
|
|
33
|
+
const numLeaves = 2 ** (this.height - i);
|
|
34
|
+
const newLeaves: Buffer[] = [];
|
|
35
|
+
for (let j = 0; j < leaves.length / 2; ++j) {
|
|
36
|
+
const l = leaves[j * 2];
|
|
37
|
+
const r = leaves[j * 2 + 1] || this.zeroHashes[i];
|
|
38
|
+
newLeaves[j] = await this.hasher(l, r);
|
|
39
|
+
}
|
|
40
|
+
result = result.concat(new Array(numLeaves - leaves.length).fill(this.zeroHashes[i]), newLeaves);
|
|
41
|
+
leaves = newLeaves;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return new MerkleTree(this.height, result);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async computeTreeRoot(leaves: Buffer[] = []): Promise<Buffer> {
|
|
48
|
+
if (leaves.length === 0) {
|
|
49
|
+
return this.zeroHashes[this.zeroHashes.length - 1];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
leaves = leaves.slice();
|
|
53
|
+
|
|
54
|
+
for (let i = 0; i < this.height; ++i) {
|
|
55
|
+
let j = 0;
|
|
56
|
+
for (; j < leaves.length / 2; ++j) {
|
|
57
|
+
const l = leaves[j * 2];
|
|
58
|
+
const r = leaves[j * 2 + 1] || this.zeroHashes[i];
|
|
59
|
+
leaves[j] = await this.hasher(l, r);
|
|
60
|
+
}
|
|
61
|
+
leaves = leaves.slice(0, j);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return leaves[0];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
import { makeTuple } from '../array/array.js';
|
|
4
|
+
import { Fr } from '../curves/bn254/index.js';
|
|
5
|
+
import { schemas } from '../schemas/index.js';
|
|
6
|
+
import { BufferReader, type Tuple, assertLength, serializeArrayOfBufferableToVector } from '../serialize/index.js';
|
|
7
|
+
import { bufferToHex, hexToBuffer } from '../string/index.js';
|
|
8
|
+
import type { Hasher } from './hasher.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Upper bound on the elements a serialized sibling path may declare. The deepest protocol tree is 42 levels,
|
|
12
|
+
* and the stacked path proving L2-to-L1 message inclusion spans four unbalanced trees, so this leaves room to
|
|
13
|
+
* spare while keeping a malformed length prefix from driving a large allocation. `stdlib` asserts that it stays
|
|
14
|
+
* above every protocol tree height, which this package cannot check itself without depending on `@aztec-labs/constants`.
|
|
15
|
+
*/
|
|
16
|
+
export const MAX_SIBLING_PATH_LENGTH = 128;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Contains functionality to compute and serialize/deserialize a sibling path.
|
|
20
|
+
* E.g. Sibling path for a leaf at index 3 in a tree of depth 3 consists of:
|
|
21
|
+
* d0: [ root ]
|
|
22
|
+
* d1: [ ] [*]
|
|
23
|
+
* d2: [*] [ ] [ ] [ ]
|
|
24
|
+
* d3: [ ] [ ] [*] [ ] [ ] [ ] [ ] [ ].
|
|
25
|
+
*
|
|
26
|
+
* And the elements would be ordered as: [ leaf_at_index_2, node_at_level_2_index_0, node_at_level_1_index_1 ].
|
|
27
|
+
*/
|
|
28
|
+
export class SiblingPath<N extends number> {
|
|
29
|
+
private data: Tuple<Buffer, N>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Constructor.
|
|
33
|
+
* @param pathSize - The size of the sibling path.
|
|
34
|
+
* @param path - The sibling path data.
|
|
35
|
+
*/
|
|
36
|
+
constructor(
|
|
37
|
+
/** Size of the sibling path (number of fields it contains). */
|
|
38
|
+
public pathSize: N,
|
|
39
|
+
/** The sibling path data. */
|
|
40
|
+
path: Buffer[],
|
|
41
|
+
) {
|
|
42
|
+
this.data = assertLength(path, pathSize);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static get schema() {
|
|
46
|
+
return schemas.Buffer.transform(b => SiblingPath.fromBuffer(b));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static schemaFor<N extends number>(size: N) {
|
|
50
|
+
return schemas.Buffer.transform(b => SiblingPath.fromBuffer(b) as SiblingPath<N>).superRefine((path, ctx) => {
|
|
51
|
+
if (path.pathSize !== size) {
|
|
52
|
+
ctx.addIssue({
|
|
53
|
+
code: z.ZodIssueCode.custom,
|
|
54
|
+
message: `Expected sibling path size ${size} but got ${path.pathSize}`,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
toJSON() {
|
|
61
|
+
return this.toBuffer();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns sibling path hashed up from the a element.
|
|
66
|
+
* @param size - The number of elements in a given path.
|
|
67
|
+
* @param zeroElement - Value of the zero element.
|
|
68
|
+
* @param hasher - Implementation of a hasher interface.
|
|
69
|
+
* @returns A sibling path hashed up from a zero element.
|
|
70
|
+
*/
|
|
71
|
+
public static ZERO<N extends number>(size: N, zeroElement: Buffer, hasher: Hasher): SiblingPath<N> {
|
|
72
|
+
const bufs: Buffer[] = [];
|
|
73
|
+
let current = zeroElement;
|
|
74
|
+
for (let i = 0; i < size; ++i) {
|
|
75
|
+
bufs.push(current);
|
|
76
|
+
current = hasher.hash(current, current);
|
|
77
|
+
}
|
|
78
|
+
return new SiblingPath(size, bufs);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static random<N extends number>(number: N) {
|
|
82
|
+
const data = Array.from({ length: number }, () => Fr.random().toBuffer());
|
|
83
|
+
return new SiblingPath(number, data);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Serializes this SiblingPath object to a buffer.
|
|
88
|
+
* @returns The buffer representation of this object.
|
|
89
|
+
*/
|
|
90
|
+
public toBuffer(): Buffer {
|
|
91
|
+
return serializeArrayOfBufferableToVector(this.data);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Returns the path buffer underlying the sibling path.
|
|
96
|
+
* @returns The Buffer array representation of this object.
|
|
97
|
+
*/
|
|
98
|
+
public toBufferArray(): Buffer[] {
|
|
99
|
+
return this.data;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Convert the Sibling Path object into an array of field elements.
|
|
104
|
+
* @returns The field array representation of this object.
|
|
105
|
+
*/
|
|
106
|
+
public toFields(): Fr[] {
|
|
107
|
+
return this.data.map(buf => Fr.fromBuffer(buf));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Convert Sibling Path object into a tuple of field elements.
|
|
112
|
+
* @returns A tuple representation of the sibling path.
|
|
113
|
+
*/
|
|
114
|
+
public toTuple(): Tuple<Fr, N> {
|
|
115
|
+
const array = this.toFields();
|
|
116
|
+
return makeTuple(array.length as N, i => array[i], 0);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Deserializes a SiblingPath from a buffer.
|
|
121
|
+
* @param buf - A buffer containing the buffer representation of SiblingPath.
|
|
122
|
+
* @param offset - An offset to start deserializing from.
|
|
123
|
+
* @returns A SiblingPath object.
|
|
124
|
+
* @throws If the length prefix exceeds MAX_SIBLING_PATH_LENGTH or the buffer holds fewer elements than it declares.
|
|
125
|
+
*/
|
|
126
|
+
static fromBuffer<N extends number>(buf: Buffer, offset = 0): SiblingPath<N> {
|
|
127
|
+
const reader = new BufferReader(buf, offset);
|
|
128
|
+
const path = reader.readVector({ fromBuffer: r => r.readBytes(Fr.SIZE_IN_BYTES) }, MAX_SIBLING_PATH_LENGTH);
|
|
129
|
+
return new SiblingPath<N>(path.length as N, path);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Serializes this SiblingPath object to a hex string representation.
|
|
134
|
+
* @returns A hex string representation of the sibling path.
|
|
135
|
+
*/
|
|
136
|
+
public toString(): string {
|
|
137
|
+
return bufferToHex(this.toBuffer());
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Deserializes a SiblingPath object from a hex string representation.
|
|
142
|
+
* @param repr - A hex string representation of the sibling path.
|
|
143
|
+
* @returns A SiblingPath object.
|
|
144
|
+
*/
|
|
145
|
+
public static fromString<N extends number>(repr: string): SiblingPath<N> {
|
|
146
|
+
return SiblingPath.fromBuffer<N>(hexToBuffer(repr));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Generate a subtree path from the current sibling path.
|
|
151
|
+
* @param subtreeHeight - The size of the subtree that we are getting the path for.
|
|
152
|
+
* @returns A new sibling path that is the for the requested subtree.
|
|
153
|
+
*/
|
|
154
|
+
public getSubtreeSiblingPath<SubtreeHeight extends number, SubtreeSiblingPathHeight extends number>(
|
|
155
|
+
subtreeHeight: SubtreeHeight,
|
|
156
|
+
): SiblingPath<SubtreeSiblingPathHeight> {
|
|
157
|
+
// Drop the size of the subtree from the path, and return the rest.
|
|
158
|
+
const subtreeData = this.data.slice(subtreeHeight);
|
|
159
|
+
const subtreePathSize = (this.pathSize - subtreeHeight) as SubtreeSiblingPathHeight;
|
|
160
|
+
return new SiblingPath(subtreePathSize, subtreeData);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Computes the expected root of a merkle tree given a leaf and its sibling path. */
|
|
165
|
+
export async function computeRootFromSiblingPath(
|
|
166
|
+
leaf: Buffer,
|
|
167
|
+
siblingPath: Buffer[],
|
|
168
|
+
index: number,
|
|
169
|
+
hasher: (left: Buffer, right: Buffer) => Promise<Buffer>,
|
|
170
|
+
) {
|
|
171
|
+
let result = leaf;
|
|
172
|
+
for (const sibling of siblingPath) {
|
|
173
|
+
result = index & 1 ? await hasher(sibling, result) : await hasher(result, sibling);
|
|
174
|
+
index >>= 1;
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
@@ -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,112 @@
|
|
|
1
|
+
import { computeBalancedMerkleTreeRoot, computeBalancedMerkleTreeRootAsync } from './balanced_merkle_tree_root.js';
|
|
2
|
+
import { 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 computeWonkyShaRoot = (leaves: Buffer[]) => computeWonkyMerkleTreeRoot(leaves);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Computes the Merkle root of an unbalanced tree.
|
|
11
|
+
*
|
|
12
|
+
* Unlike a balanced Merkle tree, which requires the number of leaves to be a power of two, an unbalanced tree can have
|
|
13
|
+
* any number of leaves.
|
|
14
|
+
*
|
|
15
|
+
* The tree is constructed by iteratively extracting the smallest power-of-two-sized subtrees from **right to left**.
|
|
16
|
+
* For each such subtree, it computes the subtree root and then combines all subtree roots (again from right to left)
|
|
17
|
+
* into a single root using the provided hash function.
|
|
18
|
+
*
|
|
19
|
+
* Note: We need the final tree to be as shallow as possible, to minimize the size of the sibling path required to prove
|
|
20
|
+
* membership of a leaf. Therefor, the computation proceeds from right to left - smaller subtrees must always be
|
|
21
|
+
* combined before being merged with a larger sibling on their left.
|
|
22
|
+
*
|
|
23
|
+
* For example, consider an unbalanced tree made of three subtrees of sizes 2, 4, and 8. If we combine the size-2 and
|
|
24
|
+
* size-4 subtrees first (producing a subtree of depth 3), and then merge it with the size-8 subtree (also depth 3), the
|
|
25
|
+
* resulting tree has a maximum depth of 4.
|
|
26
|
+
*
|
|
27
|
+
* But if we instead combine the size-4 and size-8 subtrees first (depth 4), and then merge with the size-2 subtree
|
|
28
|
+
* (depth 1), the final tree has a depth of 5.
|
|
29
|
+
*/
|
|
30
|
+
export function computeUnbalancedMerkleTreeRoot(
|
|
31
|
+
leaves: Buffer[],
|
|
32
|
+
hasher = shaMerkleHash,
|
|
33
|
+
emptyRoot = Buffer.alloc(32),
|
|
34
|
+
): Buffer {
|
|
35
|
+
if (!leaves.length) {
|
|
36
|
+
return emptyRoot;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (leaves.length === 1) {
|
|
40
|
+
return leaves[0];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let numRemainingLeaves = leaves.length;
|
|
44
|
+
let subtreeSize = 1;
|
|
45
|
+
let root: Buffer | undefined;
|
|
46
|
+
while (numRemainingLeaves > 1) {
|
|
47
|
+
if ((numRemainingLeaves & subtreeSize) !== 0) {
|
|
48
|
+
const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
|
|
49
|
+
const subtreeRoot = computeBalancedMerkleTreeRoot(subtreeLeaves, hasher);
|
|
50
|
+
if (!root) {
|
|
51
|
+
root = subtreeRoot;
|
|
52
|
+
} else {
|
|
53
|
+
root = hasher(subtreeRoot, root);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
numRemainingLeaves -= subtreeSize;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
subtreeSize *= 2;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return root!;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function computeUnbalancedMerkleTreeRootAsync(
|
|
66
|
+
leaves: Buffer[],
|
|
67
|
+
hasher: (left: Uint8Array, right: Uint8Array) => Promise<Buffer<ArrayBuffer>>,
|
|
68
|
+
emptyRoot = Buffer.alloc(32),
|
|
69
|
+
): Promise<Buffer> {
|
|
70
|
+
if (!leaves.length) {
|
|
71
|
+
return emptyRoot;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (leaves.length === 1) {
|
|
75
|
+
return leaves[0];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
let numRemainingLeaves = leaves.length;
|
|
79
|
+
let subtreeSize = 1;
|
|
80
|
+
let root: Buffer | undefined;
|
|
81
|
+
while (numRemainingLeaves > 1) {
|
|
82
|
+
if ((numRemainingLeaves & subtreeSize) !== 0) {
|
|
83
|
+
const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
|
|
84
|
+
const subtreeRoot = await computeBalancedMerkleTreeRootAsync(subtreeLeaves, hasher);
|
|
85
|
+
if (!root) {
|
|
86
|
+
root = subtreeRoot;
|
|
87
|
+
} else {
|
|
88
|
+
root = await hasher(subtreeRoot, root);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
numRemainingLeaves -= subtreeSize;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
subtreeSize *= 2;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return root!;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// A **wonky** tree is a "compressed" unbalanced Merkle tree.
|
|
101
|
+
// It is constructed in the same way as an unbalanced tree: by first creating the largest possible left subtree, with
|
|
102
|
+
// the remaining leaves forming a right subtree that follows the same process recursively.
|
|
103
|
+
// During construction, leaves equal to `valueToCompress` are skipped (compressed) and do not contribute to the tree.
|
|
104
|
+
export function computeWonkyMerkleTreeRoot(
|
|
105
|
+
leaves: Buffer[],
|
|
106
|
+
valueToCompress = Buffer.alloc(32),
|
|
107
|
+
emptyRoot = Buffer.alloc(32),
|
|
108
|
+
hasher = shaMerkleHash,
|
|
109
|
+
): Buffer {
|
|
110
|
+
const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, emptyRoot, hasher);
|
|
111
|
+
return calculator.getRoot();
|
|
112
|
+
}
|