@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
@@ -3,10 +3,15 @@ import { AreProofsEnabled, PlainZkProgram, WithZkProgrammable, ZkProgrammable }
3
3
  import { MethodPublicOutput } from "../../model/MethodPublicOutput";
4
4
  import { ProtocolModule } from "../../protocol/ProtocolModule";
5
5
  import { StateTransitionProof, StateTransitionProverPublicInput, StateTransitionProverPublicOutput } from "../statetransition/StateTransitionProvable";
6
- import { BlockProvable, BlockProverExecutionData, BlockProverProof, BlockProverPublicInput, BlockProverPublicOutput } from "./BlockProvable";
7
6
  import { ProvableTransactionHook } from "../../protocol/ProvableTransactionHook";
8
7
  import { ProvableBlockHook } from "../../protocol/ProvableBlockHook";
8
+ import { NetworkState } from "../../model/network/NetworkState";
9
+ import { BlockProvable, BlockProverExecutionData, BlockProverProof, BlockProverPublicInput, BlockProverPublicOutput } from "./BlockProvable";
10
+ import { BlockHashMerkleTreeWitness } from "./accummulators/BlockHashMerkleTree";
9
11
  export interface BlockProverState {
12
+ /**
13
+ * The current state root of the block prover
14
+ */
10
15
  stateRoot: Field;
11
16
  /**
12
17
  * The current commitment of the transaction-list which
@@ -18,7 +23,21 @@ export interface BlockProverState {
18
23
  * This value is the same for the whole batch (L2 block)
19
24
  */
20
25
  networkStateHash: Field;
26
+ /**
27
+ * The root of the merkle tree encoding all block hashes,
28
+ * see `BlockHashMerkleTree`
29
+ */
30
+ blockHashRoot: Field;
31
+ /**
32
+ * A variant of the transactionsHash that is never reset.
33
+ * Thought for usage in the sequence state mempool.
34
+ * In comparison, transactionsHash restarts at 0 for every new block
35
+ */
36
+ eternalTransactionsHash: Field;
37
+ incomingMessagesHash: Field;
21
38
  }
