Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes for starter-kit signed settlement #234

Draft
wants to merge 59 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
30d04e2
Upgraded o1js version, added fungible token standard
rpanic Oct 2, 2024
7308964
Implemented withdrawals on BridgeContract
rpanic Oct 2, 2024
b90feb0
Added bridge deployment to SettlementContract
rpanic Oct 2, 2024
0db5aff
Refactor
rpanic Oct 2, 2024
91af70c
Updated withdrawal runtime
rpanic Oct 2, 2024
b756ebc
Merge branch 'develop' into feature/custom-token-bridging
rpanic Oct 2, 2024
8eab012
Added encoding of auxilary data to tx task payload
rpanic Oct 8, 2024
16f8a52
Added some missing common primitives
rpanic Oct 11, 2024
ccded78
Adapted the withdrawal module to support multiple tokens
rpanic Oct 11, 2024
c47c74c
Protocol side of the implementation
rpanic Oct 11, 2024
4770181
Authorizations
rpanic Oct 11, 2024
f413fd1
Extract ReplayingSingleUseEventEmitter
rpanic Oct 11, 2024
78dec46
Sequencer side of the implementation
rpanic Oct 11, 2024
c7561ff
Added Tests for custom token bridging
rpanic Oct 11, 2024
8d4115c
dependencies
rpanic Oct 11, 2024
20ec830
Lint errors
rpanic Oct 11, 2024
5387b8c
Merge branch 'feature/sideloading_runtime' into feature/custom-token-…
rpanic Oct 15, 2024
25c6d20
Renamed ProtocolStartupModule to SequencerStartupModule
rpanic Oct 15, 2024
e7cfa11
Added timing log utils
rpanic Oct 15, 2024
a00bd14
Added bridge contract vk to compile task and registration args
rpanic Oct 16, 2024
83de537
Made LocalTaskQueue sequential
rpanic Oct 16, 2024
750b65f
release
maht0rz Oct 20, 2024
db3a52f
Moved CompileRegistry
rpanic Oct 29, 2024
32534b5
Added argument to app.start for proofs enabled
rpanic Oct 29, 2024
2587180
Renamed remaining appchain references to AreProofsEnabled
rpanic Oct 29, 2024
13ad8d2
Merge branch 'develop' into feature/enable-proving
rpanic Oct 29, 2024
658b1ff
Enabled ModuleContainers to also emit events themselves
rpanic Oct 29, 2024
b0ef48f
Made LocalTaskWorkerModule emit event when ready
rpanic Oct 29, 2024
ec36df6
LocalTaskQueue merge
rpanic Oct 29, 2024
0643231
Refactored BlockProduction Test
rpanic Oct 29, 2024
89699e7
Refactoring leftovers
rpanic Oct 29, 2024
95610b9
Created test for proven batch production
rpanic Oct 29, 2024
cffc909
Enabled proving for batches
rpanic Oct 29, 2024
8d3d613
Merge branch 'develop' into feature/enable-proving
rpanic Oct 29, 2024
36f2eba
Linting
rpanic Oct 30, 2024
d78b390
reduced timeout
rpanic Oct 30, 2024
d0d597d
Fixed bullmq worker implementation
rpanic Oct 30, 2024
a1af0d4
Added WorkerReadyModule
rpanic Oct 30, 2024
8b50c29
Moved CompileRegistry to be consumed by contract modules
rpanic Oct 31, 2024
92f8420
Added new CompileRegistry with adaptive compiling and caching
rpanic Oct 31, 2024
a45933f
Fixed new CompileRegistry to work
rpanic Oct 31, 2024
42e316c
Added ChildVerificationKeyService to allow for sideloading in protoco…
rpanic Nov 4, 2024
76b4fa8
Smart Contracts compiling
rpanic Nov 7, 2024
b58433c
Refactoring
rpanic Nov 7, 2024
4d63b5a
Cleanup
rpanic Nov 8, 2024
eb3772e
Merge branch 'develop' of github.com:yet-another-blockchain/framework…
maht0rz Nov 8, 2024
684b621
Enabled proven settlement
rpanic Nov 9, 2024
4a3e15b
Added forceProverExists to protect against missing provers for non-si…
rpanic Nov 10, 2024
db385e2
Merge branch 'develop' of github.com:yet-another-blockchain/framework…
maht0rz Nov 21, 2024
a1e66b4
exported ConstantFeeStrategy
maht0rz Nov 25, 2024
e9efb35
change bullmq's oncompleted result parsing
maht0rz Nov 25, 2024
3ffc0c7
Merge branch 'develop' into feature/proven-settlemnet
rpanic Nov 26, 2024
f696264
Fix halting bug when executing with remote worker
rpanic Nov 28, 2024
eb36d1a
Linting
rpanic Nov 28, 2024
d30699b
Fixed duplication of listeners
rpanic Nov 29, 2024
bb0db42
Linting
rpanic Dec 2, 2024
1984936
starter kit integration WIP
maht0rz Dec 9, 2024
22e6c1d
Merge branch 'fix/queue-dedup' of github.com:yet-another-blockchain/f…
maht0rz Dec 9, 2024
ffd08ec
added settlement module keys config, and worker startup signed settle…
maht0rz Dec 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v18.14.2
v22.9.0
20,267 changes: 1,835 additions & 18,432 deletions package-lock.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions packages/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"license": "MIT",
"private": false,
"type": "module",
"version": "0.1.1-develop.833+397881ed",
"version": "0.1.1-develop.1087+9ab55c9b",
"scripts": {
"build": "tsc -p tsconfig.json",
"dev": "tsc -p tsconfig.json --watch",
Expand Down Expand Up @@ -34,7 +34,7 @@
"@proto-kit/module": "*",
"@proto-kit/protocol": "*",
"@proto-kit/sequencer": "*",
"o1js": "^1.1.0",
"o1js": "^1.6.0",
"tsyringe": "^4.7.0"
},
"devDependencies": {
Expand All @@ -43,5 +43,5 @@
"@types/lodash": "^4.14.194",
"@types/ws": "^8.5.4"
},
"gitHead": "397881ed5d8f98f5005bcd7be7f5a12b3bc6f956"
"gitHead": "9ab55c9b0ab4476a75b47c4d3cd2dab9e6847ffe"
}
2 changes: 1 addition & 1 deletion packages/api/src/graphql/modules/BatchStorageResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class ComputedBlockModel {
blockHashes.map(
(blockHash) => blocks.find((block) => block?.hash === blockHash)!
),
proof.proof === MOCK_PROOF ? "mock-proof" : JSON.stringify(proof)
proof.proof === MOCK_PROOF ? MOCK_PROOF : JSON.stringify(proof)
);
}

