@proto-kit/protocol 0.1.1-develop.190 → 0.1.1-develop.211

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 (97) hide show
  1. package/dist/blockmodules/AccountStateModule.d.ts +38 -0
  2. package/dist/blockmodules/AccountStateModule.d.ts.map +1 -0
  3. package/dist/blockmodules/AccountStateModule.js +38 -0
  4. package/dist/blockmodules/NoopTransactionHook.d.ts +6 -0
  5. package/dist/blockmodules/NoopTransactionHook.d.ts.map +1 -0
  6. package/dist/blockmodules/NoopTransactionHook.js +5 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +12 -0
  10. package/dist/model/Option.d.ts +8 -8
  11. package/dist/model/Option.d.ts.map +1 -1
  12. package/dist/model/Option.js +7 -15
  13. package/dist/model/StateTransition.d.ts.map +1 -1
  14. package/dist/model/StateTransitionProvableBatch.d.ts +59 -1
  15. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
  16. package/dist/model/StateTransitionProvableBatch.js +58 -4
  17. package/dist/protocol/Protocol.d.ts +21 -6
  18. package/dist/protocol/Protocol.d.ts.map +1 -1
  19. package/dist/protocol/Protocol.js +44 -1
  20. package/dist/protocol/ProtocolModule.d.ts +2 -3
  21. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  22. package/dist/protocol/ProtocolModule.js +1 -3
  23. package/dist/protocol/ProvableTransactionHook.d.ts +6 -0
  24. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
  25. package/dist/protocol/ProvableTransactionHook.js +3 -0
  26. package/dist/protocol/TransitioningProtocolModule.d.ts +5 -0
  27. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
  28. package/dist/protocol/TransitioningProtocolModule.js +3 -0
  29. package/dist/prover/block/BlockProvable.d.ts +2 -2
  30. package/dist/prover/block/BlockProvable.d.ts.map +1 -1
  31. package/dist/prover/block/BlockProver.d.ts +25 -11
  32. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  33. package/dist/prover/block/BlockProver.js +74 -17
  34. package/dist/prover/statetransition/StateTransitionProvable.d.ts +18 -2
  35. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
  36. package/dist/prover/statetransition/StateTransitionProvable.js +2 -0
  37. package/dist/prover/statetransition/StateTransitionProver.d.ts +16 -6
  38. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  39. package/dist/prover/statetransition/StateTransitionProver.js +45 -13
  40. package/dist/state/State.d.ts +60 -0
  41. package/dist/state/State.d.ts.map +1 -0
  42. package/dist/state/State.js +116 -0
  43. package/dist/state/StateMap.d.ts +37 -0
  44. package/dist/state/StateMap.d.ts.map +1 -0
  45. package/dist/state/StateMap.js +56 -0
  46. package/dist/state/StateService.d.ts +6 -0
  47. package/dist/state/StateService.d.ts.map +1 -0
  48. package/dist/state/StateService.js +1 -0
  49. package/dist/state/StateServiceProvider.d.ts +10 -0
  50. package/dist/state/StateServiceProvider.d.ts.map +1 -0
  51. package/dist/state/StateServiceProvider.js +42 -0
  52. package/dist/state/assert/assert.d.ts +12 -0
  53. package/dist/state/assert/assert.d.ts.map +1 -0
  54. package/dist/state/assert/assert.js +23 -0
  55. package/dist/state/context/ProtocolMethodExecutionContext.d.ts +22 -0
  56. package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +1 -0
  57. package/dist/state/context/ProtocolMethodExecutionContext.js +28 -0
  58. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +60 -0
  59. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
  60. package/dist/state/context/RuntimeMethodExecutionContext.js +105 -0
  61. package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
  62. package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
  63. package/dist/state/context/TransitionMethodExecutionContext.js +6 -0
  64. package/dist/state/protocol/ProtocolState.d.ts +7 -0
  65. package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
  66. package/dist/state/protocol/ProtocolState.js +42 -0
  67. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +26 -0
  68. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +1 -0
  69. package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +79 -0
  70. package/package.json +5 -3
  71. package/src/blockmodules/AccountStateModule.ts +31 -0
  72. package/src/blockmodules/NoopTransactionHook.ts +7 -0
  73. package/src/index.ts +12 -0
  74. package/src/model/Option.ts +18 -22
  75. package/src/model/StateTransition.ts +1 -1
  76. package/src/model/StateTransitionProvableBatch.ts +86 -5
  77. package/src/protocol/Protocol.ts +85 -23
  78. package/src/protocol/ProtocolModule.ts +1 -7
  79. package/src/protocol/ProvableTransactionHook.ts +7 -0
  80. package/src/protocol/TransitioningProtocolModule.ts +5 -0
  81. package/src/prover/block/BlockProvable.ts +2 -2
  82. package/src/prover/block/BlockProver.ts +139 -21
  83. package/src/prover/statetransition/StateTransitionProvable.ts +4 -2
  84. package/src/prover/statetransition/StateTransitionProver.ts +93 -13
  85. package/src/state/State.ts +160 -0
  86. package/src/state/StateMap.ts +74 -0
  87. package/src/state/StateService.ts +6 -0
  88. package/src/state/StateServiceProvider.ts +37 -0
  89. package/src/state/assert/assert.test.ts +49 -0
  90. package/src/state/assert/assert.ts +28 -0
  91. package/src/state/context/ProtocolMethodExecutionContext.ts +36 -0
  92. package/src/state/context/RuntimeMethodExecutionContext.ts +124 -0
  93. package/src/state/context/TransitionMethodExecutionContext.ts +27 -0
  94. package/src/state/protocol/ProtocolState.ts +63 -0
  95. package/test/BlockProver.test.ts +139 -36
  96. package/test/Protocol.test.ts +22 -5
  97. package/test/StateTransition.test.ts +1 -1
@@ -1,5 +1,5 @@
1
1
  import { Proof } from "snarkyjs";