39
+ export type BlockProof = Proof<BlockProverPublicInput, BlockProverPublicOutput>;
40
+ export type RuntimeProof = Proof<void, MethodPublicOutput>;
22
41
  export declare class BlockProverProgrammable extends ZkProgrammable<BlockProverPublicInput, BlockProverPublicOutput> {
23
42
  private readonly prover;
24
43
  readonly stateTransitionProver: ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>;
@@ -33,16 +52,17 @@ export declare class BlockProverProgrammable extends ZkProgrammable<BlockProverP
33
52
  *
34
53
  * @param state The from-state of the BlockProver
35
54
  * @param stateTransitionProof
36
- * @param appProof
55
+ * @param runtimeProof
37
56
  * @param executionData
38
57
  * @returns The new BlockProver-state to be used as public output
39
58
  */
40
- applyTransaction(state: BlockProverState, stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData): BlockProverState;
41
- assertProtocolTransitions(stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, executionData: BlockProverExecutionData): void;
42
- private getBeforeBlockNetworkState;
43
- private getAfterBlockNetworkState;
59
+ applyTransaction(state: BlockProverState, stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, runtimeProof: RuntimeProof, executionData: BlockProverExecutionData): BlockProverState;
60
+ assertProtocolTransitions(stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, executionData: BlockProverExecutionData, runtimeProof: Proof<void, MethodPublicOutput>): void;
61
+ private executeBlockHooks;
44
62
  private addTransactionToBundle;
45
- proveTransaction(publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData): BlockProverPublicOutput;
63
+ proveTransaction(publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, runtimeProof: RuntimeProof, executionData: BlockProverExecutionData): BlockProverPublicOutput;
64
+ private assertSTProofInput;
65
+ proveBlock(publicInput: BlockProverPublicInput, networkState: NetworkState, blockWitness: BlockHashMerkleTreeWitness, stateTransitionProof: StateTransitionProof, transactionProof: BlockProverProof): BlockProverPublicOutput;
46
66
  merge(publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof): BlockProverPublicOutput;
47
67
  /**
48
68
  * Creates the BlockProver ZkProgram.
@@ -61,7 +81,8 @@ export declare class BlockProver extends ProtocolModule implements BlockProvable
61
81
  readonly runtime: WithZkProgrammable<undefined, MethodPublicOutput>;
62
82
  zkProgrammable: BlockProverProgrammable;
63
83
  constructor(stateTransitionProver: WithZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, runtime: WithZkProgrammable<undefined, MethodPublicOutput>, transactionHooks: ProvableTransactionHook<unknown>[], blockHooks: ProvableBlockHook<unknown>[]);
64
- merge(publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof): BlockProverPublicOutput;
65
84
  proveTransaction(publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData): BlockProverPublicOutput;
85
+ proveBlock(publicInput: BlockProverPublicInput, networkState: NetworkState, blockWitness: BlockHashMerkleTreeWitness, stateTransitionProof: StateTransitionProof, transactionProof: BlockProverProof): BlockProverPublicOutput;
86
+ merge(publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof): BlockProverPublicOutput;
66
87
  }
67
88
  //# sourceMappingURL=BlockProver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlockProver.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BlockProver.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProver.ts"],"names":[],"mappings":"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"}
@@ -11,24 +11,32 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
13
  /* eslint-disable max-lines */
14
- import { Experimental, Field, Provable, SelfProof, } from "o1js";
14
+ import { Bool, Experimental, Field, Poseidon, Provable, SelfProof, } from "o1js";
15
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
- import { BlockProverExecutionData, BlockProverPublicInput, BlockProverPublicOutput, } from "./BlockProvable";
21
- import { ProvableStateTransition } from "../../model/StateTransition";
20
+ import { ProvableStateTransition, } from "../../model/StateTransition";
22
21
  import { RuntimeMethodExecutionContext } from "../../state/context/RuntimeMethodExecutionContext";
23
22
  import { NetworkState } from "../../model/network/NetworkState";
24
- import { BlockTransactionPosition } from "./BlockTransactionPosition";
23
+ import { SignedTransaction } from "../../model/transaction/SignedTransaction";
24
+ import { MinaActions, MinaActionsHashList, } from "../../utils/MinaPrefixedProvableHashList";
25
+ import { StateTransitionReductionList } from "../../utils/StateTransitionReductionList";
26
+ import { BlockProverExecutionData, BlockProverPublicInput, BlockProverPublicOutput, } from "./BlockProvable";
27
+ import { BlockHashMerkleTreeWitness, BlockHashTreeEntry, } from "./accummulators/BlockHashMerkleTree";
25
28
  const errors = {
26
29
  stateProofNotStartingAtZero: () => "StateProof not starting ST-commitment at zero",
27
30
  stateTransitionsHashNotEqual: () => "StateTransition list commitments are not equal",
31
+ propertyNotMatchingStep: (propertyName, step) => `${propertyName} not matching: ${step}`,
28
32
  propertyNotMatching: (propertyName) => `${propertyName} not matching`,
29
- stateRootNotMatching: (step) => `StateRoots not matching ${step}`,
30
- transactionsHashNotMatching: (step) => `transactions hash not matching ${step}`,
33
+ stateRootNotMatching: (step) => errors.propertyNotMatchingStep("StateRoots", step),
34
+ transactionsHashNotMatching: (step) => errors.propertyNotMatchingStep("Transactions hash", step),
35
+ networkStateHashNotMatching: (step) => errors.propertyNotMatchingStep("Network state hash", step),
31
36
  };
37
+ function maxField() {
38
+ return Field(Field.ORDER - 1n);
39
+ }
32
40
  export class BlockProverProgrammable extends ZkProgrammable {
33
41
  constructor(
34
42
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
@@ -49,47 +57,56 @@ export class BlockProverProgrammable extends ZkProgrammable {
49
57
  *
50
58
  * @param state The from-state of the BlockProver
51
59
  * @param stateTransitionProof
52
- * @param appProof
60
+ * @param runtimeProof
53
61
  * @param executionData
54
62
  * @returns The new BlockProver-state to be used as public output
55
63
  */
56
- applyTransaction(state, stateTransitionProof, appProof, executionData) {
57
- const { transaction, networkState } = executionData;
58
- appProof.verify();
64
+ applyTransaction(state, stateTransitionProof, runtimeProof, executionData) {
65
+ const { transaction, networkState, signature } = executionData;
66
+ const isMessage = runtimeProof.publicOutput.isMessage;
67
+ runtimeProof.verify();
59
68
  stateTransitionProof.verify();
60
69
  const stateTo = { ...state };
61
70
  // Checks for the stateTransitionProof and appProof matching
62
71
  stateTransitionProof.publicInput.stateTransitionsHash.assertEquals(Field(0), errors.stateProofNotStartingAtZero());
63
- appProof.publicOutput.stateTransitionsHash.assertEquals(stateTransitionProof.publicOutput.stateTransitionsHash, errors.stateTransitionsHashNotEqual());
72
+ stateTransitionProof.publicInput.protocolTransitionsHash.assertEquals(Field(0), errors.stateProofNotStartingAtZero());
73
+ runtimeProof.publicOutput.stateTransitionsHash.assertEquals(stateTransitionProof.publicOutput.stateTransitionsHash, errors.stateTransitionsHashNotEqual());
64
74
  // Assert from state roots
65
75
  state.stateRoot.assertEquals(stateTransitionProof.publicInput.stateRoot, errors.propertyNotMatching("from state root"));
66
76
  state.stateRoot.assertEquals(stateTransitionProof.publicInput.protocolStateRoot, errors.propertyNotMatching("from protocol state root"));
67
- // Apply state if status success
68
- stateTo.stateRoot = Provable.if(appProof.publicOutput.status, stateTransitionProof.publicOutput.stateRoot, stateTransitionProof.publicOutput.protocolStateRoot);
69
77
  // Apply protocol state transitions
70
- this.assertProtocolTransitions(stateTransitionProof, executionData);
78
+ this.assertProtocolTransitions(stateTransitionProof, executionData, runtimeProof);
79
+ // Apply state if status success
80
+ stateTo.stateRoot = Provable.if(runtimeProof.publicOutput.status, stateTransitionProof.publicOutput.stateRoot, stateTransitionProof.publicOutput.protocolStateRoot);
81
+ // Check transaction integrity against appProof
82
+ const blockTransactionHash = transaction.hash();
83
+ blockTransactionHash.assertEquals(runtimeProof.publicOutput.transactionHash, "Transactions provided in AppProof and BlockProof do not match");
71
84
  // Check transaction signature
72
- transaction
85
+ new SignedTransaction({
86
+ transaction,
87
+ signature,
88
+ })
73
89
  .validateSignature()
90
+ .or(isMessage)
74
91
  .assertTrue("Transaction signature not valid");
75
- // Check transaction integrity against appProof
76
- const blockTransactionHash = RuntimeTransaction.fromProtocolTransaction(transaction).hash();
77
- blockTransactionHash.assertEquals(appProof.publicOutput.transactionHash, "Transactions provided in AppProof and BlockProof do not match");
92
+ // Validate layout of transaction witness
93
+ transaction.assertTransactionType(isMessage);
78
94
  // Check network state integrity against appProof
79
- state.networkStateHash.assertEquals(appProof.publicOutput.networkStateHash, "Network state does not match state used in AppProof");
95
+ state.networkStateHash.assertEquals(runtimeProof.publicOutput.networkStateHash, "Network state does not match state used in AppProof");
80
96
  state.networkStateHash.assertEquals(networkState.hash(), "Network state provided to BlockProver does not match the publicInput");
81
97
  return stateTo;
82
98
  }
83
99
  // eslint-disable-next-line no-warning-comments, max-len
84
100
  // TODO How does this interact with the RuntimeMethodExecutionContext when executing runtimemethods?
85
- assertProtocolTransitions(stateTransitionProof, executionData) {
101
+ assertProtocolTransitions(stateTransitionProof, executionData, runtimeProof) {
86
102
  const executionContext = container.resolve(RuntimeMethodExecutionContext);
87
103
  executionContext.clear();
88
104
  // Setup context for potential calls to runtime methods.
89
105
  // This way they can use this.transaction etc. while still having provable
90
106
  // integrity between data
91
107
  executionContext.setup({
92
- transaction: RuntimeTransaction.fromProtocolTransaction(executionData.transaction),
108
+ // That is why we should probably hide it from the transaction context inputs
109
+ transaction: executionData.transaction,
93
110
  networkState: executionData.networkState,
94
111
  });
95
112
  executionContext.beforeMethod("", "", []);
@@ -100,74 +117,159 @@ export class BlockProverProgrammable extends ZkProgrammable {
100
117
  const { stateTransitions, status, statusMessage } = executionContext.current().result;
101
118
  status.assertTrue(statusMessage);
102
119
  const transitions = stateTransitions.map((transition) => transition.toProvable());
103
- const hashList = new DefaultProvableHashList(ProvableStateTransition, stateTransitionProof.publicInput.protocolTransitionsHash);
120
+ const hashList = new StateTransitionReductionList(ProvableStateTransition, stateTransitionProof.publicInput.protocolTransitionsHash);
104
121
  transitions.forEach((transition) => {
105
122
  hashList.push(transition);
106
123
  });
107
124
  stateTransitionProof.publicOutput.protocolTransitionsHash.assertEquals(hashList.commitment, "ProtocolTransitionsHash not matching the generated protocol transitions");
108
125
  }
109
- getBeforeBlockNetworkState(state, networkState) {
110
- return this.blockHooks.reduce((networkState, blockHook) => {
111
- return blockHook.beforeBlock({
112
- state,
113
- networkState,
114
- });
115
- }, networkState);
116
- }
117
- getAfterBlockNetworkState(state, networkState) {
118
- return this.blockHooks.reduce((networkState, blockHook) => {
119
- return blockHook.afterBlock({
120
- state,
126
+ executeBlockHooks(state, inputNetworkState, type) {
127
+ const executionContext = container.resolve(RuntimeMethodExecutionContext);
128
+ executionContext.clear();
129
+ executionContext.beforeMethod("", "", []);
130
+ const resultingNetworkState = this.blockHooks.reduce((networkState, blockHook) => {
131
+ // Setup context for potential calls to runtime methods.
132
+ // With the special case that we set the new networkstate for every hook
133
+ // We also have to put in a dummy transaction for network.transaction
134
+ executionContext.setup({
135
+ transaction: RuntimeTransaction.dummyTransaction(),
121
136
  networkState,
122
137
  });
123
- }, networkState);
138
+ if (type === "beforeBlock") {
139
+ return blockHook.beforeBlock(networkState, state);
140
+ }
141
+ else if (type === "afterBlock") {
142
+ return blockHook.afterBlock(networkState, state);
143
+ }
144
+ else {
145
+ throw new Error("Unreachable");
146
+ }
147
+ }, inputNetworkState);
148
+ executionContext.afterMethod();
149
+ const { stateTransitions, status, statusMessage } = executionContext.current().result;
150
+ status.assertTrue(`Block hook call failed: ${statusMessage ?? "-"}`);
151
+ return {
152
+ networkState: resultingNetworkState,
153
+ stateTransitions,
154
+ };
124
155
  }
125
- addTransactionToBundle(state, stateTransitionProof, appProof, executionData) {
126
- const { transactionPosition, networkState } = executionData;
156
+ addTransactionToBundle(state, isMessage, transaction) {
127
157
  const stateTo = {
128
158
  ...state,
129
159
  };
130
- // Execute beforeBlook hooks and apply if it is the first tx of the bundle
131
- const beforeHookResult = this.getBeforeBlockNetworkState(state, networkState);
132
- const bundleOpened = transactionPosition.equals(BlockTransactionPosition.fromPositionType("FIRST"));
133
- const resultingNetworkState = new NetworkState(Provable.if(bundleOpened, NetworkState, beforeHookResult, networkState));
134
- stateTo.networkStateHash = resultingNetworkState.hash();
135
- // TODO Modify bundle merkle tree as per specs
160
+ const transactionHash = transaction.hash();
136
161
  // Append tx to transaction list
137
162
  const transactionList = new DefaultProvableHashList(Field, state.transactionsHash);
138
- const { transactionHash } = appProof.publicOutput;
139
- transactionList.push(transactionHash);
163
+ transactionList.pushIf(transactionHash, isMessage.not());
140
164
  stateTo.transactionsHash = transactionList.commitment;
141
- return {
142
- state: stateTo,
143
- networkState: resultingNetworkState,
144
- bundleOpened,
145
- bundleClosed: transactionPosition.equals(BlockTransactionPosition.fromPositionType("LAST")),
165
+ // Append tx to eternal transaction list
166
+ // eslint-disable-next-line no-warning-comments
167
+ // TODO Change that to the a sequence-state compatible transaction struct
168
+ const eternalTransactionList = new DefaultProvableHashList(Field, state.eternalTransactionsHash);
169
+ eternalTransactionList.pushIf(transactionHash, isMessage.not());
170
+ stateTo.eternalTransactionsHash = eternalTransactionList.commitment;
171
+ // Append tx to incomingMessagesHash
172
+ const actionHash = MinaActions.actionHash(transaction.hashData());
173
+ const incomingMessagesList = new MinaActionsHashList(state.incomingMessagesHash);
174
+ incomingMessagesList.pushIf(actionHash, isMessage);
175
+ stateTo.incomingMessagesHash = incomingMessagesList.commitment;
176
+ return stateTo;
177
+ }
178
+ proveTransaction(publicInput, stateProof, runtimeProof, executionData) {
179
+ const state = {
180
+ ...publicInput,
146
181
  };
182
+ state.networkStateHash.assertEquals(executionData.networkState.hash(), "ExecutionData Networkstate doesn't equal public input hash");
183
+ const bundleInclusionState = this.addTransactionToBundle(state, runtimeProof.publicOutput.isMessage, executionData.transaction);
184
+ const stateTo = this.applyTransaction(bundleInclusionState, stateProof, runtimeProof, executionData);
185
+ return new BlockProverPublicOutput({
186
+ ...stateTo,
187
+ blockNumber: maxField(),
188
+ closed: Bool(false),
189
+ });
147
190
  }
148
- proveTransaction(publicInput, stateProof, appProof, executionData) {
191
+ assertSTProofInput(stateTransitionProof, stateRoot) {
192
+ stateTransitionProof.publicInput.stateTransitionsHash.assertEquals(Field(0), errors.stateProofNotStartingAtZero());
193
+ stateTransitionProof.publicInput.protocolTransitionsHash.assertEquals(Field(0), errors.stateProofNotStartingAtZero());
194
+ // Assert from state roots
195
+ stateRoot.assertEquals(stateTransitionProof.publicInput.stateRoot, errors.propertyNotMatching("from state root"));
196
+ }
197
+ proveBlock(publicInput, networkState, blockWitness, stateTransitionProof, transactionProof) {
149
198
  const state = {
150
- transactionsHash: publicInput.transactionsHash,
151
- stateRoot: publicInput.stateRoot,
152
- networkStateHash: publicInput.networkStateHash,
199
+ ...publicInput,
153
200
  };
154
- const bundleInclusionResult = this.addTransactionToBundle(state, stateProof, appProof, executionData);
155
- const stateTo = this.applyTransaction(bundleInclusionResult.state, stateProof, appProof, {
156
- transaction: executionData.transaction,
157
- transactionPosition: executionData.transactionPosition,
158
- networkState: bundleInclusionResult.networkState,
201
+ // 1. Make assertions about the inputs
202
+ publicInput.transactionsHash.assertEquals(Field(0), "Transactionshash has to start at 0");
203
+ publicInput.networkStateHash.assertEquals(networkState.hash(), "Wrong NetworkState supplied");
204
+ transactionProof.publicInput.transactionsHash.assertEquals(Field(0), "TransactionProof transactionshash has to start at 0");
205
+ transactionProof.publicInput.blockHashRoot.assertEquals(Field(0), "TransactionProof cannot carry the blockHashRoot - publicInput");
206
+ transactionProof.publicOutput.blockHashRoot.assertEquals(Field(0), "TransactionProof cannot carry the blockHashRoot - publicOutput");
207
+ transactionProof.publicInput.networkStateHash.assertEquals(transactionProof.publicOutput.networkStateHash, "TransactionProof cannot alter the network state");
208
+ transactionProof.publicInput.eternalTransactionsHash.assertEquals(state.eternalTransactionsHash, "TransactionProof starting eternalTransactionHash not matching");
209
+ transactionProof.publicInput.incomingMessagesHash.assertEquals(state.incomingMessagesHash, "TransactionProof starting incomingMessagesHash not matching");
210
+ // Verify ST Proof only if STs have been emitted,
211
+ // otherwise we can input a dummy proof
212
+ const stsEmitted = stateTransitionProof.publicOutput.stateTransitionsHash
213
+ .equals(0)
214
+ .and(stateTransitionProof.publicOutput.protocolTransitionsHash.equals(0))
215
+ .not();
216
+ stateTransitionProof.verifyIf(stsEmitted);
217
+ // Verify Transaction proof if it has at least 1 tx
218
+ // We have to compare the whole input and output because we can make no
219
+ // assumptions about the values, since it can be an arbitrary dummy-proof
220
+ const txProofOutput = transactionProof.publicOutput;
221
+ const verifyTransactionProof = txProofOutput.equals(transactionProof.publicInput, txProofOutput.closed, txProofOutput.blockNumber);
222
+ transactionProof.verifyIf(verifyTransactionProof);
223
+ // 2. Execute beforeBlock hooks
224
+ const beforeBlockResult = this.executeBlockHooks(state, networkState, "beforeBlock");
225
+ const beforeBlockHashList = new StateTransitionReductionList(ProvableStateTransition);
226
+ beforeBlockResult.stateTransitions.forEach((st) => {
227
+ beforeBlockHashList.push(st.toProvable());
159
228
  });
160
- // Apply afterBlock hooks
161
- const afterBlockNetworkState = this.getAfterBlockNetworkState(stateTo, bundleInclusionResult.networkState);
162
- const bundleClosed = executionData.transactionPosition.equals(BlockTransactionPosition.fromPositionType("LAST"));
163
- // We only need the hash here since this computed networkstate
164
- // is only used as an input in the next bundle
165
- const resultingNetworkStateHash = Provable.if(bundleClosed, afterBlockNetworkState.hash(), stateTo.networkStateHash);
229
+ // We are reusing protocolSTs here as beforeBlock STs
230
+ // TODO Not possible atm bcs we can't have a seperation between protocol/runtime state roots,
231
+ // which we would for both before and after to be able to emit STs
232
+ // stateTransitionProof.publicInput.protocolTransitionsHash.assertEquals(
233
+ // beforeBlockHashList.commitment
234
+ // );
235
+ // state.stateRoot = stateTransitionProof.publicInput.protocolStateRoot;
236
+ // TODO Only for now
237
+ beforeBlockHashList.commitment.assertEquals(Field(0), "beforeBlock() cannot emit state transitions yet");
238
+ // 4. Apply TX-type BlockProof
239
+ transactionProof.publicInput.networkStateHash.assertEquals(beforeBlockResult.networkState.hash(), "TransactionProof networkstate hash not matching beforeBlock hook result");
240
+ transactionProof.publicInput.stateRoot.assertEquals(state.stateRoot, "TransactionProof input state root not matching blockprover state root");
241
+ state.stateRoot = transactionProof.publicOutput.stateRoot;
242
+ state.transactionsHash = transactionProof.publicOutput.transactionsHash;
243
+ state.eternalTransactionsHash =
244
+ transactionProof.publicOutput.eternalTransactionsHash;
245
+ state.incomingMessagesHash =
246
+ transactionProof.publicOutput.incomingMessagesHash;
247
+ // 5. Execute afterBlock hooks
248
+ this.assertSTProofInput(stateTransitionProof, state.stateRoot);
249
+ const afterBlockResult = this.executeBlockHooks(state, beforeBlockResult.networkState, "afterBlock");
250
+ const afterBlockHashList = new StateTransitionReductionList(ProvableStateTransition);
251
+ afterBlockResult.stateTransitions.forEach((st) => {
252
+ afterBlockHashList.push(st.toProvable());
253
+ });
254
+ state.networkStateHash = afterBlockResult.networkState.hash();
255
+ // We are reusing runtime STs here as afterBlock STs
256
+ stateTransitionProof.publicInput.stateTransitionsHash.assertEquals(afterBlockHashList.commitment, "STProof from-ST-hash not matching generated ST-hash from afterBlock hooks");
257
+ state.stateRoot = Provable.if(stsEmitted, stateTransitionProof.publicOutput.stateRoot, state.stateRoot);
258
+ // 6. Close block
259
+ // Calculate the new block index
260
+ const blockIndex = blockWitness.calculateIndex();
261
+ blockWitness
262
+ .calculateRoot(Field(0))
263
+ .assertEquals(publicInput.blockHashRoot, "Supplied block hash witness not matching state root");
264
+ state.blockHashRoot = blockWitness.calculateRoot(new BlockHashTreeEntry({
265
+ // Mirroring UnprovenBlock.hash()
266
+ blockHash: Poseidon.hash([blockIndex, state.transactionsHash]),
267
+ closed: Bool(true),
268
+ }).hash());
166
269
  return new BlockProverPublicOutput({
167
- stateRoot: stateTo.stateRoot,
168
- transactionsHash: stateTo.transactionsHash,
169
- // eslint-disable-next-line putout/putout
170
- networkStateHash: resultingNetworkStateHash,
270
+ ...state,
271
+ blockNumber: blockIndex,
272
+ closed: Bool(true),
171
273
  });
172
274
  }
173
275
  merge(publicInput, proof1, proof2) {
@@ -176,16 +278,68 @@ export class BlockProverProgrammable extends ZkProgrammable {
176
278
  // Check state
177
279
  publicInput.stateRoot.assertEquals(proof1.publicInput.stateRoot, errors.stateRootNotMatching("publicInput.from -> proof1.from"));
178
280
  proof1.publicOutput.stateRoot.assertEquals(proof2.publicInput.stateRoot, errors.stateRootNotMatching("proof1.to -> proof2.from"));
179
- // Check transaction list
180
- publicInput.transactionsHash.assertEquals(proof1.publicInput.transactionsHash, errors.transactionsHashNotMatching("publicInput.from -> proof1.from"));
181
- proof1.publicOutput.transactionsHash.assertEquals(proof2.publicInput.transactionsHash, errors.transactionsHashNotMatching("proof1.to -> proof2.from"));
281
+ // Check transaction list hash.
282
+ // Only assert them if these are tx proofs, skip for closed proofs
283
+ publicInput.transactionsHash
284
+ .equals(proof1.publicInput.transactionsHash)
285
+ .or(proof1.publicOutput.closed)
286
+ .assertTrue(errors.transactionsHashNotMatching("publicInput.from -> proof1.from"));
287
+ proof1.publicOutput.transactionsHash
288
+ .equals(proof2.publicInput.transactionsHash)
289
+ .or(proof1.publicOutput.closed)
290
+ .assertTrue(errors.transactionsHashNotMatching("proof1.to -> proof2.from"));
182
291
  // Check networkhash
183
- publicInput.networkStateHash.assertEquals(proof1.publicInput.networkStateHash, errors.transactionsHashNotMatching("publicInput.from -> proof1.from"));
184
- proof1.publicOutput.networkStateHash.assertEquals(proof2.publicInput.networkStateHash, errors.transactionsHashNotMatching("proof1.to -> proof2.from"));
292
+ publicInput.networkStateHash.assertEquals(proof1.publicInput.networkStateHash, errors.networkStateHashNotMatching("publicInput.from -> proof1.from"));
293
+ proof1.publicOutput.networkStateHash.assertEquals(proof2.publicInput.networkStateHash, errors.networkStateHashNotMatching("proof1.to -> proof2.from"));
294
+ // Check blockHashRoot
295
+ publicInput.blockHashRoot.assertEquals(proof1.publicInput.blockHashRoot, errors.transactionsHashNotMatching("publicInput.from -> proof1.from"));
296
+ proof1.publicOutput.blockHashRoot.assertEquals(proof2.publicInput.blockHashRoot, errors.transactionsHashNotMatching("proof1.to -> proof2.from"));
297
+ // Check eternalTransactionsHash
298
+ publicInput.eternalTransactionsHash.assertEquals(proof1.publicInput.eternalTransactionsHash, errors.transactionsHashNotMatching("publicInput.from -> proof1.from"));
299
+ proof1.publicOutput.eternalTransactionsHash.assertEquals(proof2.publicInput.eternalTransactionsHash, errors.transactionsHashNotMatching("proof1.to -> proof2.from"));
300
+ // Check incomingMessagesHash
301
+ publicInput.incomingMessagesHash.assertEquals(proof1.publicInput.incomingMessagesHash, errors.propertyNotMatchingStep("IncomingMessagesHash", "publicInput.from -> proof1.from"));
302
+ proof1.publicOutput.incomingMessagesHash.assertEquals(proof2.publicInput.incomingMessagesHash, errors.propertyNotMatchingStep("IncomingMessagesHash", "proof1.to -> proof2.from"));
303
+ // Assert closed indicator matches
304
+ // (i.e. we can only merge TX-Type and Block-Type with each other)
305
+ proof1.publicOutput.closed.assertEquals(proof2.publicOutput.closed, "Closed indicators not matching");
306
+ // Either
307
+ // blockNumbers are unset and proofs are unclosed or
308
+ // both blocks are closed, then they have to increment or
309
+ // one block is closed, then height has to be the same
310
+ // Imperative algo would look like
311
+ // if(proof1.height == MAX && proof2.height == MAX){
312
+ // assert !proof1.closed && !proof2.closed;
313
+ // }else if(proof1.closed && proof2.closed){
314
+ // assert proof1.height + 1 == proof2.height
315
+ // // next one is omitted for now
316
+ // }else if(proof1.closed || proof2.closed{
317
+ // assert proof1.height == proof2.height
318
+ // }
319
+ const proof1Height = proof1.publicOutput.blockNumber;
320
+ const proof1Closed = proof1.publicOutput.closed;
321
+ const proof2Height = proof2.publicOutput.blockNumber;
322
+ const proof2Closed = proof2.publicOutput.closed;
323
+ const isValidTransactionMerge = proof1Height
324
+ .equals(maxField())
325
+ .and(proof2Height.equals(proof1Height))
326
+ .and(proof1Closed.or(proof2Closed).not());
327
+ const isValidClosedMerge = proof1Closed
328
+ .and(proof2Closed)
329
+ .and(proof1Height.add(1).equals(proof2Height));
330
+ isValidTransactionMerge
331
+ .or(isValidClosedMerge)
332
+ .assertTrue("Invalid BlockProof merge");
185
333
  return new BlockProverPublicOutput({
186
334
  stateRoot: proof2.publicOutput.stateRoot,
187
335
  transactionsHash: proof2.publicOutput.transactionsHash,
188
336
  networkStateHash: proof2.publicOutput.networkStateHash,
337
+ blockHashRoot: proof2.publicOutput.blockHashRoot,
338
+ eternalTransactionsHash: proof2.publicOutput.eternalTransactionsHash,
339
+ incomingMessagesHash: proof2.publicOutput.incomingMessagesHash,
340
+ // Provable.if(isValidClosedMerge, Bool(true), Bool(false));
341
+ closed: isValidClosedMerge,
342
+ blockNumber: proof2Height,
189
343
  });
190
344
  }
191
345
  /**
@@ -232,6 +386,7 @@ export class BlockProverProgrammable extends ZkProgrammable {
232
386
  return {
233
387
  compile: program.compile.bind(program),
234
388
  verify: program.verify.bind(program),
389
+ analyzeMethods: program.analyzeMethods.bind(program),
235
390
  Proof: SelfProofClass,
236
391
  methods,
237
392
  };
@@ -240,9 +395,17 @@ export class BlockProverProgrammable extends ZkProgrammable {
240
395
  __decorate([
241
396
  provableMethod(),
242
397
  __metadata("design:type", Function),
243
- __metadata("design:paramtypes", [BlockProverPublicInput, Object, Function, BlockProverExecutionData]),
398
+ __metadata("design:paramtypes", [BlockProverPublicInput, Object, Object, BlockProverExecutionData]),
244
399
  __metadata("design:returntype", BlockProverPublicOutput)
245
400
  ], BlockProverProgrammable.prototype, "proveTransaction", null);
401
+ __decorate([
402
+ provableMethod(),
403
+ __metadata("design:type", Function),
404
+ __metadata("design:paramtypes", [BlockProverPublicInput,
405
+ NetworkState,
406
+ BlockHashMerkleTreeWitness, Object, Object]),
407
+ __metadata("design:returntype", BlockProverPublicOutput)
408
+ ], BlockProverProgrammable.prototype, "proveBlock", null);
246
409
  __decorate([
247
410
  provableMethod(),
248
411
  __metadata("design:type", Function),
@@ -261,12 +424,15 @@ let BlockProver = class BlockProver extends ProtocolModule {
261
424
  this.runtime = runtime;
262
425
  this.zkProgrammable = new BlockProverProgrammable(this, stateTransitionProver.zkProgrammable, runtime.zkProgrammable, transactionHooks, blockHooks);
263
426
  }
264
- merge(publicInput, proof1, proof2) {
265
- return this.zkProgrammable.merge(publicInput, proof1, proof2);
266
- }
267
427
  proveTransaction(publicInput, stateProof, appProof, executionData) {
268
428
  return this.zkProgrammable.proveTransaction(publicInput, stateProof, appProof, executionData);
269
429
  }
430
+ proveBlock(publicInput, networkState, blockWitness, stateTransitionProof, transactionProof) {
431
+ return this.zkProgrammable.proveBlock(publicInput, networkState, blockWitness, stateTransitionProof, transactionProof);
432
+ }
433
+ merge(publicInput, proof1, proof2) {
434
+ return this.zkProgrammable.merge(publicInput, proof1, proof2);
435
+ }
270
436
  };
271
437
  BlockProver = __decorate([
272
438
  injectable(),
@@ -0,0 +1,45 @@
1
+ import { Field } from "o1js";
2
+ declare const BlockHashMerkleTree_base: import("@proto-kit/common").AbstractMerkleTreeClass;
3
+ export declare class BlockHashMerkleTree extends BlockHashMerkleTree_base {
4
+ }
5
+ export declare class BlockHashMerkleTreeWitness extends BlockHashMerkleTree.WITNESS {
6
+ }
7
+ declare const BlockHashTreeEntry_base: (new (value: {
8
+ blockHash: import("o1js/dist/node/lib/field").Field;
9
+ closed: import("o1js/dist/node/lib/bool").Bool;
10
+ }) => {
11
+ blockHash: import("o1js/dist/node/lib/field").Field;
12
+ closed: import("o1js/dist/node/lib/bool").Bool;
13
+ }) & {
14
+ _isStruct: true;
15
+ } & import("o1js/dist/node/snarky").ProvablePure<{
16
+ blockHash: import("o1js/dist/node/lib/field").Field;
17
+ closed: import("o1js/dist/node/lib/bool").Bool;
18
+ }> & {
19
+ toInput: (x: {
20
+ blockHash: import("o1js/dist/node/lib/field").Field;
21
+ closed: import("o1js/dist/node/lib/bool").Bool;
22
+ }) => {
23
+ fields?: import("o1js/dist/node/lib/field").Field[] | undefined;
24
+ packed?: [import("o1js/dist/node/lib/field").Field, number][] | undefined;
25
+ };
26
+ toJSON: (x: {
27
+ blockHash: import("o1js/dist/node/lib/field").Field;
28
+ closed: import("o1js/dist/node/lib/bool").Bool;
29
+ }) => {
30
+ blockHash: string;
31
+ closed: boolean;
32
+ };
33
+ fromJSON: (x: {
34
+ blockHash: string;
35
+ closed: boolean;
36
+ }) => {
37
+ blockHash: import("o1js/dist/node/lib/field").Field;
38
+ closed: import("o1js/dist/node/lib/bool").Bool;
39
+ };
40
+ };
41
+ export declare class BlockHashTreeEntry extends BlockHashTreeEntry_base {
42
+ hash(): Field;
43
+ }
44
+ export {};
45
+ //# sourceMappingURL=BlockHashMerkleTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockHashMerkleTree.d.ts","sourceRoot":"","sources":["../../../../src/prover/block/accummulators/BlockHashMerkleTree.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,EAA8B,MAAM,MAAM,CAAC;;AAE/D,qBAAa,mBAAoB,SAAQ,wBAAoB;CAAG;AAChE,qBAAa,0BAA2B,SAAQ,mBAAmB,CAAC,OAAO;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9E,qBAAa,kBAAmB,SAAQ,uBAKtC;IACO,IAAI,IAAI,KAAK;CAGrB"}
@@ -0,0 +1,16 @@
1
+ import { createMerkleTree } from "@proto-kit/common";
2
+ import { Bool, Field, Poseidon, Struct } from "o1js";
3
+ export class BlockHashMerkleTree extends createMerkleTree(40) {
4
+ }
5
+ export class BlockHashMerkleTreeWitness extends BlockHashMerkleTree.WITNESS {
6
+ }
7
+ export class BlockHashTreeEntry extends Struct({
8
+ blockHash: Field,
9
+ closed: Bool,
10
+ // TODO We could add startingEternalTransactionsHash here to offer
11
+ // a more trivial connection to the sequence state
12
+ }) {
13
+ hash() {
14
+ return Poseidon.hash([this.blockHash, ...this.closed.toFields()]);
15
+ }
16
+ }
@@ -6,6 +6,7 @@ import { ProvableStateTransitionType, StateTransitionProvableBatch } from "../..
6
6
  import { ProtocolModule } from "../../protocol/ProtocolModule";
7
7
  import { StateTransitionProvable, StateTransitionProverPublicInput, StateTransitionProof, StateTransitionProverPublicOutput } from "./StateTransitionProvable";
8
8
  import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
9
+ import { StateTransitionProverType } from "../../protocol/Protocol";
9
10
  interface StateTransitionProverExecutionState {
10
11
  stateRoot: Field;
11
12
  protocolStateRoot: Field;
@@ -39,9 +40,9 @@ export declare class StateTransitionProverProgrammable extends ZkProgrammable<St
39
40
  runBatch(publicInput: StateTransitionProverPublicInput, batch: StateTransitionProvableBatch): StateTransitionProverPublicOutput;
40
41
  merge(publicInput: StateTransitionProverPublicInput, proof1: StateTransitionProof, proof2: StateTransitionProof): StateTransitionProverPublicOutput;
41
42
  }
42
- export declare class StateTransitionProver extends ProtocolModule implements StateTransitionProvable {
43
+ export declare class StateTransitionProver extends ProtocolModule implements StateTransitionProvable, StateTransitionProverType {
43
44
  readonly witnessProviderReference: StateTransitionWitnessProviderReference;
44
- readonly zkProgrammable: StateTransitionProverProgrammable;
45
+ zkProgrammable: StateTransitionProverProgrammable;
45
46
  constructor(witnessProviderReference: StateTransitionWitnessProviderReference);
46
47
  runBatch(publicInput: StateTransitionProverPublicInput, batch: StateTransitionProvableBatch): StateTransitionProverPublicOutput;
47
48
  merge(publicInput: StateTransitionProverPublicInput, proof1: StateTransitionProof, proof2: StateTransitionProof): StateTransitionProverPublicOutput;