Skip to main content
这一页告诉你从克隆仓库到本机跑起一个 worker 需要什么。BlockX 是一个 Go 工作区,python/ 目录放 Python executor 与 SDK。整体架构见 架构总览,目录分层见 仓库结构

前置依赖

外部服务在本地开发中都有替身,不需要先搭 etcd、BlockDB、Meta 或链节点:

快速开始

1

克隆并下载 Go 依赖

私有模块下载失败时先确认 git 能访问 github.com/Chaintable/*;CI 里通过 GOPRIVATE=github.com/Chaintable/* 和 token 注入解决。
2

安装 Python 依赖

这会在 python/.venv/ 建 venv。internal/testutil/paths.gopythonBin() 按顺序找 /tmp/blockx-venv/bin/pythonpython/.venv/bin/python,都没有才退回 python3。venv 缺失时所有 process E2E 会被跳过而不是失败。
3

编译与单元测试

首次编译 cmd/worker 会链接 DuckDB 静态库,比其他包慢很多;之后走构建缓存。go test ./... 会连带跑 process / contract / system E2E(它们不检查 -short),需要上一步的 venv;e2e/perf 默认被 TestMain 跳过。只想跑纯单测用 go test ./internal/... ./api/...
4

跑 Python 单测

5

在本机拉起一个 worker

下面这组变量来自 internal/testutil/worker.goStartWorkerAt,是 process E2E 启动真实 worker 用的最小集合:
日志出现 worker listeningexecutor started 即成功。各项含义:
  • ETCD_ENDPOINTS=none:不注册到 etcd,也就没有 Coordinator 参与;客户端直接对 worker 调 RequestTaskSlot / SubmitTask
  • ICEBERG_NAMESPACEWorkerFullConfig.Validate 要求非空(internal/worker/app/config.go)。
  • BLOCKDB_BATCH_WRITE_ADDRcmd/worker 的 block profile 注册了 BundleWrite plugin,validateProfileRuntimeConfig 要求该地址非空;本地填一个不可达端口即可。
  • STUB_BLOCKDB_DELAY_MS=0:一旦设置了任何 BLOCKDB_*_ADDR,worker 会认为 BlockDB 是真实的;这个变量把读路径切回 devstub。
要提交一个 task 验证链路,按 examples/local_test_service/README.mdlocal_proxy.py 再跑 submit.py。也可以直接跑一条 process E2E 看真实调用:
worker 必须按上面这组变量启动。少了 ICEBERG_NAMESPACEBLOCKDB_BATCH_WRITE_ADDR,进程会在配置校验阶段直接退出。

Makefile 目标

环境变量与配置文件

worker 的加载顺序在 internal/worker/app/app.go 里:DefaultWorkerFullConfig() → profile 的 TuneDefaultsWORKER_CONFIG 指向的 JSON 文件(LoadWorkerFullConfigFrom)→ 环境变量覆盖。JSON 字段名与 WorkerFullConfigjson tag 一致,示例见 blockx 仓库 docs/deploy.md §9.3。coordinator 只读环境变量,没有配置文件(internal/coordinator/app/config.goLoadCoordinatorRuntimeConfigFromEnv)。 本地开发最常碰到的变量: 完整表(含 AIMD、gRPC keepalive、Iceberg cache 等几十项)见 blockx 仓库 docs/deploy.md §9;deploy/env/worker.env.example 是 EC2 部署用的 env 文件样例,包含大量宿主机脚本才读的键,不适合直接拿来本地跑。

代码生成

改了 .proto 后重新生成 Go 绑定:
Makefile 会把 $(go env GOBIN)(或 $(go env GOPATH)/bin)加进 PATH,所以插件装在默认位置即可。proto 源文件位置:api/grpc/*/internal/sdk/{blockdb,meta,localtestservice}/proto/。生成结果要一起提交。

常见问题

internal/testutil/python.goRequirePythonModules 会用探测到的解释器试 import,失败就 t.Skipcmd/worker 的 process E2E 要求 greenlet, blockx_sdk, blockx_executor, blockdb, blockx, leafage, chaintable 七个模块都能导入(cmd/worker/worker_process_helpers_test.go),后四个来自 pyproject.toml 里的私有 git 依赖。先 uv sync --project python,并确认 python/.venv/bin/python 存在。
这是 CGO_ENABLED=0 的症状。worker 与 bundle_worker 必须开 CGO,并且机器上要有 C 编译器。首次链接较慢属正常。
看错误串:icebergNamespace must not be emptyICEBERG_NAMESPACEplugin BlockBundleWriteResultHandler requires blockdb.batchWriteAddrBLOCKDB_BATCH_WRITE_ADDR;usage 相关错误补 BLOCKX_USAGE_DISABLED=true
检查 ETCD_ENDPOINTS 是否指向同一个 etcd,以及 WORKER_ADDR 是否是 Coordinator 可达的地址;容器网络隔离时必须显式设置(docs/deploy.md §7)。本地单机调试可以直接 ETCD_ENDPOINTS=none 绕过 Coordinator。
确认 PYTHON_BIN 指向的解释器能 import blockx_executorPYTHONPATH 要包含 python/)。默认值 python3 通常是系统解释器,缺 greenlet 等依赖。
这些是私有模块。配置 git 凭据(例如 git config --global url."git@github.com:".insteadOf "https://github.com/"),并设 GOPRIVATE=github.com/Chaintable/*。Python 侧的 blockx-py 等也是私有 git 依赖,同样需要凭据。

相关文档

  • 测试:各测试层的命令、耗时与前置条件。
  • 贡献流程:提交与 PR 约定。
  • 仓库结构cmd/internal/api/python/ 各放什么。
  • 部署概览:镜像构建与 EC2 运行形态。
  • blockx 仓库 docs/deploy.md:完整环境变量表、Docker 启动示例与常见问题。
  • blockx 仓库 AGENTS.md:构建、测试与协作约定的权威清单。