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