- 区块链
【免费下载链接】eos
An open source smart contract platform
导读
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是钱包守护进程,负责私钥管理与数字签名。若未显式启动keosd,cleos会在默认端口(127.0.0.1:8900)自动拉起它。
一、前置条件:安装与路径准备
在动手之前,请确认以下三点已就绪:
- 安装 EOSIO 软件:参考安装指南。官方支持的环境包括 Amazon Linux 2、CentOS 7.x/8.x、Ubuntu 16.04/18.04/20.04,以及 macOS 10.14(Mojave)及更高版本。可以选择安装预编译二进制,或从源码构建。
- 确保三个可执行文件在 PATH 中:
nodeos、cleos、keosd必须能直接从命令行调用。如果你是用 shell 脚本方式构建的,还需要执行安装脚本把二进制安装到系统路径。 - 了解
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_info、get_block),供cleos查询链状态 |
--plugin eosio::history_api_plugin | 加载历史 API 插件,提供交易历史查询能力 |
Nodeos Minimal Options(最小配置提示):一个能出块的最小
nodeos实例需要同时加载chain_api_plugin与history_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_producer为eosio,说明出块正常,测试链已可用。
四、进阶配置:定制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 使用配置文件启动
配置完成后,直接运行:
nodeosnodeos会自动从配置目录读取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}。
五、底层机制:出块与创世状态速览
为了让读者对"为什么这样配置就能出块"有更本质的理解,这里给出两点源码佐证:
- 出块开关:
enable-stale-production在producer_plugin.cpp中通过bool_switch直接写入my->_production_enabled(源码位置),只有该标志为真时,节点才会在链头时间落后当前时间超过一个块间隔(默认 500ms)的情况下继续生产区块。此外,max-irreversible-block-age(默认-1,表示不限)控制节点仅在生产链的 LIB 年龄不超过该值时出块(源码位置)。 - 创世与链 ID:默认创世状态的初始时间戳为
2018-06-01T12:00:00,初始密钥取自注入的EOSIO_ROOT_KEY;链 ID 由genesis_state::compute_chain_id()对完整创世状态做 raw 序列化后哈希生成(源码位置)。这就是cleos get info中chain_id的由来,也解释了为什么--config-dir自定义目录时必须手动放置genesis.json——链的根基来自创世文件。
六、下一步:继续探索本地测试网
完成单节点出块后,可以继续深入:
- 单主机单节点 + 共识协议测试网:增加
producer_plugin、producer_api_plugin,导入开发密钥,并通过schedule_protocol_feature_activations预激活协议特性、部署eosio.boot与eosio.bios系统合约,使测试链具备完整共识与系统合约能力; - 单主机多节点测试网:启动两个
nodeos实例(含net_api_plugin),通过 P2P 互联并用setprods更新生产者调度表,实现多节点共识出块; - Nodeos 全部选项:全面了解
nodeos自身选项与各插件选项; - 插件文档总览:深入
chain_api_plugin、producer_plugin、http_plugin等插件的详细配置。
七、常见问题速查
| 现象 | 可能原因与解决 |
|---|---|
| 启动后没有出块日志 | 忘记加-e(enable-stale-production),单节点链处于 stale 状态不会出块 |
cleos get info连接失败 | nodeos未启动,或 HTTP 端口被占用(默认 8888) |
自定义--config-dir后启动报错 | 该目录缺少genesis.json,请手动从默认配置目录拷贝 |
日志出现Database dirty flag set | 上次非正常退出导致,需按提示回放(replay)或用--hard-replay-blockchain恢复 |
| 想指定自己的账户出块 | 用-p <你的账户名>,并确保该账户密钥已通过signature-provider或private-key提供给节点 |
- 区块链
【免费下载链接】eos
An open source smart contract platform
相关推荐
如何用 multinode-demo 搭建本地单节点测试网并运行 bench-tps 压测?
如何用 multinode demo 搭建本地单节点测试网并运行 bench tps 压测? 如果你需要在改动 Solana 交易管线代码后量化验证吞吐量,官方
区块链后端分布式系统EOSIO项目:搭建本地单节点测试网络并启用共识协议
EOSIO项目:搭建本地单节点测试网络并启用共识协议 概述 本文将详细介绍如何在EOSIO区块链项目中搭建一个本地单节点测试网络,并启用共识协议功能。这种配置被
区块链Diem 本地测试验证器网络运行指南:从源码与 Docker 两种方式快速搭建单节点开发环境
Diem 本地测试验证器网络运行指南:从源码与 Docker 两种方式快速搭建单节点开发环境 本篇指南以 Diem 官方文档 tutorial run loca
区块链金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考