跳到主要内容

运行本地epicbox中继

在你自己的机器上运行一个epicbox中继,并通过它在两个usernet钱包之间完成一次转账。

Linux,使用运行本地网络中的环境:一个正在出块的节点、wallet_alice(拥有可花费余额)以及wallet_bob。构建中继需要Rust和Node.js。

如需在Docker中运行:运行中继

通过localhost:3423上的中继进行转账,每次只有一个监听器。

通过本地中继进行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。使用中继自身所用的驱动创建索引:队列排空顺序、投递查找,以及createdat7天的过期设置。

~/epicbox/index-slates.mjs
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_domainepicbox_port是钱包地址的生成来源,中继只保留寻址到其自身域名和端口(app_mongo.js:582)的slate。将path_to_epicboxlib_exec_file设置为绝对路径。

~/epicbox/config.json
{
"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. 将两个钱包指向该中继

两个钱包目录中使用相同的区块,与中继配置保持一致:

wallet_alice/epic-wallet.toml and wallet_bob/epic-wallet.toml
[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:3423address仅打印域名(controller/src/command.rs:1360),中继将不带端口的目标地址解析为443app_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_domainepicbox_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会清除它们,之后需要重新创建三个索引。

下一步