基于 `nodeos` 快速搭建本地单节点测试网:从零开始让节点出块
2026/9/23 18:14:56 网站建设 项目流程
  • 区块链

【免费下载链接】eos

An open source smart contract platform

项目地址:https://gitcode.com/gh_mirrors/eo/eos
点击查看免费下载

导读

nodeos是 EOSIO 区块链的核心节点守护进程,负责共识、区块生产、状态存储与 RPC 服务。本指南以docs/01_nodeos/02_usage/03_development-environment/00_local-single-node-testnet.md为主骨架,讲解如何在一台主机上以最小配置启动一个由单一生产者(eosio)驱动的本地测试链,并通过cleos get info验证链上状态。读者学完后将掌握:一条可出块测试链的启动命令、config.ini的自定义配置方法、数据与配置目录的管理方式,以及nodeos相关插件与参数的底层机制。

cleos是命令行客户端,用于管理钱包、向链上发送 action;keosd是钱包守护进程,负责私钥管理与数字签名。若未显式启动keosdcleos会在默认端口(127.0.0.1:8900)自动拉起它。


一、前置条件:安装与路径准备

在动手之前,请确认以下三点已就绪:

  1. 安装 EOSIO 软件:参考安装指南。官方支持的环境包括 Amazon Linux 2、CentOS 7.x/8.x、Ubuntu 16.04/18.04/20.04,以及 macOS 10.14(Mojave)及更高版本。可以选择安装预编译二进制,或从源码构建。
  2. 确保三个可执行文件在 PATH 中nodeoscleoskeosd必须能直接从命令行调用。如果你是用 shell 脚本方式构建的,还需要执行安装脚本把二进制安装到系统路径。
  3. 了解nodeos选项机制nodeos的行为由两类选项决定——nodeos自身选项(如--data-dir--config-dir)和插件选项(如--plugin eosio::chain_api_plugin)。详见Nodeos Options。插件选项必须配合对应的--plugin启用才生效,否则会被忽略。

二、快速启动:一行命令让nodeos开始出块

打开一个终端窗口,执行以下命令即可启动一条单节点区块链:

nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin

这条命令中各参数的含义如下:

