跳到主要内容

运行本地网络

本指南在一台机器上创建一个私有usernet节点、两个钱包和一个矿工,不使用mainnet。

首先构建三个二进制文件:构建二进制文件

为何使用usernet

网络参数P2P端口API端口用途
Mainnet34143413真实值。参见连接到mainnet
Floonet--floonet1341413413无公共种子节点运行的测试网络
Usernet--usernet2341423413本机上的私有链

使用usernet。它不需要种子对等节点,在你的机器上作为私有链运行。CLI参考包含每个网络的完整偏移量。

floonet的DNS种子无法解析,也没有公共节点在运行,因此floonet节点在区块高度0时找不到对等节点,除非手动配置对等节点。

两个测试网络都不会自行产生区块,这正是矿工的用途。

先规划目录结构

文件的存放位置比平时更重要,因为两个二进制文件都会先从当前工作目录解析其配置文件,然后才回退到~/.epic/<network>。因此,启动时所在的目录就是实例选择器,这也是一个钱包二进制文件能驱动多个钱包的原因。

一种可行的目录布局:

epic-local/
.epic/user/ node data, the three binaries,
epic-server.toml and epic-miner.toml
wallet_alice/ epic-wallet.toml and wallet_data/, no binary
wallet_bob/ same

节点和矿工可以安全地共享同一目录,因为它们的配置文件名不同。每个目录保存一个钱包,并从你要操作的钱包目录内运行共享的epic-wallet二进制文件。

1. 配置并启动节点

在链目录内生成配置文件,使路径落在该目录下:

epic --usernet server config

然后做四处修改。only_randomx会更改共识,因此区块中的注释是指令的一部分:

.epic/user/epic-server.toml
[server]
# 共识变更。如果在已有区块的链上设置此项,请先删除
# chain_data:在旧策略下挖出的区块在此策略下无法通过验证。
only_randomx = true

[server.p2p_config]
peer_min_preferred_outbound_count = 0

[server.stratum_mining_config]
enable_stratum_server = true

[logging]
log_to_file = true

每一项都是必需的。

only_randomx = true强制执行100% RandomX策略。Epic通常为每个区块高度分配多种算法之一,而单个CPU矿工只能响应RandomX的高度。在真实网络上,其他矿工会覆盖其余算法;在你自己的链上没有其他矿工,因此不设置此项时矿工在大多数高度会处于空闲状态。参见区块策略

peer_min_preferred_outbound_count = 0不会写入生成的文件,需要手动添加该行。低于该阈值的节点会永远报告自身处于同步状态,而处于同步状态的节点拒绝分发挖矿任务。usernet在设计上没有对等节点,因此永远无法达到默认值4。

enable_stratum_server = true开启挖矿端口。在所有网络上默认关闭,usernet也不例外。

log_to_file = true,因为当挖矿出现问题时你会需要查看日志。

暂时不要修改burn_reward = falsewallet_listener_url。生成的usernet配置已指向端口23415,即Alice的端口。

epic --usernet server run

日志中的No peers available, can not sync是你期望看到的状态,不是错误。它表示节点已停止等待对等节点,这正是节点能够提供挖矿任务的前提。

2. 创建两个钱包

各自在其目录中创建,使用-w使钱包创建在该目录下而非~/.epic/user中:

cd wallet_alice && epic-wallet --usernet init -w
cd ../wallet_bob && epic-wallet --usernet init -w

-w不接受值。它仅在init上声明,因此后续命令改用--current_dir <path>,或者从钱包目录内运行这些命令。

记录两个恢复助记词。在这里它们没有实际价值,但养成这个习惯是有意义的。

同一台机器上的两个钱包会在两个端口上发生冲突,因此编辑Bob的配置:

wallet_bob/epic-wallet.toml
api_listen_port = 23425 # Foreign API。Alice 保留 23415
owner_api_listen_port = 3421 # Owner API,见下文

[tor]
use_tor_listener = false

Foreign端口由网络派生,因此usernet已将其从mainnet的端口移开。Owner端口不随网络变化,在所有网络中均为3420,因此同一台机器上的第二个钱包无论运行哪条链,都会在该端口发生冲突。按照关闭Tor监听器中的说明,在两个钱包中均设置use_tor_listener = false。两个钱包还需要添加[epicbox]部分,epicbox传输方式才能在此链上正常工作,具体设置参见运行本地epicbox中继