2
- import { ZkProgrammable } from "@proto-kit/common";
2
+ import { WithZkProgrammable } from "@proto-kit/common";
3
3
  import { StateTransitionProof } from "../statetransition/StateTransitionProvable";
4
4
  import { MethodPublicOutput } from "../../model/MethodPublicOutput";
5
5
  import { ProtocolTransaction } from "../../model/transaction/ProtocolTransaction";
@@ -141,7 +141,7 @@ declare const BlockProverExecutionData_base: (new (value: {
141
141
  };
142
142
  export declare class BlockProverExecutionData extends BlockProverExecutionData_base {
143
143
  }
144
- export interface BlockProvable extends ZkProgrammable<BlockProverPublicInput, BlockProverPublicOutput> {
144
+ export interface BlockProvable extends WithZkProgrammable<BlockProverPublicInput, BlockProverPublicOutput> {
145
145
  proveTransaction: (publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData) => BlockProverPublicOutput;
146
146
  merge: (publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof) => BlockProverPublicOutput;
147
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BlockProvable.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProvable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAU,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhE,qBAAa,sBAAuB,SAAQ,2BAI1C;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,uBAAwB,SAAQ,4BAG3C;CAAG;AAEL,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAClC,sBAAsB,EACtB,uBAAuB,CACxB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,qBAAa,wBAAyB,SAAQ,6BAI5C;CAAG;AAEL,MAAM,WAAW,aACf,SAAQ,cAAc,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;IACvE,gBAAgB,EAAE,CAChB,WAAW,EAAE,sBAAsB,EACnC,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACzC,aAAa,EAAE,wBAAwB,KACpC,uBAAuB,CAAC;IAE7B,KAAK,EAAE,CACL,WAAW,EAAE,sBAAsB,EACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,KACrB,uBAAuB,CAAC;CAC9B"}
1
+ {"version":3,"file":"BlockProvable.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProvable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAU,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhE,qBAAa,sBAAuB,SAAQ,2BAI1C;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,uBAAwB,SAAQ,4BAG3C;CAAG;AAEL,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAClC,sBAAsB,EACtB,uBAAuB,CACxB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,qBAAa,wBAAyB,SAAQ,6BAI5C;CAAG;AAEL,MAAM,WAAW,aACf,SAAQ,kBAAkB,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;IAC3E,gBAAgB,EAAE,CAChB,WAAW,EAAE,sBAAsB,EACnC,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACzC,aAAa,EAAE,wBAAwB,KACpC,uBAAuB,CAAC;IAE7B,KAAK,EAAE,CACL,WAAW,EAAE,sBAAsB,EACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,KACrB,uBAAuB,CAAC;CAC9B"}
@@ -1,9 +1,10 @@
1
1
  import { Field, type Proof } from "snarkyjs";
2
- import { PlainZkProgram, WithZkProgrammable, ZkProgrammable } from "@proto-kit/common";
2
+ import { AreProofsEnabled, PlainZkProgram, WithZkProgrammable, ZkProgrammable } from "@proto-kit/common";
3
3
  import { MethodPublicOutput } from "../../model/MethodPublicOutput";
4
4
  import { ProtocolModule } from "../../protocol/ProtocolModule";
5
5
  import { StateTransitionProof, StateTransitionProverPublicInput, StateTransitionProverPublicOutput } from "../statetransition/StateTransitionProvable";
6
6
  import { BlockProvable, BlockProverExecutionData, BlockProverProof, BlockProverPublicInput, BlockProverPublicOutput } from "./BlockProvable";
7
+ import { ProvableTransactionHook } from "../../protocol/ProvableTransactionHook";
7
8
  export interface BlockProverState {
8
9
  stateRoot: Field;
9
10
  /**
@@ -17,15 +18,13 @@ export interface BlockProverState {
17
18
  */
18
19
  networkStateHash: Field;
19
20
  }
20
- /**
21
- * BlockProver class, which aggregates a AppChainProof and
22
- * a StateTransitionProof into a single BlockProof, that can
23
- * then be merged to be committed to the base-layer contract
24
- */
25
- export declare class BlockProver extends ProtocolModule<BlockProverPublicInput, BlockProverPublicOutput> implements BlockProvable {
26
- private readonly stateTransitionProver;
27
- private readonly runtime;
28
- constructor(stateTransitionProver: ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, runtime: WithZkProgrammable<void, MethodPublicOutput>);
21
+ export declare class BlockProverProgrammable extends ZkProgrammable<BlockProverPublicInput, BlockProverPublicOutput> {
22
+ private readonly prover;
23
+ readonly stateTransitionProver: ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>;
24
+ readonly runtime: ZkProgrammable<undefined, MethodPublicOutput>;
25
+ private readonly blockModules;
26
+ constructor(prover: BlockProver, stateTransitionProver: ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, runtime: ZkProgrammable<undefined, MethodPublicOutput>, blockModules: ProvableTransactionHook[]);
27
+ get appChain(): AreProofsEnabled | undefined;
29
28
  /**
30
29
  * Applies and checks the two proofs and applies the corresponding state
31
30
  * changes to the given state
@@ -33,9 +32,11 @@ export declare class BlockProver extends ProtocolModule<BlockProverPublicInput,
33
32
  * @param state The from-state of the BlockProver
34
33
  * @param stateTransitionProof
35
34
  * @param appProof
35
+ * @param executionData
36
36
  * @returns The new BlockProver-state to be used as public output
37
37
  */
38
- applyTransaction(state: BlockProverState, stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, appProof: Proof<void, MethodPublicOutput>, { transaction, networkState }: BlockProverExecutionData): BlockProverState;
38
+ applyTransaction(state: BlockProverState, stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData): BlockProverState;
39
+ assertProtocolTransitions(stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, executionData: BlockProverExecutionData): void;
39
40
  proveTransaction(publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData): BlockProverPublicOutput;
40
41
  merge(publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof): BlockProverPublicOutput;
41
42
  /**
@@ -45,4 +46,17 @@ export declare class BlockProver extends ProtocolModule<BlockProverPublicInput,
45
46
  */
46
47
  zkProgramFactory(): PlainZkProgram<BlockProverPublicInput, BlockProverPublicOutput>;
47
48
  }
49
+ /**
50
+ * BlockProver class, which aggregates a AppChainProof and
51
+ * a StateTransitionProof into a single BlockProof, that can
52
+ * then be merged to be committed to the base-layer contract
53
+ */
54
+ export declare class BlockProver extends ProtocolModule implements BlockProvable {
55
+ readonly stateTransitionProver: WithZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>;
56
+ readonly runtime: WithZkProgrammable<undefined, MethodPublicOutput>;
57
+ zkProgrammable: BlockProverProgrammable;
58
+ constructor(stateTransitionProver: WithZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, runtime: WithZkProgrammable<undefined, MethodPublicOutput>, transactionHooks: ProvableTransactionHook[]);
59
+ merge(publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof): BlockProverPublicOutput;
60
+ proveTransaction(publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData): BlockProverPublicOutput;
61
+ }
48
62
  //# sourceMappingURL=BlockProver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlockProver.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProver.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,EAAE,KAAK,KAAK,EAAuB,MAAM,UAAU,CAAC;AAEhF,OAAO,EACL,cAAc,EAEd,kBAAkB,EAClB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,4CAA4C,CAAC;AAGpD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AAiBzB,MAAM,WAAW,gBAAgB;IAE/B,SAAS,EAAE,KAAK,CAAC;IAEjB;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC;IAExB;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC;CACzB;AAED;;;;GAIG;AACH,qBACa,WACX,SAAQ,cAAc,CAAC,sBAAsB,EAAE,uBAAuB,CACtE,YAAW,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAKtC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBALP,qBAAqB,EAAE,cAAc,CACpD,gCAAgC,EAChC,iCAAiC,CAClC,EAEgB,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAKxE;;;;;;;;OAQG;IACI,gBAAgB,CACrB,KAAK,EAAE,gBAAgB,EACvB,oBAAoB,EAAE,KAAK,CACzB,gCAAgC,EAChC,iCAAiC,CAClC,EACD,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACzC,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,wBAAwB,GACtD,gBAAgB;IAyEZ,gBAAgB,CACrB,WAAW,EAAE,sBAAsB,EACnC,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACzC,aAAa,EAAE,wBAAwB,GACtC,uBAAuB;IAqBnB,KAAK,CACV,WAAW,EAAE,sBAAsB,EACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,GACvB,uBAAuB;IA8B1B;;;;OAIG;IACI,gBAAgB,IAAI,cAAc,CACvC,sBAAsB,EACtB,uBAAuB,CACxB;CAkEF"}
1
+ {"version":3,"file":"BlockProver.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProver.ts"],"names":[],"mappings":"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"}
@@ -12,12 +12,14 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  /* eslint-disable max-lines */
14
14
  import { Experimental, Field, Provable, SelfProof } from "snarkyjs";
15
- import { inject, injectable } from "tsyringe";
15
+ import { container, inject, injectable, injectAll } from "tsyringe";
16
16
  import { provableMethod, ZkProgrammable, } from "@proto-kit/common";
17
17
  import { DefaultProvableHashList } from "../../utils/ProvableHashList";
18
18
  import { ProtocolModule } from "../../protocol/ProtocolModule";
19
19
  import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
20
20
  import { BlockProverExecutionData, BlockProverPublicInput, BlockProverPublicOutput, } from "./BlockProvable";
21
+ import { ProvableStateTransition } from "../../model/StateTransition";
22
+ import { RuntimeMethodExecutionContext } from "../../state/context/RuntimeMethodExecutionContext";
21
23
  const errors = {
22
24
  stateProofNotStartingAtZero: () => "StateProof not starting ST-commitment at zero",
23
25
  stateTransitionsHashNotEqual: () => "StateTransition list commitments are not equal",
@@ -25,16 +27,18 @@ const errors = {
25
27
  stateRootNotMatching: (step) => `StateRoots not matching ${step}`,
26
28
  transactionsHashNotMatching: (step) => `transactions hash not matching ${step}`,
27
29
  };
28
- /**
29
- * BlockProver class, which aggregates a AppChainProof and
30
- * a StateTransitionProof into a single BlockProof, that can
31
- * then be merged to be committed to the base-layer contract
32
- */
33
- let BlockProver = class BlockProver extends ProtocolModule {
34
- constructor(stateTransitionProver, runtime) {
30
+ export class BlockProverProgrammable extends ZkProgrammable {
31
+ constructor(
32
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
33
+ prover, stateTransitionProver, runtime, blockModules) {
35
34
  super();
35
+ this.prover = prover;
36
36
  this.stateTransitionProver = stateTransitionProver;
37
37
  this.runtime = runtime;
38
+ this.blockModules = blockModules;
39
+ }
40
+ get appChain() {
41
+ return this.prover.appChain;
38
42
  }
39
43
  /**
40
44
  * Applies and checks the two proofs and applies the corresponding state
@@ -43,9 +47,11 @@ let BlockProver = class BlockProver extends ProtocolModule {
43
47
  * @param state The from-state of the BlockProver
44
48
  * @param stateTransitionProof
45
49
  * @param appProof
50
+ * @param executionData
46
51
  * @returns The new BlockProver-state to be used as public output
47
52
  */
48
- applyTransaction(state, stateTransitionProof, appProof, { transaction, networkState }) {
53
+ applyTransaction(state, stateTransitionProof, appProof, executionData) {
54
+ const { transaction, networkState } = executionData;
49
55
  appProof.verify();
50
56
  stateTransitionProof.verify();
51
57
  const stateTo = { ...state };
@@ -57,6 +63,8 @@ let BlockProver = class BlockProver extends ProtocolModule {
57
63
  // Apply state if status success
58
64
  state.stateRoot.assertEquals(stateTransitionProof.publicInput.stateRoot, errors.propertyNotMatching("from state root"));
59
65
  stateTo.stateRoot = Provable.if(appProof.publicOutput.status, stateTransitionProof.publicOutput.stateRoot, stateTransitionProof.publicInput.stateRoot);
66
+ // Apply protocol state transitions
67
+ this.assertProtocolTransitions(stateTransitionProof, executionData);
60
68
  // Check transaction signature
61
69
  transaction
62
70
  .validateSignature()
@@ -76,6 +84,32 @@ let BlockProver = class BlockProver extends ProtocolModule {
76
84
  stateTo.transactionsHash = transactionList.commitment;
77
85
  return stateTo;
78
86
  }
87
+ // eslint-disable-next-line no-warning-comments, max-len
88
+ // TODO How does this interact with the RuntimeMethodExecutionContext when executing runtimemethods?
89
+ assertProtocolTransitions(stateTransitionProof, executionData) {
90
+ const executionContext = container.resolve(RuntimeMethodExecutionContext);
91
+ executionContext.clear();
92
+ // Setup context for potential calls to runtime methods.
93
+ // This way they can use this.transaction etc. while still having provable
94
+ // integrity between data
95
+ executionContext.setup({
96
+ transaction: RuntimeTransaction.fromProtocolTransaction(executionData.transaction),
97
+ networkState: executionData.networkState,
98
+ });
99
+ executionContext.beforeMethod("", "", []);
100
+ this.blockModules.forEach((module) => {
101
+ module.onTransaction(executionData);
102
+ });
103
+ executionContext.afterMethod();
104
+ const { stateTransitions, status, statusMessage } = executionContext.current().result;
105
+ status.assertTrue(statusMessage);
106
+ const transitions = stateTransitions.map((transition) => transition.toProvable());
107
+ const hashList = new DefaultProvableHashList(ProvableStateTransition, stateTransitionProof.publicInput.protocolTransitionsHash);
108
+ transitions.forEach((transition) => {
109
+ hashList.push(transition);
110
+ });
111
+ stateTransitionProof.publicOutput.protocolTransitionsHash.assertEquals(hashList.commitment, "ProtocolTransitionsHash not matching the generated protocol transitions");
112
+ }
79
113
  proveTransaction(publicInput, stateProof, appProof, executionData) {
80
114
  const state = {
81
115
  transactionsHash: publicInput.transactionsHash,
@@ -108,10 +142,11 @@ let BlockProver = class BlockProver extends ProtocolModule {
108
142
  * injected StateTransitionProver and the required AppChainProof class
109
143
  */
110
144
  zkProgramFactory() {
111
- const StateTransitionProofClass = this.stateTransitionProver.zkProgram.Proof;
112
- const RuntimeProofClass = this.runtime.zkProgrammable.zkProgram.Proof;
113
- const proveTransaction = this.proveTransaction.bind(this);
114
- const merge = this.merge.bind(this);
145
+ const { prover, stateTransitionProver, runtime } = this;
146
+ const StateTransitionProofClass = stateTransitionProver.zkProgram.Proof;
147
+ const RuntimeProofClass = runtime.zkProgram.Proof;
148
+ const proveTransaction = prover.proveTransaction.bind(prover);
149
+ const merge = prover.merge.bind(prover);
115
150
  const program = Experimental.ZkProgram({
116
151
  publicInput: BlockProverPublicInput,
117
152
  publicOutput: BlockProverPublicOutput,
@@ -149,23 +184,45 @@ let BlockProver = class BlockProver extends ProtocolModule {
149
184
  methods,
150
185
  };
151
186
  }
152
- };
187
+ }
153
188
  __decorate([
154
189
  provableMethod(),
155
190
  __metadata("design:type", Function),
156
191
  __metadata("design:paramtypes", [BlockProverPublicInput, Object, Function, BlockProverExecutionData]),
157
192
  __metadata("design:returntype", BlockProverPublicOutput)
158
- ], BlockProver.prototype, "proveTransaction", null);
193
+ ], BlockProverProgrammable.prototype, "proveTransaction", null);
159
194
  __decorate([
160
195
  provableMethod(),
161
196
  __metadata("design:type", Function),
162
197
  __metadata("design:paramtypes", [BlockProverPublicInput, Object, Object]),
163
198
  __metadata("design:returntype", BlockProverPublicOutput)
164
- ], BlockProver.prototype, "merge", null);
199
+ ], BlockProverProgrammable.prototype, "merge", null);
200
+ /**
201
+ * BlockProver class, which aggregates a AppChainProof and
202
+ * a StateTransitionProof into a single BlockProof, that can
203
+ * then be merged to be committed to the base-layer contract
204
+ */
205
+ let BlockProver = class BlockProver extends ProtocolModule {
206
+ constructor(stateTransitionProver, runtime, transactionHooks) {
207
+ super();
208
+ this.stateTransitionProver = stateTransitionProver;
209
+ this.runtime = runtime;
210
+ this.zkProgrammable = new BlockProverProgrammable(this, stateTransitionProver.zkProgrammable, runtime.zkProgrammable, transactionHooks
211
+ // protocol.dependencyContainer.resolveAll("P rovableTransactionHook")
212
+ );
213
+ }
214
+ merge(publicInput, proof1, proof2) {
215
+ return this.zkProgrammable.merge(publicInput, proof1, proof2);
216
+ }
217
+ proveTransaction(publicInput, stateProof, appProof, executionData) {
218
+ return this.zkProgrammable.proveTransaction(publicInput, stateProof, appProof, executionData);
219
+ }
220
+ };
165
221
  BlockProver = __decorate([
166
222
  injectable(),
167
223
  __param(0, inject("StateTransitionProver")),
168
224
  __param(1, inject("Runtime")),
169
- __metadata("design:paramtypes", [ZkProgrammable, Object])
225
+ __param(2, injectAll("ProvableTransactionHook")),
226
+ __metadata("design:paramtypes", [Object, Object, Array])
170
227
  ], BlockProver);
171
228
  export { BlockProver };
@@ -1,21 +1,25 @@
1
1
  import { Proof } from "snarkyjs";
2
- import { ZkProgrammable } from "@proto-kit/common";
2
+ import { WithZkProgrammable } from "@proto-kit/common";
3
3
  import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
4
4
  import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
5
5
  declare const StateTransitionProverPublicInput_base: (new (value: {
6
6
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
7
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
7
8
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
8
9
  }) => {
9
10
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
11
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
10
12
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
11
13
  }) & {
12
14
  _isStruct: true;
13
15
  } & import("snarkyjs/dist/node/snarky").ProvablePure<{
14
16
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
17
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
15
18
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
16
19
  }> & {
17
20
  toInput: (x: {
18
21
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
22
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
19
23
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
20
24
  }) => {
21
25
  fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
@@ -23,16 +27,20 @@ declare const StateTransitionProverPublicInput_base: (new (value: {
23
27
  };
24
28
  toJSON: (x: {
25
29
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
30
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
26
31
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
27
32
  }) => {
28
33
  stateTransitionsHash: string;
34
+ protocolTransitionsHash: string;
29
35
  stateRoot: string;
30
36
  };
31
37
  fromJSON: (x: {
32
38
  stateTransitionsHash: string;
39
+ protocolTransitionsHash: string;
33
40
  stateRoot: string;
34
41
  }) => {
35
42
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
43
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
36
44
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
37
45
  };
38
46
  };
@@ -40,18 +48,22 @@ export declare class StateTransitionProverPublicInput extends StateTransitionPro
40
48
  }
41
49
  declare const StateTransitionProverPublicOutput_base: (new (value: {
42
50
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
51
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
43
52
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
44
53
  }) => {
45
54
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
55
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
46
56
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
47
57
  }) & {
48
58
  _isStruct: true;
49
59
  } & import("snarkyjs/dist/node/snarky").ProvablePure<{
50
60
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
61
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
51
62
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
52
63
  }> & {
53
64
  toInput: (x: {
54
65
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
66
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
55
67
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
56
68
  }) => {
57
69
  fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
@@ -59,23 +71,27 @@ declare const StateTransitionProverPublicOutput_base: (new (value: {
59
71
  };
60
72
  toJSON: (x: {
61
73
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
74
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
62
75
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
63
76
  }) => {
64
77
  stateTransitionsHash: string;
78
+ protocolTransitionsHash: string;
65
79
  stateRoot: string;
66
80
  };
67
81
  fromJSON: (x: {
68
82
  stateTransitionsHash: string;
83
+ protocolTransitionsHash: string;
69
84
  stateRoot: string;
70
85
  }) => {
71
86
  stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
87
+ protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
72
88
  stateRoot: import("snarkyjs/dist/node/lib/field").Field;
73
89
  };
74
90
  };
75
91
  export declare class StateTransitionProverPublicOutput extends StateTransitionProverPublicOutput_base {
76
92
  }
77
93
  export type StateTransitionProof = Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>;
78
- export interface StateTransitionProvable extends ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput> {
94
+ export interface StateTransitionProvable extends WithZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput> {
79
95
  witnessProviderReference: StateTransitionWitnessProviderReference;
80
96
  runBatch: (publicInput: StateTransitionProverPublicInput, batch: StateTransitionProvableBatch) => StateTransitionProverPublicOutput;
81
97
  merge: (publicInput: StateTransitionProverPublicInput, proof1: StateTransitionProof, proof2: StateTransitionProof) => StateTransitionProverPublicOutput;
@@ -1 +1 @@
1
- {"version":3,"file":"StateTransitionProvable.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProvable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAU,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAExF,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpG,qBAAa,gCAAiC,SAAQ,qCAGpD;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,iCAAkC,SAAQ,sCAGrD;CAAG;AAEL,MAAM,MAAM,oBAAoB,GAAG,KAAK,CACtC,gCAAgC,EAChC,iCAAiC,CAClC,CAAC;AAEF,MAAM,WAAW,uBACf,SAAQ,cAAc,CACpB,gCAAgC,EAChC,iCAAiC,CAClC;IACD,wBAAwB,EAAE,uCAAuC,CAAC;IAElE,QAAQ,EAAE,CACR,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,KAChC,iCAAiC,CAAC;IAEvC,KAAK,EAAE,CACL,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,KACzB,iCAAiC,CAAC;CACxC"}
1
+ {"version":3,"file":"StateTransitionProvable.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProvable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAU,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAkB,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAExF,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpG,qBAAa,gCAAiC,SAAQ,qCAIpD;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,iCAAkC,SAAQ,sCAIrD;CAAG;AAEL,MAAM,MAAM,oBAAoB,GAAG,KAAK,CACtC,gCAAgC,EAChC,iCAAiC,CAClC,CAAC;AAEF,MAAM,WAAW,uBACf,SAAQ,kBAAkB,CACxB,gCAAgC,EAChC,iCAAiC,CAClC;IACD,wBAAwB,EAAE,uCAAuC,CAAC;IAElE,QAAQ,EAAE,CACR,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,KAChC,iCAAiC,CAAC;IAEvC,KAAK,EAAE,CACL,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,KACzB,iCAAiC,CAAC;CACxC"}
@@ -1,11 +1,13 @@
1
1
  import { Field, Struct } from "snarkyjs";
2
2
  export class StateTransitionProverPublicInput extends Struct({
3
3
  stateTransitionsHash: Field,
4
+ protocolTransitionsHash: Field,
4
5
  stateRoot: Field,
5
6
  }) {
6
7
  }
7
8
  export class StateTransitionProverPublicOutput extends Struct({
8
9
  stateTransitionsHash: Field,
10
+ protocolTransitionsHash: Field,
9
11
  stateRoot: Field,
10
12
  }) {
11
13
  }
@@ -1,39 +1,49 @@
1
1
  import { Field } from "snarkyjs";
2
- import { PlainZkProgram } from "@proto-kit/common";
2
+ import { AreProofsEnabled, PlainZkProgram, ZkProgrammable } from "@proto-kit/common";
3
3
  import { ProvableHashList } from "../../utils/ProvableHashList";
4
4
  import { ProvableStateTransition } from "../../model/StateTransition";
5
- import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
5
+ import { ProvableStateTransitionType, StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
6
6
  import { ProtocolModule } from "../../protocol/ProtocolModule";
7
7
  import { StateTransitionProvable, StateTransitionProverPublicInput, StateTransitionProof, StateTransitionProverPublicOutput } from "./StateTransitionProvable";
8
8
  import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
9
9
  interface StateTransitionProverExecutionState {
10
10
  stateRoot: Field;
11
11
  stateTransitionList: ProvableHashList<ProvableStateTransition>;
12
+ protocolTransitionList: ProvableHashList<ProvableStateTransition>;
12
13
  }
13
14
  /**
14
15
  * StateTransitionProver is the prover that proves the application of some state
15
16
  * transitions and checks and updates their merkle-tree entries
16
17
  */
17
- export declare class StateTransitionProver extends ProtocolModule<StateTransitionProverPublicInput, StateTransitionProverPublicOutput> implements StateTransitionProvable {
18
+ export declare class StateTransitionProverProgrammable extends ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput> {
19
+ private readonly stateTransitionProver;
18
20
  readonly witnessProviderReference: StateTransitionWitnessProviderReference;
19
- constructor(witnessProviderReference: StateTransitionWitnessProviderReference);
21
+ constructor(stateTransitionProver: StateTransitionProver, witnessProviderReference: StateTransitionWitnessProviderReference);
22
+ get appChain(): AreProofsEnabled | undefined;
20
23
  zkProgramFactory(): PlainZkProgram<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>;
21
24
  private get witnessProvider();
22
25
  /**
23
26
  * Applies the state transitions to the current stateRoot
24
27
  * and returns the new prover state
25
28
  */
26
- applyTransitions(stateRoot: Field, stateTransitionCommitmentFrom: Field, transitionBatch: StateTransitionProvableBatch): StateTransitionProverExecutionState;
29
+ applyTransitions(stateRoot: Field, stateTransitionCommitmentFrom: Field, protocolTransitionCommitmentFrom: Field, transitionBatch: StateTransitionProvableBatch): StateTransitionProverExecutionState;
27
30
  /**
28
31
  * Applies a single state transition to the given state
29
32
  * and mutates it in place
30
33
  */
31
- applyTransition(state: StateTransitionProverExecutionState, transition: ProvableStateTransition, index?: number): void;
34
+ applyTransition(state: StateTransitionProverExecutionState, transition: ProvableStateTransition, type: ProvableStateTransitionType, index?: number): void;
32
35
  /**
33
36
  * Applies a whole batch of StateTransitions at once
34
37
  */
35
38
  runBatch(publicInput: StateTransitionProverPublicInput, batch: StateTransitionProvableBatch): StateTransitionProverPublicOutput;
36
39
  merge(publicInput: StateTransitionProverPublicInput, proof1: StateTransitionProof, proof2: StateTransitionProof): StateTransitionProverPublicOutput;
37
40
  }
41
+ export declare class StateTransitionProver extends ProtocolModule implements StateTransitionProvable {
42
+ readonly witnessProviderReference: StateTransitionWitnessProviderReference;
43
+ readonly zkProgrammable: StateTransitionProverProgrammable;
44
+ constructor(witnessProviderReference: StateTransitionWitnessProviderReference);
45
+ runBatch(publicInput: StateTransitionProverPublicInput, batch: StateTransitionProvableBatch): StateTransitionProverPublicOutput;
46
+ merge(publicInput: StateTransitionProverPublicInput, proof1: StateTransitionProof, proof2: StateTransitionProof): StateTransitionProverPublicOutput;
47
+ }
38
48
  export {};
39
49
  //# sourceMappingURL=StateTransitionProver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StateTransitionProver.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAuB,MAAM,UAAU,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAkB,MAAM,mBAAmB,CAAC;AAMnE,OAAO,EAEL,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAExF,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,oBAAoB,EACpB,iCAAiC,EAClC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC;AAmBpG,UAAU,mCAAmC;IAC3C,SAAS,EAAE,KAAK,CAAC;IACjB,mBAAmB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;CAChE;AAOD;;;GAGG;AACH,qBACa,qBACX,SAAQ,cAAc,CACpB,gCAAgC,EAChC,iCAAiC,CAEnC,YAAW,uBAAuB;aAIhB,wBAAwB,EAAE,uCAAuC;gBAAjE,wBAAwB,EAAE,uCAAuC;IAK5E,gBAAgB,IAAI,cAAc,CACvC,gCAAgC,EAChC,iCAAiC,CAClC;IAqDD,OAAO,KAAK,eAAe,GAM1B;IAED;;;OAGG;IACI,gBAAgB,CACrB,SAAS,EAAE,KAAK,EAChB,6BAA6B,EAAE,KAAK,EACpC,eAAe,EAAE,4BAA4B,GAC5C,mCAAmC;IAsBtC;;;OAGG;IACI,eAAe,CACpB,KAAK,EAAE,mCAAmC,EAC1C,UAAU,EAAE,uBAAuB,EACnC,KAAK,SAAI;IAgCX;;OAEG;IAEI,QAAQ,CACb,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,GAClC,iCAAiC;IAc7B,KAAK,CACV,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,GAC3B,iCAAiC;CA6BrC"}
1
+ {"version":3,"file":"StateTransitionProver.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProver.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,EAAuB,MAAM,UAAU,CAAC;AAEpE,OAAO,EACL,gBAAgB,EAChB,cAAc,EAEd,cAAc,EACf,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAEL,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,oBAAoB,EACpB,iCAAiC,EAClC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC;AAsBpG,UAAU,mCAAmC;IAC3C,SAAS,EAAE,KAAK,CAAC;IACjB,mBAAmB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAC/D,sBAAsB,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;CACnE;AAOD;;;GAGG;AACH,qBAAa,iCAAkC,SAAQ,cAAc,CACnE,gCAAgC,EAChC,iCAAiC,CAClC;IAGG,OAAO,CAAC,QAAQ,CAAC,qBAAqB;aACtB,wBAAwB,EAAE,uCAAuC;gBADhE,qBAAqB,EAAE,qBAAqB,EAC7C,wBAAwB,EAAE,uCAAuC;IAKnF,IAAW,QAAQ,IAAI,gBAAgB,GAAG,SAAS,CAElD;IAEM,gBAAgB,IAAI,cAAc,CACvC,gCAAgC,EAChC,iCAAiC,CAClC;IAqDD,OAAO,KAAK,eAAe,GAM1B;IAED;;;OAGG;IACI,gBAAgB,CACrB,SAAS,EAAE,KAAK,EAChB,6BAA6B,EAAE,KAAK,EACpC,gCAAgC,EAAE,KAAK,EACvC,eAAe,EAAE,4BAA4B,GAC5C,mCAAmC;IA4BtC;;;OAGG;IACI,eAAe,CACpB,KAAK,EAAE,mCAAmC,EAC1C,UAAU,EAAE,uBAAuB,EACnC,IAAI,EAAE,2BAA2B,EACjC,KAAK,SAAI;IAyCX;;OAEG;IAEI,QAAQ,CACb,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,GAClC,iCAAiC;IAgB7B,KAAK,CACV,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,GAC3B,iCAAiC;CA0CrC;AAED,qBACa,qBACX,SAAQ,cACR,YAAW,uBAAuB;aAMhB,wBAAwB,EAAE,uCAAuC;IAJnF,SAAgB,cAAc,EAAE,iCAAiC,CAAC;gBAIhD,wBAAwB,EAAE,uCAAuC;IAS5E,QAAQ,CACb,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,GAClC,iCAAiC;IAI7B,KAAK,CACV,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,GAC3B,iCAAiC;CAGrC"}
@@ -7,13 +7,14 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
+ /* eslint-disable max-lines */
10
11
  import { Experimental, Field, Provable, SelfProof } from "snarkyjs";
11
12
  import { injectable } from "tsyringe";
12
- import { provableMethod } from "@proto-kit/common";
13
+ import { provableMethod, ZkProgrammable, } from "@proto-kit/common";
13
14
  import { MerkleTreeUtils, RollupMerkleWitness, } from "../../utils/merkletree/RollupMerkleTree.js";
14
15
  import { DefaultProvableHashList, } from "../../utils/ProvableHashList";
15
16
  import { ProvableStateTransition } from "../../model/StateTransition";
16
- import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
17
+ import { StateTransitionProvableBatch, } from "../../model/StateTransitionProvableBatch";
17
18
  import { constants } from "../../Constants";
18
19
  import { ProtocolModule } from "../../protocol/ProtocolModule";
19
20
  import { StateTransitionProverPublicInput, StateTransitionProverPublicOutput, } from "./StateTransitionProvable";
@@ -21,6 +22,7 @@ import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnes
21
22
  const errors = {
22
23
  stateRootNotMatching: (step) => `StateRoots not matching ${step}`,
23
24
  stateTransitionsHashNotMatching: (step) => `State transitions hash not matching ${step}`,
25
+ protocolTransitionsHashNotMatching: (step) => `Protocol transitions hash not matching ${step}`,
24
26
  merkleWitnessNotCorrect: (index) => `MerkleWitness not valid for StateTransition (${index})`,
25
27
  noWitnessProviderSet: () => new Error("WitnessProvider not set, set it before you use StateTransitionProvider"),
26
28
  propertyNotMatching: (propertyName) => `${propertyName} not matching`,
@@ -30,13 +32,17 @@ const StateTransitionSelfProofClass = (SelfProof);
30
32
  * StateTransitionProver is the prover that proves the application of some state
31
33
  * transitions and checks and updates their merkle-tree entries
32
34
  */
33
- let StateTransitionProver = class StateTransitionProver extends ProtocolModule {
35
+ export class StateTransitionProverProgrammable extends ZkProgrammable {
34
36
  constructor(
35
- // Injected
36
- witnessProviderReference) {
37
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
38
+ stateTransitionProver, witnessProviderReference) {
37
39
  super();
40
+ this.stateTransitionProver = stateTransitionProver;
38
41
  this.witnessProviderReference = witnessProviderReference;
39
42
  }
43
+ get appChain() {
44
+ return this.stateTransitionProver.appChain;
45
+ }
40
46
  zkProgramFactory() {
41
47
  // eslint-disable-next-line max-len
42
48
  // eslint-disable-next-line @typescript-eslint/no-this-alias,consistent-this,unicorn/no-this-assignment
@@ -85,14 +91,16 @@ let StateTransitionProver = class StateTransitionProver extends ProtocolModule {
85
91
  * Applies the state transitions to the current stateRoot
86
92
  * and returns the new prover state
87
93
  */
88
- applyTransitions(stateRoot, stateTransitionCommitmentFrom, transitionBatch) {
94
+ applyTransitions(stateRoot, stateTransitionCommitmentFrom, protocolTransitionCommitmentFrom, transitionBatch) {
89
95
  const state = {
90
96
  stateRoot,
91
97
  stateTransitionList: new DefaultProvableHashList(ProvableStateTransition, stateTransitionCommitmentFrom),
98
+ protocolTransitionList: new DefaultProvableHashList(ProvableStateTransition, protocolTransitionCommitmentFrom),
92
99
  };
93
100
  const transitions = transitionBatch.batch;
101
+ const types = transitionBatch.transitionTypes;
94
102
  for (let index = 0; index < constants.stateTransitionProverBatchSize; index++) {
95
- this.applyTransition(state, transitions[index], index);
103
+ this.applyTransition(state, transitions[index], types[index], index);
96
104
  }
97
105
  return state;
98
106
  }
@@ -100,24 +108,29 @@ let StateTransitionProver = class StateTransitionProver extends ProtocolModule {
100
108
  * Applies a single state transition to the given state
101
109
  * and mutates it in place
102
110
  */
103
- applyTransition(state, transition, index = 0) {
111
+ applyTransition(state, transition, type, index = 0) {
104
112
  const treeWitness = Provable.witness(RollupMerkleWitness, () => this.witnessProvider.getWitness(transition.path));
105
113
  const membershipValid = MerkleTreeUtils.checkMembership(treeWitness, state.stateRoot, transition.path, transition.from.value);
106
114
  membershipValid
107
115
  .or(transition.from.isSome.not())
108
116
  .assertTrue(errors.merkleWitnessNotCorrect(index));
117
+ const t = Date.now();
109
118
  const newRoot = MerkleTreeUtils.computeRoot(treeWitness, transition.to.value);
119
+ Provable.log("Compute root took", Date.now() - t, "ms");
110
120
  state.stateRoot = Provable.if(transition.to.isSome, newRoot, state.stateRoot);
111
- state.stateTransitionList.pushIf(transition, transition.path.equals(Field(0)).not());
121
+ const isNotDummy = transition.path.equals(Field(0)).not();
122
+ state.stateTransitionList.pushIf(transition, isNotDummy.and(type.isNormal()));
123
+ state.protocolTransitionList.pushIf(transition, isNotDummy.and(type.isProtocol()));
112
124
  }
113
125
  /**
114
126
  * Applies a whole batch of StateTransitions at once
115
127
  */
116
128
  runBatch(publicInput, batch) {
117
- const result = this.applyTransitions(publicInput.stateRoot, publicInput.stateTransitionsHash, batch);
129
+ const result = this.applyTransitions(publicInput.stateRoot, publicInput.stateTransitionsHash, publicInput.protocolTransitionsHash, batch);
118
130
  return new StateTransitionProverPublicOutput({
119
131
  stateRoot: result.stateRoot,
120
132
  stateTransitionsHash: result.stateTransitionList.commitment,
133
+ protocolTransitionsHash: result.protocolTransitionList.commitment,
121
134
  });
122
135
  }
123
136
  merge(publicInput, proof1, proof2) {
@@ -129,25 +142,44 @@ let StateTransitionProver = class StateTransitionProver extends ProtocolModule {
129
142
  // Check ST list
130
143
  publicInput.stateTransitionsHash.assertEquals(proof1.publicInput.stateTransitionsHash, errors.stateTransitionsHashNotMatching("publicInput.from -> proof1.from"));
131
144
  proof1.publicOutput.stateTransitionsHash.assertEquals(proof2.publicInput.stateTransitionsHash, errors.stateTransitionsHashNotMatching("proof1.to -> proof2.from"));
145
+ // Check Protocol ST list
146
+ publicInput.protocolTransitionsHash.assertEquals(proof1.publicInput.protocolTransitionsHash, errors.protocolTransitionsHashNotMatching("publicInput.from -> proof1.from"));
147
+ proof1.publicOutput.protocolTransitionsHash.assertEquals(proof2.publicInput.protocolTransitionsHash, errors.protocolTransitionsHashNotMatching("proof1.to -> proof2.from"));
132
148
  return new StateTransitionProverPublicInput({
133
149
  stateRoot: proof2.publicOutput.stateRoot,
134
150
  stateTransitionsHash: proof2.publicOutput.stateTransitionsHash,
151
+ protocolTransitionsHash: proof2.publicOutput.protocolTransitionsHash,
135
152
  });
136
153
  }
137
- };
154
+ }
138
155
  __decorate([
139
156
  provableMethod(),
140
157
  __metadata("design:type", Function),
141
158
  __metadata("design:paramtypes", [StateTransitionProverPublicInput,
142
159
  StateTransitionProvableBatch]),
143
160
  __metadata("design:returntype", StateTransitionProverPublicOutput)
144
- ], StateTransitionProver.prototype, "runBatch", null);
161
+ ], StateTransitionProverProgrammable.prototype, "runBatch", null);
145
162
  __decorate([
146
163
  provableMethod(),
147
164
  __metadata("design:type", Function),
148
165
  __metadata("design:paramtypes", [StateTransitionProverPublicInput, Object, Object]),
149
166
  __metadata("design:returntype", StateTransitionProverPublicOutput)
150
- ], StateTransitionProver.prototype, "merge", null);
167
+ ], StateTransitionProverProgrammable.prototype, "merge", null);
168
+ let StateTransitionProver = class StateTransitionProver extends ProtocolModule {
169
+ constructor(
170
+ // Injected
171
+ witnessProviderReference) {
172
+ super();
173
+ this.witnessProviderReference = witnessProviderReference;
174
+ this.zkProgrammable = new StateTransitionProverProgrammable(this, witnessProviderReference);
175
+ }
176
+ runBatch(publicInput, batch) {
177
+ return this.zkProgrammable.runBatch(publicInput, batch);
178
+ }
179
+ merge(publicInput, proof1, proof2) {
180
+ return this.zkProgrammable.merge(publicInput, proof1, proof2);
181
+ }
182
+ };
151
183
  StateTransitionProver = __decorate([
152
184
  injectable(),
153
185
  __metadata("design:paramtypes", [StateTransitionWitnessProviderReference])