参数说明
-e/--enable-stale-production允许在链"过期"(stale)的情况下继续出块。单节点测试链没有外部节点持续供给新块,链几乎总是处于 stale 状态,因此必须开启。对应源码见plugins/producer_plugin/producer_plugin.cpp("enable-stale-production,e", ...)的定义(源码位置)
-p eosio/--producer-name eosio指定由本节点控制的出块账户名为eosio。该选项是vector类型,可多次指定多个生产者(producer_plugin.cpp("producer-name,p", ...)定义为 composing+multitoken,源码位置)
--plugin eosio::chain_api_plugin加载链 API 插件,暴露/v1/chain/*系列 RPC 端点(如get_infoget_block),供cleos查询链状态
--plugin eosio::history_api_plugin加载历史 API 插件,提供交易历史查询能力

Nodeos Minimal Options(最小配置提示):一个能出块的最小nodeos实例需要同时加载chain_api_pluginhistory_api_plugin,并配合-e-p eosio。你也可以自行创建账户并把它指定为生产者名(如-p inita)。

2.1 启动后的预期日志

启动成功后,终端会输出类似如下的区块生产日志:

1575001ms thread-0 chain_controller.cpp:235 _push_block ] initm #1 @2017-09-04T04:26:15 | 0 trx, 0 pending, exectime_ms=0 1575001ms thread-0 producer_plugin.cpp:207 block_production_loo ] initm generated block #1 @ 2017-09-04T04:26:15 with 0 trxs 0 pending 1578001ms thread-0 chain_controller.cpp:235 _push_block ] initc #2 @2017-09-04T04:26:18 | 0 trx, 0 pending, exectime_ms=0 ... eosio generated block 046b9984... #101527 @ 2018-04-01T14:24:58.000 with 0 trxs eosio generated block 5e527ee2... #101528 @ 2018-04-01T14:24:58.500 with 0 trxs

观察要点:

  • #1#2是区块高度,说明节点正在从创世块开始出块;
  • eosio generated block ...表明区块由生产者eosio签名生成;
  • 块间隔约 0.5 秒(500ms),符合 EOSIO 的block_interval_ms = 500设定。

此时,nodeos正在以单一生产者eosio运行。默认 HTTP RPC 监听地址为127.0.0.1:8888(在programs/nodeos/main.cpp中通过http_plugin::set_defaults({... .default_http_port = 8888})设置,源码位置)。


三、查询节点信息:cleos get info

在另一个终端窗口执行:

cleos get info

返回的 JSON 大致如下:

{ "server_version": "0f9df63e", "chain_id": "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", "head_block_num": 134, "last_irreversible_block_num": 133, "last_irreversible_block_id": "00000085060e9872849ef87bef3b19ab07de9faaed71154510c7f0aeeaddae2c", "head_block_id": "000000861e3222dce1c7c2cfb938940d8aac22c816cc8b0b89f6bf65a8ad5bdc", "head_block_time": "2019-11-18T22:13:10.500", "head_block_producer": "eosio", "virtual_block_cpu_limit": 228396, "virtual_block_net_limit": 1197744, "block_cpu_limit": 199900, "block_net_limit": 1048576, "server_version_string": "v2.0.0-rc2", "fork_db_head_block_num": 134, "fork_db_head_block_id": "000000861e3222dce1c7c2cfb938940d8aac22c816cc8b0b89f6bf65a8ad5bdc", "server_full_version_string": "v2.0.0-rc2-0f9df63e1eca4dda4cb7df30683f4a1220599444" }

关键字段解读:

字段含义
chain_id链 ID,由创世状态(genesis)计算得到。当前仓库默认创世配置的根密钥定义于libraries/chain/genesis_state_root_key.cpp.in(通过${EOSIO_ROOT_KEY}注入),genesis_state::compute_chain_id()将整个创世状态打包哈希得到链 ID(见libraries/chain/genesis_state.cpp
head_block_num/head_block_id当前链头区块的高度与 ID
last_irreversible_block_num最近不可逆区块高度(LIB)。单节点下通常仅落后链头 1 个块
head_block_producer当前块的生产者,应为eosio
block_cpu_limit/block_net_limit每个块的 CPU(微秒)与 NET(字节)资源上限
server_version_string节点版本字符串,如v2.0.0-rc2

head_block_num持续增长、head_block_producereosio,说明出块正常,测试链已可用。


四、进阶配置:定制config.ini

单条命令适合快速验证;进阶用户往往需要固化配置。nodeos使用自定义配置目录,其位置随操作系统而定:

  • macOS:~/Library/Application Support/eosio/nodeos/config
  • Linux:~/.local/share/eosio/nodeos/config

构建过程会在该目录中预置一个默认的genesis.json。你也可以用--config-dir参数指定其他配置目录,但此时需要手动拷贝一份genesis.json到该目录。

4.1 生成并编辑默认config.ini

nodeos启动时会先在配置目录中查找config.ini,若不存在则自动生成一份带全部默认项的文件。具体做法:先运行nodeos,随后立刻按Ctrl-C关闭它,此时配置目录中已生成默认config.ini。打开该文件,在默认内容基础上添加/更新以下设置:

# config.ini: # Enable production on a stale chain, since a single-node test chain is pretty much always stale enable-stale-production = true # Enable block production with the testnet producers producer-name = eosio # Load the block producer plugin, so you can produce blocks plugin = eosio::producer_plugin # As well as API and HTTP plugins plugin = eosio::chain_api_plugin plugin = eosio::http_plugin plugin = eosio::history_api_plugin

各项配置与命令行参数一一对应:

  • enable-stale-production = true:等价于-e,允许在 stale 链上出块;
  • producer-name = eosio:等价于-p eosio,声明出块账户;
  • plugin = eosio::producer_plugin:加载出块插件(命令行示例中未显式列出,但-e/-p均为该插件的选项,因此必须显式加载);
  • plugin = eosio::http_plugin:HTTP 服务基础插件,RPC 端点依赖它;
  • plugin = eosio::chain_api_plugin/eosio::history_api_plugin:RPC 功能插件。

提示config.ini中的插件选项即使没写对应的plugin = ...,只要该选项所属插件已通过命令行或其他方式加载,选项仍会生效;反之插件未加载时选项会被忽略(见 Nodeos Options 的插件选项说明)。

4.2 使用配置文件启动

配置完成后,直接运行:

nodeos

nodeos会自动从配置目录读取config.ini并开始出块。

4.3 数据目录

运行时数据(共享内存、日志等)存放在数据目录:

  • macOS:~/Library/Application Support/eosio/nodeos/data
  • Linux:~/.local/share/eosio/nodeos/data

可通过--data-dir参数指定其他位置。在programs/nodeos/main.cpp中,数据目录与配置目录的默认值由app().set_default_data_dir(...)app().set_default_config_dir(...)设定(源码位置),路径形态为fc::app_path()/eosio/nodeos/{data,config}


五、底层机制:出块与创世状态速览

为了让读者对"为什么这样配置就能出块"有更本质的理解,这里给出两点源码佐证:

  1. 出块开关enable-stale-productionproducer_plugin.cpp中通过bool_switch直接写入my->_production_enabled(源码位置),只有该标志为真时,节点才会在链头时间落后当前时间超过一个块间隔(默认 500ms)的情况下继续生产区块。此外,max-irreversible-block-age(默认-1,表示不限)控制节点仅在生产链的 LIB 年龄不超过该值时出块(源码位置)。
  2. 创世与链 ID:默认创世状态的初始时间戳为2018-06-01T12:00:00,初始密钥取自注入的EOSIO_ROOT_KEY;链 ID 由genesis_state::compute_chain_id()对完整创世状态做 raw 序列化后哈希生成(源码位置)。这就是cleos get infochain_id的由来,也解释了为什么--config-dir自定义目录时必须手动放置genesis.json——链的根基来自创世文件。

六、下一步:继续探索本地测试网

完成单节点出块后,可以继续深入:

  • 单主机单节点 + 共识协议测试网:增加producer_pluginproducer_api_plugin,导入开发密钥,并通过schedule_protocol_feature_activations预激活协议特性、部署eosio.booteosio.bios系统合约,使测试链具备完整共识与系统合约能力;
  • 单主机多节点测试网:启动两个nodeos实例(含net_api_plugin),通过 P2P 互联并用setprods更新生产者调度表,实现多节点共识出块;
  • Nodeos 全部选项:全面了解nodeos自身选项与各插件选项;
  • 插件文档总览:深入chain_api_pluginproducer_pluginhttp_plugin等插件的详细配置。

七、常见问题速查

现象可能原因与解决
启动后没有出块日志忘记加-eenable-stale-production),单节点链处于 stale 状态不会出块
cleos get info连接失败nodeos未启动,或 HTTP 端口被占用(默认 8888)
自定义--config-dir后启动报错该目录缺少genesis.json,请手动从默认配置目录拷贝
日志出现Database dirty flag set上次非正常退出导致,需按提示回放(replay)或用--hard-replay-blockchain恢复
想指定自己的账户出块-p <你的账户名>,并确保该账户密钥已通过signature-providerprivate-key提供给节点
  • 区块链

【免费下载链接】eos

An open source smart contract platform

项目地址:https://gitcode.com/gh_mirrors/eo/eos
点击查看免费下载

相关推荐

上一篇:Deep-Live-Cam项目运行时报错"ModuleNotFoundError: No module named 'torch'"解决方案
下一篇:如何免费解锁所有显卡超采样技术:OptiScaler终极配置指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询