@proto-kit/protocol 0.1.1-develop.153

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.
Files changed (150) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +45 -0
  3. package/dist/Constants.d.ts +4 -0
  4. package/dist/Constants.d.ts.map +1 -0
  5. package/dist/Constants.js +3 -0
  6. package/dist/config/ConfigurableModule.d.ts +18 -0
  7. package/dist/config/ConfigurableModule.d.ts.map +1 -0
  8. package/dist/config/ConfigurableModule.js +20 -0
  9. package/dist/config/ConfigurationAggregator.d.ts +10 -0
  10. package/dist/config/ConfigurationAggregator.d.ts.map +1 -0
  11. package/dist/config/ConfigurationAggregator.js +35 -0
  12. package/dist/config/ConfigurationReceiver.d.ts +25 -0
  13. package/dist/config/ConfigurationReceiver.d.ts.map +1 -0
  14. package/dist/config/ConfigurationReceiver.js +36 -0
  15. package/dist/config/ModuleContainer.d.ts +44 -0
  16. package/dist/config/ModuleContainer.d.ts.map +1 -0
  17. package/dist/config/ModuleContainer.js +89 -0
  18. package/dist/config/types.d.ts +2 -0
  19. package/dist/config/types.d.ts.map +1 -0
  20. package/dist/config/types.js +1 -0
  21. package/dist/index.d.ts +24 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +23 -0
  24. package/dist/model/MethodPublicInput.d.ts +51 -0
  25. package/dist/model/MethodPublicInput.d.ts.map +1 -0
  26. package/dist/model/MethodPublicInput.js +11 -0
  27. package/dist/model/MethodPublicOutput.d.ts +59 -0
  28. package/dist/model/MethodPublicOutput.d.ts.map +1 -0
  29. package/dist/model/MethodPublicOutput.js +12 -0
  30. package/dist/model/Option.d.ts +94 -0
  31. package/dist/model/Option.d.ts.map +1 -0
  32. package/dist/model/Option.js +96 -0
  33. package/dist/model/Path.d.ts +31 -0
  34. package/dist/model/Path.d.ts.map +1 -0
  35. package/dist/model/Path.js +44 -0
  36. package/dist/model/StateTransition.d.ts +85 -0
  37. package/dist/model/StateTransition.d.ts.map +1 -0
  38. package/dist/model/StateTransition.js +58 -0
  39. package/dist/model/StateTransitionProvableBatch.d.ts +57 -0
  40. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
  41. package/dist/model/StateTransitionProvableBatch.js +21 -0
  42. package/dist/model/network/NetworkState.d.ts +64 -0
  43. package/dist/model/network/NetworkState.d.ts.map +1 -0
  44. package/dist/model/network/NetworkState.js +14 -0
  45. package/dist/model/transaction/ProtocolTransaction.d.ts +70 -0
  46. package/dist/model/transaction/ProtocolTransaction.d.ts.map +1 -0
  47. package/dist/model/transaction/ProtocolTransaction.js +18 -0
  48. package/dist/model/transaction/RuntimeTransaction.d.ts +55 -0
  49. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
  50. package/dist/model/transaction/RuntimeTransaction.js +26 -0
  51. package/dist/protocol/Protocol.d.ts +37 -0
  52. package/dist/protocol/Protocol.d.ts.map +1 -0
  53. package/dist/protocol/Protocol.js +50 -0
  54. package/dist/protocol/ProtocolModule.d.ts +9 -0
  55. package/dist/protocol/ProtocolModule.d.ts.map +1 -0
  56. package/dist/protocol/ProtocolModule.js +10 -0
  57. package/dist/prover/block/BlockProvable.d.ts +149 -0
  58. package/dist/prover/block/BlockProvable.d.ts.map +1 -0
  59. package/dist/prover/block/BlockProvable.js +20 -0
  60. package/dist/prover/block/BlockProver.d.ts +48 -0
  61. package/dist/prover/block/BlockProver.d.ts.map +1 -0
  62. package/dist/prover/block/BlockProver.js +171 -0
  63. package/dist/prover/block/BlockScopedModule.d.ts +3 -0
  64. package/dist/prover/block/BlockScopedModule.d.ts.map +1 -0
  65. package/dist/prover/block/BlockScopedModule.js +6 -0
  66. package/dist/prover/statetransition/StateTransitionProvable.d.ts +84 -0
  67. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
  68. package/dist/prover/statetransition/StateTransitionProvable.js +11 -0
  69. package/dist/prover/statetransition/StateTransitionProver.d.ts +39 -0
  70. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
  71. package/dist/prover/statetransition/StateTransitionProver.js +157 -0
  72. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +16 -0
  73. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +1 -0
  74. package/dist/prover/statetransition/StateTransitionWitnessProvider.js +17 -0
  75. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +7 -0
  76. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +1 -0
  77. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +20 -0
  78. package/dist/src/model/Option.d.ts +158 -0
  79. package/dist/src/model/Option.d.ts.map +1 -0
  80. package/dist/src/model/Option.js +53 -0
  81. package/dist/src/model/Path.d.ts +35 -0
  82. package/dist/src/model/Path.d.ts.map +1 -0
  83. package/dist/src/model/Path.js +51 -0
  84. package/dist/src/model/StateTransition.d.ts +201 -0
  85. package/dist/src/model/StateTransition.d.ts.map +1 -0
  86. package/dist/src/model/StateTransition.js +43 -0
  87. package/dist/src/utils/PrefixedHashList.d.ts +15 -0
  88. package/dist/src/utils/PrefixedHashList.d.ts.map +1 -0
  89. package/dist/src/utils/PrefixedHashList.js +28 -0
  90. package/dist/src/utils/ProvableHashList.d.ts +30 -0
  91. package/dist/src/utils/ProvableHashList.d.ts.map +1 -0
  92. package/dist/src/utils/ProvableHashList.js +43 -0
  93. package/dist/utils/PrefixedHashList.d.ts +14 -0
  94. package/dist/utils/PrefixedHashList.d.ts.map +1 -0
  95. package/dist/utils/PrefixedHashList.js +12 -0
  96. package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
  97. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
  98. package/dist/utils/PrefixedProvableHashList.js +12 -0
  99. package/dist/utils/ProvableHashList.d.ts +27 -0
  100. package/dist/utils/ProvableHashList.d.ts.map +1 -0
  101. package/dist/utils/ProvableHashList.js +43 -0
  102. package/dist/utils/Utils.d.ts +17 -0
  103. package/dist/utils/Utils.d.ts.map +1 -0
  104. package/dist/utils/Utils.js +63 -0
  105. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +25 -0
  106. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +1 -0
  107. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +72 -0
  108. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +26 -0
  109. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +1 -0
  110. package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +79 -0
  111. package/dist/utils/merkletree/MerkleTreeStore.d.ts +11 -0
  112. package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +1 -0
  113. package/dist/utils/merkletree/MerkleTreeStore.js +1 -0
  114. package/dist/utils/merkletree/RollupMerkleTree.d.ts +130 -0
  115. package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +1 -0
  116. package/dist/utils/merkletree/RollupMerkleTree.js +244 -0
  117. package/jest.config.cjs +1 -0
  118. package/package.json +35 -0
  119. package/src/Constants.ts +3 -0
  120. package/src/index.ts +23 -0
  121. package/src/model/MethodPublicOutput.ts +12 -0
  122. package/src/model/Option.test.ts +21 -0
  123. package/src/model/Option.ts +133 -0
  124. package/src/model/Path.ts +52 -0
  125. package/src/model/StateTransition.ts +72 -0
  126. package/src/model/StateTransitionProvableBatch.ts +31 -0
  127. package/src/model/Transaction.ts +29 -0
  128. package/src/model/network/NetworkState.ts +15 -0
  129. package/src/model/transaction/ProtocolTransaction.ts +25 -0
  130. package/src/model/transaction/RuntimeTransaction.ts +34 -0
  131. package/src/protocol/Protocol.ts +129 -0
  132. package/src/protocol/ProtocolModule.ts +27 -0
  133. package/src/prover/block/BlockProvable.ts +45 -0
  134. package/src/prover/block/BlockProver.ts +302 -0
  135. package/src/prover/statetransition/StateTransitionProvable.ts +40 -0
  136. package/src/prover/statetransition/StateTransitionProver.ts +270 -0
  137. package/src/prover/statetransition/StateTransitionWitnessProvider.ts +24 -0
  138. package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +17 -0
  139. package/src/utils/PrefixedProvableHashList.ts +21 -0
  140. package/src/utils/ProvableHashList.ts +50 -0
  141. package/src/utils/merkletree/InMemoryMerkleTreeStorage.ts +99 -0
  142. package/src/utils/merkletree/MerkleTreeStore.ts +15 -0
  143. package/src/utils/merkletree/RollupMerkleTree.ts +250 -0
  144. package/src/utils/merkletree/VirtualMerkleTreeStore.ts +21 -0
  145. package/src/utils/utils.ts +103 -0
  146. package/test/BlockProver.test.ts +127 -0
  147. package/test/Protocol.test.ts +27 -0
  148. package/test/StateTransition.test.ts +182 -0
  149. package/tsconfig.json +8 -0
  150. package/tsconfig.test.json +9 -0
