@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,73 @@
1
+ import { Field, Poseidon, ProvablePure } from "o1js";
2
+ import { hashWithPrefix, prefixToField } from "@proto-kit/common";
3
+
4
+ import { ProvableHashList } from "./ProvableHashList";
5
+
6
+ function salt(prefix: string) {
7
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
8
+ return Poseidon.update(
9
+ [Field(0), Field(0), Field(0)],
10
+ [prefixToField(prefix)]
11
+ ) as [Field, Field, Field];
12
+ }
13
+
14
+ export const MINA_EVENT_PREFIXES = {
15
+ event: "MinaZkappEvent******",
16
+ events: "MinaZkappEvents*****",
17
+ sequenceEvents: "MinaZkappSeqEvents**",
18
+ } as const;
19
+
20
+ export function emptyActions(): Field {
21
+ return salt("MinaZkappActionsEmpty")[0];
22
+ }
23
+
24
+ export function emptyEvents(): Field {
25
+ return salt("MinaZkappEventsEmpty")[0];
26
+ }
27
+
28
+ export class MinaActions {
29
+ static actionHash(
30
+ action: Field[],
31
+ previousHash: Field = emptyActions()
32
+ ): Field {
33
+ const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, action);
34
+ return hashWithPrefix(MINA_EVENT_PREFIXES.sequenceEvents, [
35
+ previousHash,
36
+ actionDataHash,
37
+ ]);
38
+ }
39
+ }
40
+
41
+ export class MinaEvents {
42
+ static eventHash(event: Field[], previousHash: Field = emptyEvents()): Field {
43
+ const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, event);
44
+ return hashWithPrefix(MINA_EVENT_PREFIXES.events, [
45
+ previousHash,
46
+ actionDataHash,
47
+ ]);
48
+ }
49
+ }
50
+
51
+ export class MinaPrefixedProvableHashList<
52
+ Value,
53
+ > extends ProvableHashList<Value> {
54
+ public constructor(
55
+ valueType: ProvablePure<Value>,
56
+ public readonly prefix: string,
57
+ internalCommitment: Field = Field(0)
58
+ ) {
59
+ super(valueType, internalCommitment);
60
+ }
61
+
62
+ protected hash(elements: Field[]): Field {
63
+ const init = salt(this.prefix);
64
+ const digest = Poseidon.update(init, elements);
65
+ return digest[0];
66
+ }
67
+ }
68
+
69
+ export class MinaActionsHashList extends MinaPrefixedProvableHashList<Field> {
70
+ public constructor(internalCommitment: Field = Field(0)) {
71
+ super(Field, MINA_EVENT_PREFIXES.sequenceEvents, internalCommitment);
72
+ }
73
+ }
@@ -0,0 +1,21 @@
1
+ import { Field, ProvablePure, Poseidon } from "o1js";
2
+
3
+ import { ProvableHashList } from "./ProvableHashList.js";
4
+ import { stringToField } from "./utils";
5
+
6
+ export class PrefixedProvableHashList<Value> extends ProvableHashList<Value> {
7
+ private readonly prefix: Field;
8
+
9
+ public constructor(
10
+ valueType: ProvablePure<Value>,
11
+ prefix: string,
12
+ internalCommitment: Field = Field(0)
13
+ ) {
14
+ super(valueType, internalCommitment);
15
+ this.prefix = stringToField(prefix);
16
+ }
17
+
18
+ protected hash(elements: Field[]): Field {
19
+ return Poseidon.hash([this.prefix, ...elements]);
20
+ }
21
+ }
@@ -0,0 +1,50 @@
1
+ import { Field, Poseidon, Bool, Provable, ProvablePure } from "o1js";
2
+
3
+ /**
4
+ * Utilities for creating a hash list from a given value type.
5
+ */
6
+ export abstract class ProvableHashList<Value> {
7
+ public constructor(
8
+ protected readonly valueType: ProvablePure<Value>,
9
+ public commitment: Field = Field(0)
10
+ ) {}
11
+
12
+ protected abstract hash(elements: Field[]): Field;
13
+
14
+ /**
15
+ * Converts the provided value to Field[] and appends it to
16
+ * the current hashlist.
17
+ *
18
+ * @param value - Value to be appended to the hash list
19
+ * @returns Current hash list.
20
+ */
21
+ public push(value: Value) {
22
+ this.commitment = this.hash([
23
+ this.commitment,
24
+ ...this.valueType.toFields(value),
25
+ ]);
26
+ return this;
27
+ }
28
+
29
+ public pushIf(value: Value, condition: Bool) {
30
+ const newCommitment = this.hash([
31
+ this.commitment,
32
+ ...this.valueType.toFields(value),
33
+ ]);
34
+ this.commitment = Provable.if(condition, newCommitment, this.commitment);
35
+ return this;
36
+ }
37
+
38
+ /**
39
+ * @returns Traling hash of the current hashlist.
40
+ */
41
+ public toField() {
42
+ return this.commitment;
43
+ }
44
+ }
45
+
46
+ export class DefaultProvableHashList<Value> extends ProvableHashList<Value> {
47
+ public hash(elements: Field[]): Field {
48
+ return Poseidon.hash(elements);
49
+ }
50
+ }
@@ -0,0 +1,68 @@
1
+ import { Bool, Field, Poseidon, Provable } from "o1js";
2
+
3
+ import { ProvableHashList } from "./ProvableHashList";
4
+
5
+ export class ProvableReductionHashList<Value> extends ProvableHashList<Value> {
6
+ public unconstrainedList: Value[] = [];
7
+
8
+ private constrainedLastValue: Value | undefined = undefined;
9
+
10
+ private preimage: Field = this.commitment;
11
+
12
+ public pushAndReduce(
13
+ value: Value,
14
+ reduce: (previous: Value) => [Value, Bool]
15
+ ): { popLast: Bool; value: Value } {
16
+ let valueToPush = value;
17
+ let popLast = Bool(false);
18
+
19
+ // Theoretically, we can feed the preimage + last value as a witness
20
+ // for non-zero commitment starts (like used in the BlockProver), because
21
+ // currently it won't reduce across chunks. But this is okay for now I think
22
+ if (this.constrainedLastValue !== undefined) {
23
+ [valueToPush, popLast] = reduce(this.constrainedLastValue);
24
+ }
25
+
26
+ Provable.asProver(() => {
27
+ if (popLast.toBoolean()) {
28
+ this.unconstrainedList.pop();
29
+ }
30
+
31
+ const valueAsConstant = this.valueType.fromFields(
32
+ this.valueType.toFields(valueToPush).map((field) => field.toConstant())
33
+ );
34
+ this.unconstrainedList.push(valueAsConstant);
35
+ });
36
+
37
+ const currentCommitment = this.commitment;
38
+ const noPopCommitment = this.hash([
39
+ currentCommitment,
40
+ ...this.valueType.toFields(valueToPush),
41
+ ]);
42
+
43
+ const popCommitment = this.hash([
44
+ this.preimage,
45
+ ...this.valueType.toFields(valueToPush),
46
+ ]);
47
+
48
+ this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
49
+
50
+ this.constrainedLastValue = valueToPush;
51
+ this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
52
+
53
+ return {
54
+ popLast,
55
+ value: valueToPush,
56
+ };
57
+ }
58
+
59
+ public pushIf(value: Value, condition: Bool) {
60
+ throw new Error("pushIf is not implemented for ReducedHashList");
61
+
62
+ return this;
63
+ }
64
+
65
+ public hash(elements: Field[]): Field {
66
+ return Poseidon.hash(elements);
67
+ }
68
+ }
@@ -0,0 +1,89 @@
1
+ import { Provable } from "o1js";
2
+
3
+ import { ProvableOption } from "../model/Option";
4
+ import {
5
+ ProvableStateTransition,
6
+ StateTransition,
7
+ } from "../model/StateTransition";
8
+
9
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
10
+
11
+ export class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
12
+ public push(value: ProvableStateTransition) {
13
+ this.pushWithMetadata(value);
14
+
15
+ return this;
16
+ }
17
+
18
+ public pushWithMetadata(value: ProvableStateTransition) {
19
+ return this.pushAndReduce(value, (previous: ProvableStateTransition) => {
20
+ const pathsMatch = previous.path.equals(value.path);
21
+
22
+ // Take the previous.from if the paths match, otherwise leave ST as is
23
+ const from = Provable.if(
24
+ pathsMatch,
25
+ ProvableOption,
26
+ previous.from,
27
+ value.from
28
+ );
29
+ // In case we have a layout like
30
+ // { from: 5, to: 10 }, { from: 10, to: none }
31
+ // we just take the first and discard the second
32
+ const to = Provable.if(
33
+ value.to.isSome.or(pathsMatch.not()),
34
+ ProvableOption,
35
+ value.to,
36
+ previous.to
37
+ );
38
+
39
+ const transition = new ProvableStateTransition({
40
+ path: value.path,
41
+ from: new ProvableOption(from),
42
+ to: new ProvableOption(to),
43
+ });
44
+
45
+ // Assert that connection is correct
46
+ previous.to.value
47
+ .equals(value.from.value)
48
+ .or(
49
+ previous.to.isSome
50
+ .not()
51
+ .and(previous.from.value.equals(value.from.value))
52
+ )
53
+ .or(pathsMatch.not())
54
+ .assertTrue();
55
+
56
+ return [transition, pathsMatch];
57
+ });
58
+ }
59
+ }
60
+
61
+ export function reduceStateTransitions(
62
+ transitions: StateTransition<unknown>[]
63
+ ): StateTransition<unknown>[] {
64
+ const reduced: StateTransition<unknown>[] = [];
65
+
66
+ transitions.forEach((st) => {
67
+ if (reduced.length === 0) {
68
+ reduced.push(st);
69
+ return;
70
+ }
71
+
72
+ const last = reduced.at(-1)!;
73
+ if (last.path.equals(st.path).toBoolean()) {
74
+ if (st.toValue.isSome.toBoolean()) {
75
+ reduced.pop();
76
+ reduced.push(
77
+ new StateTransition<unknown>(st.path, last.fromValue, st.toValue)
78
+ );
79
+ } else {
80
+ // Do nothing, because we discard that ST
81
+ // { from: 5, to: 10 }, { from: 10, to: none }
82
+ // cancel the 2nd
83
+ }
84
+ } else {
85
+ reduced.push(st);
86
+ }
87
+ });
88
+ return reduced;
89
+ }
@@ -0,0 +1,75 @@
1
+ import { Field, Poseidon, Provable } from "o1js";
2
+ import floor from "lodash/floor";
3
+
4
+ export type ReturnType<FunctionType extends Function> = FunctionType extends (
5
+ ...args: any[]
6
+ ) => infer Return
7
+ ? Return
8
+ : any;
9
+
10
+ export type Subclass<Class extends new (...args: any) => any> = (new (
11
+ ...args: any
12
+ ) => InstanceType<Class>) & {
13
+ [Key in keyof Class]: Class[Key];
14
+ } & { prototype: InstanceType<Class> };
15
+
16
+ export function notInCircuit(): MethodDecorator {
17
+ return function ReplacedFunction(
18
+ target: any,
19
+ propertyKey: string | symbol,
20
+ descriptor: PropertyDescriptor
21
+ ) {
22
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
23
+ const childFunction = descriptor.value;
24
+ descriptor.value = function value(this: any, ...args: any[]) {
25
+ if (Provable.inCheckedComputation() || Provable.inProver()) {
26
+ throw new Error(
27
+ `Method ${propertyKey.toString()} is supposed to be only called outside of the circuit`
28
+ );
29
+ }
30
+ return childFunction.apply(this, args);
31
+ };
32
+ return descriptor;
33
+ };
34
+ }
35
+
36
+ export function stringToField(value: string) {
37
+ const fieldSize = Field.sizeInBytes - 1;
38
+
39
+ // Encode string as byte[]
40
+ const encoder = new TextEncoder();
41
+ const stringBytes = Array.from(encoder.encode(value));
42
+
43
+ // Add padding in case the string is not a multiple of Field.sizeInBytes
44
+ const padding = Array.from<number>({
45
+ length: fieldSize - (stringBytes.length % fieldSize),
46
+ }).fill(0);
47
+ const data = stringBytes.concat(padding).reverse();
48
+
49
+ // Hash the result Field[] to reduce it to
50
+ const chunks = data.reduce<number[][]>(
51
+ (a, b, index) => {
52
+ const arrayIndex = floor(index / fieldSize);
53
+ a[arrayIndex].push(b);
54
+ return a;
55
+ },
56
+
57
+ Array.from<number[]>({ length: floor(data.length / fieldSize) }).map(
58
+ () => []
59
+ )
60
+ );
61
+ const fields = chunks.map((x) =>
62
+ // We have to add a zero at the highest byte here, because a Field is
63
+ // a bit smaller than 2^256
64
+ Field.fromBytes(x.concat([0]))
65
+ );
66
+ return Poseidon.hash(fields);
67
+ }
68
+
69
+ export function singleFieldToString(value: Field | bigint): string {
70
+ let fieldValue = value;
71
+ if (typeof value === "bigint") {
72
+ fieldValue = Field(value);
73
+ }
74
+ return fieldValue.toString();
75
+ }
@@ -0,0 +1,211 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import {
3
+ AreProofsEnabled,
4
+ PlainZkProgram,
5
+ ZkProgrammable,
6
+ } from "@proto-kit/common";
7
+ import { Bool, Field, Proof, UInt64, ZkProgram } from "o1js";
8
+ import "reflect-metadata";
9
+
10
+ import {
11
+ MethodPublicOutput,
12
+ NetworkState,
13
+ SignedTransaction,
14
+ StateTransitionProverPublicInput,
15
+ StateTransitionProverPublicOutput,
16
+ } from "../src";
17
+
18
+ import { createAndInitTestingProtocol } from "./TestingProtocol";
19
+
20
+ type BlockProverProofPair = [
21
+ Proof<void, MethodPublicOutput>,
22
+ Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>,
23
+ ];
24
+
25
+ class MockAppChain implements AreProofsEnabled {
26
+ public areProofsEnabled: boolean = false;
27
+
28
+ setProofsEnabled(areProofsEnabled: boolean): void {
29
+ this.areProofsEnabled = areProofsEnabled;
30
+ }
31
+ }
32
+
33
+ class RuntimeZkProgrammable extends ZkProgrammable<
34
+ undefined,
35
+ MethodPublicOutput
36
+ > {
37
+ get appChain(): AreProofsEnabled | undefined {
38
+ return new MockAppChain();
39
+ }
40
+
41
+ zkProgramFactory(): PlainZkProgram<undefined, MethodPublicOutput>[] {
42
+ const program = ZkProgram({
43
+ name: "BlockProverTestProgram",
44
+ publicOutput: MethodPublicOutput,
45
+ methods: {},
46
+ });
47
+
48
+ return [
49
+ {
50
+ compile: program.compile.bind(program),
51
+ verify: program.verify.bind(program),
52
+ analyzeMethods: program.analyzeMethods.bind(program),
53
+ methods: {},
54
+ Proof: ZkProgram.Proof(program),
55
+ },
56
+ ];
57
+ }
58
+ }
59
+
60
+ describe("blockProver", () => {
61
+ const networkState = new NetworkState({
62
+ block: {
63
+ height: UInt64.zero,
64
+ },
65
+ previous: {
66
+ rootHash: Field(0),
67
+ },
68
+ });
69
+
70
+ const protocol = createAndInitTestingProtocol();
71
+
72
+ function generateTestProofs(
73
+ fromStateRoot: Field,
74
+ toStateRoot: Field,
75
+ toProtocolRoot: Field,
76
+ protocolHash: Field,
77
+ tx: SignedTransaction,
78
+ // eslint-disable-next-line @typescript-eslint/no-shadow
79
+ networkState: NetworkState
80
+ ): BlockProverProofPair {
81
+ const transactionHash = tx.transaction.hash();
82
+ const sthash = Field(123);
83
+
84
+ const appProof = new Proof<undefined, MethodPublicOutput>({
85
+ publicInput: undefined,
86
+ publicOutput: new MethodPublicOutput({
87
+ transactionHash,
88
+ stateTransitionsHash: sthash,
89
+ status: Bool(true),
90
+ networkStateHash: networkState.hash(),
91
+ isMessage: Bool(false),
92
+ eventsHash: Field(0),
93
+ }),
94
+
95
+ proof: "",
96
+ maxProofsVerified: 2,
97
+ });
98
+
99
+ const stProof = new Proof<
100
+ StateTransitionProverPublicInput,
101
+ StateTransitionProverPublicOutput
102
+ >({
103
+ publicInput: new StateTransitionProverPublicInput({
104
+ stateTransitionsHash: Field(0),
105
+ protocolTransitionsHash: Field(0),
106
+ stateRoot: fromStateRoot,
107
+ protocolStateRoot: fromStateRoot,
108
+ }),
109
+ publicOutput: new StateTransitionProverPublicOutput({
110
+ stateTransitionsHash: sthash,
111
+ protocolTransitionsHash: protocolHash,
112
+ stateRoot: toStateRoot,
113
+ protocolStateRoot: toProtocolRoot,
114
+ }),
115
+
116
+ proof: "",
117
+ maxProofsVerified: 2,
118
+ });
119
+
120
+ return [appProof, stProof];
121
+ }
122
+
123
+ it("dummy", () => {
124
+ expect(1).toBe(1);
125
+ });
126
+
127
+ // TODO
128
+ // it("previously applied transaction should also pass with derived publicInputs", () => {
129
+ // expect.assertions(2);
130
+ //
131
+ // const priv = PrivateKey.random();
132
+ //
133
+ // const tx = new UnsignedTransaction({
134
+ // methodId: Field(0),
135
+ // args: [Field(0)],
136
+ // nonce: UInt64.zero,
137
+ // sender: priv.toPublicKey(),
138
+ // })
139
+ // .sign(priv)
140
+ // .toProtocolTransaction();
141
+ //
142
+ // const executionData = {
143
+ // networkState,
144
+ // transaction: tx,
145
+ // };
146
+ //
147
+ // // const asmodule = protocol.resolve()
148
+ //
149
+ // protocol.dependencyContainer
150
+ // .resolveAll<ProvableBlockHook<unknown>>("ProvableBlockHook")
151
+ // .forEach((module) => {
152
+ // module.beforeBlock(executionData);
153
+ // });
154
+ //
155
+ // const hashList = new DefaultProvableHashList(ProvableStateTransition);
156
+ //
157
+ // container
158
+ // .resolve(ProtocolMethodExecutionContext)
159
+ // .current()
160
+ // .result.stateTransitions.map((x) => x.toProvable())
161
+ // .forEach((st) => {
162
+ // hashList.push(st);
163
+ // });
164
+ //
165
+ // const blockProver = protocol.resolve("BlockProver");
166
+ //
167
+ // const fromState = Field(1);
168
+ // const toState = Field(2);
169
+ //
170
+ // const [appProof, stProof] = generateTestProofs(
171
+ // fromState,
172
+ // toState,
173
+ // hashList.commitment,
174
+ // tx,
175
+ // networkState
176
+ // );
177
+ //
178
+ // const fromProverState: BlockProverState = {
179
+ // stateRoot: fromState,
180
+ // transactionsHash: Field(0),
181
+ // networkStateHash: networkState.hash(),
182
+ // };
183
+ //
184
+ // const toProverState = blockProver.applyTransaction(
185
+ // fromProverState,
186
+ // stProof,
187
+ // appProof,
188
+ // executionData
189
+ // );
190
+ //
191
+ // const publicInput = new BlockProverPublicInput({
192
+ // stateRoot: fromProverState.stateRoot,
193
+ // transactionsHash: fromProverState.transactionsHash,
194
+ // networkStateHash: networkState.hash(),
195
+ // });
196
+ //
197
+ // const publicOutput = blockProver.proveTransaction(
198
+ // publicInput,
199
+ // stProof,
200
+ // appProof,
201
+ // { networkState, transaction: tx }
202
+ // );
203
+ //
204
+ // expect(publicOutput.stateRoot).toStrictEqual(toProverState.stateRoot);
205
+ // expect(publicOutput.transactionsHash).toStrictEqual(
206
+ // toProverState.transactionsHash
207
+ // );
208
+ // });
209
+ });
210
+
211
+ /* eslint-enable */
@@ -0,0 +1,37 @@
1
+ import "reflect-metadata";
2
+ import { beforeEach } from "@jest/globals";
3
+
4
+ import { BlockProver } from "../src/prover/block/BlockProver";
5
+ import { StateTransitionProver } from "../src/prover/statetransition/StateTransitionProver";
6
+ import { ProvableTransactionHook } from "../src";
7
+
8
+ import { createAndInitTestingProtocol } from "./TestingProtocol";
9
+
10
+ describe("protocol", () => {
11
+ beforeEach(() => {});
12
+
13
+ it("should resolve all provers correctly", async () => {
14
+ expect.assertions(2);
15
+
16
+ const protocol = createAndInitTestingProtocol();
17
+
18
+ expect(protocol.blockProver instanceof BlockProver).toBe(true);
19
+ expect(
20
+ protocol.stateTransitionProver instanceof StateTransitionProver
21
+ ).toBe(true);
22
+ });
23
+
24
+ it("should initialize hooks correctly", () => {
25
+ expect.assertions(2);
26
+
27
+ const protocol = createAndInitTestingProtocol();
28
+
29
+ const hooks =
30
+ protocol.dependencyContainer.resolveAll<ProvableTransactionHook>(
31
+ "ProvableTransactionHook"
32
+ );
33
+
34
+ expect(hooks).toHaveLength(1);
35
+ expect(hooks[0].name).toBe("AccountState");
36
+ });
37
+ });
@@ -0,0 +1,45 @@
1
+ import "reflect-metadata";
2
+ import { noop } from "@proto-kit/common";
3
+ import { Bool, Field, UInt64 } from "o1js";
4
+ import { container } from "tsyringe";
5
+
6
+ import {
7
+ NetworkState,
8
+ RuntimeMethodExecutionContext,
9
+ RuntimeTransaction,
10
+ State,
11
+ SimpleAsyncStateService,
12
+ StateServiceProvider,
13
+ } from "../src";
14
+
15
+ describe("state", () => {
16
+ beforeEach(() => {
17
+ const executionContext = container.resolve(RuntimeMethodExecutionContext);
18
+
19
+ executionContext.setup({
20
+ transaction: undefined as unknown as RuntimeTransaction,
21
+ networkState: undefined as unknown as NetworkState,
22
+ });
23
+ });
24
+
25
+ it("should decode state correctly", async () => {
26
+ expect.assertions(2);
27
+
28
+ const state = State.from<UInt64>(UInt64);
29
+ const stateService: SimpleAsyncStateService = {
30
+ get: async () => [Field(123)],
31
+
32
+ set: async () => {
33
+ noop();
34
+ },
35
+ };
36
+ state.stateServiceProvider = new StateServiceProvider();
37
+ state.stateServiceProvider.setCurrentStateService(stateService);
38
+ state.path = Field(1);
39
+
40
+ const retrieved = await state.get();
41
+
42
+ expect(retrieved.isSome).toStrictEqual(Bool(true));
43
+ expect(retrieved.value).toStrictEqual(UInt64.from(123));
44
+ });
45
+ });