Expand Down
6 changes: 3 additions & 3 deletions packages/common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"license": "MIT",
"private": false,
"type": "module",
"version": "0.1.1-develop.833+397881ed",
"version": "0.1.1-develop.1087+9ab55c9b",
"scripts": {
"build": "tsc -p tsconfig.json",
"dev": "tsc -p tsconfig.json --watch",
Expand All @@ -23,12 +23,12 @@
"typescript-memoize": "^1.1.1"
},
"peerDependencies": {
"o1js": "^1.1.0",
"o1js": "^1.6.0",
"tsyringe": "^4.7.0"
},
"devDependencies": {
"@jest/globals": "^29.5.0",
"@types/lodash": "^4.14.194"
},
"gitHead": "397881ed5d8f98f5005bcd7be7f5a12b3bc6f956"
"gitHead": "9ab55c9b0ab4476a75b47c4d3cd2dab9e6847ffe"
}
62 changes: 62 additions & 0 deletions packages/common/src/compiling/AtomicCompileHelper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import {
AreProofsEnabled,
CompileArtifact,
MOCK_VERIFICATION_KEY,
} from "../zkProgrammable/ZkProgrammable";
import { isSubtypeOfName } from "../utils";
import { TypedClass } from "../types";
import { log } from "../log";

export type ArtifactRecord = Record<string, CompileArtifact>;

export type CompileTarget = {
name: string;
compile: () => Promise<CompileArtifact>;
};