@@ -0,0 +1,171 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ /* eslint-disable max-lines */
14
+ import { Experimental, Field, Provable, SelfProof } from "snarkyjs";
15
+ import { inject, injectable } from "tsyringe";
16
+ import { provableMethod, ZkProgrammable, } from "@proto-kit/common";
17
+ import { DefaultProvableHashList } from "../../utils/ProvableHashList";
18
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
19
+ import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
20
+ import { BlockProverExecutionData, BlockProverPublicInput, BlockProverPublicOutput, } from "./BlockProvable";
21
+ const errors = {
22
+ stateProofNotStartingAtZero: () => "StateProof not starting ST-commitment at zero",
23
+ stateTransitionsHashNotEqual: () => "StateTransition list commitments are not equal",
24
+ propertyNotMatching: (propertyName) => `${propertyName} not matching`,
25
+ stateRootNotMatching: (step) => `StateRoots not matching ${step}`,
26
+ transactionsHashNotMatching: (step) => `transactions hash not matching ${step}`,
27
+ };
28
+ /**
29
+ * BlockProver class, which aggregates a AppChainProof and
30
+ * a StateTransitionProof into a single BlockProof, that can
31
+ * then be merged to be committed to the base-layer contract
32
+ */
33
+ let BlockProver = class BlockProver extends ProtocolModule {
34
+ constructor(stateTransitionProver, runtime) {
35
+ super();
36
+ this.stateTransitionProver = stateTransitionProver;
37
+ this.runtime = runtime;
38
+ }
39
+ /**
40
+ * Applies and checks the two proofs and applies the corresponding state
41
+ * changes to the given state
42
+ *
43
+ * @param state The from-state of the BlockProver
44
+ * @param stateTransitionProof
45
+ * @param appProof
46
+ * @returns The new BlockProver-state to be used as public output
47
+ */
48
+ applyTransaction(state, stateTransitionProof, appProof, { transaction, networkState }) {
49
+ appProof.verify();
50
+ stateTransitionProof.verify();
51
+ const stateTo = { ...state };
52
+ // eslint-disable-next-line no-warning-comments
53
+ // TODO Check methodId?
54
+ // Checks for the stateTransitionProof and appProof matching
55
+ stateTransitionProof.publicInput.stateTransitionsHash.assertEquals(Field(0), errors.stateProofNotStartingAtZero());
56
+ appProof.publicOutput.stateTransitionsHash.assertEquals(stateTransitionProof.publicOutput.stateTransitionsHash, errors.stateTransitionsHashNotEqual());
57
+ // Apply state if status success
58
+ state.stateRoot.assertEquals(stateTransitionProof.publicInput.stateRoot, errors.propertyNotMatching("from state root"));
59
+ stateTo.stateRoot = Provable.if(appProof.publicOutput.status, stateTransitionProof.publicOutput.stateRoot, stateTransitionProof.publicInput.stateRoot);
60
+ // Check transaction signature
61
+ transaction
62
+ .validateSignature()
63
+ .assertTrue("Transaction signature not valid");
64
+ // Check if the methodId is correct
65
+ // to do
66
+ // Check transaction integrity against appProof
67
+ const blockTransactionHash = RuntimeTransaction.fromProtocolTransaction(transaction).hash();
68
+ blockTransactionHash.assertEquals(appProof.publicOutput.transactionHash, "Transactions provided in AppProof and BlockProof do not match");
69
+ // Check network state integrity against appProof
70
+ state.networkStateHash.assertEquals(appProof.publicOutput.networkStateHash, "Network state does not match state used in AppProof");
71
+ state.networkStateHash.assertEquals(networkState.hash(), "Network state provided to BlockProver does not match the publicInput");
72
+ // Append tx to transaction list
73
+ const transactionList = new DefaultProvableHashList(Field, state.transactionsHash);
74
+ const { transactionHash } = appProof.publicOutput;
75
+ transactionList.push(transactionHash);
76
+ stateTo.transactionsHash = transactionList.commitment;
77
+ return stateTo;
78
+ }
79
+ proveTransaction(publicInput, stateProof, appProof, executionData) {
80
+ const state = {
81
+ transactionsHash: publicInput.transactionsHash,
82
+ stateRoot: publicInput.stateRoot,
83
+ networkStateHash: publicInput.networkStateHash,
84
+ };
85
+ this.applyTransaction(state, stateProof, appProof, executionData);
86
+ return new BlockProverPublicOutput({
87
+ stateRoot: state.stateRoot,
88
+ transactionsHash: state.transactionsHash,
89
+ });
90
+ }
91
+ merge(publicInput, proof1, proof2) {
92
+ proof1.verify();
93
+ proof2.verify();
94
+ // Check state
95
+ publicInput.stateRoot.assertEquals(proof1.publicInput.stateRoot, errors.stateRootNotMatching("publicInput.from -> proof1.from"));
96
+ proof1.publicOutput.stateRoot.assertEquals(proof2.publicInput.stateRoot, errors.stateRootNotMatching("proof1.to -> proof2.from"));
97
+ // Check transaction list
98
+ publicInput.transactionsHash.assertEquals(proof1.publicInput.transactionsHash, errors.transactionsHashNotMatching("publicInput.from -> proof1.from"));
99
+ proof1.publicOutput.transactionsHash.assertEquals(proof2.publicInput.transactionsHash, errors.transactionsHashNotMatching("proof1.to -> proof2.from"));
100
+ return new BlockProverPublicOutput({
101
+ stateRoot: proof2.publicOutput.stateRoot,
102
+ transactionsHash: proof2.publicOutput.transactionsHash,
103
+ });
104
+ }
105
+ /**
106
+ * Creates the BlockProver ZkProgram.
107
+ * Recursive linking of proofs is done via the previously
108
+ * injected StateTransitionProver and the required AppChainProof class
109
+ */
110
+ zkProgramFactory() {
111
+ const StateTransitionProofClass = this.stateTransitionProver.zkProgram.Proof;
112
+ const RuntimeProofClass = this.runtime.zkProgrammable.zkProgram.Proof;
113
+ const proveTransaction = this.proveTransaction.bind(this);
114
+ const merge = this.merge.bind(this);
115
+ const program = Experimental.ZkProgram({
116
+ publicInput: BlockProverPublicInput,
117
+ publicOutput: BlockProverPublicOutput,
118
+ methods: {
119
+ proveTransaction: {
120
+ privateInputs: [
121
+ StateTransitionProofClass,
122
+ RuntimeProofClass,
123
+ BlockProverExecutionData,
124
+ ],
125
+ method(publicInput, stateProof, appProof, executionData) {
126
+ return proveTransaction(publicInput, stateProof, appProof, executionData);
127
+ },
128
+ },
129
+ merge: {
130
+ privateInputs: [
131
+ (SelfProof),
132
+ (SelfProof),
133
+ ],
134
+ method(publicInput, proof1, proof2) {
135
+ return merge(publicInput, proof1, proof2);
136
+ },
137
+ },
138
+ },
139
+ });
140
+ const methods = {
141
+ proveTransaction: program.proveTransaction,
142
+ merge: program.merge,
143
+ };
144
+ const SelfProofClass = Experimental.ZkProgram.Proof(program);
145
+ return {
146
+ compile: program.compile.bind(program),
147
+ verify: program.verify.bind(program),
148
+ Proof: SelfProofClass,
149
+ methods,
150
+ };
151
+ }
152
+ };
153
+ __decorate([
154
+ provableMethod(),
155
+ __metadata("design:type", Function),
156
+ __metadata("design:paramtypes", [BlockProverPublicInput, Object, Function, BlockProverExecutionData]),
157
+ __metadata("design:returntype", BlockProverPublicOutput)
158
+ ], BlockProver.prototype, "proveTransaction", null);
159
+ __decorate([
160
+ provableMethod(),
161
+ __metadata("design:type", Function),
162
+ __metadata("design:paramtypes", [BlockProverPublicInput, Object, Object]),
163
+ __metadata("design:returntype", BlockProverPublicOutput)
164
+ ], BlockProver.prototype, "merge", null);
165
+ BlockProver = __decorate([
166
+ injectable(),
167
+ __param(0, inject("StateTransitionProver")),
168
+ __param(1, inject("Runtime")),
169
+ __metadata("design:paramtypes", [ZkProgrammable, Object])
170
+ ], BlockProver);
171
+ export { BlockProver };
@@ -0,0 +1,3 @@
1
+ declare const nothing = 1;
2
+ export { nothing };
3
+ //# sourceMappingURL=BlockScopedModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockScopedModule.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockScopedModule.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,OAAO,IAAI,CAAC;AAClB,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Placeholder for a future module architecture that can plug into the BlockProver
2
+ // export interface BlockScopedModule {
3
+ //
4
+ // }
5
+ const nothing = 1;
6
+ export { nothing };
@@ -0,0 +1,84 @@
1
+ import { Proof } from "snarkyjs";
2
+ import { ZkProgrammable } from "@proto-kit/common";
3
+ import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
4
+ import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
5
+ declare const StateTransitionProverPublicInput_base: (new (value: {
6
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
7
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
8
+ }) => {
9
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
10
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
11
+ }) & {
12
+ _isStruct: true;
13
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
14
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
15
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
16
+ }> & {
17
+ toInput: (x: {
18
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
19
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
20
+ }) => {
21
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
22
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
23
+ };
24
+ toJSON: (x: {
25
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
26
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
27
+ }) => {
28
+ stateTransitionsHash: string;
29
+ stateRoot: string;
30
+ };
31
+ fromJSON: (x: {
32
+ stateTransitionsHash: string;
33
+ stateRoot: string;
34
+ }) => {
35
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
36
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
37
+ };
38
+ };
39
+ export declare class StateTransitionProverPublicInput extends StateTransitionProverPublicInput_base {
40
+ }
41
+ declare const StateTransitionProverPublicOutput_base: (new (value: {
42
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
43
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
44
+ }) => {
45
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
46
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
47
+ }) & {
48
+ _isStruct: true;
49
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
50
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
51
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
52
+ }> & {
53
+ toInput: (x: {
54
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
55
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
56
+ }) => {
57
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
58
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
59
+ };
60
+ toJSON: (x: {
61
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
62
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
63
+ }) => {
64
+ stateTransitionsHash: string;
65
+ stateRoot: string;
66
+ };
67
+ fromJSON: (x: {
68
+ stateTransitionsHash: string;
69
+ stateRoot: string;
70
+ }) => {
71
+ stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
72
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
73
+ };
74
+ };
75
+ export declare class StateTransitionProverPublicOutput extends StateTransitionProverPublicOutput_base {
76
+ }
77
+ export type StateTransitionProof = Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>;
78
+ export interface StateTransitionProvable extends ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput> {
79
+ witnessProviderReference: StateTransitionWitnessProviderReference;
80
+ runBatch: (publicInput: StateTransitionProverPublicInput, batch: StateTransitionProvableBatch) => StateTransitionProverPublicOutput;
81
+ merge: (publicInput: StateTransitionProverPublicInput, proof1: StateTransitionProof, proof2: StateTransitionProof) => StateTransitionProverPublicOutput;
82
+ }
83
+ export {};
84
+ //# sourceMappingURL=StateTransitionProvable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionProvable.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProvable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAU,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAExF,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpG,qBAAa,gCAAiC,SAAQ,qCAGpD;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,iCAAkC,SAAQ,sCAGrD;CAAG;AAEL,MAAM,MAAM,oBAAoB,GAAG,KAAK,CACtC,gCAAgC,EAChC,iCAAiC,CAClC,CAAC;AAEF,MAAM,WAAW,uBACf,SAAQ,cAAc,CACpB,gCAAgC,EAChC,iCAAiC,CAClC;IACD,wBAAwB,EAAE,uCAAuC,CAAC;IAElE,QAAQ,EAAE,CACR,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,KAChC,iCAAiC,CAAC;IAEvC,KAAK,EAAE,CACL,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,KACzB,iCAAiC,CAAC;CACxC"}
@@ -0,0 +1,11 @@
1
+ import { Field, Struct } from "snarkyjs";
2
+ export class StateTransitionProverPublicInput extends Struct({
3
+ stateTransitionsHash: Field,
4
+ stateRoot: Field,
5
+ }) {
6
+ }
7
+ export class StateTransitionProverPublicOutput extends Struct({
8
+ stateTransitionsHash: Field,
9
+ stateRoot: Field,
10
+ }) {
11
+ }
@@ -0,0 +1,39 @@
1
+ import { Field } from "snarkyjs";
2
+ import { ProvableHashList } from "../../utils/ProvableHashList";
3
+ import { ProvableStateTransition } from "../../model/StateTransition";
4
+ import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
5
+ import { PlainZkProgram } from "@proto-kit/common";
6
+ import { StateTransitionProvable, StateTransitionProverPublicInput, StateTransitionProof, StateTransitionProverPublicOutput } from "./StateTransitionProvable";
7
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
8
+ import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
9
+ interface StateTransitionProverExecutionState {
10
+ stateRoot: Field;
11
+ stateTransitionList: ProvableHashList<ProvableStateTransition>;
12
+ }
13
+ /**
14
+ * StateTransitionProver is the prover that proves the application of some state
15
+ * transitions and checks and updates their merkle-tree entries
16
+ */
17
+ export declare class StateTransitionProver extends ProtocolModule<StateTransitionProverPublicInput, StateTransitionProverPublicOutput> implements StateTransitionProvable {
18
+ readonly witnessProviderReference: StateTransitionWitnessProviderReference;
19
+ constructor(witnessProviderReference: StateTransitionWitnessProviderReference);
20
+ zkProgramFactory(): PlainZkProgram<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>;
21
+ private get witnessProvider();
22
+ /**
23
+ * Applies the state transitions to the current stateRoot
24
+ * and returns the new prover state
25
+ */
26
+ applyTransitions(stateRoot: Field, stateTransitionCommitmentFrom: Field, transitionBatch: StateTransitionProvableBatch): StateTransitionProverExecutionState;
27
+ /**
28
+ * Applies a single state transition to the given state
29
+ * and mutates it in place
30
+ */
31
+ applyTransition(state: StateTransitionProverExecutionState, transition: ProvableStateTransition, index?: number): void;
32
+ /**
33
+ * Applies a whole batch of StateTransitions at once
34
+ */
35
+ runBatch(publicInput: StateTransitionProverPublicInput, batch: StateTransitionProvableBatch): StateTransitionProverPublicOutput;
36
+ merge(publicInput: StateTransitionProverPublicInput, proof1: StateTransitionProof, proof2: StateTransitionProof): StateTransitionProverPublicOutput;
37
+ }
38
+ export {};
39
+ //# sourceMappingURL=StateTransitionProver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionProver.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAuB,MAAM,UAAU,CAAC;AAOpE,OAAO,EAEL,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAIxF,OAAO,EAEL,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,oBAAoB,EACpB,iCAAiC,EAClC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC;AAmBpG,UAAU,mCAAmC;IAC3C,SAAS,EAAE,KAAK,CAAC;IACjB,mBAAmB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;CAChE;AAOD;;;GAGG;AACH,qBACa,qBACX,SAAQ,cAAc,CACpB,gCAAgC,EAChC,iCAAiC,CAEnC,YAAW,uBAAuB;aAIhB,wBAAwB,EAAE,uCAAuC;gBAAjE,wBAAwB,EAAE,uCAAuC;IAK5E,gBAAgB,IAAI,cAAc,CACvC,gCAAgC,EAChC,iCAAiC,CAClC;IAmDD,OAAO,KAAK,eAAe,GAM1B;IAED;;;OAGG;IACI,gBAAgB,CACrB,SAAS,EAAE,KAAK,EAChB,6BAA6B,EAAE,KAAK,EACpC,eAAe,EAAE,4BAA4B,GAC5C,mCAAmC;IAsBtC;;;OAGG;IACI,eAAe,CACpB,KAAK,EAAE,mCAAmC,EAC1C,UAAU,EAAE,uBAAuB,EACnC,KAAK,SAAI;IAqCX;;OAEG;IAEI,QAAQ,CACb,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,GAClC,iCAAiC;IAiB7B,KAAK,CACV,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,GAC3B,iCAAiC;CA6BrC"}
@@ -0,0 +1,157 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Experimental, Field, Provable, SelfProof } from "snarkyjs";
11
+ import { injectable } from "tsyringe";
12
+ import { MerkleTreeUtils, RollupMerkleWitness, } from "../../utils/merkletree/RollupMerkleTree.js";
13
+ import { DefaultProvableHashList, } from "../../utils/ProvableHashList";
14
+ import { ProvableStateTransition } from "../../model/StateTransition";
15
+ import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
16
+ import { constants } from "../../Constants";
17
+ import { provableMethod, } from "@proto-kit/common";
18
+ import { StateTransitionProverPublicInput, StateTransitionProverPublicOutput, } from "./StateTransitionProvable";
19
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
20
+ import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
21
+ const errors = {
22
+ stateRootNotMatching: (step) => `StateRoots not matching ${step}`,
23
+ stateTransitionsHashNotMatching: (step) => `State transitions hash not matching ${step}`,
24
+ merkleWitnessNotCorrect: (index) => `MerkleWitness not valid for StateTransition (${index})`,
25
+ noWitnessProviderSet: () => new Error("WitnessProvider not set, set it before you use StateTransitionProvider"),
26
+ propertyNotMatching: (propertyName) => `${propertyName} not matching`,
27
+ };
28
+ const StateTransitionSelfProofClass = (SelfProof);
29
+ /**
30
+ * StateTransitionProver is the prover that proves the application of some state
31
+ * transitions and checks and updates their merkle-tree entries
32
+ */
33
+ let StateTransitionProver = class StateTransitionProver extends ProtocolModule {
34
+ constructor(
35
+ // Injected
36
+ witnessProviderReference) {
37
+ super();
38
+ this.witnessProviderReference = witnessProviderReference;
39
+ }
40
+ zkProgramFactory() {
41
+ const instance = this;
42
+ const program = Experimental.ZkProgram({
43
+ publicInput: StateTransitionProverPublicInput,
44
+ publicOutput: StateTransitionProverPublicOutput,
45
+ methods: {
46
+ proveBatch: {
47
+ privateInputs: [StateTransitionProvableBatch],
48
+ method(publicInput, batch) {
49
+ return instance.runBatch(publicInput, batch);
50
+ },
51
+ },
52
+ merge: {
53
+ privateInputs: [
54
+ StateTransitionSelfProofClass,
55
+ StateTransitionSelfProofClass,
56
+ ],
57
+ method(publicInput, proof1, proof2) {
58
+ return instance.merge(publicInput, proof1, proof2);
59
+ },
60
+ },
61
+ },
62
+ });
63
+ const methods = {
64
+ proveBatch: program.proveBatch.bind(program),
65
+ merge: program.merge.bind(program),
66
+ };
67
+ const SelfProofClass = Experimental.ZkProgram.Proof(program);
68
+ return {
69
+ compile: program.compile.bind(program),
70
+ verify: program.verify.bind(program),
71
+ Proof: SelfProofClass,
72
+ methods,
73
+ };
74
+ }
75
+ get witnessProvider() {
76
+ const provider = this.witnessProviderReference.getWitnessProvider();
77
+ if (provider === undefined) {
78
+ throw errors.noWitnessProviderSet();
79
+ }
80
+ return provider;
81
+ }
82
+ /**
83
+ * Applies the state transitions to the current stateRoot
84
+ * and returns the new prover state
85
+ */
86
+ applyTransitions(stateRoot, stateTransitionCommitmentFrom, transitionBatch) {
87
+ const state = {
88
+ stateRoot,
89
+ stateTransitionList: new DefaultProvableHashList(ProvableStateTransition, stateTransitionCommitmentFrom),
90
+ };
91
+ const transitions = transitionBatch.batch;
92
+ for (let index = 0; index < constants.stateTransitionProverBatchSize; index++) {
93
+ this.applyTransition(state, transitions[index], index);
94
+ }
95
+ return state;
96
+ }
97
+ /**
98
+ * Applies a single state transition to the given state
99
+ * and mutates it in place
100
+ */
101
+ applyTransition(state, transition, index = 0) {
102
+ const treeWitness = Provable.witness(RollupMerkleWitness, () => this.witnessProvider.getWitness(transition.path));
103
+ Provable.log(`ST (${index})`, state.stateRoot, " value: ", transition.from.value);
104
+ const membershipValid = MerkleTreeUtils.checkMembership(treeWitness, state.stateRoot, transition.path, transition.from.value);
105
+ membershipValid
106
+ .or(transition.from.isSome.not())
107
+ .assertTrue(errors.merkleWitnessNotCorrect(index));
108
+ const newRoot = MerkleTreeUtils.computeRoot(treeWitness, transition.to.value);
109
+ state.stateRoot = Provable.if(transition.to.isSome, newRoot, state.stateRoot);
110
+ state.stateTransitionList.pushIf(transition, transition.path.equals(Field(0)).not());
111
+ }
112
+ /**
113
+ * Applies a whole batch of StateTransitions at once
114
+ */
115
+ runBatch(publicInput, batch) {
116
+ Provable.log(publicInput);
117
+ const result = this.applyTransitions(publicInput.stateRoot, publicInput.stateTransitionsHash, batch);
118
+ const output = new StateTransitionProverPublicOutput({
119
+ stateRoot: result.stateRoot,
120
+ stateTransitionsHash: result.stateTransitionList.commitment,
121
+ });
122
+ Provable.log(output);
123
+ return output;
124
+ }
125
+ merge(publicInput, proof1, proof2) {
126
+ proof1.verify();
127
+ proof2.verify();
128
+ // Check state
129
+ publicInput.stateRoot.assertEquals(proof1.publicInput.stateRoot, errors.stateRootNotMatching("publicInput.from -> proof1.from"));
130
+ proof1.publicOutput.stateRoot.assertEquals(proof2.publicInput.stateRoot, errors.stateRootNotMatching("proof1.to -> proof2.from"));
131
+ // Check ST list
132
+ publicInput.stateTransitionsHash.assertEquals(proof1.publicInput.stateTransitionsHash, errors.stateTransitionsHashNotMatching("publicInput.from -> proof1.from"));
133
+ proof1.publicOutput.stateTransitionsHash.assertEquals(proof2.publicInput.stateTransitionsHash, errors.stateTransitionsHashNotMatching("proof1.to -> proof2.from"));
134
+ return new StateTransitionProverPublicInput({
135
+ stateRoot: proof2.publicOutput.stateRoot,
136
+ stateTransitionsHash: proof2.publicOutput.stateTransitionsHash,
137
+ });
138
+ }
139
+ };
140
+ __decorate([
141
+ provableMethod(),
142
+ __metadata("design:type", Function),
143
+ __metadata("design:paramtypes", [StateTransitionProverPublicInput,
144
+ StateTransitionProvableBatch]),
145
+ __metadata("design:returntype", StateTransitionProverPublicOutput)
146
+ ], StateTransitionProver.prototype, "runBatch", null);
147
+ __decorate([
148
+ provableMethod(),
149
+ __metadata("design:type", Function),
150
+ __metadata("design:paramtypes", [StateTransitionProverPublicInput, Object, Object]),
151
+ __metadata("design:returntype", StateTransitionProverPublicOutput)
152
+ ], StateTransitionProver.prototype, "merge", null);
153
+ StateTransitionProver = __decorate([
154
+ injectable(),
155
+ __metadata("design:paramtypes", [StateTransitionWitnessProviderReference])
156
+ ], StateTransitionProver);
157
+ export { StateTransitionProver };
@@ -0,0 +1,16 @@
1
+ import type { Field } from "snarkyjs";
2
+ import { RollupMerkleWitness } from "../../utils/merkletree/RollupMerkleTree.js";
3
+ /**
4
+ * Interface for providing merkle witnesses to the state-transition prover
5
+ */
6
+ export interface StateTransitionWitnessProvider {
7
+ /**
8
+ * Provides the merkle witness corresponding to the given key
9
+ * @param key Merkle-tree key
10
+ */
11
+ getWitness: (key: Field) => RollupMerkleWitness;
12
+ }
13
+ export declare class NoOpStateTransitionWitnessProvider implements StateTransitionWitnessProvider {
14
+ getWitness(key: Field): RollupMerkleWitness;
15
+ }
16
+ //# sourceMappingURL=StateTransitionWitnessProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionWitnessProvider.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionWitnessProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;;OAGG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,mBAAmB,CAAC;CACjD;AAED,qBACa,kCACX,YAAW,8BAA8B;IAElC,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,mBAAmB;CAGnD"}
@@ -0,0 +1,17 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { injectable } from "tsyringe";
8
+ import { RollupMerkleWitness } from "../../utils/merkletree/RollupMerkleTree.js";
9
+ let NoOpStateTransitionWitnessProvider = class NoOpStateTransitionWitnessProvider {
10
+ getWitness(key) {
11
+ return new RollupMerkleWitness({ path: [], isLeft: [] });
12
+ }
13
+ };
14
+ NoOpStateTransitionWitnessProvider = __decorate([
15
+ injectable()
16
+ ], NoOpStateTransitionWitnessProvider);
17
+ export { NoOpStateTransitionWitnessProvider };
@@ -0,0 +1,7 @@
1
+ import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
2
+ export declare class StateTransitionWitnessProviderReference {
3
+ private witnessProvider?;
4
+ setWitnessProvider(provider: StateTransitionWitnessProvider): void;
5
+ getWitnessProvider(): StateTransitionWitnessProvider | undefined;
6
+ }
7
+ //# sourceMappingURL=StateTransitionWitnessProviderReference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionWitnessProviderReference.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionWitnessProviderReference.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAElF,qBAEa,uCAAuC;IAElD,OAAO,CAAC,eAAe,CAAC,CAAiC;IAElD,kBAAkB,CAAC,QAAQ,EAAE,8BAA8B;IAI3D,kBAAkB,IAAI,8BAA8B,GAAG,SAAS;CAGxE"}
@@ -0,0 +1,20 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { injectable, Lifecycle, scoped } from "tsyringe";
8
+ let StateTransitionWitnessProviderReference = class StateTransitionWitnessProviderReference {
9
+ setWitnessProvider(provider) {
10
+ this.witnessProvider = provider;
11
+ }
12
+ getWitnessProvider() {
13
+ return this.witnessProvider;
14
+ }
15
+ };
16
+ StateTransitionWitnessProviderReference = __decorate([
17
+ injectable(),
18
+ scoped(Lifecycle.ContainerScoped)
19
+ ], StateTransitionWitnessProviderReference);
20
+ export { StateTransitionWitnessProviderReference };