Steem dev 分支部署测试网络文档steemCreated with Sketch.

in #testnet16 hours ago (edited)

文档信息

  • 代码基线:steemit/steem 仓库 dev 分支,HEAD = 088c93b446931732922c4acf9280bb966f3f5286("pre-migration: commit all changes",2026-06-22,作者 ety001)
  • 撰写日期:2026-07-28
  • 姊妹篇:《Steem 测试网启动详细教程》(基于 main 分支 b2f8567),本文中简称「main 教程」,引用其章节号写作「main 教程 §X.Y」
  • 事实来源:本文所有技术事实出自三份输入——dev 分支部署事实清单(标注为 dev 分支 路径:行号)、main 分支源码事实清单(同样以路径行号标注,dev 与 main 在共识层逐字节相同,故行号两分支通用,个别差异会注明)、main 教程。未在三份输入中出现的内容不会出现在本文中。
  • 读者前提:Steem 生态维护者(本人即 dev 分支迁移提交的作者),熟悉 Linux / Docker / C++ 构建。文中命令均可逐行复制执行。

1. dev 分支是什么

1.1 定位

dev 是 steemit/steem 当前活跃开发分支。自 main(b2f8567,2025-04-23)之后,dev 上新增了 11 个提交(PR #3699–#3707 共 9 个合并提交 + 无 PR 号的 b9fbf5f + HEAD 提交 088c93b),内容全部是构建系统 / CI 现代化迁移,不含任何共识代码变更。

提交历史(git log --oneline,从新到旧):

提交说明
088c93bpre-migration: commit all changes(HEAD,2026-06-22;仅新增 .dockerignorescripts/deploy_regression.shscripts/rpc_regression_test.sh 两个 EC2 回归脚本,git show --stat 验证 3 文件 +242 行)
b9fbf5fRemove EOL Ubuntu 20.04 from CI matrix
496cb88Enable Basic Tests and Use 4 Theads to Build (#3707)
aa4b202Init Pipeline (#3706)(新增 .github/workflows/build-steemd.yml
2b653e4Fixes and Refactor the Docker files (#3705)
5309b3fCompile steemd on Debian 13 (Trinx) (#3703)
19429e6Fix test_block_log (#3704)
ba57a33Make Steem Great Again: Support AzureLinux3! (#3702)
6f3650aMake steemd compiled at Ubuntu24.04 (#3701)
daac5d5Add Ubuntu 22.04 Support for steemd (#3700)
bb537ccRefactor and Cleanup: Ubuntu20.04 and Remove Ubuntu18.04 (#3699)
b2f8567decrease fullnode p2p log output(= main HEAD,对比基准)

1.2 迁移内容四项

  1. C++14 → C++17CMakeLists.txt:6-8 设置 CMAKE_CXX_STANDARD 17CMAKE_CXX_STANDARD_REQUIRED ON(main 为 CMAKE_CXX_STANDARD 14,CMakeLists.txt:5)。
  2. vendor 依赖改回 5 个真正的 git 子模块:main 上 3 个 vendor 目录已 vendored 进树(普通 tree,submodule update 是空操作);dev 上变为 5 个真 gitlink(160000),新增 rocksdb 与 cyoencode 两个子模块(.gitmodules:10-15git ls-tree HEAD 验证)。
  3. 旧根 Dockerfile 三件套删除 → deploy/ 下 7 个新 Dockerfile:根目录 DockerfileDockerfile.newBuilder.DockerFile 全部移除,替换为 deploy/Dockerfile.{ubuntu20.04,ubuntu22.04,ubuntu24.04,debian13,azurelinux3.0,ci.tests,smoketests}
  4. 新增 GitHub Actions.github/workflows/build-steemd.yml(PR #3706),matrix 构建 4 个发行版镜像并在构建内跑单元测试(详见第 6 章)。

1.3 关键结论:部署变了,链行为没变

共识层与 main 逐字节一致,经 diff 验证:

  • libraries/protocol/include/steem/protocol/config.hpp:完全一致(链 ID、initminer 密钥、TESTNET_BLOCK_LIMIT 等常量零变化)。
  • libraries/protocol/hardfork.d/diff -rq 完全一致,无新增 .hf 文件。
  • libraries/chain/database.cpp:不在 main↔dev diff 列表中;1 号块自动激活全部硬分叉的机制仍在 database.cpp:3302-3336。
  • IS_TEST_NET 文件清单:两分支 grep -rl "IS_TEST_NET" 后 diff,清单完全一致,无新增测试网专属行为文件。

唯一与链行为沾边的差异是主网 p2p 默认种子列表更新p2p_default_seeds.hpp:删除 seed-east/central/west.steemit.com 等失效节点,新增 seed.steemworld.org、seed.moecki.online 等现役社区种子;doc/seednodes.txt 同步更新)——仅影响主网互联,测试网无影响(测试网默认种子仍为空列表,p2p_default_seeds.hpp:6-8 的 #ifdef IS_TEST_NET 分支未动)。

因此:测试网最小配置、initminer 密钥、1 号块激活全部硬分叉机制、cli_wallet 操作等,全部沿用 main 教程 §4 的结论,本文不重复展开,只做引用。

1.4 main vs dev 部署差异总表(部署行动视角)

#你要做的事main 时代dev 时代
1选编译器gcc ≥ 4.8 即可(C++14)实践 gcc ≥ 9(C++17 + STANDARD_REQUIRED,CMakeLists.txt:6-8;CI 用 gcc 11/13/14)
2克隆后submodule update 是空操作,可跳过必须 git submodule update --init --recursive,否则编译必败
3准备 Boost系统包 1.65(Ubuntu 18.04)最低 1.78(doc/building.md:15);20.04/22.04/azurelinux 需源码编译,24.04/debian13 用系统包
4打源码补丁不需要新 gcc(11/13/14)手工构建必须打 patches/ 下对应补丁
5Docker 构建docker build -t steemit/steem .docker build -f deploy/Dockerfile.<发行版> .(根目录已无默认 Dockerfile)
6构建测试网镜像根 Dockerfile 内置 steemd-testnet必须显式 --build-arg BUILD_STEEM_TESTNET=ON(默认 OFF = 主网 MIRA 低内存版)
7跑节点容器docker run steemit/steem(entrypoint 自动起节点)新镜像无 ENTRYPOINT,必须显式给 steemd 命令行
8CI 验证Jenkinsfile/circle.yml/cloudbuild.yaml(均指向已删除的旧 Dockerfile,实际不可用)复用 .github/workflows/build-steemd.yml(GitHub Actions,4 发行版 matrix + 单测)
9支持平台Ubuntu 16.04 首选、18.04 Docker、macOSUbuntu 20.04/22.04/24.04、Debian 13、AzureLinux 3.0(doc/building.md:5-12);16.04/14.04 文档已删除
10共识/测试网行为与 main 逐字节相同,直接引用 main 教程 §4

2. 环境准备

2.1 支持平台矩阵

dev 的 doc/building.md 新增 "Supported OS" 一节(:5-12),列出 5 个 Dockerfile 链接,并称「本地构建请安装对应 Dockerfile 里的依赖」。Ubuntu 16.04/14.04 的构建说明已整段删除,老系统教程作废。

各平台编译工具链版本(出处:deploy/*.Dockerfile 基础镜像与包安装段):

平台DockerfilegcccmakeBoost 来源
Ubuntu 20.04deploy/Dockerfile.ubuntu20.0493.16源码编译 1.78.0(Dockerfile.ubuntu20.04:66-79,archives.boost.io,sha256=94ced8b7…63be7 校验)
Ubuntu 22.04deploy/Dockerfile.ubuntu22.04113.22源码编译 1.78.0(Dockerfile.ubuntu22.04:64-77;注释:系统自带为 1.74)
Ubuntu 24.04deploy/Dockerfile.ubuntu24.04133.28系统包 libboost-all-dev(1.83)
Debian 13 (trixie)deploy/Dockerfile.debian13143.31系统包 libboost-all-dev(1.83)
AzureLinux 3.0deploy/Dockerfile.azurelinux3.0tdnf 安装tdnf 安装源码编译 1.78.0(Dockerfile.azurelinux3.0:81-94;注释:"Azure Linux 3.0 does not have a fixed default version of the Boost")

注意:dev 的 doc/building.md 中 macOS 一节(boost160 Homebrew 流程)原样保留,与新 Boost ≥1.78 要求矛盾,属陈旧内容;Windows 一节改为 "use WSL2 with Docker Desktop"(doc/building.md:138)。

2.2 硬件

  • 编译内存 8GB RAM(doc/building.md:3,与 main 相同)。
  • 内存不足时的 4GB swap 补救方案,见 main 教程 §2.2,命令可直接照抄,此处不重复。

2.3 Boost 红线

  • 文档明确最低 Boost 1.78(doc/building.md:15 新增 "Boost version" 一节)。
  • 注意:根 CMakeLists.txt:158 仍写 FIND_PACKAGE(Boost 1.58 REQUIRED ...)——CMake 层面的最低版本声明没有改,实际要求 1.78 只写在文档和 Dockerfile 里,勿被 1.58 误导。
  • Boost ≥ 1.69 时 CMake 会追加 -fvisibility=hidden(CMakeLists.txt:161-164,与 main 相同的既有逻辑)。

各平台 Boost 来源一览:

平台Boost 版本获取方式
Ubuntu 20.04 / 22.041.78.0源码编译(Dockerfile 内从 archives.boost.io 下载,sha256 校验后 bootstrap + b2 安装)
AzureLinux 3.01.78.0同上,源码编译
Ubuntu 24.041.83apt install libboost-all-dev
Debian 131.83apt install libboost-all-dev

手工构建时,若在 20.04/22.04/AzureLinux 上,需照抄对应 Dockerfile 的 Boost 源码编译段自行安装 Boost 1.78;24.04/debian13 直接装系统包即可。

2.4 C++17 编译器要求

  • CMAKE_CXX_STANDARD 17 + CMAKE_CXX_STANDARD_REQUIRED ON(CMakeLists.txt:6-8):不支持 C++17 的旧编译器(gcc < 7)直接不可用。
  • 实践矩阵:gcc 9(ubuntu20.04)、gcc 11(ubuntu22.04)、gcc 13(ubuntu24.04)、gcc 14(debian13)均可构建(对应 Dockerfile 即证据)。AzureLinux 3.0 用 tdnf 安装 gcc/gcc-c++。
  • 注意:CMakeLists.txt 里 GCC ≥ 4.8 / Clang ≥ 3.3 的版本检查(:17-24)逐字保留未改,形同虚设——真正门槛是 C++17。

3. 获取源码与子模块初始化(dev 最大行为差异)

3.1 克隆 dev 分支

git clone --branch dev https://github.com/steemit/steem.git
cd steem
git rev-parse HEAD
# 应输出 088c93b446931732922c4acf9280bb966f3f5286(本文基线)

3.2 子模块初始化是必须步骤

这是 dev 相对 main 最大的行为差异:main 上 3 个 vendor 目录已 vendored 进树(git ls-tree 显示 040000 tree),git submodule update --init --recursive 是空操作;dev 上 5 个路径全部是真 gitlink(160000 commitgit ls-tree HEAD 验证),不初始化则这些目录为空,cmake/make 必然失败。

git submodule update --init --recursive

5 个子模块(.gitmodules;固定提交由 gitlink 记录):

路径上游仓库pin 的提交说明
libraries/fc/vendor/diff-match-patch-cpp-stlgithub.com/leutloff/diff-match-patch-cpp-stlba3bbe3cdba5d461e241b756a50085c3602a3b5amain 已有(原为 vendored)
libraries/fc/vendor/secp256k1-zkpgithub.com/cryptonomex/secp256k1-zkpbd067945ead3b514fba884abd0de95fc4b5db9aemain 已有(原为 vendored)
libraries/fc/vendor/websocketppgithub.com/zaphoyd/websocketpp4dfe1be74e684acca19ac1cf96cce0df9eac2a2dmain 已有(原为 vendored)
libraries/vendor/rocksdbgithub.com/facebook/rocksdb1601da40496d456419bb23946bbea4ceb1bd9d78dev 新增(.gitmodules:10-12)
libraries/fc/vendor/cyoencodegithub.com/calzakk/CyoEncode245586e86d8308d911694853a43bde919a44c56fdev 新增(.gitmodules:13-15)

3.3 rocksdb 与 cyoencode 是什么、被谁用

  • rocksdb:Facebook 的 LSM-tree KV 存储,是 MIRA(ENABLE_MIRA=ON)的状态存储后端。使用方式与 main 完全相同:libraries/vendor/CMakeLists.txt GLOB 子目录并 add_subdirectory,mira 链接 rocksdb target(libraries/mira/CMakeLists.txt:56,与 main 逐字相同)。main 上它也是 vendored 代码,dev 只是把它从「拷进树」改回「子模块引用」。
    • 注意:即使 Ubuntu 24.04 的 Dockerfile 安装了系统包 librocksdb-dev(Dockerfile.ubuntu24.04:66)并传了 -DUSE_VENDORED_ROCKSDB=OFF(Dockerfile.ubuntu24.04:79),该参数在全库 CMake 中没有任何定义(grep 验证),被静默忽略——实际仍编译 vendored rocksdb 子模块。所以 rocksdb 子模块在任何平台上都是必需的。
  • cyoencode:C 语言 base64 编解码库(CyoEncode/CyoDecode)。fc 把它编译进库:libraries/fc/CMakeLists.txt:241-242vendor/cyoencode/src/CyoDecode.cCyoEncode.c 编入 fc(main 用的路径是 vendored vendor/cyoencode-1.0.2/src/,diff 验证),供 fc/src/crypto/base64.cpp 使用。

3.4 忘记初始化的后果

不执行 submodule 初始化时,websocketpp / secp256k1 / diff-match-patch / rocksdb / cyoencode 五个目录全为空:

  • cmake 配置期即会因找不到子目录的 CMakeLists.txt / 源文件而报错(add_subdirectory 目标不存在);
  • 即便配置侥幸通过,编译期会以「头文件找不到」形态失败(如 websocketpp/... include 缺失、fc 编译时找不到 CyoDecode.c 等)。

自检命令:

git submodule status
# 5 行,每行前缀应为空格(已检出)而非 "-"(未初始化)
ls libraries/vendor/rocksdb/CMakeLists.txt libraries/fc/vendor/cyoencode/src/CyoEncode.c

4. 原生编译(无 Docker)

4.1 依赖安装(按发行版,从对应 Dockerfile 的 apt/tdnf 段提取)

Ubuntu 20.04 / 22.04(deploy/Dockerfile.ubuntu20.04:40-62;22.04 几乎相同):

sudo apt-get update
sudo apt-get install -y \
    git jq build-essential cmake libssl-dev libsnappy-dev \
    python3-jinja2 doxygen autoconf automake libyajl-dev \
    libreadline-dev libtool liblz4-tool ncurses-dev libgflags-dev \
    zlib1g-dev libbz2-dev liblz4-dev libzstd-dev wget

Ubuntu 24.04(deploy/Dockerfile.ubuntu24.04):在上述 20.04/22.04 清单基础上,Boost 改用系统包、额外安装 librocksdb-dev——即去掉源码编译 Boost 的步骤,并:

sudo apt-get update
sudo apt-get install -y libboost-all-dev librocksdb-dev
# 其余基础包照抄 deploy/Dockerfile.ubuntu24.04 的 apt 段(与 20.04/22.04 清单同源)

注意:24.04 尽管安装了系统 librocksdb-dev(Dockerfile.ubuntu24.04:66),实际仍编译 vendored rocksdb 子模块(见 §3.3 的 USE_VENDORED_ROCKSDB 说明)。

Debian 13(deploy/Dockerfile.debian13):与 24.04 同样使用系统 Boost(libboost-all-dev),包差异是以 lz4 替代 liblz4-tool、无 libssl-dev 重复项——基础包照抄 deploy/Dockerfile.debian13 的 apt 段即可。

AzureLinux 3.0(deploy/Dockerfile.azurelinux3.0:41-79,tdnf 包管理,RPM 系包名):

# 包清单照抄 deploy/Dockerfile.azurelinux3.0:41-79,关键包包括:
tdnf install -y gcc gcc-c++ cmake openssl-devel snappy-devel \
    python3-jinja2 yajl-devel readline-devel lz4-devel xz-devel \
    gflags-devel zstd-devel kernel-headers patch
ln -s /usr/bin/make /usr/bin/gmake   # Dockerfile.azurelinux3.0:97
update-ca-trust                      # Dockerfile 内含此步骤

在 20.04 / 22.04 / AzureLinux 上还需按 §2.3 源码编译安装 Boost 1.78.0(步骤照抄对应 Dockerfile 的 Boost 段:下载 → sha256 校验 → bootstrap → b2 install)。

4.2 子模块初始化

git submodule update --init --recursive   # 必须,见第 3 章

4.3 打源码补丁(新 gcc 必需)

dev 新增 patches/ 目录(main 无),共三个补丁,按发行版/gcc 版本选择:

补丁修什么哪些平台需要出处
patches/rocksdb-cmake.patch给 vendored rocksdb 的 CMakeLists.txt 加 add_compile_options(-Wno-error=array-bounds)——gcc 12+ 把 rocksdb 源码的 array-bounds 警告升级为 errorgcc 12+ 的平台:ubuntu24.04、debian13、azurelinux3.0对应 Dockerfile 在 git submodule updategit apply,并带 `echo "Patch already applied…"` 容错
patches/websocketpp-patch-ini-asio.patchinit_asio(io_service_ptr) 从 websocketpp transport/asio/connection.hpp 的 protected 区移到 public 区(配合 webserver/local_endpoint.hpp 的新 Boost.Asio 适配改动)azurelinux3.0、ubuntu20.04、ubuntu22.04、ubuntu24.04同上
patches/websocketpp-cx20-fix.patch完整的 C++20 风格修复:模板类内注入类名做构造/析构函数名(~endpoint<connection,config>() {}~endpoint() {} 等,涉及 endpoint.hpp、logger/basic.hpp、logger/syslog.hpp、roles/server_endpoint.hpp),同时包含 init_asio 迁移仅 debian13(gcc 14 需要完整修复,而不仅是 init_asio)Dockerfile.debian13:73-75

打补丁命令(子模块目录内 git apply,容错写法照抄 Dockerfile):

# gcc 11/13 平台(ubuntu20.04/22.04/24.04、azurelinux3.0):
(cd libraries/fc/vendor/websocketpp && git apply ../../../patches/websocketpp-patch-ini-asio.patch) \
  || echo "Patch already applied, skipping"

# debian13 / gcc 14(改用完整 C++20 修复补丁):
(cd libraries/fc/vendor/websocketpp && git apply ../../../patches/websocketpp-cx20-fix.patch) \
  || echo "Patch already applied, skipping"

# gcc 12+ 平台(ubuntu24.04、debian13、azurelinux3.0):
(cd libraries/vendor/rocksdb && git apply ../../../patches/rocksdb-cmake.patch) \
  || echo "Patch already applied, skipping"

4.4 cmake 配置与编译

mkdir -p build && cd build

# 主网见证人节点版(对齐 deploy/ Dockerfile 的默认参数):
cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=/usr/local/steemd \
      -DSTEEM_STATIC_BUILD=ON \
      -DENABLE_MIRA=ON \
      -DLOW_MEMORY_NODE=ON \
      -DCLEAR_VOTES=ON \
      -DSKIP_BY_TX_ID=ON \
      -DBUILD_STEEM_TESTNET=OFF \
      ..

# 私有测试网版(改用以下配置;单元测试也必须用它,doc/building.md:41):
# cmake -DCMAKE_BUILD_TYPE=Release \
#       -DBUILD_STEEM_TESTNET=ON \
#       -DLOW_MEMORY_NODE=OFF -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON ..

make -j$(nproc) steemd
make -j$(nproc) cli_wallet

cmake 参数逐项说明(deploy/ 各 Dockerfile :4-16 的统一 build-arg 默认值,注释原文:"The default build params are for low memory mira version. This usually are used as a witness node."):

参数默认作用
CMAKE_BUILD_TYPERelease发布构建
STEEM_STATIC_BUILDON静态链接 libstdc++/libgcc(Docker 默认;手工构建可 OFF)
ENABLE_MIRAONRocksDB 状态存储
LOW_MEMORY_NODEON共识-only 低内存节点(见证人/种子推荐)
CLEAR_VOTESON清理共识不再需要的旧投票
SKIP_BY_TX_IDON禁用按交易 id 查询账户历史
BUILD_STEEM_TESTNETOFF私有测试网必须显式 ON;单元测试也必须 ON(doc/building.md:41)
ENABLE_COVERAGE_TESTINGOFF覆盖率
CHAINBASE_CHECK_LOCKINGOFF(Dockerfile 默认)chainbase 锁检查
UNIT_TEST / DOXYGEN / BUILD_TESTINGOFF/OFF/ON仅 Dockerfile 内使用(见第 5 章)
NUMBER_BUILD_THREADS空(缺省 nproc-1)Dockerfile 的 make -j 逻辑,doc/building.md:19-21

其余 OPTION(ENABLE_SMT_SUPPORT、CHAINBASE_CHECK_LOCKING、STEEM_STATIC_BUILD 等)的语义与 main 完全一致,完整速查表见 main 教程 §3.2

常用 util target(与 main 相同,无新工具):chain_testplugin_testmira_testget_dev_keysign_transactiontest_fixed_stringtest_block_logtest_sqrtsize_checkerschema_testjs_operation_serializercat-parts(dev 差异仅两处:programs/util/CMakeLists.txt:35-37sign_transaction 增加链接 equihash——C++17 下符号解析需要;programs/util/test_block_log.cpp 经 19429e6 修复):

make -j$(nproc) get_dev_key sign_transaction chain_test

4.5 已知坑(CMake 层面)

  • 残留 -std=c++11:CMakeLists.txt Linux 分支仍残留 -std=c++11 追加(:205/:230),但 CMAKE_CXX_STANDARD 17 生成的 -std=gnu++17 在编译命令行中位置靠后,靠后生效,实际以 C++17 编译。属残留而非错误,不用处理。
  • -Wno-error=sign-compare:dev 新增 add_compile_options(-Wno-error=sign-compare)(CMakeLists.txt:9),防止新 gcc 下 sign-compare 警告升级为错误。
  • pthread 显式链接:新增 find_package(Threads REQUIRED)(CMakeLists.txt:159)与 -pthread 编译/链接标志(CMakeLists.txt:166-167)。
  • fc 的 git 版本嵌入libraries/fc/CMakeLists.txt:251-264(dev 新增)在 cmake 配置期执行 git rev-parse HEAD / git log -1 --format=%ct 生成 GIT_REVISION_SHA / GIT_REVISION_UNIX_TIMESTAMP 写入 git_revision.cpp——在无 .git 的源码拷贝中配置会丢失版本信息(Docker 构建因 .dockerignore 不排除 .git 而无碍)。

4.6 产物路径

build/programs/steemd/steemd            # 节点守护进程
build/programs/cli_wallet/cli_wallet    # 命令行钱包
build/programs/util/get_dev_key         # 密钥派生工具
build/programs/util/sign_transaction    # 交易签名工具
build/tests/chain_test                  # 单元测试(须 BUILD_STEEM_TESTNET=ON 构建)

make install 可选,前缀由 -DCMAKE_INSTALL_PREFIX 决定(Docker 镜像用 /usr/local/steemd)。验证构建是否为测试网版:./programs/steemd/steemd --help | grep chain-id--chain-id 仅 IS_TEST_NET 构建存在,chain_plugin.cpp:353-355)——细节见 main 教程 §3.5


5. Docker 构建与部署(核心章节)

5.1 deploy/ 七镜像分工

dev 删除根目录旧 Dockerfile 三件套(DockerfileDockerfile.newBuilder.DockerFile),替换为 deploy/ 下 7 个 Dockerfile:

Dockerfile基础镜像定位补丁CI matrix
Dockerfile.ubuntu20.04ubuntu:20.04(gcc 9)生产构建(两阶段)init_asio否(b9fbf5f 移出,EOL;文件保留)
Dockerfile.ubuntu22.04ubuntu:22.04(gcc 11)生产构建init_asio
Dockerfile.ubuntu24.04ubuntu:24.04(gcc 13)生产构建init_asio + rocksdb
Dockerfile.debian13debian:13 trixie(gcc 14)生产构建cx20-fix + rocksdb
Dockerfile.azurelinux3.0azurelinux/base/core:3.0生产构建init_asio + rocksdb
Dockerfile.ci.testsubuntu:18.04(gcc 7,Boost 1.65)CI 单测(构建后跑 chain_test/plugin_test/test_fixed_string)不打否(疑不可用,见 §5.7)
Dockerfile.smoketestsphusion/baseimage:0.11(Ubuntu 18.04,gcc 7)冒烟测试,内置 testnet 构建不打否(疑已坏,见 §5.7)

五个生产 Dockerfile 的通用结构(ci.tests/smoketests 除外):两阶段(builder + final);builder 阶段 ADD . /usr/local/srcgit submodule update --init --recursive → git apply 补丁 → cmake -DCMAKE_INSTALL_PREFIX=/usr/local/steemd …make -j$NUMBER_BUILD_THREADS(缺省 nproc-1)→ make install → 可选单测 → 可选 doxygen;final 阶段仅 COPY --from=builder /usr/local/steemd /usr/local/steemd + 安装运行时库(libsnappy-dev、libreadline-dev)。

与 main 旧镜像的对应关系:

maindev关系
Dockerfile(phusion 冒烟 + 三配置安装)deploy/Dockerfile.smoketests搬迁,仅删 ARG BUILD_TAG=0.23.x 一行
Dockerfile.new(ubuntu:18.04 单阶段)五个生产 Dockerfile替代/升级:两阶段、新发行版、新 Boost、入 PATH;失去 entrypoint/EXPOSE 直接起节点的能力
Builder.DockerFiledeploy/Dockerfile.ci.tests替代(但缺 submodule 步骤,疑不可用)
根目录直接 docker build .无默认 Dockerfile必须 -f deploy/…(doc/building.md:55 的示例有笔误,见 §8)

5.2 构建命令模板

docker build -f deploy/Dockerfile.<名> \
  --build-arg NUMBER_BUILD_THREADS=N \
  --build-arg UNIT_TEST=ON|OFF \
  --build-arg BUILD_STEEM_TESTNET=ON|OFF \
  -t steem:<标记> .

统一的 build-arg 默认值(各文件 :4-16;注释原文:"The default build params are for low memory mira version. This usually are used as a witness node."):

CMAKE_BUILD_TYPE=Release  STEEM_STATIC_BUILD=ON  ENABLE_MIRA=ON  LOW_MEMORY_MODE=ON
CLEAR_VOTES=ON  SKIP_BY_TX_ID=ON  BUILD_STEEM_TESTNET=OFF  ENABLE_COVERAGE_TESTING=OFF
CHAINBASE_CHECK_LOCKING=OFF  UNIT_TEST=OFF  DOXYGEN=OFF  BUILD_TESTING=ON  NUMBER_BUILD_THREADS(空)

默认构建的是「MIRA + 低内存 + 静态链接 + 主网」的见证人节点版。所有 build 参数还会写入镜像内 /etc/build_info 供追溯。

常用实例:

# 主网见证人节点版(全部默认参数):
docker build -f deploy/Dockerfile.ubuntu24.04 -t steem:ubuntu24.04 .

# 私有测试网版(必须显式 BUILD_STEEM_TESTNET=ON,见下节):
docker build -f deploy/Dockerfile.ubuntu24.04 \
  --build-arg BUILD_STEEM_TESTNET=ON --build-arg LOW_MEMORY_MODE=OFF \
  -t steem:testnet .

# CI 同款(带单元测试):
docker build -f deploy/Dockerfile.ubuntu22.04 \
  --build-arg NUMBER_BUILD_THREADS=4 --build-arg UNIT_TEST=ON \
  -t steem:ubuntu22.04 .

5.3 测试网必须显式 BUILD_STEEM_TESTNET=ON

这是 Docker 部署中最容易踩的坑:main 时代根 Dockerfile 内置 testnet 三镜像(steemd-testnet/default/full),测试网二进制开箱即有;dev 的新 Dockerfile 统一以 --build-arg BUILD_STEEM_TESTNET=ON 显式 opt-in,默认 OFF。按 main 教程的思路直接 docker build -f deploy/Dockerfile.ubuntu24.04 .,得到的是主网 MIRA 低内存版,没有 --chain-id 选项、跑不了私有测试网。

唯一例外是 Dockerfile.smoketests,它保留了 main 时代内置的 TESTNET 构建(:74/108/147)——但该镜像在 dev 上疑已坏(见 §5.7),不建议依赖。

5.4 新镜像形态与启动方式

新生产镜像与 main 时代镜像形态差异巨大:

方面main 时代(steemit/steem 预构建镜像)dev 新镜像
阶段单阶段大镜像两阶段(builder + final),final 仅含 /usr/local/steemd + 运行时库
ENTRYPOINT有(steemdentrypoint.sh 体系)
EXPOSE8090 + 2001
CMD/usr/local/bin/steemdentrypoint.shCMD ["cat", "/etc/build_info"](仅打印构建参数)
VOLUME/var/lib/steemd/var/steem
PATHENV PATH=/usr/local/steemd/bin:$PATH(steemd 入 PATH)

推论:不能 docker run 直接起节点——不加命令运行容器只会打印 /etc/build_info 然后退出。启动节点必须显式给 steemd 命令行:

docker run -d --name steemd-node \
  -v $PWD/data:/var/steem \
  -p 8090:8090 -p 2001:2001 \
  steem:<标记> \
  /usr/local/steemd/bin/steemd --data-dir=/var/steem

(scripts/deploy_regression.sh:41-53 正是这种用法的实例。)

注意:dev 的 5 个新发行版 Dockerfile 不再打入 contrib/ 下的任何配置与脚本(仅 smoketests 仍 ADD 它们);容器内没有 config-for-docker.ini,也没有 entrypoint 环境变量体系。数据目录里的 config.ini 由 steemd 首次启动自动生成(application.cpp:161-169),之后可 docker cp 出来修改再挂载回去,或直接用 -v 挂载写好的 ini + --config

5.5 README 警示:Dockerized P2P Node / 环境变量章节已过时

dev 的 README.md 相对 main 仅 3 处实质变化(新增 GHA badge、Quickstart/Building 链接改相对路径),其余章节(Dockerized P2P Node、环境变量清单、PaaS、System Requirements 等)与 main 完全相同——但这些章节描述的仍是 main 时代 steemit/steem 预构建镜像(contrib/steemdentrypoint.sh 体系:USE_WAY_TOO_MUCH_RAMSTEEMD_SEED_NODESUSE_PAAS 等环境变量)的行为,与 dev 新 Dockerfile 产物不一致(新镜像无 entrypoint,环境变量无人消费)。

该环境变量体系如今仅对 Dockerfile.smoketests 镜像有效(它仍打入 contrib 全部文件并 CMD /usr/local/bin/steemdentrypoint.sh)。在 dev 新镜像上部署时,请以上一节 §5.4 的显式命令行方式为准,不要照搬 README 的 docker run steemit/steem 示例。

5.6 .dockerignore 与构建上下文

.dockerignore 为 dev 新增(088c93b 引入):排除 .deps/build/*.o/*.a/*.so*.lognode_modules__pycache__——不排除 .git。这是关键设计:各 Dockerfile 的 builder 阶段 ADD . /usr/local/src 会把 .git 一起带进构建上下文,然后在镜像内自行执行 git submodule update --init --recursive

实际影响:

  1. 在子模块未初始化的工作树上也能 docker build——子模块在镜像内拉取(需要构建环境能访问 github.com)。
  2. 构建上下文会包含整个 .git 目录,首次构建传输量较大;不要用 git clean-类方式裁掉 .git 再构建。
  3. fc 的 git 版本嵌入(fc/CMakeLists.txt:251-264,见 §4.5)依赖 .git 存在,Docker 构建天然满足。

5.7 镜像内跑单元测试机制 + 两个遗留镜像状态

  • UNIT_TEST=ON:5 个生产 Dockerfile 在 builder 阶段 make install 后、UNIT_TEST=ON 时执行 ./tests/scripts/run_unit_tests.sh(如 Dockerfile.ubuntu20.04:111-115)。该脚本(52 行,dev 新增)依次跑 test_fixed_string、test_block_log、test_sqrt、size_checker、schema_test、js_operation_serializer、get_dev_key(带参数 xyz "wit-block-signing-0:101")、ctest -j4 --output-on-failurechain_test -t basic_tests/curation_weight_test 被注释掉(注释:"broken on main branch before the changes…TODO")。DOXYGEN=ON 时另跑 doxygen + check_reflect + get_config_check.sh。单测在 docker build 的 builder 阶段内执行——构建即验证,测试失败则镜像构建失败。
  • Dockerfile.ci.tests(疑不可用):FROM ubuntu:18.04(gcc 7 + 系统 Boost 1.65),单阶段,cmake 参数含 -DENABLE_STD_ALLOCATOR_SUPPORT=ON(根 CMakeLists 中无此 OPTION 声明,静默忽略,同 main 结论)与 -DBUILD_STEEM_TESTNET=ON;构建后直接跑 ./tests/chain_test./tests/plugin_test./programs/util/test_fixed_string(:44-55)。但它没有 git submodule update 步骤(grep 验证)——在 dev 的 gitlink 子模块结构下,除非构建上下文里子模块已初始化,否则必定失败;且 cloudbuild.yaml 引用它时把文件名拼错(见 §6.4)。结论:遗留,当前不可用。
  • Dockerfile.smoketests(疑已坏):与 main 根 Dockerfile 的 diff 只有 1 行(删除 ARG BUILD_TAG=0.23.x)。结构同 main:BUILD_STEP 1 跑 ctest/chain_test/mira_test + Debug coverage;BUILD_STEP 2 把 TESTNET+SMT 版装到 /usr/local/steemd-testnet、主网低内存版装到 /usr/local/steemd-default、主网全节点版装到 /usr/local/steemd-full,并生成 /etc/steemdversion;运行形态保留老镜像的 EXPOSE 8090 2001、VOLUME /var/lib/steemd、steemd 用户、contrib 全套配置与 CMD /usr/local/bin/steemdentrypoint.sh。它执行 git submodule update --init --recursive(:69,:102,:141,:171),在 dev 下能取到子模块;但 gcc 7 + Boost 1.65 与 dev 的 C++17 / Boost≥1.78 要求不匹配,且不打任何补丁,不在 CI matrix 中——冒烟构建在 dev 上很可能已坏,仅作为 main 老 Dockerfile 的存档对应物。

6. GitHub Actions CI 复用

6.1 build-steemd.yml 解读

.github/workflows/build-steemd.yml(47 行,dev 独有,main 无 .github 目录,PR #3706 引入):

  • 触发条件(:3-10):
    • push:仅当 deploy/** 或 workflow 文件自身变化时;
    • pull_request:无路径限制;
    • workflow_dispatch:手动触发。
  • runnerubuntu-latest(:13)。
  • matrix(:16-22):fail-fast: true,4 个 Dockerfile:Dockerfile.azurelinux3.0Dockerfile.debian13Dockerfile.ubuntu22.04Dockerfile.ubuntu24.04(ubuntu20.04 在 b9fbf5f 被移出 matrix,Dockerfile 本身仍保留;ci.tests 与 smoketests 不在 matrix)。
  • 步骤(:24-47):actions/checkout@v4sudo -E docker build --no-cache --build-arg NUMBER_BUILD_THREADS=4 --build-arg UNIT_TEST=ON -t steem:<发行版名> -f deploy/<Dockerfile> .
  • 产物:仅在 CI 本地打 steem:azurelinux3.0 等 tag 的镜像,不推送 registry、不上传 artifact
  • 测试UNIT_TEST=ON 触发各 Dockerfile 内 builder 阶段执行 ./tests/scripts/run_unit_tests.sh(见 §5.7),构建内嵌单测。

6.2 一个反直觉但关键的设计细节

workflow 的 actions/checkout@v4 未配置 submodules: true——表面看子模块是空的,CI 理应失败。实际能工作的原因在 §5.6:.dockerignore 不排除 .gitADD . /usr/local/src.git 带进构建上下文,各 Dockerfile 内部自行执行 git submodule update --init --recursive

如果你复用/改造该 workflow,务必保留这条链路的某一环:要么 checkout 加 submodules: true(或 submodules: recursive),要么确保 .dockerignore 不排除 .git 且 Dockerfile 内有 submodule update 步骤。两头都砍掉,构建必败。

6.3 在自己的 fork / 服务器上复用

  • fork 仓库:dev 分支自带该 workflow,fork 后对 deploy/** 的 push、任意 PR、或 Actions 页面手动 Run workflow 即触发,零改动可用。

  • 自建 runner / 其他 CI 系统:核心就一条命令,直接照抄 workflow 的构建步骤:

    sudo -E docker build --no-cache \
      --build-arg NUMBER_BUILD_THREADS=4 \
      --build-arg UNIT_TEST=ON \
      -t steem:ubuntu24.04 \
      -f deploy/Dockerfile.ubuntu24.04 .
    

    依次对 4 个发行版执行即等价于 CI matrix。注意 CI 用 --no-cache(保证干净构建)与 NUMBER_BUILD_THREADS=4(适配 GitHub 免费 runner 的资源);自有构建机可调大线程数并去掉 --no-cache 提速。

  • 用途定位:该 workflow 是「构建验证 + 单测」流水线,不是发布流水线(不推镜像)。需要发布镜像时在构建后自行 docker save / docker push

6.4 遗留 CI 文件状态

文件状态
cloudbuild.yaml构建文件从 ../Builder.DockerFile 改为 ../deploy/Dockfile.ci.tests——有拼写错误 "Dockfile"(cloudbuild.yaml),且 Builder.DockerFile 已删除、ci.tests 自身疑不可用(§5.7)。该配置当前不可用。
Jenkinsfile与 main 完全相同(diff 无差异),内容仍引用旧流程,属遗留。
ciscripts/与 main 完全相同(diff -rq 无差异),遗留。
circle.yml测试命令从 -f Dockerfile.test 改为 -f deploy/Dockerfile.smoketests(注意 main 的 circle.yml 引用的 Dockerfile.test 在 main 树中也不存在,本就属遗留;而 smoketests 在 dev 上疑已坏,§5.7)。

结论:dev 上唯一可用的 CI 是 GitHub Actions build-steemd.yml,其余均为遗留。


7. 测试网部署(dev 上的测试网)

7.1 前提:链行为零变化

如 §1.3 所述,dev 的共识层与 main 逐字节相同(config.hpp / hardfork.d / database.cpp / IS_TEST_NET 清单 diff 验证)。因此以下测试网事实全部不变,细节直接引用 main 教程,本文不重复:

  • 链 ID 默认 9afbce9f2416520733bacb370315d32b6b2c43d6097576df1c1222859d91eecc(= sha256("testnet"),config.hpp:16),可用 --chain-id 覆盖(dev 的 chain_plugin.cpp:354);
  • initminer 公私钥(WIF 5JNHfZYKGaomSFvd4NUdQ9qMcEAC43kujbfjueTHpVapX1Kzq2n、公钥 TST6LLegbAgLAy28EHrffBVuANFWcFgmqRMW13wBmTExqFE9SCkg4,config.hpp:14-15);
  • 1 号块自动激活全部 24 个硬分叉(dev 的 database.cpp:3302-3336,与 main 同一段代码);
  • 测试网最小 config.ini、cli_wallet 连接与操作、RC 白名单、多节点见证人排班、debug_node 工具箱。

对应章节:最小配置与启动验证 → main 教程 §4.2 / §4.3;cli_wallet → main 教程 §4.4;RC 注意事项 → main 教程 §4.5;多节点 → main 教程 §5

7.2 变化的是构建路径

dev 上获得测试网二进制有三条路:

  1. 原生编译:第 4 章完整流程(子模块 → 补丁 → cmake),cmake 加 -DBUILD_STEEM_TESTNET=ON

    cmake -DCMAKE_BUILD_TYPE=Release \
          -DBUILD_STEEM_TESTNET=ON \
          -DLOW_MEMORY_NODE=OFF -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON ..
    make -j$(nproc) steemd cli_wallet
    
  2. Docker 构建:任一生产 Dockerfile 加 --build-arg BUILD_STEEM_TESTNET=ON(§5.3,默认 OFF,必须显式):

    docker build -f deploy/Dockerfile.ubuntu24.04 \
      --build-arg BUILD_STEEM_TESTNET=ON --build-arg LOW_MEMORY_MODE=OFF \
      -t steem:testnet .
    
  3. smoketests 镜像:内置 testnet 构建(安装到 /usr/local/steemd-testnet,TESTNET+SMT+MIRA),用法与 main 老镜像相同(EXPOSE 8090/2001、steemdentrypoint.sh 体系)。但注意 §5.7 的结论:gcc 7 + Boost 1.65 与 dev 的 C++17 要求不匹配、不打补丁、不在 CI matrix,冒烟构建在 dev 上很可能已坏,仅作为存档对应物,不建议作为部署路径。

7.3 dev 专属「测试网快速启动」精简流程

以下流程可独立跟随(原生编译路径;Docker 路径见 §5.3 + §5.4)。共识层细节出处见 main 教程对应章节。

# 1) 获取源码 + 子模块(dev 必须,§3)
git clone --branch dev https://github.com/steemit/steem.git
cd steem
git submodule update --init --recursive

# 2) 打补丁(按发行版选择,§4.3;以 ubuntu22.04 为例只需 init_asio 补丁)
(cd libraries/fc/vendor/websocketpp && git apply ../../../patches/websocketpp-patch-ini-asio.patch) \
  || echo "Patch already applied, skipping"

# 3) 编译测试网版(§4.4)
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_STEEM_TESTNET=ON \
      -DLOW_MEMORY_NODE=OFF -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON ..
make -j$(nproc) steemd cli_wallet

# 4) 初始化数据目录(首次启动自动生成 config.ini,application.cpp:161-169)
./programs/steemd/steemd -d ~/steem-testnet-data
# 看到生成 config.ini 后 Ctrl-C

用下面的最小 config.ini(与 main 教程 §4.2 相同,零变化)整体替换 ~/steem-testnet-data/config.ini

plugin = webserver p2p json_rpc witness
plugin = condenser_api database_api network_broadcast_api block_api rc_api

enable-stale-production = true
required-participation = 0

witness = "initminer"
private-key = 5JNHfZYKGaomSFvd4NUdQ9qMcEAC43kujbfjueTHpVapX1Kzq2n

webserver-http-endpoint = 127.0.0.1:8090
webserver-ws-endpoint = 127.0.0.1:8090

p2p-endpoint = 127.0.0.1:9876

shared-file-size = 1G

(各行含义与出处——witness 值必须带引号按 JSON 解析、webserver 端点无默认值必须显式指定、shared-file-size 默认 54G 可调小——全部见 main 教程 §4.2。)

启动与 curl 验证(同 main 教程 §4.3):

# 5) 启动:日志应出现 STARTING TEST NETWORK 横幅与 initminer 公私钥,随后 3 秒一块
./programs/steemd/steemd -d ~/steem-testnet-data

# 6) 另开终端验证:链 ID 应为 9afbce9f…eecc
curl -s --data '{"jsonrpc":"2.0","method":"database_api.get_version","params":[],"id":1}' http://127.0.0.1:8090 | python3 -m json.tool

# head_block_number 应每 3 秒递增
curl -s --data '{"jsonrpc":"2.0","method":"database_api.get_dynamic_global_properties","params":[],"id":1}' http://127.0.0.1:8090 | python3 -m json.tool

# 应含 "IS_TEST_NET": true、"STEEM_ADDRESS_PREFIX": "TST"、"TESTNET_BLOCK_LIMIT": 3000000
curl -s --data '{"jsonrpc":"2.0","method":"database_api.get_config","params":[],"id":1}' http://127.0.0.1:8090 | python3 -m json.tool

cli_wallet 连接(测试网构建无需链 ID 参数,细节见 main 教程 §4.4):

./programs/cli_wallet/cli_wallet -s ws://127.0.0.1:8090

7.4 回归脚本(主网定位,非测试网)

dev 新增两个脚本(088c93b 引入,配合 PR #3712 的仓库迁移验证),定位是 EC2 上的主网回归,与私有测试网无关(种子、block_log、steemit 账户均为主网对象),列此供部署主网节点时参考:

  • scripts/deploy_regression.sh(104 行):用法 ./deploy_regression.sh <docker_image_tar>(:7)。流程:docker load 镜像(脚本内写死 ety001/test-steem:latest,:13)→ 建 /steem-regression/{test-a,test-b} 目录 → Test A:容器从 1 号块全量同步,显式命令行起 steemd(--data-dir=/var/steem、http/ws 端点、5 个 --p2p-seed-node,:41-53)→ Test B:先 wget https://steemit-dev-blockchainstate.s3.amazonaws.com/block_log-latest(约 381GB,:61)再 --replay-blockchain --force-validate 重放(:75-88)。端口映射:A=18091/18090/12001,B=28091/28090/22001。不在 GitHub Actions 中运行,是手工/EC2 运维脚本;它同时是 dev 新镜像「显式命令行起 steemd」用法的官方实例。
  • scripts/rpc_regression_test.sh(130 行):对两个节点各发 10 个 RPC 做跨节点一致性校验(注释:"RPC Regression Test for PR #3712",:3)。测试项:database_api.get_dynamic_global_properties、block_api.get_block(1 与 head)、database_api.get_config、get_hardfork_properties、get_witness_schedule、condenser_api.get_accounts([steemit])、condenser_api.get_block(1)、get_reward_funds、rc_api.get_rc_accounts(:58-110);跨节点比对块 1/100000/1000000/10000000/50000000 的 block_id(:114-128);任一 FAIL 则 exit 1(:136-138)。依赖:curl、jq、两节点已在 18091/28091 监听。

8. 常见坑排查表

现象根因解决出处
cmake 配置期报子目录 CMakeLists.txt 不存在 / 编译期找不到 websocketpp 头文件、CyoDecode.cdev 上 5 个 vendor 目录是真 gitlink,未执行 submodule 初始化时全为空git submodule update --init --recursive(main 上该命令是空操作,dev 上是硬依赖).gitmodules:10-15;git ls-tree HEAD 5 个 160000 gitlink
编译 rocksdb 报 array-bounds 错误gcc 12+ 把 rocksdb 源码的 array-bounds 警告升级为 error(cd libraries/vendor/rocksdb && git apply ../../../patches/rocksdb-cmake.patch)(加 -Wno-error=array-boundspatches/rocksdb-cmake.patch;Dockerfile.ubuntu24.04:72-73 等
编译 webserver 报 init_asio protected 访问错误websocketpp 把 init_asio(io_service_ptr) 放在 protected 区,新 Boost.Asio 适配代码需要 public 访问gcc 11/13 平台打 websocketpp-patch-ini-asio.patch;debian13/gcc14 打完整的 websocketpp-cx20-fix.patchpatches/ 两个补丁;webserver/local_endpoint.hpp 适配改动
debian13/gcc 14 上 websocketpp 大量模板构造/析构报错gcc 14 要求完整 C++20 风格修复(注入类名做构造/析构函数名等),init_asio 补丁不够改用 patches/websocketpp-cx20-fix.patch(含 init_asio 迁移)Dockerfile.debian13:73-75
cmake 找到了 Boost 但编译 Boost.Asio 相关代码大量报错Boost 低于 1.78;CMakeLists.txt:158 只声明 1.58,具误导性按 doc/building.md:15 准备 Boost ≥ 1.78(20.04/22.04/azurelinux 源码编译,24.04/debian13 系统包)doc/building.md:15;deploy/*.Dockerfile Boost 段
旧机器 gcc 7 直接编不过dev 要求 C++17 且 STANDARD_REQUIRED换 gcc ≥ 9 的平台(实践矩阵:gcc 9/11/13/14)CMakeLists.txt:6-8
docker build -f deploy/Dockerfile.ubuntu24.04 . 后跑不出测试网,steemd 没有 --chain-id忘了 --build-arg BUILD_STEEM_TESTNET=ON;默认 OFF = 主网 MIRA 低内存版重建:--build-arg BUILD_STEEM_TESTNET=ON(main 教程的思路在 dev 上不适用)各 Dockerfile ARG 默认(:4-16);chain_plugin.cpp:354
docker run steem:<标记> 打印一段构建信息就退出新镜像无 ENTRYPOINT,CMD 只是 cat /etc/build_info显式给命令:docker run ... steem:<标记> /usr/local/steemd/bin/steemd --data-dir=/var/steem各 Dockerfile final 阶段 CMD;scripts/deploy_regression.sh:41-53
按 README 的 Dockerized P2P Node / 环境变量章节部署不生效这些章节是 main 时代 entrypoint 体系的描述,与新镜像不一致以本文 §5.4 为准;环境变量体系仅 smoketests 镜像仍支持README.md(与 main 相同部分);dev-brief 1.3
docker build -t steemit/steem -f deploy/Dockerfile. . 报错找不到文件doc/building.md:55 的示例有笔误,"Dockerfile." 后缺文件名实际应为 deploy/Dockerfile.ubuntu22.04 之类doc/building.md:55
Google Cloud Build 构建失败:找不到 deploy/Dockfile.ci.testscloudbuild.yaml 拼写错误("Dockfile"),且 ci.tests 镜像本身疑不可用放弃 cloudbuild,用 GitHub Actions(§6)cloudbuild.yaml;§6.4
ci.tests 镜像构建失败(子模块为空)Dockerfile.ci.tests 没有 git submodule update 步骤(grep 验证)属遗留,建议直接用带 UNIT_TEST=ON 的生产 Dockerfile 替代deploy/Dockerfile.ci.tests;§5.7
smoketests 镜像构建失败gcc 7 + Boost 1.65 不满足 dev 的 C++17 / Boost ≥1.78,且不打补丁、不在 CI matrix属存档对应物,不建议在 dev 上使用deploy/Dockerfile.smoketests;§5.7
ubuntu24.04 上传了 -DUSE_VENDORED_ROCKSDB=OFF 却仍在编译 vendored rocksdb该参数在全库 CMake 中无定义(grep 验证),被静默忽略无需处理(行为即编译子模块);知道即可,勿依赖该开关Dockerfile.ubuntu24.04:79
编译告警 sign-compare 满天飞但未中断dev 已加 -Wno-error=sign-compare正常,无需处理CMakeLists.txt:9
看到 -std=c++11 又看到 C++17 设置,担心标准不对CMakeLists.txt 残留 -std=c++11(:205/:230),但 -std=gnu++17 在命令行靠后生效无需处理,实际以 C++17 编译CMakeLists.txt:6-8, 205, 230
无 .git 的源码拷贝构建后版本信息缺失fc 在 cmake 配置期用 git rev-parse HEAD 取版本保留 .git 构建(Docker 构建因 .dockerignore 不排除 .git 天然满足)libraries/fc/CMakeLists.txt:251-264;.dockerignore
测试网运行期问题(不出块、RC、引号、资产符号等)与 main 完全相同main 教程 §8 排查表main 教程 §8

9. 附录

9.1 dev 分支部署速查表

值 / 命令
分支 / 基线 commitdev / 088c93b446931732922c4acf9280bb966f3f5286(2026-06-22)
克隆git clone --branch dev https://github.com/steemit/steem.git
子模块(必须)git submodule update --init --recursive(5 个真 gitlink;rocksdb pin 1601da40
编译器C++17;实践 gcc 9/11/13/14
Boost≥ 1.78(doc/building.md:15;CMake 声明 1.58 勿信)
原生构建(主网)cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_MIRA=ON -DLOW_MEMORY_NODE=ON -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON .. && make -j$(nproc) steemd cli_wallet
原生构建(测试网)同上但 -DBUILD_STEEM_TESTNET=ON -DLOW_MEMORY_NODE=OFF
Docker 构建模板`docker build -f deploy/Dockerfile.<名> --build-arg NUMBER_BUILD_THREADS=N --build-arg UNIT_TEST=ONOFF --build-arg BUILD_STEEM_TESTNET=ONOFF -t steem:<标记> .`
测试网开关必须显式 BUILD_STEEM_TESTNET=ON(默认 OFF = 主网 MIRA 低内存版)
容器启动docker run -d -v <data>:/var/steem -p 8090:8090 -p 2001:2001 steem:<标记> /usr/local/steemd/bin/steemd --data-dir=/var/steem(无 entrypoint,必须显式命令)
CI 触发push 改 deploy/** / 任意 PR / workflow_dispatch;matrix = azurelinux3.0 + debian13 + ubuntu22.04 + ubuntu24.04
产物路径build/programs/steemd/steemdbuild/programs/cli_wallet/cli_wallet(原生);镜像内 /usr/local/steemd/bin/(Docker)

9.2 main vs dev 文件级差异索引

根 CMakeLists.txt 全部 4 处 diff:

位置变化
CMakeLists.txt:6-8CMAKE_CXX_STANDARD 1417,新增 CMAKE_CXX_STANDARD_REQUIRED ON
CMakeLists.txt:9新增 add_compile_options(-Wno-error=sign-compare)
CMakeLists.txt:159Boost 查找后新增 find_package(Threads REQUIRED)
CMakeLists.txt:166-167新增 -pthread 编译与链接标志

(未变:cmake_minimum_required 3.2(:3)、GCC/Clang 版本检查(:17-24)、FIND_PACKAGE(Boost 1.58 ...)(:158)、全部 OPTION、Linux 分支残留 -std=c++11(:205/:230)。)

新增文件/目录(dev 独有):

  • deploy/:7 个 Dockerfile(ubuntu20.04/22.04/24.04、debian13、azurelinux3.0、ci.tests、smoketests)
  • patches/:rocksdb-cmake.patch、websocketpp-cx20-fix.patch、websocketpp-patch-ini-asio.patch
  • .github/workflows/build-steemd.yml
  • .dockerignore(不排除 .git)
  • scripts/deploy_regression.shscripts/rpc_regression_test.sh
  • tests/scripts/run_unit_tests.sh

删除文件:

  • 根目录 DockerfileDockerfile.newBuilder.DockerFile
  • doc/building.md 中 Ubuntu 16.04 / 14.04 + 手工 Boost 1.60 的构建说明(整段删除)

逐字节相同(关键共识与配置):libraries/protocol/include/steem/protocol/config.hpplibraries/protocol/hardfork.d/libraries/chain/database.cpp、IS_TEST_NET 文件清单、40 个 plugin.json、contrib/ 全部 14 个文件、external_plugins/example_plugins/、cli_wallet(除 2 处 C++17 引用修复)。

兼容性修复(无语义变化,了解即可):webserver/local_endpoint.hpp(新 Boost.Asio 适配)、database_api_objects.hpp:381-388(-Werror=maybe-uninitialized)、chainbase/allocators.hpp 等头文件补充、fc 大量 crypto 源文件 -Werror 兼容、fixed_string.hpp(C++17 兼容,protocol 目录唯一差异文件)、p2p_default_seeds.hpp 主网种子更新(测试网分支未动)。

文档类差异(不影响构建,了解即可):doc/git-guidelines.md 的 docker build 示例被改为 docker build -f deploy/ubuntu20.04——新示例缺 "Dockerfile." 前缀,本身是个不可用示例(同类笔误见 §8 坑表 building.md:55 条目);doc/mira-tuning.md 仅将链接改为相对路径,无内容变化。此外 tests/ 下若干测试基建文件亦有差异(如 test_block_log 修复,见 §4.4)。

9.3 参考链接

  • 仓库:https://github.com/steemit/steem (本文基线 dev@088c93b)
  • CI workflow:https://github.com/steemit/steem/blob/dev/.github/workflows/build-steemd.yml
  • 迁移 PR:#3699(Ubuntu20.04 重构、移除 18.04)、#3700(Ubuntu 22.04)、#3701(Ubuntu 24.04)、#3702(AzureLinux 3.0)、#3703(Debian 13)、#3704(Fix test_block_log)、#3705(Dockerfile 重构)、#3706(Init Pipeline)、#3707(启用基础测试 + 4 线程构建);仓库迁移 PR #3712(配合 088c93b 的回归脚本与测试镜像 ety001/test-steem
  • 姊妹篇:《Steem 测试网启动详细教程》(main@b2f8567),本文 §1.3、§7.1 大量引用其 §4/§5/§8

10. 结语

dev 分支的迁移是一次纯粹的「部署面」现代化:C++17、真子模块、多发行版 Dockerfile、GitHub Actions——链的共识行为一行未动。对维护者而言,新的心智模型只有三条:子模块必须 init、测试网必须显式 opt-in、容器必须显式给 steemd 命令。建议的下一步:

  1. 基于 dev 重建测试网:按 §7.3 流程在目标发行版上跑通「子模块 → 补丁 → 构建 → 最小 config.ini → curl 验证」全链路,替换掉基于 main 老镜像的现有环境。
  2. 跑 chain_testBUILD_STEEM_TESTNET=ON 构建后 make -j$(nproc) chain_test && ./tests/chain_test(单测必须用测试网构建,doc/devs/testing.md),或直接用 UNIT_TEST=ON 的 Docker 构建让 tests/scripts/run_unit_tests.sh 在 builder 阶段自动执行(§5.7)。
  3. 用 CI 验证自己的补丁:在 fork 上向 dev 提 PR 即触发 4 发行版 matrix 构建 + 单测(§6.3),把「我的改动能否跨发行版编译」交给流水线回答。
  4. 关注仓库迁移进展:088c93b("pre-migration")与两个 EC2 回归脚本是配合 PR #3712 仓库迁移的收尾(测试镜像 ety001/test-steem);迁移落地后注意远端地址与 CI 状态的变化,必要时用 scripts/deploy_regression.sh + rpc_regression_test.sh 做主网回归验证(§7.4)。

注意:与 main 教程相同的提醒——测试网 3,000,000 块封顶(TESTNET_BLOCK_LIMIT,config.hpp:43;database.cpp:796 断言),按 3 秒一块约 104 天,到期前规划好重建或快照迁移;initminer 公私钥是公开常量(启动横幅直接打印),永远不要把这套测试网配置用于承载真实价值的场景。

Sort:  

Upvoted! Thank you for supporting witness @jswit.