export class AtomicCompileHelper {
public constructor(private readonly areProofsEnabled: AreProofsEnabled) {}

private compilationPromises: {
[key: string]: Promise<CompileArtifact>;
} = {};

public async compileContract(
contract: CompileTarget,
overrideProofsEnabled?: boolean
): Promise<CompileArtifact> {
let newPromise = false;
const { name } = contract;
if (this.compilationPromises[name] === undefined) {
const proofsEnabled =
overrideProofsEnabled ?? this.areProofsEnabled.areProofsEnabled;

// We only care about proofs enabled here if it's a contract, because
// in all other cases, ZkProgrammable already handles this switch, and we
// want to preserve the artifact layout (which might be more than one
// entry for ZkProgrammables)
if (
proofsEnabled ||
!isSubtypeOfName(
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
contract as unknown as TypedClass<any>,
"SmartContract"
)
) {
log.time(`Compiling ${name}`);
this.compilationPromises[name] = contract.compile();
newPromise = true;
} else {
log.trace(`Compiling ${name} - mock`);
this.compilationPromises[name] = Promise.resolve({
verificationKey: MOCK_VERIFICATION_KEY,
});
}
}
const result = await this.compilationPromises[name];
if (newPromise) {
log.timeEnd.info(`Compiling ${name}`);
}
return result;
}
}
6 changes: 6 additions & 0 deletions packages/common/src/compiling/CompilableModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import type { CompileRegistry } from "./CompileRegistry";
import type { ArtifactRecord } from "./AtomicCompileHelper";

export interface CompilableModule {
compile(registry: CompileRegistry): Promise<ArtifactRecord | void>;
}
78 changes: 78 additions & 0 deletions packages/common/src/compiling/CompileRegistry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { inject, injectable, singleton } from "tsyringe";

import {
AreProofsEnabled,
CompileArtifact,
} from "../zkProgrammable/ZkProgrammable";

import {
ArtifactRecord,
AtomicCompileHelper,
CompileTarget,
} from "./AtomicCompileHelper";

/**
* The CompileRegistry compiles "compilable modules"
* (i.e. zkprograms, contracts or contractmodules)
* while making sure they don't get compiled twice in the same process in parallel.
*/
@injectable()
@singleton()
export class CompileRegistry {
public constructor(
@inject("AreProofsEnabled")
private readonly areProofsEnabled: AreProofsEnabled
) {
this.compiler = new AtomicCompileHelper(this.areProofsEnabled);
}

private compiler: AtomicCompileHelper;

private artifacts: ArtifactRecord = {};

private inForceProverBlock = false;

/**
* This function forces compilation even if the artifact itself is in the registry.
* Basically the statement is: The artifact along is not enough, we need to
* actually have the prover compiled.
* This is true for non-sideloaded circuit dependencies.
*/
public async forceProverExists(
f: (registry: CompileRegistry) => Promise<void>
) {
this.inForceProverBlock = true;
await f(this);
this.inForceProverBlock = false;
}

public async compile(target: CompileTarget) {
if (this.artifacts[target.name] === undefined || this.inForceProverBlock) {
const artifact = await this.compiler.compileContract(target);
this.artifacts[target.name] = artifact;
return artifact;
}
return this.artifacts[target.name];
}

public getArtifact(name: string): CompileArtifact | undefined {
if (this.artifacts[name] === undefined) {
throw new Error(
`Artifact for ${name} not available, did you compile it via the CompileRegistry?`
);
}

return this.artifacts[name];
}

public addArtifactsRaw(artifacts: ArtifactRecord) {
this.artifacts = {
...this.artifacts,
...artifacts,
};
}

public getAllArtifacts() {
return this.artifacts;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { injectable, Lifecycle, scoped } from "tsyringe";

import { CompileRegistry } from "../CompileRegistry";

@injectable()
@scoped(Lifecycle.ContainerScoped)
export class ChildVerificationKeyService {
private compileRegistry?: CompileRegistry;

public setCompileRegistry(registry: CompileRegistry) {
this.compileRegistry = registry;
}

public getVerificationKey(name: string) {
if (this.compileRegistry === undefined) {
throw new Error("CompileRegistry hasn't been set yet");
}
const artifact = this.compileRegistry.getArtifact(name);
if (artifact === undefined) {
throw new Error(
`Verification Key for child program ${name} not found in registry`
);
}
return artifact.verificationKey;
}
}
2 changes: 2 additions & 0 deletions packages/common/src/config/ModuleContainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,8 @@ export class ModuleContainer<
);
}

protected createSuperClassAliases(module: any) {}

