@proto-kit/protocol 0.1.1-develop.0
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/LICENSE.md +201 -0
- package/README.md +45 -0
- package/dist/Constants.d.ts +4 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +4 -0
- package/dist/Constants.js.map +1 -0
- package/dist/hooks/AccountStateHook.d.ts +52 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -0
- package/dist/hooks/AccountStateHook.js +48 -0
- package/dist/hooks/AccountStateHook.js.map +1 -0
- package/dist/hooks/BlockHeightHook.d.ts +7 -0
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
- package/dist/hooks/BlockHeightHook.js +16 -0
- package/dist/hooks/BlockHeightHook.js.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.js +16 -0
- package/dist/hooks/LastStateRootBlockHook.js.map +1 -0
- package/dist/hooks/NoopBlockHook.d.ts +9 -0
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
- package/dist/hooks/NoopBlockHook.js +10 -0
- package/dist/hooks/NoopBlockHook.js.map +1 -0
- 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/hooks/NoopSettlementHook.js.map +1 -0
- package/dist/hooks/NoopTransactionHook.d.ts +6 -0
- package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
- package/dist/hooks/NoopTransactionHook.js +8 -0
- package/dist/hooks/NoopTransactionHook.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/model/MethodPublicOutput.d.ts +113 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -0
- package/dist/model/MethodPublicOutput.js +15 -0
- package/dist/model/MethodPublicOutput.js.map +1 -0
- package/dist/model/Option.d.ts +122 -0
- package/dist/model/Option.d.ts.map +1 -0
- package/dist/model/Option.js +111 -0
- package/dist/model/Option.js.map +1 -0
- package/dist/model/Path.d.ts +31 -0
- package/dist/model/Path.d.ts.map +1 -0
- package/dist/model/Path.js +43 -0
- package/dist/model/Path.js.map +1 -0
- package/dist/model/RuntimeLike.d.ts +11 -0
- package/dist/model/RuntimeLike.d.ts.map +1 -0
- package/dist/model/RuntimeLike.js +2 -0
- package/dist/model/RuntimeLike.js.map +1 -0
- package/dist/model/StateTransition.d.ts +135 -0
- package/dist/model/StateTransition.d.ts.map +1 -0
- package/dist/model/StateTransition.js +69 -0
- package/dist/model/StateTransition.js.map +1 -0
- package/dist/model/StateTransitionProvableBatch.d.ts +198 -0
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
- package/dist/model/StateTransitionProvableBatch.js +91 -0
- package/dist/model/StateTransitionProvableBatch.js.map +1 -0
- package/dist/model/network/NetworkState.d.ts +160 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -0
- package/dist/model/network/NetworkState.js +32 -0
- package/dist/model/network/NetworkState.js.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts +122 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.js +87 -0
- package/dist/model/transaction/RuntimeTransaction.js.map +1 -0
- package/dist/model/transaction/SignedTransaction.d.ts +107 -0
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
- package/dist/model/transaction/SignedTransaction.js +34 -0
- package/dist/model/transaction/SignedTransaction.js.map +1 -0
- package/dist/model/transaction/ValueOption.d.ts +173 -0
- package/dist/model/transaction/ValueOption.d.ts.map +1 -0
- package/dist/model/transaction/ValueOption.js +25 -0
- package/dist/model/transaction/ValueOption.js.map +1 -0
- package/dist/protocol/Protocol.d.ts +43 -0
- package/dist/protocol/Protocol.d.ts.map +1 -0
- package/dist/protocol/Protocol.js +120 -0
- package/dist/protocol/Protocol.js.map +1 -0
- package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
- package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
- package/dist/protocol/ProtocolEnvironment.js +2 -0
- package/dist/protocol/ProtocolEnvironment.js.map +1 -0
- package/dist/protocol/ProtocolModule.d.ts +9 -0
- package/dist/protocol/ProtocolModule.d.ts.map +1 -0
- package/dist/protocol/ProtocolModule.js +13 -0
- package/dist/protocol/ProtocolModule.js.map +1 -0
- package/dist/protocol/ProvableBlockHook.d.ts +8 -0
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
- package/dist/protocol/ProvableBlockHook.js +5 -0
- package/dist/protocol/ProvableBlockHook.js.map +1 -0
- package/dist/protocol/ProvableTransactionHook.d.ts +7 -0
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
- package/dist/protocol/ProvableTransactionHook.js +4 -0
- package/dist/protocol/ProvableTransactionHook.js.map +1 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
- package/dist/protocol/TransitioningProtocolModule.js +9 -0
- package/dist/protocol/TransitioningProtocolModule.js.map +1 -0
- package/dist/prover/block/BlockProvable.d.ts +409 -0
- package/dist/prover/block/BlockProvable.d.ts.map +1 -0
- package/dist/prover/block/BlockProvable.js +48 -0
- package/dist/prover/block/BlockProvable.js.map +1 -0
- package/dist/prover/block/BlockProver.d.ts +94 -0
- package/dist/prover/block/BlockProver.d.ts.map +1 -0
- package/dist/prover/block/BlockProver.js +510 -0
- package/dist/prover/block/BlockProver.js.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +64 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +17 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js.map +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +21 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js.map +1 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +23 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +172 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.js +16 -0
- package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +48 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.js +187 -0
- package/dist/prover/statetransition/StateTransitionProver.js.map +1 -0
- package/dist/settlement/ContractModule.d.ts +16 -0
- package/dist/settlement/ContractModule.d.ts.map +1 -0
- package/dist/settlement/ContractModule.js +12 -0
- package/dist/settlement/ContractModule.js.map +1 -0
- package/dist/settlement/SettlementContractModule.d.ts +53 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
- package/dist/settlement/SettlementContractModule.js +80 -0
- package/dist/settlement/SettlementContractModule.js.map +1 -0
- package/dist/settlement/contracts/BridgeContract.d.ts +97 -0
- package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContract.js +164 -0
- package/dist/settlement/contracts/BridgeContract.js.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +14 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.js +30 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +21 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +57 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +44 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.js +230 -0
- package/dist/settlement/contracts/DispatchSmartContract.js.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +21 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +82 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +123 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.js +309 -0
- package/dist/settlement/contracts/SettlementSmartContract.js.map +1 -0
- package/dist/settlement/contracts/TokenBridgeTree.d.ts +228 -0
- package/dist/settlement/contracts/TokenBridgeTree.d.ts.map +1 -0
- package/dist/settlement/contracts/TokenBridgeTree.js +60 -0
- package/dist/settlement/contracts/TokenBridgeTree.js.map +1 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts +10 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.js +2 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.js.map +1 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts +85 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js +11 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js.map +1 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts +79 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js +11 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js.map +1 -0
- package/dist/settlement/messages/Deposit.d.ts +77 -0
- package/dist/settlement/messages/Deposit.d.ts.map +1 -0
- package/dist/settlement/messages/Deposit.js +8 -0
- package/dist/settlement/messages/Deposit.js.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +197 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js +33 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
- package/dist/settlement/messages/Withdrawal.d.ts +78 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
- package/dist/settlement/messages/Withdrawal.js +16 -0
- package/dist/settlement/messages/Withdrawal.js.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +26 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js +4 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
- package/dist/settlement/modularity/types.d.ts +8 -0
- package/dist/settlement/modularity/types.d.ts.map +1 -0
- package/dist/settlement/modularity/types.js +2 -0
- package/dist/settlement/modularity/types.js.map +1 -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 +15 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
- package/dist/state/State.d.ts +68 -0
- package/dist/state/State.d.ts.map +1 -0
- package/dist/state/State.js +130 -0
- package/dist/state/State.js.map +1 -0
- package/dist/state/StateMap.d.ts +37 -0
- package/dist/state/StateMap.d.ts.map +1 -0
- package/dist/state/StateMap.js +56 -0
- package/dist/state/StateMap.js.map +1 -0
- package/dist/state/StateService.d.ts +6 -0
- package/dist/state/StateService.d.ts.map +1 -0
- package/dist/state/StateService.js +2 -0
- package/dist/state/StateService.js.map +1 -0
- package/dist/state/StateServiceProvider.d.ts +8 -0
- package/dist/state/StateServiceProvider.d.ts.map +1 -0
- package/dist/state/StateServiceProvider.js +37 -0
- package/dist/state/StateServiceProvider.js.map +1 -0
- package/dist/state/assert/assert.d.ts +12 -0
- package/dist/state/assert/assert.d.ts.map +1 -0
- package/dist/state/assert/assert.js +31 -0
- package/dist/state/assert/assert.js.map +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js +136 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.js +6 -0
- package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
- package/dist/state/protocol/ProtocolState.d.ts +7 -0
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
- package/dist/state/protocol/ProtocolState.js +40 -0
- package/dist/state/protocol/ProtocolState.js.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +53 -0
- package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/PrefixedProvableHashList.js +13 -0
- package/dist/utils/PrefixedProvableHashList.js.map +1 -0
- package/dist/utils/ProvableHashList.d.ts +27 -0
- package/dist/utils/ProvableHashList.d.ts.map +1 -0
- package/dist/utils/ProvableHashList.js +44 -0
- package/dist/utils/ProvableHashList.js.map +1 -0
- package/dist/utils/ProvableReductionHashList.d.ts +14 -0
- package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +51 -0
- package/dist/utils/ProvableReductionHashList.js.map +1 -0
- package/dist/utils/StateTransitionReductionList.d.ts +11 -0
- package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
- package/dist/utils/StateTransitionReductionList.js +61 -0
- package/dist/utils/StateTransitionReductionList.js.map +1 -0
- package/dist/utils/utils.d.ts +11 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +45 -0
- package/dist/utils/utils.js.map +1 -0
- package/jest.config.cjs +12 -0
- package/package.json +36 -0
- package/src/Constants.ts +3 -0
- package/src/hooks/AccountStateHook.ts +48 -0
- package/src/hooks/BlockHeightHook.ts +17 -0
- package/src/hooks/LastStateRootBlockHook.ts +26 -0
- package/src/hooks/NoopBlockHook.ts +21 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/NoopTransactionHook.ts +10 -0
- package/src/index.ts +57 -0
- package/src/model/MethodPublicOutput.ts +14 -0
- package/src/model/Option.ts +172 -0
- package/src/model/Path.ts +50 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +88 -0
- package/src/model/StateTransitionProvableBatch.ts +145 -0
- package/src/model/Transaction.ts +31 -0
- package/src/model/network/NetworkState.ts +33 -0
- package/src/model/transaction/RuntimeTransaction.ts +105 -0
- package/src/model/transaction/SignedTransaction.ts +47 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +226 -0
- package/src/protocol/ProtocolEnvironment.ts +10 -0
- package/src/protocol/ProtocolModule.ts +27 -0
- package/src/protocol/ProvableBlockHook.ts +19 -0
- package/src/protocol/ProvableTransactionHook.ts +13 -0
- package/src/protocol/TransitioningProtocolModule.ts +12 -0
- package/src/prover/block/BlockProvable.ts +99 -0
- package/src/prover/block/BlockProver.ts +990 -0
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
- package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
- package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
- package/src/prover/statetransition/StateTransitionProvable.ts +41 -0
- package/src/prover/statetransition/StateTransitionProver.ts +377 -0
- package/src/settlement/ContractModule.ts +31 -0
- package/src/settlement/SettlementContractModule.ts +145 -0
- package/src/settlement/contracts/BridgeContract.ts +237 -0
- package/src/settlement/contracts/BridgeContractProtocolModule.ts +43 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +73 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +326 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +108 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +498 -0
- package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
- package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
- package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
- package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
- package/src/settlement/messages/Deposit.ts +7 -0
- package/src/settlement/messages/OutgoingMessageArgument.ts +42 -0
- package/src/settlement/messages/Withdrawal.ts +16 -0
- package/src/settlement/modularity/ProvableSettlementHook.ts +36 -0
- package/src/settlement/modularity/types.ts +22 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
- package/src/state/State.ts +175 -0
- package/src/state/StateMap.ts +73 -0
- package/src/state/StateService.ts +6 -0
- package/src/state/StateServiceProvider.ts +37 -0
- package/src/state/assert/assert.ts +35 -0
- package/src/state/context/RuntimeMethodExecutionContext.ts +174 -0
- package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
- package/src/state/protocol/ProtocolState.ts +61 -0
- package/src/utils/MinaPrefixedProvableHashList.ts +73 -0
- package/src/utils/PrefixedProvableHashList.ts +21 -0
- package/src/utils/ProvableHashList.ts +50 -0
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +89 -0
- package/src/utils/utils.ts +75 -0
- package/test/BlockProver.test.ts +212 -0
- package/test/Protocol.test.ts +37 -0
- package/test/State.test.ts +45 -0
- package/test/StateTransition.test.ts +174 -0
- package/test/TestingProtocol.ts +52 -0
- package/test/compiling/types.ts +28 -0
- package/test/model/Option.test.ts +72 -0
- package/test/modularity/types.ts +35 -0
- package/test/state/assert/assert.test.ts +56 -0
- package/test/tsconfig.json +7 -0
- package/test/utils/ProvableReductionHashList.test.ts +117 -0
- package/test/utils.test.ts +27 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { Bool, Field, Poseidon, PublicKey, Struct, UInt64 } from "o1js";
|
|
2
|
+
import { EMPTY_PUBLICKEY, EMPTY_PUBLICKEY_X } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { PublicKeyOption, UInt64Option } from "./ValueOption";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This struct is used to expose transaction information to the runtime method
|
|
8
|
+
* execution. This class has not all data included in transactions on purpose.
|
|
9
|
+
* For example, we don't want to expose the signature or args as fields.
|
|
10
|
+
*/
|
|
11
|
+
export class RuntimeTransaction extends Struct({
|
|
12
|
+
methodId: Field,
|
|
13
|
+
argsHash: Field,
|
|
14
|
+
nonce: UInt64Option,
|
|
15
|
+
sender: PublicKeyOption,
|
|
16
|
+
}) {
|
|
17
|
+
public static fromTransaction(input: {
|
|
18
|
+
methodId: Field;
|
|
19
|
+
argsHash: Field;
|
|
20
|
+
nonce: UInt64;
|
|
21
|
+
sender: PublicKey;
|
|
22
|
+
}) {
|
|
23
|
+
return new RuntimeTransaction({
|
|
24
|
+
methodId: input.methodId,
|
|
25
|
+
argsHash: input.argsHash,
|
|
26
|
+
nonce: UInt64Option.fromSome(input.nonce),
|
|
27
|
+
sender: PublicKeyOption.fromSome(input.sender),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public static fromMessage({
|
|
32
|
+
methodId,
|
|
33
|
+
argsHash,
|
|
34
|
+
}: {
|
|
35
|
+
methodId: Field;
|
|
36
|
+
argsHash: Field;
|
|
37
|
+
}) {
|
|
38
|
+
return new RuntimeTransaction({
|
|
39
|
+
methodId,
|
|
40
|
+
argsHash,
|
|
41
|
+
nonce: UInt64Option.none(UInt64.zero),
|
|
42
|
+
sender: PublicKeyOption.none(EMPTY_PUBLICKEY),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public static dummyTransaction(): RuntimeTransaction {
|
|
47
|
+
return new RuntimeTransaction({
|
|
48
|
+
methodId: Field(0),
|
|
49
|
+
nonce: new UInt64Option({
|
|
50
|
+
isSome: Bool(true),
|
|
51
|
+
value: UInt64.zero,
|
|
52
|
+
}),
|
|
53
|
+
sender: new PublicKeyOption({
|
|
54
|
+
isSome: Bool(true),
|
|
55
|
+
value: EMPTY_PUBLICKEY,
|
|
56
|
+
}),
|
|
57
|
+
argsHash: Field(0),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public assertTransactionType(isMessage: Bool) {
|
|
62
|
+
const isTransaction = isMessage.not();
|
|
63
|
+
// isSome has to be true when it is a transaction, otherwise false
|
|
64
|
+
this.nonce.isSome
|
|
65
|
+
.equals(isTransaction)
|
|
66
|
+
.assertTrue("Nonce is not right option isSome for type");
|
|
67
|
+
this.sender.isSome
|
|
68
|
+
.equals(isTransaction)
|
|
69
|
+
.assertTrue("Sender is not right option isSome for type");
|
|
70
|
+
this.sender.value.x
|
|
71
|
+
.equals(EMPTY_PUBLICKEY_X)
|
|
72
|
+
.equals(isMessage)
|
|
73
|
+
.assertTrue("Transaction sender is not set to dummy");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public hashData(): Field[] {
|
|
77
|
+
return [
|
|
78
|
+
this.methodId,
|
|
79
|
+
...this.sender.value.toFields(),
|
|
80
|
+
...this.nonce.value.toFields(),
|
|
81
|
+
this.argsHash,
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public static fromHashData(fields: Field[]) {
|
|
86
|
+
// sender is 2nd and the first element is x (2nd isOdd)
|
|
87
|
+
const isMessage = fields[1].equals(EMPTY_PUBLICKEY_X);
|
|
88
|
+
return new RuntimeTransaction({
|
|
89
|
+
methodId: fields[0],
|
|
90
|
+
sender: new PublicKeyOption({
|
|
91
|
+
isSome: isMessage.not(),
|
|
92
|
+
value: PublicKey.fromFields([fields[1], fields[2]]),
|
|
93
|
+
}),
|
|
94
|
+
nonce: new UInt64Option({
|
|
95
|
+
isSome: isMessage.not(),
|
|
96
|
+
value: UInt64.fromFields([fields[3]]),
|
|
97
|
+
}),
|
|
98
|
+
argsHash: fields[4],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public hash(): Field {
|
|
103
|
+
return Poseidon.hash(this.hashData());
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Bool, Field, Scalar, Signature, Struct, UInt64 } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { RuntimeTransaction } from "./RuntimeTransaction";
|
|
4
|
+
|
|
5
|
+
export class SignedTransaction extends Struct({
|
|
6
|
+
transaction: RuntimeTransaction,
|
|
7
|
+
signature: Signature,
|
|
8
|
+
}) {
|
|
9
|
+
public static getSignatureData(args: {
|
|
10
|
+
methodId: Field;
|
|
11
|
+
nonce: UInt64;
|
|
12
|
+
argsHash: Field;
|
|
13
|
+
}): Field[] {
|
|
14
|
+
return [args.methodId, ...args.nonce.value.toFields(), args.argsHash];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public static dummy(): SignedTransaction {
|
|
18
|
+
return new SignedTransaction({
|
|
19
|
+
transaction: RuntimeTransaction.dummyTransaction(),
|
|
20
|
+
|
|
21
|
+
signature: Signature.fromObject({
|
|
22
|
+
s: Scalar.from(0),
|
|
23
|
+
r: Field(0),
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public hash(): Field {
|
|
29
|
+
return this.transaction.hash();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public getSignatureData(): Field[] {
|
|
33
|
+
const { methodId, argsHash, nonce } = this.transaction;
|
|
34
|
+
return SignedTransaction.getSignatureData({
|
|
35
|
+
nonce: nonce.value,
|
|
36
|
+
methodId,
|
|
37
|
+
argsHash,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public validateSignature(): Bool {
|
|
42
|
+
return this.signature.verify(
|
|
43
|
+
this.transaction.sender.value,
|
|
44
|
+
this.getSignatureData()
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -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 fromSome(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
|
+
) {}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AreProofsEnabled,
|
|
3
|
+
ChildContainerProvider,
|
|
4
|
+
log,
|
|
5
|
+
ModuleContainer,
|
|
6
|
+
ModulesConfig,
|
|
7
|
+
ModulesRecord,
|
|
8
|
+
StringKeyOf,
|
|
9
|
+
TypedClass,
|
|
10
|
+
} from "@proto-kit/common";
|
|
11
|
+
import { DependencyContainer, Lifecycle } from "tsyringe";
|
|
12
|
+
|
|
13
|
+
import { BlockProvable } from "../prover/block/BlockProvable";
|
|
14
|
+
import { StateTransitionProvable } from "../prover/statetransition/StateTransitionProvable";
|
|
15
|
+
import { StateServiceProvider } from "../state/StateServiceProvider";
|
|
16
|
+
import { SimpleAsyncStateService } from "../state/StateService";
|
|
17
|
+
import { NoopBlockHook } from "../hooks/NoopBlockHook";
|
|
18
|
+
import { BlockHeightHook } from "../hooks/BlockHeightHook";
|
|
19
|
+
import { LastStateRootBlockHook } from "../hooks/LastStateRootBlockHook";
|
|
20
|
+
import { ProvableSettlementHook } from "../settlement/modularity/ProvableSettlementHook";
|
|
21
|
+
import { NoopSettlementHook } from "../hooks/NoopSettlementHook";
|
|
22
|
+
import { AccountStateHook } from "../hooks/AccountStateHook";
|
|
23
|
+
import { NoopTransactionHook } from "../hooks/NoopTransactionHook";
|
|
24
|
+
|
|
25
|
+
import { ProtocolModule } from "./ProtocolModule";
|
|
26
|
+
import { ProvableTransactionHook } from "./ProvableTransactionHook";
|
|
27
|
+
import { ProtocolEnvironment } from "./ProtocolEnvironment";
|
|
28
|
+
import { ProvableBlockHook } from "./ProvableBlockHook";
|
|
29
|
+
import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* This is a mapping of abstract classes to their respective injection tokens.
|
|
33
|
+
* Keys are the abstract classes names, which need to be set dynamically
|
|
34
|
+
* and can't be hardcoded since producing optimized builds may mangle the
|
|
35
|
+
* class names, making them different from the ones in the source code.
|
|
36
|
+
*/
|
|
37
|
+
const PROTOCOL_INJECTION_TOKENS: Record<string, string> = {
|
|
38
|
+
[ProvableTransactionHook.name]: "ProvableTransactionHook",
|
|
39
|
+
[ProvableBlockHook.name]: "ProvableBlockHook",
|
|
40
|
+
[ProvableSettlementHook.name]: "ProvableSettlementHook",
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export type ProtocolModulesRecord = ModulesRecord<
|
|
44
|
+
TypedClass<ProtocolModule<unknown>>
|
|
45
|
+
>;
|
|
46
|
+
|
|
47
|
+
export interface BlockProverType extends ProtocolModule, BlockProvable {}
|
|
48
|
+
|
|
49
|
+
export interface StateTransitionProverType
|
|
50
|
+
extends ProtocolModule,
|
|
51
|
+
StateTransitionProvable {}
|
|
52
|
+
|
|
53
|
+
export type MandatoryProtocolModulesRecord = {
|
|
54
|
+
BlockProver: TypedClass<BlockProverType>;
|
|
55
|
+
StateTransitionProver: TypedClass<StateTransitionProverType>;
|
|
56
|
+
AccountState: TypedClass<AccountStateHook>;
|
|
57
|
+
BlockHeight: TypedClass<BlockHeightHook>;
|
|
58
|
+
LastStateRoot: TypedClass<LastStateRootBlockHook>;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export interface ProtocolDefinition<Modules extends ProtocolModulesRecord> {
|
|
62
|
+
modules: Modules;
|
|
63
|
+
config?: ModulesConfig<Modules>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export class Protocol<
|
|
67
|
+
Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord,
|
|
68
|
+
>
|
|
69
|
+
extends ModuleContainer<Modules>
|
|
70
|
+
implements ProtocolEnvironment
|
|
71
|
+
{
|
|
72
|
+
public static from<
|
|
73
|
+
Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord,
|
|
74
|
+
>(modules: ProtocolDefinition<Modules>): TypedClass<Protocol<Modules>> {
|
|
75
|
+
return class ScopedProtocol extends Protocol<Modules> {
|
|
76
|
+
public constructor() {
|
|
77
|
+
super(modules);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public definition: ProtocolDefinition<Modules>;
|
|
83
|
+
|
|
84
|
+
public constructor(definition: ProtocolDefinition<Modules>) {
|
|
85
|
+
super(definition);
|
|
86
|
+
this.definition = definition;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public get stateService(): SimpleAsyncStateService {
|
|
90
|
+
return this.stateServiceProvider.stateService;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public get stateServiceProvider(): StateServiceProvider {
|
|
94
|
+
return this.container.resolve<StateServiceProvider>("StateServiceProvider");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public decorateModule(
|
|
98
|
+
moduleName: StringKeyOf<Modules>,
|
|
99
|
+
containedModule: InstanceType<Modules[StringKeyOf<Modules>]>
|
|
100
|
+
) {
|
|
101
|
+
log.debug(`Decorated ${moduleName}`);
|
|
102
|
+
containedModule.protocol = this;
|
|
103
|
+
|
|
104
|
+
if (containedModule instanceof TransitioningProtocolModule) {
|
|
105
|
+
containedModule.name = moduleName;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
super.decorateModule(moduleName, containedModule);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public get dependencyContainer(): DependencyContainer {
|
|
112
|
+
return this.container;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private isModule(
|
|
116
|
+
moduleName: keyof Modules
|
|
117
|
+
): moduleName is StringKeyOf<Modules> {
|
|
118
|
+
return this.definition.modules[moduleName] !== undefined;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public get blockProver(): BlockProvable {
|
|
122
|
+
// Why do I resolve directly here?
|
|
123
|
+
// I don't know exactly but generics don't let me use .resolve()
|
|
124
|
+
return this.container.resolve<InstanceType<Modules["BlockProver"]>>(
|
|
125
|
+
"BlockProver"
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public get stateTransitionProver(): StateTransitionProvable {
|
|
130
|
+
return this.container.resolve<
|
|
131
|
+
InstanceType<Modules["StateTransitionProver"]>
|
|
132
|
+
>("StateTransitionProver");
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public getAreProofsEnabled(): AreProofsEnabled {
|
|
136
|
+
return this.container.resolve<AreProofsEnabled>("AreProofsEnabled");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public create(childContainerProvider: ChildContainerProvider) {
|
|
140
|
+
super.create(childContainerProvider);
|
|
141
|
+
|
|
142
|
+
// Register the BlockModules seperately since we need to
|
|
143
|
+
// inject them differently later
|
|
144
|
+
const ABSTRACT_MODULE_TYPES = [
|
|
145
|
+
{ type: ProvableTransactionHook, defaultType: NoopTransactionHook },
|
|
146
|
+
{ type: ProvableBlockHook, defaultType: NoopBlockHook },
|
|
147
|
+
{ type: ProvableSettlementHook, defaultType: NoopSettlementHook },
|
|
148
|
+
] as const;
|
|
149
|
+
|
|
150
|
+
ABSTRACT_MODULE_TYPES.forEach((moduleTypeRegistration) => {
|
|
151
|
+
const abstractType = moduleTypeRegistration.type;
|
|
152
|
+
|
|
153
|
+
const implementingModules = Object.entries(
|
|
154
|
+
this.definition.modules
|
|
155
|
+
).filter(([, value]) =>
|
|
156
|
+
Object.prototype.isPrototypeOf.call(abstractType, value)
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const newInjectionToken: string | undefined =
|
|
160
|
+
PROTOCOL_INJECTION_TOKENS[abstractType.name];
|
|
161
|
+
|
|
162
|
+
if (newInjectionToken === undefined) {
|
|
163
|
+
log.error(
|
|
164
|
+
"Can't inject hook under the underlying hook token: Alias not found in mapping"
|
|
165
|
+
);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
implementingModules.forEach(([key]) => {
|
|
170
|
+
this.container.register(
|
|
171
|
+
newInjectionToken,
|
|
172
|
+
{ useToken: key },
|
|
173
|
+
{ lifecycle: Lifecycle.ContainerScoped }
|
|
174
|
+
);
|
|
175
|
+
});
|
|
176
|
+
if (implementingModules.length === 0) {
|
|
177
|
+
// This type annotation shouldn't change anything but is necessary
|
|
178
|
+
// bcs tsyringe complains
|
|
179
|
+
const { defaultType }: { defaultType: TypedClass<unknown> } =
|
|
180
|
+
moduleTypeRegistration;
|
|
181
|
+
|
|
182
|
+
// Register default (noop) version
|
|
183
|
+
this.container.register(
|
|
184
|
+
newInjectionToken,
|
|
185
|
+
{ useClass: defaultType },
|
|
186
|
+
{ lifecycle: Lifecycle.ContainerScoped }
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// Cross-register all runtime modules to the protocol container for easier
|
|
192
|
+
// access of runtime modules inside protocol hooks
|
|
193
|
+
if (this.container.isRegistered("Runtime", true)) {
|
|
194
|
+
const runtimeContainer: ModuleContainer<any> =
|
|
195
|
+
this.container.resolve("Runtime");
|
|
196
|
+
|
|
197
|
+
runtimeContainer.moduleNames.forEach((runtimeModuleName) => {
|
|
198
|
+
this.container.register(runtimeModuleName, {
|
|
199
|
+
useFactory: (dependencyContainer) => {
|
|
200
|
+
// Prevents creation of closure
|
|
201
|
+
const runtime: ModuleContainer<any> =
|
|
202
|
+
dependencyContainer.resolve("Runtime");
|
|
203
|
+
return runtime.resolve(runtimeModuleName);
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
} else {
|
|
208
|
+
log.warn(
|
|
209
|
+
"Couldn't resolve Runtime reference in Protocol, resolving RuntimeModules in hooks won't be available"
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public async start() {
|
|
215
|
+
// eslint-disable-next-line guard-for-in
|
|
216
|
+
for (const moduleName in this.definition.modules) {
|
|
217
|
+
const protocolModule = this.resolve(moduleName);
|
|
218
|
+
|
|
219
|
+
log.info(
|
|
220
|
+
`Starting protocol module ${moduleName} (${protocolModule.constructor.name})`
|
|
221
|
+
);
|
|
222
|
+
// eslint-disable-next-line no-await-in-loop
|
|
223
|
+
await protocolModule.start();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AreProofsEnabled } from "@proto-kit/common";
|
|
2
|
+
|
|
3
|
+
import { SimpleAsyncStateService } from "../state/StateService";
|
|
4
|
+
import { StateServiceProvider } from "../state/StateServiceProvider";
|
|
5
|
+
|
|
6
|
+
export interface ProtocolEnvironment {
|
|
7
|
+
get stateService(): SimpleAsyncStateService;
|
|
8
|
+
get stateServiceProvider(): StateServiceProvider;
|
|
9
|
+
getAreProofsEnabled(): AreProofsEnabled;
|
|
10
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AreProofsEnabled,
|
|
3
|
+
ChildContainerProvider,
|
|
4
|
+
ConfigurableModule,
|
|
5
|
+
NoConfig,
|
|
6
|
+
noop,
|
|
7
|
+
} from "@proto-kit/common";
|
|
8
|
+
|
|
9
|
+
import { ProtocolEnvironment } from "./ProtocolEnvironment";
|
|
10
|
+
|
|
11
|
+
export abstract class ProtocolModule<
|
|
12
|
+
Config = NoConfig,
|
|
13
|
+
> extends ConfigurableModule<Config> {
|
|
14
|
+
public protocol?: ProtocolEnvironment;
|
|
15
|
+
|
|
16
|
+
public get areProofsEnabled(): AreProofsEnabled | undefined {
|
|
17
|
+
return this.protocol?.getAreProofsEnabled();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public create(childContainerProvider: ChildContainerProvider): void {
|
|
21
|
+
noop();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public async start() {
|
|
25
|
+
noop();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BlockProverState } from "../prover/block/BlockProver";
|
|
2
|
+
import { NetworkState } from "../model/network/NetworkState";
|
|
3
|
+
|
|
4
|
+
import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
|
|
5
|
+
|
|
6
|
+
// Purpose is to build transition from -> to network state
|
|
7
|
+
export abstract class ProvableBlockHook<
|
|
8
|
+
Config,
|
|
9
|
+
> extends TransitioningProtocolModule<Config> {
|
|
10
|
+
public abstract beforeBlock(
|
|
11
|
+
networkState: NetworkState,
|
|
12
|
+
state: BlockProverState
|
|
13
|
+
): Promise<NetworkState>;
|
|
14
|
+
|
|
15
|
+
public abstract afterBlock(
|
|
16
|
+
networkState: NetworkState,
|
|
17
|
+
state: BlockProverState
|
|
18
|
+
): Promise<NetworkState>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { NoConfig } from "@proto-kit/common";
|
|
2
|
+
|
|
3
|
+
import { BlockProverExecutionData } from "../prover/block/BlockProvable";
|
|
4
|
+
|
|
5
|
+
import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
|
|
6
|
+
|
|
7
|
+
export abstract class ProvableTransactionHook<
|
|
8
|
+
Config = NoConfig,
|
|
9
|
+
> extends TransitioningProtocolModule<Config> {
|
|
10
|
+
public abstract onTransaction(
|
|
11
|
+
executionData: BlockProverExecutionData
|
|
12
|
+
): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ProtocolModule } from "./ProtocolModule";
|
|
2
|
+
|
|
3
|
+
/**
|
|
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.
|
|
7
|
+
*/
|
|
8
|
+
export abstract class TransitioningProtocolModule<
|
|
9
|
+
Config,
|
|
10
|
+
> extends ProtocolModule<Config> {
|
|
11
|
+
public name?: string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Bool,
|
|
3
|
+
DynamicProof,
|
|
4
|
+
Field,
|
|
5
|
+
Proof,
|
|
6
|
+
Signature,
|
|
7
|
+
Struct,
|
|
8
|
+
Void,
|
|
9
|
+
} from "o1js";
|
|
10
|
+
import { WithZkProgrammable, CompilableModule } from "@proto-kit/common";
|
|
11
|
+
|
|
12
|
+
import { StateTransitionProof } from "../statetransition/StateTransitionProvable";
|
|
13
|
+
import { MethodPublicOutput } from "../../model/MethodPublicOutput";
|
|
14
|
+
import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
|
|
15
|
+
import { NetworkState } from "../../model/network/NetworkState";
|
|
16
|
+
|
|
17
|
+
import { BlockHashMerkleTreeWitness } from "./accummulators/BlockHashMerkleTree";
|
|
18
|
+
import { RuntimeVerificationKeyAttestation } from "./accummulators/RuntimeVerificationKeyTree";
|
|
19
|
+
|
|
20
|
+
export class BlockProverPublicInput extends Struct({
|
|
21
|
+
transactionsHash: Field,
|
|
22
|
+
stateRoot: Field,
|
|
23
|
+
networkStateHash: Field,
|
|
24
|
+
blockHashRoot: Field,
|
|
25
|
+
eternalTransactionsHash: Field,
|
|
26
|
+
incomingMessagesHash: Field,
|
|
27
|
+
blockNumber: Field,
|
|
28
|
+
}) {}
|
|
29
|
+
|
|
30
|
+
export class BlockProverPublicOutput extends Struct({
|
|
31
|
+
transactionsHash: Field,
|
|
32
|
+
stateRoot: Field,
|
|
33
|
+
networkStateHash: Field,
|
|
34
|
+
blockHashRoot: Field,
|
|
35
|
+
eternalTransactionsHash: Field,
|
|
36
|
+
incomingMessagesHash: Field,
|
|
37
|
+
closed: Bool,
|
|
38
|
+
blockNumber: Field,
|
|
39
|
+
}) {
|
|
40
|
+
public equals(input: BlockProverPublicInput, closed: Bool): Bool {
|
|
41
|
+
const output2 = BlockProverPublicOutput.toFields({
|
|
42
|
+
...input,
|
|
43
|
+
closed,
|
|
44
|
+
});
|
|
45
|
+
const output1 = BlockProverPublicOutput.toFields(this);
|
|
46
|
+
return output1
|
|
47
|
+
.map((value1, index) => value1.equals(output2[index]))
|
|
48
|
+
.reduce((a, b) => a.and(b));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type BlockProverProof = Proof<
|
|
53
|
+
BlockProverPublicInput,
|
|
54
|
+
BlockProverPublicOutput
|
|
55
|
+
>;
|
|
56
|
+
|
|
57
|
+
export class BlockProverExecutionData extends Struct({
|
|
58
|
+
transaction: RuntimeTransaction,
|
|
59
|
+
signature: Signature,
|
|
60
|
+
networkState: NetworkState,
|
|
61
|
+
}) {}
|
|
62
|
+
|
|
63
|
+
export class DynamicRuntimeProof extends DynamicProof<
|
|
64
|
+
Void,
|
|
65
|
+
MethodPublicOutput
|
|
66
|
+
> {
|
|
67
|
+
static publicInputType = Void;
|
|
68
|
+
|
|
69
|
+
static publicOutputType = MethodPublicOutput;
|
|
70
|
+
|
|
71
|
+
// TODO this won't be 0 for proofs-as-args
|
|
72
|
+
static maxProofsVerified = 0 as const;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface BlockProvable
|
|
76
|
+
extends WithZkProgrammable<BlockProverPublicInput, BlockProverPublicOutput>,
|
|
77
|
+
CompilableModule {
|
|
78
|
+
proveTransaction: (
|
|
79
|
+
publicInput: BlockProverPublicInput,
|
|
80
|
+
stateProof: StateTransitionProof,
|
|
81
|
+
appProof: DynamicRuntimeProof,
|
|
82
|
+
executionData: BlockProverExecutionData,
|
|
83
|
+
verificationKeyAttestation: RuntimeVerificationKeyAttestation
|
|
84
|
+
) => Promise<BlockProverPublicOutput>;
|
|
85
|
+
|
|
86
|
+
proveBlock: (
|
|
87
|
+
publicInput: BlockProverPublicInput,
|
|
88
|
+
networkState: NetworkState,
|
|
89
|
+
blockWitness: BlockHashMerkleTreeWitness,
|
|
90
|
+
// stateTransitionProof: StateTransitionProof,
|
|
91
|
+
transactionProof: BlockProverProof
|
|
92
|
+
) => Promise<BlockProverPublicOutput>;
|
|
93
|
+
|
|
94
|
+
merge: (
|
|
95
|
+
publicInput: BlockProverPublicInput,
|
|
96
|
+
proof1: BlockProverProof,
|
|
97
|
+
proof2: BlockProverProof
|
|
98
|
+
) => Promise<BlockProverPublicOutput>;
|
|
99
|
+
}
|