diff --git a/packages/indexer/src/tasks/IndexBlockTask.ts b/packages/indexer/src/tasks/IndexBlockTask.ts index 96d92677c..6e7bdc5ba 100644 --- a/packages/indexer/src/tasks/IndexBlockTask.ts +++ b/packages/indexer/src/tasks/IndexBlockTask.ts @@ -1,5 +1,6 @@ import { BlockQueue, + task, Task, TaskSerializer, TaskWorkerModule, @@ -13,6 +14,7 @@ import { } from "./IndexBlockTaskParameters"; @injectable() +@task() export class IndexBlockTask extends TaskWorkerModule implements Task diff --git a/packages/sequencer/src/protocol/production/tasks/BlockReductionTask.ts b/packages/sequencer/src/protocol/production/tasks/BlockReductionTask.ts index 24b5423a0..0e787e747 100644 --- a/packages/sequencer/src/protocol/production/tasks/BlockReductionTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/BlockReductionTask.ts @@ -11,7 +11,10 @@ import { ProvableMethodExecutionContext, } from "@proto-kit/common"; -import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule"; +import { + task, + TaskWorkerModule, +} from "../../../worker/worker/TaskWorkerModule"; import { Task, TaskSerializer } from "../../../worker/flow/Task"; import { PairProofTaskSerializer, @@ -21,6 +24,7 @@ import { @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class BlockReductionTask extends TaskWorkerModule implements Task, BlockProof> diff --git a/packages/sequencer/src/protocol/production/tasks/NewBlockTask.ts b/packages/sequencer/src/protocol/production/tasks/NewBlockTask.ts index ff85dafb2..718caffc9 100644 --- a/packages/sequencer/src/protocol/production/tasks/NewBlockTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/NewBlockTask.ts @@ -26,7 +26,10 @@ import { import { Task, TaskSerializer } from "../../../worker/flow/Task"; import { ProofTaskSerializer } from "../../../helpers/utils"; -import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule"; +import { + task, + TaskWorkerModule, +} from "../../../worker/worker/TaskWorkerModule"; import { PairingDerivedInput } from "../flow/ReductionTaskFlow"; import type { TaskStateRecord } from "../tracing/BlockTracingService"; @@ -57,6 +60,7 @@ export type NewBlockProvingParameters = PairingDerivedInput< @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class NewBlockTask extends TaskWorkerModule implements Task diff --git a/packages/sequencer/src/protocol/production/tasks/RuntimeProvingTask.ts b/packages/sequencer/src/protocol/production/tasks/RuntimeProvingTask.ts index 3fe0756d3..61216829e 100644 --- a/packages/sequencer/src/protocol/production/tasks/RuntimeProvingTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/RuntimeProvingTask.ts @@ -14,7 +14,10 @@ import { CompileRegistry } from "@proto-kit/common"; import { Task, TaskSerializer } from "../../../worker/flow/Task"; import { ProofTaskSerializer } from "../../../helpers/utils"; -import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule"; +import { + task, + TaskWorkerModule, +} from "../../../worker/worker/TaskWorkerModule"; import { PreFilledStateService } from "../../../state/prefilled/PreFilledStateService"; import { PendingTransaction } from "../../../mempool/PendingTransaction"; import { TaskStateRecord } from "../tracing/BlockTracingService"; @@ -31,6 +34,7 @@ export interface RuntimeProofParameters { @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class RuntimeProvingTask extends TaskWorkerModule implements Task diff --git a/packages/sequencer/src/protocol/production/tasks/StateTransitionReductionTask.ts b/packages/sequencer/src/protocol/production/tasks/StateTransitionReductionTask.ts index 940f1faaa..163100f57 100644 --- a/packages/sequencer/src/protocol/production/tasks/StateTransitionReductionTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/StateTransitionReductionTask.ts @@ -11,7 +11,10 @@ import { ProvableMethodExecutionContext, } from "@proto-kit/common"; -import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule"; +import { + task, + TaskWorkerModule, +} from "../../../worker/worker/TaskWorkerModule"; import { Task, TaskSerializer } from "../../../worker/flow/Task"; import { PairProofTaskSerializer, @@ -21,6 +24,7 @@ import { @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class StateTransitionReductionTask extends TaskWorkerModule implements Task, StateTransitionProof> diff --git a/packages/sequencer/src/protocol/production/tasks/StateTransitionTask.ts b/packages/sequencer/src/protocol/production/tasks/StateTransitionTask.ts index 532a0d5d4..503fbb534 100644 --- a/packages/sequencer/src/protocol/production/tasks/StateTransitionTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/StateTransitionTask.ts @@ -14,11 +14,15 @@ import { ProvableMethodExecutionContext, CompileRegistry, LinkedMerkleTreeWitness, + dependencyFactory, } from "@proto-kit/common"; import { Task, TaskSerializer } from "../../../worker/flow/Task"; import { ProofTaskSerializer } from "../../../helpers/utils"; -import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule"; +import { + task, + TaskWorkerModule, +} from "../../../worker/worker/TaskWorkerModule"; import { StateTransitionParametersSerializer } from "./serializers/StateTransitionParametersSerializer"; @@ -31,6 +35,8 @@ export interface StateTransitionProofParameters { @injectable() @scoped(Lifecycle.ContainerScoped) +@task() +@dependencyFactory() export class StateTransitionTask extends TaskWorkerModule implements Task @@ -61,6 +67,14 @@ export class StateTransitionTask ); } + public static dependencies() { + return { + // STProverCompileTask: { + // useClass: STProverCompileTask, + // }, + }; + } + public async compute( input: StateTransitionProofParameters ): Promise { diff --git a/packages/sequencer/src/protocol/production/tasks/TransactionProvingTask.ts b/packages/sequencer/src/protocol/production/tasks/TransactionProvingTask.ts index 5f6896b99..8ec7a8868 100644 --- a/packages/sequencer/src/protocol/production/tasks/TransactionProvingTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/TransactionProvingTask.ts @@ -18,7 +18,10 @@ import { import { ProofTaskSerializer } from "../../../helpers/utils"; import { TaskSerializer, Task } from "../../../worker/flow/Task"; import { PreFilledStateService } from "../../../state/prefilled/PreFilledStateService"; -import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule"; +import { + task, + TaskWorkerModule, +} from "../../../worker/worker/TaskWorkerModule"; import type { TaskStateRecord } from "../tracing/BlockTracingService"; import { TransactionProvingTaskParameterSerializer } from "./serializers/TransactionProvingTaskParameterSerializer"; @@ -49,6 +52,7 @@ export async function executeWithPrefilledStateService( @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class TransactionProvingTask extends TaskWorkerModule implements Task diff --git a/packages/sequencer/src/protocol/production/tasks/TransactionReductionTask.ts b/packages/sequencer/src/protocol/production/tasks/TransactionReductionTask.ts index 46e5ddac9..f23bc5ee4 100644 --- a/packages/sequencer/src/protocol/production/tasks/TransactionReductionTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/TransactionReductionTask.ts @@ -11,7 +11,10 @@ import { ProvableMethodExecutionContext, } from "@proto-kit/common"; -import { TaskWorkerModule } from "../../../worker/worker/TaskWorkerModule"; +import { + task, + TaskWorkerModule, +} from "../../../worker/worker/TaskWorkerModule"; import { Task, TaskSerializer } from "../../../worker/flow/Task"; import { PairProofTaskSerializer, @@ -21,6 +24,7 @@ import { @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class TransactionReductionTask extends TaskWorkerModule implements Task, TransactionProof> diff --git a/packages/sequencer/src/protocol/production/tasks/compile/ProtocolCompileTask.ts b/packages/sequencer/src/protocol/production/tasks/compile/ProtocolCompileTask.ts index dc2b59001..592867ad5 100644 --- a/packages/sequencer/src/protocol/production/tasks/compile/ProtocolCompileTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/compile/ProtocolCompileTask.ts @@ -6,6 +6,8 @@ import { Protocol, } from "@proto-kit/protocol"; +import { task } from "../../../../worker/worker/TaskWorkerModule"; + import { CircuitCompileTask } from "./CircuitCompileTask"; @injectable() @@ -33,6 +35,7 @@ export class ProtocolCompileTask extends CircuitCompileTask { } @injectable() +@task() export class BlockProverCompileTask extends ProtocolCompileTask { public getTargetProtocolModule() { return "BlockProver"; @@ -40,6 +43,7 @@ export class BlockProverCompileTask extends ProtocolCompileTask { } @injectable() +@task() export class STProverCompileTask extends ProtocolCompileTask { public getTargetProtocolModule() { return "StateTransitionProver"; @@ -47,6 +51,7 @@ export class STProverCompileTask extends ProtocolCompileTask { } @injectable() +@task() export class TransactionProverCompileTask extends ProtocolCompileTask { public getTargetProtocolModule() { return "TransactionProver"; diff --git a/packages/sequencer/src/protocol/production/tasks/compile/RuntimeCompileTask.ts b/packages/sequencer/src/protocol/production/tasks/compile/RuntimeCompileTask.ts index 3002c9137..5b6e919e1 100644 --- a/packages/sequencer/src/protocol/production/tasks/compile/RuntimeCompileTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/compile/RuntimeCompileTask.ts @@ -7,10 +7,13 @@ import { Protocol, } from "@proto-kit/protocol"; +import { task } from "../../../../worker/worker/TaskWorkerModule"; + import { CircuitCompileTask } from "./CircuitCompileTask"; @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class RuntimeCompileTask extends CircuitCompileTask { public name = "compile-runtime"; diff --git a/packages/sequencer/src/protocol/production/tasks/compile/SettlementCompileTask.ts b/packages/sequencer/src/protocol/production/tasks/compile/SettlementCompileTask.ts index 9fbfa1168..d02746cf7 100644 --- a/packages/sequencer/src/protocol/production/tasks/compile/SettlementCompileTask.ts +++ b/packages/sequencer/src/protocol/production/tasks/compile/SettlementCompileTask.ts @@ -18,11 +18,13 @@ import { } from "@proto-kit/protocol"; import { BatchProducerModule } from "../../BatchProducerModule"; +import { task } from "../../../../worker/worker/TaskWorkerModule"; import { CircuitCompileTask } from "./CircuitCompileTask"; @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class SettlementCompileTask extends CircuitCompileTask { public name = "compile-settlement"; diff --git a/packages/sequencer/src/settlement/tasks/SettlementProvingTask.ts b/packages/sequencer/src/settlement/tasks/SettlementProvingTask.ts index c21d08d05..a607d533c 100644 --- a/packages/sequencer/src/settlement/tasks/SettlementProvingTask.ts +++ b/packages/sequencer/src/settlement/tasks/SettlementProvingTask.ts @@ -39,7 +39,7 @@ import { DynamicProofTaskSerializer, } from "../../helpers/utils"; import { Task, TaskSerializer } from "../../worker/flow/Task"; -import { TaskWorkerModule } from "../../worker/worker/TaskWorkerModule"; +import { task, TaskWorkerModule } from "../../worker/worker/TaskWorkerModule"; import { ContractRegistry } from "./ContractRegistry"; @@ -74,6 +74,7 @@ export class SomeProofSubclass extends Proof { */ @injectable() @scoped(Lifecycle.ContainerScoped) +@task() export class SettlementProvingTask extends TaskWorkerModule implements Task diff --git a/packages/sequencer/src/worker/startup/WorkerRegistrationTask.ts b/packages/sequencer/src/worker/startup/WorkerRegistrationTask.ts index 370d95b5e..d5343b15e 100644 --- a/packages/sequencer/src/worker/startup/WorkerRegistrationTask.ts +++ b/packages/sequencer/src/worker/startup/WorkerRegistrationTask.ts @@ -27,6 +27,7 @@ import { } from "../../protocol/production/tasks/serializers/ArtifactionRecordSerializer"; import { SignedSettlementPermissions } from "../../settlement/permissions/SignedSettlementPermissions"; import { ProvenSettlementPermissions } from "../../settlement/permissions/ProvenSettlementPermissions"; +import { task } from "../worker/TaskWorkerModule"; import { CloseWorkerError } from "./CloseWorkerError"; @@ -39,6 +40,7 @@ export type WorkerStartupPayload = { }; @injectable() +@task() export class WorkerRegistrationTask extends AbstractStartupTask implements Task diff --git a/packages/sequencer/src/worker/worker/FlowTaskWorker.ts b/packages/sequencer/src/worker/worker/FlowTaskWorker.ts index 3c8fbdf2b..c86d47654 100644 --- a/packages/sequencer/src/worker/worker/FlowTaskWorker.ts +++ b/packages/sequencer/src/worker/worker/FlowTaskWorker.ts @@ -12,16 +12,14 @@ const errors = { }; // Had to use any here, because otherwise you couldn't assign any tasks to it -export class FlowTaskWorker< - Tasks extends Task[], -> implements Closeable { +export class FlowTaskWorker implements Closeable { private readonly queue: TaskQueue; private workers: Record = {}; public constructor( mq: TaskQueue, - private readonly tasks: Tasks + private readonly tasks: Task[] ) { this.queue = mq; } diff --git a/packages/sequencer/src/worker/worker/LocalTaskWorkerModule.ts b/packages/sequencer/src/worker/worker/LocalTaskWorkerModule.ts index fc81159e8..8eb202a7f 100644 --- a/packages/sequencer/src/worker/worker/LocalTaskWorkerModule.ts +++ b/packages/sequencer/src/worker/worker/LocalTaskWorkerModule.ts @@ -7,8 +7,6 @@ import { ModulesRecord, NoConfig, Presets, - ResolvableModules, - StringKeyOf, TypedClass, } from "@proto-kit/common"; import { ReturnType } from "@proto-kit/protocol"; @@ -70,9 +68,7 @@ export class LocalTaskWorkerModule public containerEvents = new EventEmitter(); - private worker?: FlowTaskWorker< - InstanceType[StringKeyOf]>[] - > = undefined; + private worker?: FlowTaskWorker = undefined; public static from( modules: Tasks @@ -104,14 +100,14 @@ export class LocalTaskWorkerModule return this.container.resolve("TaskQueue"); } + public tasks() { + return this.container.resolveAll>("Task"); + } + public async start(): Promise { - const tasks = this.moduleNames.map((moduleName) => { - this.assertIsValidModuleName(moduleName); + const tasks = this.tasks(); - const task = this.resolve(moduleName); - log.debug(`Resolved task ${task.name}`); - return task; - }); + log.debug(`Resolved tasks ${tasks.map((t) => t.name)}`); const worker = new FlowTaskWorker(this.taskQueue(), [...tasks]); this.worker = worker; diff --git a/packages/sequencer/src/worker/worker/TaskWorkerModule.ts b/packages/sequencer/src/worker/worker/TaskWorkerModule.ts index d2f46144d..9fd8acdac 100644 --- a/packages/sequencer/src/worker/worker/TaskWorkerModule.ts +++ b/packages/sequencer/src/worker/worker/TaskWorkerModule.ts @@ -1,5 +1,11 @@ -import { ConfigurableModule, NoConfig } from "@proto-kit/common"; +import { ConfigurableModule, implement, NoConfig } from "@proto-kit/common"; + +import { Task } from "../flow/Task"; export abstract class TaskWorkerModule< Config = NoConfig, > extends ConfigurableModule {} + +export function task() { + return implement>("Task"); +}