@proto-kit/protocol 0.1.1-develop.457 → 0.1.1-develop.651

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 (196) hide show
  1. package/dist/blockmodules/AccountStateModule.d.ts.map +1 -1
  2. package/dist/blockmodules/AccountStateModule.js +10 -3
  3. package/dist/blockmodules/BlockHeightHook.d.ts +3 -3
  4. package/dist/blockmodules/BlockHeightHook.d.ts.map +1 -1
  5. package/dist/blockmodules/BlockHeightHook.js +5 -4
  6. package/dist/blockmodules/LastStateRootBlockHook.d.ts +8 -0
  7. package/dist/blockmodules/LastStateRootBlockHook.d.ts.map +1 -0
  8. package/dist/blockmodules/LastStateRootBlockHook.js +15 -0
  9. package/dist/blockmodules/NoopBlockHook.d.ts +6 -4
  10. package/dist/blockmodules/NoopBlockHook.d.ts.map +1 -1
  11. package/dist/blockmodules/NoopBlockHook.js +4 -4
  12. package/dist/blockmodules/NoopSettlementHook.d.ts +6 -0
  13. package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -0
  14. package/dist/blockmodules/NoopSettlementHook.js +18 -0
  15. package/dist/hooks/AccountStateHook.d.ts.map +1 -1
  16. package/dist/hooks/AccountStateHook.js +17 -5
  17. package/dist/hooks/BlockHeightHook.d.ts +3 -3
  18. package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
  19. package/dist/hooks/BlockHeightHook.js +5 -4
  20. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  21. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  22. package/dist/hooks/LastStateRootBlockHook.js +15 -0
  23. package/dist/hooks/NoopBlockHook.d.ts +6 -4
  24. package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
  25. package/dist/hooks/NoopBlockHook.js +4 -4
  26. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  27. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  28. package/dist/hooks/NoopSettlementHook.js +18 -0
  29. package/dist/index.d.ts +24 -6
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +24 -6
  32. package/dist/model/MethodPublicOutput.d.ts +8 -0
  33. package/dist/model/MethodPublicOutput.d.ts.map +1 -1
  34. package/dist/model/MethodPublicOutput.js +1 -0
  35. package/dist/model/Option.d.ts +3 -2
  36. package/dist/model/Option.d.ts.map +1 -1
  37. package/dist/model/Option.js +5 -0
  38. package/dist/model/RuntimeLike.d.ts +11 -0
  39. package/dist/model/RuntimeLike.d.ts.map +1 -0
  40. package/dist/model/RuntimeLike.js +1 -0
  41. package/dist/model/StateTransition.d.ts +6 -5
  42. package/dist/model/StateTransition.d.ts.map +1 -1
  43. package/dist/model/StateTransition.js +3 -0
  44. package/dist/model/StateTransitionReduction.d.ts +3 -0
  45. package/dist/model/StateTransitionReduction.d.ts.map +1 -0
  46. package/dist/model/StateTransitionReduction.js +26 -0
  47. package/dist/model/network/NetworkState.d.ts +40 -0
  48. package/dist/model/network/NetworkState.d.ts.map +1 -1
  49. package/dist/model/network/NetworkState.js +14 -2
  50. package/dist/model/transaction/RuntimeTransaction.d.ts +45 -20
  51. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
  52. package/dist/model/transaction/RuntimeTransaction.js +68 -11
  53. package/dist/model/transaction/SignedTransaction.d.ts +71 -0
  54. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
  55. package/dist/model/transaction/SignedTransaction.js +33 -0
  56. package/dist/model/transaction/ValueOption.d.ts +119 -0
  57. package/dist/model/transaction/ValueOption.d.ts.map +1 -0
  58. package/dist/model/transaction/ValueOption.js +24 -0
  59. package/dist/protocol/Protocol.d.ts +13 -16
  60. package/dist/protocol/Protocol.d.ts.map +1 -1
  61. package/dist/protocol/Protocol.js +26 -39
  62. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  63. package/dist/protocol/ProtocolModule.js +1 -1
  64. package/dist/protocol/ProvableBlockHook.d.ts +2 -10
  65. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
  66. package/dist/protocol/ProvableBlockHook.js +1 -1
  67. package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
  68. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
  69. package/dist/protocol/TransitioningProtocolModule.d.ts +3 -2
  70. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -1
  71. package/dist/protocol/TransitioningProtocolModule.js +3 -2
  72. package/dist/prover/block/BlockProvable.d.ts +106 -28
  73. package/dist/prover/block/BlockProvable.d.ts.map +1 -1
  74. package/dist/prover/block/BlockProvable.js +23 -5
  75. package/dist/prover/block/BlockProver.d.ts +29 -8
  76. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  77. package/dist/prover/block/BlockProver.js +244 -78
  78. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +45 -0
  79. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
  80. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
  81. package/dist/prover/statetransition/StateTransitionProver.d.ts +3 -2
  82. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  83. package/dist/prover/statetransition/StateTransitionProver.js +1 -0
  84. package/dist/settlement/ContractModule.d.ts +15 -0
  85. package/dist/settlement/ContractModule.d.ts.map +1 -0
  86. package/dist/settlement/ContractModule.js +11 -0
  87. package/dist/settlement/ProvableSettlementHook.d.ts +26 -0
  88. package/dist/settlement/ProvableSettlementHook.d.ts.map +1 -0
  89. package/dist/settlement/ProvableSettlementHook.js +3 -0
  90. package/dist/settlement/SettlementContract.d.ts +230 -0
  91. package/dist/settlement/SettlementContract.d.ts.map +1 -0
  92. package/dist/settlement/SettlementContract.js +346 -0
  93. package/dist/settlement/SettlementContractModule.d.ts +39 -0
  94. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  95. package/dist/settlement/SettlementContractModule.js +68 -0
  96. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
  97. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  98. package/dist/settlement/contracts/DispatchContractProtocolModule.js +36 -0
  99. package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
  100. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  101. package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
  102. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
  103. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  104. package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
  105. package/dist/settlement/contracts/SettlementSmartContract.d.ts +41 -0
  106. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  107. package/dist/settlement/contracts/SettlementSmartContract.js +235 -0
  108. package/dist/settlement/messages/Deposit.d.ts +39 -0
  109. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  110. package/dist/settlement/messages/Deposit.js +6 -0
  111. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +109 -0
  112. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  113. package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
  114. package/dist/settlement/messages/Withdrawal.d.ts +40 -0
  115. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  116. package/dist/settlement/messages/Withdrawal.js +13 -0
  117. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
  118. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  119. package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
  120. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  121. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  122. package/dist/settlement/modules/NetworkStateSettlementModule.js +12 -0
  123. package/dist/state/State.d.ts.map +1 -1
  124. package/dist/state/State.js +2 -1
  125. package/dist/state/assert/assert.d.ts.map +1 -1
  126. package/dist/state/assert/assert.js +8 -5
  127. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +75 -1
  128. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
  129. package/dist/state/context/RuntimeMethodExecutionContext.js +21 -2
  130. package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
  131. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  132. package/dist/utils/MinaPrefixedProvableHashList.js +51 -0
  133. package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
  134. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
  135. package/dist/utils/ProvableHashList.d.ts +3 -3
  136. package/dist/utils/ProvableHashList.d.ts.map +1 -1
  137. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  138. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  139. package/dist/utils/ProvableReductionHashList.js +50 -0
  140. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  141. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  142. package/dist/utils/StateTransitionReductionList.js +60 -0
  143. package/package.json +2 -2
  144. package/src/hooks/AccountStateHook.ts +46 -0
  145. package/src/hooks/BlockHeightHook.ts +18 -0
  146. package/src/hooks/LastStateRootBlockHook.ts +26 -0
  147. package/src/hooks/NoopBlockHook.ts +20 -0
  148. package/src/hooks/NoopSettlementHook.ts +20 -0
  149. package/src/hooks/SequenceStateTransactionModule.ts +25 -0
  150. package/src/index.ts +24 -6
  151. package/src/model/MethodPublicOutput.ts +3 -2
  152. package/src/model/Option.ts +16 -0
  153. package/src/model/RuntimeLike.ts +12 -0
  154. package/src/model/StateTransition.ts +10 -2
  155. package/src/model/network/NetworkState.ts +15 -3
  156. package/src/model/transaction/RuntimeTransaction.ts +90 -16
  157. package/src/model/transaction/SignedTransaction.ts +54 -0
  158. package/src/model/transaction/ValueOption.ts +28 -0
  159. package/src/protocol/Protocol.ts +60 -67
  160. package/src/protocol/ProtocolModule.ts +3 -2
  161. package/src/protocol/ProvableBlockHook.ts +10 -13
  162. package/src/protocol/ProvableTransactionHook.ts +2 -1
  163. package/src/protocol/TransitioningProtocolModule.ts +3 -2
  164. package/src/prover/block/BlockProvable.ts +39 -6
  165. package/src/prover/block/BlockProver.ts +484 -142
  166. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
  167. package/src/prover/statetransition/StateTransitionProver.ts +4 -2
  168. package/src/settlement/ContractModule.ts +24 -0
  169. package/src/settlement/SettlementContractModule.ts +127 -0
  170. package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
  171. package/src/settlement/contracts/DispatchSmartContract.ts +135 -0
  172. package/src/settlement/contracts/SettlementContractProtocolModule.ts +65 -0
  173. package/src/settlement/contracts/SettlementSmartContract.ts +329 -0
  174. package/src/settlement/messages/Deposit.ts +6 -0
  175. package/src/settlement/messages/OutgoingMessageArgument.ts +41 -0
  176. package/src/settlement/messages/Withdrawal.ts +14 -0
  177. package/src/settlement/modularity/ProvableSettlementHook.ts +34 -0
  178. package/src/settlement/modules/NetworkStateSettlementModule.ts +39 -0
  179. package/src/state/State.ts +2 -1
  180. package/src/state/assert/assert.ts +8 -6
  181. package/src/state/context/RuntimeMethodExecutionContext.ts +22 -2
  182. package/src/utils/MinaPrefixedProvableHashList.ts +72 -0
  183. package/src/utils/PrefixedProvableHashList.ts +2 -2
  184. package/src/utils/ProvableHashList.ts +3 -3
  185. package/src/utils/ProvableReductionHashList.ts +68 -0
  186. package/src/utils/StateTransitionReductionList.ts +88 -0
  187. package/test/BlockProver.test.ts +4 -5
  188. package/test/Protocol.test.ts +15 -10
  189. package/test/settlement/SettlementContract.test.ts +45 -0
  190. package/test/utils/ProvableReductionHashList.test.ts +114 -0
  191. package/src/blockmodules/AccountStateModule.ts +0 -33
  192. package/src/blockmodules/BlockHeightHook.ts +0 -21
  193. package/src/blockmodules/NoopBlockHook.ts +0 -16
  194. package/src/model/transaction/ProtocolTransaction.ts +0 -25
  195. package/src/prover/block/BlockTransactionPosition.ts +0 -34
  196. /package/src/{blockmodules → hooks}/NoopTransactionHook.ts +0 -0
