@proto-kit/protocol 0.1.1-develop.1086

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 (251) 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/hooks/AccountStateHook.d.ts +52 -0
  7. package/dist/hooks/AccountStateHook.d.ts.map +1 -0
  8. package/dist/hooks/AccountStateHook.js +47 -0
  9. package/dist/hooks/BlockHeightHook.d.ts +7 -0
  10. package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
  11. package/dist/hooks/BlockHeightHook.js +15 -0
  12. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  13. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  14. package/dist/hooks/LastStateRootBlockHook.js +15 -0
  15. package/dist/hooks/NoopBlockHook.d.ts +9 -0
  16. package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
  17. package/dist/hooks/NoopBlockHook.js +9 -0
  18. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  19. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  20. package/dist/hooks/NoopSettlementHook.js +17 -0
  21. package/dist/hooks/NoopTransactionHook.d.ts +6 -0
  22. package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
  23. package/dist/hooks/NoopTransactionHook.js +7 -0
  24. package/dist/index.d.ts +54 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +53 -0
  27. package/dist/model/MethodPublicOutput.d.ts +113 -0
  28. package/dist/model/MethodPublicOutput.d.ts.map +1 -0
  29. package/dist/model/MethodPublicOutput.js +14 -0
  30. package/dist/model/Option.d.ts +122 -0
  31. package/dist/model/Option.d.ts.map +1 -0
  32. package/dist/model/Option.js +110 -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 +42 -0
  36. package/dist/model/RuntimeLike.d.ts +11 -0
  37. package/dist/model/RuntimeLike.d.ts.map +1 -0
  38. package/dist/model/RuntimeLike.js +1 -0
  39. package/dist/model/StateTransition.d.ts +135 -0
  40. package/dist/model/StateTransition.d.ts.map +1 -0
  41. package/dist/model/StateTransition.js +68 -0
  42. package/dist/model/StateTransitionProvableBatch.d.ts +172 -0
  43. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
  44. package/dist/model/StateTransitionProvableBatch.js +85 -0
  45. package/dist/model/network/NetworkState.d.ts +160 -0
  46. package/dist/model/network/NetworkState.d.ts.map +1 -0
  47. package/dist/model/network/NetworkState.js +31 -0
  48. package/dist/model/transaction/RuntimeTransaction.d.ts +122 -0
  49. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
  50. package/dist/model/transaction/RuntimeTransaction.js +86 -0
  51. package/dist/model/transaction/SignedTransaction.d.ts +107 -0
  52. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
  53. package/dist/model/transaction/SignedTransaction.js +33 -0
  54. package/dist/model/transaction/ValueOption.d.ts +173 -0
  55. package/dist/model/transaction/ValueOption.d.ts.map +1 -0
  56. package/dist/model/transaction/ValueOption.js +24 -0
  57. package/dist/protocol/Protocol.d.ts +43 -0
  58. package/dist/protocol/Protocol.d.ts.map +1 -0
  59. package/dist/protocol/Protocol.js +95 -0
  60. package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
  61. package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
  62. package/dist/protocol/ProtocolEnvironment.js +1 -0
  63. package/dist/protocol/ProtocolModule.d.ts +9 -0
  64. package/dist/protocol/ProtocolModule.d.ts.map +1 -0
  65. package/dist/protocol/ProtocolModule.js +12 -0
  66. package/dist/protocol/ProvableBlockHook.d.ts +8 -0
  67. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
  68. package/dist/protocol/ProvableBlockHook.js +4 -0
  69. package/dist/protocol/ProvableTransactionHook.d.ts +7 -0
  70. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
  71. package/dist/protocol/ProvableTransactionHook.js +3 -0
  72. package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
  73. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
  74. package/dist/protocol/TransitioningProtocolModule.js +8 -0
  75. package/dist/prover/block/BlockProvable.d.ts +395 -0
  76. package/dist/prover/block/BlockProvable.d.ts.map +1 -0
  77. package/dist/prover/block/BlockProvable.js +45 -0
  78. package/dist/prover/block/BlockProver.d.ts +92 -0
  79. package/dist/prover/block/BlockProver.d.ts.map +1 -0
  80. package/dist/prover/block/BlockProver.js +472 -0
  81. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +64 -0
  82. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
  83. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
  84. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
  85. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
  86. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +20 -0
  87. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
  88. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
  89. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +22 -0
  90. package/dist/prover/statetransition/StateTransitionProvable.d.ts +174 -0
  91. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
  92. package/dist/prover/statetransition/StateTransitionProvable.js +15 -0
  93. package/dist/prover/statetransition/StateTransitionProver.d.ts +51 -0
  94. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
  95. package/dist/prover/statetransition/StateTransitionProver.js +188 -0
  96. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +16 -0
  97. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +1 -0
  98. package/dist/prover/statetransition/StateTransitionWitnessProvider.js +16 -0
  99. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +7 -0
  100. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +1 -0
  101. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +19 -0
  102. package/dist/settlement/ContractModule.d.ts +15 -0
  103. package/dist/settlement/ContractModule.d.ts.map +1 -0
  104. package/dist/settlement/ContractModule.js +11 -0
  105. package/dist/settlement/SettlementContractModule.d.ts +40 -0
  106. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  107. package/dist/settlement/SettlementContractModule.js +71 -0
  108. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
  109. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  110. package/dist/settlement/contracts/DispatchContractProtocolModule.js +35 -0
  111. package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
  112. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  113. package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
  114. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
  115. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  116. package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
  117. package/dist/settlement/contracts/SettlementSmartContract.d.ts +42 -0
  118. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  119. package/dist/settlement/contracts/SettlementSmartContract.js +241 -0
  120. package/dist/settlement/messages/Deposit.d.ts +64 -0
  121. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  122. package/dist/settlement/messages/Deposit.js +6 -0
  123. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +189 -0
  124. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  125. package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
  126. package/dist/settlement/messages/Withdrawal.d.ts +65 -0
  127. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  128. package/dist/settlement/messages/Withdrawal.js +13 -0
  129. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
  130. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  131. package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
  132. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  133. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  134. package/dist/settlement/modules/NetworkStateSettlementModule.js +14 -0
  135. package/dist/state/State.d.ts +68 -0
  136. package/dist/state/State.d.ts.map +1 -0
  137. package/dist/state/State.js +129 -0
  138. package/dist/state/StateMap.d.ts +37 -0
  139. package/dist/state/StateMap.d.ts.map +1 -0
  140. package/dist/state/StateMap.js +55 -0
  141. package/dist/state/StateService.d.ts +6 -0
  142. package/dist/state/StateService.d.ts.map +1 -0
  143. package/dist/state/StateService.js +1 -0
  144. package/dist/state/StateServiceProvider.d.ts +8 -0
  145. package/dist/state/StateServiceProvider.d.ts.map +1 -0
  146. package/dist/state/StateServiceProvider.js +36 -0
  147. package/dist/state/assert/assert.d.ts +12 -0
  148. package/dist/state/assert/assert.d.ts.map +1 -0
  149. package/dist/state/assert/assert.js +30 -0
  150. package/dist/state/context/ProtocolMethodExecutionContext.d.ts +22 -0
  151. package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +1 -0
  152. package/dist/state/context/ProtocolMethodExecutionContext.js +28 -0
  153. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
  154. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
  155. package/dist/state/context/RuntimeMethodExecutionContext.js +135 -0
  156. package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
  157. package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
  158. package/dist/state/context/TransitionMethodExecutionContext.js +5 -0
  159. package/dist/state/protocol/ProtocolState.d.ts +7 -0
  160. package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
  161. package/dist/state/protocol/ProtocolState.js +39 -0
  162. package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
  163. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  164. package/dist/utils/MinaPrefixedProvableHashList.js +52 -0
  165. package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
  166. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
  167. package/dist/utils/PrefixedProvableHashList.js +12 -0
  168. package/dist/utils/ProvableHashList.d.ts +27 -0
  169. package/dist/utils/ProvableHashList.d.ts.map +1 -0
  170. package/dist/utils/ProvableHashList.js +43 -0
  171. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  172. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  173. package/dist/utils/ProvableReductionHashList.js +50 -0
  174. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  175. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  176. package/dist/utils/StateTransitionReductionList.js +60 -0
  177. package/dist/utils/utils.d.ts +11 -0
  178. package/dist/utils/utils.d.ts.map +1 -0
  179. package/dist/utils/utils.js +44 -0
  180. package/jest.config.cjs +1 -0
  181. package/package.json +36 -0
  182. package/src/Constants.ts +3 -0
  183. package/src/hooks/AccountStateHook.ts +48 -0
  184. package/src/hooks/BlockHeightHook.ts +17 -0
  185. package/src/hooks/LastStateRootBlockHook.ts +26 -0
  186. package/src/hooks/NoopBlockHook.ts +21 -0
  187. package/src/hooks/NoopSettlementHook.ts +20 -0
  188. package/src/hooks/NoopTransactionHook.ts +10 -0
  189. package/src/index.ts +53 -0
  190. package/src/model/MethodPublicOutput.ts +14 -0
  191. package/src/model/Option.ts +172 -0
  192. package/src/model/Path.ts +50 -0
  193. package/src/model/RuntimeLike.ts +12 -0
  194. package/src/model/StateTransition.ts +88 -0
  195. package/src/model/StateTransitionProvableBatch.ts +125 -0
  196. package/src/model/Transaction.ts +31 -0
  197. package/src/model/network/NetworkState.ts +33 -0
  198. package/src/model/transaction/RuntimeTransaction.ts +105 -0
  199. package/src/model/transaction/SignedTransaction.ts +47 -0
  200. package/src/model/transaction/ValueOption.ts +28 -0
  201. package/src/protocol/Protocol.ts +197 -0
  202. package/src/protocol/ProtocolEnvironment.ts +10 -0
  203. package/src/protocol/ProtocolModule.ts +27 -0
  204. package/src/protocol/ProvableBlockHook.ts +19 -0
  205. package/src/protocol/ProvableTransactionHook.ts +13 -0
  206. package/src/protocol/TransitioningProtocolModule.ts +12 -0
  207. package/src/prover/block/BlockProvable.ts +99 -0
  208. package/src/prover/block/BlockProver.ts +954 -0
  209. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
  210. package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
  211. package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
  212. package/src/prover/statetransition/StateTransitionProvable.ts +44 -0
  213. package/src/prover/statetransition/StateTransitionProver.ts +371 -0
  214. package/src/prover/statetransition/StateTransitionWitnessProvider.ts +23 -0
  215. package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +17 -0
  216. package/src/settlement/ContractModule.ts +24 -0
  217. package/src/settlement/SettlementContractModule.ts +132 -0
  218. package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
  219. package/src/settlement/contracts/DispatchSmartContract.ts +136 -0
  220. package/src/settlement/contracts/SettlementContractProtocolModule.ts +67 -0
  221. package/src/settlement/contracts/SettlementSmartContract.ts +344 -0
  222. package/src/settlement/messages/Deposit.ts +6 -0
  223. package/src/settlement/messages/OutgoingMessageArgument.ts +42 -0
  224. package/src/settlement/messages/Withdrawal.ts +14 -0
  225. package/src/settlement/modularity/ProvableSettlementHook.ts +33 -0
  226. package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
  227. package/src/state/State.ts +175 -0
  228. package/src/state/StateMap.ts +73 -0
  229. package/src/state/StateService.ts +6 -0
  230. package/src/state/StateServiceProvider.ts +37 -0
  231. package/src/state/assert/assert.ts +35 -0
  232. package/src/state/context/RuntimeMethodExecutionContext.ts +174 -0
  233. package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
  234. package/src/state/protocol/ProtocolState.ts +61 -0
  235. package/src/utils/MinaPrefixedProvableHashList.ts +73 -0
  236. package/src/utils/PrefixedProvableHashList.ts +21 -0
  237. package/src/utils/ProvableHashList.ts +50 -0
  238. package/src/utils/ProvableReductionHashList.ts +68 -0
  239. package/src/utils/StateTransitionReductionList.ts +89 -0
  240. package/src/utils/utils.ts +75 -0
  241. package/test/BlockProver.test.ts +211 -0
  242. package/test/Protocol.test.ts +37 -0
  243. package/test/State.test.ts +45 -0
  244. package/test/StateTransition.test.ts +174 -0
  245. package/test/TestingProtocol.ts +47 -0
  246. package/test/model/Option.test.ts +72 -0
  247. package/test/state/assert/assert.test.ts +56 -0
  248. package/test/tsconfig.json +7 -0
  249. package/test/utils/ProvableReductionHashList.test.ts +117 -0
  250. package/test/utils.test.ts +27 -0
  251. package/tsconfig.json +8 -0