Wallets outside ~/.epic need the node's API secret

若保留默认位置,节点和钱包会共享~/.epic/<network>/,并将节点API凭据解析到同一个.api_secret文件,因此不会有问题。由于-w将每个钱包放在了其他位置,每个钱包生成了自己的机密,节点会以401拒绝该凭据。参见钱包向节点提交的凭据

有两种方法。一是将节点的.api_secret复制到每个钱包目录中,这样所有默认值均可正常工作,因为钱包只在该文件缺失时才会创建它。二是对于临时链,在epic-server.toml中注释掉api_secret_path,并在两个钱包配置中注释掉node_api_secret_path。这两个键均为可选项,缺少该键意味着没有机密,也不会走凭据路径。

3. 向Alice挖矿充值

Stratum服务器要求钱包监听器构建每个coinbase,因此Alice必须在区块产生价值之前处于监听状态。

# 在 wallet_alice 中
epic-wallet --usernet listen -n

然后从链目录启动矿工,并将epic-miner.toml置于其旁:

.epic/user/epic-miner.toml
[mining]
algorithm = "RandomX"
stratum_server_addr = "127.0.0.1:23416"
miner_plugin_config = []

[mining.randomx_config]
threads = 3
jit = true

即使是RandomX也需要miner_plugin_config,且它必须位于[mining]内所有子表的上方,否则TOML会将其附加到错误的表,导致矿工以missing field 'miner_plugin_config'退出。

epic-miner

成功时的输出如下:

INFO Mining: RandomX at 475 hps (hashes per second)
INFO Block Found!!
INFO Share Accepted!!

观察Alice的余额增长。在第1纪元,每个区块支付14.5792 EPIC,即16 EPIC基础区块奖励扣除8.88%基金会税后的金额:

epic-wallet --usernet info

usernet上的coinbase成熟度为3个区块(USER_TESTING_COINBASE_MATURITY),而mainnet为1,440。参见发行时序。钱包自身的确认数下限是独立的,因此在sendinfo上传入--min_conf 3;参见读取钱包已知信息

4. 将挖矿与钱包解耦

Alice有币后,停止矿工并设置:

.epic/user/epic-server.toml
[server.stratum_mining_config]
burn_reward = true

重启节点和矿工。奖励现在将被丢弃。在burn_reward = false且没有监听器运行的情况下,节点无法构建coinbase,将完全停止出块,这使区块生产与钱包的运行状态相耦合。Alice保留她已挖到的币。

现在可以停止Alice的监听器。区块持续产生,交易持续获得确认数。

5. 确认挖矿环境

epic --usernet client status # 区块高度递增中
epic-wallet --usernet info # 从各钱包目录执行

Alice应显示可花费余额,Bob为零。这是首次转账的初始状态。

故障排查

现象原因
矿工日志Node is syncing - Please waitpeer_min_preferred_outbound_count仍为4
矿工日志0 hpsalgo from job progpowonly_randomx未设置
节点日志持续出现Share ... submitted too late同一个空闲矿工仍在针对上一高度的任务提交
节点停止产生区块无钱包监听器运行,burn_reward = false无法构建coinbase
节点在高度1440处循环执行CoinbaseSumMismatch,其API变为不可达第一个基金会征收边界,即进入一天的区块后。在burn_reward = true下观察到。设置enable_stratum_server = false可恢复API并读取链,将1440视为销毁奖励链的上限
钱包从节点收到401钱包与节点的API机密不一致,参见步骤2
余额显示但Currently Spendable为零Coinbase成熟度,或--min_conf默认值10
区块被拒绝,出现InvalidSortAlgo,或Block rejected伴随Expected RandomX got Cuckoo15某处启用了run_test_miner。它只生成Cuckoo证明,RandomX策略会拒绝该证明
钱包命令作用于错误的钱包从该钱包目录运行,或传入--current_dir <path>

重置

删除chain_data以获得全新的链。钱包数据库将与其不一致,因此需删除每个wallet_data并重新初始化,或接受错误的余额。删除整个目录树并按本页重新构建只需几分钟。

下一步