Запустить локальную сеть
Это руководство создаёт приватный узел usernet, два кошелька и майнер на одной машине. mainnet не используется.
Сначала соберите три бинарника: собрать бинарники.
Зачем usernet
| Сеть | Флаг | P2P порт | API порт | Использование |
|---|---|---|---|---|
| Mainnet | none | 3414 | 3413 | Реальное значение. См. подключение к mainnet |
| Floonet | --floonet | 13414 | 13413 | Тестовая сеть без публичного сида |
| Usernet | --usernet | 23414 | 23413 | Приватная цепочка на локальной машине |
Используйте usernet. Ему не нужны начальные пиры, и он работает как приватная цепочка на вашей машине. Справочник CLI содержит полные смещения для каждой сети.
DNS-сид Floonet не резолвится, и ни один публичный узел не запущен, поэтому узел 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 меняет консенсус, поэтому комментарий в блоке является частью
инструкции:
[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 = false и wallet_listener_url. Сгенерированная конфигурация usernet уже указывает на порт 23415,
который будет принадлежать Alice.
epic --usernet server run
No peers available, can not sync в логе — это нужное состояние, а не ошибка. Оно означает, что узел прекратил ожидание пиров,
что и позволяет ему обслуживать задачи для майнинга.
2. Создать два кошелька
Каждый в своём каталоге, с использованием -w, чтобы кошелёк был создан там, а не в ~/.epic/user:
- Linux и macOS
- Windows
cd wallet_alice && epic-wallet --usernet init -w
cd ../wallet_bob && epic-wallet --usernet init -w
Set-Location wallet_alice; epic-wallet --usernet init -w
Set-Location ..\wallet_bob; epic-wallet --usernet init -w
-w не принимает значения. Он указывается только в init, поэтому последующие команды используют
--current_dir <path>, либо их выполняют из каталога кошелька.
Запишите обе фразы восстановления. Здесь они бесполезны, но привычка — нет.
Два кошелька на одной машине конфликтуют по двум портам, поэтому отредактируйте конфигурацию Bob:
api_listen_port = 23425 # Foreign API. У Алисы остаётся 23415
owner_api_listen_port = 3421 # Owner API, см. ниже
[tor]
use_tor_listener = false
Порт Foreign определяется сетью, поэтому usernet уже сместил его относительно mainnet. Порт Owner не
меняется в зависимости от сети. Он равен 3420 везде, поэтому второй кошелёк на той же машине всегда
конфликтует по этому порту независимо от того, в какой цепочке работает. Установите use_tor_listener = false в обоих
кошельках согласно отключить слушатель Tor. Обоим кошелькам также нужна секция [epicbox], прежде
чем транспорт epicbox заработает в этой цепочке; это настраивается в запустить локальный релей
epicbox.
~/.epic need the node's API secretПри расположении в месте по умолчанию узел и кошелёк разделяют ~/.epic/<network>/ и разрешают секрет Node API к
одному и тому же файлу .api_secret, поэтому это незаметно. Поскольку -w поместил каждый кошелёк в
отдельное место, каждый сгенерировал собственный секрет, который узел отклонит с кодом 401. См.
учётные данные, которые кошелёк передаёт узлу.
Два варианта. Либо скопировать .api_secret узла в каждый каталог кошелька — тогда все значения по умолчанию
сохраняются, поскольку кошелёк создаёт этот файл только при его отсутствии. Либо, для одноразовой
цепочки, закомментировать api_secret_path в epic-server.toml и node_api_secret_path в обоих файлах конфигурации кошельков. Оба ключа
необязательны, поэтому отсутствующий ключ означает отсутствие секрета, и путь к учётным данным не
задействуется.
3. Майнить монеты в кошелёк Alice
Сервер Stratum запрашивает у слушателя кошелька сборку каждого coinbase, поэтому Алиса должна быть в режиме прослушивания, прежде чем блоки приобретут какую-либо ценность.
# в wallet_alice
epic-wallet --usernet listen -n
Затем запустить майнер из каталога цепочки, разместив рядом epic-miner.toml:
[mining]
algorithm = "RandomX"
stratum_server_addr = "127.0.0.1:23416"
miner_plugin_config = []
[mining.randomx_config]
threads = 3
jit = true
miner_plugin_config обязателен даже для RandomX и должен располагаться внутри [mining] выше любой подтаблицы, иначе
TOML привяжет его к неправильной таблице и майнер завершится с missing field 'miner_plugin_config'.
epic-miner
Успешный результат выглядит так:
INFO Mining: RandomX at 475 hps (hashes per second)
INFO Block Found!!
INFO Share Accepted!!
Наблюдайте, как растёт баланс Алисы. Каждый блок приносит 14.5792 EPIC на эре 1 — это базовая награда 16 EPIC за вычетом сбора фонда в размере 8.88%:
epic-wallet --usernet info
Зрелость coinbase в usernet составляет 3 блока (USER_TESTING_COINBASE_MATURITY), тогда как в mainnet — 1,440. См. тайминг
эмиссии. Собственный порог подтверждений кошелька задаётся отдельно, поэтому передавайте --min_conf 3 в
send и info здесь; см. что знает кошелёк.
4. Отделить майнинг от кошельков
Когда у Алисы появятся монеты, остановить майнер и задать:
[server.stratum_mining_config]
burn_reward = true
Перезапустить узел и майнер. Награды теперь отбрасываются. При burn_reward = false и отсутствующем слушателе узел
не может собрать coinbase и полностью прекращает производство блоков, что связывает производство
блоков с наличием активного кошелька. Алиса сохраняет уже намайненные монеты.
Теперь можно остановить слушатель Алисы. Блоки продолжают поступать, поэтому транзакции продолжают получать подтверждения.
5. Проверить установку
epic --usernet client status # высота растёт
epic-wallet --usernet info # из каталога каждого кошелька
У Алисы должен отображаться доступный к трате баланс, у Боба — ноль. Это исходное состояние для первого перевода.
Если что-то пошло не так
| Симптом | Причина |
|---|---|
Логи майнера Node is syncing - Please wait | peer_min_preferred_outbound_count равно 4 |
Логи майнера 0 hps и algo from job progpow | only_randomx не задан |
Лог узла заполняется Share ... submitted too late | Тот же простаивающий майнер продолжает отправлять задание предыдущей высоты |
| Узел перестаёт производить блоки | burn_reward = false без активного слушателя кошелька — coinbase не может быть построен |
Узел зацикливается на CoinbaseSumMismatch на высоте 1440, и его API становится недоступен | Первая граница фондового сбора — один день блоков. Наблюдается с burn_reward = true. Установите enable_stratum_server = false, чтобы вернуть доступ к API и читать цепочку; считайте 1440 потолком для цепочки со сжигаемой наградой |
| Кошелёк получает 401 от узла | Кошелёк и узел расходятся в API secret — см. шаг 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 и выполнить повторную инициализацию
либо смириться с неверными балансами. Удаление всего дерева и восстановление по инструкциям этой
страницы занимает несколько минут.