@proto-kit/protocol 0.1.1-develop.457 → 0.1.1-develop.651
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blockmodules/AccountStateModule.d.ts.map +1 -1
- package/dist/blockmodules/AccountStateModule.js +10 -3
- package/dist/blockmodules/BlockHeightHook.d.ts +3 -3
- package/dist/blockmodules/BlockHeightHook.d.ts.map +1 -1
- package/dist/blockmodules/BlockHeightHook.js +5 -4
- package/dist/blockmodules/LastStateRootBlockHook.d.ts +8 -0
- package/dist/blockmodules/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/blockmodules/LastStateRootBlockHook.js +15 -0
- package/dist/blockmodules/NoopBlockHook.d.ts +6 -4
- package/dist/blockmodules/NoopBlockHook.d.ts.map +1 -1
- package/dist/blockmodules/NoopBlockHook.js +4 -4
- package/dist/blockmodules/NoopSettlementHook.d.ts +6 -0
- package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -0
- package/dist/blockmodules/NoopSettlementHook.js +18 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -1
- package/dist/hooks/AccountStateHook.js +17 -5
- package/dist/hooks/BlockHeightHook.d.ts +3 -3
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
- package/dist/hooks/BlockHeightHook.js +5 -4
- package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.js +15 -0
- package/dist/hooks/NoopBlockHook.d.ts +6 -4
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
- package/dist/hooks/NoopBlockHook.js +4 -4
- package/dist/hooks/NoopSettlementHook.d.ts +6 -0
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
- package/dist/hooks/NoopSettlementHook.js +18 -0
- package/dist/index.d.ts +24 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -6
- package/dist/model/MethodPublicOutput.d.ts +8 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -1
- package/dist/model/MethodPublicOutput.js +1 -0
- package/dist/model/Option.d.ts +3 -2
- package/dist/model/Option.d.ts.map +1 -1
- package/dist/model/Option.js +5 -0
- package/dist/model/RuntimeLike.d.ts +11 -0
- package/dist/model/RuntimeLike.d.ts.map +1 -0
- package/dist/model/RuntimeLike.js +1 -0
- package/dist/model/StateTransition.d.ts +6 -5
- package/dist/model/StateTransition.d.ts.map +1 -1
- package/dist/model/StateTransition.js +3 -0
- package/dist/model/StateTransitionReduction.d.ts +3 -0
- package/dist/model/StateTransitionReduction.d.ts.map +1 -0
- package/dist/model/StateTransitionReduction.js +26 -0
- package/dist/model/network/NetworkState.d.ts +40 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -1
- package/dist/model/network/NetworkState.js +14 -2
- package/dist/model/transaction/RuntimeTransaction.d.ts +45 -20
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
- package/dist/model/transaction/RuntimeTransaction.js +68 -11
- package/dist/model/transaction/SignedTransaction.d.ts +71 -0
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
- package/dist/model/transaction/SignedTransaction.js +33 -0
- package/dist/model/transaction/ValueOption.d.ts +119 -0
- package/dist/model/transaction/ValueOption.d.ts.map +1 -0
- package/dist/model/transaction/ValueOption.js +24 -0
- package/dist/protocol/Protocol.d.ts +13 -16
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +26 -39
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +1 -1
- package/dist/protocol/ProvableBlockHook.d.ts +2 -10
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
- package/dist/protocol/ProvableBlockHook.js +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.d.ts +3 -2
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.js +3 -2
- package/dist/prover/block/BlockProvable.d.ts +106 -28
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.js +23 -5
- package/dist/prover/block/BlockProver.d.ts +29 -8
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +244 -78
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +45 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +3 -2
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +1 -0
- package/dist/settlement/ContractModule.d.ts +15 -0
- package/dist/settlement/ContractModule.d.ts.map +1 -0
- package/dist/settlement/ContractModule.js +11 -0
- package/dist/settlement/ProvableSettlementHook.d.ts +26 -0
- package/dist/settlement/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/ProvableSettlementHook.js +3 -0
- package/dist/settlement/SettlementContract.d.ts +230 -0
- package/dist/settlement/SettlementContract.d.ts.map +1 -0
- package/dist/settlement/SettlementContract.js +346 -0
- package/dist/settlement/SettlementContractModule.d.ts +39 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
- package/dist/settlement/SettlementContractModule.js +68 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +36 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +41 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.js +235 -0
- package/dist/settlement/messages/Deposit.d.ts +39 -0
- package/dist/settlement/messages/Deposit.d.ts.map +1 -0
- package/dist/settlement/messages/Deposit.js +6 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +109 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
- package/dist/settlement/messages/Withdrawal.d.ts +40 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
- package/dist/settlement/messages/Withdrawal.js +13 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js +12 -0
- package/dist/state/State.d.ts.map +1 -1
- package/dist/state/State.js +2 -1
- package/dist/state/assert/assert.d.ts.map +1 -1
- package/dist/state/assert/assert.js +8 -5
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +75 -1
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.js +21 -2
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +51 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableHashList.d.ts +3 -3
- package/dist/utils/ProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableReductionHashList.d.ts +14 -0
- package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +50 -0
- package/dist/utils/StateTransitionReductionList.d.ts +11 -0
- package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
- package/dist/utils/StateTransitionReductionList.js +60 -0
- package/package.json +2 -2
- package/src/hooks/AccountStateHook.ts +46 -0
- package/src/hooks/BlockHeightHook.ts +18 -0
- package/src/hooks/LastStateRootBlockHook.ts +26 -0
- package/src/hooks/NoopBlockHook.ts +20 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/SequenceStateTransactionModule.ts +25 -0
- package/src/index.ts +24 -6
- package/src/model/MethodPublicOutput.ts +3 -2
- package/src/model/Option.ts +16 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +10 -2
- package/src/model/network/NetworkState.ts +15 -3
- package/src/model/transaction/RuntimeTransaction.ts +90 -16
- package/src/model/transaction/SignedTransaction.ts +54 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +60 -67
- package/src/protocol/ProtocolModule.ts +3 -2
- package/src/protocol/ProvableBlockHook.ts +10 -13
- package/src/protocol/ProvableTransactionHook.ts +2 -1
- package/src/protocol/TransitioningProtocolModule.ts +3 -2
- package/src/prover/block/BlockProvable.ts +39 -6
- package/src/prover/block/BlockProver.ts +484 -142
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
- package/src/prover/statetransition/StateTransitionProver.ts +4 -2
- package/src/settlement/ContractModule.ts +24 -0
- package/src/settlement/SettlementContractModule.ts +127 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +135 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +65 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +329 -0
- package/src/settlement/messages/Deposit.ts +6 -0
- package/src/settlement/messages/OutgoingMessageArgument.ts +41 -0
- package/src/settlement/messages/Withdrawal.ts +14 -0
- package/src/settlement/modularity/ProvableSettlementHook.ts +34 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +39 -0
- package/src/state/State.ts +2 -1
- package/src/state/assert/assert.ts +8 -6
- package/src/state/context/RuntimeMethodExecutionContext.ts +22 -2
- package/src/utils/MinaPrefixedProvableHashList.ts +72 -0
- package/src/utils/PrefixedProvableHashList.ts +2 -2
- package/src/utils/ProvableHashList.ts +3 -3
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +88 -0
- package/test/BlockProver.test.ts +4 -5
- package/test/Protocol.test.ts +15 -10
- package/test/settlement/SettlementContract.test.ts +45 -0
- package/test/utils/ProvableReductionHashList.test.ts +114 -0
- package/src/blockmodules/AccountStateModule.ts +0 -33
- package/src/blockmodules/BlockHeightHook.ts +0 -21
- package/src/blockmodules/NoopBlockHook.ts +0 -16
- package/src/model/transaction/ProtocolTransaction.ts +0 -25
- package/src/prover/block/BlockTransactionPosition.ts +0 -34
- /package/src/{blockmodules → hooks}/NoopTransactionHook.ts +0 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Bool, Field, Poseidon, Provable } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { ProvableHashList } from "./ProvableHashList";
|
|
4
|
+
|
|
5
|
+
export class ProvableReductionHashList<Value> extends ProvableHashList<Value> {
|
|
6
|
+
public unconstrainedList: Value[] = [];
|
|
7
|
+
|
|
8
|
+
private constrainedLastValue: Value | undefined = undefined;
|
|
9
|
+
|
|
10
|
+
private preimage: Field = this.commitment;
|
|
11
|
+
|
|
12
|
+
public pushAndReduce(
|
|
13
|
+
value: Value,
|
|
14
|
+
reduce: (previous: Value) => [Value, Bool]
|
|
15
|
+
): { popLast: Bool; value: Value } {
|
|
16
|
+
let valueToPush = value;
|
|
17
|
+
let popLast = Bool(false);
|
|
18
|
+
|
|
19
|
+
// Theoretically, we can feed the preimage + last value as a witness
|
|
20
|
+
// for non-zero commitment starts (like used in the BlockProver), because
|
|
21
|
+
// currently it won't reduce across chunks. But this is okay for now I think
|
|
22
|
+
if (this.constrainedLastValue !== undefined) {
|
|
23
|
+
[valueToPush, popLast] = reduce(this.constrainedLastValue);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Provable.asProver(() => {
|
|
27
|
+
if (popLast.toBoolean()) {
|
|
28
|
+
this.unconstrainedList.pop();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const valueAsConstant = this.valueType.fromFields(
|
|
32
|
+
this.valueType.toFields(valueToPush).map((field) => field.toConstant())
|
|
33
|
+
);
|
|
34
|
+
this.unconstrainedList.push(valueAsConstant);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const currentCommitment = this.commitment;
|
|
38
|
+
const noPopCommitment = this.hash([
|
|
39
|
+
currentCommitment,
|
|
40
|
+
...this.valueType.toFields(valueToPush),
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
const popCommitment = this.hash([
|
|
44
|
+
this.preimage,
|
|
45
|
+
...this.valueType.toFields(valueToPush),
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
|
|
49
|
+
|
|
50
|
+
this.constrainedLastValue = valueToPush;
|
|
51
|
+
this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
popLast,
|
|
55
|
+
value: valueToPush,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public pushIf(value: Value, condition: Bool) {
|
|
60
|
+
throw new Error("pushIf is not implemented for ReducedHashList");
|
|
61
|
+
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public hash(elements: Field[]): Field {
|
|
66
|
+
return Poseidon.hash(elements);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Provable } from "o1js";
|
|
2
|
+
import { ProvableOption } from "../model/Option";
|
|
3
|
+
import {
|
|
4
|
+
ProvableStateTransition,
|
|
5
|
+
StateTransition,
|
|
6
|
+
} from "../model/StateTransition";
|
|
7
|
+
|
|
8
|
+
import { ProvableReductionHashList } from "./ProvableReductionHashList";
|
|
9
|
+
|
|
10
|
+
export class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
|
|
11
|
+
public push(value: ProvableStateTransition) {
|
|
12
|
+
this.pushWithMetadata(value);
|
|
13
|
+
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public pushWithMetadata(value: ProvableStateTransition) {
|
|
18
|
+
return this.pushAndReduce(value, (previous: ProvableStateTransition) => {
|
|
19
|
+
const pathsMatch = previous.path.equals(value.path);
|
|
20
|
+
|
|
21
|
+
// Take the previous.from if the paths match, otherwise leave ST as is
|
|
22
|
+
const from = Provable.if(
|
|
23
|
+
pathsMatch,
|
|
24
|
+
ProvableOption,
|
|
25
|
+
previous.from,
|
|
26
|
+
value.from
|
|
27
|
+
);
|
|
28
|
+
// In case we have a layout like
|
|
29
|
+
// { from: 5, to: 10 }, { from: 10, to: none }
|
|
30
|
+
// we just take the first and discard the second
|
|
31
|
+
const to = Provable.if(
|
|
32
|
+
value.to.isSome.or(pathsMatch.not()),
|
|
33
|
+
ProvableOption,
|
|
34
|
+
value.to,
|
|
35
|
+
previous.to
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
const transition = new ProvableStateTransition({
|
|
39
|
+
path: value.path,
|
|
40
|
+
from: new ProvableOption(from),
|
|
41
|
+
to: new ProvableOption(to),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Assert that connection is correct
|
|
45
|
+
previous.to.value
|
|
46
|
+
.equals(value.from.value)
|
|
47
|
+
.or(
|
|
48
|
+
previous.to.isSome
|
|
49
|
+
.not()
|
|
50
|
+
.and(previous.from.value.equals(value.from.value))
|
|
51
|
+
)
|
|
52
|
+
.or(pathsMatch.not())
|
|
53
|
+
.assertTrue();
|
|
54
|
+
|
|
55
|
+
return [transition, pathsMatch];
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function reduceStateTransitions(
|
|
61
|
+
transitions: StateTransition<unknown>[]
|
|
62
|
+
): StateTransition<unknown>[] {
|
|
63
|
+
const reduced: StateTransition<unknown>[] = [];
|
|
64
|
+
|
|
65
|
+
for (const st of transitions) {
|
|
66
|
+
if (reduced.length === 0) {
|
|
67
|
+
reduced.push(st);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const last = reduced.at(-1)!;
|
|
72
|
+
if (last.path.equals(st.path).toBoolean()) {
|
|
73
|
+
if (st.toValue.isSome.toBoolean()) {
|
|
74
|
+
reduced.pop();
|
|
75
|
+
reduced.push(
|
|
76
|
+
new StateTransition<unknown>(st.path, last.fromValue, st.toValue)
|
|
77
|
+
);
|
|
78
|
+
} else {
|
|
79
|
+
// Do nothing, because we discard that ST
|
|
80
|
+
// { from: 5, to: 10 }, { from: 10, to: none }
|
|
81
|
+
// cancel the 2nd
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
reduced.push(st);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return reduced;
|
|
88
|
+
}
|
package/test/BlockProver.test.ts
CHANGED
|
@@ -19,16 +19,15 @@ import {
|
|
|
19
19
|
} from "@proto-kit/common";
|
|
20
20
|
import ZkProgram = Experimental.ZkProgram;
|
|
21
21
|
import { UnsignedTransaction } from "@proto-kit/sequencer";
|
|
22
|
-
import {
|
|
22
|
+
import { AccountStateHook } from "../src/blockmodules/AccountStateHook";
|
|
23
23
|
import { container } from "tsyringe";
|
|
24
24
|
import {
|
|
25
|
-
BlockModule,
|
|
26
25
|
DefaultProvableHashList,
|
|
27
26
|
MethodPublicOutput,
|
|
28
27
|
NetworkState,
|
|
29
28
|
Protocol,
|
|
30
29
|
ProtocolMethodExecutionContext,
|
|
31
|
-
|
|
30
|
+
SignedTransaction,
|
|
32
31
|
ProvableStateTransition,
|
|
33
32
|
RuntimeTransaction,
|
|
34
33
|
StateTransitionProver,
|
|
@@ -87,7 +86,7 @@ describe("blockProver", () => {
|
|
|
87
86
|
StateTransitionProver: StateTransitionProver,
|
|
88
87
|
BlockProver: BlockProver,
|
|
89
88
|
},
|
|
90
|
-
blockModules: [
|
|
89
|
+
blockModules: [AccountStateHook],
|
|
91
90
|
});
|
|
92
91
|
|
|
93
92
|
beforeEach(() => {
|
|
@@ -101,7 +100,7 @@ describe("blockProver", () => {
|
|
|
101
100
|
fromStateRoot: Field,
|
|
102
101
|
toStateRoot: Field,
|
|
103
102
|
protocolHash: Field,
|
|
104
|
-
tx:
|
|
103
|
+
tx: SignedTransaction,
|
|
105
104
|
networkState: NetworkState
|
|
106
105
|
): BlockProverProofPair {
|
|
107
106
|
const transactionHash =
|
package/test/Protocol.test.ts
CHANGED
|
@@ -3,12 +3,14 @@ import { Protocol, VanillaProtocol } from "../src/protocol/Protocol";
|
|
|
3
3
|
import { beforeEach } from "@jest/globals";
|
|
4
4
|
import { BlockProver } from "../src/prover/block/BlockProver";
|
|
5
5
|
import { StateTransitionProver } from "../src/prover/statetransition/StateTransitionProver";
|
|
6
|
-
import {
|
|
7
|
-
|
|
6
|
+
import {
|
|
7
|
+
NoOpStateTransitionWitnessProvider,
|
|
8
|
+
ProvableTransactionHook,
|
|
9
|
+
} from "../src";
|
|
10
|
+
import { AccountStateHook } from "../src/blockmodules/AccountStateHook";
|
|
8
11
|
|
|
9
12
|
describe("protocol", () => {
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
});
|
|
13
|
+
beforeEach(() => {});
|
|
12
14
|
|
|
13
15
|
it("should resolve all provers correctly", async () => {
|
|
14
16
|
expect.assertions(2);
|
|
@@ -16,8 +18,8 @@ describe("protocol", () => {
|
|
|
16
18
|
const protocol = VanillaProtocol.create();
|
|
17
19
|
|
|
18
20
|
protocol.dependencyContainer.register("StateTransitionWitnessProvider", {
|
|
19
|
-
useValue: new NoOpStateTransitionWitnessProvider()
|
|
20
|
-
})
|
|
21
|
+
useValue: new NoOpStateTransitionWitnessProvider(),
|
|
22
|
+
});
|
|
21
23
|
|
|
22
24
|
expect(protocol.blockProver instanceof BlockProver).toBe(true);
|
|
23
25
|
expect(
|
|
@@ -32,13 +34,16 @@ describe("protocol", () => {
|
|
|
32
34
|
modules: {
|
|
33
35
|
BlockProver,
|
|
34
36
|
StateTransitionProver,
|
|
35
|
-
|
|
37
|
+
AccountStateHook,
|
|
36
38
|
},
|
|
37
39
|
});
|
|
38
40
|
|
|
39
|
-
const hooks =
|
|
41
|
+
const hooks =
|
|
42
|
+
protocol.dependencyContainer.resolveAll<ProvableTransactionHook>(
|
|
43
|
+
"ProvableTransactionHook"
|
|
44
|
+
);
|
|
40
45
|
|
|
41
46
|
expect(hooks).toHaveLength(1);
|
|
42
|
-
expect(hooks[0].name).toBe("
|
|
43
|
-
})
|
|
47
|
+
expect(hooks[0].name).toBe("AccountStateHook");
|
|
48
|
+
});
|
|
44
49
|
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
describe("inheritance & modularity", () => {
|
|
2
|
+
function decorator<T extends Base>(
|
|
3
|
+
target: T & { constructor: any },
|
|
4
|
+
methodName: string,
|
|
5
|
+
descriptor: PropertyDescriptor
|
|
6
|
+
) {
|
|
7
|
+
const f = descriptor.value;
|
|
8
|
+
descriptor.value = function (x: Base) {
|
|
9
|
+
console.log("Hello");
|
|
10
|
+
expect((this as any).some()).toBe("testValue");
|
|
11
|
+
f(this);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
class Base {
|
|
16
|
+
some() {
|
|
17
|
+
return "testValue";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@decorator
|
|
21
|
+
x() {}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
it("expect decorator to work with prototype overriding", () => {
|
|
25
|
+
expect.assertions(3);
|
|
26
|
+
|
|
27
|
+
const f = (base: Base) => {
|
|
28
|
+
expect(base.some()).toBe("testValue");
|
|
29
|
+
};
|
|
30
|
+
const propertyDescriptor: PropertyDescriptor = {
|
|
31
|
+
value: f,
|
|
32
|
+
};
|
|
33
|
+
decorator(Base.prototype, "y", propertyDescriptor);
|
|
34
|
+
(Base.prototype as any).y = propertyDescriptor.value;
|
|
35
|
+
|
|
36
|
+
const base = new Base() as Base & { y: () => void };
|
|
37
|
+
|
|
38
|
+
base.x();
|
|
39
|
+
base.y();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("test correct composition", async () => {
|
|
43
|
+
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Bool, Field, Poseidon } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { StateTransitionReductionList } from "../../src/utils/ProvableReductionHashList";
|
|
4
|
+
import {
|
|
5
|
+
DefaultProvableHashList,
|
|
6
|
+
ProvableStateTransition,
|
|
7
|
+
StateTransition,
|
|
8
|
+
Option,
|
|
9
|
+
} from "../../src";
|
|
10
|
+
import { reduceStateTransitions } from "../../src/model/StateTransitionReduction";
|
|
11
|
+
|
|
12
|
+
interface UnprovableStateTransition {
|
|
13
|
+
path: number;
|
|
14
|
+
from: number;
|
|
15
|
+
to: { isSome: boolean; value: number };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe("provableReductionHashList", () => {
|
|
19
|
+
function mapToProvable(
|
|
20
|
+
sts: UnprovableStateTransition[]
|
|
21
|
+
): StateTransition<unknown>[] {
|
|
22
|
+
return sts.map(
|
|
23
|
+
(st) =>
|
|
24
|
+
new StateTransition(
|
|
25
|
+
Field(st.path),
|
|
26
|
+
new Option(Bool(true), Field(st.from), Field, Bool(false)),
|
|
27
|
+
new Option(Bool(st.to.isSome), Field(st.to.value), Field, Bool(false))
|
|
28
|
+
) as StateTransition<unknown>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe.each<[UnprovableStateTransition[], number]>([
|
|
33
|
+
[
|
|
34
|
+
[
|
|
35
|
+
{ path: 1, from: 5, to: { isSome: true, value: 10 } },
|
|
36
|
+
{ path: 1, from: 10, to: { isSome: true, value: 15 } },
|
|
37
|
+
],
|
|
38
|
+
1,
|
|
39
|
+
],
|
|
40
|
+
[
|
|
41
|
+
[
|
|
42
|
+
{ path: 1, from: 5, to: { isSome: true, value: 10 } },
|
|
43
|
+
{ path: 1, from: 10, to: { isSome: false, value: 0 } },
|
|
44
|
+
],
|
|
45
|
+
1,
|
|
46
|
+
],
|
|
47
|
+
[
|
|
48
|
+
[
|
|
49
|
+
{ path: 1, from: 5, to: { isSome: true, value: 10 } },
|
|
50
|
+
{ path: 1, from: 10, to: { isSome: false, value: 0 } },
|
|
51
|
+
{ path: 1, from: 10, to: { isSome: false, value: 0 } },
|
|
52
|
+
{ path: 5, from: 15, to: { isSome: false, value: 0 } },
|
|
53
|
+
{ path: 5, from: 15, to: { isSome: true, value: 20 } },
|
|
54
|
+
{ path: 1, from: 10, to: { isSome: false, value: 0 } },
|
|
55
|
+
{ path: 5, from: 20, to: { isSome: true, value: 25 } },
|
|
56
|
+
{ path: 5, from: 25, to: { isSome: true, value: 30 } },
|
|
57
|
+
],
|
|
58
|
+
4,
|
|
59
|
+
],
|
|
60
|
+
])("should reduce and append correctly", (sts, reducedLength) => {
|
|
61
|
+
it("start from empty list", () => {
|
|
62
|
+
const reductionList = new StateTransitionReductionList(
|
|
63
|
+
ProvableStateTransition
|
|
64
|
+
);
|
|
65
|
+
const normalList = new DefaultProvableHashList(ProvableStateTransition);
|
|
66
|
+
|
|
67
|
+
const provableSTs = mapToProvable(sts);
|
|
68
|
+
|
|
69
|
+
provableSTs.forEach((st) => {
|
|
70
|
+
reductionList.push(st.toProvable());
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const reduced = reduceStateTransitions(provableSTs);
|
|
74
|
+
reduced.forEach((st) => {
|
|
75
|
+
normalList.push(st.toProvable());
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
expect(reduced).toHaveLength(reducedLength);
|
|
79
|
+
expect(normalList.commitment.toBigInt()).toStrictEqual(
|
|
80
|
+
reductionList.commitment.toBigInt()
|
|
81
|
+
);
|
|
82
|
+
expect(reductionList.unconstrainedList).toHaveLength(reduced.length);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("start from non-zero commitment - skip first reduction", () => {
|
|
86
|
+
const commitment = Poseidon.hash([Field(123_456)]);
|
|
87
|
+
const reductionList = new StateTransitionReductionList(
|
|
88
|
+
ProvableStateTransition,
|
|
89
|
+
commitment
|
|
90
|
+
);
|
|
91
|
+
const normalList = new DefaultProvableHashList(
|
|
92
|
+
ProvableStateTransition,
|
|
93
|
+
commitment
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
const provableSTs = mapToProvable(sts);
|
|
97
|
+
|
|
98
|
+
provableSTs.forEach((st) => {
|
|
99
|
+
reductionList.push(st.toProvable());
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const reduced = reduceStateTransitions(provableSTs);
|
|
103
|
+
reduced.forEach((st) => {
|
|
104
|
+
normalList.push(st.toProvable());
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
expect(reduced).toHaveLength(reducedLength);
|
|
108
|
+
expect(normalList.commitment.toBigInt()).toStrictEqual(
|
|
109
|
+
reductionList.commitment.toBigInt()
|
|
110
|
+
);
|
|
111
|
+
expect(reductionList.unconstrainedList).toHaveLength(reduced.length);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { PublicKey, Struct, UInt64 } from "o1js";
|
|
2
|
-
|
|
3
|
-
import { BlockProverExecutionData } from "../prover/block/BlockProvable";
|
|
4
|
-
import { StateMap } from "../state/StateMap";
|
|
5
|
-
import { protocolState } from "../state/protocol/ProtocolState";
|
|
6
|
-
import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
|
|
7
|
-
import { assert } from "../state/assert/assert";
|
|
8
|
-
|
|
9
|
-
export class AccountState extends Struct({
|
|
10
|
-
nonce: UInt64,
|
|
11
|
-
}) {}
|
|
12
|
-
|
|
13
|
-
export class AccountStateModule extends ProvableTransactionHook {
|
|
14
|
-
@protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
|
|
15
|
-
PublicKey,
|
|
16
|
-
AccountState
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
public onTransaction({ transaction }: BlockProverExecutionData): void {
|
|
20
|
-
const accountState = this.accountState
|
|
21
|
-
.get(transaction.sender)
|
|
22
|
-
.orElse(new AccountState({ nonce: UInt64.zero }));
|
|
23
|
-
|
|
24
|
-
const currentNonce = accountState.nonce;
|
|
25
|
-
|
|
26
|
-
assert(currentNonce.equals(transaction.nonce), "Nonce not matching");
|
|
27
|
-
|
|
28
|
-
this.accountState.set(
|
|
29
|
-
transaction.sender,
|
|
30
|
-
new AccountState({ nonce: currentNonce.add(1) })
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Provable } from "o1js";
|
|
2
|
-
import { NetworkState } from "../model/network/NetworkState";
|
|
3
|
-
import {
|
|
4
|
-
AfterBlockParameters,
|
|
5
|
-
BeforeBlockParameters,
|
|
6
|
-
ProvableBlockHook,
|
|
7
|
-
} from "../protocol/ProvableBlockHook";
|
|
8
|
-
|
|
9
|
-
export class BlockHeightHook extends ProvableBlockHook<Record<string, never>> {
|
|
10
|
-
public afterBlock({ networkState }: AfterBlockParameters): NetworkState {
|
|
11
|
-
return new NetworkState({
|
|
12
|
-
block: {
|
|
13
|
-
height: networkState.block.height.add(1),
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
public beforeBlock(blockData: BeforeBlockParameters): NetworkState {
|
|
19
|
-
return blockData.networkState;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AfterBlockParameters,
|
|
3
|
-
BeforeBlockParameters,
|
|
4
|
-
ProvableBlockHook
|
|
5
|
-
} from "../protocol/ProvableBlockHook";
|
|
6
|
-
import { NetworkState } from "../model/network/NetworkState";
|
|
7
|
-
|
|
8
|
-
export class NoopBlockHook extends ProvableBlockHook<Record<string, never>>{
|
|
9
|
-
public afterBlock(blockData: AfterBlockParameters): NetworkState {
|
|
10
|
-
return blockData.networkState;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
public beforeBlock(blockData: BeforeBlockParameters): NetworkState {
|
|
14
|
-
return blockData.networkState;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Bool, Field, PublicKey, Signature, Struct, UInt64 } from "o1js";
|
|
2
|
-
|
|
3
|
-
export class ProtocolTransaction extends Struct({
|
|
4
|
-
methodId: Field,
|
|
5
|
-
nonce: UInt64,
|
|
6
|
-
sender: PublicKey,
|
|
7
|
-
argsHash: Field,
|
|
8
|
-
signature: Signature,
|
|
9
|
-
}) {
|
|
10
|
-
public static getSignatureData(args: {
|
|
11
|
-
methodId: Field;
|
|
12
|
-
nonce: UInt64;
|
|
13
|
-
argsHash: Field;
|
|
14
|
-
}): Field[] {
|
|
15
|
-
return [args.methodId, ...args.nonce.toFields(), args.argsHash];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
public getSignatureData(): Field[] {
|
|
19
|
-
return ProtocolTransaction.getSignatureData(this);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public validateSignature(): Bool {
|
|
23
|
-
return this.signature.verify(this.sender, this.getSignatureData());
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { Bool, Field, Struct } from "o1js";
|
|
2
|
-
import { match } from "ts-pattern";
|
|
3
|
-
|
|
4
|
-
export type BlockTransactionPositionType = "FIRST" | "LAST" | "MIDDLE";
|
|
5
|
-
|
|
6
|
-
export class BlockTransactionPosition extends Struct({
|
|
7
|
-
type: Field,
|
|
8
|
-
}) {
|
|
9
|
-
private static readonly fieldMapping: Record<
|
|
10
|
-
BlockTransactionPositionType,
|
|
11
|
-
number
|
|
12
|
-
> = {
|
|
13
|
-
FIRST: 0,
|
|
14
|
-
MIDDLE: 1,
|
|
15
|
-
LAST: 2,
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
public static fromPositionType(type: BlockTransactionPositionType) {
|
|
19
|
-
return new BlockTransactionPosition({
|
|
20
|
-
type: Field(BlockTransactionPosition.fieldMapping[type]).toConstant(),
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public static positionTypeFromIndex(index: number, bundleLength: number) {
|
|
25
|
-
return match<number, BlockTransactionPositionType>(index)
|
|
26
|
-
.with(0, () => "FIRST")
|
|
27
|
-
.with(bundleLength - 1, () => "LAST")
|
|
28
|
-
.otherwise(() => "MIDDLE");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public equals(type: BlockTransactionPosition): Bool {
|
|
32
|
-
return this.type.equals(type.type);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
File without changes
|