/**
* This is a placeholder for individual modules to override.
* This method will be called whenever the underlying container fully
Expand Down
10 changes: 10 additions & 0 deletions packages/common/src/dummyVerificationKey.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Field, VerificationKey } from "o1js";

export function dummyVerificationKey() {
return new VerificationKey({
hash: Field(
"3392518251768960475377392625298437850623664973002200885669375116181514017494"
),
data: "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",
});
}
30 changes: 27 additions & 3 deletions packages/common/src/events/EventEmitterProxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ import type {
import { StringKeyOf, UnionToIntersection } from "../types";

import { EventEmitter } from "./EventEmitter";
import { EventEmittingComponent, EventsRecord } from "./EventEmittingComponent";
import {
EventEmittingComponent,
EventEmittingContainer,
EventsRecord,
} from "./EventEmittingComponent";

export type CastToEventsRecord<Record> = Record extends EventsRecord
? Record
Expand All @@ -17,7 +21,13 @@ export type ModuleEvents<ModuleType extends BaseModuleType> =
? Events
: InstanceType<ModuleType> extends ModuleContainer<infer NestedModules>
? CastToEventsRecord<ContainerEvents<NestedModules>>
: EventsRecord;
: // &
// (InstanceType<ModuleType> extends EventEmittingContainer<
// infer ContainerEvents
// >
// ? ContainerEvents
// : {})
EventsRecord;

export type ContainerEvents<Modules extends ModulesRecord> = {
[Key in StringKeyOf<Modules>]: ModuleEvents<Modules[Key]>;
Expand All @@ -27,7 +37,7 @@ export type FlattenObject<Target extends Record<string, EventsRecord>> =
UnionToIntersection<Target[keyof Target]>;

export type FlattenedContainerEvents<Modules extends ModulesRecord> =
FlattenObject<ContainerEvents<Modules>>;
FlattenObject<ContainerEvents<Modules>>; // & FlattenObject<any>;

export class EventEmitterProxy<
Modules extends ModulesRecord,
Expand All @@ -45,10 +55,24 @@ export class EventEmitterProxy<
this.emit(events, ...args);
});
}
if (this.isEventEmittingContainer(module)) {
module.containerEvents.onAll((events: any, args: any[]) => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
this.emit(events, ...args);
});
}
}
});
}

private isEventEmittingContainer(
module: any
): module is EventEmittingContainer<EventsRecord> {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const emitter = module.containerEvents;
return emitter !== undefined && emitter instanceof EventEmitter;
}

private isEventEmitter(
module: any
): module is EventEmittingComponent<EventsRecord> {
Expand Down
4 changes: 4 additions & 0 deletions packages/common/src/events/EventEmittingComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@ export type EventsRecord = Record<string, unknown[]>;
export interface EventEmittingComponent<Events extends EventsRecord> {
events: EventEmitter<Events>;
}

export interface EventEmittingContainer<Events extends EventsRecord> {
containerEvents: EventEmitter<Events>;
}
42 changes: 42 additions & 0 deletions packages/common/src/events/ReplayingSingleUseEventEmitter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { EventsRecord } from "./EventEmittingComponent";
import { EventEmitter } from "./EventEmitter";

/**
* Event Emitter variant that emits a certain event only once to a registered listener.
* Additionally, if a listener registers to a event that has already been emitted, it
* re-emits it to said listener.
* This pattern is especially useful for listening for inclusions of transactions.
* Those events will only occur once, and listeners could come too late to the party,
* so we need to make sure they get notified as well in those cases.
*/
export class ReplayingSingleUseEventEmitter<
Events extends EventsRecord,
> extends EventEmitter<Events> {
public emitted: Partial<Events> = {};

public emit<Key extends keyof Events>(
event: Key,
...parameters: Events[Key]
) {
super.emit(event, ...parameters);
this.emitted[event] = parameters;
this.listeners[event] = [];
}

public onAll(listener: (event: keyof Events, args: unknown[]) => void) {
Object.entries(this.emitted).forEach(([key, params]) => {
if (params !== undefined) listener(key, params);
});
super.onAll(listener);
}

public on<Key extends keyof Events>(
event: Key,
listener: (...args: Events[Key]) => void
) {
if (this.emitted[event] !== undefined) {
listener(...this.emitted[event]!);
}
super.on(event, listener);
}
}
5 changes: 5 additions & 0 deletions packages/common/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,9 @@ export * from "./trees/MerkleTreeStore";
export * from "./trees/InMemoryMerkleTreeStorage";
export * from "./trees/RollupMerkleTree";
export * from "./events/EventEmitterProxy";
export * from "./events/ReplayingSingleUseEventEmitter";
export * from "./trees/MockAsyncMerkleStore";
export * from "./compiling/AtomicCompileHelper";
export * from "./compiling/CompileRegistry";
export * from "./compiling/CompilableModule";
export * from "./compiling/services/ChildVerificationKeyService";
Loading
Loading