Собирайте свои блоки сами.
На этом пути вы не направляете майнер на нас. Вы запускаете узел Bitcoin Knots и шлюз DATUM на собственной машине; ваш узел решает, какие транзакции попадут в блок, а пул отвечает лишь на один вопрос — кому сколько платить. Нам этот путь милее прочих, и именно он продолжит платить после того, как Bitcoin Knots перестанет платить за блоки, которые майнер не строил.
- Комиссия пула
- 1 %
- столько же на обычном stratum
- Порт шлюза
- 28915
- все четыре региона
- Prime ID
- 4243
- как вас называют обозреватели
- Минимальная выплата
- 10 000 сат
- ниже этого — переносится
- Диск для узла
- ~40 GB
- обрезанная, не вся цепь
Почему мы советуем именно этот путь.
Не потому, что он сложнее. А из-за того, кто собирает шаблон.
На наших обычных stratum-портах шаблон блока собираем мы. Это работает, выплаты те же, и для одного майнера на столе это разумный выбор. Но это значит, что транзакции выбираем мы, а вы принимаете наш выбор на доверии — вместе с той политикой, которая у нас включена на этой неделе. Пул, который собирает каждый шаблон, — это пул, на который в принципе можно надавить.
Со своим шлюзом шаблон принадлежит вам. Правила ретрансляции вашего узла, ваш мемпул, ваш порог комиссии. Мы никогда не видим блок до того, как он возникнет, и не можем цензурировать то, чего не строим. Пул добавляет только раздел выплат — список адресов и сумм, который ваш шлюз записывает в coinbase. Комиссия составляет 1 %, ровно столько же, сколько сегодня платит обычный stratum.
Честная цена — это узел, который вы содержите. Ему нужно около 40 ГБ, ему нужно оставаться включённым, и первая синхронизация занимает день-три. Дальше он справляется сам. Как платит пул — одинаково на обоих путях: прямо из coinbase блока, без баланса и без вывода.
Что нужно до начала.
- Машина, которая не выключается
- Любая 64-битная машина с Linux (x86-64 или ARM64), Mac или Windows. Двух ядер более чем достаточно. Raspberry Pi 5 с SSD подойдёт; SD-карта — нет.
- Около 40 ГБ свободно
- Цепь, обрезанная. Один только набор UTXO занимает сегодня 11 ГБ и продолжает расти; остальное — ваш бюджет обрезки и запас на первую синхронизацию.
- 8 ГБ ОЗУ, с запасом
- 4 ГБ хватит при меньшем dbcache. Это важно только во время первой синхронизации.
- От одного до трёх дней
- На первую синхронизацию. Всё остальное можно настроить пока она идёт, но шлюз не выдаёт работу, пока узел не догонит цепь.
- Ваш адрес BTCB2
- Нативный SegWit-адрес (bc1q…) из кошелька, которым владеете вы. Пул пишет его прямо в блок — здесь нет аккаунта и нечего регистрировать.
Шесть шагов.
Команды — для Linux. На Mac и Windows отличается только способ скачать два файла.
01Установить Bitcoin Knots
Это клиент, который знает цепь BLAKE2b. Берите его у проекта, проверяйте контрольную сумму и не подставляйте сборку Bitcoin Core — в Core этого форка нет.
V=29.4.2.knots20260508 cd /tmp curl -fsSLO https://bitcoinknots.org/files/29.x/$V/bitcoin-$V-x86_64-linux-gnu.tar.gz curl -fsSLO https://bitcoinknots.org/files/29.x/$V/SHA256SUMS sha256sum --ignore-missing -c SHA256SUMS sudo tar -xzf bitcoin-$V-x86_64-linux-gnu.tar.gz -C /opt sudo ln -sf /opt/bitcoin-$V/bin/bitcoind /usr/local/bin/bitcoind sudo ln -sf /opt/bitcoin-$V/bin/bitcoin-cli /usr/local/bin/bitcoin-cli bitcoind --version | head -1
На ARM64 замените x86_64 на aarch64. Последняя строка должна содержать 29.4.2 и упоминать Knots. Если sha256sum не печатает OK — остановитесь и скачайте файл заново: обычная причина — обрыв загрузки.
02Настроить узел
Запишите это в ~/.bitcoin/bitcoin.conf. Пароль не придумывайте, а сгенерируйте: openssl rand -hex 24.
~/.bitcoin/bitcoin.conf
server=1 rpcbind=127.0.0.1 rpcallowip=127.0.0.1 rpcuser=datum rpcpassword=PASTE_THE_RANDOM_HEX_HERE prune=10000 dbcache=2048 blockreservedweight=32000 blocknotify=curl -fsS -o /dev/null http://127.0.0.1:7152/NOTIFY
blockreservedweight=32000 — настройка, которую больше никто не документирует, и её отсутствие молча стоит денег вашим соседям по пулу. Вот почему. Пул передаёт вашему шлюзу список выплатных выходов — последнее время от 160 до 250. Они должны уместиться в coinbase, а единственное место, которое шаблон оставляет для coinbase, — это резерв. По умолчанию он равен 8000 единицам веса: около 40 выходов. Всё сверх того просто отбрасывается, его стоимость уходит на адрес пула, и потом её приходится выплачивать вручную. У нас 32 000 на всех четырёх узлах — измерено в работе, это место для 246 выходов вместо 153 — и ничего не теряется. Повышайте, а не понижайте.
Некоторые пулы советуют вместо этого ограничить весь блок через blockmaxweight=740000. Место это тоже освобождает, но выбрасывает комиссии транзакций, которые заполнили бы остаток блока. Резервирование — более дешёвая ручка.
Остальное — обычное. prune=10000 оставляет 10 ГБ блоков: на этом пути старая история не нужна никому, а txindex здесь и вовсе пустая трата диска. blocknotify — это то, что заставляет шлюз переключаться на новую вершину быстрее чем за секунду, а не ждать следующего опроса; он указывает на шлюз, который вы поставите на следующем шаге. Затем запустите узел и дайте ему синхронизироваться:
bitcoind -daemon bitcoin-cli getblockchaininfo | grep -E 'blocks|headers|verificationprogress'
Когда verificationprogress дойдёт до 1, вы готовы. До тех пор шлюз запускается, но работу не выдаёт — и это правильно.
03Установить шлюз
Компилировать ничего не нужно. ratum-gateway поставляется одним статическим файлом примерно на 2,4 МБ, вообще без зависимостей.
V=0.1.57 cd /tmp curl -fsSLO https://github.com/iohzrd/ratum/releases/download/v$V/ratum-gateway-$V-x86_64-linux-musl.tar.gz curl -fsSLO https://github.com/iohzrd/ratum/releases/download/v$V/ratum-gateway-$V-x86_64-linux-musl.tar.gz.sha256 sha256sum -c ratum-gateway-$V-x86_64-linux-musl.tar.gz.sha256 tar -xzf ratum-gateway-$V-x86_64-linux-musl.tar.gz sudo install -m0755 ratum-gateway-$V-x86_64-linux-musl/ratum-gateway /usr/local/bin/ ratum-gateway --version
В релизах есть также aarch64-linux-musl, x86_64-macos, aarch64-macos и x86_64-windows.zip. Версия 0.1.57 — та, которую мы сейчас видим работающей с нашим пулом; если вам ближе реализация на C, CONVOY DATUM gateway читает тот же самый файл настроек, и его мы тоже принимаем.
04Направить шлюз на B2Pool
Один файл. Замените две отмеченные строки своим адресом и паролем на ваш выбор; всё остальное может остаться точно как есть.
gateway.json
{
"bitcoind": {
"rpcurl": "http://127.0.0.1:8332",
"rpcuser": "datum",
"rpcpassword": "THE_SAME_HEX_AS_IN_BITCOIN_CONF",
"work_update_seconds": 40,
"notify_fallback": true
},
"stratum": {
"listen_addr": "0.0.0.0",
"listen_port": 23334,
"vardiff_min": 2048,
"require_address_username": true
},
"mining": {
"pool_address": "YOUR_OWN_bc1q_ADDRESS",
"coinbase_tag_secondary": "your-name-here"
},
"api": {
"listen_addr": "127.0.0.1",
"listen_port": 7152,
"admin_password": "PICK_SOMETHING"
},
"datum": {
"pool_host": "de.b2pool.io",
"pool_port": 28915,
"pool_pubkey": "8ba1f7693d117620b1e5a46828f1cd187efe81114e9cee6a063bfbbe2f1b6cff0fc681d3c1ca7cb19c0e0dbddfbea65d5509e974e7f0000112dd07cba744a716",
"pool_url": "https://b2pool.io",
"pool_pass_workers": true,
"pool_pass_full_users": true,
"pooled_mining_only": true
}
}
Выбирайте хост с наименьшей задержкой до вас — de, hel, ord или hkg, все на .b2pool.io:28915. Это один и тот же пул и один и тот же учёт; различается только расстояние. Панель измеряет задержку прямо из вашего браузера, если вы не уверены.
Открытый ключ привязывает соединение. Шлюз с неверным ключом не получит сессию и не будет выдавать работу — в этом и смысл: никто не сможет незаметно встать между вами и пулом. Скопируйте его точно. Поле можно оставить пустым, чтобы ключ получили автоматически, но тогда вы доверяете первому полученному ответу. Не надо так.
coinbase_tag_secondary — это ваше имя в блоке. Основной тег ставим мы сами: так принято в DATUM, и только благодаря этому обозреватели вообще относят блок к пулу. Но вторая строка — ваша, и мы её никогда не перезаписываем. Именно она видна в обозревателях рядом с нашим именем, и именно поэтому ваши блоки читаются как DATUM miners via B2Pool, а не просто с названием пула.
Затем запустите:
ratum-gateway -c /etc/ratum/gateway.json
Когда всё заработает, оформите systemd-юнит, чтобы шлюз поднимался после перезагрузки. Одно замечание о pooled_mining_only: при true ваши майнеры простаивают, если пул недоступен. При false они продолжают майнить, и любой найденный в это время блок платит 100 % на ваш собственный mining.pool_address, а не в распределение. Оба варианта разумны: первый предсказуем, второй никогда не останавливается.
05Направить майнеры на шлюз
Теперь ваше оборудование разговаривает с вашей машиной, а не с нами. Используйте локальный адрес хоста со шлюзом:
stratum+tcp://192.168.1.50:23334
- Имя пользователя
- bc1q…вашадрес.rig-01 — ваш выплатной адрес, при желании точка и имя воркера
- Пароль
- любой, он не проверяется
- Минимальная сложность
- 2048. Ниже этого пул ничего не начисляет, поэтому оставьте vardiff_min как есть
Часть до первой точки должна быть настоящим адресом этой цепи — пул начисляет работу именно этой строке, а всё остальное возвращается как BadUsername. Какой адрес получит выплату, решают две настройки шлюза:
| Настройка шлюза | Что получает пул | Кому платят |
|---|---|---|
| pool_pass_full_users: true | собственное имя пользователя каждого майнера, без изменений | на собственный адрес каждого майнера, отдельно |
| pool_pass_workers: true pool_pass_full_users: false |
ваш mining.pool_address, затем точку и имя воркера | вам — имя воркера это просто метка |
В настройках выше взят первый вариант, чтобы один шлюз мог стоять перед машинами нескольких людей и каждому платили на его собственный адрес. Если все майнеры за ним ваши, второй вариант аккуратнее.
pool_pass_full_users имеет приоритет. Когда он включён, pool_pass_workers игнорируется, поэтому включить оба - как в примере выше - означает первую строку, а не смесь двух. От этого зависит и то, что сможет показать страница пула: пул видит только то имя пользователя, которое отправил ваш майнер. Майнер, который авторизуется одним адресом и ничем больше, приходит как одна единственная учётная запись: одна общая сумма, без списка воркеров и без числа майнеров. Дайте каждому майнеру <адрес>.<любое имя> - и имена появятся. Во второй строке шлюз делает это за вас: он добавляет собственное имя каждого майнера к вашему адресу, а безымянных подписывает по их локальному IP, так что вы увидите 192x168x1x50, где точки заменены на x, потому что точка - разделитель.
06Убедиться, что всё работает
Четыре проверки, в этом порядке. Каждая исключает свою причину отказа.
- 01У шлюза есть сессия
Вскоре после старта в логе появляется hello ok. Нет строки — значит неверны хост, порт или открытый ключ.
- 02Работа выдаётся
По строке на каждую новую вершину: Updating standard stratum job for block …. Тишина здесь означает, что узел ещё не досинхронизировался.
- 03Шары принимаются
Собственная страница вашего майнера показывает растущее число принятых шар и отсутствие отказов.
- 04Вы видны в пуле
В течение нескольких минут ваш адрес появится на странице майнеров, а ваша собственная страница /miner/<адрес> начнёт заполняться.
Когда что-то не работает.
Пять вещей, которые действительно ломаются, и что каждая из них означает.
| Что вы видите | Что это значит |
|---|---|
| работа вообще не выдаётся | Узел ещё не дошёл до правила BLAKE2b или всё ещё синхронизируется. Пока шаблон не содержит !blake2b, шлюз осознанно не выдаёт ничего, вместо того чтобы отдавать работу для не той цепи. |
| BadUsername | Имя пользователя до первой точки не является адресом, который принимает эта цепь. Проверьте его командой bitcoin-cli validateaddress <адрес> на своём узле. Обратите внимание, КАКОЕ имя пользователя имеется в виду: при pool_pass_full_users: true шлюз передаёт имя самого майнера, поэтому исправлять нужно в майнере, а не в datum.pool_username - у шлюза с безупречным собственным адресом всё равно будут отклонены все шары, если одна машина авторизуется как rig-3. Пока это так, работа не зачисляется, и такой майнер работает впустую. Наша сторона журнала называет это наоборот: payout address "rig-3" cannot be paid: not a valid address. |
| NoSplit | Ваш шлюз добыл coinbase, который не выплатил ничего из распределения, присланного пулом. Это признак устаревшего или неправильно собранного шлюза, а не вашей ошибки — обновите его. |
| StaleBlock | Шара пришла на вершину, которая уже сменилась. Несколько штук в день — норма. Постоянный поток означает, что blocknotify не доходит до шлюза. |
| выходы не попали в блок | blockreservedweight слишком мал, в coinbase не хватило места для всего распределения. Поднимите до 32 000 и перезапустите узел. |
Со всем остальным приходите в Discord и приносите строку из лога шлюза. Обычно дело в одной настройке.
Вопросы, которые стоит задать заранее.
Заработаю ли я меньше, чем майнеры на обычных портах?
Нет — столько же за ту же работу. Оба пути делятся из одного и того же скользящего окна недавней работы пула — восьмикратной сложности сети — и оба платятся прямо из coinbase блока. Комиссия на обоих — 1 %. Здесь вы получаете шаблон: транзакции выбираете вы.
Можно ли запустить это на машине, рядом с которой уже стоит мой майнер?
Да, и так обычно и делают. Шлюз крошечный; диск нужен узлу. Подойдёт любая постоянно включённая машина в той же сети, в том числе Raspberry Pi 5 с настоящим SSD. Только не SD-карта — chainstate её износит.
Нужно ли открывать порт в интернет?
Нет. Ваш шлюз сам устанавливает исходящее соединение с пулом, а майнеры дотягиваются до него по вашей же сети. Снаружи ничего быть доступным не должно, и узлу тоже не нужны входящие соединения.
Может ли мой узел быть обрезанным?
Да. Для сборки шаблонов нужны набор UTXO и мемпул, а не старые блоки. Обрезка здесь — рекомендуемая конфигурация, и мы сами работаем так же. txindex вам тоже не нужен: он съедает диск и на этом пути ничего не даёт.
Что будет, если мой узел или шлюз выключится?
Пока он выключен, ваши майнеры не зарабатывают — ровно как в любом пуле, — а работа, уже попавшая в выплатное окно, продолжает платить вам, пока оттуда не выйдет. Ничего не теряется и ничего не нужно возвращать. Пропишите майнеру второй слот пула на наш обычный stratum-порт, и он сам переключится.
Видит ли пул, какие транзакции я включаю?
Только потом, как и все остальные, когда блок опубликован. Пулу отдают блок для передачи в сеть; выбора, что в него войдёт, он не получает никогда. В этом и весь смысл такой схемы.
Почему основной тег coinbase ставит пул, а не я?
Потому что именно это поле читают обозреватели, чтобы отнести блок к пулу. Если бы каждый шлюз писал своё, блоки пула нельзя было бы посчитать как блоки пула. Второй тег — ваш, мы его не трогаем, и именно он обозначает вас в блоке.
Есть ли минимальная выплата?
10 000 сатоши. Выход меньше этого стоит дороже потратить, чем он несёт, поэтому он не записывается в блок — он переносится и выплачивается с вашей следующей долей. Страница майнера показывает обе величины.