@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
package/src/index.ts
CHANGED
|
@@ -1,22 +1,29 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
1
|
+
export * from "./hooks/AccountStateHook";
|
|
2
|
+
export * from "./hooks/BlockHeightHook";
|
|
3
3
|
export * from "./utils/ProvableHashList";
|
|
4
|
+
export * from "./hooks/LastStateRootBlockHook";
|
|
4
5
|
export * from "./model/StateTransition";
|
|
5
6
|
export * from "./model/StateTransitionProvableBatch";
|
|
6
7
|
export * from "./model/Option";
|
|
7
8
|
export * from "./model/Path";
|
|
8
9
|
export * from "./model/network/NetworkState";
|
|
9
|
-
export * from "./model/transaction/
|
|
10
|
+
export * from "./model/transaction/SignedTransaction";
|
|
10
11
|
export * from "./model/transaction/RuntimeTransaction";
|
|
11
|
-
export * from "./
|
|
12
|
+
export * from "./model/transaction/ValueOption";
|
|
13
|
+
export * from "./model/MethodPublicOutput";
|
|
14
|
+
export * from "./model/RuntimeLike";
|
|
15
|
+
export * from "./utils/ProvableHashList";
|
|
16
|
+
export * from "./utils/PrefixedProvableHashList";
|
|
17
|
+
export * from "./utils/MinaPrefixedProvableHashList";
|
|
18
|
+
export * from "./utils/ProvableReductionHashList";
|
|
19
|
+
export * from "./utils/StateTransitionReductionList";
|
|
12
20
|
export * from "./utils/utils";
|
|
13
21
|
export * from "./prover/block/BlockProver";
|
|
14
22
|
export * from "./prover/block/BlockProvable";
|
|
15
|
-
export * from "./prover/block/
|
|
23
|
+
export * from "./prover/block/accummulators/BlockHashMerkleTree";
|
|
16
24
|
export * from "./prover/statetransition/StateTransitionProver";
|
|
17
25
|
export * from "./prover/statetransition/StateTransitionProvable";
|
|
18
26
|
export * from "./prover/statetransition/StateTransitionWitnessProvider";
|
|
19
|
-
export * from "./model/MethodPublicOutput";
|
|
20
27
|
export * from "./prover/statetransition/StateTransitionWitnessProviderReference";
|
|
21
28
|
export * from "./protocol/Protocol";
|
|
22
29
|
export * from "./protocol/ProtocolModule";
|
|
@@ -32,4 +39,15 @@ export * from "./state/StateMap";
|
|
|
32
39
|
export * from "./state/StateService";
|
|
33
40
|
export * from "./state/StateServiceProvider";
|
|
34
41
|
export * from "./state/assert/assert";
|
|
42
|
+
export * from "./settlement/contracts/SettlementSmartContract";
|
|
43
|
+
export * from "./settlement/contracts/SettlementContractProtocolModule";
|
|
44
|
+
export * from "./settlement/contracts/DispatchSmartContract";
|
|
45
|
+
export * from "./settlement/contracts/DispatchContractProtocolModule";
|
|
46
|
+
export * from "./settlement/SettlementContractModule";
|
|
47
|
+
export * from "./settlement/ContractModule";
|
|
48
|
+
export * from "./settlement/modularity/ProvableSettlementHook";
|
|
49
|
+
export * from "./settlement/messages/OutgoingMessageArgument";
|
|
50
|
+
export * from "./settlement/modules/NetworkStateSettlementModule";
|
|
51
|
+
export * from "./settlement/messages/Deposit";
|
|
52
|
+
export * from "./settlement/messages/Withdrawal";
|
|
35
53
|
export { constants as ProtocolConstants } from "./Constants";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Bool, Field, Struct } from "o1js";
|
|
1
|
+
import { Bool, Field, Signature, Struct } from "o1js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Public input used to link in-circuit execution with
|
|
@@ -9,4 +9,5 @@ export class MethodPublicOutput extends Struct({
|
|
|
9
9
|
status: Bool,
|
|
10
10
|
transactionHash: Field,
|
|
11
11
|
networkStateHash: Field,
|
|
12
|
-
|
|
12
|
+
isMessage: Bool,
|
|
13
|
+
}) {}
|
package/src/model/Option.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type FlexibleProvablePure,
|
|
5
5
|
Poseidon,
|
|
6
6
|
Provable,
|
|
7
|
+
ProvablePure,
|
|
7
8
|
Struct,
|
|
8
9
|
} from "o1js";
|
|
9
10
|
|
|
@@ -149,4 +150,19 @@ export class Option<Value> extends OptionBase {
|
|
|
149
150
|
defaultValue
|
|
150
151
|
);
|
|
151
152
|
}
|
|
153
|
+
|
|
154
|
+
public toConstant() {
|
|
155
|
+
const valueConstant = (this.valueType as ProvablePure<Value>).fromFields(
|
|
156
|
+
this.valueType.toFields(this.value).map((field) => field.toConstant())
|
|
157
|
+
);
|
|
158
|
+
const boolConstant = (bool: Bool) =>
|
|
159
|
+
Bool.fromFields([bool.toField().toConstant()]);
|
|
160
|
+
|
|
161
|
+
return new Option(
|
|
162
|
+
boolConstant(this.isSome),
|
|
163
|
+
valueConstant,
|
|
164
|
+
this.valueType,
|
|
165
|
+
boolConstant(this.isForcedSome)
|
|
166
|
+
);
|
|
167
|
+
}
|
|
152
168
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type RuntimeMethodInvocationType = "INCOMING_MESSAGE" | "SIGNATURE";
|
|
2
|
+
|
|
3
|
+
export type RuntimeMethodIdMapping = Record<
|
|
4
|
+
`${string}.${string}`,
|
|
5
|
+
{ methodId: bigint; type: RuntimeMethodInvocationType }
|
|
6
|
+
>;
|
|
7
|
+
|
|
8
|
+
export interface RuntimeLike {
|
|
9
|
+
get methodIdResolver(): {
|
|
10
|
+
methodIdMap: () => RuntimeMethodIdMapping;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Field, Struct } from "o1js";
|
|
1
|
+
import { Bool, Field, ProvablePure, Struct } from "o1js";
|
|
2
2
|
|
|
3
3
|
import { Option, ProvableOption } from "./Option";
|
|
4
4
|
|
|
@@ -44,7 +44,7 @@ export class StateTransition<Value> {
|
|
|
44
44
|
|
|
45
45
|
public constructor(
|
|
46
46
|
public path: Field,
|
|
47
|
-
public fromValue: Option<
|
|
47
|
+
public fromValue: Option<Value>,
|
|
48
48
|
public toValue: Option<Field> | Option<Value>
|
|
49
49
|
) {}
|
|
50
50
|
|
|
@@ -77,4 +77,12 @@ export class StateTransition<Value> {
|
|
|
77
77
|
to: this.toValue.toJSON(),
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
|
+
|
|
81
|
+
public toConstant(): StateTransition<Value> {
|
|
82
|
+
return new StateTransition<Value>(
|
|
83
|
+
this.path.toConstant(),
|
|
84
|
+
this.fromValue.toConstant(),
|
|
85
|
+
this.toValue.toConstant()
|
|
86
|
+
);
|
|
87
|
+
}
|
|
80
88
|
}
|
|
@@ -1,21 +1,33 @@
|
|
|
1
1
|
import { Field, Poseidon, Struct, UInt64 } from "o1js";
|
|
2
|
+
import { RollupMerkleTree } from "@proto-kit/common";
|
|
2
3
|
|
|
3
4
|
export class CurrentBlock extends Struct({
|
|
4
5
|
height: UInt64,
|
|
5
6
|
}) {}
|
|
6
7
|
|
|
8
|
+
export class PreviousBlock extends Struct({
|
|
9
|
+
rootHash: Field,
|
|
10
|
+
}) {}
|
|
11
|
+
|
|
7
12
|
export class NetworkState extends Struct({
|
|
8
13
|
block: CurrentBlock,
|
|
14
|
+
previous: PreviousBlock,
|
|
9
15
|
}) {
|
|
10
16
|
public hash(): Field {
|
|
11
|
-
return Poseidon.hash(
|
|
17
|
+
return Poseidon.hash([
|
|
18
|
+
...CurrentBlock.toFields(this.block),
|
|
19
|
+
...PreviousBlock.toFields(this.previous),
|
|
20
|
+
]);
|
|
12
21
|
}
|
|
13
22
|
|
|
14
|
-
public static empty(){
|
|
23
|
+
public static empty() {
|
|
15
24
|
return new NetworkState({
|
|
16
25
|
block: {
|
|
17
26
|
height: UInt64.zero,
|
|
18
27
|
},
|
|
19
|
-
|
|
28
|
+
previous: {
|
|
29
|
+
rootHash: Field(RollupMerkleTree.EMPTY_ROOT)
|
|
30
|
+
}
|
|
31
|
+
});
|
|
20
32
|
}
|
|
21
33
|
}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
Bool,
|
|
3
|
+
Field,
|
|
4
|
+
Poseidon,
|
|
5
|
+
Provable,
|
|
6
|
+
PublicKey,
|
|
7
|
+
Struct,
|
|
8
|
+
UInt64,
|
|
9
|
+
} from "o1js";
|
|
10
|
+
import { PublicKeyOption, UInt64Option } from "./ValueOption";
|
|
11
|
+
import { EMPTY_PUBLICKEY, EMPTY_PUBLICKEY_X } from "@proto-kit/common";
|
|
4
12
|
|
|
5
13
|
/**
|
|
6
14
|
* This struct is used to expose transaction information to the runtime method
|
|
@@ -9,30 +17,96 @@ import { ProtocolTransaction } from "./ProtocolTransaction";
|
|
|
9
17
|
*/
|
|
10
18
|
export class RuntimeTransaction extends Struct({
|
|
11
19
|
methodId: Field,
|
|
12
|
-
nonce: UInt64,
|
|
13
|
-
sender: PublicKey,
|
|
14
20
|
argsHash: Field,
|
|
21
|
+
nonce: UInt64Option,
|
|
22
|
+
sender: PublicKeyOption,
|
|
15
23
|
}) {
|
|
16
|
-
public static
|
|
24
|
+
public static fromTransaction(input: {
|
|
25
|
+
methodId: Field;
|
|
26
|
+
argsHash: Field;
|
|
27
|
+
nonce: UInt64;
|
|
28
|
+
sender: PublicKey;
|
|
29
|
+
}) {
|
|
30
|
+
return new RuntimeTransaction({
|
|
31
|
+
methodId: input.methodId,
|
|
32
|
+
argsHash: input.argsHash,
|
|
33
|
+
nonce: UInt64Option.fromValue(input.nonce),
|
|
34
|
+
sender: PublicKeyOption.fromValue(input.sender),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public static fromMessage({
|
|
17
39
|
methodId,
|
|
18
|
-
nonce,
|
|
19
|
-
sender,
|
|
20
40
|
argsHash,
|
|
21
|
-
}:
|
|
41
|
+
}: {
|
|
42
|
+
methodId: Field;
|
|
43
|
+
argsHash: Field;
|
|
44
|
+
}) {
|
|
22
45
|
return new RuntimeTransaction({
|
|
23
46
|
methodId,
|
|
24
|
-
nonce,
|
|
25
|
-
sender,
|
|
26
47
|
argsHash,
|
|
48
|
+
nonce: UInt64Option.none(UInt64.zero),
|
|
49
|
+
sender: PublicKeyOption.none(EMPTY_PUBLICKEY),
|
|
27
50
|
});
|
|
28
51
|
}
|
|
29
52
|
|
|
30
|
-
public
|
|
31
|
-
return
|
|
53
|
+
public static dummyTransaction(): RuntimeTransaction {
|
|
54
|
+
return new RuntimeTransaction({
|
|
55
|
+
methodId: Field(0),
|
|
56
|
+
nonce: new UInt64Option({
|
|
57
|
+
isSome: Bool(true),
|
|
58
|
+
value: UInt64.zero,
|
|
59
|
+
}),
|
|
60
|
+
sender: new PublicKeyOption({
|
|
61
|
+
isSome: Bool(true),
|
|
62
|
+
value: EMPTY_PUBLICKEY,
|
|
63
|
+
}),
|
|
64
|
+
argsHash: Field(0),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public assertTransactionType(isMessage: Bool) {
|
|
69
|
+
const isTransaction = isMessage.not();
|
|
70
|
+
// isSome has to be true when it is a transaction, otherwise false
|
|
71
|
+
this.nonce.isSome
|
|
72
|
+
.equals(isTransaction)
|
|
73
|
+
.assertTrue("Nonce is not right option isSome for type");
|
|
74
|
+
this.sender.isSome
|
|
75
|
+
.equals(isTransaction)
|
|
76
|
+
.assertTrue("Sender is not right option isSome for type");
|
|
77
|
+
this.sender.value.x
|
|
78
|
+
.equals(EMPTY_PUBLICKEY_X)
|
|
79
|
+
.equals(isMessage)
|
|
80
|
+
.assertTrue("Transaction sender is not set to dummy");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public hashData(): Field[] {
|
|
84
|
+
return [
|
|
32
85
|
this.methodId,
|
|
33
|
-
...this.sender.toFields(),
|
|
34
|
-
...this.nonce.toFields(),
|
|
86
|
+
...this.sender.value.toFields(),
|
|
87
|
+
...this.nonce.value.toFields(),
|
|
35
88
|
this.argsHash,
|
|
36
|
-
]
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public static fromHashData(fields: Field[]) {
|
|
93
|
+
// sender is 2nd and the first element is x (2nd isOdd)
|
|
94
|
+
const isMessage = fields[1].equals(EMPTY_PUBLICKEY_X);
|
|
95
|
+
return new RuntimeTransaction({
|
|
96
|
+
methodId: fields[0],
|
|
97
|
+
sender: new PublicKeyOption({
|
|
98
|
+
isSome: isMessage.not(),
|
|
99
|
+
value: PublicKey.fromFields([fields[1], fields[2]]),
|
|
100
|
+
}),
|
|
101
|
+
nonce: new UInt64Option({
|
|
102
|
+
isSome: isMessage.not(),
|
|
103
|
+
value: UInt64.fromFields([fields[3]]),
|
|
104
|
+
}),
|
|
105
|
+
argsHash: fields[4],
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public hash(): Field {
|
|
110
|
+
return Poseidon.hash(this.hashData());
|
|
37
111
|
}
|
|
38
112
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Bool,
|
|
3
|
+
Field,
|
|
4
|
+
Scalar,
|
|
5
|
+
Signature,
|
|
6
|
+
Struct,
|
|
7
|
+
UInt64,
|
|
8
|
+
} from "o1js";
|
|
9
|
+
|
|
10
|
+
import { RuntimeTransaction } from "./RuntimeTransaction";
|
|
11
|
+
|
|
12
|
+
export class SignedTransaction extends Struct({
|
|
13
|
+
transaction: RuntimeTransaction,
|
|
14
|
+
signature: Signature,
|
|
15
|
+
}) {
|
|
16
|
+
public static getSignatureData(args: {
|
|
17
|
+
methodId: Field;
|
|
18
|
+
nonce: UInt64;
|
|
19
|
+
argsHash: Field;
|
|
20
|
+
}): Field[] {
|
|
21
|
+
return [args.methodId, ...args.nonce.value.toFields(), args.argsHash];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public static dummy(): SignedTransaction {
|
|
25
|
+
return new SignedTransaction({
|
|
26
|
+
transaction: RuntimeTransaction.dummyTransaction(),
|
|
27
|
+
|
|
28
|
+
signature: Signature.fromObject({
|
|
29
|
+
s: Scalar.from(0),
|
|
30
|
+
r: Field(0),
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public hash(): Field {
|
|
36
|
+
return this.transaction.hash();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public getSignatureData(): Field[] {
|
|
40
|
+
const { methodId, argsHash, nonce } = this.transaction;
|
|
41
|
+
return SignedTransaction.getSignatureData({
|
|
42
|
+
nonce: nonce.value,
|
|
43
|
+
methodId,
|
|
44
|
+
argsHash,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public validateSignature(): Bool {
|
|
49
|
+
return this.signature.verify(
|
|
50
|
+
this.transaction.sender.value,
|
|
51
|
+
this.getSignatureData()
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Bool, ProvableExtended, PublicKey, Struct, UInt64 } from "o1js";
|
|
2
|
+
|
|
3
|
+
function genericOptionFactory<Type>(valueType: ProvableExtended<Type>) {
|
|
4
|
+
return class Generic extends Struct({
|
|
5
|
+
isSome: Bool,
|
|
6
|
+
value: valueType,
|
|
7
|
+
}) {
|
|
8
|
+
public static fromValue(value: Type) {
|
|
9
|
+
return new Generic({
|
|
10
|
+
isSome: Bool(true),
|
|
11
|
+
value,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public static none(value: Type) {
|
|
16
|
+
return new Generic({
|
|
17
|
+
isSome: Bool(false),
|
|
18
|
+
value,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class UInt64Option extends genericOptionFactory<UInt64>(UInt64) {}
|
|
25
|
+
|
|
26
|
+
export class PublicKeyOption extends genericOptionFactory<PublicKey>(
|
|
27
|
+
PublicKey
|
|
28
|
+
) {}
|
package/src/protocol/Protocol.ts
CHANGED
|
@@ -19,51 +19,54 @@ import { StateService } from "../state/StateService";
|
|
|
19
19
|
|
|
20
20
|
import { ProtocolModule } from "./ProtocolModule";
|
|
21
21
|
import { ProvableTransactionHook } from "./ProvableTransactionHook";
|
|
22
|
-
import { NoopTransactionHook } from "../
|
|
22
|
+
import { NoopTransactionHook } from "../hooks/NoopTransactionHook";
|
|
23
23
|
import { ProtocolEnvironment } from "./ProtocolEnvironment";
|
|
24
|
-
import {
|
|
24
|
+
import { AccountStateHook } from "../hooks/AccountStateHook";
|
|
25
25
|
import { ProvableBlockHook } from "./ProvableBlockHook";
|
|
26
|
-
import { NoopBlockHook } from "../
|
|
27
|
-
import { BlockHeightHook } from "../
|
|
26
|
+
import { NoopBlockHook } from "../hooks/NoopBlockHook";
|
|
27
|
+
import { BlockHeightHook } from "../hooks/BlockHeightHook";
|
|
28
|
+
import { LastStateRootBlockHook } from "../hooks/LastStateRootBlockHook";
|
|
29
|
+
import { ProvableSettlementHook } from "../settlement/modularity/ProvableSettlementHook";
|
|
30
|
+
import { NoopSettlementHook } from "../hooks/NoopSettlementHook";
|
|
28
31
|
|
|
29
|
-
const PROTOCOL_INJECTION_TOKENS = {
|
|
32
|
+
const PROTOCOL_INJECTION_TOKENS: Record<string, string> = {
|
|
30
33
|
ProvableTransactionHook: "ProvableTransactionHook",
|
|
31
34
|
ProvableBlockHook: "ProvableBlockHook",
|
|
35
|
+
ProvableSettlementHook: "ProvableSettlementHook",
|
|
32
36
|
};
|
|
33
37
|
|
|
34
|
-
export type
|
|
38
|
+
export type ProtocolModulesRecord = ModulesRecord<
|
|
35
39
|
TypedClass<ProtocolModule<unknown>>
|
|
36
40
|
>;
|
|
37
41
|
|
|
38
|
-
interface BlockProverType extends ProtocolModule, BlockProvable {}
|
|
42
|
+
export interface BlockProverType extends ProtocolModule, BlockProvable {}
|
|
39
43
|
|
|
40
|
-
interface StateTransitionProverType
|
|
44
|
+
export interface StateTransitionProverType
|
|
41
45
|
extends ProtocolModule,
|
|
42
46
|
StateTransitionProvable {}
|
|
43
47
|
|
|
44
|
-
export
|
|
48
|
+
export type MandatoryProtocolModulesRecord = {
|
|
45
49
|
BlockProver: TypedClass<BlockProverType>;
|
|
46
50
|
StateTransitionProver: TypedClass<StateTransitionProverType>;
|
|
47
|
-
AccountState: TypedClass<
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
extends GenericProtocolModuleRecord,
|
|
52
|
-
ProtocolCustomModulesRecord {}
|
|
51
|
+
AccountState: TypedClass<AccountStateHook>;
|
|
52
|
+
BlockHeight: TypedClass<BlockHeightHook>;
|
|
53
|
+
LastStateRoot: TypedClass<LastStateRootBlockHook>;
|
|
54
|
+
};
|
|
53
55
|
|
|
54
56
|
export interface ProtocolDefinition<Modules extends ProtocolModulesRecord> {
|
|
55
57
|
modules: Modules;
|
|
56
58
|
config?: ModulesConfig<Modules>;
|
|
57
59
|
}
|
|
58
60
|
|
|
59
|
-
export class Protocol<
|
|
61
|
+
export class Protocol<
|
|
62
|
+
Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord
|
|
63
|
+
>
|
|
60
64
|
extends ModuleContainer<Modules>
|
|
61
65
|
implements ProtocolEnvironment
|
|
62
66
|
{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
): TypedClass<Protocol<Modules>> {
|
|
67
|
+
public static from<
|
|
68
|
+
Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord
|
|
69
|
+
>(modules: ProtocolDefinition<Modules>): TypedClass<Protocol<Modules>> {
|
|
67
70
|
return class ScopedProtocol extends Protocol<Modules> {
|
|
68
71
|
public constructor() {
|
|
69
72
|
super(modules);
|
|
@@ -133,61 +136,51 @@ export class Protocol<Modules extends ProtocolModulesRecord>
|
|
|
133
136
|
|
|
134
137
|
// Register the BlockModules seperately since we need to
|
|
135
138
|
// inject them differently later
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
139
|
+
const ABSTRACT_MODULE_TYPES = [
|
|
140
|
+
{ type: ProvableTransactionHook, defaultType: NoopTransactionHook },
|
|
141
|
+
{ type: ProvableBlockHook, defaultType: NoopBlockHook },
|
|
142
|
+
{ type: ProvableSettlementHook, defaultType: NoopSettlementHook },
|
|
143
|
+
] as const;
|
|
144
|
+
|
|
145
|
+
ABSTRACT_MODULE_TYPES.forEach((moduleTypeRegistration) => {
|
|
146
|
+
const abstractType = moduleTypeRegistration.type;
|
|
147
|
+
|
|
148
|
+
const implementingModules = Object.entries(
|
|
149
|
+
this.definition.modules
|
|
150
|
+
).filter(([, value]) =>
|
|
151
|
+
Object.prototype.isPrototypeOf.call(abstractType, value)
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
const newInjectionToken: string | undefined =
|
|
155
|
+
PROTOCOL_INJECTION_TOKENS[abstractType.name];
|
|
156
|
+
|
|
157
|
+
if (newInjectionToken === undefined) {
|
|
158
|
+
log.error(
|
|
159
|
+
"Can't inject hook under the underlying hook token: Alias not found in mapping"
|
|
160
|
+
);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
implementingModules.forEach(([key]) => {
|
|
140
165
|
this.container.register(
|
|
141
|
-
|
|
166
|
+
abstractType.name,
|
|
142
167
|
{ useToken: key },
|
|
143
168
|
{ lifecycle: Lifecycle.ContainerScoped }
|
|
144
169
|
);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
170
|
+
});
|
|
171
|
+
if (implementingModules.length === 0) {
|
|
172
|
+
// This type annotation shouldn't change anything but is necessary
|
|
173
|
+
// bcs tsyringe complains
|
|
174
|
+
const { defaultType }: { defaultType: TypedClass<unknown> } =
|
|
175
|
+
moduleTypeRegistration;
|
|
176
|
+
|
|
177
|
+
// Register default (noop) version
|
|
148
178
|
this.container.register(
|
|
149
|
-
|
|
150
|
-
{
|
|
179
|
+
abstractType.name,
|
|
180
|
+
{ useClass: defaultType },
|
|
151
181
|
{ lifecycle: Lifecycle.ContainerScoped }
|
|
152
182
|
);
|
|
153
|
-
atLeastOneBlockHookRegistered = true;
|
|
154
183
|
}
|
|
155
184
|
});
|
|
156
|
-
|
|
157
|
-
// We need this so that tsyringe doesn't throw when no hooks are registered
|
|
158
|
-
if (!atLeastOneTransactionHookRegistered) {
|
|
159
|
-
this.container.register(
|
|
160
|
-
PROTOCOL_INJECTION_TOKENS.ProvableTransactionHook,
|
|
161
|
-
{ useClass: NoopTransactionHook },
|
|
162
|
-
{ lifecycle: Lifecycle.ContainerScoped }
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
if (!atLeastOneBlockHookRegistered) {
|
|
166
|
-
this.container.register(
|
|
167
|
-
PROTOCOL_INJECTION_TOKENS.ProvableBlockHook,
|
|
168
|
-
{ useClass: NoopBlockHook },
|
|
169
|
-
{ lifecycle: Lifecycle.ContainerScoped }
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
185
|
}
|
|
173
186
|
}
|
|
174
|
-
|
|
175
|
-
export const VanillaProtocol = {
|
|
176
|
-
create() {
|
|
177
|
-
return VanillaProtocol.from({});
|
|
178
|
-
},
|
|
179
|
-
|
|
180
|
-
from<AdditonalModules extends GenericProtocolModuleRecord>(
|
|
181
|
-
additionalModules: AdditonalModules
|
|
182
|
-
): TypedClass<Protocol<ProtocolModulesRecord>> {
|
|
183
|
-
return Protocol.from<ProtocolModulesRecord>({
|
|
184
|
-
modules: {
|
|
185
|
-
StateTransitionProver,
|
|
186
|
-
BlockProver,
|
|
187
|
-
AccountState: AccountStateModule,
|
|
188
|
-
BlockHeight: BlockHeightHook,
|
|
189
|
-
...additionalModules,
|
|
190
|
-
},
|
|
191
|
-
});
|
|
192
|
-
},
|
|
193
|
-
};
|
|
@@ -3,20 +3,17 @@ import { NetworkState } from "../model/network/NetworkState";
|
|
|
3
3
|
|
|
4
4
|
import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
state: BlockProverState;
|
|
8
|
-
networkState: NetworkState;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface AfterBlockParameters {
|
|
12
|
-
state: BlockProverState;
|
|
13
|
-
networkState: NetworkState;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Purpose is to validate transition from -> to network state
|
|
6
|
+
// Purpose is to build transition from -> to network state
|
|
17
7
|
export abstract class ProvableBlockHook<
|
|
18
8
|
Config
|
|
19
9
|
> extends TransitioningProtocolModule<Config> {
|
|
20
|
-
public abstract beforeBlock(
|
|
21
|
-
|
|
10
|
+
public abstract beforeBlock(
|
|
11
|
+
networkState: NetworkState,
|
|
12
|
+
state: BlockProverState
|
|
13
|
+
): NetworkState;
|
|
14
|
+
|
|
15
|
+
public abstract afterBlock(
|
|
16
|
+
networkState: NetworkState,
|
|
17
|
+
state: BlockProverState
|
|
18
|
+
): NetworkState;
|
|
22
19
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { NoConfig } from "@proto-kit/common";
|
|
2
|
+
|
|
1
3
|
import { BlockProverExecutionData } from "../prover/block/BlockProvable";
|
|
2
4
|
|
|
3
5
|
import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
|
|
4
|
-
import { NoConfig } from "@proto-kit/common";
|
|
5
6
|
|
|
6
7
|
export abstract class ProvableTransactionHook<
|
|
7
8
|
Config = NoConfig
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ProtocolModule } from "./ProtocolModule";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* TransitioningProtocolModule is a base interface that allows inheriting
|
|
5
|
+
* classes to use State and StateMap since it requires the implementation
|
|
6
|
+
* of a `name: string` property, which those classes need to function.
|
|
6
7
|
*/
|
|
7
8
|
export abstract class TransitioningProtocolModule<
|
|
8
9
|
Config
|