Майнинг
Доказательство работы на RandomX, на процессоре, который уже стоит в вашем компьютере. Никакой фермы ASIC, с которой пришлось бы конкурировать, и никакого премайна — монеты берутся из майнинга и больше ниоткуда.
Всё, что нужно#
# A payout address. The node never sees the key behind it.
zcd wallet new --out miner.json
# Mine to it.
zycordd --testnet --dir ./testnet \
--mine --payout $(zcd wallet address --key miner.json)
В публичном testnet и в mainnet это бинарники -randomx —
zcd-randomx и zycordd-randomx. Бинарник, собранный без этого тега, отказывается
запускаться, а не откатывается к отладочному движку. См.
Установка.
Запускайте когда угодно#
Узел, запущенный до срока первого блока своей сети, не майнит раньше времени и не требует повторного запуска в назначенный час. Он отказывается строить блок, до метки времени которого не дошли его собственные часы, ждёт и начинает сам. Пока он ждёт, он сообщает об этом, называя время, которого ждёт, и сколько осталось:
waiting to mine: the next block cannot be dated before 2026-10-01T00:00:01Z
(unix 1790812801), and this node's clock reads 2026-09-30T20:12:31Z - 3h47m30s
to wait. Leave this running: mining starts on its own and there is nothing to
restart or reconfigure.
Это отказ майнить, а не отказ работать: узел всё это время поддерживает пиринг, синхронизируется и обслуживает свой RPC. Сообщение повторяется каждые десять минут, чтобы долгое ожидание не выглядело зависанием.
Ожидание считается по часам этой машины, поэтому часы, отставшие на дни, будут ждать дни. Проверьте их прежде всего остального.
Этот отказ — ещё и причина, по которой вообще безопасно публиковать время старта. Без него майнер датировал
свой заголовок вперёд, до медианного нижнего предела, которым до генезис-блока является сам genesis_time
— так что ранний старт порождал приватную цепочку, о которой никто другой не мог судить, и, поскольку
правило сложности измеряет заявленные времена решений, цепочку, чья цель ужесточалась каждым блоком
по интервалам, не имевшим ничего общего с реально прошедшим временем. Никому не нужно было быть нечестным ради
этого; так раньше вело себя то, что оставили работать на ночь.
Адрес выплат должен быть постоянным#
Это обязан быть постоянный (0x02) адрес — zcd wallet
address по умолчанию печатает именно такой — и zycordd отвергает любой
другой, а не предупреждает. Узел никогда не видит ключ, который им управляет, и не смог бы
потратить вознаграждение, даже если бы захотел.
Одноразовый (0x01) адрес выплат майнит правильно ровно до того момента, как вы один раз с него потратите.
Это списание помечает адрес израсходованным навсегда, и свёртка сжигает каждое созревающее вознаграждение, адресованное
ему, начиная с того же блока — кольцо созревания проворачивается после того, как сертификаты блока лягут, так что
блок, несущий трату, уже становится первым блоком, теряющим деньги, и вместе с ним уходит всё, что от ваших
последних coinbase_maturity блоков ещё осталось в кольце.
Никаких ошибок при этом не возникает. Единственный след — на собственной строке блока этого узла:
matured=0, что печатается и при обычном пустом слоте кольца, и
burned=, который тихо вобрал всю долю производителя вместе с базовой комиссией и
комиссией за пропуск, о которых он обычно и сообщает. Ни одно из полей не говорит «coinbase». Постоянный адрес вообще не может попасть
в реестр израсходованных, поэтому отказ устранён, а не сужен — см.
правило кошелька 3.
Созревание coinbase#
Вознаграждения созревают через coinbase_maturity блоков — 100 и в
mainnet, и в публичном testnet. До тех пор они видны в состоянии и неотчуждаемы, и именно это
финансирует первые депозиты в цепочке без премайна: примерно первую сотню
блоков транзакции доступны только майнерам.
В mainnet нет крана и не будет, поэтому в mainnet этот разгон и есть всё распределение: майни, чтобы играть. У публичного testnet кран есть, и он, как и всё остальное в этой сети, пополняется майнингом, потому что сеть, монеты которой ничего не стоят, ничего не теряет, позволяя кому-то отрепетировать кошелёк прежде, чем репетировать майнер.
Во что обходится запуск#
Рабочая функция — это параметр консенсуса, а не настройка. zcd
params её печатает:
proof of work randomx-v1 (re-keyed every 2048 blocks, 64-block lag)
Память#
Проверке нужно около 256 МиБ на каждую удерживаемую эпоху ключа, а таблица держит две, чтобы реорганизация через границу ключа не вызывала перестроение на каждом блоке. Закладывайте больше, чем эта таблица, потому что предел задаёт не она. Кеш занимает память с момента выделения, а дорогое заполнение Argon2 идёт уже после — так что во время построения живыми могут быть ещё до двух — а запись, вытесненная, пока ею ещё кто-то пользуется, удерживает всё, что имеет, пока этот пользователь её не отпустит, а именно так ведёт себя майнер во время заполнения набора данных.
| Роль | Бюджет | Почему |
|---|---|---|
| Проверяющий узел | ~1 ГиБ на движок | Пиковый кеш при таблице из двух записей был измерен в 1280 МиБ при обоих эффектах разом — а не 512 МиБ, как подсказывает таблица. |
| Майнящий узел | ~3,3 ГиБ | Дополнительно выделяет набор данных на ~2 ГиБ и является тем случаем, который удерживает заимствующего на всё время заполнения. |
Машина, способная спокойно проверять, не обязательно способна майнить.
Потоки#
--mine-threads по умолчанию равен одному на ядро. На действительность он не влияет никак; это лишь
то, насколько быстро этот узел ищет решение.
Что происходит при смене ключа#
Рабочей функции задаётся новый ключ каждые randomx_key_interval блоков. Майнящий узел
перестраивает тогда набор данных на ~2 ГиБ и на это время перестаёт майнить — порядка
десяти секунд, зависит от машины; измерьте на своей от первой границы в журнале.
Проверять он при этом не прекращает, и перестроение не может его застопорить: заголовок из любой
эпохи ключа, кроме той, в которой идёт майнинг, проверяется на собственном кеше этой эпохи в 256 МиБ, которого
набор данных не касается. Оба вычисляют одинаковые дайджесты, так что единственное, на что перестроение влияет
в проверке, — это скорость. Кеш следующей эпохи прогревается за последние
randomx_key_lag блоков эпохи.
| Сеть | randomx_key_interval | Пауза в майнинге, примерно |
|---|---|---|
| mainnet | 2048 блоков | одна раз в ~17 часов |
| публичный testnet | 512 блоков | одна раз в ~4 часа |
Более короткий интервал в testnet намеренный: более частая репетиция этой границы — часть того, ради измерения чего сеть и существует. Строить набор данных следующей эпохи заранее возможно — ключ выводится из высоты, так что известен задолго до границы — и намеренно не делается: это означало бы держать два таких набора, 4 ГиБ, ради экономии паузы, стоящей майнеру несколько секунд в день.
Остановка майнящего узла#
SIGTERM (или Ctrl-C) его останавливает, и останавливает без промедления: один сигнал
доходит до каждого цикла, а не до того, который случайно оказался ждущим на канале.
Остановка, пришедшаяся на смену ключа, дожидается окончания заполнения набора данных
— движок не отпустит буфер на ~2 ГиБ, пока вызовы хеширования всё ещё из него читают, а это
обращение к освобождённой памяти в C, о котором никакой инструментарий Go не сообщил бы. Это остановка, ждущая фиксированного события,
а не гоняющаяся с ним: по измерениям на десяти запусках момент выхода не сдвигался, как бы рано ни приходил
сигнал, тогда как ожидание сокращалось с 4,5 с до 0,7 с, без единого SIGSEGV.
Поэтому закладывайте таймаут остановки больше, чем время заполнения на вашей машине. Второй SIGTERM
не ждёт — первый возвращает обработку сигнала операционной системе, так что повторное
нажатие Ctrl-C во время этой паузы немедленно убивает процесс.
Пулы и почему их нет#
На запуске их нет, и официальных нет вовсе. Узел из коробки майнит в одиночку, и при сложности генезис-блока это разумный способ начать. Если пулы появятся, это третьи стороны; относитесь к ним с тем же скепсисом, что и везде.
Ботнеты, названные, а не отрицаемые#
Майнинг на CPU их привлекает. С ними воевала каждая монета, майнящаяся на CPU, и этот проект не рассчитывает стать исключением. Размен принимается с открытыми глазами: распределение, перекошенное ботнетами, всё же шире того, что решается продажей, а сохранение конкурентоспособности ноутбука, который у вас уже есть, — это и есть весь смысл существования RandomX.
Наблюдение за работой#
Обозреватель testnet отображает каждый блок и каждый сертификат,
включая ту страницу, которую не может отобразить обозреватель ни одной другой цепочки: был ли каждый сертификат применён или
пропущен со списанием, и какое заявленное чтение перестало выполняться. Ваш собственный узел отвечает на те же
вопросы на /status, /head и /metrics — см.
поверхность только для чтения.