package/src/index.ts CHANGED
@@ -1,22 +1,29 @@
1
- export * from "./blockmodules/AccountStateModule";
2
- export * from "./blockmodules/BlockHeightHook";
1
+ export * from "./hooks/AccountStateHook";
2
+ export * from "./hooks/BlockHeightHook";
3
3
  export * from "./utils/ProvableHashList";
4
+ export * from "./hooks/LastStateRootBlockHook";
4
5
  export * from "./model/StateTransition";
5
6
  export * from "./model/StateTransitionProvableBatch";
6
7
  export * from "./model/Option";
7
8
  export * from "./model/Path";
8
9
  export * from "./model/network/NetworkState";
9
- export * from "./model/transaction/ProtocolTransaction";
10
+ export * from "./model/transaction/SignedTransaction";
10
11
  export * from "./model/transaction/RuntimeTransaction";
11
- export * from "./utils/PrefixedProvableHashList.js";
12
+ export * from "./model/transaction/ValueOption";
13
+ export * from "./model/MethodPublicOutput";
14
+ export * from "./model/RuntimeLike";
15
+ export * from "./utils/ProvableHashList";
16
+ export * from "./utils/PrefixedProvableHashList";
17
+ export * from "./utils/MinaPrefixedProvableHashList";
18
+ export * from "./utils/ProvableReductionHashList";
19
+ export * from "./utils/StateTransitionReductionList";
12
20
  export * from "./utils/utils";