@@ -0,0 +1,16 @@
1
+ import { createMerkleTree } from "@proto-kit/common";
2
+ import { Bool, Field, Poseidon, Struct } from "o1js";
3
+
4
+ export class BlockHashMerkleTree extends createMerkleTree(40) {}
5
+ export class BlockHashMerkleTreeWitness extends BlockHashMerkleTree.WITNESS {}
6
+
7
+ export class BlockHashTreeEntry extends Struct({
8
+ blockHash: Field,
9
+ closed: Bool,
10
+ // TODO We could add startingEternalTransactionsHash here to offer
11
+ // a more trivial connection to the sequence state
12
+ }) {
13
+ public hash(): Field {
14
+ return Poseidon.hash([this.blockHash, ...this.closed.toFields()]);
15
+ }
16
+ }
@@ -0,0 +1,24 @@
1
+ import { createMerkleTree } from "@proto-kit/common";
2
+ import { Field, Poseidon, Struct, VerificationKey } from "o1js";
3
+
4
+ export const treeFeeHeight = 10;
5
+ export class VKTree extends createMerkleTree(treeFeeHeight) {}
6
+ export class VKTreeWitness extends VKTree.WITNESS {}
7
+
8
+ export class RuntimeVerificationKeyAttestation extends Struct({
9
+ verificationKey: VerificationKey,
10
+ witness: VKTreeWitness,
11
+ }) {}
12
+
13
+ export class MethodVKConfigData extends Struct({
14
+ methodId: Field,
15
+ vkHash: Field,
16
+ }) {
17
+ public hash() {
18
+ return Poseidon.hash(MethodVKConfigData.toFields(this));
19
+ }
20
+ }
21
+
22
+ export interface MinimalVKTreeService {
23
+ getRoot: () => bigint;
24
+ }
@@ -0,0 +1,20 @@
1
+ import { injectable, Lifecycle, scoped } from "tsyringe";
2
+
3
+ import { MinimalVKTreeService } from "../accummulators/RuntimeVerificationKeyTree";
4
+
5
+ @injectable()
6
+ @scoped(Lifecycle.ContainerScoped)
7
+ export class RuntimeVerificationKeyRootService implements MinimalVKTreeService {
8
+ private injectedRoot?: bigint;
9
+
10
+ public setRoot(root: bigint) {
11
+ this.injectedRoot = root;
12
+ }
13
+
14
+ public getRoot() {
15
+ if (this.injectedRoot === undefined) {
16
+ throw new Error("VKTree root not set");
17
+ }
18
+ return this.injectedRoot;
19
+ }
20
+ }
@@ -0,0 +1,44 @@
1
+ import { Field, Proof, Struct } from "o1js";
2
+ import { WithZkProgrammable } from "@proto-kit/common";
3
+
4
+ import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
5
+
6
+ import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
7
+
8
+ export class StateTransitionProverPublicInput extends Struct({
9
+ stateTransitionsHash: Field,
10
+ protocolTransitionsHash: Field,
11
+ stateRoot: Field,
12
+ protocolStateRoot: Field,
13
+ }) {}
14
+
15
+ export class StateTransitionProverPublicOutput extends Struct({
16
+ stateTransitionsHash: Field,
17
+ protocolTransitionsHash: Field,
18
+ stateRoot: Field,
19
+ protocolStateRoot: Field,
20
+ }) {}
21
+
22
+ export type StateTransitionProof = Proof<
23
+ StateTransitionProverPublicInput,
24
+ StateTransitionProverPublicOutput
25
+ >;
26
+
27
+ export interface StateTransitionProvable
28
+ extends WithZkProgrammable<
29
+ StateTransitionProverPublicInput,
30
+ StateTransitionProverPublicOutput
31
+ > {
32
+ witnessProviderReference: StateTransitionWitnessProviderReference;
33
+
34
+ runBatch: (
35
+ publicInput: StateTransitionProverPublicInput,
36
+ batch: StateTransitionProvableBatch
37
+ ) => Promise<StateTransitionProverPublicOutput>;
38
+
39
+ merge: (
40
+ publicInput: StateTransitionProverPublicInput,
41
+ proof1: StateTransitionProof,
42
+ proof2: StateTransitionProof
43
+ ) => Promise<StateTransitionProverPublicOutput>;
44
+ }
@@ -0,0 +1,371 @@
1
+ import {
2
+ AreProofsEnabled,
3
+ PlainZkProgram,
4
+ provableMethod,
5
+ RollupMerkleTreeWitness,
6
+ ZkProgrammable,
7
+ } from "@proto-kit/common";
8
+ import { Field, Provable, SelfProof, ZkProgram } from "o1js";
9
+ import { injectable } from "tsyringe";
10
+
11
+ import { constants } from "../../Constants";
12
+ import { ProvableStateTransition } from "../../model/StateTransition";
13
+ import {
14
+ ProvableStateTransitionType,
15
+ StateTransitionProvableBatch,
16
+ } from "../../model/StateTransitionProvableBatch";
17
+ import { StateTransitionProverType } from "../../protocol/Protocol";
18
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
19
+ import {
20
+ DefaultProvableHashList,
21
+ ProvableHashList,
22
+ } from "../../utils/ProvableHashList";
23
+
24
+ import {
25
+ StateTransitionProof,
26
+ StateTransitionProvable,
27
+ StateTransitionProverPublicInput,
28
+ StateTransitionProverPublicOutput,
29
+ } from "./StateTransitionProvable";
30
+ import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
31
+ import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
32
+
33
+ const errors = {
34
+ propertyNotMatching: (property: string, step: string) =>
35
+ `${property} not matching ${step}`,
36
+
37
+ merkleWitnessNotCorrect: (index: number, type: string) =>
38
+ `MerkleWitness not valid for StateTransition (${index}, type ${type})`,
39
+
40
+ noWitnessProviderSet: () =>
41
+ new Error(
42
+ "WitnessProvider not set, set it before you use StateTransitionProvider"
43
+ ),
44
+ };
45
+
46
+ interface StateTransitionProverExecutionState {
47
+ stateRoot: Field;
48
+ protocolStateRoot: Field;
49
+ stateTransitionList: ProvableHashList<ProvableStateTransition>;
50
+ protocolTransitionList: ProvableHashList<ProvableStateTransition>;
51
+ }
52
+
53
+ const StateTransitionSelfProofClass = SelfProof<
54
+ StateTransitionProverPublicInput,
55
+ StateTransitionProverPublicOutput
56
+ >;
57
+
58
+ /**
59
+ * StateTransitionProver is the prover that proves the application of some state
60
+ * transitions and checks and updates their merkle-tree entries
61
+ */
62
+ export class StateTransitionProverProgrammable extends ZkProgrammable<
63
+ StateTransitionProverPublicInput,
64
+ StateTransitionProverPublicOutput
65
+ > {
66
+ public constructor(
67
+ private readonly stateTransitionProver: StateTransitionProver,
68
+ public readonly witnessProviderReference: StateTransitionWitnessProviderReference
69
+ ) {
70
+ super();
71
+ }
72
+
73
+ public get appChain(): AreProofsEnabled | undefined {
74
+ return this.stateTransitionProver.appChain;
75
+ }
76
+
77
+ public zkProgramFactory(): PlainZkProgram<
78
+ StateTransitionProverPublicInput,
79
+ StateTransitionProverPublicOutput
80
+ >[] {
81
+ const instance = this;
82
+
83
+ const program = ZkProgram({
84
+ name: "StateTransitionProver",
85
+ publicInput: StateTransitionProverPublicInput,
86
+ publicOutput: StateTransitionProverPublicOutput,
87
+
88
+ methods: {
89
+ proveBatch: {
90
+ privateInputs: [StateTransitionProvableBatch],
91
+
92
+ async method(
93
+ publicInput: StateTransitionProverPublicInput,
94
+ batch: StateTransitionProvableBatch
95
+ ) {
96
+ return await instance.runBatch(publicInput, batch);
97
+ },
98
+ },
99
+
100
+ merge: {
101
+ privateInputs: [
102
+ StateTransitionSelfProofClass,
103
+ StateTransitionSelfProofClass,
104
+ ],
105
+
106
+ async method(
107
+ publicInput: StateTransitionProverPublicInput,
108
+ proof1: StateTransitionProof,
109
+ proof2: StateTransitionProof
110
+ ) {
111
+ return await instance.merge(publicInput, proof1, proof2);
112
+ },
113
+ },
114
+ },
115
+ });
116
+
117
+ const methods = {
118
+ proveBatch: program.proveBatch.bind(program),
119
+ merge: program.merge.bind(program),
120
+ };
121
+
122
+ const SelfProofClass = ZkProgram.Proof(program);
123
+
124
+ return [
125
+ {
126
+ compile: program.compile.bind(program),
127
+ verify: program.verify.bind(program),
128
+ analyzeMethods: program.analyzeMethods.bind(program),
129
+ Proof: SelfProofClass,
130
+ methods,
131
+ },
132
+ ];
133
+ }
134
+
135
+ private get witnessProvider(): StateTransitionWitnessProvider {
136
+ const provider = this.witnessProviderReference.getWitnessProvider();
137
+ if (provider === undefined) {
138
+ throw errors.noWitnessProviderSet();
139
+ }
140
+ return provider;
141
+ }
142
+
143
+ /**
144
+ * Applies the state transitions to the current stateRoot
145
+ * and returns the new prover state
146
+ */
147
+ public applyTransitions(
148
+ stateRoot: Field,
149
+ protocolStateRoot: Field,
150
+ stateTransitionCommitmentFrom: Field,
151
+ protocolTransitionCommitmentFrom: Field,
152
+ transitionBatch: StateTransitionProvableBatch
153
+ ): StateTransitionProverExecutionState {
154
+ const state: StateTransitionProverExecutionState = {
155
+ stateRoot,
156
+ protocolStateRoot,
157
+
158
+ stateTransitionList: new DefaultProvableHashList(
159
+ ProvableStateTransition,
160
+ stateTransitionCommitmentFrom
161
+ ),
162
+
163
+ protocolTransitionList: new DefaultProvableHashList(
164
+ ProvableStateTransition,
165
+ protocolTransitionCommitmentFrom
166
+ ),
167
+ };
168
+
169
+ const transitions = transitionBatch.batch;
170
+ const types = transitionBatch.transitionTypes;
171
+ for (
172
+ let index = 0;
173
+ index < constants.stateTransitionProverBatchSize;
174
+ index++
175
+ ) {
176
+ this.applyTransition(state, transitions[index], types[index], index);
177
+ }
178
+
179
+ return state;
180
+ }
181
+
182
+ /**
183
+ * Applies a single state transition to the given state
184
+ * and mutates it in place
185
+ */
186
+ public applyTransition(
187
+ state: StateTransitionProverExecutionState,
188
+ transition: ProvableStateTransition,
189
+ type: ProvableStateTransitionType,
190
+ index = 0
191
+ ) {
192
+ const witness = Provable.witness(RollupMerkleTreeWitness, () =>
193
+ this.witnessProvider.getWitness(transition.path)
194
+ );
195
+
196
+ const membershipValid = witness.checkMembership(
197
+ state.stateRoot,
198
+ transition.path,
199
+ transition.from.value
200
+ );
201
+
202
+ membershipValid
203
+ .or(transition.from.isSome.not())
204
+ .assertTrue(
205
+ errors.merkleWitnessNotCorrect(
206
+ index,
207
+ type.isNormal().toBoolean() ? "normal" : "protocol"
208
+ )
209
+ );
210
+
211
+ const newRoot = witness.calculateRoot(transition.to.value);
212
+
213
+ state.stateRoot = Provable.if(
214
+ transition.to.isSome,
215
+ newRoot,
216
+ state.stateRoot
217
+ );
218
+
219
+ // Only update protocol state root if ST is also of type protocol
220
+ // Since protocol STs are all at the start of the batch, this works
221
+ state.protocolStateRoot = Provable.if(
222
+ transition.to.isSome.and(type.isProtocol()),
223
+ newRoot,
224
+ state.protocolStateRoot
225
+ );
226
+
227
+ const isNotDummy = transition.path.equals(Field(0)).not();
228
+
229
+ state.stateTransitionList.pushIf(
230
+ transition,
231
+ isNotDummy.and(type.isNormal())
232
+ );
233
+ state.protocolTransitionList.pushIf(
234
+ transition,
235
+ isNotDummy.and(type.isProtocol())
236
+ );
237
+ }
238
+
239
+ /**
240
+ * Applies a whole batch of StateTransitions at once
241
+ */
242
+ @provableMethod()
243
+ public async runBatch(
244
+ publicInput: StateTransitionProverPublicInput,
245
+ batch: StateTransitionProvableBatch
246
+ ): Promise<StateTransitionProverPublicOutput> {
247
+ const result = this.applyTransitions(
248
+ publicInput.stateRoot,
249
+ publicInput.protocolStateRoot,
250
+ publicInput.stateTransitionsHash,
251
+ publicInput.protocolTransitionsHash,
252
+ batch
253
+ );
254
+
255
+ return new StateTransitionProverPublicOutput({
256
+ stateRoot: result.stateRoot,
257
+ stateTransitionsHash: result.stateTransitionList.commitment,
258
+ protocolTransitionsHash: result.protocolTransitionList.commitment,
259
+ protocolStateRoot: result.protocolStateRoot,
260
+ });
261
+ }
262
+
263
+ @provableMethod()
264
+ public async merge(
265
+ publicInput: StateTransitionProverPublicInput,
266
+ proof1: StateTransitionProof,
267
+ proof2: StateTransitionProof
268
+ ): Promise<StateTransitionProverPublicOutput> {
269
+ proof1.verify();
270
+ proof2.verify();
271
+
272
+ // Check state
273
+ publicInput.stateRoot.assertEquals(
274
+ proof1.publicInput.stateRoot,
275
+ errors.propertyNotMatching("stateRoot", "publicInput.from -> proof1.from")
276
+ );
277
+ proof1.publicOutput.stateRoot.assertEquals(
278
+ proof2.publicInput.stateRoot,
279
+ errors.propertyNotMatching("stateRoot", "proof1.to -> proof2.from")
280
+ );
281
+
282
+ // Check ST list
283
+ publicInput.stateTransitionsHash.assertEquals(
284
+ proof1.publicInput.stateTransitionsHash,
285
+ errors.propertyNotMatching(
286
+ "stateTransitionsHash",
287
+ "publicInput.from -> proof1.from"
288
+ )
289
+ );
290
+ proof1.publicOutput.stateTransitionsHash.assertEquals(
291
+ proof2.publicInput.stateTransitionsHash,
292
+ errors.propertyNotMatching(
293
+ "stateTransitionsHash",
294
+ "proof1.to -> proof2.from"
295
+ )
296
+ );
297
+
298
+ // Check Protocol ST list
299
+ publicInput.protocolTransitionsHash.assertEquals(
300
+ proof1.publicInput.protocolTransitionsHash,
301
+ errors.propertyNotMatching(
302
+ "protocolTransitionsHash",
303
+ "publicInput.from -> proof1.from"
304
+ )
305
+ );
306
+ proof1.publicOutput.protocolTransitionsHash.assertEquals(
307
+ proof2.publicInput.protocolTransitionsHash,
308
+ errors.propertyNotMatching(
309
+ "protocolTransitionsHash",
310
+ "proof1.to -> proof2.from"
311
+ )
312
+ );
313
+
314
+ // Check protocol state root
315
+ publicInput.protocolStateRoot.assertEquals(
316
+ proof1.publicInput.protocolStateRoot,
317
+ errors.propertyNotMatching(
318
+ "protocolStateRoot",
319
+ "publicInput.from -> proof1.from"
320
+ )
321
+ );
322
+ proof1.publicOutput.protocolStateRoot.assertEquals(
323
+ proof2.publicInput.protocolStateRoot,
324
+ errors.propertyNotMatching(
325
+ "protocolStateRoot",
326
+ "proof1.to -> proof2.from"
327
+ )
328
+ );
329
+
330
+ return new StateTransitionProverPublicInput({
331
+ stateRoot: proof2.publicOutput.stateRoot,
332
+ stateTransitionsHash: proof2.publicOutput.stateTransitionsHash,
333
+ protocolTransitionsHash: proof2.publicOutput.protocolTransitionsHash,
334
+ protocolStateRoot: proof2.publicOutput.protocolStateRoot,
335
+ });
336
+ }
337
+ }
338
+
339
+ @injectable()
340
+ export class StateTransitionProver
341
+ extends ProtocolModule
342
+ implements StateTransitionProvable, StateTransitionProverType
343
+ {
344
+ public zkProgrammable: StateTransitionProverProgrammable;
345
+
346
+ public constructor(
347
+ // Injected
348
+ public readonly witnessProviderReference: StateTransitionWitnessProviderReference
349
+ ) {
350
+ super();
351
+ this.zkProgrammable = new StateTransitionProverProgrammable(
352
+ this,
353
+ witnessProviderReference
354
+ );
355
+ }
356
+
357
+ public runBatch(
358
+ publicInput: StateTransitionProverPublicInput,
359
+ batch: StateTransitionProvableBatch
360
+ ): Promise<StateTransitionProverPublicOutput> {
361
+ return this.zkProgrammable.runBatch(publicInput, batch);
362
+ }
363
+
364
+ public merge(
365
+ publicInput: StateTransitionProverPublicInput,
366
+ proof1: StateTransitionProof,
367
+ proof2: StateTransitionProof
368
+ ): Promise<StateTransitionProverPublicOutput> {
369
+ return this.zkProgrammable.merge(publicInput, proof1, proof2);
370
+ }
371
+ }
@@ -0,0 +1,23 @@
1
+ import type { Field } from "o1js";
2
+ import { injectable } from "tsyringe";
3
+ import { RollupMerkleTreeWitness } from "@proto-kit/common";
4
+
5
+ /**
6
+ * Interface for providing merkle witnesses to the state-transition prover
7
+ */
8
+ export interface StateTransitionWitnessProvider {
9
+ /**
10
+ * Provides the merkle witness corresponding to the given key
11
+ * @param key Merkle-tree key
12
+ */
13
+ getWitness: (key: Field) => RollupMerkleTreeWitness;
14
+ }
15
+
16
+ @injectable()
17
+ export class NoOpStateTransitionWitnessProvider
18
+ implements StateTransitionWitnessProvider
19
+ {
20
+ public getWitness(): RollupMerkleTreeWitness {
21
+ return new RollupMerkleTreeWitness({ path: [], isLeft: [] });
22
+ }
23
+ }
@@ -0,0 +1,17 @@
1
+ import { injectable, Lifecycle, scoped } from "tsyringe";
2
+
3
+ import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
4
+
5
+ @injectable()
6
+ @scoped(Lifecycle.ContainerScoped)
7
+ export class StateTransitionWitnessProviderReference {
8
+ private witnessProvider?: StateTransitionWitnessProvider;
9
+
10
+ public setWitnessProvider(provider: StateTransitionWitnessProvider) {
11
+ this.witnessProvider = provider;
12
+ }
13
+
14
+ public getWitnessProvider(): StateTransitionWitnessProvider | undefined {
15
+ return this.witnessProvider;
16
+ }
17
+ }
@@ -0,0 +1,24 @@
1
+ import { ConfigurableModule, NoConfig, TypedClass } from "@proto-kit/common";
2
+ import { SmartContract } from "o1js";
3
+
4
+ export type SmartContractClassFromInterface<Type> = typeof SmartContract &
5
+ TypedClass<Type>;
6
+
7
+ /**
8
+ * This module type is used to define a contract module that can be used to
9
+ * construct and inject smart contract instances.
10
+ * It defines a method contractFactory, whose arguments can be configured via
11
+ * the Argument generic. It returns a smart contract class that is a subclass
12
+ * of SmartContract and implements a certain interface as specified by the
13
+ * ContractType generic.
14
+ */
15
+ export abstract class ContractModule<
16
+ ContractType,
17
+ // undefined = no args
18
+ Arguments = undefined,
19
+ Config = NoConfig,
20
+ > extends ConfigurableModule<Config> {
21
+ public abstract contractFactory(
22
+ args: Arguments
23
+ ): SmartContractClassFromInterface<ContractType>;
24
+ }
@@ -0,0 +1,132 @@
1
+ import {
2
+ AreProofsEnabled,
3
+ ChildContainerProvider,
4
+ ModuleContainer,
5
+ ModulesRecord,
6
+ TypedClass,
7
+ noop,
8
+ } from "@proto-kit/common";
9
+ import { PublicKey, SmartContract } from "o1js";
10
+ import { injectable } from "tsyringe";
11
+
12
+ import { ProtocolEnvironment } from "../protocol/ProtocolEnvironment";
13
+ import { ProtocolModule } from "../protocol/ProtocolModule";
14
+
15
+ import {
16
+ ContractModule,
17
+ SmartContractClassFromInterface,
18
+ } from "./ContractModule";
19
+ import { DispatchContractProtocolModule } from "./contracts/DispatchContractProtocolModule";
20
+ import { DispatchContractType } from "./contracts/DispatchSmartContract";
21
+ import {
22
+ SettlementContractConfig,
23
+ SettlementContractProtocolModule,
24
+ } from "./contracts/SettlementContractProtocolModule";
25
+ import { SettlementContractType } from "./contracts/SettlementSmartContract";
26
+
27
+ export type SettlementModulesRecord = ModulesRecord<
28
+ TypedClass<ContractModule<unknown, unknown, unknown>>
29
+ >;
30
+
31
+ export type MandatorySettlementModulesRecord = {
32
+ SettlementContract: TypedClass<
33
+ ContractModule<
34
+ SettlementContractType,
35
+ SmartContractClassFromInterface<DispatchContractType>,
36
+ SettlementContractConfig
37
+ >
38
+ >;
39
+ DispatchContract: TypedClass<
40
+ ContractModule<DispatchContractType, unknown, unknown>
41
+ >;
42
+ };
43
+
44
+ @injectable()
45
+ export class SettlementContractModule<
46
+ SettlementModules extends SettlementModulesRecord &
47
+ MandatorySettlementModulesRecord,
48
+ >
49
+ extends ModuleContainer<SettlementModules>
50
+ implements ProtocolModule<unknown>
51
+ {
52
+ public constructor(definition: { modules: SettlementModules }) {
53
+ super(definition);
54
+ }
55
+
56
+ public static from<
57
+ SettlementModules extends SettlementModulesRecord &
58
+ MandatorySettlementModulesRecord,
59
+ >(
60
+ modules: SettlementModules
61
+ ): TypedClass<SettlementContractModule<SettlementModules>> {
62
+ return class ScopedSettlementContractModule extends SettlementContractModule<SettlementModules> {
63
+ public constructor() {
64
+ super({ modules });
65
+ }
66
+ };
67
+ }
68
+
69
+ public static fromDefaults() {
70
+ return SettlementContractModule.from({
71
+ SettlementContract: SettlementContractProtocolModule,
72
+ DispatchContract: DispatchContractProtocolModule,
73
+ });
74
+ }
75
+
76
+ // ** For protocol module
77
+ public protocol?: ProtocolEnvironment;
78
+
79
+ public get appChain(): AreProofsEnabled | undefined {
80
+ return this.protocol?.getAreProofsEnabled();
81
+ }
82
+ // **
83
+
84
+ public create(childContainerProvider: ChildContainerProvider) {
85
+ super.create(childContainerProvider);
86
+ }
87
+
88
+ public async start() {
89
+ noop();
90
+ }
91
+
92
+ public getContractClasses(): {
93
+ settlement: SmartContractClassFromInterface<SettlementContractType>;
94
+ dispatch: SmartContractClassFromInterface<DispatchContractType>;
95
+ } {
96
+ const settlementContractKey = "SettlementContract";
97
+ const dispatchContractKey = "DispatchContract";
98
+ this.assertIsValidModuleName(settlementContractKey);
99
+ this.assertIsValidModuleName(dispatchContractKey);
100
+
101
+ const settlementModule = this.resolve(settlementContractKey);
102
+ const dispatchModule = this.resolve(dispatchContractKey);
103
+
104
+ const dispatch = dispatchModule.contractFactory(undefined);
105
+ const settlement = settlementModule.contractFactory(dispatch);
106
+
107
+ return {
108
+ settlement,
109
+ dispatch,
110
+ };
111
+ }
112
+
113
+ public createContracts(addresses: {
114
+ settlement: PublicKey;
115
+ dispatch: PublicKey;
116
+ }): {
117
+ settlement: SettlementContractType & SmartContract;
118
+ dispatch: DispatchContractType & SmartContract;
119
+ } {
120
+ const { dispatch, settlement } = this.getContractClasses();
121
+
122
+ // eslint-disable-next-line new-cap
123
+ const dispatchInstance = new dispatch(addresses.dispatch);
124
+ // eslint-disable-next-line new-cap
125
+ const settlementInstance = new settlement(addresses.settlement);
126
+
127
+ return {
128
+ dispatch: dispatchInstance,
129
+ settlement: settlementInstance,
130
+ };
131
+ }
132
+ }