Перейти к основному содержимому

Запустить локальный релей epicbox

Релей Epicbox на вашей машине и перевод между двумя usernet-кошельками через него.

Linux, с окружением из запуска локальной сети: узел, производящий блоки, wallet_alice с доступным к трате балансом и wallet_bob. Для сборки релея необходимы Rust и Node.js.

В Docker: запустить релей.

Перевод через релей на localhost:3423, по одному слушателю за раз.

Перевод через Epicbox по локальному релею. Шаг 1 из 7. Алиса публикует слейт (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. Создать индексы слейтов

Релей не создаёт их, а тарбол 6.0 не поставляет mongosh. Создайте их с помощью драйвера, который использует сам релей: порядок опустошения очереди, поиск при доставке и 7-дневный срок истечения для createdat.

~/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_domain и epicbox_port — это то, из чего формируется адрес кошелька; релей хранит только слейты, адресованные его собственному домену и порту (app_mongo.js:582). Задайте 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).

Прочитайте адрес Боба и добавьте к нему порт:

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 При отправке входы (inputs) Alice резервируются в момент сборки слейта (slate). Они остаются зарезервированными до подтверждения перевода или до выполнения 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

Вторая команда завершает перевод. Подписанный слейт Боба возвращается через релей, а не в виде ответа, поэтому финализирует его собственная подписка Алисы:

INFO Finalize transaction (owner::finalize_tx)
INFO Slate [563e2b1a-…] finalized successfully

Слушатель Боба может остановиться сразу после публикации ответа, а слушатель Алисы может запуститься после этого. Релей удерживает слейт каждой стороны до тех пор, пока эта сторона не подпишется.

Затем прочитать баланс в wallet_bob, без активных слушателей:

epic-wallet --usernet info --min_conf 3

Если слейт не доставлен

СимптомПричина
send завершается примерно через 40 секунд с сообщением об успехе, но ничего не поступаетВ адресе назначения не был указан порт, поэтому релей искал другой релей на 443
Релей записывает слейт в лог, получатель его не получаетepicbox_domain или epicbox_port кошельков отличается от конфигурации релея
Кошелёк переподключается каждые 5 секундРелей не запущен, или epicbox_protocol_unsecure не задан и кошелёк обращается к wss://
Ничего не происходит, ошибок нигде нетСлейт поставлен в очередь. Запустите слушатель получателя
Релей никогда не печатает Epicbox ready to work.MongoDB недоступна на 27019
Временны́е метки txs расходятся с логом релеяtxs выводит UTC, лог релея выводит местное время

В остальных случаях: диагностировать застрявшую транзакцию.

Остановить

pkill -f app_mongo.js
cd ~/epicbox && mongodb/bin/mongod --dbpath data --shutdown

Недоставленные слейты переживают перезапуск и истекают через 7 дней после публикации. Удаление ~/epicbox/data очищает их, после чего три индекса необходимо создать заново.

Далее