运行本地epicbox中继
在你自己的机器上运行一个epicbox中继,并通过它在两个usernet钱包之间完成一次转账。
Linux,使用运行本地网络中的环境:一个正在出块的节点、wallet_alice(拥有可花费余额)以及wallet_bob。构建中继需要Rust和Node.js。
如需在Docker中运行:运行中继。
通过本地中继进行Epicbox转账. 第1步,共7步。Alice 将 slate 发布到中继
1. 构建地址辅助工具
中继调用epicboxlib进行签名和地址校验。其Cargo清单通过子模块依赖钱包的libwallet,因此在构建前需先填充该子模块。
git clone https://github.com/EpicCash/epic-epicbox-docker.git ~/epicbox
cd ~/epicbox
git submodule update --init epicboxlib_source/epic-wallet
cd epicboxlib_source
CARGO_TARGET_DIR=~/epic-build/epicboxlib cargo build --release
cp ~/epic-build/epicboxlib/release/epicboxlib ~/epicbox/
检查二进制文件是否响应:
cd ~/epicbox && ./epicboxlib verifyaddress foo bar
false
2. 启动MongoDB
中继将slate保存在MongoDB中。官方压缩包以当前用户身份运行。
cd ~/epicbox
curl -sSL -o mongodb.tgz \
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2204-6.0.26.tgz
tar xzf mongodb.tgz && mv mongodb-linux-x86_64-ubuntu2204-6.0.26 mongodb
mkdir -p data
mongodb/bin/mongod --dbpath data --port 27019 --bind_ip 127.0.0.1 \
--fork --logpath mongod.log
child process started successfully, parent exiting
3. 创建slate索引
中继不会自动创建索引,且6.0压缩包不附带mongosh。使用中继自身所用的驱动创建索引:队列排空顺序、投递查找,以及createdat上7天的过期设置。
import {MongoClient} from 'mongodb';
const client = new MongoClient('mongodb://127.0.0.1:27019');
await client.connect();
const slates = client.db('epicbox').collection('slates');
await slates.createIndex({queue: 1, made: 1, createdat: 1});
await slates.createIndex({messageid: 1, made: 1});
await slates.createIndex({createdat: 1}, {expireAfterSeconds: 604800});
await client.close();
npm install
node index-slates.mjs
4. 启动中继
epicbox_domain和epicbox_port是钱包地址的生成来源,中继只保留寻址到其自身域名和端口(app_mongo.js:582)的slate。将path_to_epicboxlib_exec_file设置为绝对路径。
{
"mongo_url": "mongodb://127.0.0.1:27019",
"mongo_dbName": "epicbox",
"mongo_collection_name": "slates",
"epicbox_domain": "localhost",
"epicbox_port": 3423,
"local_epicbox_service_port": 3423,
"path_to_epicboxlib_exec_file": "/home/you/epicbox/epicboxlib",
"challenge_interval": 60000,
"debug": false,
"stats": true
}
node app_mongo.js --config config.json
Epicbox ready to work.
中继监听3423。
5. 将两个钱包指向该中继
两个钱包目录中使用相同的区块,与中继配置保持一致:
[epicbox]
epicbox_domain = "localhost"
epicbox_port = 3423
epicbox_protocol_unsecure = true
epicbox_address_index = 0
epicbox_protocol_unsecure = true使钱包通过ws://(impls/src/adapters/epicbox.rs:158)连接。
读取Bob的地址,并在其后附加端口:
cd wallet_bob && epic-wallet --usernet address
esWNVrjr…@localhost
发送至esWNVrjr…@localhost:3423。address仅打印域名(controller/src/command.rs:1360),中继将不带端口的目标地址解析为443(app_mongo.js:581)。
6. 发送,每次仅一个监听器
Can spend funds发送操作在构建slate时会预留Alice的输入(input)。这些输入保持已预留状态,直到转账确认或她执行cancel -i <id>。
# wallet_bob
epic-wallet --usernet listen -m epicbox
# wallet_alice
epic-wallet --usernet send -m epicbox \
-d esWNVrjr…@localhost:3423 --min_conf 3 5
epic-wallet --usernet listen -m epicbox
第二条命令才是完成转账的操作。Bob签名后的slate通过中继返回,而非作为直接回复,因此由Alice自己的订阅来完成最终确认:
INFO Finalize transaction (owner::finalize_tx)
INFO Slate [563e2b1a-…] finalized successfully
Bob的监听器在广播回复后即可停止,Alice的监听器可在此之后启动。中继会保留各方的slate,直到该方订阅为止。
然后在wallet_bob中读取余额,此时无监听器运行:
epic-wallet --usernet info --min_conf 3
若slate未到达
| 现象 | 原因 |
|---|---|
send约40秒后返回并报告成功,但没有任何内容到达 | 目标地址没有端口,因此中继在443上查找其他中继 |
| 中继记录了slate,但接收方从未收到 | 钱包的epicbox_domain或epicbox_port与中继的配置不符 |
| 钱包每5秒重新连接一次 | 中继未运行,或epicbox_protocol_unsecure未设置且钱包正在拨号wss:// |
| 无任何响应,且各处均无报错 | slate已入队,启动接收方的监听器 |
中继从未打印Epicbox ready to work. | MongoDB在27019端口不可达 |
txs时间与中继日志不一致 | txs打印UTC时间,中继日志打印本地时间 |
其他情况:诊断卡住的交易。
停止运行
pkill -f app_mongo.js
cd ~/epicbox && mongodb/bin/mongod --dbpath data --shutdown
未投递的slate在重启后仍然保留,并在发布后7天过期。删除~/epicbox/data会清除它们,之后需要重新创建三个索引。