@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.
- package/dist/blockmodules/AccountStateModule.d.ts.map +1 -1
- package/dist/blockmodules/AccountStateModule.js +10 -3
- package/dist/blockmodules/BlockHeightHook.d.ts +3 -3
- package/dist/blockmodules/BlockHeightHook.d.ts.map +1 -1
- package/dist/blockmodules/BlockHeightHook.js +5 -4
- package/dist/blockmodules/LastStateRootBlockHook.d.ts +8 -0
- package/dist/blockmodules/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/blockmodules/LastStateRootBlockHook.js +15 -0
- package/dist/blockmodules/NoopBlockHook.d.ts +6 -4
- package/dist/blockmodules/NoopBlockHook.d.ts.map +1 -1
- package/dist/blockmodules/NoopBlockHook.js +4 -4
- package/dist/blockmodules/NoopSettlementHook.d.ts +6 -0
- package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -0
- package/dist/blockmodules/NoopSettlementHook.js +18 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -1
- package/dist/hooks/AccountStateHook.js +17 -5
- package/dist/hooks/BlockHeightHook.d.ts +3 -3
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
- package/dist/hooks/BlockHeightHook.js +5 -4
- package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.js +15 -0
- package/dist/hooks/NoopBlockHook.d.ts +6 -4
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
- package/dist/hooks/NoopBlockHook.js +4 -4
- package/dist/hooks/NoopSettlementHook.d.ts +6 -0
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
- package/dist/hooks/NoopSettlementHook.js +18 -0
- package/dist/index.d.ts +24 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -6
- package/dist/model/MethodPublicOutput.d.ts +8 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -1
- package/dist/model/MethodPublicOutput.js +1 -0
- package/dist/model/Option.d.ts +3 -2
- package/dist/model/Option.d.ts.map +1 -1
- package/dist/model/Option.js +5 -0
- package/dist/model/RuntimeLike.d.ts +11 -0
- package/dist/model/RuntimeLike.d.ts.map +1 -0
- package/dist/model/RuntimeLike.js +1 -0
- package/dist/model/StateTransition.d.ts +6 -5
- package/dist/model/StateTransition.d.ts.map +1 -1
- package/dist/model/StateTransition.js +3 -0
- package/dist/model/StateTransitionReduction.d.ts +3 -0
- package/dist/model/StateTransitionReduction.d.ts.map +1 -0
- package/dist/model/StateTransitionReduction.js +26 -0
- package/dist/model/network/NetworkState.d.ts +40 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -1
- package/dist/model/network/NetworkState.js +14 -2
- package/dist/model/transaction/RuntimeTransaction.d.ts +45 -20
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
- package/dist/model/transaction/RuntimeTransaction.js +68 -11
- package/dist/model/transaction/SignedTransaction.d.ts +71 -0
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
- package/dist/model/transaction/SignedTransaction.js +33 -0
- package/dist/model/transaction/ValueOption.d.ts +119 -0
- package/dist/model/transaction/ValueOption.d.ts.map +1 -0
- package/dist/model/transaction/ValueOption.js +24 -0
- package/dist/protocol/Protocol.d.ts +13 -16
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +26 -39
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +1 -1
- package/dist/protocol/ProvableBlockHook.d.ts +2 -10
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
- package/dist/protocol/ProvableBlockHook.js +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.d.ts +3 -2
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.js +3 -2
- package/dist/prover/block/BlockProvable.d.ts +106 -28
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.js +23 -5
- package/dist/prover/block/BlockProver.d.ts +29 -8
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +244 -78
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +45 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +3 -2
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +1 -0
- package/dist/settlement/ContractModule.d.ts +15 -0
- package/dist/settlement/ContractModule.d.ts.map +1 -0
- package/dist/settlement/ContractModule.js +11 -0
- package/dist/settlement/ProvableSettlementHook.d.ts +26 -0
- package/dist/settlement/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/ProvableSettlementHook.js +3 -0
- package/dist/settlement/SettlementContract.d.ts +230 -0
- package/dist/settlement/SettlementContract.d.ts.map +1 -0
- package/dist/settlement/SettlementContract.js +346 -0
- package/dist/settlement/SettlementContractModule.d.ts +39 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
- package/dist/settlement/SettlementContractModule.js +68 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +36 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +41 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.js +235 -0
- package/dist/settlement/messages/Deposit.d.ts +39 -0
- package/dist/settlement/messages/Deposit.d.ts.map +1 -0
- package/dist/settlement/messages/Deposit.js +6 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +109 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
- package/dist/settlement/messages/Withdrawal.d.ts +40 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
- package/dist/settlement/messages/Withdrawal.js +13 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js +12 -0
- package/dist/state/State.d.ts.map +1 -1
- package/dist/state/State.js +2 -1
- package/dist/state/assert/assert.d.ts.map +1 -1
- package/dist/state/assert/assert.js +8 -5
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +75 -1
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.js +21 -2
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +51 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableHashList.d.ts +3 -3
- package/dist/utils/ProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableReductionHashList.d.ts +14 -0
- package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +50 -0
- package/dist/utils/StateTransitionReductionList.d.ts +11 -0
- package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
- package/dist/utils/StateTransitionReductionList.js +60 -0
- package/package.json +2 -2
- package/src/hooks/AccountStateHook.ts +46 -0
- package/src/hooks/BlockHeightHook.ts +18 -0
- package/src/hooks/LastStateRootBlockHook.ts +26 -0
- package/src/hooks/NoopBlockHook.ts +20 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/SequenceStateTransactionModule.ts +25 -0
- package/src/index.ts +24 -6
- package/src/model/MethodPublicOutput.ts +3 -2
- package/src/model/Option.ts +16 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +10 -2
- package/src/model/network/NetworkState.ts +15 -3
- package/src/model/transaction/RuntimeTransaction.ts +90 -16
- package/src/model/transaction/SignedTransaction.ts +54 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +60 -67
- package/src/protocol/ProtocolModule.ts +3 -2
- package/src/protocol/ProvableBlockHook.ts +10 -13
- package/src/protocol/ProvableTransactionHook.ts +2 -1
- package/src/protocol/TransitioningProtocolModule.ts +3 -2
- package/src/prover/block/BlockProvable.ts +39 -6
- package/src/prover/block/BlockProver.ts +484 -142
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
- package/src/prover/statetransition/StateTransitionProver.ts +4 -2
- package/src/settlement/ContractModule.ts +24 -0
- package/src/settlement/SettlementContractModule.ts +127 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +135 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +65 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +329 -0
- package/src/settlement/messages/Deposit.ts +6 -0
- package/src/settlement/messages/OutgoingMessageArgument.ts +41 -0
- package/src/settlement/messages/Withdrawal.ts +14 -0
- package/src/settlement/modularity/ProvableSettlementHook.ts +34 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +39 -0
- package/src/state/State.ts +2 -1
- package/src/state/assert/assert.ts +8 -6
- package/src/state/context/RuntimeMethodExecutionContext.ts +22 -2
- package/src/utils/MinaPrefixedProvableHashList.ts +72 -0
- package/src/utils/PrefixedProvableHashList.ts +2 -2
- package/src/utils/ProvableHashList.ts +3 -3
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +88 -0
- package/test/BlockProver.test.ts +4 -5
- package/test/Protocol.test.ts +15 -10
- package/test/settlement/SettlementContract.test.ts +45 -0
- package/test/utils/ProvableReductionHashList.test.ts +114 -0
- package/src/blockmodules/AccountStateModule.ts +0 -33
- package/src/blockmodules/BlockHeightHook.ts +0 -21
- package/src/blockmodules/NoopBlockHook.ts +0 -16
- package/src/model/transaction/ProtocolTransaction.ts +0 -25
- package/src/prover/block/BlockTransactionPosition.ts +0 -34
- /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
|
|
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>,
|
|
41
|
-
assertProtocolTransitions(stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, executionData: BlockProverExecutionData): void;
|
|
42
|
-
private
|
|
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,
|
|
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":"AACA,OAAO,EAGL,KAAK,
|
|
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 {
|
|
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 {
|
|
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) =>
|
|
30
|
-
transactionsHashNotMatching: (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
|
|
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,
|
|
57
|
-
const { transaction, networkState } = executionData;
|
|
58
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
+
new SignedTransaction({
|
|
86
|
+
transaction,
|
|
87
|
+
signature,
|
|
88
|
+
})
|
|
73
89
|
.validateSignature()
|
|
90
|
+
.or(isMessage)
|
|
74
91
|
.assertTrue("Transaction signature not valid");
|
|
75
|
-
//
|
|
76
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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,
|
|
126
|
-
const { transactionPosition, networkState } = executionData;
|
|
156
|
+
addTransactionToBundle(state, isMessage, transaction) {
|
|
127
157
|
const stateTo = {
|
|
128
158
|
...state,
|
|
129
159
|
};
|
|
130
|
-
|
|
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
|
-
|
|
139
|
-
transactionList.push(transactionHash);
|
|
163
|
+
transactionList.pushIf(transactionHash, isMessage.not());
|
|
140
164
|
stateTo.transactionsHash = transactionList.commitment;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
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
|
-
|
|
151
|
-
stateRoot: publicInput.stateRoot,
|
|
152
|
-
networkStateHash: publicInput.networkStateHash,
|
|
199
|
+
...publicInput,
|
|
153
200
|
};
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
//
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
181
|
-
|
|
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.
|
|
184
|
-
proof1.publicOutput.networkStateHash.assertEquals(proof2.publicInput.networkStateHash, errors.
|
|
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,
|
|
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
|
-
|
|
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;
|