Skip to content

Commit 8167e97

Browse files
authored
Merge pull request #222 from proto-kit/feature/refactor-stprover-merkle-witness
Refactor STProver to Accept Merkle Witness as Argument
2 parents b963a9a + 2cc6d37 commit 8167e97

File tree

11 files changed

+41
-170
lines changed

11 files changed

+41
-170
lines changed

packages/protocol/src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ export * from "./prover/block/accummulators/BlockHashMerkleTree";
2424
export * from "./prover/block/services/RuntimeVerificationKeyRootService";
2525
export * from "./prover/statetransition/StateTransitionProver";
2626
export * from "./prover/statetransition/StateTransitionProvable";
27-
export * from "./prover/statetransition/StateTransitionWitnessProvider";
28-
export * from "./prover/statetransition/StateTransitionWitnessProviderReference";
2927
export * from "./protocol/Protocol";
3028
export * from "./protocol/ProtocolModule";
3129
export * from "./protocol/ProtocolEnvironment";

packages/protocol/src/model/StateTransitionProvableBatch.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { Bool, Provable, Struct } from "o1js";
2-
import { range } from "@proto-kit/common";
2+
import {
3+
InMemoryMerkleTreeStorage,
4+
range,
5+
RollupMerkleTree,
6+
RollupMerkleTreeWitness,
7+
} from "@proto-kit/common";
38

49
import { constants } from "../Constants";
510

