@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,50 @@
1
+ import { Bool, Poseidon, Provable } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList";
3
+ export class ProvableReductionHashList extends ProvableHashList {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.unconstrainedList = [];
7
+ this.constrainedLastValue = undefined;
8
+ this.preimage = this.commitment;
9
+ }
10
+ pushAndReduce(value, reduce) {
11
+ let valueToPush = value;
12
+ let popLast = Bool(false);
13
+ // Theoretically, we can feed the preimage + last value as a witness
14
+ // for non-zero commitment starts (like used in the BlockProver), because
15
+ // currently it won't reduce across chunks. But this is okay for now I think
16
+ if (this.constrainedLastValue !== undefined) {
17
+ [valueToPush, popLast] = reduce(this.constrainedLastValue);
18
+ }
19
+ Provable.asProver(() => {
20
+ if (popLast.toBoolean()) {
21
+ this.unconstrainedList.pop();
22
+ }
23
+ const valueAsConstant = this.valueType.fromFields(this.valueType.toFields(valueToPush).map((field) => field.toConstant()));
24
+ this.unconstrainedList.push(valueAsConstant);
25
+ });
26
+ const currentCommitment = this.commitment;
27
+ const noPopCommitment = this.hash([
28
+ currentCommitment,
29
+ ...this.valueType.toFields(valueToPush),
30
+ ]);
31
+ const popCommitment = this.hash([
32
+ this.preimage,
33
+ ...this.valueType.toFields(valueToPush),
34
+ ]);
35
+ this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
36
+ this.constrainedLastValue = valueToPush;
37
+ this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
38
+ return {
39
+ popLast,
40
+ value: valueToPush,
41
+ };
42
+ }
43
+ pushIf(value, condition) {
44
+ throw new Error("pushIf is not implemented for ReducedHashList");
45
+ return this;
46
+ }
47
+ hash(elements) {
48
+ return Poseidon.hash(elements);
49
+ }
50
+ }
@@ -0,0 +1,11 @@
1
+ import { ProvableStateTransition, StateTransition } from "../model/StateTransition";
2
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
3
+ export declare class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
4
+ push(value: ProvableStateTransition): this;
5
+ pushWithMetadata(value: ProvableStateTransition): {
6
+ popLast: import("o1js/dist/node/lib/provable/bool").Bool;
7
+ value: ProvableStateTransition;
8
+ };
9
+ }
10
+ export declare function reduceStateTransitions(transitions: StateTransition<unknown>[]): StateTransition<unknown>[];
11
+ //# sourceMappingURL=StateTransitionReductionList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionReductionList.d.ts","sourceRoot":"","sources":["../../src/utils/StateTransitionReductionList.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,uBAAuB,EACvB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,qBAAa,4BAA6B,SAAQ,yBAAyB,CAAC,uBAAuB,CAAC;IAC3F,IAAI,CAAC,KAAK,EAAE,uBAAuB;IAMnC,gBAAgB,CAAC,KAAK,EAAE,uBAAuB;;;;CAyCvD;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GACtC,eAAe,CAAC,OAAO,CAAC,EAAE,CA0B5B"}
@@ -0,0 +1,60 @@
1
+ import { Provable } from "o1js";
2
+ import { ProvableOption } from "../model/Option";
3
+ import { ProvableStateTransition, StateTransition, } from "../model/StateTransition";
4
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
5
+ export class StateTransitionReductionList extends ProvableReductionHashList {
6
+ push(value) {
7
+ this.pushWithMetadata(value);
8
+ return this;
9
+ }
10
+ pushWithMetadata(value) {
11
+ return this.pushAndReduce(value, (previous) => {
12
+ const pathsMatch = previous.path.equals(value.path);
13
+ // Take the previous.from if the paths match, otherwise leave ST as is
14
+ const from = Provable.if(pathsMatch, ProvableOption, previous.from, value.from);
15
+ // In case we have a layout like
16
+ // { from: 5, to: 10 }, { from: 10, to: none }
17
+ // we just take the first and discard the second
18
+ const to = Provable.if(value.to.isSome.or(pathsMatch.not()), ProvableOption, value.to, previous.to);
19
+ const transition = new ProvableStateTransition({
20
+ path: value.path,
21
+ from: new ProvableOption(from),
22
+ to: new ProvableOption(to),
23
+ });
24
+ // Assert that connection is correct
25
+ previous.to.value
26
+ .equals(value.from.value)
27
+ .or(previous.to.isSome
28
+ .not()
29
+ .and(previous.from.value.equals(value.from.value)))
30
+ .or(pathsMatch.not())
31
+ .assertTrue();
32
+ return [transition, pathsMatch];
33
+ });
34
+ }
35
+ }
36
+ export function reduceStateTransitions(transitions) {
37
+ const reduced = [];
38
+ transitions.forEach((st) => {
39
+ if (reduced.length === 0) {
40
+ reduced.push(st);
41
+ return;
42
+ }
43
+ const last = reduced.at(-1);
44
+ if (last.path.equals(st.path).toBoolean()) {
45
+ if (st.toValue.isSome.toBoolean()) {
46
+ reduced.pop();
47
+ reduced.push(new StateTransition(st.path, last.fromValue, st.toValue));
48
+ }
49
+ else {
50
+ // Do nothing, because we discard that ST
51
+ // { from: 5, to: 10 }, { from: 10, to: none }
52
+ // cancel the 2nd
53
+ }
54
+ }
55
+ else {
56
+ reduced.push(st);
57
+ }
58
+ });
59
+ return reduced;
60
+ }
@@ -0,0 +1,11 @@
1
+ import { Field } from "o1js";
2
+ export type ReturnType<FunctionType extends Function> = FunctionType extends (...args: any[]) => infer Return ? Return : any;
3
+ export type Subclass<Class extends new (...args: any) => any> = (new (...args: any) => InstanceType<Class>) & {
4
+ [Key in keyof Class]: Class[Key];
5
+ } & {
6
+ prototype: InstanceType<Class>;
7
+ };
8
+ export declare function notInCircuit(): MethodDecorator;
9
+ export declare function stringToField(value: string): import("o1js/dist/node/lib/provable/field").Field;
10
+ export declare function singleFieldToString(value: Field | bigint): string;
11
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAsB,MAAM,MAAM,CAAC;AAGjD,MAAM,MAAM,UAAU,CAAC,YAAY,SAAS,QAAQ,IAAI,YAAY,SAAS,CAC3E,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,MAAM,MAAM,GACb,MAAM,GACN,GAAG,CAAC;AAER,MAAM,MAAM,QAAQ,CAAC,KAAK,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,KAC/D,GAAG,IAAI,EAAE,GAAG,KACT,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG;KACzB,GAAG,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;CACjC,GAAG;IAAE,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CAAE,CAAC;AAEvC,wBAAgB,YAAY,IAAI,eAAe,CAkB9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,qDA+B1C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAMjE"}
@@ -0,0 +1,44 @@
1
+ import { Field, Poseidon, Provable } from "o1js";
2
+ import floor from "lodash/floor";
3
+ export function notInCircuit() {
4
+ return function ReplacedFunction(target, propertyKey, descriptor) {
5
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
6
+ const childFunction = descriptor.value;
7
+ descriptor.value = function value(...args) {
8
+ if (Provable.inCheckedComputation() || Provable.inProver()) {
9
+ throw new Error(`Method ${propertyKey.toString()} is supposed to be only called outside of the circuit`);
10
+ }
11
+ return childFunction.apply(this, args);
12
+ };
13
+ return descriptor;
14
+ };
15
+ }
16
+ export function stringToField(value) {
17
+ const fieldSize = Field.sizeInBytes - 1;
18
+ // Encode string as byte[]
19
+ const encoder = new TextEncoder();
20
+ const stringBytes = Array.from(encoder.encode(value));
21
+ // Add padding in case the string is not a multiple of Field.sizeInBytes
22
+ const padding = Array.from({
23
+ length: fieldSize - (stringBytes.length % fieldSize),
24
+ }).fill(0);
25
+ const data = stringBytes.concat(padding).reverse();
26
+ // Hash the result Field[] to reduce it to
27
+ const chunks = data.reduce((a, b, index) => {
28
+ const arrayIndex = floor(index / fieldSize);
29
+ a[arrayIndex].push(b);
30
+ return a;
31
+ }, Array.from({ length: floor(data.length / fieldSize) }).map(() => []));
32
+ const fields = chunks.map((x) =>
33
+ // We have to add a zero at the highest byte here, because a Field is
34
+ // a bit smaller than 2^256
35
+ Field.fromBytes(x.concat([0])));
36
+ return Poseidon.hash(fields);
37
+ }
38
+ export function singleFieldToString(value) {
39
+ let fieldValue = value;
40
+ if (typeof value === "bigint") {
41
+ fieldValue = Field(value);
42
+ }
43
+ return fieldValue.toString();
44
+ }
@@ -0,0 +1 @@
1
+ module.exports = require("../../jest.config.cjs");
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@proto-kit/protocol",
3
+ "license": "MIT",
4
+ "private": false,
5
+ "type": "module",
6
+ "version": "0.1.1-develop.1086+eeb4563a",
7
+ "scripts": {
8
+ "build": "tsc -p tsconfig.json",
9
+ "dev": "tsc -p tsconfig.json --watch",
10
+ "lint": "eslint ./src ./test",
11
+ "test:file": "node --experimental-vm-modules --experimental-wasm-modules --experimental-wasm-threads ../../node_modules/jest/bin/jest.js",
12
+ "test": "npm run test:file -- ./test/**",
13
+ "test:watch": "npm run test:file -- ./test/** --watch"
14
+ },
15
+ "main": "dist/index.js",
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "dependencies": {
20
+ "lodash": "^4.17.21",
21
+ "loglevel": "^1.8.1",
22
+ "reflect-metadata": "^0.1.13",
23
+ "ts-mixer": "^6.0.3"
24
+ },
25
+ "peerDependencies": {
26
+ "@proto-kit/common": "*",
27
+ "o1js": "^1.1.0",
28
+ "ts-pattern": "^4.3.0",
29
+ "tsyringe": "^4.7.0"
30
+ },
31
+ "devDependencies": {
32
+ "@jest/globals": "^29.5.0",
33
+ "@types/lodash": "^4.14.194"
34
+ },
35
+ "gitHead": "eeb4563a685b29525358ec7404fa9f0251d258d4"
36
+ }
@@ -0,0 +1,3 @@
1
+ export const constants = {
2
+ stateTransitionProverBatchSize: 4,
3
+ };
@@ -0,0 +1,48 @@
1
+ import { PublicKey, Struct, UInt64 } from "o1js";
2
+ import { injectable } from "tsyringe";
3
+
4
+ import { BlockProverExecutionData } from "../prover/block/BlockProvable";
5
+ import { StateMap } from "../state/StateMap";
6
+ import { protocolState } from "../state/protocol/ProtocolState";
7
+ import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
8
+ import { assert } from "../state/assert/assert";
9
+
10
+ export class AccountState extends Struct({
11
+ nonce: UInt64,
12
+ }) {}
13
+
14
+ @injectable()
15
+ export class AccountStateHook extends ProvableTransactionHook {
16
+ @protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
17
+ PublicKey,
18
+ AccountState
19
+ );
20
+
21
+ public async onTransaction({ transaction }: BlockProverExecutionData) {
22
+ const sender = transaction.sender.value;
23
+
24
+ const aso = await this.accountState.get(sender);
25
+
26
+ const accountState = aso.orElse(new AccountState({ nonce: UInt64.zero }));
27
+
28
+ const currentNonce = accountState.nonce;
29
+
30
+ // Either the nonce matches or the tx is a message, in which case we don't care
31
+ assert(
32
+ currentNonce
33
+ .equals(transaction.nonce.value)
34
+ .or(transaction.sender.isSome.not()),
35
+ () =>
36
+ `Nonce not matching: tx sent ${transaction.nonce.value.toString()}, onchain value is ${currentNonce.toString()}`
37
+ );
38
+
39
+ // Optimized version of transaction.sender.isSome ? currentNonce.add(1) : Field(0)
40
+ // Bcs Bool(true).toField() == 1
41
+ // TODO Think about if we want to rangecheck this. If not, we should store it as Field
42
+ const newNonce = UInt64.Unsafe.fromField(
43
+ currentNonce.value.add(1).mul(transaction.sender.isSome.toField())
44
+ );
45
+
46
+ await this.accountState.set(sender, new AccountState({ nonce: newNonce }));
47
+ }
48
+ }
@@ -0,0 +1,17 @@
1
+ import { NetworkState } from "../model/network/NetworkState";
2
+ import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
3
+
4
+ export class BlockHeightHook extends ProvableBlockHook<Record<string, never>> {
5
+ public async afterBlock(networkState: NetworkState): Promise<NetworkState> {
6
+ return new NetworkState({
7
+ block: {
8
+ height: networkState.block.height.add(1),
9
+ },
10
+ previous: networkState.previous,
11
+ });
12
+ }
13
+
14
+ public async beforeBlock(networkState: NetworkState): Promise<NetworkState> {
15
+ return networkState;
16
+ }
17
+ }
@@ -0,0 +1,26 @@
1
+ import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
2
+ import { NetworkState } from "../model/network/NetworkState";
3
+ import { BlockProverState } from "../prover/block/BlockProver";
4
+
5
+ export class LastStateRootBlockHook extends ProvableBlockHook<
6
+ Record<string, never>
7
+ > {
8
+ public async afterBlock(
9
+ networkState: NetworkState,
10
+ state: BlockProverState
11
+ ): Promise<NetworkState> {
12
+ return new NetworkState({
13
+ block: networkState.block,
14
+ previous: {
15
+ rootHash: state.stateRoot,
16
+ },
17
+ });
18
+ }
19
+
20
+ public async beforeBlock(
21
+ networkState: NetworkState,
22
+ state: BlockProverState
23
+ ): Promise<NetworkState> {
24
+ return networkState;
25
+ }
26
+ }
@@ -0,0 +1,21 @@
1
+ import { NoConfig } from "@proto-kit/common";
2
+
3
+ import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
4
+ import { NetworkState } from "../model/network/NetworkState";
5
+ import { BlockProverState } from "../prover/block/BlockProver";
6
+
7
+ export class NoopBlockHook extends ProvableBlockHook<NoConfig> {
8
+ public async afterBlock(
9
+ networkState: NetworkState,
10
+ state: BlockProverState
11
+ ): Promise<NetworkState> {
12
+ return networkState;
13
+ }
14
+
15
+ public async beforeBlock(
16
+ networkState: NetworkState,
17
+ state: BlockProverState
18
+ ): Promise<NetworkState> {
19
+ return networkState;
20
+ }
21
+ }
@@ -0,0 +1,20 @@
1
+ import { injectable } from "tsyringe";
2
+ import { noop } from "@proto-kit/common";
3
+ import { SmartContract } from "o1js";
4
+
5
+ import {
6
+ ProvableSettlementHook,
7
+ SettlementHookInputs,
8
+ } from "../settlement/modularity/ProvableSettlementHook";
9
+
10
+ @injectable()
11
+ export class NoopSettlementHook extends ProvableSettlementHook<
12
+ Record<string, never>
13
+ > {
14
+ public async beforeSettlement(
15
+ contract: SmartContract,
16
+ state: SettlementHookInputs
17
+ ) {
18
+ noop();
19
+ }
20
+ }
@@ -0,0 +1,10 @@
1
+ import { noop } from "@proto-kit/common";
2
+
3
+ import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
4
+ import { BlockProverExecutionData } from "../prover/block/BlockProvable";
5
+
6
+ export class NoopTransactionHook extends ProvableTransactionHook {
7
+ public async onTransaction(executionData: BlockProverExecutionData) {
8
+ noop();
9
+ }
10
+ }
package/src/index.ts ADDED
@@ -0,0 +1,53 @@
1
+ export * from "./hooks/AccountStateHook";
2
+ export * from "./hooks/BlockHeightHook";
3
+ export * from "./hooks/LastStateRootBlockHook";
4
+ export * from "./model/StateTransition";
5
+ export * from "./model/StateTransitionProvableBatch";
6
+ export * from "./model/Option";
7
+ export * from "./model/Path";
8
+ export * from "./model/network/NetworkState";
9
+ export * from "./model/transaction/SignedTransaction";
10
+ export * from "./model/transaction/RuntimeTransaction";
11
+ export * from "./model/transaction/ValueOption";
12
+ export * from "./model/MethodPublicOutput";
13
+ export * from "./model/RuntimeLike";
14
+ export * from "./utils/ProvableHashList";
15
+ export * from "./utils/PrefixedProvableHashList";
16
+ export * from "./utils/MinaPrefixedProvableHashList";
17
+ export * from "./utils/ProvableReductionHashList";
18
+ export * from "./utils/StateTransitionReductionList";
19
+ export * from "./utils/utils";
20
+ export * from "./prover/block/BlockProver";
21
+ export * from "./prover/block/BlockProvable";
22
+ export * from "./prover/block/accummulators/RuntimeVerificationKeyTree";
23
+ export * from "./prover/block/accummulators/BlockHashMerkleTree";
24
+ export * from "./prover/block/services/RuntimeVerificationKeyRootService";
25
+ export * from "./prover/statetransition/StateTransitionProver";
26
+ export * from "./prover/statetransition/StateTransitionProvable";
27
+ export * from "./prover/statetransition/StateTransitionWitnessProvider";
28
+ export * from "./prover/statetransition/StateTransitionWitnessProviderReference";
29
+ export * from "./protocol/Protocol";
30
+ export * from "./protocol/ProtocolModule";
31
+ export * from "./protocol/ProtocolEnvironment";
32
+ export * from "./protocol/ProvableTransactionHook";
33
+ export * from "./protocol/ProvableBlockHook";
34
+ export * from "./state/context/TransitionMethodExecutionContext";
35
+ export * from "./state/context/RuntimeMethodExecutionContext";
36
+ export * from "./state/protocol/ProtocolState";
37
+ export * from "./state/State";
38
+ export * from "./state/StateMap";
39
+ export * from "./state/StateService";
40
+ export * from "./state/StateServiceProvider";
41
+ export * from "./state/assert/assert";
42
+ export * from "./settlement/contracts/SettlementSmartContract";
43
+ export * from "./settlement/contracts/SettlementContractProtocolModule";
44
+ export * from "./settlement/contracts/DispatchSmartContract";
45
+ export * from "./settlement/contracts/DispatchContractProtocolModule";
46
+ export * from "./settlement/SettlementContractModule";
47
+ export * from "./settlement/ContractModule";
48
+ export * from "./settlement/modularity/ProvableSettlementHook";
49
+ export * from "./settlement/messages/OutgoingMessageArgument";
50
+ export * from "./settlement/modules/NetworkStateSettlementModule";
51
+ export * from "./settlement/messages/Deposit";
52
+ export * from "./settlement/messages/Withdrawal";
53
+ export { constants as ProtocolConstants } from "./Constants";
@@ -0,0 +1,14 @@
1
+ import { Bool, Field, Struct } from "o1js";
2
+
3
+ /**
4
+ * Public input used to link in-circuit execution with
5
+ * the proof's public input.
6
+ */
7
+ export class MethodPublicOutput extends Struct({
8
+ stateTransitionsHash: Field,
9
+ status: Bool,
10
+ transactionHash: Field,
11
+ networkStateHash: Field,
12
+ isMessage: Bool,
13
+ eventsHash: Field,
14
+ }) {}
@@ -0,0 +1,172 @@
1
+ import {
2
+ Bool,
3
+ Field,
4
+ type FlexibleProvablePure,
5
+ Poseidon,
6
+ Provable,
7
+ ProvablePure,
8
+ Struct,
9
+ } from "o1js";
10
+
11
+ export class ProvableOption extends Struct({
12
+ isSome: Bool,
13
+ value: Field,
14
+ }) {
15
+ public toSome() {
16
+ this.isSome = Bool(true);
17
+ return this;
18
+ }
19
+ }
20
+
21
+ export abstract class OptionBase {
22
+ protected constructor(
23
+ public isSome: Bool,
24
+ public isForcedSome: Bool
25
+ ) {}
26
+
27
+ protected abstract encodeValueToFields(): Field[];
28
+
29
+ protected abstract clone(): OptionBase;
30
+
31
+ /**
32
+ * @returns Tree representation of the current value
33
+ */
34
+ public get treeValue() {
35
+ const treeValue = Poseidon.hash(this.encodeValueToFields());
36
+
37
+ return Provable.if(
38
+ this.isSome.and(this.isForcedSome.not()),
39
+ treeValue,
40
+ Field(0)
41
+ );
42
+ }
43
+
44
+ public forceSome() {
45
+ this.isForcedSome = Provable.if(this.isSome, Bool(false), Bool(true));
46
+ this.isSome = Bool(true);
47
+ }
48
+
49
+ /**
50
+ * Returns the `to`-value as decoded as a list of fields
51
+ * Not in circuit
52
+ */
53
+ public toFields(): Field[] {
54
+ if (this.isSome.toBoolean()) {
55
+ return this.encodeValueToFields();
56
+ }
57
+ return [Field(0)];
58
+ }
59
+
60
+ /**
61
+ * @returns Provable representation of the current option.
62
+ */
63
+ public toProvable() {
64
+ return new ProvableOption({
65
+ isSome: this.isSome,
66
+ value: this.treeValue,
67
+ });
68
+ }
69
+
70
+ public toJSON() {
71
+ const value = this.encodeValueToFields().map((field) => field.toString());
72
+
73
+ return {
74
+ isSome: this.isSome.toBoolean(),
75
+ isForcedSome: this.isForcedSome.toBoolean(),
76
+ value,
77
+ };
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Option facilitating in-circuit values that may or may not exist.
83
+ */
84
+ export class Option<Value> extends OptionBase {
85
+ /**
86
+ * Creates a new Option from the provided parameters
87
+ *
88
+ * @param isSome
89
+ * @param value
90
+ * @param valueType
91
+ * @returns New option from the provided parameters.
92
+ */
93
+ public static from<Value>(
94
+ isSome: Bool,
95
+ value: Value,
96
+ valueType: FlexibleProvablePure<Value>
97
+ ) {
98
+ return new Option(isSome, value, valueType);
99
+ }
100
+
101
+ /**
102
+ * Creates a new Option from the provided parameters
103
+ *
104
+ * @param value
105
+ * @param valueType
106
+ * @returns New option from the provided parameters.
107
+ */
108
+ public static fromValue<Value>(
109
+ value: Value,
110
+ valueType: FlexibleProvablePure<Value>
111
+ ) {
112
+ return this.from(Bool(true), value, valueType);
113
+ }
114
+
115
+ /**
116
+ * @returns Empty / none option
117
+ */
118
+ public static none() {
119
+ return new Option(Bool(false), Field(0), Field);
120
+ }
121
+
122
+ public constructor(
123
+ isSome: Bool,
124
+ public value: Value,
125
+ public valueType: FlexibleProvablePure<Value>,
126
+ isForcedSome = Bool(false)
127
+ ) {
128
+ super(isSome, isForcedSome);
129
+ }
130
+
131
+ public encodeValueToFields(): Field[] {
132
+ return this.valueType.toFields(this.value);
133
+ }
134
+
135
+ public clone(): Option<Value> {
136
+ return new Option(
137
+ this.isSome,
138
+ this.value,
139
+ this.valueType,
140
+ this.isForcedSome
141
+ );
142
+ }
143
+
144
+ /**
145
+ * @returns Returns the value of this option if it isSome,
146
+ * otherwise returns the given defaultValue
147
+ */
148
+ public orElse(defaultValue: Value): Value {
149
+ return Provable.if<Value>(
150
+ this.isSome,
151
+ this.valueType,
152
+ this.value,
153
+ defaultValue
154
+ );
155
+ }
156
+
157
+ public toConstant() {
158
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
159
+ const valueConstant = (this.valueType as ProvablePure<Value>).fromFields(
160
+ this.valueType.toFields(this.value).map((field) => field.toConstant())
161
+ );
162
+ const boolConstant = (bool: Bool) =>
163
+ Bool.fromFields([bool.toField().toConstant()]);
164
+
165
+ return new Option(
166
+ boolConstant(this.isSome),
167
+ valueConstant,
168
+ this.valueType,
169
+ boolConstant(this.isForcedSome)
170
+ );
171
+ }
172
+ }
@@ -0,0 +1,50 @@
1
+ import { Field, type FlexibleProvablePure, Poseidon } from "o1js";
2
+
3
+ import { stringToField } from "../utils/utils";
4
+
5
+ /**
6
+ * Helps manage path (key) identifiers for key-values in trees.
7
+ */
8
+ export class Path {
9
+ /**
10
+ * Encodes a JS string as a Field
11
+ *
12
+ * @param value
13
+ * @returns Field representation of the provided value
14
+ */
15
+ public static toField(value: string) {
16
+ return stringToField(value);
17
+ }
18
+
19
+ /**
20
+ * Encodes a class name and its property name into a Field
21
+ *
22
+ * @param className
23
+ * @param propertyKey
24
+ * @returns Field representation of class name + property name
25
+ */
26
+ public static fromProperty(className: string, propertyKey: string): Field {
27
+ return Poseidon.hash([
28
+ Path.toField(className),
29
+ Path.toField(propertyKey),
30
+ Field(0),
31
+ ]);
32
+ }
33
+
34
+ /**
35
+ * Encodes an existing path with the provided key into a single Field.
36
+ *
37
+ * @param path
38
+ * @param keyType
39
+ * @param key
40
+ * @returns Field representation of the leading path + the provided key.
41
+ */
42
+ public static fromKey<KeyType>(
43
+ path: Field,
44
+ keyType: FlexibleProvablePure<KeyType>,
45
+ key: KeyType
46
+ ): Field {
47
+ const keyHash = Poseidon.hash(keyType.toFields(key));
48
+ return Poseidon.hash([path, keyHash]);
49
+ }
50
+ }