@aztec/foundation 0.0.1-commit.b655e406 → 0.0.1-commit.fce3e4f
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 +1 -9
- package/dest/array/array.d.ts.map +1 -1
- package/dest/array/array.js +0 -11
- package/dest/array/index.d.ts +1 -1
- package/dest/async-map/index.d.ts +1 -1
- package/dest/async-pool/index.d.ts +1 -1
- package/dest/bigint/index.d.ts +1 -1
- package/dest/bigint-buffer/index.d.ts +1 -1
- 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 +4 -0
- package/dest/branded-types/index.d.ts.map +1 -0
- package/dest/branded-types/index.js +2 -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 +1 -4
- package/dest/buffer/buffer16.d.ts.map +1 -1
- package/dest/buffer/buffer32.d.ts +1 -4
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/index.d.ts +1 -1
- package/dest/collection/array.d.ts +1 -1
- package/dest/collection/index.d.ts +1 -1
- package/dest/collection/object.d.ts +1 -1
- 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 +1 -1
- package/dest/config/network_config.d.ts +1 -1
- package/dest/config/network_name.d.ts +1 -1
- package/dest/config/secret_value.d.ts +1 -1
- package/dest/config/secret_value.d.ts.map +1 -1
- package/dest/crypto/aes128/index.d.ts +1 -1
- package/dest/crypto/aes128/index.d.ts.map +1 -1
- package/dest/crypto/aes128/index.js +2 -6
- package/dest/crypto/bls/bn254_keystore.d.ts +15 -15
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
- package/dest/crypto/bls/index.d.ts +1 -1
- package/dest/crypto/bn254/bn254_utils.d.ts +1 -1
- package/dest/crypto/bn254/index.d.ts +1 -1
- package/dest/crypto/bn254/index.d.ts.map +1 -1
- package/dest/crypto/bn254/index.js +3 -0
- package/dest/crypto/ecdsa/index.d.ts +1 -1
- package/dest/crypto/ecdsa/index.d.ts.map +1 -1
- package/dest/crypto/ecdsa/index.js +4 -12
- package/dest/crypto/ecdsa/signature.d.ts +1 -10
- package/dest/crypto/ecdsa/signature.d.ts.map +1 -1
- package/dest/crypto/grumpkin/index.d.ts +1 -1
- package/dest/crypto/grumpkin/index.d.ts.map +1 -1
- package/dest/crypto/grumpkin/index.js +5 -15
- package/dest/crypto/index.d.ts +1 -1
- package/dest/crypto/keccak/index.d.ts +1 -1
- package/dest/crypto/keys/index.d.ts +1 -1
- package/dest/crypto/keys/index.js +1 -3
- package/dest/crypto/pedersen/index.d.ts +1 -1
- package/dest/crypto/pedersen/pedersen.noble.d.ts +1 -1
- package/dest/crypto/pedersen/pedersen.wasm.d.ts +1 -1
- package/dest/crypto/pedersen/pedersen.wasm.js +3 -9
- package/dest/crypto/poseidon/index.d.ts +1 -1
- package/dest/crypto/poseidon/index.js +5 -15
- package/dest/crypto/random/index.d.ts +1 -1
- package/dest/crypto/random/index.d.ts.map +1 -1
- package/dest/crypto/random/randomness_singleton.d.ts +1 -1
- package/dest/crypto/random/randomness_singleton.d.ts.map +1 -1
- package/dest/crypto/schnorr/index.d.ts +1 -1
- package/dest/crypto/schnorr/index.d.ts.map +1 -1
- package/dest/crypto/schnorr/index.js +3 -9
- package/dest/crypto/schnorr/signature.d.ts +1 -1
- package/dest/crypto/schnorr/signature.d.ts.map +1 -1
- package/dest/crypto/secp256k1/index.d.ts +1 -1
- package/dest/crypto/secp256k1/index.d.ts.map +1 -1
- package/dest/crypto/secp256k1/index.js +3 -9
- 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 +1 -1
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
- package/dest/crypto/serialize.d.ts +1 -1
- package/dest/crypto/sha256/index.d.ts +1 -1
- package/dest/crypto/sha256/index.d.ts.map +1 -1
- package/dest/crypto/sha512/index.d.ts +2 -2
- package/dest/crypto/sha512/index.d.ts.map +1 -1
- package/dest/crypto/signature/index.d.ts +1 -1
- package/dest/crypto/sync/index.d.ts +1 -1
- package/dest/crypto/sync/index.js +1 -3
- package/dest/crypto/sync/pedersen/index.d.ts +1 -1
- package/dest/crypto/sync/poseidon/index.d.ts +1 -1
- 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 +4 -4
- package/dest/error/index.d.ts.map +1 -1
- package/dest/eth-address/index.d.ts +10 -1
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +17 -0
- package/dest/eth-signature/eth_signature.d.ts +1 -4
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/eth-signature/index.d.ts +1 -1
- package/dest/fields/bls12_fields.d.ts +1 -1
- package/dest/fields/bls12_fields.d.ts.map +1 -1
- package/dest/fields/bls12_point.d.ts +1 -10
- package/dest/fields/bls12_point.d.ts.map +1 -1
- package/dest/fields/coordinate.d.ts +1 -4
- package/dest/fields/coordinate.d.ts.map +1 -1
- package/dest/fields/fields.d.ts +10 -1
- package/dest/fields/fields.d.ts.map +1 -1
- package/dest/fields/fields.js +14 -0
- package/dest/fields/index.d.ts +1 -1
- package/dest/fields/point.d.ts +11 -11
- package/dest/fields/point.d.ts.map +1 -1
- package/dest/fields/point.js +17 -0
- package/dest/fs/index.d.ts +1 -1
- package/dest/fs/run_in_dir.d.ts +1 -1
- package/dest/fs/try_rm_dir.d.ts +1 -1
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/iterable/all.d.ts +1 -1
- package/dest/iterable/filter.d.ts +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/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/json-rpc/client/fetch.d.ts +1 -1
- package/dest/json-rpc/client/index.d.ts +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +1 -1
- package/dest/json-rpc/client/undici.d.ts +1 -1
- package/dest/json-rpc/convert.d.ts +1 -1
- package/dest/json-rpc/errors.d.ts +1 -1
- package/dest/json-rpc/errors.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/class_a.d.ts +3 -3
- package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/class_b.d.ts +3 -3
- 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 +1 -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 +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
- package/dest/json-rpc/server/telemetry.d.ts +1 -1
- package/dest/json-rpc/test/index.d.ts +1 -1
- package/dest/json-rpc/test/integration.d.ts +1 -1
- package/dest/log/console.d.ts +1 -1
- package/dest/log/gcloud-logger-config.d.ts +1 -1
- package/dest/log/gcloud-logger-config.d.ts.map +1 -1
- package/dest/log/index.d.ts +1 -1
- package/dest/log/libp2p_logger.d.ts +1 -1
- 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 +1 -1
- package/dest/log/noir_debug_log_util.d.ts +1 -1
- package/dest/log/pino-logger.d.ts +2 -2
- 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/noir/index.d.ts +1 -1
- package/dest/noir/noir_package_config.d.ts +9 -9
- package/dest/number/index.d.ts +1 -1
- package/dest/profiler/index.d.ts +1 -1
- package/dest/profiler/profiler.d.ts +1 -1
- package/dest/promise/index.d.ts +1 -1
- package/dest/promise/running-promise.d.ts +1 -1
- package/dest/promise/running-promise.d.ts.map +1 -1
- 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 +1 -1
- package/dest/queue/batch_queue.d.ts.map +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 +1 -1
- package/dest/queue/serial_queue.d.ts.map +1 -1
- package/dest/retry/index.d.ts +1 -1
- package/dest/running-promise/index.d.ts +1 -1
- package/dest/schemas/api.d.ts +1 -1
- package/dest/schemas/index.d.ts +1 -1
- package/dest/schemas/parse.d.ts +1 -1
- package/dest/schemas/schemas.d.ts +9 -15
- package/dest/schemas/schemas.d.ts.map +1 -1
- package/dest/schemas/schemas.js +5 -7
- package/dest/schemas/types.d.ts +1 -1
- package/dest/schemas/utils.d.ts +4 -4
- package/dest/schemas/utils.d.ts.map +1 -1
- package/dest/schemas/utils.js +15 -5
- package/dest/serialize/buffer_reader.d.ts +1 -1
- package/dest/serialize/buffer_reader.d.ts.map +1 -1
- package/dest/serialize/field_reader.d.ts +1 -1
- package/dest/serialize/field_reader.d.ts.map +1 -1
- package/dest/serialize/free_funcs.d.ts +1 -1
- package/dest/serialize/index.d.ts +1 -1
- package/dest/serialize/serialize.d.ts +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 +1 -1
- package/dest/sleep/index.d.ts.map +1 -1
- package/dest/string/index.d.ts +1 -1
- package/dest/testing/files/index.d.ts +2 -1
- package/dest/testing/files/index.d.ts.map +1 -1
- package/dest/testing/files/index.js +1 -1
- package/dest/testing/formatting.d.ts +1 -1
- package/dest/testing/index.d.ts +1 -1
- 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 +1 -1
- package/dest/timer/date.d.ts.map +1 -1
- package/dest/timer/elapsed.d.ts +1 -1
- package/dest/timer/index.d.ts +1 -1
- package/dest/timer/timeout.d.ts +1 -1
- package/dest/timer/timeout.d.ts.map +1 -1
- 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 -1
- package/dest/transport/interface/connector.d.ts +1 -1
- package/dest/transport/interface/listener.d.ts +1 -1
- package/dest/transport/interface/socket.d.ts +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 -1
- package/dest/transport/node/node_connector.d.ts.map +1 -1
- package/dest/transport/node/node_connector_socket.d.ts +1 -1
- package/dest/transport/node/node_connector_socket.d.ts.map +1 -1
- package/dest/transport/node/node_listener.d.ts +1 -1
- package/dest/transport/node/node_listener.d.ts.map +1 -1
- package/dest/transport/node/node_listener_socket.d.ts +1 -1
- package/dest/transport/node/node_listener_socket.d.ts.map +1 -1
- package/dest/transport/transport_client.d.ts +1 -1
- 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.d.ts +22 -0
- package/dest/trees/balanced_merkle_tree.d.ts.map +1 -0
- package/dest/trees/balanced_merkle_tree.js +64 -0
- package/dest/trees/hasher.d.ts +1 -1
- package/dest/trees/index.d.ts +2 -1
- package/dest/trees/index.d.ts.map +1 -1
- package/dest/trees/index.js +1 -0
- package/dest/trees/indexed_merkle_tree.d.ts +1 -1
- package/dest/trees/indexed_merkle_tree.d.ts.map +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/indexed_tree_leaf.d.ts +1 -1
- package/dest/trees/membership_witness.d.ts +2 -23
- package/dest/trees/membership_witness.d.ts.map +1 -1
- package/dest/trees/merkle_tree.d.ts +1 -1
- package/dest/trees/merkle_tree.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.d.ts +2 -12
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.js +1 -31
- package/dest/trees/sibling_path.d.ts +4 -38
- package/dest/trees/sibling_path.d.ts.map +1 -1
- package/dest/trees/unbalanced_merkle_tree.d.ts +5 -3
- package/dest/trees/unbalanced_merkle_tree.d.ts.map +1 -1
- package/dest/trees/unbalanced_merkle_tree.js +32 -9
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts +6 -5
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/unbalanced_merkle_tree_calculator.js +36 -40
- package/dest/trees/unbalanced_tree_store.d.ts +1 -1
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -1
- package/dest/types/index.d.ts +1 -1
- package/dest/url/index.d.ts +1 -1
- package/dest/validation/index.d.ts +1 -1
- package/package.json +7 -5
- package/src/array/array.ts +0 -16
- package/src/branded-types/epoch.ts +88 -0
- package/src/branded-types/index.ts +4 -0
- package/src/branded-types/slot.ts +88 -0
- package/src/branded-types/types.ts +2 -0
- package/src/config/env_var.ts +12 -2
- package/src/crypto/aes128/index.ts +2 -2
- package/src/crypto/bn254/index.ts +3 -0
- package/src/crypto/ecdsa/index.ts +4 -4
- package/src/crypto/grumpkin/index.ts +5 -5
- package/src/crypto/keys/index.ts +1 -1
- package/src/crypto/pedersen/pedersen.wasm.ts +3 -3
- package/src/crypto/poseidon/index.ts +5 -5
- package/src/crypto/schnorr/index.ts +3 -3
- package/src/crypto/secp256k1/index.ts +3 -3
- package/src/crypto/sync/index.ts +1 -1
- package/src/eth-address/index.ts +19 -0
- package/src/fields/fields.ts +16 -0
- package/src/fields/point.ts +19 -0
- package/src/index.ts +1 -0
- package/src/schemas/schemas.ts +10 -10
- package/src/schemas/utils.ts +21 -8
- package/src/testing/files/index.ts +1 -1
- package/src/trees/balanced_merkle_tree.ts +82 -0
- package/src/trees/index.ts +1 -0
- package/src/trees/merkle_tree_calculator.ts +1 -34
- package/src/trees/unbalanced_merkle_tree.ts +54 -6
- package/src/trees/unbalanced_merkle_tree_calculator.ts +34 -41
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
computeBalancedMerkleTreeRoot,
|
|
3
|
+
computeBalancedMerkleTreeRootAsync,
|
|
4
|
+
poseidonMerkleHash,
|
|
5
|
+
shaMerkleHash,
|
|
6
|
+
} from './balanced_merkle_tree.js';
|
|
7
|
+
|
|
8
|
+
export const computeUnbalancedShaRoot = (leaves: Buffer[]) => computeUnbalancedMerkleTreeRoot(leaves, shaMerkleHash);
|
|
9
|
+
|
|
10
|
+
export const computeUnbalancedPoseidonRoot = async (leaves: Buffer[]) =>
|
|
11
|
+
await computeUnbalancedMerkleTreeRootAsync(leaves, poseidonMerkleHash);
|
|
3
12
|
|
|
4
13
|
/**
|
|
5
14
|
* Computes the Merkle root of an unbalanced tree.
|
|
@@ -22,9 +31,48 @@ import { MerkleTreeCalculator } from './merkle_tree_calculator.js';
|
|
|
22
31
|
* But if we instead combine the size-4 and size-8 subtrees first (depth 4), and then merge with the size-2 subtree
|
|
23
32
|
* (depth 1), the final tree has a depth of 5.
|
|
24
33
|
*/
|
|
25
|
-
export function computeUnbalancedMerkleTreeRoot(
|
|
34
|
+
export function computeUnbalancedMerkleTreeRoot(
|
|
35
|
+
leaves: Buffer[],
|
|
36
|
+
hasher = shaMerkleHash,
|
|
37
|
+
emptyRoot = Buffer.alloc(32),
|
|
38
|
+
): Buffer {
|
|
39
|
+
if (!leaves.length) {
|
|
40
|
+
return emptyRoot;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (leaves.length === 1) {
|
|
44
|
+
return leaves[0];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let numRemainingLeaves = leaves.length;
|
|
48
|
+
let subtreeSize = 1;
|
|
49
|
+
let root: Buffer | undefined;
|
|
50
|
+
while (numRemainingLeaves > 1) {
|
|
51
|
+
if ((numRemainingLeaves & subtreeSize) !== 0) {
|
|
52
|
+
const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
|
|
53
|
+
const subtreeRoot = computeBalancedMerkleTreeRoot(subtreeLeaves, hasher);
|
|
54
|
+
if (!root) {
|
|
55
|
+
root = subtreeRoot;
|
|
56
|
+
} else {
|
|
57
|
+
root = hasher(subtreeRoot, root);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
numRemainingLeaves -= subtreeSize;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
subtreeSize *= 2;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return root!;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export async function computeUnbalancedMerkleTreeRootAsync(
|
|
70
|
+
leaves: Buffer[],
|
|
71
|
+
hasher = poseidonMerkleHash,
|
|
72
|
+
emptyRoot = Buffer.alloc(32),
|
|
73
|
+
): Promise<Buffer> {
|
|
26
74
|
if (!leaves.length) {
|
|
27
|
-
|
|
75
|
+
return emptyRoot;
|
|
28
76
|
}
|
|
29
77
|
|
|
30
78
|
if (leaves.length === 1) {
|
|
@@ -37,11 +85,11 @@ export function computeUnbalancedMerkleTreeRoot(leaves: Buffer[], hasher = sha25
|
|
|
37
85
|
while (numRemainingLeaves > 1) {
|
|
38
86
|
if ((numRemainingLeaves & subtreeSize) !== 0) {
|
|
39
87
|
const subtreeLeaves = leaves.slice(numRemainingLeaves - subtreeSize, numRemainingLeaves);
|
|
40
|
-
const subtreeRoot =
|
|
88
|
+
const subtreeRoot = await computeBalancedMerkleTreeRootAsync(subtreeLeaves, hasher);
|
|
41
89
|
if (!root) {
|
|
42
90
|
root = subtreeRoot;
|
|
43
91
|
} else {
|
|
44
|
-
root = hasher(
|
|
92
|
+
root = await hasher(subtreeRoot, root);
|
|
45
93
|
}
|
|
46
94
|
|
|
47
95
|
numRemainingLeaves -= subtreeSize;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { shaMerkleHash } from './balanced_merkle_tree.js';
|
|
2
2
|
import type { Hasher } from './hasher.js';
|
|
3
3
|
import { SiblingPath } from './sibling_path.js';
|
|
4
4
|
import { type TreeNodeLocation, UnbalancedTreeStore } from './unbalanced_tree_store.js';
|
|
@@ -6,9 +6,10 @@ import { type TreeNodeLocation, UnbalancedTreeStore } from './unbalanced_tree_st
|
|
|
6
6
|
export function computeCompressedUnbalancedMerkleTreeRoot(
|
|
7
7
|
leaves: Buffer[],
|
|
8
8
|
valueToCompress = Buffer.alloc(32),
|
|
9
|
+
emptyRoot = Buffer.alloc(32),
|
|
9
10
|
hasher?: Hasher['hash'],
|
|
10
11
|
): Buffer {
|
|
11
|
-
const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, hasher);
|
|
12
|
+
const calculator = UnbalancedMerkleTreeCalculator.create(leaves, valueToCompress, emptyRoot, hasher);
|
|
12
13
|
return calculator.getRoot();
|
|
13
14
|
}
|
|
14
15
|
|
|
@@ -32,12 +33,9 @@ export class UnbalancedMerkleTreeCalculator {
|
|
|
32
33
|
public constructor(
|
|
33
34
|
private readonly leaves: Buffer[],
|
|
34
35
|
private readonly valueToCompress: Buffer,
|
|
36
|
+
private readonly emptyRoot: Buffer,
|
|
35
37
|
private readonly hasher: Hasher['hash'],
|
|
36
38
|
) {
|
|
37
|
-
if (leaves.length === 0) {
|
|
38
|
-
throw Error('Cannot create a compressed unbalanced tree with 0 leaves.');
|
|
39
|
-
}
|
|
40
|
-
|
|
41
39
|
this.store = new UnbalancedTreeStore(leaves.length);
|
|
42
40
|
this.buildTree();
|
|
43
41
|
}
|
|
@@ -45,9 +43,10 @@ export class UnbalancedMerkleTreeCalculator {
|
|
|
45
43
|
static create(
|
|
46
44
|
leaves: Buffer[],
|
|
47
45
|
valueToCompress = Buffer.alloc(0),
|
|
48
|
-
|
|
46
|
+
emptyRoot = Buffer.alloc(32),
|
|
47
|
+
hasher = shaMerkleHash,
|
|
49
48
|
) {
|
|
50
|
-
return new UnbalancedMerkleTreeCalculator(leaves, valueToCompress, hasher);
|
|
49
|
+
return new UnbalancedMerkleTreeCalculator(leaves, valueToCompress, emptyRoot, hasher);
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
/**
|
|
@@ -113,8 +112,8 @@ export class UnbalancedMerkleTreeCalculator {
|
|
|
113
112
|
// Start with the leaves that are not compressed.
|
|
114
113
|
let toProcess = this.leafLocations.filter((_, i) => !this.leaves[i].equals(this.valueToCompress));
|
|
115
114
|
if (!toProcess.length) {
|
|
116
|
-
// All leaves are compressed. Set
|
|
117
|
-
this.store.setNode({ level: 0, index: 0 }, { value:
|
|
115
|
+
// All leaves are compressed. Set empty root to the root.
|
|
116
|
+
this.store.setNode({ level: 0, index: 0 }, { value: this.emptyRoot });
|
|
118
117
|
return;
|
|
119
118
|
}
|
|
120
119
|
|
|
@@ -138,10 +137,7 @@ export class UnbalancedMerkleTreeCalculator {
|
|
|
138
137
|
const shouldShiftUp = !sibling || sibling.value.equals(this.valueToCompress);
|
|
139
138
|
if (shouldShiftUp) {
|
|
140
139
|
// The node becomes the parent if the sibling is a compressed leaf.
|
|
141
|
-
|
|
142
|
-
if (!isLeaf) {
|
|
143
|
-
this.shiftChildrenUp(location);
|
|
144
|
-
}
|
|
140
|
+
this.shiftNodeUp(location, parentLocation);
|
|
145
141
|
} else {
|
|
146
142
|
// Hash the value with the (right) sibling and update the parent node.
|
|
147
143
|
const node = this.store.getNode(location)!;
|
|
@@ -157,38 +153,35 @@ export class UnbalancedMerkleTreeCalculator {
|
|
|
157
153
|
}
|
|
158
154
|
}
|
|
159
155
|
|
|
160
|
-
private shiftNodeUp(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
156
|
+
private shiftNodeUp(from: TreeNodeLocation, to: TreeNodeLocation) {
|
|
157
|
+
// Collect all nodes that need to shift.
|
|
158
|
+
const nodesToShift = this.collectNodesToShift(from, to);
|
|
159
|
+
// Move all nodes to their new locations.
|
|
160
|
+
for (const { node, newLocation } of nodesToShift) {
|
|
161
|
+
this.store.setNode(newLocation, node);
|
|
162
|
+
if (node.leafIndex !== undefined) {
|
|
163
|
+
this.leafLocations[node.leafIndex] = newLocation;
|
|
164
|
+
}
|
|
169
165
|
}
|
|
170
|
-
|
|
171
|
-
return isLeaf;
|
|
172
166
|
}
|
|
173
167
|
|
|
174
|
-
private
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const computeNewLocation = (index: number) => ({
|
|
180
|
-
level,
|
|
181
|
-
index: Math.floor(index / (groupSize * 2)) * groupSize + (index % groupSize),
|
|
182
|
-
});
|
|
168
|
+
private collectNodesToShift(from: TreeNodeLocation, to: TreeNodeLocation) {
|
|
169
|
+
const node = this.store.getNode(from);
|
|
170
|
+
if (!node) {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
183
173
|
|
|
184
|
-
|
|
185
|
-
const isRightLeaf = this.shiftNodeUp(right, computeNewLocation(right.index));
|
|
174
|
+
let result = [{ node, newLocation: to }];
|
|
186
175
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
176
|
+
// If not a leaf, collect its children.
|
|
177
|
+
if (node.leafIndex === undefined) {
|
|
178
|
+
const [leftChild, rightChild] = this.store.getChildLocations(from);
|
|
179
|
+
const [leftChildNew, rightChildNew] = this.store.getChildLocations(to);
|
|
180
|
+
result = result
|
|
181
|
+
.concat(this.collectNodesToShift(leftChild, leftChildNew))
|
|
182
|
+
.concat(this.collectNodesToShift(rightChild, rightChildNew));
|
|
192
183
|
}
|
|
184
|
+
|
|
185
|
+
return result;
|
|
193
186
|
}
|
|
194
187
|
}
|