@proto-kit/common 0.1.1-develop.165 → 0.1.1-develop.1661
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/dist/compiling/AtomicCompileHelper.d.ts +13 -0
- package/dist/compiling/AtomicCompileHelper.d.ts.map +1 -0
- package/dist/compiling/AtomicCompileHelper.js +40 -0
- package/dist/compiling/AtomicCompileHelper.js.map +1 -0
- package/dist/compiling/CompilableModule.d.ts +6 -0
- package/dist/compiling/CompilableModule.d.ts.map +1 -0
- package/dist/compiling/CompilableModule.js +2 -0
- package/dist/compiling/CompilableModule.js.map +1 -0
- package/dist/compiling/CompileRegistry.d.ts +26 -0
- package/dist/compiling/CompileRegistry.d.ts.map +1 -0
- package/dist/compiling/CompileRegistry.js +69 -0
- package/dist/compiling/CompileRegistry.js.map +1 -0
- package/dist/compiling/services/ChildVerificationKeyService.d.ts +10 -0
- package/dist/compiling/services/ChildVerificationKeyService.d.ts.map +1 -0
- package/dist/compiling/services/ChildVerificationKeyService.js +27 -0
- package/dist/compiling/services/ChildVerificationKeyService.js.map +1 -0
- package/dist/config/ChildContainerCreatable.d.ts +5 -0
- package/dist/config/ChildContainerCreatable.d.ts.map +1 -0
- package/dist/config/ChildContainerCreatable.js +2 -0
- package/dist/config/ChildContainerCreatable.js.map +1 -0
- package/dist/config/ChildContainerProvider.d.ts +5 -0
- package/dist/config/ChildContainerProvider.d.ts.map +1 -0
- package/dist/config/ChildContainerProvider.js +2 -0
- package/dist/config/ChildContainerProvider.js.map +1 -0
- package/dist/config/ConfigurableModule.d.ts +6 -2
- package/dist/config/ConfigurableModule.d.ts.map +1 -1
- package/dist/config/ConfigurableModule.js +5 -0
- package/dist/config/ConfigurableModule.js.map +1 -0
- package/dist/config/ModuleContainer.d.ts +70 -17
- package/dist/config/ModuleContainer.d.ts.map +1 -1
- package/dist/config/ModuleContainer.js +164 -22
- package/dist/config/ModuleContainer.js.map +1 -0
- package/dist/config/Startable.d.ts +4 -0
- package/dist/config/Startable.d.ts.map +1 -0
- package/dist/config/Startable.js +2 -0
- package/dist/config/Startable.js.map +1 -0
- package/dist/config/injectAlias.d.ts +18 -0
- package/dist/config/injectAlias.d.ts.map +1 -0
- package/dist/config/injectAlias.js +47 -0
- package/dist/config/injectAlias.js.map +1 -0
- package/dist/dependencyFactory/DependencyFactory.d.ts +29 -0
- package/dist/dependencyFactory/DependencyFactory.d.ts.map +1 -0
- package/dist/dependencyFactory/DependencyFactory.js +2 -0
- package/dist/dependencyFactory/DependencyFactory.js.map +1 -0
- package/dist/dependencyFactory/injectOptional.d.ts +16 -0
- package/dist/dependencyFactory/injectOptional.d.ts.map +1 -0
- package/dist/dependencyFactory/injectOptional.js +40 -0
- package/dist/dependencyFactory/injectOptional.js.map +1 -0
- package/dist/dummyVerificationKey.d.ts +3 -0
- package/dist/dummyVerificationKey.d.ts.map +1 -0
- package/dist/dummyVerificationKey.js +8 -0
- package/dist/dummyVerificationKey.js.map +1 -0
- package/dist/events/EventEmitter.d.ts +19 -0
- package/dist/events/EventEmitter.d.ts.map +1 -0
- package/dist/events/EventEmitter.js +35 -0
- package/dist/events/EventEmitter.js.map +1 -0
- package/dist/events/EventEmitterProxy.d.ts +18 -0
- package/dist/events/EventEmitterProxy.d.ts.map +1 -0
- package/dist/events/EventEmitterProxy.js +35 -0
- package/dist/events/EventEmitterProxy.js.map +1 -0
- package/dist/events/EventEmittingComponent.d.ts +9 -0
- package/dist/events/EventEmittingComponent.d.ts.map +1 -0
- package/dist/events/EventEmittingComponent.js +2 -0
- package/dist/events/EventEmittingComponent.js.map +1 -0
- package/dist/events/ReplayingSingleUseEventEmitter.d.ts +17 -0
- package/dist/events/ReplayingSingleUseEventEmitter.d.ts.map +1 -0
- package/dist/events/ReplayingSingleUseEventEmitter.js +34 -0
- package/dist/events/ReplayingSingleUseEventEmitter.js.map +1 -0
- package/dist/index.d.ts +24 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -2
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts +37 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +114 -0
- package/dist/log.js.map +1 -0
- package/dist/trees/InMemoryLinkedLeafStore.d.ts +21 -0
- package/dist/trees/InMemoryLinkedLeafStore.d.ts.map +1 -0
- package/dist/trees/InMemoryLinkedLeafStore.js +26 -0
- package/dist/trees/InMemoryLinkedLeafStore.js.map +1 -0
- package/dist/trees/InMemoryLinkedMerkleLeafStore.d.ts +7 -0
- package/dist/trees/InMemoryLinkedMerkleLeafStore.d.ts.map +1 -0
- package/dist/trees/InMemoryLinkedMerkleLeafStore.js +6 -0
- package/dist/trees/InMemoryLinkedMerkleLeafStore.js.map +1 -0
- package/dist/trees/InMemoryMerkleTreeStorage.d.ts +11 -0
- package/dist/trees/InMemoryMerkleTreeStorage.d.ts.map +1 -0
- package/dist/trees/InMemoryMerkleTreeStorage.js +13 -0
- package/dist/trees/InMemoryMerkleTreeStorage.js.map +1 -0
- package/dist/trees/LinkedMerkleTree.d.ts +345 -0
- package/dist/trees/LinkedMerkleTree.d.ts.map +1 -0
- package/dist/trees/LinkedMerkleTree.js +337 -0
- package/dist/trees/LinkedMerkleTree.js.map +1 -0
- package/dist/trees/LinkedMerkleTreeStore.d.ts +24 -0
- package/dist/trees/LinkedMerkleTreeStore.d.ts.map +1 -0
- package/dist/trees/LinkedMerkleTreeStore.js +2 -0
- package/dist/trees/LinkedMerkleTreeStore.js.map +1 -0
- package/dist/trees/MerkleTreeStore.d.ts +5 -0
- package/dist/trees/MerkleTreeStore.d.ts.map +1 -0
- package/dist/trees/MerkleTreeStore.js +2 -0
- package/dist/trees/MerkleTreeStore.js.map +1 -0
- package/dist/trees/MockAsyncMerkleStore.d.ts +9 -0
- package/dist/trees/MockAsyncMerkleStore.d.ts.map +1 -0
- package/dist/trees/MockAsyncMerkleStore.js +20 -0
- package/dist/trees/MockAsyncMerkleStore.js.map +1 -0
- package/dist/trees/RollupMerkleTree.d.ts +147 -0
- package/dist/trees/RollupMerkleTree.d.ts.map +1 -0
- package/dist/trees/RollupMerkleTree.js +218 -0
- package/dist/trees/RollupMerkleTree.js.map +1 -0
- package/dist/trees/VirtualMerkleTreeStore.d.ts +13 -0
- package/dist/trees/VirtualMerkleTreeStore.d.ts.map +1 -0
- package/dist/trees/VirtualMerkleTreeStore.js +18 -0
- package/dist/trees/VirtualMerkleTreeStore.js.map +1 -0
- package/dist/trees/lmt/AbstractLinkedMerkleTree.d.ts +288 -0
- package/dist/trees/lmt/AbstractLinkedMerkleTree.d.ts.map +1 -0
- package/dist/trees/lmt/AbstractLinkedMerkleTree.js +22 -0
- package/dist/trees/lmt/AbstractLinkedMerkleTree.js.map +1 -0
- package/dist/trees/lmt/InMemoryLinkedLeafStore.d.ts +21 -0
- package/dist/trees/lmt/InMemoryLinkedLeafStore.d.ts.map +1 -0
- package/dist/trees/lmt/InMemoryLinkedLeafStore.js +26 -0
- package/dist/trees/lmt/InMemoryLinkedLeafStore.js.map +1 -0
- package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.d.ts +7 -0
- package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.d.ts.map +1 -0
- package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.js +6 -0
- package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.js.map +1 -0
- package/dist/trees/lmt/LinkedLeafStore.d.ts +16 -0
- package/dist/trees/lmt/LinkedLeafStore.d.ts.map +1 -0
- package/dist/trees/lmt/LinkedLeafStore.js +2 -0
- package/dist/trees/lmt/LinkedLeafStore.js.map +1 -0
- package/dist/trees/lmt/LinkedLinkedStore.d.ts +16 -0
- package/dist/trees/lmt/LinkedLinkedStore.d.ts.map +1 -0
- package/dist/trees/lmt/LinkedLinkedStore.js +2 -0
- package/dist/trees/lmt/LinkedLinkedStore.js.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTree.d.ts +11 -0
- package/dist/trees/lmt/LinkedMerkleTree.d.ts.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTree.js +241 -0
- package/dist/trees/lmt/LinkedMerkleTree.js.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.d.ts +113 -0
- package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.d.ts.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.js +113 -0
- package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.js.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeDatabase.d.ts +7 -0
- package/dist/trees/lmt/LinkedMerkleTreeDatabase.d.ts.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeDatabase.js +2 -0
- package/dist/trees/lmt/LinkedMerkleTreeDatabase.js.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeStore.d.ts +16 -0
- package/dist/trees/lmt/LinkedMerkleTreeStore.d.ts.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeStore.js +2 -0
- package/dist/trees/lmt/LinkedMerkleTreeStore.js.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeTypes.d.ts +74 -0
- package/dist/trees/lmt/LinkedMerkleTreeTypes.d.ts.map +1 -0
- package/dist/trees/lmt/LinkedMerkleTreeTypes.js +50 -0
- package/dist/trees/lmt/LinkedMerkleTreeTypes.js.map +1 -0
- package/dist/trees/sparse/InMemoryMerkleTreeStorage.d.ts +11 -0
- package/dist/trees/sparse/InMemoryMerkleTreeStorage.d.ts.map +1 -0
- package/dist/trees/sparse/InMemoryMerkleTreeStorage.js +13 -0
- package/dist/trees/sparse/InMemoryMerkleTreeStorage.js.map +1 -0
- package/dist/trees/sparse/MerkleTreeStore.d.ts +5 -0
- package/dist/trees/sparse/MerkleTreeStore.d.ts.map +1 -0
- package/dist/trees/sparse/MerkleTreeStore.js +2 -0
- package/dist/trees/sparse/MerkleTreeStore.js.map +1 -0
- package/dist/trees/sparse/MockAsyncMerkleStore.d.ts +9 -0
- package/dist/trees/sparse/MockAsyncMerkleStore.d.ts.map +1 -0
- package/dist/trees/sparse/MockAsyncMerkleStore.js +20 -0
- package/dist/trees/sparse/MockAsyncMerkleStore.js.map +1 -0
- package/dist/trees/sparse/RollupMerkleTree.d.ts +157 -0
- package/dist/trees/sparse/RollupMerkleTree.d.ts.map +1 -0
- package/dist/trees/sparse/RollupMerkleTree.js +272 -0
- package/dist/trees/sparse/RollupMerkleTree.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -1
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +62 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +155 -0
- package/dist/utils.js.map +1 -0
- package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts +4 -3
- package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts.map +1 -1
- package/dist/zkProgrammable/ProvableMethodExecutionContext.js +2 -3
- package/dist/zkProgrammable/ProvableMethodExecutionContext.js.map +1 -0
- package/dist/zkProgrammable/ZkProgrammable.d.ts +15 -7
- package/dist/zkProgrammable/ZkProgrammable.d.ts.map +1 -1
- package/dist/zkProgrammable/ZkProgrammable.js +34 -15
- package/dist/zkProgrammable/ZkProgrammable.js.map +1 -0
- package/dist/zkProgrammable/provableMethod.d.ts +8 -5
- package/dist/zkProgrammable/provableMethod.d.ts.map +1 -1
- package/dist/zkProgrammable/provableMethod.js +15 -13
- package/dist/zkProgrammable/provableMethod.js.map +1 -0
- package/jest.config.cjs +12 -1
- package/package.json +8 -7
- package/src/compiling/AtomicCompileHelper.ts +62 -0
- package/src/compiling/CompilableModule.ts +6 -0
- package/src/compiling/CompileRegistry.ts +79 -0
- package/src/compiling/services/ChildVerificationKeyService.ts +26 -0
- package/src/config/ChildContainerCreatable.ts +5 -0
- package/src/config/ChildContainerProvider.ts +5 -0
- package/src/config/ConfigurableModule.ts +15 -2
- package/src/config/ModuleContainer.ts +287 -46
- package/src/config/Startable.ts +3 -0
- package/src/config/injectAlias.ts +70 -0
- package/src/dependencyFactory/DependencyFactory.ts +57 -0
- package/src/dummyVerificationKey.ts +10 -0
- package/src/events/EventEmitter.ts +61 -0
- package/src/events/EventEmitterProxy.ts +81 -0
- package/src/events/EventEmittingComponent.ts +11 -0
- package/src/events/ReplayingSingleUseEventEmitter.ts +42 -0
- package/src/index.ts +24 -2
- package/src/log.ts +143 -0
- package/src/trees/lmt/AbstractLinkedMerkleTree.ts +102 -0
- package/src/trees/lmt/InMemoryLinkedLeafStore.ts +42 -0
- package/src/trees/lmt/LinkedLeafStore.ts +13 -0
- package/src/trees/lmt/LinkedMerkleTree.ts +335 -0
- package/src/trees/lmt/LinkedMerkleTreeCircuitOps.ts +188 -0
- package/src/trees/lmt/LinkedMerkleTreeTypes.ts +53 -0
- package/src/trees/sparse/InMemoryMerkleTreeStorage.ts +17 -0
- package/src/trees/sparse/MerkleTreeStore.ts +5 -0
- package/src/trees/sparse/MockAsyncMerkleStore.ts +30 -0
- package/src/trees/sparse/RollupMerkleTree.ts +427 -0
- package/src/types.ts +43 -2
- package/src/utils.ts +287 -0
- package/src/zkProgrammable/ProvableMethodExecutionContext.ts +6 -6
- package/src/zkProgrammable/ZkProgrammable.ts +61 -29
- package/src/zkProgrammable/provableMethod.ts +38 -21
- package/test/config/ContainerEvents.test.ts +65 -0
- package/test/config/ModuleContainer.test.ts +146 -15
- package/test/config/injectAlias.test.ts +28 -0
- package/test/trees/LinkedMerkleTree.test.ts +124 -0
- package/test/trees/LinkedMerkleTreeCircuitOps.test.ts +147 -0
- package/test/trees/MerkleTree.test.ts +220 -0
- package/test/tsconfig.json +5 -2
- package/test/zkProgrammable/ZkProgrammable.test.ts +135 -114
- package/tsconfig.json +1 -1
- package/dist/Constants.d.ts +0 -4
- package/dist/Constants.d.ts.map +0 -1
- package/dist/Constants.js +0 -3
- package/dist/config/ConfigurationAggregator.d.ts +0 -10
- package/dist/config/ConfigurationAggregator.d.ts.map +0 -1
- package/dist/config/ConfigurationAggregator.js +0 -35
- package/dist/config/ConfigurationReceiver.d.ts +0 -25
- package/dist/config/ConfigurationReceiver.d.ts.map +0 -1
- package/dist/config/ConfigurationReceiver.js +0 -36
- package/dist/config/types.d.ts +0 -2
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js +0 -1
- package/dist/model/MethodPublicInput.d.ts +0 -51
- package/dist/model/MethodPublicInput.d.ts.map +0 -1
- package/dist/model/MethodPublicInput.js +0 -11
- package/dist/model/Option.d.ts +0 -89
- package/dist/model/Option.d.ts.map +0 -1
- package/dist/model/Option.js +0 -86
- package/dist/model/Path.d.ts +0 -31
- package/dist/model/Path.d.ts.map +0 -1
- package/dist/model/Path.js +0 -44
- package/dist/model/StateTransition.d.ts +0 -85
- package/dist/model/StateTransition.d.ts.map +0 -1
- package/dist/model/StateTransition.js +0 -58
- package/dist/model/StateTransitionProvableBatch.d.ts +0 -56
- package/dist/model/StateTransitionProvableBatch.d.ts.map +0 -1
- package/dist/model/StateTransitionProvableBatch.js +0 -20
- package/dist/prover/block/BlockProver.d.ts +0 -199
- package/dist/prover/block/BlockProver.d.ts.map +0 -1
- package/dist/prover/block/BlockProver.js +0 -119
- package/dist/prover/block/BlockScopedModule.d.ts +0 -3
- package/dist/prover/block/BlockScopedModule.d.ts.map +0 -1
- package/dist/prover/block/BlockScopedModule.js +0 -6
- package/dist/prover/statetransition/StateTransitionProver.d.ts +0 -92
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +0 -1
- package/dist/prover/statetransition/StateTransitionProver.js +0 -127
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +0 -16
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +0 -1
- package/dist/prover/statetransition/StateTransitionWitnessProvider.js +0 -17
- package/dist/src/model/Option.d.ts +0 -158
- package/dist/src/model/Option.d.ts.map +0 -1
- package/dist/src/model/Option.js +0 -53
- package/dist/src/model/Path.d.ts +0 -35
- package/dist/src/model/Path.d.ts.map +0 -1
- package/dist/src/model/Path.js +0 -51
- package/dist/src/model/StateTransition.d.ts +0 -201
- package/dist/src/model/StateTransition.d.ts.map +0 -1
- package/dist/src/model/StateTransition.js +0 -43
- package/dist/src/utils/PrefixedHashList.d.ts +0 -15
- package/dist/src/utils/PrefixedHashList.d.ts.map +0 -1
- package/dist/src/utils/PrefixedHashList.js +0 -28
- package/dist/src/utils/ProvableHashList.d.ts +0 -30
- package/dist/src/utils/ProvableHashList.d.ts.map +0 -1
- package/dist/src/utils/ProvableHashList.js +0 -43
- package/dist/utils/PrefixedHashList.d.ts +0 -14
- package/dist/utils/PrefixedHashList.d.ts.map +0 -1
- package/dist/utils/PrefixedHashList.js +0 -12
- package/dist/utils/PrefixedProvableHashList.d.ts +0 -8
- package/dist/utils/PrefixedProvableHashList.d.ts.map +0 -1
- package/dist/utils/PrefixedProvableHashList.js +0 -12
- package/dist/utils/ProvableHashList.d.ts +0 -26
- package/dist/utils/ProvableHashList.d.ts.map +0 -1
- package/dist/utils/ProvableHashList.js +0 -35
- package/dist/utils/Utils.d.ts +0 -22
- package/dist/utils/Utils.d.ts.map +0 -1
- package/dist/utils/Utils.js +0 -41
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +0 -26
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +0 -1
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +0 -79
- package/dist/utils/merkletree/RollupMerkleTree.d.ts +0 -143
- package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +0 -1
- package/dist/utils/merkletree/RollupMerkleTree.js +0 -246
- package/tsconfig.test.json +0 -9
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { Field } from "o1js";
|
|
2
|
+
import { TypedClass } from "../types";
|
|
3
|
+
import { LinkedMerkleTreeStore } from "./LinkedMerkleTreeStore";
|
|
4
|
+
import { AbstractMerkleWitness } from "./RollupMerkleTree";
|
|
5
|
+
declare const LinkedLeafStruct_base: (new (value: {
|
|
6
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
7
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
8
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
9
|
+
}) => {
|
|
10
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
11
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
12
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
13
|
+
}) & {
|
|
14
|
+
_isStruct: true;
|
|
15
|
+
} & Omit<import("o1js/dist/node/lib/provable/types/provable-intf").Provable<{
|
|
16
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
17
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
18
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
19
|
+
}, {
|
|
20
|
+
value: bigint;
|
|
21
|
+
path: bigint;
|
|
22
|
+
nextPath: bigint;
|
|
23
|
+
}>, "fromFields"> & {
|
|
24
|
+
fromFields: (fields: import("o1js/dist/node/lib/provable/field").Field[]) => {
|
|
25
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
26
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
27
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
28
|
+
};
|
|
29
|
+
} & {
|
|
30
|
+
fromValue: (value: {
|
|
31
|
+
value: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
32
|
+
path: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
33
|
+
nextPath: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
34
|
+
}) => {
|
|
35
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
36
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
37
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
38
|
+
};
|
|
39
|
+
toInput: (x: {
|
|
40
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
41
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
42
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
43
|
+
}) => {
|
|
44
|
+
fields?: import("o1js/dist/node/lib/provable/field").Field[] | undefined;
|
|
45
|
+
packed?: [import("o1js/dist/node/lib/provable/field").Field, number][] | undefined;
|
|
46
|
+
};
|
|
47
|
+
toJSON: (x: {
|
|
48
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
49
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
50
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
51
|
+
}) => {
|
|
52
|
+
value: string;
|
|
53
|
+
path: string;
|
|
54
|
+
nextPath: string;
|
|
55
|
+
};
|
|
56
|
+
fromJSON: (x: {
|
|
57
|
+
value: string;
|
|
58
|
+
path: string;
|
|
59
|
+
nextPath: string;
|
|
60
|
+
}) => {
|
|
61
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
62
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
63
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
64
|
+
};
|
|
65
|
+
empty: () => {
|
|
66
|
+
value: import("o1js/dist/node/lib/provable/field").Field;
|
|
67
|
+
path: import("o1js/dist/node/lib/provable/field").Field;
|
|
68
|
+
nextPath: import("o1js/dist/node/lib/provable/field").Field;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export declare class LinkedLeafStruct extends LinkedLeafStruct_base {
|
|
72
|
+
hash(): Field;
|
|
73
|
+
}
|
|
74
|
+
declare const LinkedLeafAndMerkleWitness_base: (new (value: {
|
|
75
|
+
leaf: LinkedLeafStruct;
|
|
76
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
77
|
+
}) => {
|
|
78
|
+
leaf: LinkedLeafStruct;
|
|
79
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
80
|
+
}) & {
|
|
81
|
+
_isStruct: true;
|
|
82
|
+
} & Omit<import("o1js/dist/node/lib/provable/types/provable-intf").Provable<{
|
|
83
|
+
leaf: LinkedLeafStruct;
|
|
84
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
85
|
+
}, {
|
|
86
|
+
leaf: {
|
|
87
|
+
value: bigint;
|
|
88
|
+
path: bigint;
|
|
89
|
+
nextPath: bigint;
|
|
90
|
+
};
|
|
91
|
+
merkleWitness: {
|
|
92
|
+
path: bigint[];
|
|
93
|
+
isLeft: boolean[];
|
|
94
|
+
};
|
|
95
|
+
}>, "fromFields"> & {
|
|
96
|
+
fromFields: (fields: import("o1js/dist/node/lib/provable/field").Field[]) => {
|
|
97
|
+
leaf: LinkedLeafStruct;
|
|
98
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
99
|
+
};
|
|
100
|
+
} & {
|
|
101
|
+
fromValue: (value: {
|
|
102
|
+
leaf: LinkedLeafStruct | {
|
|
103
|
+
value: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
104
|
+
path: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
105
|
+
nextPath: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
106
|
+
};
|
|
107
|
+
merkleWitness: {
|
|
108
|
+
path: import("o1js/dist/node/lib/provable/field").Field[] | bigint[];
|
|
109
|
+
isLeft: import("o1js/dist/node/lib/provable/bool").Bool[] | boolean[];
|
|
110
|
+
} | (AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate);
|
|
111
|
+
}) => {
|
|
112
|
+
leaf: LinkedLeafStruct;
|
|
113
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
114
|
+
};
|
|
115
|
+
toInput: (x: {
|
|
116
|
+
leaf: LinkedLeafStruct;
|
|
117
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
118
|
+
}) => {
|
|
119
|
+
fields?: import("o1js/dist/node/lib/provable/field").Field[] | undefined;
|
|
120
|
+
packed?: [import("o1js/dist/node/lib/provable/field").Field, number][] | undefined;
|
|
121
|
+
};
|
|
122
|
+
toJSON: (x: {
|
|
123
|
+
leaf: LinkedLeafStruct;
|
|
124
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
125
|
+
}) => {
|
|
126
|
+
leaf: {
|
|
127
|
+
value: string;
|
|
128
|
+
path: string;
|
|
129
|
+
nextPath: string;
|
|
130
|
+
};
|
|
131
|
+
merkleWitness: {
|
|
132
|
+
path: string[];
|
|
133
|
+
isLeft: boolean[];
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
fromJSON: (x: {
|
|
137
|
+
leaf: {
|
|
138
|
+
value: string;
|
|
139
|
+
path: string;
|
|
140
|
+
nextPath: string;
|
|
141
|
+
};
|
|
142
|
+
merkleWitness: {
|
|
143
|
+
path: string[];
|
|
144
|
+
isLeft: boolean[];
|
|
145
|
+
};
|
|
146
|
+
}) => {
|
|
147
|
+
leaf: LinkedLeafStruct;
|
|
148
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
149
|
+
};
|
|
150
|
+
empty: () => {
|
|
151
|
+
leaf: LinkedLeafStruct;
|
|
152
|
+
merkleWitness: AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate;
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
export declare class LinkedLeafAndMerkleWitness extends LinkedLeafAndMerkleWitness_base {
|
|
156
|
+
}
|
|
157
|
+
declare const LinkedStructTemplate_base: (new (value: {
|
|
158
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
159
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
160
|
+
}) => {
|
|
161
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
162
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
163
|
+
}) & {
|
|
164
|
+
_isStruct: true;
|
|
165
|
+
} & Omit<import("o1js/dist/node/lib/provable/types/provable-intf").Provable<{
|
|
166
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
167
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
168
|
+
}, {
|
|
169
|
+
leafPrevious: {
|
|
170
|
+
leaf: {
|
|
171
|
+
value: bigint;
|
|
172
|
+
path: bigint;
|
|
173
|
+
nextPath: bigint;
|
|
174
|
+
};
|
|
175
|
+
merkleWitness: {
|
|
176
|
+
path: bigint[];
|
|
177
|
+
isLeft: boolean[];
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
leafCurrent: {
|
|
181
|
+
leaf: {
|
|
182
|
+
value: bigint;
|
|
183
|
+
path: bigint;
|
|
184
|
+
nextPath: bigint;
|
|
185
|
+
};
|
|
186
|
+
merkleWitness: {
|
|
187
|
+
path: bigint[];
|
|
188
|
+
isLeft: boolean[];
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
}>, "fromFields"> & {
|
|
192
|
+
fromFields: (fields: import("o1js/dist/node/lib/provable/field").Field[]) => {
|
|
193
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
194
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
195
|
+
};
|
|
196
|
+
} & {
|
|
197
|
+
fromValue: (value: {
|
|
198
|
+
leafPrevious: LinkedLeafAndMerkleWitness | {
|
|
199
|
+
leaf: LinkedLeafStruct | {
|
|
200
|
+
value: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
201
|
+
path: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
202
|
+
nextPath: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
203
|
+
};
|
|
204
|
+
merkleWitness: {
|
|
205
|
+
path: import("o1js/dist/node/lib/provable/field").Field[] | bigint[];
|
|
206
|
+
isLeft: import("o1js/dist/node/lib/provable/bool").Bool[] | boolean[];
|
|
207
|
+
} | (AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate);
|
|
208
|
+
};
|
|
209
|
+
leafCurrent: LinkedLeafAndMerkleWitness | {
|
|
210
|
+
leaf: LinkedLeafStruct | {
|
|
211
|
+
value: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
212
|
+
path: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
213
|
+
nextPath: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
|
|
214
|
+
};
|
|
215
|
+
merkleWitness: {
|
|
216
|
+
path: import("o1js/dist/node/lib/provable/field").Field[] | bigint[];
|
|
217
|
+
isLeft: import("o1js/dist/node/lib/provable/bool").Bool[] | boolean[];
|
|
218
|
+
} | (AbstractMerkleWitness & import("./RollupMerkleTree").StructTemplate);
|
|
219
|
+
};
|
|
220
|
+
}) => {
|
|
221
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
222
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
223
|
+
};
|
|
224
|
+
toInput: (x: {
|
|
225
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
226
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
227
|
+
}) => {
|
|
228
|
+
fields?: import("o1js/dist/node/lib/provable/field").Field[] | undefined;
|
|
229
|
+
packed?: [import("o1js/dist/node/lib/provable/field").Field, number][] | undefined;
|
|
230
|
+
};
|
|
231
|
+
toJSON: (x: {
|
|
232
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
233
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
234
|
+
}) => {
|
|
235
|
+
leafPrevious: {
|
|
236
|
+
leaf: {
|
|
237
|
+
value: string;
|
|
238
|
+
path: string;
|
|
239
|
+
nextPath: string;
|
|
240
|
+
};
|
|
241
|
+
merkleWitness: {
|
|
242
|
+
path: string[];
|
|
243
|
+
isLeft: boolean[];
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
leafCurrent: {
|
|
247
|
+
leaf: {
|
|
248
|
+
value: string;
|
|
249
|
+
path: string;
|
|
250
|
+
nextPath: string;
|
|
251
|
+
};
|
|
252
|
+
merkleWitness: {
|
|
253
|
+
path: string[];
|
|
254
|
+
isLeft: boolean[];
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
fromJSON: (x: {
|
|
259
|
+
leafPrevious: {
|
|
260
|
+
leaf: {
|
|
261
|
+
value: string;
|
|
262
|
+
path: string;
|
|
263
|
+
nextPath: string;
|
|
264
|
+
};
|
|
265
|
+
merkleWitness: {
|
|
266
|
+
path: string[];
|
|
267
|
+
isLeft: boolean[];
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
leafCurrent: {
|
|
271
|
+
leaf: {
|
|
272
|
+
value: string;
|
|
273
|
+
path: string;
|
|
274
|
+
nextPath: string;
|
|
275
|
+
};
|
|
276
|
+
merkleWitness: {
|
|
277
|
+
path: string[];
|
|
278
|
+
isLeft: boolean[];
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
}) => {
|
|
282
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
283
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
284
|
+
};
|
|
285
|
+
empty: () => {
|
|
286
|
+
leafPrevious: LinkedLeafAndMerkleWitness;
|
|
287
|
+
leafCurrent: LinkedLeafAndMerkleWitness;
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
declare class LinkedStructTemplate extends LinkedStructTemplate_base {
|
|
291
|
+
}
|
|
292
|
+
export interface AbstractLinkedMerkleWitness extends LinkedStructTemplate {
|
|
293
|
+
}
|
|
294
|
+
export interface AbstractLinkedMerkleTree {
|
|
295
|
+
store: LinkedMerkleTreeStore;
|
|
296
|
+
/**
|
|
297
|
+
* Returns a node which lives at a given index and level.
|
|
298
|
+
* @param level Level of the node.
|
|
299
|
+
* @param index Index of the node.
|
|
300
|
+
* @returns The data of the node.
|
|
301
|
+
*/
|
|
302
|
+
getNode(level: number, index: bigint): Field;
|
|
303
|
+
/**
|
|
304
|
+
* Returns the root of the [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree).
|
|
305
|
+
* @returns The root of the Merkle Tree.
|
|
306
|
+
*/
|
|
307
|
+
getRoot(): Field;
|
|
308
|
+
/**
|
|
309
|
+
* Sets the value of a leaf node at a given index to a given value.
|
|
310
|
+
* @param path of the leaf node.
|
|
311
|
+
* @param value New value.
|
|
312
|
+
*/
|
|
313
|
+
setLeaf(path: bigint, value?: bigint): LinkedMerkleTreeWitness;
|
|
314
|
+
/**
|
|
315
|
+
* Returns a leaf which lives at a given path.
|
|
316
|
+
* Errors otherwise.
|
|
317
|
+
* @param path Index of the node.
|
|
318
|
+
* @returns The data of the leaf.
|
|
319
|
+
*/
|
|
320
|
+
getLeaf(path: bigint): LinkedLeafStruct | undefined;
|
|
321
|
+
/**
|
|
322
|
+
* Returns the witness (also known as
|
|
323
|
+
* [Merkle Proof or Merkle Witness](https://computersciencewiki.org/index.php/Merkle_proof))
|
|
324
|
+
* for the leaf at the given path.
|
|
325
|
+
* @param path Position of the leaf node.
|
|
326
|
+
* @returns The witness that belongs to the leaf.
|
|
327
|
+
*/
|
|
328
|
+
getWitness(path: bigint): LinkedLeafAndMerkleWitness;
|
|
329
|
+
dummyWitness(): LinkedMerkleTreeWitness;
|
|
330
|
+
dummy(): LinkedLeafAndMerkleWitness;
|
|
331
|
+
}
|
|
332
|
+
export interface AbstractLinkedMerkleTreeClass {
|
|
333
|
+
new (store: LinkedMerkleTreeStore): AbstractLinkedMerkleTree;
|
|
334
|
+
WITNESS: TypedClass<AbstractLinkedMerkleWitness> & typeof LinkedStructTemplate;
|
|
335
|
+
HEIGHT: number;
|
|
336
|
+
EMPTY_ROOT: bigint;
|
|
337
|
+
}
|
|
338
|
+
export declare function createLinkedMerkleTree(height: number): AbstractLinkedMerkleTreeClass;
|
|
339
|
+
declare const LinkedMerkleTree_base: AbstractLinkedMerkleTreeClass;
|
|
340
|
+
export declare class LinkedMerkleTree extends LinkedMerkleTree_base {
|
|
341
|
+
}
|
|
342
|
+
export declare class LinkedMerkleTreeWitness extends LinkedMerkleTree.WITNESS {
|
|
343
|
+
}
|
|
344
|
+
export {};
|
|
345
|
+
//# sourceMappingURL=LinkedMerkleTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkedMerkleTree.d.ts","sourceRoot":"","sources":["../../src/trees/LinkedMerkleTree.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,EAA8B,MAAM,MAAM,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,qBAAqB,EAGtB,MAAM,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAI5B,qBAAa,gBAAiB,SAAQ,qBAIpC;IACO,IAAI,IAAI,KAAK;CAGrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAID,qBAAa,0BAA2B,SAAQ,+BAG9C;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,cAAM,oBAAqB,SAAQ,yBAGjC;CAAG;AAEL,MAAM,WAAW,2BAA4B,SAAQ,oBAAoB;CAAG;AAE5E,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,qBAAqB,CAAC;IAC7B;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAE7C;;;OAGG;IACH,OAAO,IAAI,KAAK,CAAC;IAEjB;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAE/D;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAEpD;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,0BAA0B,CAAC;IAErD,YAAY,IAAI,uBAAuB,CAAC;IAExC,KAAK,IAAI,0BAA0B,CAAC;CACrC;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,KAAK,EAAE,qBAAqB,GAAG,wBAAwB,CAAC;IAE7D,OAAO,EAAE,UAAU,CAAC,2BAA2B,CAAC,GAC9C,OAAO,oBAAoB,CAAC;IAE9B,MAAM,EAAE,MAAM,CAAC;IAEf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GACb,6BAA6B,CAyX/B;;AAED,qBAAa,gBAAiB,SAAQ,qBAA0B;CAAG;AACnE,qBAAa,uBAAwB,SAAQ,gBAAgB,CAAC,OAAO;CAAG"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
// eslint-disable-next-line max-classes-per-file
|
|
2
|
+
import { Bool, Field, Poseidon, Provable, Struct } from "o1js";
|
|
3
|
+
import { range } from "../utils";
|
|
4
|
+
import { createMerkleTree, maybeSwap, } from "./RollupMerkleTree";
|
|
5
|
+
import { InMemoryLinkedMerkleLeafStore } from "./InMemoryLinkedMerkleLeafStore";
|
|
6
|
+
const RollupMerkleTreeWitness = createMerkleTree(40).WITNESS;
|
|
7
|
+
export class LinkedLeafStruct extends Struct({
|
|
8
|
+
value: Field,
|
|
9
|
+
path: Field,
|
|
10
|
+
nextPath: Field,
|
|
11
|
+
}) {
|
|
12
|
+
hash() {
|
|
13
|
+
return Poseidon.hash(LinkedLeafStruct.toFields(this));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// We use the RollupMerkleTreeWitness here, although we will actually implement
|
|
17
|
+
// the RollupMerkleTreeWitnessV2 defined below when instantiating the class.
|
|
18
|
+
export class LinkedLeafAndMerkleWitness extends Struct({
|
|
19
|
+
leaf: LinkedLeafStruct,
|
|
20
|
+
merkleWitness: RollupMerkleTreeWitness,
|
|
21
|
+
}) {
|
|
22
|
+
}
|
|
23
|
+
class LinkedStructTemplate extends Struct({
|
|
24
|
+
leafPrevious: LinkedLeafAndMerkleWitness,
|
|
25
|
+
leafCurrent: LinkedLeafAndMerkleWitness,
|
|
26
|
+
}) {
|
|
27
|
+
}
|
|
28
|
+
export function createLinkedMerkleTree(height) {
|
|
29
|
+
var _a;
|
|
30
|
+
class LinkedMerkleWitness extends LinkedStructTemplate {
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The {@link RollupMerkleWitness} class defines a circuit-compatible base class
|
|
34
|
+
* for [Merkle Witness'](https://computersciencewiki.org/index.php/Merkle_proof).
|
|
35
|
+
*/
|
|
36
|
+
// We define the RollupMerkleWitness again here as we want it to have the same height
|
|
37
|
+
// as the tree. If we re-used the Witness from the RollupMerkleTree.ts we wouldn't have
|
|
38
|
+
// control, whilst having the overhead of creating the RollupTree, since the witness is
|
|
39
|
+
// defined from the tree (for the height reason already described).
|
|
40
|
+
class RollupMerkleWitnessV2 extends Struct({
|
|
41
|
+
path: Provable.Array(Field, height - 1),
|
|
42
|
+
isLeft: Provable.Array(Bool, height - 1),
|
|
43
|
+
}) {
|
|
44
|
+
height() {
|
|
45
|
+
return RollupMerkleWitnessV2.height;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Calculates a root depending on the leaf value.
|
|
49
|
+
* @param leaf Value of the leaf node that belongs to this Witness.
|
|
50
|
+
* @returns The calculated root.
|
|
51
|
+
*/
|
|
52
|
+
calculateRoot(leaf) {
|
|
53
|
+
let hash = leaf;
|
|
54
|
+
const n = this.height();
|
|
55
|
+
for (let index = 1; index < n; ++index) {
|
|
56
|
+
const isLeft = this.isLeft[index - 1];
|
|
57
|
+
const [left, right] = maybeSwap(isLeft, hash, this.path[index - 1]);
|
|
58
|
+
hash = Poseidon.hash([left, right]);
|
|
59
|
+
}
|
|
60
|
+
return hash;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calculates the index of the leaf node that belongs to this Witness.
|
|
64
|
+
* @returns Index of the leaf.
|
|
65
|
+
*/
|
|
66
|
+
calculateIndex() {
|
|
67
|
+
let powerOfTwo = Field(1);
|
|
68
|
+
let index = Field(0);
|
|
69
|
+
const n = this.height();
|
|
70
|
+
for (let i = 1; i < n; ++i) {
|
|
71
|
+
index = Provable.if(this.isLeft[i - 1], index, index.add(powerOfTwo));
|
|
72
|
+
powerOfTwo = powerOfTwo.mul(2);
|
|
73
|
+
}
|
|
74
|
+
return index;
|
|
75
|
+
}
|
|
76
|
+
checkMembership(root, key, value) {
|
|
77
|
+
const calculatedRoot = this.calculateRoot(value);
|
|
78
|
+
const calculatedKey = this.calculateIndex();
|
|
79
|
+
// We don't have to range-check the key, because if it would be greater
|
|
80
|
+
// than leafCount, it would not match the computedKey
|
|
81
|
+
key.assertEquals(calculatedKey, "Keys of MerkleWitness does not match");
|
|
82
|
+
return root.equals(calculatedRoot);
|
|
83
|
+
}
|
|
84
|
+
checkMembershipSimple(root, value) {
|
|
85
|
+
const calculatedRoot = this.calculateRoot(value);
|
|
86
|
+
return root.equals(calculatedRoot);
|
|
87
|
+
}
|
|
88
|
+
checkMembershipGetRoots(root, key, value) {
|
|
89
|
+
const calculatedRoot = this.calculateRoot(value);
|
|
90
|
+
const calculatedKey = this.calculateIndex();
|
|
91
|
+
key.assertEquals(calculatedKey, "Keys of MerkleWitness does not match");
|
|
92
|
+
return [root.equals(calculatedRoot), root, calculatedRoot];
|
|
93
|
+
}
|
|
94
|
+
toShortenedEntries() {
|
|
95
|
+
return range(0, 5)
|
|
96
|
+
.concat(range(this.height() - 4, this.height()))
|
|
97
|
+
.map((index) => [
|
|
98
|
+
this.path[index].toString(),
|
|
99
|
+
this.isLeft[index].toString(),
|
|
100
|
+
].toString());
|
|
101
|
+
}
|
|
102
|
+
static dummy() {
|
|
103
|
+
return new RollupMerkleWitnessV2({
|
|
104
|
+
isLeft: Array(this.height - 1).fill(Bool(false)),
|
|
105
|
+
path: Array(this.height - 1).fill(Field(0)),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
RollupMerkleWitnessV2.height = height;
|
|
110
|
+
return _a = class AbstractLinkedRollupMerkleTree {
|
|
111
|
+
constructor(store) {
|
|
112
|
+
this.store = store;
|
|
113
|
+
this.zeroes = [0n];
|
|
114
|
+
for (let index = 1; index < AbstractLinkedRollupMerkleTree.HEIGHT; index += 1) {
|
|
115
|
+
const previousLevel = Field(this.zeroes[index - 1]);
|
|
116
|
+
this.zeroes.push(Poseidon.hash([previousLevel, previousLevel]).toBigInt());
|
|
117
|
+
}
|
|
118
|
+
// We only do the leaf initialisation when the store
|
|
119
|
+
// has no values. Otherwise, we leave the store
|
|
120
|
+
// as is to not overwrite any data.
|
|
121
|
+
if (this.store.getMaximumIndex() === undefined) {
|
|
122
|
+
this.setLeafInitialisation();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
getNode(level, index) {
|
|
126
|
+
const node = this.store.getNode(index, level);
|
|
127
|
+
return Field(node ?? this.zeroes[level]);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Returns leaf which lives at a given path.
|
|
131
|
+
* Errors if the path is not defined.
|
|
132
|
+
* @param path path of the node.
|
|
133
|
+
* @returns The data of the node.
|
|
134
|
+
*/
|
|
135
|
+
getLeaf(path) {
|
|
136
|
+
const storedLeaf = this.store.getLeaf(path);
|
|
137
|
+
if (storedLeaf === undefined) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
return new LinkedLeafStruct({
|
|
141
|
+
value: Field(storedLeaf.leaf.value),
|
|
142
|
+
path: Field(storedLeaf.leaf.path),
|
|
143
|
+
nextPath: Field(storedLeaf.leaf.nextPath),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Returns the root of the [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree).
|
|
148
|
+
* @returns The root of the Merkle Tree.
|
|
149
|
+
*/
|
|
150
|
+
getRoot() {
|
|
151
|
+
return this.getNode(AbstractLinkedRollupMerkleTree.HEIGHT - 1, 0n).toConstant();
|
|
152
|
+
}
|
|
153
|
+
setNode(level, index, value) {
|
|
154
|
+
this.store.setNode(index, level, value.toBigInt());
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Sets the value of a leaf node at a given index to a given value
|
|
158
|
+
* and carry the change through to the tree.
|
|
159
|
+
* @param index Position of the leaf node.
|
|
160
|
+
* @param leaf New value.
|
|
161
|
+
*/
|
|
162
|
+
setMerkleLeaf(index, leaf) {
|
|
163
|
+
this.setNode(0, index, leaf.hash());
|
|
164
|
+
let tempIndex = index;
|
|
165
|
+
for (let level = 1; level < AbstractLinkedRollupMerkleTree.HEIGHT; level += 1) {
|
|
166
|
+
tempIndex /= 2n;
|
|
167
|
+
const leftPrev = this.getNode(level - 1, tempIndex * 2n);
|
|
168
|
+
const rightPrev = this.getNode(level - 1, tempIndex * 2n + 1n);
|
|
169
|
+
this.setNode(level, tempIndex, Poseidon.hash([leftPrev, rightPrev]));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Sets the value of a node at a given index to a given value.
|
|
174
|
+
* @param path Position of the leaf node.
|
|
175
|
+
* @param value New value.
|
|
176
|
+
*/
|
|
177
|
+
setLeaf(path, value) {
|
|
178
|
+
if (value === undefined) {
|
|
179
|
+
return new LinkedMerkleWitness({
|
|
180
|
+
leafPrevious: this.dummy(),
|
|
181
|
+
leafCurrent: this.getWitness(path),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const storedLeaf = this.store.getLeaf(path);
|
|
185
|
+
const prevLeaf = this.store.getLeafLessOrEqual(path);
|
|
186
|
+
if (prevLeaf === undefined) {
|
|
187
|
+
throw Error("Prev leaf shouldn't be undefined");
|
|
188
|
+
}
|
|
189
|
+
let witnessPrevious;
|
|
190
|
+
let index;
|
|
191
|
+
if (storedLeaf === undefined) {
|
|
192
|
+
// The above means the path doesn't already exist, and we are inserting, not updating.
|
|
193
|
+
// This requires us to update the node with the previous path, as well.
|
|
194
|
+
const tempIndex = this.store.getMaximumIndex();
|
|
195
|
+
if (tempIndex === undefined) {
|
|
196
|
+
throw Error("Store Max Index not defined");
|
|
197
|
+
}
|
|
198
|
+
if (tempIndex + 1n >= 2 ** height) {
|
|
199
|
+
throw new Error("Index greater than maximum leaf number");
|
|
200
|
+
}
|
|
201
|
+
witnessPrevious = this.getWitness(prevLeaf.leaf.path);
|
|
202
|
+
const newPrevLeaf = {
|
|
203
|
+
value: prevLeaf.leaf.value,
|
|
204
|
+
path: prevLeaf.leaf.path,
|
|
205
|
+
nextPath: path,
|
|
206
|
+
};
|
|
207
|
+
this.store.setLeaf(prevLeaf.index, newPrevLeaf);
|
|
208
|
+
this.setMerkleLeaf(prevLeaf.index, new LinkedLeafStruct({
|
|
209
|
+
value: Field(newPrevLeaf.value),
|
|
210
|
+
path: Field(newPrevLeaf.path),
|
|
211
|
+
nextPath: Field(newPrevLeaf.nextPath),
|
|
212
|
+
}));
|
|
213
|
+
index = tempIndex + 1n;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
witnessPrevious = this.dummy();
|
|
217
|
+
index = storedLeaf.index;
|
|
218
|
+
}
|
|
219
|
+
const newLeaf = {
|
|
220
|
+
value: value,
|
|
221
|
+
path: path,
|
|
222
|
+
nextPath: prevLeaf.leaf.nextPath,
|
|
223
|
+
};
|
|
224
|
+
const witnessNext = this.getWitness(newLeaf.path);
|
|
225
|
+
this.store.setLeaf(index, newLeaf);
|
|
226
|
+
this.setMerkleLeaf(index, new LinkedLeafStruct({
|
|
227
|
+
value: Field(newLeaf.value),
|
|
228
|
+
path: Field(newLeaf.path),
|
|
229
|
+
nextPath: Field(newLeaf.nextPath),
|
|
230
|
+
}));
|
|
231
|
+
return new LinkedMerkleWitness({
|
|
232
|
+
leafPrevious: witnessPrevious,
|
|
233
|
+
leafCurrent: witnessNext,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Sets the value of a leaf node at initialisation,
|
|
238
|
+
* i.e. {vale: 0, path: 0, nextPath: Field.Max}
|
|
239
|
+
*/
|
|
240
|
+
setLeafInitialisation() {
|
|
241
|
+
// This is the maximum value of the hash
|
|
242
|
+
const MAX_FIELD_VALUE = Field.ORDER - 1n;
|
|
243
|
+
this.store.setLeaf(0n, {
|
|
244
|
+
value: 0n,
|
|
245
|
+
path: 0n,
|
|
246
|
+
nextPath: MAX_FIELD_VALUE,
|
|
247
|
+
});
|
|
248
|
+
// We now set the leafs in the merkle tree to cascade the values up
|
|
249
|
+
// the tree.
|
|
250
|
+
this.setMerkleLeaf(0n, new LinkedLeafStruct({
|
|
251
|
+
value: Field(0n),
|
|
252
|
+
path: Field(0n),
|
|
253
|
+
nextPath: Field(MAX_FIELD_VALUE),
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Returns the witness (also known as
|
|
258
|
+
* [Merkle Proof or Merkle Witness](https://computersciencewiki.org/index.php/Merkle_proof))
|
|
259
|
+
* for the leaf at the given path, otherwise returns a witness for the first unused index.
|
|
260
|
+
* @param path of the leaf node.
|
|
261
|
+
* @returns The witness that belongs to the leaf.
|
|
262
|
+
*/
|
|
263
|
+
getWitness(path) {
|
|
264
|
+
const storedLeaf = this.store.getLeaf(path);
|
|
265
|
+
let leaf;
|
|
266
|
+
let currentIndex;
|
|
267
|
+
if (storedLeaf === undefined) {
|
|
268
|
+
const storeIndex = this.store.getMaximumIndex();
|
|
269
|
+
if (storeIndex === undefined) {
|
|
270
|
+
throw new Error("Store Undefined");
|
|
271
|
+
}
|
|
272
|
+
currentIndex = storeIndex + 1n;
|
|
273
|
+
leaf = new LinkedLeafStruct({
|
|
274
|
+
value: Field(0),
|
|
275
|
+
path: Field(0),
|
|
276
|
+
nextPath: Field(0),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
leaf = new LinkedLeafStruct({
|
|
281
|
+
value: Field(storedLeaf.leaf.value),
|
|
282
|
+
path: Field(storedLeaf.leaf.path),
|
|
283
|
+
nextPath: Field(storedLeaf.leaf.nextPath),
|
|
284
|
+
});
|
|
285
|
+
currentIndex = storedLeaf.index;
|
|
286
|
+
}
|
|
287
|
+
const pathArray = [];
|
|
288
|
+
const isLefts = [];
|
|
289
|
+
for (let level = 0; level < AbstractLinkedRollupMerkleTree.HEIGHT - 1; level += 1) {
|
|
290
|
+
const isLeft = currentIndex % 2n === 0n;
|
|
291
|
+
const sibling = this.getNode(level, isLeft ? currentIndex + 1n : currentIndex - 1n);
|
|
292
|
+
isLefts.push(Bool(isLeft));
|
|
293
|
+
pathArray.push(sibling);
|
|
294
|
+
currentIndex /= 2n;
|
|
295
|
+
}
|
|
296
|
+
return new LinkedLeafAndMerkleWitness({
|
|
297
|
+
merkleWitness: new RollupMerkleWitnessV2({
|
|
298
|
+
path: pathArray,
|
|
299
|
+
isLeft: isLefts,
|
|
300
|
+
}),
|
|
301
|
+
leaf: leaf,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
dummy() {
|
|
305
|
+
return new LinkedLeafAndMerkleWitness({
|
|
306
|
+
merkleWitness: new RollupMerkleTreeWitness({
|
|
307
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
308
|
+
path: Array(40).fill(Field(0)),
|
|
309
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
310
|
+
isLeft: Array(40).fill(new Bool(true)),
|
|
311
|
+
}),
|
|
312
|
+
leaf: new LinkedLeafStruct({
|
|
313
|
+
value: Field(0),
|
|
314
|
+
path: Field(0),
|
|
315
|
+
nextPath: Field(0),
|
|
316
|
+
}),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
dummyWitness() {
|
|
320
|
+
return new LinkedMerkleWitness({
|
|
321
|
+
leafPrevious: this.dummy(),
|
|
322
|
+
leafCurrent: this.dummy(),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
_a.HEIGHT = height,
|
|
327
|
+
_a.EMPTY_ROOT = new _a(new InMemoryLinkedMerkleLeafStore())
|
|
328
|
+
.getRoot()
|
|
329
|
+
.toBigInt(),
|
|
330
|
+
_a.WITNESS = LinkedMerkleWitness,
|
|
331
|
+
_a;
|
|
332
|
+
}
|
|
333
|
+
export class LinkedMerkleTree extends createLinkedMerkleTree(40) {
|
|
334
|
+
}
|
|
335
|
+
export class LinkedMerkleTreeWitness extends LinkedMerkleTree.WITNESS {
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=LinkedMerkleTree.js.map
|