13
21
  export * from "./prover/block/BlockProver";
14
22
  export * from "./prover/block/BlockProvable";
15
- export * from "./prover/block/BlockTransactionPosition";
23
+ export * from "./prover/block/accummulators/BlockHashMerkleTree";
16
24
  export * from "./prover/statetransition/StateTransitionProver";
17
25
  export * from "./prover/statetransition/StateTransitionProvable";
18
26
  export * from "./prover/statetransition/StateTransitionWitnessProvider";
19
- export * from "./model/MethodPublicOutput";
20
27
  export * from "./prover/statetransition/StateTransitionWitnessProviderReference";
21
28
  export * from "./protocol/Protocol";
22
29
  export * from "./protocol/ProtocolModule";
@@ -32,4 +39,15 @@ export * from "./state/StateMap";
32
39
  export * from "./state/StateService";
33
40
  export * from "./state/StateServiceProvider";
34
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";
35
53
  export { constants as ProtocolConstants } from "./Constants";
@@ -1,4 +1,4 @@
1
- import { Bool, Field, Struct } from "o1js";
1
+ import { Bool, Field, Signature, Struct } from "o1js";
2
2
 
3
3
  /**
4
4
  * Public input used to link in-circuit execution with
@@ -9,4 +9,5 @@ export class MethodPublicOutput extends Struct({
9
9
  status: Bool,
10
10
  transactionHash: Field,
11
11
  networkStateHash: Field,
12
- }) {}
12
+ isMessage: Bool,
13
+ }) {}
@@ -4,6 +4,7 @@ import {
4
4
  type FlexibleProvablePure,
5
5
  Poseidon,
6
6
  Provable,
7
+ ProvablePure,
7
8
  Struct,
8
9
  } from "o1js";
9
10
 
@@ -149,4 +150,19 @@ export class Option<Value> extends OptionBase {
149
150
  defaultValue
150
151
  );
151
152
  }
153
+
154
+ public toConstant() {
155
+ const valueConstant = (this.valueType as ProvablePure<Value>).fromFields(
156
+ this.valueType.toFields(this.value).map((field) => field.toConstant())
157
+ );
158
+ const boolConstant = (bool: Bool) =>
159
+ Bool.fromFields([bool.toField().toConstant()]);
160
+
161
+ return new Option(
162
+ boolConstant(this.isSome),
163
+ valueConstant,
164
+ this.valueType,
165
+ boolConstant(this.isForcedSome)
166
+ );
167
+ }
152
168
  }
@@ -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
+ }
@@ -1,4 +1,4 @@
1
- import { Field, Struct } from "o1js";
1
+ import { Bool, Field, ProvablePure, Struct } from "o1js";
2
2
 
3
3
  import { Option, ProvableOption } from "./Option";
4
4
 
@@ -44,7 +44,7 @@ export class StateTransition<Value> {
44
44
 
45
45
  public constructor(
46
46
  public path: Field,
47
- public fromValue: Option<Field> | Option<Value>,
47
+ public fromValue: Option<Value>,
48
48
  public toValue: Option<Field> | Option<Value>
49
49
  ) {}
50
50
 
@@ -77,4 +77,12 @@ export class StateTransition<Value> {
77
77
  to: this.toValue.toJSON(),
78
78
  };
79
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
+ }
80
88
  }
@@ -1,21 +1,33 @@
1
1
  import { Field, Poseidon, Struct, UInt64 } from "o1js";
2
+ import { RollupMerkleTree } from "@proto-kit/common";
2
3
 
3
4
  export class CurrentBlock extends Struct({
4
5
  height: UInt64,
5
6
  }) {}
6
7
 
8
+ export class PreviousBlock extends Struct({
9
+ rootHash: Field,
10
+ }) {}
11
+
7
12
  export class NetworkState extends Struct({
8
13
  block: CurrentBlock,
14
+ previous: PreviousBlock,
9
15
  }) {
10
16
  public hash(): Field {
11
- return Poseidon.hash(CurrentBlock.toFields(this.block));
17
+ return Poseidon.hash([
18
+ ...CurrentBlock.toFields(this.block),
19
+ ...PreviousBlock.toFields(this.previous),
20
+ ]);
12
21
  }
13
22
 
14
- public static empty(){
23
+ public static empty() {
15
24
  return new NetworkState({
16
25
  block: {
17
26
  height: UInt64.zero,
18
27
  },
19
- })
28
+ previous: {
29
+ rootHash: Field(RollupMerkleTree.EMPTY_ROOT)
30
+ }
31
+ });
20
32
  }
21
33
  }
@@ -1,6 +1,14 @@
1
- import { Field, Poseidon, PublicKey, Struct, UInt64 } from "o1js";
2
-
3
- import { ProtocolTransaction } from "./ProtocolTransaction";
1
+ import {
2
+ Bool,
3
+ Field,
4
+ Poseidon,
5
+ Provable,
6
+ PublicKey,
7
+ Struct,
8
+ UInt64,
9
+ } from "o1js";
10
+ import { PublicKeyOption, UInt64Option } from "./ValueOption";
11
+ import { EMPTY_PUBLICKEY, EMPTY_PUBLICKEY_X } from "@proto-kit/common";
4
12
 
5
13
  /**
6
14
  * This struct is used to expose transaction information to the runtime method
@@ -9,30 +17,96 @@ import { ProtocolTransaction } from "./ProtocolTransaction";
9
17
  */
