@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
@@ -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,88 @@
1
+ import { Provable } from "o1js";
2
+ import { ProvableOption } from "../model/Option";
3
+ import {
4
+ ProvableStateTransition,
5
+ StateTransition,
6
+ } from "../model/StateTransition";
7
+
8
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
9
+
10
+ export class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
11
+ public push(value: ProvableStateTransition) {
12
+ this.pushWithMetadata(value);
13
+
14
+ return this;
15
+ }
16
+
17
+ public pushWithMetadata(value: ProvableStateTransition) {
18
+ return this.pushAndReduce(value, (previous: ProvableStateTransition) => {
19
+ const pathsMatch = previous.path.equals(value.path);
20
+
21
+ // Take the previous.from if the paths match, otherwise leave ST as is
22
+ const from = Provable.if(
23
+ pathsMatch,
24
+ ProvableOption,
25
+ previous.from,
26
+ value.from
27
+ );
28
+ // In case we have a layout like
29
+ // { from: 5, to: 10 }, { from: 10, to: none }
30
+ // we just take the first and discard the second
31
+ const to = Provable.if(
32
+ value.to.isSome.or(pathsMatch.not()),
33
+ ProvableOption,
34
+ value.to,
35
+ previous.to
36
+ );
37
+
38
+ const transition = new ProvableStateTransition({
39
+ path: value.path,
40
+ from: new ProvableOption(from),
41
+ to: new ProvableOption(to),
42
+ });
43
+
44
+ // Assert that connection is correct
45
+ previous.to.value
46
+ .equals(value.from.value)
47
+ .or(
48
+ previous.to.isSome
49
+ .not()
50
+ .and(previous.from.value.equals(value.from.value))
51
+ )
52
+ .or(pathsMatch.not())
53
+ .assertTrue();
54
+
55
+ return [transition, pathsMatch];
56
+ });
57
+ }
58
+ }
59
+
60
+ export function reduceStateTransitions(
61
+ transitions: StateTransition<unknown>[]
62
+ ): StateTransition<unknown>[] {
63
+ const reduced: StateTransition<unknown>[] = [];
64
+
65
+ for (const st of transitions) {
66
+ if (reduced.length === 0) {
67
+ reduced.push(st);
68
+ continue;
69
+ }
70
+
71
+ const last = reduced.at(-1)!;
72
+ if (last.path.equals(st.path).toBoolean()) {
73
+ if (st.toValue.isSome.toBoolean()) {
74
+ reduced.pop();
75
+ reduced.push(
76
+ new StateTransition<unknown>(st.path, last.fromValue, st.toValue)
77
+ );
78
+ } else {
79
+ // Do nothing, because we discard that ST
80
+ // { from: 5, to: 10 }, { from: 10, to: none }
81
+ // cancel the 2nd
82
+ }
83
+ } else {
84
+ reduced.push(st);
85
+ }
86
+ }
87
+ return reduced;
88
+ }
@@ -19,16 +19,15 @@ import {
19
19
  } from "@proto-kit/common";
20
20
  import ZkProgram = Experimental.ZkProgram;
21
21
  import { UnsignedTransaction } from "@proto-kit/sequencer";
22
- import { AccountStateModule } from "../src/blockmodules/AccountStateModule";
22
+ import { AccountStateHook } from "../src/blockmodules/AccountStateHook";
23
23
  import { container } from "tsyringe";
24
24
  import {
25
- BlockModule,
26
25
  DefaultProvableHashList,
27
26
  MethodPublicOutput,
28
27
  NetworkState,
29
28
  Protocol,
30
29
  ProtocolMethodExecutionContext,
31
- ProtocolTransaction,
30
+ SignedTransaction,
32
31
  ProvableStateTransition,
33
32
  RuntimeTransaction,
34
33
  StateTransitionProver,
@@ -87,7 +86,7 @@ describe("blockProver", () => {
87
86
  StateTransitionProver: StateTransitionProver,
88
87
  BlockProver: BlockProver,
89
88
  },
90
- blockModules: [AccountStateModule],
89
+ blockModules: [AccountStateHook],
91
90
  });
92
91
 
