@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,12 @@
1
+ export type RuntimeMethodInvocationType = "INCOMING_MESSAGE" | "SIGNATURE";
2
+
3
+ export type RuntimeMethodIdMapping = Record<
4
+ `${string}.${string}`,
5
+ { methodId: bigint; type: RuntimeMethodInvocationType }
6
+ >;
7
+
8
+ export interface RuntimeLike {
9
+ get methodIdResolver(): {
10
+ methodIdMap: () => RuntimeMethodIdMapping;
11
+ };
12
+ }
@@ -0,0 +1,88 @@
1
+ import { Field, Struct } from "o1js";
2
+
3
+ import { Option, ProvableOption } from "./Option";
4
+
5
+ /**
6
+ * Provable representation of a State Transition, used to
7
+ * normalize state transitions of various value types for
8
+ * the state transition circuit.
9
+ */
10
+ export class ProvableStateTransition extends Struct({
11
+ path: Field,
12
+
13
+ // must be applied even if `None`
14
+ from: ProvableOption,
15
+
16
+ // must be ignored if `None`
17
+ to: ProvableOption,
18
+ }) {
19
+ public static dummy(): ProvableStateTransition {
20
+ return new ProvableStateTransition({
21
+ path: Field(0),
22
+ from: Option.none().toProvable(),
23
+ to: Option.none().toProvable(),
24
+ });
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Generic state transition that constraints the current method circuit
30
+ * to external state, by providing a state anchor.
31
+ */
32
+ export class StateTransition<Value> {
33
+ public static from<Value>(path: Field, fromValue: Option<Value>) {
34
+ return new StateTransition(path, fromValue, Option.none());
35
+ }
36
+
37
+ public static fromTo<Value>(
38
+ path: Field,
39
+ fromValue: Option<Value>,
40
+ toValue: Option<Value>
41
+ ) {
42
+ return new StateTransition(path, fromValue, toValue);
43
+ }
44
+
45
+ public constructor(
46
+ public path: Field,
47
+ public fromValue: Option<Value>,
48
+ public toValue: Option<Field> | Option<Value>
49
+ ) {}
50
+
51
+ public get from() {
52
+ const from = this.fromValue.clone();
53
+ from.forceSome();
54
+ return from;
55
+ }
56
+
57
+ public get to() {
58
+ return this.toValue.clone();
59
+ }
60
+
61
+ /**
62
+ * Converts a StateTransition to a ProvableStateTransition,
63
+ * while enforcing the 'from' property to be 'Some' in all cases.
64
+ */
65
+ public toProvable(): ProvableStateTransition {
66
+ return new ProvableStateTransition({
67
+ path: this.path,
68
+ from: this.from.toProvable(),
69
+ to: this.to.toProvable(),
70
+ });
71
+ }
72
+
73
+ public toJSON() {
74
+ return {
75
+ path: this.path.toString(),
76
+ from: this.fromValue.toJSON(),
77
+ to: this.toValue.toJSON(),
78
+ };
79
+ }
80
+
81
+ public toConstant(): StateTransition<Value> {
82
+ return new StateTransition<Value>(
83
+ this.path.toConstant(),
84
+ this.fromValue.toConstant(),
85
+ this.toValue.toConstant()
86
+ );
87
+ }
88
+ }
@@ -0,0 +1,125 @@
1
+ import { Bool, Provable, Struct } from "o1js";
2
+ import { range } from "@proto-kit/common";
3
+
4
+ import { constants } from "../Constants";
5
+
6
+ import { ProvableStateTransition } from "./StateTransition.js";
7
+
8
+ export class StateTransitionType {
9
+ public static readonly normal = true;
10
+
11
+ public static readonly protocol = false;
12
+
13
+ public static isNormal(type: boolean) {
14
+ return type === StateTransitionType.normal;
15
+ }
16
+
17
+ public static isProtocol(type: boolean) {
18
+ return type === StateTransitionType.protocol;
19
+ }
20
+ }
21
+
22
+ export class ProvableStateTransitionType extends Struct({
23
+ type: Bool,
24
+ }) {
25
+ public static get normal(): ProvableStateTransitionType {
26
+ return new ProvableStateTransitionType({
27
+ type: Bool(StateTransitionType.normal),
28
+ });
29
+ }
30
+
31
+ public static get protocol(): ProvableStateTransitionType {
32
+ return new ProvableStateTransitionType({
33
+ type: Bool(StateTransitionType.protocol),
34
+ });
35
+ }
36
+
37
+ public isNormal(): Bool {
38
+ return this.type;
39
+ }
40
+
41
+ public isProtocol(): Bool {
42
+ return this.type.not();
43
+ }
44
+ }
45
+
46
+ /**
47
+ * A Batch of StateTransitions to be consumed by the StateTransitionProver
48
+ * to prove multiple STs at once
49
+ *
50
+ * transitionType:
51
+ * true == normal ST, false == protocol ST
52
+ */
53
+ export class StateTransitionProvableBatch extends Struct({
54
+ batch: Provable.Array(
55
+ ProvableStateTransition,
56
+ constants.stateTransitionProverBatchSize
57
+ ),
58
+
59
+ transitionTypes: Provable.Array(
60
+ ProvableStateTransitionType,
61
+ constants.stateTransitionProverBatchSize
62
+ ),
63
+ }) {
64
+ public static fromMappings(
65
+ transitions: {
66
+ transition: ProvableStateTransition;
67
+ type: ProvableStateTransitionType;
68
+ }[]
69
+ ): StateTransitionProvableBatch {
70
+ const batch = transitions.map((entry) => entry.transition);
71
+ const transitionTypes = transitions.map((entry) => entry.type);
72
+
73
+ // Check that order is correct
74
+ let normalSTsStarted = false;
75
+ transitionTypes.forEach((x) => {
76
+ if (!normalSTsStarted && x.isNormal().toBoolean()) {
77
+ normalSTsStarted = true;
78
+ }
79
+ if (normalSTsStarted && x.isProtocol().toBoolean()) {
80
+ throw new Error("Order in initializing STBatch not correct");
81
+ }
82
+ });
83
+
84
+ while (batch.length < constants.stateTransitionProverBatchSize) {
85
+ batch.push(ProvableStateTransition.dummy());
86
+ transitionTypes.push(ProvableStateTransitionType.normal);
87
+ }
88
+ return new StateTransitionProvableBatch({
89
+ batch,
90
+ transitionTypes,
91
+ });
92
+ }
93
+
94
+ public static fromTransitions(
95
+ transitions: ProvableStateTransition[],
96
+ protocolTransitions: ProvableStateTransition[]
97
+ ): StateTransitionProvableBatch {
98
+ const array = transitions.slice().concat(protocolTransitions);
99
+
100
+ const transitionTypes = range(0, transitions.length)
101
+ .map(() => ProvableStateTransitionType.normal)
102
+ .concat(
103
+ range(0, protocolTransitions.length).map(
104
+ () => ProvableStateTransitionType.protocol
105
+ )
106
+ );
107
+
108
+ while (array.length < constants.stateTransitionProverBatchSize) {
109
+ array.push(ProvableStateTransition.dummy());
110
+ transitionTypes.push(ProvableStateTransitionType.normal);
111
+ }
112
+
113
+ return new StateTransitionProvableBatch({
114
+ batch: array,
115
+ transitionTypes,
116
+ });
117
+ }
118
+
119
+ private constructor(object: {
120
+ batch: ProvableStateTransition[];
121
+ transitionTypes: ProvableStateTransitionType[];
122
+ }) {
123
+ super(object);
124
+ }
125
+ }
@@ -0,0 +1,31 @@
1
+ import {
2
+ Field,
3
+ FlexibleProvable,
4
+ Poseidon,
5
+ PublicKey,
6
+ Signature,
7
+ Struct,
8
+ UInt64,
9
+ } from "o1js";
10
+
11
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
+ function argsToHash(...args: FlexibleProvable<any>[]): Field {
13
+ const fields = args.flatMap((argument) => argument.toFields(argument));
14
+ return Poseidon.hash(fields);
15
+ }
16
+
17
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
18
+ class Transaction extends Struct({
19
+ // must be checked inside @runtimeMethod
20
+ methodId: Field,
21
+ // constructed by hashing args + appending all used proof input/output hashes at the end
22
+ argsHash: Field,
23
+ // must (due to nonce) be checked during applyTransaction
24
+ nonce: UInt64,
25
+ sender: PublicKey,
26
+ signature: Signature,
27
+ }) {
28
+ public toHash(): Field {
29
+ return Poseidon.hash(Transaction.toFields(this));
30
+ }
31
+ }
@@ -0,0 +1,33 @@
1
+ import { Field, Poseidon, Struct, UInt64 } from "o1js";
2
+ import { RollupMerkleTree } from "@proto-kit/common";
3
+
4
+ export class CurrentBlock extends Struct({
5
+ height: UInt64,
6
+ }) {}
7
+
8
+ export class PreviousBlock extends Struct({
9
+ rootHash: Field,
10
+ }) {}
11
+
12
+ export class NetworkState extends Struct({
13
+ block: CurrentBlock,
14
+ previous: PreviousBlock,
15
+ }) {
16
+ public hash(): Field {
17
+ return Poseidon.hash([
18
+ ...CurrentBlock.toFields(this.block),
19
+ ...PreviousBlock.toFields(this.previous),
20
+ ]);
21
+ }
22
+
23
+ public static empty() {
24
+ return new NetworkState({
25
+ block: {
26
+ height: UInt64.zero,
27
+ },
28
+ previous: {
29
+ rootHash: Field(RollupMerkleTree.EMPTY_ROOT),
30
+ },
31
+ });
32
+ }
33
+ }
@@ -0,0 +1,105 @@
1
+ import { Bool, Field, Poseidon, PublicKey, Struct, UInt64 } from "o1js";
2
+ import { EMPTY_PUBLICKEY, EMPTY_PUBLICKEY_X } from "@proto-kit/common";
3
+
4
+ import { PublicKeyOption, UInt64Option } from "./ValueOption";
5
+
6
+ /**
7
+ * This struct is used to expose transaction information to the runtime method
8
+ * execution. This class has not all data included in transactions on purpose.
9
+ * For example, we don't want to expose the signature or args as fields.
10
+ */
11
+ export class RuntimeTransaction extends Struct({
12
+ methodId: Field,
13
+ argsHash: Field,
14
+ nonce: UInt64Option,
15
+ sender: PublicKeyOption,
16
+ }) {
17
+ public static fromTransaction(input: {
18
+ methodId: Field;
19
+ argsHash: Field;
20
+ nonce: UInt64;
21
+ sender: PublicKey;
22
+ }) {
23
+ return new RuntimeTransaction({
24
+ methodId: input.methodId,
25
+ argsHash: input.argsHash,
26
+ nonce: UInt64Option.fromSome(input.nonce),
27
+ sender: PublicKeyOption.fromSome(input.sender),
28
+ });
29
+ }
30
+
31
+ public static fromMessage({
32
+ methodId,
33
+ argsHash,
34
+ }: {
35
+ methodId: Field;
36
+ argsHash: Field;
37
+ }) {
38
+ return new RuntimeTransaction({
39
+ methodId,
40
+ argsHash,
41
+ nonce: UInt64Option.none(UInt64.zero),
42
+ sender: PublicKeyOption.none(EMPTY_PUBLICKEY),
43
+ });
44
+ }
45
+
46
+ public static dummyTransaction(): RuntimeTransaction {
47
+ return new RuntimeTransaction({
48
+ methodId: Field(0),
49
+ nonce: new UInt64Option({
50
+ isSome: Bool(true),
51
+ value: UInt64.zero,
52
+ }),
53
+ sender: new PublicKeyOption({
54
+ isSome: Bool(true),
55
+ value: EMPTY_PUBLICKEY,
56
+ }),
57
+ argsHash: Field(0),
58
+ });
59
+ }
60
+
61
+ public assertTransactionType(isMessage: Bool) {
62
+ const isTransaction = isMessage.not();
63
+ // isSome has to be true when it is a transaction, otherwise false
64
+ this.nonce.isSome
65
+ .equals(isTransaction)
66
+ .assertTrue("Nonce is not right option isSome for type");
67
+ this.sender.isSome
68
+ .equals(isTransaction)
69
+ .assertTrue("Sender is not right option isSome for type");
70
+ this.sender.value.x
71
+ .equals(EMPTY_PUBLICKEY_X)
72
+ .equals(isMessage)
73
+ .assertTrue("Transaction sender is not set to dummy");
74
+ }
75
+
76
+ public hashData(): Field[] {
77
+ return [
78
+ this.methodId,
79
+ ...this.sender.value.toFields(),
80
+ ...this.nonce.value.toFields(),
81
+ this.argsHash,
82
+ ];
83
+ }
84
+
85
+ public static fromHashData(fields: Field[]) {
86
+ // sender is 2nd and the first element is x (2nd isOdd)
87
+ const isMessage = fields[1].equals(EMPTY_PUBLICKEY_X);
88
+ return new RuntimeTransaction({
89
+ methodId: fields[0],
90
+ sender: new PublicKeyOption({
91
+ isSome: isMessage.not(),
92
+ value: PublicKey.fromFields([fields[1], fields[2]]),
93
+ }),
94
+ nonce: new UInt64Option({
95
+ isSome: isMessage.not(),
96
+ value: UInt64.fromFields([fields[3]]),
97
+ }),
98
+ argsHash: fields[4],
99
+ });
100
+ }
101
+
102
+ public hash(): Field {
103
+ return Poseidon.hash(this.hashData());
104
+ }
105
+ }
@@ -0,0 +1,47 @@
1
+ import { Bool, Field, Scalar, Signature, Struct, UInt64 } from "o1js";
2
+
3
+ import { RuntimeTransaction } from "./RuntimeTransaction";
4
+
5
+ export class SignedTransaction extends Struct({
6
+ transaction: RuntimeTransaction,
7
+ signature: Signature,
8
+ }) {
9
+ public static getSignatureData(args: {
10
+ methodId: Field;
11
+ nonce: UInt64;
12
+ argsHash: Field;
13
+ }): Field[] {
14
+ return [args.methodId, ...args.nonce.value.toFields(), args.argsHash];
15
+ }
16
+
17
+ public static dummy(): SignedTransaction {
18
+ return new SignedTransaction({
19
+ transaction: RuntimeTransaction.dummyTransaction(),
20
+
21
+ signature: Signature.fromObject({
22
+ s: Scalar.from(0),
23
+ r: Field(0),
24
+ }),
25
+ });
26
+ }
27
+
28
+ public hash(): Field {
29
+ return this.transaction.hash();
30
+ }
31
+
32
+ public getSignatureData(): Field[] {
33
+ const { methodId, argsHash, nonce } = this.transaction;
34
+ return SignedTransaction.getSignatureData({
35
+ nonce: nonce.value,
36
+ methodId,
37
+ argsHash,
38
+ });
39
+ }
40
+
41
+ public validateSignature(): Bool {
42
+ return this.signature.verify(
43
+ this.transaction.sender.value,
44
+ this.getSignatureData()
45
+ );
46
+ }
47
+ }
@@ -0,0 +1,28 @@
1
+ import { Bool, ProvableExtended, PublicKey, Struct, UInt64 } from "o1js";
2
+
3
+ function genericOptionFactory<Type>(valueType: ProvableExtended<Type>) {
4
+ return class Generic extends Struct({
5
+ isSome: Bool,
6
+ value: valueType,
7
+ }) {
8
+ public static fromSome(value: Type) {
9
+ return new Generic({
10
+ isSome: Bool(true),
11
+ value,
12
+ });
13
+ }
14
+
15
+ public static none(value: Type) {
16
+ return new Generic({
17
+ isSome: Bool(false),
18
+ value,
19
+ });
20
+ }
21
+ };
22
+ }
23
+
24
+ export class UInt64Option extends genericOptionFactory<UInt64>(UInt64) {}
25
+
26
+ export class PublicKeyOption extends genericOptionFactory<PublicKey>(
27
+ PublicKey
28
+ ) {}
@@ -0,0 +1,197 @@
1
+ import {
2
+ AreProofsEnabled,
3
+ ChildContainerProvider,
4
+ log,
5
+ ModuleContainer,
6
+ ModulesConfig,
7
+ ModulesRecord,
8
+ StringKeyOf,
9
+ TypedClass,
10
+ } from "@proto-kit/common";
11
+ import { DependencyContainer, Lifecycle } from "tsyringe";
12
+
13
+ import { BlockProvable } from "../prover/block/BlockProvable";
14
+ import { StateTransitionProvable } from "../prover/statetransition/StateTransitionProvable";
15
+ import { StateServiceProvider } from "../state/StateServiceProvider";
16
+ import { SimpleAsyncStateService } from "../state/StateService";
17
+ import { NoopBlockHook } from "../hooks/NoopBlockHook";
18
+ import { BlockHeightHook } from "../hooks/BlockHeightHook";
19
+ import { LastStateRootBlockHook } from "../hooks/LastStateRootBlockHook";
20
+ import { ProvableSettlementHook } from "../settlement/modularity/ProvableSettlementHook";
21
+ import { NoopSettlementHook } from "../hooks/NoopSettlementHook";
22
+ import { AccountStateHook } from "../hooks/AccountStateHook";
23
+ import { NoopTransactionHook } from "../hooks/NoopTransactionHook";
24
+
25
+ import { ProtocolModule } from "./ProtocolModule";
26
+ import { ProvableTransactionHook } from "./ProvableTransactionHook";
27
+ import { ProtocolEnvironment } from "./ProtocolEnvironment";
28
+ import { ProvableBlockHook } from "./ProvableBlockHook";
29
+
30
+ const PROTOCOL_INJECTION_TOKENS: Record<string, string> = {
31
+ ProvableTransactionHook: "ProvableTransactionHook",
32
+ ProvableBlockHook: "ProvableBlockHook",
33
+ ProvableSettlementHook: "ProvableSettlementHook",
34
+ };
35
+
36
+ export type ProtocolModulesRecord = ModulesRecord<
37
+ TypedClass<ProtocolModule<unknown>>
38
+ >;
39
+
40
+ export interface BlockProverType extends ProtocolModule, BlockProvable {}
41
+
42
+ export interface StateTransitionProverType
43
+ extends ProtocolModule,
44
+ StateTransitionProvable {}
45
+
46
+ export type MandatoryProtocolModulesRecord = {
47
+ BlockProver: TypedClass<BlockProverType>;
48
+ StateTransitionProver: TypedClass<StateTransitionProverType>;
49
+ AccountState: TypedClass<AccountStateHook>;
50
+ BlockHeight: TypedClass<BlockHeightHook>;
51
+ LastStateRoot: TypedClass<LastStateRootBlockHook>;
52
+ };
53
+
54
+ export interface ProtocolDefinition<Modules extends ProtocolModulesRecord> {
55
+ modules: Modules;
56
+ config?: ModulesConfig<Modules>;
57
+ }
58
+
59
+ export class Protocol<
60
+ Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord,
61
+ >
62
+ extends ModuleContainer<Modules>
63
+ implements ProtocolEnvironment
64
+ {
65
+ public static from<
66
+ Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord,
67
+ >(modules: ProtocolDefinition<Modules>): TypedClass<Protocol<Modules>> {
68
+ return class ScopedProtocol extends Protocol<Modules> {
69
+ public constructor() {
70
+ super(modules);
71
+ }
72
+ };
73
+ }
74
+
75
+ public definition: ProtocolDefinition<Modules>;
76
+
77
+ public constructor(definition: ProtocolDefinition<Modules>) {
78
+ super(definition);
79
+ this.definition = definition;
80
+ }
81
+
82
+ public get stateService(): SimpleAsyncStateService {
83
+ return this.stateServiceProvider.stateService;
84
+ }
85
+
86
+ public get stateServiceProvider(): StateServiceProvider {
87
+ return this.container.resolve<StateServiceProvider>("StateServiceProvider");
88
+ }
89
+
90
+ public decorateModule(
91
+ moduleName: StringKeyOf<Modules>,
92
+ containedModule: InstanceType<Modules[StringKeyOf<Modules>]>
93
+ ) {
94
+ log.debug(`Decorated ${moduleName}`);
95
+ containedModule.protocol = this;
96
+
97
+ if (containedModule instanceof ProvableTransactionHook) {
98
+ containedModule.name = moduleName;
99
+ }
100
+
101
+ super.decorateModule(moduleName, containedModule);
102
+ }
103
+
104
+ public get dependencyContainer(): DependencyContainer {
105
+ return this.container;
106
+ }
107
+
108
+ private isModule(
109
+ moduleName: keyof Modules
110
+ ): moduleName is StringKeyOf<Modules> {
111
+ return this.definition.modules[moduleName] !== undefined;
112
+ }
113
+
114
+ public get blockProver(): BlockProvable {
115
+ // Why do I resolve directly here?
116
+ // I don't know exactly but generics don't let me use .resolve()
117
+ return this.container.resolve<InstanceType<Modules["BlockProver"]>>(
118
+ "BlockProver"
119
+ );
120
+ }
121
+
122
+ public get stateTransitionProver(): StateTransitionProvable {
123
+ return this.container.resolve<
124
+ InstanceType<Modules["StateTransitionProver"]>
125
+ >("StateTransitionProver");
126
+ }
127
+
128
+ public getAreProofsEnabled(): AreProofsEnabled {
129
+ return this.container.resolve<AreProofsEnabled>("AreProofsEnabled");
130
+ }
131
+
132
+ public create(childContainerProvider: ChildContainerProvider) {
133
+ super.create(childContainerProvider);
134
+
135
+ // Register the BlockModules seperately since we need to
136
+ // inject them differently later
137
+ const ABSTRACT_MODULE_TYPES = [
138
+ { type: ProvableTransactionHook, defaultType: NoopTransactionHook },
139
+ { type: ProvableBlockHook, defaultType: NoopBlockHook },
140
+ { type: ProvableSettlementHook, defaultType: NoopSettlementHook },
141
+ ] as const;
142
+
143
+ ABSTRACT_MODULE_TYPES.forEach((moduleTypeRegistration) => {
144
+ const abstractType = moduleTypeRegistration.type;
145
+
146
+ const implementingModules = Object.entries(
147
+ this.definition.modules
148
+ ).filter(([, value]) =>
149
+ Object.prototype.isPrototypeOf.call(abstractType, value)
150
+ );
151
+
152
+ const newInjectionToken: string | undefined =
153
+ PROTOCOL_INJECTION_TOKENS[abstractType.name];
154
+
155
+ if (newInjectionToken === undefined) {
156
+ log.error(
157
+ "Can't inject hook under the underlying hook token: Alias not found in mapping"
158
+ );
159
+ return;
160
+ }
161
+
162
+ implementingModules.forEach(([key]) => {
163
+ this.container.register(
164
+ abstractType.name,
165
+ { useToken: key },
166
+ { lifecycle: Lifecycle.ContainerScoped }
167
+ );
168
+ });
169
+ if (implementingModules.length === 0) {
170
+ // This type annotation shouldn't change anything but is necessary
171
+ // bcs tsyringe complains
172
+ const { defaultType }: { defaultType: TypedClass<unknown> } =
173
+ moduleTypeRegistration;
174
+
175
+ // Register default (noop) version
176
+ this.container.register(
177
+ abstractType.name,
178
+ { useClass: defaultType },
179
+ { lifecycle: Lifecycle.ContainerScoped }
180
+ );
181
+ }
182
+ });
183
+ }
184
+
185
+ public async start() {
186
+ // eslint-disable-next-line guard-for-in
187
+ for (const moduleName in this.definition.modules) {
188
+ const protocolModule = this.resolve(moduleName);
189
+
190
+ log.info(
191
+ `Starting protocol module ${moduleName} (${protocolModule.constructor.name})`
192
+ );
193
+ // eslint-disable-next-line no-await-in-loop
194
+ await protocolModule.start();
195
+ }
196
+ }
197
+ }
@@ -0,0 +1,10 @@
1
+ import { AreProofsEnabled } from "@proto-kit/common";
2
+
3
+ import { SimpleAsyncStateService } from "../state/StateService";
4
+ import { StateServiceProvider } from "../state/StateServiceProvider";
5
+
6
+ export interface ProtocolEnvironment {
7
+ get stateService(): SimpleAsyncStateService;
8
+ get stateServiceProvider(): StateServiceProvider;
9
+ getAreProofsEnabled(): AreProofsEnabled;
10
+ }