@proto-kit/protocol 0.1.1-develop.457 → 0.1.1-develop.600

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.
Files changed (98) hide show
  1. package/dist/blockmodules/AccountStateModule.d.ts.map +1 -1
  2. package/dist/blockmodules/AccountStateModule.js +10 -3
  3. package/dist/blockmodules/BlockHeightHook.d.ts +3 -3
  4. package/dist/blockmodules/BlockHeightHook.d.ts.map +1 -1
  5. package/dist/blockmodules/BlockHeightHook.js +5 -4
  6. package/dist/blockmodules/LastStateRootBlockHook.d.ts +8 -0
  7. package/dist/blockmodules/LastStateRootBlockHook.d.ts.map +1 -0
  8. package/dist/blockmodules/LastStateRootBlockHook.js +15 -0
  9. package/dist/blockmodules/NoopBlockHook.d.ts +6 -4
  10. package/dist/blockmodules/NoopBlockHook.d.ts.map +1 -1
  11. package/dist/blockmodules/NoopBlockHook.js +4 -4
  12. package/dist/blockmodules/NoopSettlementHook.d.ts +6 -0
  13. package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -0
  14. package/dist/blockmodules/NoopSettlementHook.js +18 -0
  15. package/dist/hooks/AccountStateHook.d.ts.map +1 -1
  16. package/dist/hooks/AccountStateHook.js +7 -2
  17. package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
  18. package/dist/index.d.ts +9 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +9 -3
  21. package/dist/model/MethodPublicOutput.d.ts +8 -0
  22. package/dist/model/MethodPublicOutput.d.ts.map +1 -1
  23. package/dist/model/MethodPublicOutput.js +1 -0
  24. package/dist/model/network/NetworkState.d.ts +40 -0
  25. package/dist/model/network/NetworkState.d.ts.map +1 -1
  26. package/dist/model/network/NetworkState.js +14 -2
  27. package/dist/model/transaction/RuntimeTransaction.d.ts +45 -20
  28. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
  29. package/dist/model/transaction/RuntimeTransaction.js +68 -11
  30. package/dist/model/transaction/SignedTransaction.d.ts +71 -0
  31. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
  32. package/dist/model/transaction/SignedTransaction.js +33 -0
  33. package/dist/model/transaction/ValueOption.d.ts +119 -0
  34. package/dist/model/transaction/ValueOption.d.ts.map +1 -0
  35. package/dist/model/transaction/ValueOption.js +24 -0
  36. package/dist/protocol/Protocol.d.ts +7 -3
  37. package/dist/protocol/Protocol.d.ts.map +1 -1
  38. package/dist/protocol/Protocol.js +26 -16
  39. package/dist/protocol/ProvableBlockHook.d.ts +2 -10
  40. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
  41. package/dist/protocol/ProvableBlockHook.js +1 -1
  42. package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
  43. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
  44. package/dist/protocol/TransitioningProtocolModule.d.ts +3 -2
  45. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -1
  46. package/dist/protocol/TransitioningProtocolModule.js +3 -2
  47. package/dist/prover/block/BlockProvable.d.ts +106 -28
  48. package/dist/prover/block/BlockProvable.d.ts.map +1 -1
  49. package/dist/prover/block/BlockProvable.js +23 -5
  50. package/dist/prover/block/BlockProver.d.ts +29 -8
  51. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  52. package/dist/prover/block/BlockProver.js +241 -77
  53. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +45 -0
  54. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
  55. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
  56. package/dist/settlement/ProvableSettlementHook.d.ts +26 -0
  57. package/dist/settlement/ProvableSettlementHook.d.ts.map +1 -0
  58. package/dist/settlement/ProvableSettlementHook.js +3 -0
  59. package/dist/settlement/SettlementContract.d.ts +230 -0
  60. package/dist/settlement/SettlementContract.d.ts.map +1 -0
  61. package/dist/settlement/SettlementContract.js +346 -0
  62. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  63. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  64. package/dist/settlement/modules/NetworkStateSettlementModule.js +12 -0
  65. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +75 -1
  66. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
  67. package/dist/state/context/RuntimeMethodExecutionContext.js +19 -1
  68. package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
  69. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  70. package/dist/utils/MinaPrefixedProvableHashList.js +51 -0
  71. package/package.json +2 -2
  72. package/src/blockmodules/AccountStateModule.ts +17 -6
  73. package/src/blockmodules/BlockHeightHook.ts +5 -8
  74. package/src/blockmodules/LastStateRootBlockHook.ts +26 -0
  75. package/src/blockmodules/NoopBlockHook.ts +15 -11
  76. package/src/blockmodules/NoopSettlementHook.ts +21 -0
  77. package/src/blockmodules/SequenceStateTransactionModule.ts +25 -0
  78. package/src/index.ts +9 -3
  79. package/src/model/MethodPublicOutput.ts +3 -2
  80. package/src/model/network/NetworkState.ts +15 -3
  81. package/src/model/transaction/RuntimeTransaction.ts +90 -16
  82. package/src/model/transaction/SignedTransaction.ts +54 -0
  83. package/src/model/transaction/ValueOption.ts +28 -0
  84. package/src/protocol/Protocol.ts +49 -31
  85. package/src/protocol/ProvableBlockHook.ts +10 -13
  86. package/src/protocol/ProvableTransactionHook.ts +2 -1
  87. package/src/protocol/TransitioningProtocolModule.ts +3 -2
  88. package/src/prover/block/BlockProvable.ts +39 -6
  89. package/src/prover/block/BlockProver.ts +473 -143
  90. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
  91. package/src/settlement/ProvableSettlementHook.ts +37 -0
  92. package/src/settlement/SettlementContract.ts +444 -0
  93. package/src/settlement/modules/NetworkStateSettlementModule.ts +39 -0
  94. package/src/state/context/RuntimeMethodExecutionContext.ts +18 -1
  95. package/src/utils/MinaPrefixedProvableHashList.ts +72 -0
  96. package/test/BlockProver.test.ts +2 -3
  97. package/src/model/transaction/ProtocolTransaction.ts +0 -25
  98. package/src/prover/block/BlockTransactionPosition.ts +0 -34