@@ -60,16 +65,22 @@ export class StateTransitionProvableBatch extends Struct({
6065
ProvableStateTransitionType,
6166
constants.stateTransitionProverBatchSize
6267
),
68+
69+
merkleWitnesses: Provable.Array(
70+
RollupMerkleTreeWitness,
71+
constants.stateTransitionProverBatchSize
72+
),
6373
}) {
6474
public static fromMappings(
6575
transitions: {
6676
transition: ProvableStateTransition;
6777
type: ProvableStateTransitionType;
68-
}[]
78+
}[],
79+
merkleWitnesses: RollupMerkleTreeWitness[]
6980
): StateTransitionProvableBatch {
7081
const batch = transitions.map((entry) => entry.transition);
7182
const transitionTypes = transitions.map((entry) => entry.type);
72-
83+
const witnesses = merkleWitnesses.slice();
7384
// Check that order is correct
7485
let normalSTsStarted = false;
7586
transitionTypes.forEach((x) => {
@@ -84,16 +95,23 @@ export class StateTransitionProvableBatch extends Struct({
8495
while (batch.length < constants.stateTransitionProverBatchSize) {
8596
batch.push(ProvableStateTransition.dummy());
8697
transitionTypes.push(ProvableStateTransitionType.normal);
98+
witnesses.push(
99+
new RollupMerkleTree(new InMemoryMerkleTreeStorage()).getWitness(
100+
BigInt(0)
101+
)
102+
);
87103
}
88104
return new StateTransitionProvableBatch({
89105
batch,
90106
transitionTypes,
107+
merkleWitnesses: witnesses,
91108
});
92109
}
93110

94111
public static fromTransitions(
95112
transitions: ProvableStateTransition[],
96-
protocolTransitions: ProvableStateTransition[]
113+
protocolTransitions: ProvableStateTransition[],
114+
merkleWitnesses: RollupMerkleTreeWitness[]
97115
): StateTransitionProvableBatch {
98116
const array = transitions.slice().concat(protocolTransitions);
99117

@@ -113,12 +131,14 @@ export class StateTransitionProvableBatch extends Struct({
113131
return new StateTransitionProvableBatch({
114132
batch: array,
115133
transitionTypes,
134+
merkleWitnesses,
116135
});
117136
}
118137

119138
private constructor(object: {
120139
batch: ProvableStateTransition[];
121140
transitionTypes: ProvableStateTransitionType[];
141+
merkleWitnesses: RollupMerkleTreeWitness[];
122142
}) {
123143
super(object);
124144
}

packages/protocol/src/prover/statetransition/StateTransitionProvable.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import { WithZkProgrammable } from "@proto-kit/common";
33

44
import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
55

6-
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
7-
86
export class StateTransitionProverPublicInput extends Struct({
97
stateTransitionsHash: Field,
108
protocolTransitionsHash: Field,
@@ -29,8 +27,6 @@ export interface StateTransitionProvable
2927
StateTransitionProverPublicInput,
3028
StateTransitionProverPublicOutput
3129
> {
32-
witnessProviderReference: StateTransitionWitnessProviderReference;
33-
3430
runBatch: (
3531
publicInput: StateTransitionProverPublicInput,
3632
batch: StateTransitionProvableBatch

packages/protocol/src/prover/statetransition/StateTransitionProver.ts

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ import {
2727
StateTransitionProverPublicInput,
2828
StateTransitionProverPublicOutput,
2929
} from "./StateTransitionProvable";
30-
import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
31-
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
3230

3331
const errors = {
3432
propertyNotMatching: (property: string, step: string) =>
@@ -64,8 +62,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
6462
StateTransitionProverPublicOutput
6563
> {
6664
public constructor(
67-
private readonly stateTransitionProver: StateTransitionProver,
68-
public readonly witnessProviderReference: StateTransitionWitnessProviderReference
65+
private readonly stateTransitionProver: StateTransitionProver
6966
) {
7067
super();
7168
}
@@ -132,14 +129,6 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
132129
];
133130
}
134131

135-
private get witnessProvider(): StateTransitionWitnessProvider {
136-
const provider = this.witnessProviderReference.getWitnessProvider();
137-
if (provider === undefined) {
138-
throw errors.noWitnessProviderSet();
139-
}
140-
return provider;
141-
}
142-
143132
/**
144133
* Applies the state transitions to the current stateRoot
145134
* and returns the new prover state
@@ -168,12 +157,19 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
168157

169158
const transitions = transitionBatch.batch;
170159
const types = transitionBatch.transitionTypes;
160+
const merkleWitness = transitionBatch.merkleWitnesses;
171161
for (
172162
let index = 0;
173163
index < constants.stateTransitionProverBatchSize;
174164
index++
175165
) {
176-
this.applyTransition(state, transitions[index], types[index], index);
166+
this.applyTransition(
167+
state,
168+
transitions[index],
169+
types[index],
170+
merkleWitness[index],
171+
index
172+
);
177173
}
178174

179175
return state;
@@ -187,13 +183,10 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
187183
state: StateTransitionProverExecutionState,
188184
transition: ProvableStateTransition,
189185
type: ProvableStateTransitionType,
186+
merkleWitness: RollupMerkleTreeWitness,
190187
index = 0
191188
) {
192-
const witness = Provable.witness(RollupMerkleTreeWitness, () =>
193-
this.witnessProvider.getWitness(transition.path)
194-
);
195-
196-
const membershipValid = witness.checkMembership(
189+
const membershipValid = merkleWitness.checkMembership(
197190
state.stateRoot,
198191
transition.path,
199192
transition.from.value
@@ -208,7 +201,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
208201
)
209202
);
210203

211-
const newRoot = witness.calculateRoot(transition.to.value);
204+
const newRoot = merkleWitness.calculateRoot(transition.to.value);
212205

213206
state.stateRoot = Provable.if(
214207
transition.to.isSome,
@@ -343,15 +336,9 @@ export class StateTransitionProver
343336
{
344337
public zkProgrammable: StateTransitionProverProgrammable;
345338

346-
public constructor(
347-
// Injected
348-
public readonly witnessProviderReference: StateTransitionWitnessProviderReference
349-
) {
339+
public constructor() {
350340
super();
351-
this.zkProgrammable = new StateTransitionProverProgrammable(
352-
this,
353-
witnessProviderReference
354-
);
341+
this.zkProgrammable = new StateTransitionProverProgrammable(this);
355342
}
356343

357344
public runBatch(

packages/protocol/src/prover/statetransition/StateTransitionWitnessProvider.ts

Lines changed: 0 additions & 23 deletions
This file was deleted.

packages/protocol/src/prover/statetransition/StateTransitionWitnessProviderReference.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

packages/protocol/test/TestingProtocol.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
BlockProver,
88
LastStateRootBlockHook,
99
MethodPublicOutput,
10-
NoOpStateTransitionWitnessProvider,
1110
Protocol,
1211
StateTransitionProver,
1312
} from "../src";
@@ -39,7 +38,6 @@ export function createAndInitTestingProtocol() {
3938
protocol.create(() => container.createChildContainer());
4039

4140
protocol.registerValue({
42-
StateTransitionWitnessProvider: new NoOpStateTransitionWitnessProvider(),
4341
Runtime: new RuntimeMock(),
4442
});
4543

packages/sequencer/src/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,12 @@ export * from "./helpers/query/QueryBuilderFactory";
6060
export * from "./helpers/query/NetworkStateQuery";
6161
export * from "./helpers/query/NetworkStateTransportModule";
6262
export * from "./state/prefilled/PreFilledStateService";
63-
export * from "./state/prefilled/PreFilledWitnessProvider";
6463
export * from "./state/async/AsyncMerkleTreeStore";
6564
export * from "./state/async/AsyncStateService";
6665
export * from "./state/merkle/CachedMerkleTreeStore";
6766
export * from "./state/merkle/SyncCachedMerkleTreeStore";
6867
export * from "./state/state/DummyStateService";
6968
export * from "./state/state/CachedStateService";
70-
export * from "./state/MerkleStoreWitnessProvider";
7169
export * from "./settlement/SettlementModule";
7270
export * from "./settlement/messages/WithdrawalQueue";
7371
export * from "./settlement/messages/IncomingMessageAdapter";

packages/sequencer/src/protocol/production/tasks/StateTransitionTask.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import {
1818
ProofTaskSerializer,
1919
} from "../../../helpers/utils";
2020
import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule";
21-
import { PreFilledWitnessProvider } from "../../../state/prefilled/PreFilledWitnessProvider";
2221

2322
import {
2423
StateTransitionParametersSerializer,
@@ -61,13 +60,8 @@ export class StateTransitionTask
6160
public async compute(
6261
input: StateTransitionProofParameters
6362
): Promise<StateTransitionProof> {
64-
const witnessProvider = new PreFilledWitnessProvider(input.merkleWitnesses);
65-
66-
const { witnessProviderReference } = this.stateTransitionProver;
67-
const previousProvider = witnessProviderReference.getWitnessProvider();
68-
witnessProviderReference.setWitnessProvider(witnessProvider);
69-
7063
const stBatch = input.stateTransitions.slice();
64+
const merkleWitnesses = input.merkleWitnesses.slice();
7165
// Array.from({
7266
// length: ProtocolConstants.stateTransitionProverBatchSize - stBatch.length,
7367
// }).forEach(() => {
@@ -78,21 +72,16 @@ export class StateTransitionTask
7872

7973
const output = await this.stateTransitionProver.runBatch(
8074
input.publicInput,
81-
StateTransitionProvableBatch.fromMappings(stBatch)
75+
StateTransitionProvableBatch.fromMappings(stBatch, merkleWitnesses)
8276
);
8377
log.debug("STTask public io:", {
8478
input: StateTransitionProverPublicInput.toJSON(input.publicInput),
8579
output: StateTransitionProverPublicOutput.toJSON(output),
8680
});
8781

88-
const proof = await this.executionContext
82+
return await this.executionContext
8983
.current()
9084
.result.prove<StateTransitionProof>();
91-
92-
if (previousProvider !== undefined) {
93-
witnessProviderReference.setWitnessProvider(previousProvider);
94-
}
95-
return proof;
9685
}
9786

9887
public async prepare(): Promise<void> {

packages/sequencer/src/state/MerkleStoreWitnessProvider.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)