10
18
  export class RuntimeTransaction extends Struct({
11
19
  methodId: Field,
12
- nonce: UInt64,
13
- sender: PublicKey,
14
20
  argsHash: Field,
21
+ nonce: UInt64Option,
22
+ sender: PublicKeyOption,
15
23
  }) {
16
- public static fromProtocolTransaction({
24
+ public static fromTransaction(input: {
25
+ methodId: Field;
26
+ argsHash: Field;
27
+ nonce: UInt64;
28
+ sender: PublicKey;
29
+ }) {
30
+ return new RuntimeTransaction({
31
+ methodId: input.methodId,
32
+ argsHash: input.argsHash,
33
+ nonce: UInt64Option.fromValue(input.nonce),
34
+ sender: PublicKeyOption.fromValue(input.sender),
35
+ });
36
+ }
37
+
38
+ public static fromMessage({
17
39
  methodId,
18
- nonce,
19
- sender,
20
40
  argsHash,
21
- }: ProtocolTransaction): RuntimeTransaction {
41
+ }: {
42
+ methodId: Field;
43
+ argsHash: Field;
44
+ }) {
22
45
  return new RuntimeTransaction({
23
46
  methodId,
24
- nonce,
25
- sender,
26
47
  argsHash,
48
+ nonce: UInt64Option.none(UInt64.zero),
49
+ sender: PublicKeyOption.none(EMPTY_PUBLICKEY),
27
50
  });
28
51
  }
29
52
 
30
- public hash(): Field {
31
- return Poseidon.hash([
53
+ public static dummyTransaction(): RuntimeTransaction {
54
+ return new RuntimeTransaction({
55
+ methodId: Field(0),
56
+ nonce: new UInt64Option({
57
+ isSome: Bool(true),
58
+ value: UInt64.zero,
59
+ }),
60
+ sender: new PublicKeyOption({
61
+ isSome: Bool(true),
62
+ value: EMPTY_PUBLICKEY,
63
+ }),
64
+ argsHash: Field(0),
65
+ });
66
+ }
67
+
68
+ public assertTransactionType(isMessage: Bool) {
69
+ const isTransaction = isMessage.not();
70
+ // isSome has to be true when it is a transaction, otherwise false
71
+ this.nonce.isSome
72
+ .equals(isTransaction)
73
+ .assertTrue("Nonce is not right option isSome for type");
74
+ this.sender.isSome
75
+ .equals(isTransaction)
76
+ .assertTrue("Sender is not right option isSome for type");
77
+ this.sender.value.x
78
+ .equals(EMPTY_PUBLICKEY_X)
79
+ .equals(isMessage)
80
+ .assertTrue("Transaction sender is not set to dummy");
81
+ }
82
+
83
+ public hashData(): Field[] {
84
+ return [
32
85
  this.methodId,
33
- ...this.sender.toFields(),
34
- ...this.nonce.toFields(),
86
+ ...this.sender.value.toFields(),
87
+ ...this.nonce.value.toFields(),
35
88
  this.argsHash,
36
- ]);
89
+ ];
90
+ }
91
+
92
+ public static fromHashData(fields: Field[]) {
93
+ // sender is 2nd and the first element is x (2nd isOdd)
94
+ const isMessage = fields[1].equals(EMPTY_PUBLICKEY_X);
95
+ return new RuntimeTransaction({
96
+ methodId: fields[0],
97
+ sender: new PublicKeyOption({
98
+ isSome: isMessage.not(),
99
+ value: PublicKey.fromFields([fields[1], fields[2]]),
100
+ }),
101
+ nonce: new UInt64Option({
102
+ isSome: isMessage.not(),
103
+ value: UInt64.fromFields([fields[3]]),
104
+ }),
105
+ argsHash: fields[4],
106
+ });
107
+ }
108
+
109
+ public hash(): Field {
110
+ return Poseidon.hash(this.hashData());
37
111
  }
38
112
  }
@@ -0,0 +1,54 @@
1
+ import {
2
+ Bool,
3
+ Field,
4
+ Scalar,
5
+ Signature,
6
+ Struct,
7
+ UInt64,
8
+ } from "o1js";
9
+
10
+ import { RuntimeTransaction } from "./RuntimeTransaction";
11
+
12
+ export class SignedTransaction extends Struct({
13
+ transaction: RuntimeTransaction,
14
+ signature: Signature,
15
+ }) {
16
+ public static getSignatureData(args: {
17
+ methodId: Field;
18
+ nonce: UInt64;
19
+ argsHash: Field;
20
+ }): Field[] {
21
+ return [args.methodId, ...args.nonce.value.toFields(), args.argsHash];
22
+ }
23
+
24
+ public static dummy(): SignedTransaction {
25
+ return new SignedTransaction({
26
+ transaction: RuntimeTransaction.dummyTransaction(),
27
+
28
+ signature: Signature.fromObject({
29
+ s: Scalar.from(0),
30
+ r: Field(0),
31
+ }),
32
+ });
33
+ }
34
+
35
+ public hash(): Field {
36
+ return this.transaction.hash();
37
+ }
38
+
39
+ public getSignatureData(): Field[] {
40
+ const { methodId, argsHash, nonce } = this.transaction;
41
+ return SignedTransaction.getSignatureData({
42
+ nonce: nonce.value,
43
+ methodId,
44
+ argsHash,
45
+ });
46
+ }
47
+
48
+ public validateSignature(): Bool {
49
+ return this.signature.verify(
50
+ this.transaction.sender.value,
51
+ this.getSignatureData()
52
+ );
53
+ }
54
+ }
@@ -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 fromValue(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
+ ) {}
@@ -19,51 +19,54 @@ import { StateService } from "../state/StateService";
19
19
 
20
20
  import { ProtocolModule } from "./ProtocolModule";
21
21
  import { ProvableTransactionHook } from "./ProvableTransactionHook";
22
- import { NoopTransactionHook } from "../blockmodules/NoopTransactionHook";
22
+ import { NoopTransactionHook } from "../hooks/NoopTransactionHook";
23
23
  import { ProtocolEnvironment } from "./ProtocolEnvironment";
24
- import { AccountStateModule } from "../blockmodules/AccountStateModule";
24
+ import { AccountStateHook } from "../hooks/AccountStateHook";
25
25
  import { ProvableBlockHook } from "./ProvableBlockHook";
26
- import { NoopBlockHook } from "../blockmodules/NoopBlockHook";
27
- import { BlockHeightHook } from "../blockmodules/BlockHeightHook";
26
+ import { NoopBlockHook } from "../hooks/NoopBlockHook";
27
+ import { BlockHeightHook } from "../hooks/BlockHeightHook";
28
+ import { LastStateRootBlockHook } from "../hooks/LastStateRootBlockHook";
29
+ import { ProvableSettlementHook } from "../settlement/modularity/ProvableSettlementHook";
30
+ import { NoopSettlementHook } from "../hooks/NoopSettlementHook";
28
31
 
29
- const PROTOCOL_INJECTION_TOKENS = {
32
+ const PROTOCOL_INJECTION_TOKENS: Record<string, string> = {
30
33
  ProvableTransactionHook: "ProvableTransactionHook",
31
34
  ProvableBlockHook: "ProvableBlockHook",
35
+ ProvableSettlementHook: "ProvableSettlementHook",
32
36
  };
33
37
 
34
- export type GenericProtocolModuleRecord = ModulesRecord<
38
+ export type ProtocolModulesRecord = ModulesRecord<
35
39
  TypedClass<ProtocolModule<unknown>>
36
40
  >;
37
41
 
38
- interface BlockProverType extends ProtocolModule, BlockProvable {}
42
+ export interface BlockProverType extends ProtocolModule, BlockProvable {}
39
43
 
40
- interface StateTransitionProverType
44
+ export interface StateTransitionProverType
41
45
  extends ProtocolModule,
42
46
  StateTransitionProvable {}
43
47
 
44
- export interface ProtocolCustomModulesRecord {
48
+ export type MandatoryProtocolModulesRecord = {
45
49
  BlockProver: TypedClass<BlockProverType>;
46
50
  StateTransitionProver: TypedClass<StateTransitionProverType>;
47
- AccountState: TypedClass<AccountStateModule>;
48
- }
49
-
50
- export interface ProtocolModulesRecord
51
- extends GenericProtocolModuleRecord,
52
- ProtocolCustomModulesRecord {}
51
+ AccountState: TypedClass<AccountStateHook>;
52
+ BlockHeight: TypedClass<BlockHeightHook>;
53
+ LastStateRoot: TypedClass<LastStateRootBlockHook>;
54
+ };
53
55
 
54
56
  export interface ProtocolDefinition<Modules extends ProtocolModulesRecord> {
55
57
  modules: Modules;
56
58
  config?: ModulesConfig<Modules>;
57
59
  }
58
60
 
59
- export class Protocol<Modules extends ProtocolModulesRecord>
61
+ export class Protocol<
62
+ Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord
63
+ >
60
64
  extends ModuleContainer<Modules>
61
65
  implements ProtocolEnvironment
62
66
  {
63
- // .from() to create Protocol
64
- public static from<Modules extends ProtocolModulesRecord>(
65
- modules: ProtocolDefinition<Modules>
66
- ): TypedClass<Protocol<Modules>> {
67
+ public static from<
68
+ Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord
69
+ >(modules: ProtocolDefinition<Modules>): TypedClass<Protocol<Modules>> {
67
70
  return class ScopedProtocol extends Protocol<Modules> {
68
71
  public constructor() {
69
72
  super(modules);
@@ -133,61 +136,51 @@ export class Protocol<Modules extends ProtocolModulesRecord>
133
136
 
134
137
  // Register the BlockModules seperately since we need to
135
138
  // inject them differently later
136
- let atLeastOneTransactionHookRegistered = false;
137
- let atLeastOneBlockHookRegistered = false;
138
- Object.entries(this.definition.modules).forEach(([key, value]) => {
139
- if (Object.prototype.isPrototypeOf.call(ProvableTransactionHook, value)) {
139
+ const ABSTRACT_MODULE_TYPES = [
140
+ { type: ProvableTransactionHook, defaultType: NoopTransactionHook },
141
+ { type: ProvableBlockHook, defaultType: NoopBlockHook },
142
+ { type: ProvableSettlementHook, defaultType: NoopSettlementHook },
143
+ ] as const;
144
+
145
+ ABSTRACT_MODULE_TYPES.forEach((moduleTypeRegistration) => {
146
+ const abstractType = moduleTypeRegistration.type;
147
+
148
+ const implementingModules = Object.entries(
149
+ this.definition.modules
150
+ ).filter(([, value]) =>
151
+ Object.prototype.isPrototypeOf.call(abstractType, value)
152
+ );
153
+
154
+ const newInjectionToken: string | undefined =
155
+ PROTOCOL_INJECTION_TOKENS[abstractType.name];
156
+
157
+ if (newInjectionToken === undefined) {
158
+ log.error(
159
+ "Can't inject hook under the underlying hook token: Alias not found in mapping"
160
+ );
161
+ return;
162
+ }
163
+
164
+ implementingModules.forEach(([key]) => {
140
165
  this.container.register(
141
- PROTOCOL_INJECTION_TOKENS.ProvableTransactionHook,
166
+ abstractType.name,
142
167
  { useToken: key },
143
168
  { lifecycle: Lifecycle.ContainerScoped }
144
169
  );
145
- atLeastOneTransactionHookRegistered = true;
146
- }
147
- if (Object.prototype.isPrototypeOf.call(ProvableBlockHook, value)) {
170
+ });
171
+ if (implementingModules.length === 0) {
172
+ // This type annotation shouldn't change anything but is necessary
173
+ // bcs tsyringe complains
174
+ const { defaultType }: { defaultType: TypedClass<unknown> } =
175
+ moduleTypeRegistration;
176
+
177
+ // Register default (noop) version
148
178
  this.container.register(
149
- PROTOCOL_INJECTION_TOKENS.ProvableBlockHook,
150
- { useToken: key },
179
+ abstractType.name,
180
+ { useClass: defaultType },
151
181
  { lifecycle: Lifecycle.ContainerScoped }
152
182
  );
153
- atLeastOneBlockHookRegistered = true;
154
183
  }
155
184
  });
156
-
157
- // We need this so that tsyringe doesn't throw when no hooks are registered
158
- if (!atLeastOneTransactionHookRegistered) {
159
- this.container.register(
160
- PROTOCOL_INJECTION_TOKENS.ProvableTransactionHook,
161
- { useClass: NoopTransactionHook },
162
- { lifecycle: Lifecycle.ContainerScoped }
163
- );
164
- }
165
- if (!atLeastOneBlockHookRegistered) {
166
- this.container.register(
167
- PROTOCOL_INJECTION_TOKENS.ProvableBlockHook,
168
- { useClass: NoopBlockHook },
169
- { lifecycle: Lifecycle.ContainerScoped }
170
- );
171
- }
172
185
  }
173
186
  }
174
-
175
- export const VanillaProtocol = {
176
- create() {
177
- return VanillaProtocol.from({});
178
- },
179
-
180
- from<AdditonalModules extends GenericProtocolModuleRecord>(
181
- additionalModules: AdditonalModules
182
- ): TypedClass<Protocol<ProtocolModulesRecord>> {
183
- return Protocol.from<ProtocolModulesRecord>({
184
- modules: {
185
- StateTransitionProver,
186
- BlockProver,
187
- AccountState: AccountStateModule,
188
- BlockHeight: BlockHeightHook,
189
- ...additionalModules,
190
- },
191
- });
192
- },
193
- };
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  AreProofsEnabled,
3
3
  ChildContainerProvider,
4
- ConfigurableModule, NoConfig,
5
- noop
4
+ ConfigurableModule,
5
+ NoConfig,
6
+ noop,
6
7
  } from "@proto-kit/common";
7
8
 
8
9
  import { ProtocolEnvironment } from "./ProtocolEnvironment";
@@ -3,20 +3,17 @@ import { NetworkState } from "../model/network/NetworkState";
3
3
 
4
4
  import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
5
5
 
6
- export interface BeforeBlockParameters {
7
- state: BlockProverState;
8
- networkState: NetworkState;
9
- }
10
-
11
- export interface AfterBlockParameters {
12
- state: BlockProverState;
13
- networkState: NetworkState;
14
- }
15
-
16
- // Purpose is to validate transition from -> to network state
6
+ // Purpose is to build transition from -> to network state
17
7
  export abstract class ProvableBlockHook<
18
8
  Config
19
9
  > extends TransitioningProtocolModule<Config> {
20
- public abstract beforeBlock(blockData: BeforeBlockParameters): NetworkState;
21
- public abstract afterBlock(blockData: AfterBlockParameters): NetworkState;
10
+ public abstract beforeBlock(
11
+ networkState: NetworkState,
12
+ state: BlockProverState
13
+ ): NetworkState;
14
+
15
+ public abstract afterBlock(
16
+ networkState: NetworkState,
17
+ state: BlockProverState
18
+ ): NetworkState;
22
19
  }
@@ -1,7 +1,8 @@
1
+ import { NoConfig } from "@proto-kit/common";
2
+
1
3
  import { BlockProverExecutionData } from "../prover/block/BlockProvable";
2
4
 
3
5
  import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
4
- import { NoConfig } from "@proto-kit/common";
5
6
 
6
7
  export abstract class ProvableTransactionHook<
7
8
  Config = NoConfig
@@ -1,8 +1,9 @@
1
1
  import { ProtocolModule } from "./ProtocolModule";
2
2
 
3
3
  /**
4
- * A Protocolmodule that enables it's implementing module to access to
5
- * StateTransitions and state
4
+ * TransitioningProtocolModule is a base interface that allows inheriting
5
+ * classes to use State and StateMap since it requires the implementation
6
+ * of a `name: string` property, which those classes need to function.
6
7
  */
7
8
  export abstract class TransitioningProtocolModule<
8
9
  Config