@@ -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
+ ) {}
@@ -25,10 +25,14 @@ import { AccountStateModule } from "../blockmodules/AccountStateModule";
25
25
  import { ProvableBlockHook } from "./ProvableBlockHook";
26
26
  import { NoopBlockHook } from "../blockmodules/NoopBlockHook";
27
27
  import { BlockHeightHook } from "../blockmodules/BlockHeightHook";
28
+ import { LastStateRootBlockHook } from "../blockmodules/LastStateRootBlockHook";
29
+ import { ProvableSettlementHook } from "../settlement/ProvableSettlementHook";
30
+ import { NoopSettlementHook } from "../blockmodules/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
38
  export type GenericProtocolModuleRecord = ModulesRecord<
@@ -41,10 +45,13 @@ interface StateTransitionProverType
41
45
  extends ProtocolModule,
42
46
  StateTransitionProvable {}
43
47
 
44
- export interface ProtocolCustomModulesRecord {
48
+ export interface ProtocolCustomModulesRecord
49
+ extends GenericProtocolModuleRecord {
45
50
  BlockProver: TypedClass<BlockProverType>;
46
51
  StateTransitionProver: TypedClass<StateTransitionProverType>;
47
52
  AccountState: TypedClass<AccountStateModule>;
53
+ BlockHeight: TypedClass<BlockHeightHook>;
54
+ LastStateRoot: TypedClass<LastStateRootBlockHook>;
48
55
  }
49
56
 
50
57
  export interface ProtocolModulesRecord
@@ -133,42 +140,52 @@ export class Protocol<Modules extends ProtocolModulesRecord>
133
140
 
134
141
  // Register the BlockModules seperately since we need to
135
142
  // inject them differently later
136
- let atLeastOneTransactionHookRegistered = false;
137
- let atLeastOneBlockHookRegistered = false;
138
- Object.entries(this.definition.modules).forEach(([key, value]) => {
139
- if (Object.prototype.isPrototypeOf.call(ProvableTransactionHook, value)) {
143
+ const ABSTRACT_MODULE_TYPES = [
144
+ { type: ProvableTransactionHook, defaultType: NoopTransactionHook },
145
+ { type: ProvableBlockHook, defaultType: NoopBlockHook },
146
+ { type: ProvableSettlementHook, defaultType: NoopSettlementHook },
147
+ ] as const;
148
+
149
+ ABSTRACT_MODULE_TYPES.forEach((moduleTypeRegistration) => {
150
+ const abstractType = moduleTypeRegistration.type;
151
+
152
+ const implementingModules = Object.entries(
153
+ this.definition.modules
154
+ ).filter(([, value]) =>
155
+ Object.prototype.isPrototypeOf.call(abstractType, value)
156
+ );
157
+
158
+ const newInjectionToken: string | undefined =
159
+ PROTOCOL_INJECTION_TOKENS[abstractType.name];
160
+
161
+ if (newInjectionToken === undefined) {
162
+ log.error(
163
+ "Can't inject hook under the underlying hook token: Alias not found in mapping"
164
+ );
165
+ return;
166
+ }
167
+
168
+ implementingModules.forEach(([key]) => {
140
169
  this.container.register(
141
- PROTOCOL_INJECTION_TOKENS.ProvableTransactionHook,
170
+ abstractType.name,
142
171
  { useToken: key },
143
172
  { lifecycle: Lifecycle.ContainerScoped }
144
173
  );
145
- atLeastOneTransactionHookRegistered = true;
146
- }
147
- if (Object.prototype.isPrototypeOf.call(ProvableBlockHook, value)) {
174
+ });
175
+ if (implementingModules.length === 0) {
176
+ // This type annotation shouldn't change anything but is necessary
177
+ // bcs tsyringe complains
178
+ const { defaultType }: { defaultType: TypedClass<unknown> } =
179
+ moduleTypeRegistration;
180
+
181
+ // Register default (noop) version
148
182
  this.container.register(
149
- PROTOCOL_INJECTION_TOKENS.ProvableBlockHook,
150
- { useToken: key },
183
+ abstractType.name,
184
+ { useClass: defaultType },
151
185
  { lifecycle: Lifecycle.ContainerScoped }
152
186
  );
153
- atLeastOneBlockHookRegistered = true;
154
187
  }
155
188
  });
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
189
  }
173
190
  }
174
191
 
@@ -179,13 +196,14 @@ export const VanillaProtocol = {
179
196
 
180
197
  from<AdditonalModules extends GenericProtocolModuleRecord>(
181
198
  additionalModules: AdditonalModules
182
- ): TypedClass<Protocol<ProtocolModulesRecord>> {
183
- return Protocol.from<ProtocolModulesRecord>({
199
+ ): TypedClass<Protocol<ProtocolCustomModulesRecord & AdditonalModules>> {
200
+ return Protocol.from<ProtocolCustomModulesRecord & AdditonalModules>({
184
201
  modules: {
185
202
  StateTransitionProver,
186
203
  BlockProver,
187
204
  AccountState: AccountStateModule,
188
205
  BlockHeight: BlockHeightHook,
206
+ LastStateRoot: LastStateRootBlockHook,
189
207
  ...additionalModules,
190
208
  },
191
209
  });
@@ -3,20 +3,17 @@ import { NetworkState } from "../model/network/NetworkState";
3
3
 
4
4
  import { TransitioningProtocolModule } from "./TransitioningProtocolModule";
5
5
 
6
- export interface BeforeBlockParameters {
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(blockData: BeforeBlockParameters): NetworkState;
21
- public abstract afterBlock(blockData: AfterBlockParameters): NetworkState;
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
- * A Protocolmodule that enables it's implementing module to access to
5
- * StateTransitions and state
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
@@ -1,23 +1,48 @@
1
- import { Bool, Field, Proof, Struct } from "o1js";
1
+ import { Bool, Field, Proof, Signature, Struct } from "o1js";
2
2
  import { WithZkProgrammable } from "@proto-kit/common";
3
3
 
4
4
  import { StateTransitionProof } from "../statetransition/StateTransitionProvable";
5
5
  import { MethodPublicOutput } from "../../model/MethodPublicOutput";
6
- import { ProtocolTransaction } from "../../model/transaction/ProtocolTransaction";
6
+ import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
7
7
  import { NetworkState } from "../../model/network/NetworkState";
8
- import { BlockTransactionPosition } from "./BlockTransactionPosition";
8
+
9
+ import { BlockHashMerkleTreeWitness } from "./accummulators/BlockHashMerkleTree";
9
10
 
10
11
  export class BlockProverPublicInput extends Struct({
11
12
  transactionsHash: Field,
12
13
  stateRoot: Field,
13
14
  networkStateHash: Field,
15
+ blockHashRoot: Field,
16
+ eternalTransactionsHash: Field,
17
+ incomingMessagesHash: Field,
14
18
  }) {}
15
19
 
16
20
  export class BlockProverPublicOutput extends Struct({
17
21
  transactionsHash: Field,
18
22
  stateRoot: Field,
19
23
  networkStateHash: Field,
20
- }) {}
24
+ blockHashRoot: Field,
25
+ eternalTransactionsHash: Field,
26
+ incomingMessagesHash: Field,
27
+ closed: Bool,
28
+ blockNumber: Field,
29
+ }) {
30
+ public equals(
31
+ input: BlockProverPublicInput,
32
+ closed: Bool,
33
+ blockNumber: Field
34
+ ): Bool {
35
+ const output2 = BlockProverPublicOutput.toFields({
36
+ ...input,
37
+ closed,
38
+ blockNumber,
39
+ });
40
+ const output1 = BlockProverPublicOutput.toFields(this);
41
+ return output1
42
+ .map((value1, index) => value1.equals(output2[index]))
43
+ .reduce((a, b) => a.and(b));
44
+ }
45
+ }
21
46
 
22
47
  export type BlockProverProof = Proof<
23
48
  BlockProverPublicInput,
@@ -25,9 +50,9 @@ export type BlockProverProof = Proof<
25
50
  >;
26
51
 
27
52
  export class BlockProverExecutionData extends Struct({
28
- transaction: ProtocolTransaction,
53
+ transaction: RuntimeTransaction,
54
+ signature: Signature,
29
55
  networkState: NetworkState,
30
- transactionPosition: BlockTransactionPosition,
31
56
  }) {}
32
57
 
33
58
  export interface BlockProvable
@@ -39,6 +64,14 @@ export interface BlockProvable
39
64
  executionData: BlockProverExecutionData
40
65
  ) => BlockProverPublicOutput;
41
66
 
67
+ proveBlock: (
68
+ publicInput: BlockProverPublicInput,
69
+ networkState: NetworkState,
70
+ blockWitness: BlockHashMerkleTreeWitness,
71
+ stateTransitionProof: StateTransitionProof,
72
+ transactionProof: BlockProverProof
73
+ ) => BlockProverPublicOutput;
74
+
42
75
  merge: (
43
76
  publicInput: BlockProverPublicInput,
44
77
  proof1: BlockProverProof,