93
92
  beforeEach(() => {
@@ -101,7 +100,7 @@ describe("blockProver", () => {
101
100
  fromStateRoot: Field,
102
101
  toStateRoot: Field,
103
102
  protocolHash: Field,
104
- tx: ProtocolTransaction,
103
+ tx: SignedTransaction,
105
104
  networkState: NetworkState
106
105
  ): BlockProverProofPair {
107
106
  const transactionHash =
@@ -3,12 +3,14 @@ import { Protocol, VanillaProtocol } from "../src/protocol/Protocol";
3
3
  import { beforeEach } from "@jest/globals";
4
4
  import { BlockProver } from "../src/prover/block/BlockProver";
5
5
  import { StateTransitionProver } from "../src/prover/statetransition/StateTransitionProver";
6
- import { NoOpStateTransitionWitnessProvider, ProvableTransactionHook } from "../src";
7
- import { AccountStateModule } from "../src/blockmodules/AccountStateModule";
6
+ import {
7
+ NoOpStateTransitionWitnessProvider,
8
+ ProvableTransactionHook,
9
+ } from "../src";
10
+ import { AccountStateHook } from "../src/blockmodules/AccountStateHook";
8
11
 
9
12
  describe("protocol", () => {
10
- beforeEach(() => {
11
- });
13
+ beforeEach(() => {});
12
14
 
13
15
  it("should resolve all provers correctly", async () => {
14
16
  expect.assertions(2);
@@ -16,8 +18,8 @@ describe("protocol", () => {
16
18
  const protocol = VanillaProtocol.create();
17
19
 
18
20
  protocol.dependencyContainer.register("StateTransitionWitnessProvider", {
19
- useValue: new NoOpStateTransitionWitnessProvider()
20
- })
21
+ useValue: new NoOpStateTransitionWitnessProvider(),
22
+ });
21
23
 
22
24
  expect(protocol.blockProver instanceof BlockProver).toBe(true);
23
25
  expect(
@@ -32,13 +34,16 @@ describe("protocol", () => {
32
34
  modules: {
33
35
  BlockProver,
34
36
  StateTransitionProver,
35
- AccountStateModule,
37
+ AccountStateHook,
36
38
  },
37
39
  });
38
40
 
39
- const hooks = protocol.dependencyContainer.resolveAll<ProvableTransactionHook>("ProvableTransactionHook")
41
+ const hooks =
42
+ protocol.dependencyContainer.resolveAll<ProvableTransactionHook>(
43
+ "ProvableTransactionHook"
44
+ );
40
45
 
41
46
  expect(hooks).toHaveLength(1);
42
- expect(hooks[0].name).toBe("AccountStateModule");
43
- })
47
+ expect(hooks[0].name).toBe("AccountStateHook");
48
+ });
44
49
  });
@@ -0,0 +1,45 @@
1
+ describe("inheritance & modularity", () => {
2
+ function decorator<T extends Base>(
3
+ target: T & { constructor: any },
4
+ methodName: string,
5
+ descriptor: PropertyDescriptor
6
+ ) {
7
+ const f = descriptor.value;
8
+ descriptor.value = function (x: Base) {
9
+ console.log("Hello");
10
+ expect((this as any).some()).toBe("testValue");
11
+ f(this);
12
+ };
13
+ }
14
+
15
+ class Base {
16
+ some() {
17
+ return "testValue";
18
+ }
19
+
20
+ @decorator
21
+ x() {}
22
+ }
23
+
24
+ it("expect decorator to work with prototype overriding", () => {
25
+ expect.assertions(3);
26
+
27
+ const f = (base: Base) => {
28
+ expect(base.some()).toBe("testValue");
29
+ };
30
+ const propertyDescriptor: PropertyDescriptor = {
31
+ value: f,
32
+ };
33
+ decorator(Base.prototype, "y", propertyDescriptor);
34
+ (Base.prototype as any).y = propertyDescriptor.value;
35
+
36
+ const base = new Base() as Base & { y: () => void };
37
+
38
+ base.x();
39
+ base.y();
40
+ });
41
+
42
+ it("test correct composition", async () => {
43
+
44
+ });
45
+ });
@@ -0,0 +1,114 @@
1
+ import { Bool, Field, Poseidon } from "o1js";
2
+
3
+ import { StateTransitionReductionList } from "../../src/utils/ProvableReductionHashList";
4
+ import {
5
+ DefaultProvableHashList,
6
+ ProvableStateTransition,
7
+ StateTransition,
8
+ Option,
9
+ } from "../../src";
10
+ import { reduceStateTransitions } from "../../src/model/StateTransitionReduction";
11
+
12
+ interface UnprovableStateTransition {
13
+ path: number;
14
+ from: number;
15
+ to: { isSome: boolean; value: number };
16
+ }
17
+
18
+ describe("provableReductionHashList", () => {
19
+ function mapToProvable(
20
+ sts: UnprovableStateTransition[]
21
+ ): StateTransition<unknown>[] {
22
+ return sts.map(
23
+ (st) =>
24
+ new StateTransition(
25
+ Field(st.path),
26
+ new Option(Bool(true), Field(st.from), Field, Bool(false)),
27
+ new Option(Bool(st.to.isSome), Field(st.to.value), Field, Bool(false))
28
+ ) as StateTransition<unknown>
29
+ );
30
+ }
31
+
32
+ describe.each<[UnprovableStateTransition[], number]>([
33
+ [
34
+ [
35
+ { path: 1, from: 5, to: { isSome: true, value: 10 } },
36
+ { path: 1, from: 10, to: { isSome: true, value: 15 } },
37
+ ],
38
+ 1,
39
+ ],
40
+ [
41
+ [
42
+ { path: 1, from: 5, to: { isSome: true, value: 10 } },
43
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
44
+ ],
45
+ 1,
46
+ ],
47
+ [
48
+ [
49
+ { path: 1, from: 5, to: { isSome: true, value: 10 } },
50
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
51
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
52
+ { path: 5, from: 15, to: { isSome: false, value: 0 } },
53
+ { path: 5, from: 15, to: { isSome: true, value: 20 } },
54
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
55
+ { path: 5, from: 20, to: { isSome: true, value: 25 } },
56
+ { path: 5, from: 25, to: { isSome: true, value: 30 } },
57
+ ],
58
+ 4,
59
+ ],
60
+ ])("should reduce and append correctly", (sts, reducedLength) => {
61
+ it("start from empty list", () => {
62
+ const reductionList = new StateTransitionReductionList(
63
+ ProvableStateTransition
64
+ );
65
+ const normalList = new DefaultProvableHashList(ProvableStateTransition);
66
+
67
+ const provableSTs = mapToProvable(sts);
68
+
69
+ provableSTs.forEach((st) => {
70
+ reductionList.push(st.toProvable());
71
+ });
72
+
73
+ const reduced = reduceStateTransitions(provableSTs);
74
+ reduced.forEach((st) => {
75
+ normalList.push(st.toProvable());
76
+ });
77
+
78
+ expect(reduced).toHaveLength(reducedLength);
79
+ expect(normalList.commitment.toBigInt()).toStrictEqual(
80
+ reductionList.commitment.toBigInt()
81
+ );
82
+ expect(reductionList.unconstrainedList).toHaveLength(reduced.length);
83
+ });
84
+
85
+ it("start from non-zero commitment - skip first reduction", () => {
86
+ const commitment = Poseidon.hash([Field(123_456)]);
87
+ const reductionList = new StateTransitionReductionList(
88
+ ProvableStateTransition,
89
+ commitment
90
+ );
91
+ const normalList = new DefaultProvableHashList(
92
+ ProvableStateTransition,
93
+ commitment
94
+ );
95
+
96
+ const provableSTs = mapToProvable(sts);
97
+
98
+ provableSTs.forEach((st) => {
99
+ reductionList.push(st.toProvable());
100
+ });
101
+
102
+ const reduced = reduceStateTransitions(provableSTs);
103
+ reduced.forEach((st) => {
104
+ normalList.push(st.toProvable());
105
+ });
106
+
107
+ expect(reduced).toHaveLength(reducedLength);
108
+ expect(normalList.commitment.toBigInt()).toStrictEqual(
109
+ reductionList.commitment.toBigInt()
110
+ );
111
+ expect(reductionList.unconstrainedList).toHaveLength(reduced.length);
112
+ });
113
+ });
114
+ });
@@ -1,33 +0,0 @@
1
- import { PublicKey, Struct, UInt64 } from "o1js";
2
-
3
- import { BlockProverExecutionData } from "../prover/block/BlockProvable";
4
- import { StateMap } from "../state/StateMap";
5
- import { protocolState } from "../state/protocol/ProtocolState";
6
- import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
7
- import { assert } from "../state/assert/assert";
8
-
9
- export class AccountState extends Struct({
10
- nonce: UInt64,
11
- }) {}
12
-
13
- export class AccountStateModule extends ProvableTransactionHook {
14
- @protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
15
- PublicKey,
16
- AccountState
17
- );
18
-
19
- public onTransaction({ transaction }: BlockProverExecutionData): void {
20
- const accountState = this.accountState
21
- .get(transaction.sender)
22
- .orElse(new AccountState({ nonce: UInt64.zero }));
23
-
24
- const currentNonce = accountState.nonce;
25
-
26
- assert(currentNonce.equals(transaction.nonce), "Nonce not matching");
27
-
28
- this.accountState.set(
29
- transaction.sender,
30
- new AccountState({ nonce: currentNonce.add(1) })
31
- );
32
- }
33
- }
@@ -1,21 +0,0 @@
1
- import { Provable } from "o1js";
2
- import { NetworkState } from "../model/network/NetworkState";
3
- import {
4
- AfterBlockParameters,
5
- BeforeBlockParameters,
6
- ProvableBlockHook,
7
- } from "../protocol/ProvableBlockHook";
8
-
9
- export class BlockHeightHook extends ProvableBlockHook<Record<string, never>> {
10
- public afterBlock({ networkState }: AfterBlockParameters): NetworkState {
11
- return new NetworkState({
12
- block: {
13
- height: networkState.block.height.add(1),
14
- },
15
- });
16
- }
17
-
18
- public beforeBlock(blockData: BeforeBlockParameters): NetworkState {
19
- return blockData.networkState;
20
- }
21
- }
@@ -1,16 +0,0 @@
1
- import {
2
- AfterBlockParameters,
3
- BeforeBlockParameters,
4
- ProvableBlockHook
5
- } from "../protocol/ProvableBlockHook";
6
- import { NetworkState } from "../model/network/NetworkState";
7
-
8
- export class NoopBlockHook extends ProvableBlockHook<Record<string, never>>{
9
- public afterBlock(blockData: AfterBlockParameters): NetworkState {
10
- return blockData.networkState;
11
- }
12
-
13
- public beforeBlock(blockData: BeforeBlockParameters): NetworkState {
14
- return blockData.networkState;
15
- }
16
- }
@@ -1,25 +0,0 @@
1
- import { Bool, Field, PublicKey, Signature, Struct, UInt64 } from "o1js";
2
-
3
- export class ProtocolTransaction extends Struct({
4
- methodId: Field,
5
- nonce: UInt64,
6
- sender: PublicKey,
7
- argsHash: Field,
8
- signature: Signature,
9
- }) {
10
- public static getSignatureData(args: {
11
- methodId: Field;
12
- nonce: UInt64;
13
- argsHash: Field;
14
- }): Field[] {
15
- return [args.methodId, ...args.nonce.toFields(), args.argsHash];
16
- }
17
-
18
- public getSignatureData(): Field[] {
19
- return ProtocolTransaction.getSignatureData(this);
20
- }
21
-
22
- public validateSignature(): Bool {
23
- return this.signature.verify(this.sender, this.getSignatureData());
24
- }
25
- }
@@ -1,34 +0,0 @@
1
- import { Bool, Field, Struct } from "o1js";
2
- import { match } from "ts-pattern";
3
-
4
- export type BlockTransactionPositionType = "FIRST" | "LAST" | "MIDDLE";
5
-
6
- export class BlockTransactionPosition extends Struct({
7
- type: Field,
8
- }) {
9
- private static readonly fieldMapping: Record<
10
- BlockTransactionPositionType,
11
- number
12
- > = {
13
- FIRST: 0,
14
- MIDDLE: 1,
15
- LAST: 2,
16
- };
17
-
18
- public static fromPositionType(type: BlockTransactionPositionType) {
19
- return new BlockTransactionPosition({
20
- type: Field(BlockTransactionPosition.fieldMapping[type]).toConstant(),
21
- });
22
- }
23
-
24
- public static positionTypeFromIndex(index: number, bundleLength: number) {
25
- return match<number, BlockTransactionPositionType>(index)
26
- .with(0, () => "FIRST")
27
- .with(bundleLength - 1, () => "LAST")
28
- .otherwise(() => "MIDDLE");
29
- }
30
-
31
- public equals(type: BlockTransactionPosition): Bool {
32
- return this.type.equals(type.type);
33
- }
34
- }