@proto-kit/protocol 0.1.1-develop.600 → 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 (134) hide show
  1. package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -1
  2. package/dist/blockmodules/NoopSettlementHook.js +1 -1
  3. package/dist/hooks/AccountStateHook.d.ts.map +1 -1
  4. package/dist/hooks/AccountStateHook.js +10 -3
  5. package/dist/hooks/BlockHeightHook.d.ts +3 -3
  6. package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
  7. package/dist/hooks/BlockHeightHook.js +5 -4
  8. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  9. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  10. package/dist/hooks/LastStateRootBlockHook.js +15 -0
  11. package/dist/hooks/NoopBlockHook.d.ts +6 -4
  12. package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
  13. package/dist/hooks/NoopBlockHook.js +4 -4
  14. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  15. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  16. package/dist/hooks/NoopSettlementHook.js +18 -0
  17. package/dist/index.d.ts +18 -6
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +18 -6
  20. package/dist/model/Option.d.ts +3 -2
  21. package/dist/model/Option.d.ts.map +1 -1
  22. package/dist/model/Option.js +5 -0
  23. package/dist/model/RuntimeLike.d.ts +11 -0
  24. package/dist/model/RuntimeLike.d.ts.map +1 -0
  25. package/dist/model/RuntimeLike.js +1 -0
  26. package/dist/model/StateTransition.d.ts +6 -5
  27. package/dist/model/StateTransition.d.ts.map +1 -1
  28. package/dist/model/StateTransition.js +3 -0
  29. package/dist/model/StateTransitionReduction.d.ts +3 -0
  30. package/dist/model/StateTransitionReduction.d.ts.map +1 -0
  31. package/dist/model/StateTransitionReduction.js +26 -0
  32. package/dist/protocol/Protocol.d.ts +11 -18
  33. package/dist/protocol/Protocol.d.ts.map +1 -1
  34. package/dist/protocol/Protocol.js +4 -27
  35. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  36. package/dist/protocol/ProtocolModule.js +1 -1
  37. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  38. package/dist/prover/block/BlockProver.js +8 -6
  39. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +1 -1
  40. package/dist/prover/statetransition/StateTransitionProver.d.ts +3 -2
  41. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  42. package/dist/prover/statetransition/StateTransitionProver.js +1 -0
  43. package/dist/settlement/ContractModule.d.ts +15 -0
  44. package/dist/settlement/ContractModule.d.ts.map +1 -0
  45. package/dist/settlement/ContractModule.js +11 -0
  46. package/dist/settlement/SettlementContractModule.d.ts +39 -0
  47. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  48. package/dist/settlement/SettlementContractModule.js +68 -0
  49. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
  50. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  51. package/dist/settlement/contracts/DispatchContractProtocolModule.js +36 -0
  52. package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
  53. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  54. package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
  55. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
  56. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  57. package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
  58. package/dist/settlement/contracts/SettlementSmartContract.d.ts +41 -0
  59. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  60. package/dist/settlement/contracts/SettlementSmartContract.js +235 -0
  61. package/dist/settlement/messages/Deposit.d.ts +39 -0
  62. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  63. package/dist/settlement/messages/Deposit.js +6 -0
  64. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +109 -0
  65. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  66. package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
  67. package/dist/settlement/messages/Withdrawal.d.ts +40 -0
  68. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  69. package/dist/settlement/messages/Withdrawal.js +13 -0
  70. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
  71. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  72. package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
  73. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +3 -3
  74. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -1
  75. package/dist/settlement/modules/NetworkStateSettlementModule.js +1 -1
  76. package/dist/state/State.d.ts.map +1 -1
  77. package/dist/state/State.js +2 -1
  78. package/dist/state/assert/assert.d.ts.map +1 -1
  79. package/dist/state/assert/assert.js +8 -5
  80. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +1 -1
  81. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
  82. package/dist/state/context/RuntimeMethodExecutionContext.js +2 -1
  83. package/dist/utils/MinaPrefixedProvableHashList.d.ts +2 -2
  84. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -1
  85. package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
  86. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
  87. package/dist/utils/ProvableHashList.d.ts +3 -3
  88. package/dist/utils/ProvableHashList.d.ts.map +1 -1
  89. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  90. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  91. package/dist/utils/ProvableReductionHashList.js +50 -0
  92. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  93. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  94. package/dist/utils/StateTransitionReductionList.js +60 -0
  95. package/package.json +2 -2
  96. package/src/{blockmodules/AccountStateModule.ts → hooks/AccountStateHook.ts} +3 -1
  97. package/src/{blockmodules → hooks}/NoopSettlementHook.ts +1 -2
  98. package/src/index.ts +18 -6
  99. package/src/model/Option.ts +16 -0
  100. package/src/model/RuntimeLike.ts +12 -0
  101. package/src/model/StateTransition.ts +10 -2
  102. package/src/protocol/Protocol.ts +19 -44
  103. package/src/protocol/ProtocolModule.ts +3 -2
  104. package/src/prover/block/BlockProver.ts +20 -8
  105. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +1 -1
  106. package/src/prover/statetransition/StateTransitionProver.ts +4 -2
  107. package/src/settlement/ContractModule.ts +24 -0
  108. package/src/settlement/SettlementContractModule.ts +127 -0
  109. package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
  110. package/src/settlement/contracts/DispatchSmartContract.ts +135 -0
  111. package/src/settlement/contracts/SettlementContractProtocolModule.ts +65 -0
  112. package/src/settlement/{SettlementContract.ts → contracts/SettlementSmartContract.ts} +87 -202
  113. package/src/settlement/messages/Deposit.ts +6 -0
  114. package/src/settlement/messages/OutgoingMessageArgument.ts +41 -0
  115. package/src/settlement/messages/Withdrawal.ts +14 -0
  116. package/src/settlement/{ProvableSettlementHook.ts → modularity/ProvableSettlementHook.ts} +7 -10
  117. package/src/settlement/modules/NetworkStateSettlementModule.ts +3 -3
  118. package/src/state/State.ts +2 -1
  119. package/src/state/assert/assert.ts +8 -6
  120. package/src/state/context/RuntimeMethodExecutionContext.ts +8 -5
  121. package/src/utils/MinaPrefixedProvableHashList.ts +2 -2
  122. package/src/utils/PrefixedProvableHashList.ts +2 -2
  123. package/src/utils/ProvableHashList.ts +3 -3
  124. package/src/utils/ProvableReductionHashList.ts +68 -0
  125. package/src/utils/StateTransitionReductionList.ts +88 -0
  126. package/test/BlockProver.test.ts +2 -2
  127. package/test/Protocol.test.ts +15 -10
  128. package/test/settlement/SettlementContract.test.ts +45 -0
  129. package/test/utils/ProvableReductionHashList.test.ts +114 -0
  130. /package/src/{blockmodules → hooks}/BlockHeightHook.ts +0 -0
  131. /package/src/{blockmodules → hooks}/LastStateRootBlockHook.ts +0 -0
  132. /package/src/{blockmodules → hooks}/NoopBlockHook.ts +0 -0
  133. /package/src/{blockmodules → hooks}/NoopTransactionHook.ts +0 -0
  134. /package/src/{blockmodules → hooks}/SequenceStateTransactionModule.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,7 +19,7 @@ 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
25
  DefaultProvableHashList,
@@ -86,7 +86,7 @@ describe("blockProver", () => {
86
86
  StateTransitionProver: StateTransitionProver,
87
87
  BlockProver: BlockProver,
88
88
  },
89
- blockModules: [AccountStateModule],
89
+ blockModules: [AccountStateHook],
90
90
  });
91
91
 
92
92
  beforeEach(() => {
@@ -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
+ });
File without changes
File without changes