Запустить локальный релей epicbox
Релей Epicbox на вашей машине и перевод между двумя usernet-кошельками через него.
Linux, с окружением из запуска локальной сети: узел, производящий блоки, wallet_alice с доступным к
трате балансом и wallet_bob. Для сборки релея необходимы Rust и Node.js.
В Docker: запустить релей.
Перевод через 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.
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 как абсолютный путь.
{
"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).
Прочитайте адрес Боба и добавьте к нему порт:
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 очищает их, после чего три индекса необходимо создать заново.