@proto-kit/protocol 0.1.1-develop.244 → 0.1.1-develop.254
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 +1 -3
- package/dist/model/Option.d.ts +0 -3
- package/dist/model/Option.d.ts.map +1 -1
- package/dist/model/StateTransition.d.ts +12 -12
- package/dist/model/StateTransition.d.ts.map +1 -1
- package/dist/model/StateTransition.js +1 -1
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
- package/dist/model/StateTransitionProvableBatch.js +11 -1
- package/dist/prover/block/BlockProver.js +4 -6
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +16 -0
- 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 +2 -1
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +20 -16
- package/dist/state/assert/assert.d.ts.map +1 -1
- package/dist/state/assert/assert.js +1 -2
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/blockmodules/AccountStateModule.ts +5 -3
- package/src/model/Option.ts +0 -5
- package/src/model/StateTransition.ts +1 -1
- package/src/model/StateTransitionProvableBatch.ts +13 -1
- package/src/prover/block/BlockProver.ts +8 -8
- package/src/prover/statetransition/StateTransitionProvable.ts +2 -0
- package/src/prover/statetransition/StateTransitionProver.ts +59 -21
- package/src/state/assert/assert.test.ts +7 -0
- package/src/state/assert/assert.ts +2 -3
- package/src/state/protocol/ProtocolState.ts +0 -1
- package/test/State.test.ts +45 -0
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +0 -26
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +0 -1
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +0 -79
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountStateModule.d.ts","sourceRoot":"","sources":["../../src/blockmodules/AccountStateModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAU,MAAM,EAAE,MAAM,UAAU,CAAC;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAG9E,qBAAa,YAAa,SAAQ,iBAEhC;CAAG;AAEL,qBAAa,kBAAmB,SAAQ,uBAAuB;IACrC,YAAY,
|
|
1
|
+
{"version":3,"file":"AccountStateModule.d.ts","sourceRoot":"","sources":["../../src/blockmodules/AccountStateModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAU,MAAM,EAAE,MAAM,UAAU,CAAC;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAG9E,qBAAa,YAAa,SAAQ,iBAEhC;CAAG;AAEL,qBAAa,kBAAmB,SAAQ,uBAAuB;IACrC,YAAY,oCAGlC;IAEK,aAAa,CAAC,EAAE,WAAW,EAAE,EAAE,wBAAwB,GAAG,IAAI;CActE"}
|
|
@@ -7,7 +7,7 @@ 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
|
-
import {
|
|
10
|
+
import { PublicKey, Struct, UInt64 } from "snarkyjs";
|
|
11
11
|
import { StateMap } from "../state/StateMap";
|
|
12
12
|
import { protocolState } from "../state/protocol/ProtocolState";
|
|
13
13
|
import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
|
|
@@ -26,8 +26,6 @@ export class AccountStateModule extends ProvableTransactionHook {
|
|
|
26
26
|
.get(transaction.sender)
|
|
27
27
|
.orElse(new AccountState({ nonce: UInt64.zero }));
|
|
28
28
|
const currentNonce = accountState.nonce;
|
|
29
|
-
Provable.log("Current Nonce", currentNonce);
|
|
30
|
-
Provable.log("Tx Nonce", transaction.nonce);
|
|
31
29
|
assert(currentNonce.equals(transaction.nonce), "Nonce not matching");
|
|
32
30
|
this.accountState.set(transaction.sender, new AccountState({ nonce: currentNonce.add(1) }));
|
|
33
31
|
}
|
package/dist/model/Option.d.ts
CHANGED
|
@@ -36,9 +36,6 @@ declare const ProvableOption_base: (new (value: {
|
|
|
36
36
|
export declare class ProvableOption extends ProvableOption_base {
|
|
37
37
|
toSome(): this;
|
|
38
38
|
}
|
|
39
|
-
export interface ToFieldable {
|
|
40
|
-
toFields: () => Field[];
|
|
41
|
-
}
|
|
42
39
|
/**
|
|
43
40
|
* Option facilitating in-circuit values that may or may not exist.
|
|
44
41
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Option.d.ts","sourceRoot":"","sources":["../../src/model/Option.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,
|
|
1
|
+
{"version":3,"file":"Option.d.ts","sourceRoot":"","sources":["../../src/model/Option.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,EACL,KAAK,oBAAoB,EAI1B,MAAM,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAElB,qBAAa,cAAe,SAAQ,mBAGlC;IACO,MAAM;CAId;AAED;;GAEG;AACH,qBAAa,MAAM,CAAC,KAAK;IAyCd,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;IA1C/C;;;;;;;OAOG;WACW,IAAI,CAAC,KAAK,EACtB,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;IAKxC;;;;;;OAMG;WACW,SAAS,CAAC,KAAK,EAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;IAKxC;;OAEG;WACW,IAAI;IAIX,YAAY,6CAAe;gBAGzB,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;IAGxC,KAAK;IAIL,SAAS;IAKhB;;OAEG;IACH,IAAW,SAAS,iDAQnB;IAED;;;OAGG;IACI,QAAQ,IAAI,KAAK,EAAE;IAO1B;;OAEG;IACI,UAAU;IAOjB;;;OAGG;IACI,MAAM,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK;IASlC,MAAM;;;;CAYd"}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { Field } from "snarkyjs";
|
|
2
|
-
import { Option, ProvableOption } from "./Option
|
|
2
|
+
import { Option, ProvableOption } from "./Option";
|
|
3
3
|
declare const ProvableStateTransition_base: (new (value: {
|
|
4
|
-
path: import("snarkyjs/dist/node/lib/field
|
|
4
|
+
path: import("snarkyjs/dist/node/lib/field").Field;
|
|
5
5
|
from: ProvableOption;
|
|
6
6
|
to: ProvableOption;
|
|
7
7
|
}) => {
|
|
8
|
-
path: import("snarkyjs/dist/node/lib/field
|
|
8
|
+
path: import("snarkyjs/dist/node/lib/field").Field;
|
|
9
9
|
from: ProvableOption;
|
|
10
10
|
to: ProvableOption;
|
|
11
11
|
}) & {
|
|
12
12
|
_isStruct: true;
|
|
13
|
-
} & import("snarkyjs/dist/node/snarky
|
|
14
|
-
path: import("snarkyjs/dist/node/lib/field
|
|
13
|
+
} & import("snarkyjs/dist/node/snarky").ProvablePure<{
|
|
14
|
+
path: import("snarkyjs/dist/node/lib/field").Field;
|
|
15
15
|
from: ProvableOption;
|
|
16
16
|
to: ProvableOption;
|
|
17
17
|
}> & {
|
|
18
18
|
toInput: (x: {
|
|
19
|
-
path: import("snarkyjs/dist/node/lib/field
|
|
19
|
+
path: import("snarkyjs/dist/node/lib/field").Field;
|
|
20
20
|
from: ProvableOption;
|
|
21
21
|
to: ProvableOption;
|
|
22
22
|
}) => {
|
|
23
|
-
fields?: import("snarkyjs/dist/node/lib/field
|
|
24
|
-
packed?: [import("snarkyjs/dist/node/lib/field
|
|
23
|
+
fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
|
|
24
|
+
packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
|
|
25
25
|
};
|
|
26
26
|
toJSON: (x: {
|
|
27
|
-
path: import("snarkyjs/dist/node/lib/field
|
|
27
|
+
path: import("snarkyjs/dist/node/lib/field").Field;
|
|
28
28
|
from: ProvableOption;
|
|
29
29
|
to: ProvableOption;
|
|
30
30
|
}) => {
|
|
@@ -49,7 +49,7 @@ declare const ProvableStateTransition_base: (new (value: {
|
|
|
49
49
|
value: string;
|
|
50
50
|
};
|
|
51
51
|
}) => {
|
|
52
|
-
path: import("snarkyjs/dist/node/lib/field
|
|
52
|
+
path: import("snarkyjs/dist/node/lib/field").Field;
|
|
53
53
|
from: ProvableOption;
|
|
54
54
|
to: ProvableOption;
|
|
55
55
|
};
|
|
@@ -73,8 +73,8 @@ export declare class StateTransition<Value> {
|
|
|
73
73
|
static from<Value>(path: Field, fromValue: Option<Value>): StateTransition<Value>;
|
|
74
74
|
static fromTo<Value>(path: Field, fromValue: Option<Value>, toValue: Option<Value>): StateTransition<Value>;
|
|
75
75
|
constructor(path: Field, fromValue: Option<Field> | Option<Value>, toValue: Option<Field> | Option<Value>);
|
|
76
|
-
get from(): Option<import("snarkyjs/dist/node/lib/field
|
|
77
|
-
get to(): Option<import("snarkyjs/dist/node/lib/field
|
|
76
|
+
get from(): Option<import("snarkyjs/dist/node/lib/field").Field> | Option<Value>;
|
|
77
|
+
get to(): Option<import("snarkyjs/dist/node/lib/field").Field> | Option<Value>;
|
|
78
78
|
/**
|
|
79
79
|
* Converts a StateTransition to a ProvableStateTransition,
|
|
80
80
|
* while enforcing the 'from' property to be 'Some' in all cases.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateTransition.d.ts","sourceRoot":"","sources":["../../src/model/StateTransition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAU,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"StateTransition.d.ts","sourceRoot":"","sources":["../../src/model/StateTransition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAU,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAElD;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,4BAQ3C;WACc,KAAK,IAAI,uBAAuB;CAO/C;AAED;;;GAGG;AACH,qBAAa,eAAe,CAAC,KAAK;IAcvB,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;WAfjC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC;WAIjD,MAAM,CAAC,KAAK,EACxB,IAAI,EAAE,KAAK,EACX,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EACxB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;gBAMf,IAAI,EAAE,KAAK,EACX,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,EACxC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IAG/C,IAAW,IAAI,yEAId;IAED,IAAW,EAAE,yEAEZ;IAED;;;OAGG;IACI,UAAU,IAAI,uBAAuB;IAQrC,MAAM;;;;;;;;;;;CAOd"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Field, Struct } from "snarkyjs";
|
|
2
|
-
import { Option, ProvableOption } from "./Option
|
|
2
|
+
import { Option, ProvableOption } from "./Option";
|
|
3
3
|
/**
|
|
4
4
|
* Provable representation of a State Transition, used to
|
|
5
5
|
* normalize state transitions of various value types for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateTransitionProvableBatch.d.ts","sourceRoot":"","sources":["../../src/model/StateTransitionProvableBatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"StateTransitionProvableBatch.d.ts","sourceRoot":"","sources":["../../src/model/StateTransitionProvableBatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAoB,MAAM,UAAU,CAAC;AAKlD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,qBAAa,mBAAmB;IAC9B,gBAAuB,MAAM,QAAQ;IAErC,gBAAuB,QAAQ,SAAS;WAE1B,QAAQ,CAAC,IAAI,EAAE,OAAO;WAItB,UAAU,CAAC,IAAI,EAAE,OAAO;CAGvC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,qBAAa,2BAA4B,SAAQ,gCAE/C;IACA,WAAkB,MAAM,IAAI,2BAA2B,CAItD;IAED,WAAkB,QAAQ,IAAI,2BAA2B,CAIxD;IAEM,QAAQ,IAAI,IAAI;IAIhB,UAAU,IAAI,IAAI;CAG1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,SAAQ,iCAUhD;WACc,YAAY,CACxB,WAAW,EAAE;QACX,UAAU,EAAE,uBAAuB,CAAC;QACpC,IAAI,EAAE,2BAA2B,CAAC;KACnC,EAAE,GACF,4BAA4B;WAyBjB,eAAe,CAC3B,WAAW,EAAE,uBAAuB,EAAE,EACtC,mBAAmB,EAAE,uBAAuB,EAAE,GAC7C,4BAA4B;IAsB/B,OAAO;CAMR"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Bool, Provable, Struct } from "snarkyjs";
|
|
2
|
+
import { range } from "@proto-kit/common";
|
|
2
3
|
import { constants } from "../Constants";
|
|
3
4
|
import { ProvableStateTransition } from "./StateTransition.js";
|
|
4
|
-
import { range } from "@proto-kit/common";
|
|
5
5
|
export class StateTransitionType {
|
|
6
6
|
static isNormal(type) {
|
|
7
7
|
return type === StateTransitionType.normal;
|
|
@@ -46,6 +46,16 @@ export class StateTransitionProvableBatch extends Struct({
|
|
|
46
46
|
static fromMappings(transitions) {
|
|
47
47
|
const batch = transitions.map((entry) => entry.transition);
|
|
48
48
|
const transitionTypes = transitions.map((entry) => entry.type);
|
|
49
|
+
// Check that order is correct
|
|
50
|
+
let normalSTsStarted = false;
|
|
51
|
+
transitionTypes.forEach((x) => {
|
|
52
|
+
if (!normalSTsStarted && x.isNormal().toBoolean()) {
|
|
53
|
+
normalSTsStarted = true;
|
|
54
|
+
}
|
|
55
|
+
if (normalSTsStarted && x.isProtocol().toBoolean()) {
|
|
56
|
+
throw new Error("Order in initializing STBatch not correct");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
49
59
|
while (batch.length < constants.stateTransitionProverBatchSize) {
|
|
50
60
|
batch.push(ProvableStateTransition.dummy());
|
|
51
61
|
transitionTypes.push(ProvableStateTransitionType.normal);
|
|
@@ -55,22 +55,20 @@ export class BlockProverProgrammable extends ZkProgrammable {
|
|
|
55
55
|
appProof.verify();
|
|
56
56
|
stateTransitionProof.verify();
|
|
57
57
|
const stateTo = { ...state };
|
|
58
|
-
// eslint-disable-next-line no-warning-comments
|
|
59
|
-
// TODO Check methodId?
|
|
60
58
|
// Checks for the stateTransitionProof and appProof matching
|
|
61
59
|
stateTransitionProof.publicInput.stateTransitionsHash.assertEquals(Field(0), errors.stateProofNotStartingAtZero());
|
|
62
60
|
appProof.publicOutput.stateTransitionsHash.assertEquals(stateTransitionProof.publicOutput.stateTransitionsHash, errors.stateTransitionsHashNotEqual());
|
|
63
|
-
//
|
|
61
|
+
// Assert from state roots
|
|
64
62
|
state.stateRoot.assertEquals(stateTransitionProof.publicInput.stateRoot, errors.propertyNotMatching("from state root"));
|
|
65
|
-
|
|
63
|
+
state.stateRoot.assertEquals(stateTransitionProof.publicInput.protocolStateRoot, errors.propertyNotMatching("from protocol state root"));
|
|
64
|
+
// Apply state if status success
|
|
65
|
+
stateTo.stateRoot = Provable.if(appProof.publicOutput.status, stateTransitionProof.publicOutput.stateRoot, stateTransitionProof.publicOutput.protocolStateRoot);
|
|
66
66
|
// Apply protocol state transitions
|
|
67
67
|
this.assertProtocolTransitions(stateTransitionProof, executionData);
|
|
68
68
|
// Check transaction signature
|
|
69
69
|
transaction
|
|
70
70
|
.validateSignature()
|
|
71
71
|
.assertTrue("Transaction signature not valid");
|
|
72
|
-
// Check if the methodId is correct
|
|
73
|
-
// to do
|
|
74
72
|
// Check transaction integrity against appProof
|
|
75
73
|
const blockTransactionHash = RuntimeTransaction.fromProtocolTransaction(transaction).hash();
|
|
76
74
|
blockTransactionHash.assertEquals(appProof.publicOutput.transactionHash, "Transactions provided in AppProof and BlockProof do not match");
|
|
@@ -6,21 +6,25 @@ declare const StateTransitionProverPublicInput_base: (new (value: {
|
|
|
6
6
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
7
7
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
8
8
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
9
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
9
10
|
}) => {
|
|
10
11
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
11
12
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
12
13
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
14
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
13
15
|
}) & {
|
|
14
16
|
_isStruct: true;
|
|
15
17
|
} & import("snarkyjs/dist/node/snarky").ProvablePure<{
|
|
16
18
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
17
19
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
18
20
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
21
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
19
22
|
}> & {
|
|
20
23
|
toInput: (x: {
|
|
21
24
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
22
25
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
23
26
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
27
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
24
28
|
}) => {
|
|
25
29
|
fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
|
|
26
30
|
packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
|
|
@@ -29,19 +33,23 @@ declare const StateTransitionProverPublicInput_base: (new (value: {
|
|
|
29
33
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
30
34
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
31
35
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
36
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
32
37
|
}) => {
|
|
33
38
|
stateTransitionsHash: string;
|
|
34
39
|
protocolTransitionsHash: string;
|
|
35
40
|
stateRoot: string;
|
|
41
|
+
protocolStateRoot: string;
|
|
36
42
|
};
|
|
37
43
|
fromJSON: (x: {
|
|
38
44
|
stateTransitionsHash: string;
|
|
39
45
|
protocolTransitionsHash: string;
|
|
40
46
|
stateRoot: string;
|
|
47
|
+
protocolStateRoot: string;
|
|
41
48
|
}) => {
|
|
42
49
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
43
50
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
44
51
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
52
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
45
53
|
};
|
|
46
54
|
};
|
|
47
55
|
export declare class StateTransitionProverPublicInput extends StateTransitionProverPublicInput_base {
|
|
@@ -50,21 +58,25 @@ declare const StateTransitionProverPublicOutput_base: (new (value: {
|
|
|
50
58
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
51
59
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
52
60
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
61
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
53
62
|
}) => {
|
|
54
63
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
55
64
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
56
65
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
66
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
57
67
|
}) & {
|
|
58
68
|
_isStruct: true;
|
|
59
69
|
} & import("snarkyjs/dist/node/snarky").ProvablePure<{
|
|
60
70
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
61
71
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
62
72
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
73
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
63
74
|
}> & {
|
|
64
75
|
toInput: (x: {
|
|
65
76
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
66
77
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
67
78
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
79
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
68
80
|
}) => {
|
|
69
81
|
fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
|
|
70
82
|
packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
|
|
@@ -73,19 +85,23 @@ declare const StateTransitionProverPublicOutput_base: (new (value: {
|
|
|
73
85
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
74
86
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
75
87
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
88
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
76
89
|
}) => {
|
|
77
90
|
stateTransitionsHash: string;
|
|
78
91
|
protocolTransitionsHash: string;
|
|
79
92
|
stateRoot: string;
|
|
93
|
+
protocolStateRoot: string;
|
|
80
94
|
};
|
|
81
95
|
fromJSON: (x: {
|
|
82
96
|
stateTransitionsHash: string;
|
|
83
97
|
protocolTransitionsHash: string;
|
|
84
98
|
stateRoot: string;
|
|
99
|
+
protocolStateRoot: string;
|
|
85
100
|
}) => {
|
|
86
101
|
stateTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
87
102
|
protocolTransitionsHash: import("snarkyjs/dist/node/lib/field").Field;
|
|
88
103
|
stateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
104
|
+
protocolStateRoot: import("snarkyjs/dist/node/lib/field").Field;
|
|
89
105
|
};
|
|
90
106
|
};
|
|
91
107
|
export declare class StateTransitionProverPublicOutput extends StateTransitionProverPublicOutput_base {
|
|
@@ -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,kBAAkB,EAAkB,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAExF,OAAO,EAAE,uCAAuC,EAAE,MAAM,2CAA2C,CAAC
|
|
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,qCAKpD;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,iCAAkC,SAAQ,sCAKrD;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"}
|
|
@@ -3,11 +3,13 @@ export class StateTransitionProverPublicInput extends Struct({
|
|
|
3
3
|
stateTransitionsHash: Field,
|
|
4
4
|
protocolTransitionsHash: Field,
|
|
5
5
|
stateRoot: Field,
|
|
6
|
+
protocolStateRoot: Field,
|
|
6
7
|
}) {
|
|
7
8
|
}
|
|
8
9
|
export class StateTransitionProverPublicOutput extends Struct({
|
|
9
10
|
stateTransitionsHash: Field,
|
|
10
11
|
protocolTransitionsHash: Field,
|
|
11
12
|
stateRoot: Field,
|
|
13
|
+
protocolStateRoot: Field,
|
|
12
14
|
}) {
|
|
13
15
|
}
|
|
@@ -8,6 +8,7 @@ import { StateTransitionProvable, StateTransitionProverPublicInput, StateTransit
|
|
|
8
8
|
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
|
|
9
9
|
interface StateTransitionProverExecutionState {
|
|
10
10
|
stateRoot: Field;
|
|
11
|
+
protocolStateRoot: Field;
|
|
11
12
|
stateTransitionList: ProvableHashList<ProvableStateTransition>;
|
|
12
13
|
protocolTransitionList: ProvableHashList<ProvableStateTransition>;
|
|
13
14
|
}
|
|
@@ -26,7 +27,7 @@ export declare class StateTransitionProverProgrammable extends ZkProgrammable<St
|
|
|
26
27
|
* Applies the state transitions to the current stateRoot
|
|
27
28
|
* and returns the new prover state
|
|
28
29
|
*/
|
|
29
|
-
applyTransitions(stateRoot: Field, stateTransitionCommitmentFrom: Field, protocolTransitionCommitmentFrom: Field, transitionBatch: StateTransitionProvableBatch): StateTransitionProverExecutionState;
|
|
30
|
+
applyTransitions(stateRoot: Field, protocolStateRoot: Field, stateTransitionCommitmentFrom: Field, protocolTransitionCommitmentFrom: Field, transitionBatch: StateTransitionProvableBatch): StateTransitionProverExecutionState;
|
|
30
31
|
/**
|
|
31
32
|
* Applies a single state transition to the given state
|
|
32
33
|
* and mutates it in place
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateTransitionProver.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProver.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"StateTransitionProver.d.ts","sourceRoot":"","sources":["../../../src/prover/statetransition/StateTransitionProver.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,EAAuB,MAAM,UAAU,CAAC;AAE1E,OAAO,EACL,gBAAgB,EAEhB,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;AAepG,UAAU,mCAAmC;IAC3C,SAAS,EAAE,KAAK,CAAC;IACjB,iBAAiB,EAAE,KAAK,CAAC;IACzB,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,iBAAiB,EAAE,KAAK,EACxB,6BAA6B,EAAE,KAAK,EACpC,gCAAgC,EAAE,KAAK,EACvC,eAAe,EAAE,4BAA4B,GAC5C,mCAAmC;IA6BtC;;;OAGG;IACI,eAAe,CACpB,KAAK,EAAE,mCAAmC,EAC1C,UAAU,EAAE,uBAAuB,EACnC,IAAI,EAAE,2BAA2B,EACjC,KAAK,SAAI;IAqDX;;OAEG;IAEI,QAAQ,CACb,WAAW,EAAE,gCAAgC,EAC7C,KAAK,EAAE,4BAA4B,GAClC,iCAAiC;IAkB7B,KAAK,CACV,WAAW,EAAE,gCAAgC,EAC7C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,GAC3B,iCAAiC;CAqErC;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"}
|
|
@@ -20,12 +20,9 @@ import { ProtocolModule } from "../../protocol/ProtocolModule";
|
|
|
20
20
|
import { StateTransitionProverPublicInput, StateTransitionProverPublicOutput, } from "./StateTransitionProvable";
|
|
21
21
|
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
|
|
22
22
|
const errors = {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
protocolTransitionsHashNotMatching: (step) => `Protocol transitions hash not matching ${step}`,
|
|
26
|
-
merkleWitnessNotCorrect: (index) => `MerkleWitness not valid for StateTransition (${index})`,
|
|
23
|
+
propertyNotMatching: (property, step) => `${property} not matching ${step}`,
|
|
24
|
+
merkleWitnessNotCorrect: (index, type) => `MerkleWitness not valid for StateTransition (${index}, type ${type})`,
|
|
27
25
|
noWitnessProviderSet: () => new Error("WitnessProvider not set, set it before you use StateTransitionProvider"),
|
|
28
|
-
propertyNotMatching: (propertyName) => `${propertyName} not matching`,
|
|
29
26
|
};
|
|
30
27
|
const StateTransitionSelfProofClass = (SelfProof);
|
|
31
28
|
/**
|
|
@@ -91,9 +88,10 @@ export class StateTransitionProverProgrammable extends ZkProgrammable {
|
|
|
91
88
|
* Applies the state transitions to the current stateRoot
|
|
92
89
|
* and returns the new prover state
|
|
93
90
|
*/
|
|
94
|
-
applyTransitions(stateRoot, stateTransitionCommitmentFrom, protocolTransitionCommitmentFrom, transitionBatch) {
|
|
91
|
+
applyTransitions(stateRoot, protocolStateRoot, stateTransitionCommitmentFrom, protocolTransitionCommitmentFrom, transitionBatch) {
|
|
95
92
|
const state = {
|
|
96
93
|
stateRoot,
|
|
94
|
+
protocolStateRoot,
|
|
97
95
|
stateTransitionList: new DefaultProvableHashList(ProvableStateTransition, stateTransitionCommitmentFrom),
|
|
98
96
|
protocolTransitionList: new DefaultProvableHashList(ProvableStateTransition, protocolTransitionCommitmentFrom),
|
|
99
97
|
};
|
|
@@ -113,11 +111,12 @@ export class StateTransitionProverProgrammable extends ZkProgrammable {
|
|
|
113
111
|
const membershipValid = MerkleTreeUtils.checkMembership(treeWitness, state.stateRoot, transition.path, transition.from.value);
|
|
114
112
|
membershipValid
|
|
115
113
|
.or(transition.from.isSome.not())
|
|
116
|
-
.assertTrue(errors.merkleWitnessNotCorrect(index));
|
|
117
|
-
const t = Date.now();
|
|
114
|
+
.assertTrue(errors.merkleWitnessNotCorrect(index, type.isNormal().toBoolean() ? "normal" : "protocol"));
|
|
118
115
|
const newRoot = MerkleTreeUtils.computeRoot(treeWitness, transition.to.value);
|
|
119
|
-
Provable.log("Compute root took", Date.now() - t, "ms");
|
|
120
116
|
state.stateRoot = Provable.if(transition.to.isSome, newRoot, state.stateRoot);
|
|
117
|
+
// Only update protocol state root if ST is also of type protocol
|
|
118
|
+
// Since protocol STs are all at the start of the batch, this works
|
|
119
|
+
state.protocolStateRoot = Provable.if(transition.to.isSome.and(type.isProtocol()), newRoot, state.protocolStateRoot);
|
|
121
120
|
const isNotDummy = transition.path.equals(Field(0)).not();
|
|
122
121
|
state.stateTransitionList.pushIf(transition, isNotDummy.and(type.isNormal()));
|
|
123
122
|
state.protocolTransitionList.pushIf(transition, isNotDummy.and(type.isProtocol()));
|
|
@@ -126,29 +125,34 @@ export class StateTransitionProverProgrammable extends ZkProgrammable {
|
|
|
126
125
|
* Applies a whole batch of StateTransitions at once
|
|
127
126
|
*/
|
|
128
127
|
runBatch(publicInput, batch) {
|
|
129
|
-
const result = this.applyTransitions(publicInput.stateRoot, publicInput.stateTransitionsHash, publicInput.protocolTransitionsHash, batch);
|
|
128
|
+
const result = this.applyTransitions(publicInput.stateRoot, publicInput.protocolStateRoot, publicInput.stateTransitionsHash, publicInput.protocolTransitionsHash, batch);
|
|
130
129
|
return new StateTransitionProverPublicOutput({
|
|
131
130
|
stateRoot: result.stateRoot,
|
|
132
131
|
stateTransitionsHash: result.stateTransitionList.commitment,
|
|
133
132
|
protocolTransitionsHash: result.protocolTransitionList.commitment,
|
|
133
|
+
protocolStateRoot: result.protocolStateRoot,
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
136
|
merge(publicInput, proof1, proof2) {
|
|
137
137
|
proof1.verify();
|
|
138
138
|
proof2.verify();
|
|
139
139
|
// Check state
|
|
140
|
-
publicInput.stateRoot.assertEquals(proof1.publicInput.stateRoot, errors.
|
|
141
|
-
proof1.publicOutput.stateRoot.assertEquals(proof2.publicInput.stateRoot, errors.
|
|
140
|
+
publicInput.stateRoot.assertEquals(proof1.publicInput.stateRoot, errors.propertyNotMatching("stateRoot", "publicInput.from -> proof1.from"));
|
|
141
|
+
proof1.publicOutput.stateRoot.assertEquals(proof2.publicInput.stateRoot, errors.propertyNotMatching("stateRoot", "proof1.to -> proof2.from"));
|
|
142
142
|
// Check ST list
|
|
143
|
-
publicInput.stateTransitionsHash.assertEquals(proof1.publicInput.stateTransitionsHash, errors.
|
|
144
|
-
proof1.publicOutput.stateTransitionsHash.assertEquals(proof2.publicInput.stateTransitionsHash, errors.
|
|
143
|
+
publicInput.stateTransitionsHash.assertEquals(proof1.publicInput.stateTransitionsHash, errors.propertyNotMatching("stateTransitionsHash", "publicInput.from -> proof1.from"));
|
|
144
|
+
proof1.publicOutput.stateTransitionsHash.assertEquals(proof2.publicInput.stateTransitionsHash, errors.propertyNotMatching("stateTransitionsHash", "proof1.to -> proof2.from"));
|
|
145
145
|
// Check Protocol ST list
|
|
146
|
-
publicInput.protocolTransitionsHash.assertEquals(proof1.publicInput.protocolTransitionsHash, errors.
|
|
147
|
-
proof1.publicOutput.protocolTransitionsHash.assertEquals(proof2.publicInput.protocolTransitionsHash, errors.
|
|
146
|
+
publicInput.protocolTransitionsHash.assertEquals(proof1.publicInput.protocolTransitionsHash, errors.propertyNotMatching("protocolTransitionsHash", "publicInput.from -> proof1.from"));
|
|
147
|
+
proof1.publicOutput.protocolTransitionsHash.assertEquals(proof2.publicInput.protocolTransitionsHash, errors.propertyNotMatching("protocolTransitionsHash", "proof1.to -> proof2.from"));
|
|
148
|
+
// Check protocol state root
|
|
149
|
+
publicInput.protocolStateRoot.assertEquals(proof1.publicInput.protocolStateRoot, errors.propertyNotMatching("protocolStateRoot", "publicInput.from -> proof1.from"));
|
|
150
|
+
proof1.publicOutput.protocolStateRoot.assertEquals(proof2.publicInput.protocolStateRoot, errors.propertyNotMatching("protocolStateRoot", "proof1.to -> proof2.from"));
|
|
148
151
|
return new StateTransitionProverPublicInput({
|
|
149
152
|
stateRoot: proof2.publicOutput.stateRoot,
|
|
150
153
|
stateTransitionsHash: proof2.publicOutput.stateTransitionsHash,
|
|
151
154
|
protocolTransitionsHash: proof2.publicOutput.protocolTransitionsHash,
|
|
155
|
+
protocolStateRoot: proof2.publicOutput.protocolStateRoot,
|
|
152
156
|
});
|
|
153
157
|
}
|
|
154
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../../src/state/assert/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../../src/state/assert/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAMhC;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,QAWvD"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Bool, Provable } from "snarkyjs";
|
|
2
1
|
import { container } from "tsyringe";
|
|
3
2
|
import { log } from "@proto-kit/common";
|
|
4
3
|
import { RuntimeMethodExecutionContext } from "../context/RuntimeMethodExecutionContext";
|
|
@@ -14,7 +13,7 @@ import { RuntimeMethodExecutionContext } from "../context/RuntimeMethodExecution
|
|
|
14
13
|
export function assert(condition, message) {
|
|
15
14
|
const executionContext = container.resolve(RuntimeMethodExecutionContext);
|
|
16
15
|
const previousStatus = executionContext.current().result.status;
|
|
17
|
-
const status =
|
|
16
|
+
const status = condition.and(previousStatus);
|
|
18
17
|
if (!condition.toBoolean()) {
|
|
19
18
|
log.debug("Assertion failed: ", message);
|
|
20
19
|
executionContext.setStatusMessage(message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProtocolState.d.ts","sourceRoot":"","sources":["../../../src/state/protocol/ProtocolState.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProtocolState.d.ts","sourceRoot":"","sources":["../../../src/state/protocol/ProtocolState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AAgBzF;;;GAGG;AACH,wBAAgB,aAAa,oHAGZ,MAAM,UAoCtB"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
|
-
"version": "0.1.1-develop.
|
|
6
|
+
"version": "0.1.1-develop.254+2fba72e",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "tsc -p tsconfig.json",
|
|
9
9
|
"dev": "tsc -p tsconfig.json --watch",
|
|
@@ -31,5 +31,5 @@
|
|
|
31
31
|
"@jest/globals": "^29.5.0",
|
|
32
32
|
"@types/lodash": "^4.14.194"
|
|
33
33
|
},
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "2fba72ec580c20289658d5c831430ca601ea5a71"
|
|
35
35
|
}
|
|
@@ -11,7 +11,10 @@ export class AccountState extends Struct({
|
|
|
11
11
|
}) {}
|
|
12
12
|
|
|
13
13
|
export class AccountStateModule extends ProvableTransactionHook {
|
|
14
|
-
@protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
|
|
14
|
+
@protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
|
|
15
|
+
PublicKey,
|
|
16
|
+
AccountState
|
|
17
|
+
);
|
|
15
18
|
|
|
16
19
|
public onTransaction({ transaction }: BlockProverExecutionData): void {
|
|
17
20
|
const accountState = this.accountState
|
|
@@ -19,8 +22,7 @@ export class AccountStateModule extends ProvableTransactionHook {
|
|
|
19
22
|
.orElse(new AccountState({ nonce: UInt64.zero }));
|
|
20
23
|
|
|
21
24
|
const currentNonce = accountState.nonce;
|
|
22
|
-
|
|
23
|
-
Provable.log("Tx Nonce", transaction.nonce);
|
|
25
|
+
|
|
24
26
|
assert(currentNonce.equals(transaction.nonce), "Nonce not matching");
|
|
25
27
|
|
|
26
28
|
this.accountState.set(
|
package/src/model/Option.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Bool,
|
|
3
3
|
Field,
|
|
4
|
-
FlexibleProvable,
|
|
5
4
|
type FlexibleProvablePure,
|
|
6
5
|
Poseidon,
|
|
7
6
|
Provable,
|
|
@@ -18,10 +17,6 @@ export class ProvableOption extends Struct({
|
|
|
18
17
|
}
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
export interface ToFieldable {
|
|
22
|
-
toFields: () => Field[];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
20
|
/**
|
|
26
21
|
* Option facilitating in-circuit values that may or may not exist.
|
|
27
22
|
*/
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { Bool, Provable, Struct } from "snarkyjs";
|
|
2
|
+
import { range } from "@proto-kit/common";
|
|
2
3
|
|
|
3
4
|
import { constants } from "../Constants";
|
|
4
5
|
|
|
5
6
|
import { ProvableStateTransition } from "./StateTransition.js";
|
|
6
|
-
import { range } from "@proto-kit/common";
|
|
7
7
|
|
|
8
8
|
export class StateTransitionType {
|
|
9
9
|
public static readonly normal = true;
|
|
10
|
+
|
|
10
11
|
public static readonly protocol = false;
|
|
11
12
|
|
|
12
13
|
public static isNormal(type: boolean) {
|
|
@@ -69,6 +70,17 @@ export class StateTransitionProvableBatch extends Struct({
|
|
|
69
70
|
const batch = transitions.map((entry) => entry.transition);
|
|
70
71
|
const transitionTypes = transitions.map((entry) => entry.type);
|
|
71
72
|
|
|
73
|
+
// Check that order is correct
|
|
74
|
+
let normalSTsStarted = false;
|
|
75
|
+
transitionTypes.forEach((x) => {
|
|
76
|
+
if (!normalSTsStarted && x.isNormal().toBoolean()) {
|
|
77
|
+
normalSTsStarted = true;
|
|
78
|
+
}
|
|
79
|
+
if (normalSTsStarted && x.isProtocol().toBoolean()) {
|
|
80
|
+
throw new Error("Order in initializing STBatch not correct");
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
72
84
|
while (batch.length < constants.stateTransitionProverBatchSize) {
|
|
73
85
|
batch.push(ProvableStateTransition.dummy());
|
|
74
86
|
transitionTypes.push(ProvableStateTransitionType.normal);
|
|
@@ -110,9 +110,6 @@ export class BlockProverProgrammable extends ZkProgrammable<
|
|
|
110
110
|
|
|
111
111
|
const stateTo = { ...state };
|
|
112
112
|
|
|
113
|
-
// eslint-disable-next-line no-warning-comments
|
|
114
|
-
// TODO Check methodId?
|
|
115
|
-
|
|
116
113
|
// Checks for the stateTransitionProof and appProof matching
|
|
117
114
|
stateTransitionProof.publicInput.stateTransitionsHash.assertEquals(
|
|
118
115
|
Field(0),
|
|
@@ -124,15 +121,21 @@ export class BlockProverProgrammable extends ZkProgrammable<
|
|
|
124
121
|
errors.stateTransitionsHashNotEqual()
|
|
125
122
|
);
|
|
126
123
|
|
|
127
|
-
//
|
|
124
|
+
// Assert from state roots
|
|
128
125
|
state.stateRoot.assertEquals(
|
|
129
126
|
stateTransitionProof.publicInput.stateRoot,
|
|
130
127
|
errors.propertyNotMatching("from state root")
|
|
131
128
|
);
|
|
129
|
+
state.stateRoot.assertEquals(
|
|
130
|
+
stateTransitionProof.publicInput.protocolStateRoot,
|
|
131
|
+
errors.propertyNotMatching("from protocol state root")
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
// Apply state if status success
|
|
132
135
|
stateTo.stateRoot = Provable.if(
|
|
133
136
|
appProof.publicOutput.status,
|
|
134
137
|
stateTransitionProof.publicOutput.stateRoot,
|
|
135
|
-
stateTransitionProof.
|
|
138
|
+
stateTransitionProof.publicOutput.protocolStateRoot
|
|
136
139
|
);
|
|
137
140
|
|
|
138
141
|
// Apply protocol state transitions
|
|
@@ -143,9 +146,6 @@ export class BlockProverProgrammable extends ZkProgrammable<
|
|
|
143
146
|
.validateSignature()
|
|
144
147
|
.assertTrue("Transaction signature not valid");
|
|
145
148
|
|
|
146
|
-
// Check if the methodId is correct
|
|
147
|
-
// to do
|
|
148
|
-
|
|
149
149
|
// Check transaction integrity against appProof
|
|
150
150
|
const blockTransactionHash =
|
|
151
151
|
RuntimeTransaction.fromProtocolTransaction(transaction).hash();
|
|
@@ -9,12 +9,14 @@ export class StateTransitionProverPublicInput extends Struct({
|
|
|
9
9
|
stateTransitionsHash: Field,
|
|
10
10
|
protocolTransitionsHash: Field,
|
|
11
11
|
stateRoot: Field,
|
|
12
|
+
protocolStateRoot: Field,
|
|
12
13
|
}) {}
|
|
13
14
|
|
|
14
15
|
export class StateTransitionProverPublicOutput extends Struct({
|
|
15
16
|
stateTransitionsHash: Field,
|
|
16
17
|
protocolTransitionsHash: Field,
|
|
17
18
|
stateRoot: Field,
|
|
19
|
+
protocolStateRoot: Field,
|
|
18
20
|
}) {}
|
|
19
21
|
|
|
20
22
|
export type StateTransitionProof = Proof<
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/* eslint-disable max-lines */
|
|
2
|
-
import { Experimental, Field, Provable, SelfProof } from "snarkyjs";
|
|
2
|
+
import { Bool, Experimental, Field, Provable, SelfProof } from "snarkyjs";
|
|
3
3
|
import { injectable } from "tsyringe";
|
|
4
4
|
import {
|
|
5
5
|
AreProofsEnabled,
|
|
6
|
+
log,
|
|
6
7
|
PlainZkProgram,
|
|
7
8
|
provableMethod,
|
|
8
9
|
ZkProgrammable,
|
|
@@ -34,27 +35,21 @@ import {
|
|
|
34
35
|
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
|
|
35
36
|
|
|
36
37
|
const errors = {
|
|
37
|
-
|
|
38
|
+
propertyNotMatching: (property: string, step: string) =>
|
|
39
|
+
`${property} not matching ${step}`,
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
`
|
|
41
|
-
|
|
42
|
-
protocolTransitionsHashNotMatching: (step: string) =>
|
|
43
|
-
`Protocol transitions hash not matching ${step}`,
|
|
44
|
-
|
|
45
|
-
merkleWitnessNotCorrect: (index: number) =>
|
|
46
|
-
`MerkleWitness not valid for StateTransition (${index})`,
|
|
41
|
+
merkleWitnessNotCorrect: (index: number, type: string) =>
|
|
42
|
+
`MerkleWitness not valid for StateTransition (${index}, type ${type})`,
|
|
47
43
|
|
|
48
44
|
noWitnessProviderSet: () =>
|
|
49
45
|
new Error(
|
|
50
46
|
"WitnessProvider not set, set it before you use StateTransitionProvider"
|
|
51
47
|
),
|
|
52
|
-
|
|
53
|
-
propertyNotMatching: (propertyName: string) => `${propertyName} not matching`,
|
|
54
48
|
};
|
|
55
49
|
|
|
56
50
|
interface StateTransitionProverExecutionState {
|
|
57
51
|
stateRoot: Field;
|
|
52
|
+
protocolStateRoot: Field;
|
|
58
53
|
stateTransitionList: ProvableHashList<ProvableStateTransition>;
|
|
59
54
|
protocolTransitionList: ProvableHashList<ProvableStateTransition>;
|
|
60
55
|
}
|
|
@@ -154,12 +149,14 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
154
149
|
*/
|
|
155
150
|
public applyTransitions(
|
|
156
151
|
stateRoot: Field,
|
|
152
|
+
protocolStateRoot: Field,
|
|
157
153
|
stateTransitionCommitmentFrom: Field,
|
|
158
154
|
protocolTransitionCommitmentFrom: Field,
|
|
159
155
|
transitionBatch: StateTransitionProvableBatch
|
|
160
156
|
): StateTransitionProverExecutionState {
|
|
161
157
|
const state: StateTransitionProverExecutionState = {
|
|
162
158
|
stateRoot,
|
|
159
|
+
protocolStateRoot,
|
|
163
160
|
|
|
164
161
|
stateTransitionList: new DefaultProvableHashList(
|
|
165
162
|
ProvableStateTransition,
|
|
@@ -205,16 +202,20 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
205
202
|
transition.path,
|
|
206
203
|
transition.from.value
|
|
207
204
|
);
|
|
205
|
+
|
|
208
206
|
membershipValid
|
|
209
207
|
.or(transition.from.isSome.not())
|
|
210
|
-
.assertTrue(
|
|
208
|
+
.assertTrue(
|
|
209
|
+
errors.merkleWitnessNotCorrect(
|
|
210
|
+
index,
|
|
211
|
+
type.isNormal().toBoolean() ? "normal" : "protocol"
|
|
212
|
+
)
|
|
213
|
+
);
|
|
211
214
|
|
|
212
|
-
const t = Date.now();
|
|
213
215
|
const newRoot = MerkleTreeUtils.computeRoot(
|
|
214
216
|
treeWitness,
|
|
215
217
|
transition.to.value
|
|
216
218
|
);
|
|
217
|
-
Provable.log("Compute root took", Date.now() - t, "ms");
|
|
218
219
|
|
|
219
220
|
state.stateRoot = Provable.if(
|
|
220
221
|
transition.to.isSome,
|
|
@@ -222,6 +223,14 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
222
223
|
state.stateRoot
|
|
223
224
|
);
|
|
224
225
|
|
|
226
|
+
// Only update protocol state root if ST is also of type protocol
|
|
227
|
+
// Since protocol STs are all at the start of the batch, this works
|
|
228
|
+
state.protocolStateRoot = Provable.if(
|
|
229
|
+
transition.to.isSome.and(type.isProtocol()),
|
|
230
|
+
newRoot,
|
|
231
|
+
state.protocolStateRoot
|
|
232
|
+
);
|
|
233
|
+
|
|
225
234
|
const isNotDummy = transition.path.equals(Field(0)).not();
|
|
226
235
|
|
|
227
236
|
state.stateTransitionList.pushIf(
|
|
@@ -244,6 +253,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
244
253
|
): StateTransitionProverPublicOutput {
|
|
245
254
|
const result = this.applyTransitions(
|
|
246
255
|
publicInput.stateRoot,
|
|
256
|
+
publicInput.protocolStateRoot,
|
|
247
257
|
publicInput.stateTransitionsHash,
|
|
248
258
|
publicInput.protocolTransitionsHash,
|
|
249
259
|
batch
|
|
@@ -253,6 +263,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
253
263
|
stateRoot: result.stateRoot,
|
|
254
264
|
stateTransitionsHash: result.stateTransitionList.commitment,
|
|
255
265
|
protocolTransitionsHash: result.protocolTransitionList.commitment,
|
|
266
|
+
protocolStateRoot: result.protocolStateRoot,
|
|
256
267
|
});
|
|
257
268
|
}
|
|
258
269
|
|
|
@@ -268,39 +279,66 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
268
279
|
// Check state
|
|
269
280
|
publicInput.stateRoot.assertEquals(
|
|
270
281
|
proof1.publicInput.stateRoot,
|
|
271
|
-
errors.
|
|
282
|
+
errors.propertyNotMatching("stateRoot", "publicInput.from -> proof1.from")
|
|
272
283
|
);
|
|
273
284
|
proof1.publicOutput.stateRoot.assertEquals(
|
|
274
285
|
proof2.publicInput.stateRoot,
|
|
275
|
-
errors.
|
|
286
|
+
errors.propertyNotMatching("stateRoot", "proof1.to -> proof2.from")
|
|
276
287
|
);
|
|
277
288
|
|
|
278
289
|
// Check ST list
|
|
279
290
|
publicInput.stateTransitionsHash.assertEquals(
|
|
280
291
|
proof1.publicInput.stateTransitionsHash,
|
|
281
|
-
errors.
|
|
292
|
+
errors.propertyNotMatching(
|
|
293
|
+
"stateTransitionsHash",
|
|
294
|
+
"publicInput.from -> proof1.from"
|
|
295
|
+
)
|
|
282
296
|
);
|
|
283
297
|
proof1.publicOutput.stateTransitionsHash.assertEquals(
|
|
284
298
|
proof2.publicInput.stateTransitionsHash,
|
|
285
|
-
errors.
|
|
299
|
+
errors.propertyNotMatching(
|
|
300
|
+
"stateTransitionsHash",
|
|
301
|
+
"proof1.to -> proof2.from"
|
|
302
|
+
)
|
|
286
303
|
);
|
|
287
304
|
|
|
288
305
|
// Check Protocol ST list
|
|
289
306
|
publicInput.protocolTransitionsHash.assertEquals(
|
|
290
307
|
proof1.publicInput.protocolTransitionsHash,
|
|
291
|
-
errors.
|
|
308
|
+
errors.propertyNotMatching(
|
|
309
|
+
"protocolTransitionsHash",
|
|
292
310
|
"publicInput.from -> proof1.from"
|
|
293
311
|
)
|
|
294
312
|
);
|
|
295
313
|
proof1.publicOutput.protocolTransitionsHash.assertEquals(
|
|
296
314
|
proof2.publicInput.protocolTransitionsHash,
|
|
297
|
-
errors.
|
|
315
|
+
errors.propertyNotMatching(
|
|
316
|
+
"protocolTransitionsHash",
|
|
317
|
+
"proof1.to -> proof2.from"
|
|
318
|
+
)
|
|
319
|
+
);
|
|
320
|
+
|
|
321
|
+
// Check protocol state root
|
|
322
|
+
publicInput.protocolStateRoot.assertEquals(
|
|
323
|
+
proof1.publicInput.protocolStateRoot,
|
|
324
|
+
errors.propertyNotMatching(
|
|
325
|
+
"protocolStateRoot",
|
|
326
|
+
"publicInput.from -> proof1.from"
|
|
327
|
+
)
|
|
328
|
+
);
|
|
329
|
+
proof1.publicOutput.protocolStateRoot.assertEquals(
|
|
330
|
+
proof2.publicInput.protocolStateRoot,
|
|
331
|
+
errors.propertyNotMatching(
|
|
332
|
+
"protocolStateRoot",
|
|
333
|
+
"proof1.to -> proof2.from"
|
|
334
|
+
)
|
|
298
335
|
);
|
|
299
336
|
|
|
300
337
|
return new StateTransitionProverPublicInput({
|
|
301
338
|
stateRoot: proof2.publicOutput.stateRoot,
|
|
302
339
|
stateTransitionsHash: proof2.publicOutput.stateTransitionsHash,
|
|
303
340
|
protocolTransitionsHash: proof2.publicOutput.protocolTransitionsHash,
|
|
341
|
+
protocolStateRoot: proof2.publicOutput.protocolStateRoot,
|
|
304
342
|
});
|
|
305
343
|
}
|
|
306
344
|
}
|
|
@@ -5,6 +5,8 @@ import { container } from "tsyringe";
|
|
|
5
5
|
|
|
6
6
|
import { assert } from "./assert";
|
|
7
7
|
import { RuntimeMethodExecutionContext } from "../context/RuntimeMethodExecutionContext";
|
|
8
|
+
import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
|
|
9
|
+
import { NetworkState } from "../../model/network/NetworkState";
|
|
8
10
|
|
|
9
11
|
describe("assert", () => {
|
|
10
12
|
const defaultStatusMessage = "something went wrong";
|
|
@@ -12,6 +14,11 @@ describe("assert", () => {
|
|
|
12
14
|
|
|
13
15
|
beforeEach(() => {
|
|
14
16
|
executionContext.beforeMethod("testConstructor", "test", []);
|
|
17
|
+
|
|
18
|
+
executionContext.setup({
|
|
19
|
+
transaction: undefined as unknown as RuntimeTransaction,
|
|
20
|
+
networkState: undefined as unknown as NetworkState,
|
|
21
|
+
});
|
|
15
22
|
});
|
|
16
23
|
|
|
17
24
|
afterEach(() => {
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Bool
|
|
1
|
+
import { Bool } from "snarkyjs";
|
|
2
2
|
import { container } from "tsyringe";
|
|
3
3
|
import { log } from "@proto-kit/common";
|
|
4
4
|
|
|
5
5
|
import { RuntimeMethodExecutionContext } from "../context/RuntimeMethodExecutionContext";
|
|
6
|
-
import { exec } from "child_process";
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Maintains an execution status of the current runtime module method,
|
|
@@ -17,7 +16,7 @@ import { exec } from "child_process";
|
|
|
17
16
|
export function assert(condition: Bool, message?: string) {
|
|
18
17
|
const executionContext = container.resolve(RuntimeMethodExecutionContext);
|
|
19
18
|
const previousStatus = executionContext.current().result.status;
|
|
20
|
-
const status =
|
|
19
|
+
const status = condition.and(previousStatus);
|
|
21
20
|
|
|
22
21
|
if (!condition.toBoolean()) {
|
|
23
22
|
log.debug("Assertion failed: ", message);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { Bool, Field, Provable, UInt64 } from "snarkyjs";
|
|
3
|
+
import { container } from "tsyringe";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
NetworkState,
|
|
7
|
+
noop,
|
|
8
|
+
RuntimeMethodExecutionContext,
|
|
9
|
+
RuntimeTransaction,
|
|
10
|
+
State,
|
|
11
|
+
StateService,
|
|
12
|
+
StateServiceProvider,
|
|
13
|
+
} from "../src";
|
|
14
|
+
|
|
15
|
+
describe("state", () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
const executionContext = container.resolve(RuntimeMethodExecutionContext);
|
|
18
|
+
|
|
19
|
+
executionContext.setup({
|
|
20
|
+
transaction: undefined as unknown as RuntimeTransaction,
|
|
21
|
+
networkState: undefined as unknown as NetworkState,
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("should decode state correctly", () => {
|
|
26
|
+
expect.assertions(2);
|
|
27
|
+
|
|
28
|
+
const state = State.from<UInt64>(UInt64);
|
|
29
|
+
const stateService: StateService = {
|
|
30
|
+
get: () => [Field(123)],
|
|
31
|
+
|
|
32
|
+
set: () => {
|
|
33
|
+
noop();
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
state.stateServiceProvider = new StateServiceProvider();
|
|
37
|
+
state.stateServiceProvider.setCurrentStateService(stateService);
|
|
38
|
+
state.path = Field(1);
|
|
39
|
+
|
|
40
|
+
const retrieved = state.get();
|
|
41
|
+
|
|
42
|
+
expect(retrieved.isSome).toStrictEqual(Bool(true));
|
|
43
|
+
expect(retrieved.value).toStrictEqual(UInt64.from(123));
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { type MerkleTreeStore, type SyncMerkleTreeStore } from "./RollupMerkleTree.js";
|
|
2
|
-
export declare class NoOpMerkleTreeStorage implements SyncMerkleTreeStore {
|
|
3
|
-
parent: MerkleTreeStore;
|
|
4
|
-
openTransaction(): void;
|
|
5
|
-
commit(): void;
|
|
6
|
-
getNode(): bigint | undefined;
|
|
7
|
-
setNode(): void;
|
|
8
|
-
virtualize(): MerkleTreeStore;
|
|
9
|
-
getNodeAsync(): Promise<bigint | undefined>;
|
|
10
|
-
setNodeAsync(): Promise<void>;
|
|
11
|
-
}
|
|
12
|
-
export declare class MemoryMerkleTreeStorage implements SyncMerkleTreeStore {
|
|
13
|
-
private readonly nodes;
|
|
14
|
-
private readonly cache;
|
|
15
|
-
parent: SyncMerkleTreeStore;
|
|
16
|
-
constructor(parent?: SyncMerkleTreeStore | undefined);
|
|
17
|
-
openTransaction(): void;
|
|
18
|
-
commit(): void;
|
|
19
|
-
getNode(key: bigint, level: number): bigint | undefined;
|
|
20
|
-
setNode(key: bigint, level: number, value: bigint): void;
|
|
21
|
-
virtualize(): MerkleTreeStore;
|
|
22
|
-
getNodeAsync(key: bigint, level: number): Promise<bigint | undefined>;
|
|
23
|
-
setNodeAsync(key: bigint, level: number, value: bigint): Promise<void>;
|
|
24
|
-
cacheFromParent(index: bigint): Promise<void>;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=MemoryMerkleTreeStorage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryMerkleTreeStorage.d.ts","sourceRoot":"","sources":["../../../src/utils/merkletree/MemoryMerkleTreeStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,qBAAsB,YAAW,mBAAmB;IACxD,MAAM,EAAE,eAAe,CAAQ;IAE/B,eAAe,IAAI,IAAI;IAIvB,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,MAAM,GAAG,SAAS;IAI7B,OAAO,IAAI,IAAI;IAIf,UAAU,IAAI,eAAe;IAIvB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI3C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAG3C;AAED,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGf;IAEP,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGf;IAEA,MAAM,EAAE,mBAAmB,CAAC;gBAEhB,MAAM,GAAE,mBAAmB,GAAG,SAAqB;IAI/D,eAAe,IAAI,IAAI;IAIvB,MAAM,IAAI,IAAI;IAId,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQvD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIxD,UAAU,IAAI,eAAe;IAIvB,YAAY,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIjB,YAAY,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAKH,eAAe,CAAC,KAAK,EAAE,MAAM;CAoB3C"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-magic-numbers */
|
|
2
|
-
import noop from "lodash/noop";
|
|
3
|
-
import { RollupMerkleTree, } from "./RollupMerkleTree.js";
|
|
4
|
-
export class NoOpMerkleTreeStorage {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.parent = this;
|
|
7
|
-
}
|
|
8
|
-
openTransaction() {
|
|
9
|
-
noop();
|
|
10
|
-
}
|
|
11
|
-
commit() {
|
|
12
|
-
noop();
|
|
13
|
-
}
|
|
14
|
-
getNode() {
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
setNode() {
|
|
18
|
-
noop();
|
|
19
|
-
}
|
|
20
|
-
virtualize() {
|
|
21
|
-
return this;
|
|
22
|
-
}
|
|
23
|
-
async getNodeAsync() {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
async setNodeAsync() {
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
export class MemoryMerkleTreeStorage {
|
|
31
|
-
constructor(parent = undefined) {
|
|
32
|
-
this.nodes = {};
|
|
33
|
-
this.cache = {};
|
|
34
|
-
this.parent = parent ?? new NoOpMerkleTreeStorage();
|
|
35
|
-
}
|
|
36
|
-
openTransaction() {
|
|
37
|
-
noop();
|
|
38
|
-
}
|
|
39
|
-
commit() {
|
|
40
|
-
noop();
|
|
41
|
-
}
|
|
42
|
-
getNode(key, level) {
|
|
43
|
-
return (this.nodes[level]?.[key.toString()] ??
|
|
44
|
-
this.cache[level]?.[key.toString()] ??
|
|
45
|
-
this.parent.getNode(key, level));
|
|
46
|
-
}
|
|
47
|
-
setNode(key, level, value) {
|
|
48
|
-
var _a;
|
|
49
|
-
((_a = this.nodes)[level] ?? (_a[level] = {}))[key.toString()] = value;
|
|
50
|
-
}
|
|
51
|
-
virtualize() {
|
|
52
|
-
return new MemoryMerkleTreeStorage(this);
|
|
53
|
-
}
|
|
54
|
-
async getNodeAsync(key, level) {
|
|
55
|
-
return this.getNode(key, level);
|
|
56
|
-
}
|
|
57
|
-
async setNodeAsync(key, level, value) {
|
|
58
|
-
this.setNode(key, level, value);
|
|
59
|
-
return undefined;
|
|
60
|
-
}
|
|
61
|
-
async cacheFromParent(index) {
|
|
62
|
-
var _a;
|
|
63
|
-
// Algo from RollupMerkleTree.getWitness()
|
|
64
|
-
const { leafCount, height } = RollupMerkleTree;
|
|
65
|
-
if (index >= leafCount) {
|
|
66
|
-
index %= leafCount;
|
|
67
|
-
}
|
|
68
|
-
for (let level = 0; level < height - 1; level++) {
|
|
69
|
-
const isLeft = index % 2n === 0n;
|
|
70
|
-
const key = isLeft ? index + 1n : index - 1n;
|
|
71
|
-
// eslint-disable-next-line no-await-in-loop
|
|
72
|
-
const value = await this.parent.getNodeAsync(key, level);
|
|
73
|
-
if (value !== undefined) {
|
|
74
|
-
((_a = this.nodes)[level] ?? (_a[level] = {}))[key.toString()] = value;
|
|
75
|
-
}
|
|
76
|
-
index /= 2n;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|