@proto-kit/protocol 0.1.1-develop.600 → 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/NoopSettlementHook.d.ts.map +1 -1
- package/dist/blockmodules/NoopSettlementHook.js +1 -1
- package/dist/hooks/AccountStateHook.d.ts.map +1 -1
- package/dist/hooks/AccountStateHook.js +10 -3
- 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 +18 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -6
- 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/protocol/Protocol.d.ts +11 -18
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +4 -27
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +1 -1
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +8 -6
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +1 -1
- 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/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 +3 -3
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -1
- package/dist/settlement/modules/NetworkStateSettlementModule.js +1 -1
- 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 +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.js +2 -1
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +2 -2
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -1
- 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/{blockmodules/AccountStateModule.ts → hooks/AccountStateHook.ts} +3 -1
- package/src/{blockmodules → hooks}/NoopSettlementHook.ts +1 -2
- package/src/index.ts +18 -6
- package/src/model/Option.ts +16 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +10 -2
- package/src/protocol/Protocol.ts +19 -44
- package/src/protocol/ProtocolModule.ts +3 -2
- package/src/prover/block/BlockProver.ts +20 -8
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +1 -1
- 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/{SettlementContract.ts → contracts/SettlementSmartContract.ts} +87 -202
- 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/{ProvableSettlementHook.ts → modularity/ProvableSettlementHook.ts} +7 -10
- package/src/settlement/modules/NetworkStateSettlementModule.ts +3 -3
- package/src/state/State.ts +2 -1
- package/src/state/assert/assert.ts +8 -6
- package/src/state/context/RuntimeMethodExecutionContext.ts +8 -5
- package/src/utils/MinaPrefixedProvableHashList.ts +2 -2
- 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 +2 -2
- 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 → hooks}/BlockHeightHook.ts +0 -0
- /package/src/{blockmodules → hooks}/LastStateRootBlockHook.ts +0 -0
- /package/src/{blockmodules → hooks}/NoopBlockHook.ts +0 -0
- /package/src/{blockmodules → hooks}/NoopTransactionHook.ts +0 -0
- /package/src/{blockmodules → hooks}/SequenceStateTransactionModule.ts +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { prefixToField, RollupMerkleTree, TypedClass } from "@proto-kit/common";
|
|
1
2
|
import {
|
|
2
3
|
AccountUpdate,
|
|
3
4
|
Bool,
|
|
@@ -7,46 +8,36 @@ import {
|
|
|
7
8
|
Poseidon,
|
|
8
9
|
Proof,
|
|
9
10
|
Provable,
|
|
10
|
-
ProvableExtended,
|
|
11
11
|
PublicKey,
|
|
12
|
-
Reducer,
|
|
13
12
|
Signature,
|
|
14
13
|
SmartContract,
|
|
15
14
|
State,
|
|
16
15
|
state,
|
|
17
|
-
Struct,
|
|
18
16
|
TokenId,
|
|
19
17
|
UInt32,
|
|
20
18
|
UInt64,
|
|
21
19
|
} from "o1js";
|
|
20
|
+
import { NetworkState } from "../../model/network/NetworkState";
|
|
21
|
+
import { Path } from "../../model/Path";
|
|
22
|
+
import { BlockHashMerkleTree } from "../../prover/block/accummulators/BlockHashMerkleTree";
|
|
22
23
|
import {
|
|
23
|
-
EMPTY_PUBLICKEY,
|
|
24
|
-
prefixToField,
|
|
25
|
-
RollupMerkleTree,
|
|
26
|
-
RollupMerkleTreeWitness,
|
|
27
|
-
} from "@proto-kit/common";
|
|
28
|
-
import { inject, injectable, injectAll } from "tsyringe";
|
|
29
|
-
|
|
30
|
-
import { ProtocolModule } from "../protocol/ProtocolModule";
|
|
31
|
-
import { BlockProver } from "../prover/block/BlockProver";
|
|
32
|
-
import {
|
|
33
|
-
BlockProvable,
|
|
34
24
|
BlockProverPublicInput,
|
|
35
25
|
BlockProverPublicOutput,
|
|
36
|
-
} from "
|
|
37
|
-
import {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
import {
|
|
42
|
-
|
|
26
|
+
} from "../../prover/block/BlockProvable";
|
|
27
|
+
import {
|
|
28
|
+
OUTGOING_MESSAGE_BATCH_SIZE,
|
|
29
|
+
OutgoingMessageArgumentBatch,
|
|
30
|
+
} from "../messages/OutgoingMessageArgument";
|
|
31
|
+
import { Withdrawal } from "../messages/Withdrawal";
|
|
43
32
|
import {
|
|
44
33
|
ProvableSettlementHook,
|
|
45
34
|
SettlementHookInputs,
|
|
46
35
|
SettlementStateRecord,
|
|
47
|
-
} from "
|
|
36
|
+
} from "../modularity/ProvableSettlementHook";
|
|
48
37
|
|
|
49
|
-
|
|
38
|
+
import { DispatchContractType } from "./DispatchSmartContract";
|
|
39
|
+
|
|
40
|
+
export class LazyBlockProof extends Proof<
|
|
50
41
|
BlockProverPublicInput,
|
|
51
42
|
BlockProverPublicOutput
|
|
52
43
|
> {
|
|
@@ -59,69 +50,37 @@ class LazyBlockProof extends Proof<
|
|
|
59
50
|
};
|
|
60
51
|
}
|
|
61
52
|
|
|
62
|
-
export
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
address: EMPTY_PUBLICKEY,
|
|
76
|
-
amount: UInt64.from(0),
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
|
|
82
|
-
|
|
83
|
-
export class OutgoingMessageArgument extends Struct({
|
|
84
|
-
witness: RollupMerkleTreeWitness,
|
|
85
|
-
value: Withdrawal,
|
|
86
|
-
}) {
|
|
87
|
-
public static dummy(): OutgoingMessageArgument {
|
|
88
|
-
return new OutgoingMessageArgument({
|
|
89
|
-
witness: RollupMerkleTreeWitness.dummy(),
|
|
90
|
-
value: Withdrawal.dummy(),
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export class OutgoingMessageArgumentBatch extends Struct({
|
|
96
|
-
arguments: Provable.Array(
|
|
97
|
-
OutgoingMessageArgument,
|
|
98
|
-
OUTGOING_MESSAGE_BATCH_SIZE
|
|
99
|
-
),
|
|
100
|
-
|
|
101
|
-
isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
102
|
-
}) {
|
|
103
|
-
public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
|
|
104
|
-
const batch = providedArguments.slice();
|
|
105
|
-
const isDummys = batch.map(() => Bool(false));
|
|
106
|
-
|
|
107
|
-
while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
|
|
108
|
-
batch.push(OutgoingMessageArgument.dummy());
|
|
109
|
-
isDummys.push(Bool(true));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return new OutgoingMessageArgumentBatch({
|
|
113
|
-
arguments: batch,
|
|
114
|
-
isDummys,
|
|
115
|
-
});
|
|
116
|
-
}
|
|
53
|
+
export interface SettlementContractType {
|
|
54
|
+
initialize: (sequencer: PublicKey, dispatchContract: PublicKey) => void;
|
|
55
|
+
settle: (
|
|
56
|
+
blockProof: LazyBlockProof,
|
|
57
|
+
signature: Signature,
|
|
58
|
+
dispatchContractAddress: PublicKey,
|
|
59
|
+
publicKey: PublicKey,
|
|
60
|
+
inputNetworkState: NetworkState,
|
|
61
|
+
outputNetworkState: NetworkState,
|
|
62
|
+
newPromisedMessagesHash: Field
|
|
63
|
+
) => void;
|
|
64
|
+
rollupOutgoingMessages: (batch: OutgoingMessageArgumentBatch) => void;
|
|
65
|
+
redeem: (additionUpdate: AccountUpdate) => void;
|
|
117
66
|
}
|
|
118
67
|
|
|
119
68
|
// Some random prefix for the sequencer signature
|
|
120
69
|
export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
|
|
121
70
|
|
|
122
|
-
export
|
|
71
|
+
export class SettlementSmartContract
|
|
72
|
+
extends SmartContract
|
|
73
|
+
implements SettlementContractType
|
|
74
|
+
{
|
|
75
|
+
// This pattern of injecting args into a smartcontract is currently the only
|
|
76
|
+
// viable solution that works given the inheritance issues of o1js
|
|
77
|
+
public static args: {
|
|
78
|
+
DispatchContract: TypedClass<DispatchContractType & SmartContract>;
|
|
79
|
+
hooks: ProvableSettlementHook<unknown>[];
|
|
80
|
+
withdrawalStatePath: [string, string];
|
|
81
|
+
escapeHatchSlotsInterval: number;
|
|
82
|
+
};
|
|
123
83
|
|
|
124
|
-
export class SettlementContract extends SmartContract {
|
|
125
84
|
@state(Field) public sequencerKey = State<Field>();
|
|
126
85
|
@state(UInt32) public lastSettlementL1Block = State<UInt32>();
|
|
127
86
|
|
|
@@ -129,47 +88,33 @@ export class SettlementContract extends SmartContract {
|
|
|
129
88
|
@state(Field) public networkStateHash = State<Field>();
|
|
130
89
|
@state(Field) public blockHashRoot = State<Field>();
|
|
131
90
|
|
|
132
|
-
@state(Field) public
|
|
133
|
-
@state(Field) public honoredMessagesHash = State<Field>();
|
|
91
|
+
@state(Field) public dispatchContractAddressX = State<Field>();
|
|
134
92
|
|
|
135
93
|
@state(Field) public outgoingMessageCursor = State<Field>();
|
|
136
94
|
|
|
137
|
-
public constructor(
|
|
138
|
-
address: PublicKey,
|
|
139
|
-
private readonly methodIdMappings: Record<string, bigint>,
|
|
140
|
-
private readonly hooks: ProvableSettlementHook<unknown>[],
|
|
141
|
-
private readonly withdrawalStatePath: [string, string],
|
|
142
|
-
private readonly incomingMessagesPaths: Record<
|
|
143
|
-
string,
|
|
144
|
-
`${string}.${string}`
|
|
145
|
-
>,
|
|
146
|
-
// 24 hours
|
|
147
|
-
private readonly escapeHatchSlotsInterval = (60 / 3) * 24
|
|
148
|
-
) {
|
|
149
|
-
super(address);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
95
|
@method
|
|
153
|
-
public initialize(sequencer: PublicKey) {
|
|
96
|
+
public initialize(sequencer: PublicKey, dispatchContract: PublicKey) {
|
|
154
97
|
this.sequencerKey.getAndAssertEquals().assertEquals(Field(0));
|
|
155
98
|
this.stateRoot.getAndAssertEquals().assertEquals(Field(0));
|
|
156
99
|
this.blockHashRoot.getAndAssertEquals().assertEquals(Field(0));
|
|
157
100
|
this.networkStateHash.getAndAssertEquals().assertEquals(Field(0));
|
|
158
|
-
this.
|
|
159
|
-
this.honoredMessagesHash.getAndAssertEquals().assertEquals(Field(0));
|
|
101
|
+
this.dispatchContractAddressX.getAndAssertEquals().assertEquals(Field(0));
|
|
160
102
|
|
|
161
103
|
this.sequencerKey.set(sequencer.x);
|
|
162
104
|
this.stateRoot.set(Field(RollupMerkleTree.EMPTY_ROOT));
|
|
163
105
|
this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
|
|
164
106
|
this.networkStateHash.set(NetworkState.empty().hash());
|
|
165
|
-
this.
|
|
166
|
-
|
|
107
|
+
this.dispatchContractAddressX.set(dispatchContract.x);
|
|
108
|
+
|
|
109
|
+
const DispatchContract = SettlementSmartContract.args.DispatchContract;
|
|
110
|
+
new DispatchContract(dispatchContract).initialize(this.address);
|
|
167
111
|
}
|
|
168
112
|
|
|
169
113
|
@method
|
|
170
114
|
public settle(
|
|
171
115
|
blockProof: LazyBlockProof,
|
|
172
116
|
signature: Signature,
|
|
117
|
+
dispatchContractAddress: PublicKey,
|
|
173
118
|
publicKey: PublicKey,
|
|
174
119
|
inputNetworkState: NetworkState,
|
|
175
120
|
outputNetworkState: NetworkState,
|
|
@@ -183,16 +128,31 @@ export class SettlementContract extends SmartContract {
|
|
|
183
128
|
const networkStateHash = this.networkStateHash.getAndAssertEquals();
|
|
184
129
|
const blockHashRoot = this.blockHashRoot.getAndAssertEquals();
|
|
185
130
|
const sequencerKey = this.sequencerKey.getAndAssertEquals();
|
|
186
|
-
const promisedMessagesHash = this.promisedMessagesHash.getAndAssertEquals();
|
|
187
|
-
const honoredMessagesHash = this.honoredMessagesHash.getAndAssertEquals();
|
|
188
131
|
const lastSettlementL1Block =
|
|
189
132
|
this.lastSettlementL1Block.getAndAssertEquals();
|
|
133
|
+
const onChainDispatchContractAddressX =
|
|
134
|
+
this.dispatchContractAddressX.getAndAssertEquals();
|
|
135
|
+
|
|
136
|
+
onChainDispatchContractAddressX.assertEquals(
|
|
137
|
+
dispatchContractAddress.x,
|
|
138
|
+
"DispatchContract address not provided correctly"
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const { DispatchContract, escapeHatchSlotsInterval, hooks } =
|
|
142
|
+
SettlementSmartContract.args;
|
|
143
|
+
|
|
144
|
+
// Get dispatch contract values
|
|
145
|
+
// These values are witnesses but will be checked later on the AU
|
|
146
|
+
// call to the dispatch contract via .updateMessagesHash()
|
|
147
|
+
const dispatchContract = new DispatchContract(dispatchContractAddress);
|
|
148
|
+
const promisedMessagesHash = dispatchContract.promisedMessagesHash.get();
|
|
190
149
|
|
|
191
150
|
// Get block height and use the lower bound for all ops
|
|
192
151
|
const minBlockIncluded = this.network.globalSlotSinceGenesis.get();
|
|
193
152
|
this.network.globalSlotSinceGenesis.assertBetween(
|
|
194
153
|
minBlockIncluded,
|
|
195
|
-
|
|
154
|
+
// 5 because that is the length the newPromisedMessagesHash will be valid
|
|
155
|
+
minBlockIncluded.add(4)
|
|
196
156
|
);
|
|
197
157
|
|
|
198
158
|
// Check signature/escape catch
|
|
@@ -205,7 +165,7 @@ export class SettlementContract extends SmartContract {
|
|
|
205
165
|
lastSettlementL1Block.value,
|
|
206
166
|
]);
|
|
207
167
|
const escapeHatchActivated = lastSettlementL1Block
|
|
208
|
-
.add(UInt32.from(
|
|
168
|
+
.add(UInt32.from(escapeHatchSlotsInterval))
|
|
209
169
|
.lessThan(minBlockIncluded);
|
|
210
170
|
signatureValid
|
|
211
171
|
.or(escapeHatchActivated)
|
|
@@ -214,6 +174,10 @@ export class SettlementContract extends SmartContract {
|
|
|
214
174
|
);
|
|
215
175
|
|
|
216
176
|
// Assert correctness of networkState witness
|
|
177
|
+
Provable.log("Network State Hash ", networkStateHash);
|
|
178
|
+
Provable.log("input Hash ", inputNetworkState.hash());
|
|
179
|
+
Provable.log("equals ", inputNetworkState.hash().equals(networkStateHash));
|
|
180
|
+
|
|
217
181
|
inputNetworkState
|
|
218
182
|
.hash()
|
|
219
183
|
.assertEquals(networkStateHash, "InputNetworkState witness not valid");
|
|
@@ -234,10 +198,8 @@ export class SettlementContract extends SmartContract {
|
|
|
234
198
|
blockHashRoot,
|
|
235
199
|
stateRoot,
|
|
236
200
|
networkStateHash,
|
|
237
|
-
honoredMessagesHash,
|
|
238
201
|
lastSettlementL1Block,
|
|
239
|
-
|
|
240
|
-
sequencerKey,
|
|
202
|
+
sequencerKey: publicKey,
|
|
241
203
|
};
|
|
242
204
|
const inputs: SettlementHookInputs = {
|
|
243
205
|
blockProof,
|
|
@@ -247,7 +209,7 @@ export class SettlementContract extends SmartContract {
|
|
|
247
209
|
toNetworkState: outputNetworkState,
|
|
248
210
|
currentL1Block: minBlockIncluded,
|
|
249
211
|
};
|
|
250
|
-
|
|
212
|
+
hooks.forEach((hook) => {
|
|
251
213
|
hook.beforeSettlement(this, inputs);
|
|
252
214
|
});
|
|
253
215
|
|
|
@@ -256,6 +218,10 @@ export class SettlementContract extends SmartContract {
|
|
|
256
218
|
blockProof.publicInput.stateRoot,
|
|
257
219
|
"Input state root not matching"
|
|
258
220
|
);
|
|
221
|
+
Provable.log("Network State Hash ", networkStateHash);
|
|
222
|
+
Provable.log("input Hash ", inputNetworkState.hash());
|
|
223
|
+
Provable.log("Proof Hash ", blockProof.publicInput.networkStateHash);
|
|
224
|
+
|
|
259
225
|
networkStateHash.assertEquals(
|
|
260
226
|
blockProof.publicInput.networkStateHash,
|
|
261
227
|
"Input networkStateHash not matching"
|
|
@@ -273,69 +239,27 @@ export class SettlementContract extends SmartContract {
|
|
|
273
239
|
blockProof.publicOutput.incomingMessagesHash,
|
|
274
240
|
"Promised messages not honored"
|
|
275
241
|
);
|
|
276
|
-
this.honoredMessagesHash.set(promisedMessagesHash);
|
|
277
242
|
|
|
278
|
-
//
|
|
279
|
-
|
|
280
|
-
|
|
243
|
+
// Call DispatchContract
|
|
244
|
+
// This call checks that the promisedMessagesHash, which is already proven
|
|
245
|
+
// to be the blockProofs publicoutput, is actually the current on-chain
|
|
246
|
+
// promisedMessageHash. It also checks the newPromisedMessagesHash to be
|
|
247
|
+
// a current sequencestate value
|
|
248
|
+
dispatchContract.updateMessagesHash(
|
|
249
|
+
promisedMessagesHash,
|
|
250
|
+
newPromisedMessagesHash
|
|
251
|
+
);
|
|
281
252
|
|
|
282
253
|
this.lastSettlementL1Block.set(minBlockIncluded);
|
|
283
254
|
}
|
|
284
255
|
|
|
285
|
-
private dispatchMessage<Type>(
|
|
286
|
-
methodId: Field,
|
|
287
|
-
value: Type,
|
|
288
|
-
valueType: ProvableExtended<Type>
|
|
289
|
-
) {
|
|
290
|
-
const args = valueType.toFields(value);
|
|
291
|
-
// Should be the same as RuntimeTransaction.hash
|
|
292
|
-
const argsHash = Poseidon.hash(args);
|
|
293
|
-
const runtimeTransaction = RuntimeTransaction.fromMessage({
|
|
294
|
-
methodId,
|
|
295
|
-
argsHash,
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
// Append tx to incomingMessagesHash
|
|
299
|
-
const actionData = runtimeTransaction.hashData();
|
|
300
|
-
const actionHash = MinaActions.actionHash(actionData);
|
|
301
|
-
|
|
302
|
-
this.self.body.actions = {
|
|
303
|
-
hash: actionHash,
|
|
304
|
-
data: [actionData],
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
const eventHash = MinaEvents.eventHash(args);
|
|
308
|
-
this.self.body.events = {
|
|
309
|
-
hash: eventHash,
|
|
310
|
-
data: [args],
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
@method
|
|
315
|
-
public deposit(amount: UInt64) {
|
|
316
|
-
// Save this, since otherwise it would be a second witness later,
|
|
317
|
-
// which could be a different values than the first
|
|
318
|
-
const sender = this.sender;
|
|
319
|
-
|
|
320
|
-
// Credit the amount to the bridge contract
|
|
321
|
-
this.self.balance.addInPlace(amount);
|
|
322
|
-
|
|
323
|
-
const action = new Deposit({
|
|
324
|
-
address: sender,
|
|
325
|
-
amount,
|
|
326
|
-
});
|
|
327
|
-
const methodId = Field(
|
|
328
|
-
this.methodIdMappings[this.incomingMessagesPaths["deposit"]]
|
|
329
|
-
);
|
|
330
|
-
this.dispatchMessage(methodId.toConstant(), action, Deposit);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
256
|
@method
|
|
334
257
|
public rollupOutgoingMessages(batch: OutgoingMessageArgumentBatch) {
|
|
335
258
|
let counter = this.outgoingMessageCursor.getAndAssertEquals();
|
|
336
259
|
const stateRoot = this.stateRoot.getAndAssertEquals();
|
|
337
260
|
|
|
338
|
-
const [withdrawalModule, withdrawalStateName] =
|
|
261
|
+
const [withdrawalModule, withdrawalStateName] =
|
|
262
|
+
SettlementSmartContract.args.withdrawalStatePath;
|
|
339
263
|
const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
|
|
340
264
|
|
|
341
265
|
let accountCreationFeePaid = Field(0);
|
|
@@ -403,42 +327,3 @@ export class SettlementContract extends SmartContract {
|
|
|
403
327
|
this.balance.subInPlace(amount);
|
|
404
328
|
}
|
|
405
329
|
}
|
|
406
|
-
|
|
407
|
-
export interface SettlementContractModuleConfig {
|
|
408
|
-
withdrawalStatePath: `${string}.${string}`;
|
|
409
|
-
withdrawalMethodPath: `${string}.${string}`;
|
|
410
|
-
incomingMessagesMethods: Record<string, `${string}.${string}`>;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
@injectable()
|
|
414
|
-
export class SettlementContractModule extends ProtocolModule<SettlementContractModuleConfig> {
|
|
415
|
-
public constructor(
|
|
416
|
-
@injectAll("ProvableSettlementHook")
|
|
417
|
-
private readonly hooks: ProvableSettlementHook<unknown>[],
|
|
418
|
-
@inject("BlockProver")
|
|
419
|
-
private readonly blockProver: BlockProvable
|
|
420
|
-
) {
|
|
421
|
-
super();
|
|
422
|
-
LazyBlockProof.tag = blockProver.zkProgrammable.zkProgram.Proof.tag;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
public getContractClass(): typeof SettlementContract {
|
|
426
|
-
return SettlementContract;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
public createContract(
|
|
430
|
-
address: PublicKey,
|
|
431
|
-
methodIdMappings: SettlementMethodIdMapping
|
|
432
|
-
): SettlementContract {
|
|
433
|
-
// We know that this returns [string, string], but TS can't infer that
|
|
434
|
-
const withdrawalPath = this.config.withdrawalStatePath.split(".");
|
|
435
|
-
|
|
436
|
-
return new SettlementContract(
|
|
437
|
-
address,
|
|
438
|
-
methodIdMappings,
|
|
439
|
-
this.hooks,
|
|
440
|
-
[withdrawalPath[0], withdrawalPath[1]],
|
|
441
|
-
this.config.incomingMessagesMethods
|
|
442
|
-
);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Bool, Provable, Struct } from "o1js";
|
|
2
|
+
import { RollupMerkleTreeWitness } from "@proto-kit/common";
|
|
3
|
+
import { Withdrawal } from "./Withdrawal";
|
|
4
|
+
|
|
5
|
+
export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
|
|
6
|
+
|
|
7
|
+
export class OutgoingMessageArgument extends Struct({
|
|
8
|
+
witness: RollupMerkleTreeWitness,
|
|
9
|
+
value: Withdrawal,
|
|
10
|
+
}) {
|
|
11
|
+
public static dummy(): OutgoingMessageArgument {
|
|
12
|
+
return new OutgoingMessageArgument({
|
|
13
|
+
witness: RollupMerkleTreeWitness.dummy(),
|
|
14
|
+
value: Withdrawal.dummy(),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class OutgoingMessageArgumentBatch extends Struct({
|
|
20
|
+
arguments: Provable.Array(
|
|
21
|
+
OutgoingMessageArgument,
|
|
22
|
+
OUTGOING_MESSAGE_BATCH_SIZE
|
|
23
|
+
),
|
|
24
|
+
|
|
25
|
+
isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
26
|
+
}) {
|
|
27
|
+
public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
|
|
28
|
+
const batch = providedArguments.slice();
|
|
29
|
+
const isDummys = batch.map(() => Bool(false));
|
|
30
|
+
|
|
31
|
+
while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
|
|
32
|
+
batch.push(OutgoingMessageArgument.dummy());
|
|
33
|
+
isDummys.push(Bool(true));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return new OutgoingMessageArgumentBatch({
|
|
37
|
+
arguments: batch,
|
|
38
|
+
isDummys,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PublicKey, Struct, UInt64 } from "o1js";
|
|
2
|
+
import { EMPTY_PUBLICKEY } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
export class Withdrawal extends Struct({
|
|
5
|
+
address: PublicKey,
|
|
6
|
+
amount: UInt64,
|
|
7
|
+
}) {
|
|
8
|
+
public static dummy() {
|
|
9
|
+
return new Withdrawal({
|
|
10
|
+
address: EMPTY_PUBLICKEY,
|
|
11
|
+
amount: UInt64.from(0),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
import { Field, UInt32 } from "o1js";
|
|
1
|
+
import { Field, PublicKey, UInt32 } from "o1js";
|
|
2
2
|
|
|
3
|
-
import type { BlockProof } from "
|
|
4
|
-
import { ProtocolModule } from "
|
|
5
|
-
import { NetworkState } from "
|
|
3
|
+
import type { BlockProof } from "../../prover/block/BlockProver";
|
|
4
|
+
import { ProtocolModule } from "../../protocol/ProtocolModule";
|
|
5
|
+
import { NetworkState } from "../../model/network/NetworkState";
|
|
6
6
|
|
|
7
|
-
import type {
|
|
7
|
+
import type { SettlementSmartContract } from "../contracts/SettlementSmartContract";
|
|
8
8
|
|
|
9
9
|
export type SettlementStateRecord = {
|
|
10
|
-
sequencerKey:
|
|
10
|
+
sequencerKey: PublicKey;
|
|
11
11
|
lastSettlementL1Block: UInt32;
|
|
12
12
|
|
|
13
13
|
stateRoot: Field;
|
|
14
14
|
networkStateHash: Field;
|
|
15
15
|
blockHashRoot: Field;
|
|
16
|
-
|
|
17
|
-
promisedMessagesHash: Field;
|
|
18
|
-
honoredMessagesHash: Field;
|
|
19
16
|
};
|
|
20
17
|
|
|
21
18
|
export type SettlementHookInputs = {
|
|
@@ -31,7 +28,7 @@ export abstract class ProvableSettlementHook<
|
|
|
31
28
|
Config
|
|
32
29
|
> extends ProtocolModule<Config> {
|
|
33
30
|
public abstract beforeSettlement(
|
|
34
|
-
smartContract:
|
|
31
|
+
smartContract: SettlementSmartContract,
|
|
35
32
|
inputs: SettlementHookInputs
|
|
36
33
|
): void;
|
|
37
34
|
}
|
|
@@ -3,8 +3,8 @@ import { UInt64 } from "o1js";
|
|
|
3
3
|
import {
|
|
4
4
|
ProvableSettlementHook,
|
|
5
5
|
SettlementHookInputs,
|
|
6
|
-
} from "../ProvableSettlementHook";
|
|
7
|
-
import {
|
|
6
|
+
} from "../modularity/ProvableSettlementHook";
|
|
7
|
+
import { SettlementSmartContract } from "../contracts/SettlementSmartContract";
|
|
8
8
|
|
|
9
9
|
type NetworkStateSettlementModuleConfig = {
|
|
10
10
|
blocksPerL1Block: UInt64;
|
|
@@ -12,7 +12,7 @@ type NetworkStateSettlementModuleConfig = {
|
|
|
12
12
|
|
|
13
13
|
export class NetworkStateSettlementModule extends ProvableSettlementHook<NetworkStateSettlementModuleConfig> {
|
|
14
14
|
public beforeSettlement(
|
|
15
|
-
smartContract:
|
|
15
|
+
smartContract: SettlementSmartContract,
|
|
16
16
|
{
|
|
17
17
|
blockProof,
|
|
18
18
|
fromNetworkState,
|
package/src/state/State.ts
CHANGED
|
@@ -72,7 +72,8 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
72
72
|
.current().result;
|
|
73
73
|
|
|
74
74
|
// First try to find a match inside already created stateTransitions
|
|
75
|
-
|
|
75
|
+
let previousMutatingTransitions: StateTransition<any>[] = [];
|
|
76
|
+
previousMutatingTransitions = stateTransitions.filter((transition) =>
|
|
76
77
|
transition.path.equals(path).and(transition.to.isSome).toBoolean()
|
|
77
78
|
);
|
|
78
79
|
const pmtLength = previousMutatingTransitions.length;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Bool } from "o1js";
|
|
1
|
+
import { Bool, Provable } from "o1js";
|
|
2
2
|
import { container } from "tsyringe";
|
|
3
3
|
import { log } from "@proto-kit/common";
|
|
4
4
|
|
|
@@ -18,12 +18,14 @@ export function assert(condition: Bool, message?: string) {
|
|
|
18
18
|
const previousStatus = executionContext.current().result.status;
|
|
19
19
|
const status = condition.and(previousStatus);
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
if (!
|
|
23
|
-
|
|
21
|
+
Provable.asProver(() => {
|
|
22
|
+
if (!condition.toBoolean()) {
|
|
23
|
+
if (!executionContext.current().isSimulated) {
|
|
24
|
+
log.debug("Assertion failed: ", message);
|
|
25
|
+
}
|
|
26
|
+
executionContext.setStatusMessage(message);
|
|
24
27
|
}
|
|
25
|
-
|
|
26
|
-
}
|
|
28
|
+
});
|
|
27
29
|
|
|
28
30
|
executionContext.setStatus(status);
|
|
29
31
|
}
|
|
@@ -29,10 +29,12 @@ export interface RuntimeMethodExecutionData {
|
|
|
29
29
|
networkState: NetworkState;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
export class RuntimeMethodExecutionDataStruct
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
export class RuntimeMethodExecutionDataStruct
|
|
33
|
+
extends Struct({
|
|
34
|
+
transaction: RuntimeTransaction,
|
|
35
|
+
networkState: NetworkState,
|
|
36
|
+
})
|
|
37
|
+
implements RuntimeMethodExecutionData {}
|
|
36
38
|
|
|
37
39
|
/**
|
|
38
40
|
* Execution context used to wrap runtime module methods,
|
|
@@ -125,7 +127,8 @@ export class RuntimeMethodExecutionContext extends ProvableMethodExecutionContex
|
|
|
125
127
|
super.afterMethod();
|
|
126
128
|
if (this.isFinished) {
|
|
127
129
|
this.lastInput = this.input;
|
|
128
|
-
|
|
130
|
+
// TODO: find out why input isnt set in TransactionFeeHook during assert
|
|
131
|
+
// this.input = undefined;
|
|
129
132
|
this.isSimulated = false;
|
|
130
133
|
}
|
|
131
134
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Field,
|
|
1
|
+
import { Field, Poseidon, ProvablePure } from "o1js";
|
|
2
2
|
import { hashWithPrefix, prefixToField } from "@proto-kit/common";
|
|
3
3
|
|
|
4
4
|
import { ProvableHashList } from "./ProvableHashList";
|
|
@@ -51,7 +51,7 @@ export class MinaPrefixedProvableHashList<
|
|
|
51
51
|
Value
|
|
52
52
|
> extends ProvableHashList<Value> {
|
|
53
53
|
public constructor(
|
|
54
|
-
valueType:
|
|
54
|
+
valueType: ProvablePure<Value>,
|
|
55
55
|
public readonly prefix: string,
|
|
56
56
|
internalCommitment: Field = Field(0)
|
|
57
57
|
) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Field,
|
|
1
|
+
import { Field, ProvablePure, Poseidon } from "o1js";
|
|
2
2
|
|
|
3
3
|
import { ProvableHashList } from "./ProvableHashList.js";
|
|
4
4
|
import { stringToField } from "./utils";
|
|
@@ -7,7 +7,7 @@ export class PrefixedProvableHashList<Value> extends ProvableHashList<Value> {
|
|
|
7
7
|
private readonly prefix: Field;
|
|
8
8
|
|
|
9
9
|
public constructor(
|
|
10
|
-
valueType:
|
|
10
|
+
valueType: ProvablePure<Value>,
|
|
11
11
|
prefix: string,
|
|
12
12
|
internalCommitment: Field = Field(0)
|
|
13
13
|
) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Field, Poseidon,
|
|
1
|
+
import { Field, Poseidon, Bool, Provable, ProvablePure } from "o1js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Utilities for creating a hash list from a given value type.
|
|
5
5
|
*/
|
|
6
6
|
export abstract class ProvableHashList<Value> {
|
|
7
7
|
public constructor(
|
|
8
|
-
|
|
8
|
+
protected readonly valueType: ProvablePure<Value>,
|
|
9
9
|
public commitment: Field = Field(0)
|
|
10
10
|
) {}
|
|
11
11
|
|
|
@@ -47,4 +47,4 @@ export class DefaultProvableHashList<Value> extends ProvableHashList<Value> {
|
|
|
47
47
|
public hash(elements: Field[]): Field {
|
|
48
48
|
return Poseidon.hash(elements);
|
|
49
49
|
}
|
|
50
|
-
}
|
|
50
|
+
}
|