Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vvk
7 лет назад

Как узурпировать майнинг на Голосе?

Предыдущая статья из серии:

Пока goloscore не выкатили нам очередной HF, рассмотрим текущее состояние PoW-майнинга голоса.

В официальной документации и на wiki данный вопрос рассмотрен довольно скудно. Когда я начал изучать эту тему, было непонятно, как между собой связан майнинг и делегатство. На wiki для ноды майнера и делегата приводится 2 отдельных конфига, что как бы намекает, что нода может быть или майнером, или делегатом.

Статьи для изучения

Вот материалы с wiki, которые я изучил первым делом и которых всё же не хватило для более-менее полного понимания картины:

Нужно патчить или нет?

Во всех статьях написано, что из коробки майнинг не работет и нужно пересобрать golosd с патчем, что я и сделал. Надо сказать, что данный патч уже приложен в golos в отдельном бранче, но в тэге v0.16.4 его нет. Судя по коммитам, в этом отдельном бранче уже есть правки, которые пойдут в Hard Fork, так что сомневаюсь, что эта версия заработает в текущей сети Голоса.

В общем, я не проверял официальный docker-образ, и просто так там не понятно, из какого тэга/бранча он собран, и поэтому не могу достоверно сказать, работает там майнинг или нет.

Вкратце про генерацию блоков

1 блок генерируется примерно раз в 3 секунды. Генерация блоков происходит раундами. В раунде производится генерация 21-го блока, т.е. раунд длится примерно 63 секунды. В раунде первые 19 блоков производят топ-19 делегатов, 20-й блок производит делегат не из топа, причём вероятность выбора делегата зависит от того, кто и с какой силой голоса за него голосовал. И 21-й блок производит PoW-майнер, который перед этим "выстоял" очередь.

На Голосе pow-майнер сперва выполняет PoW, потом встаёт в очередь на генерацию блока, и вот когда он наконец генерирует блок, получает свою награду.

Note: Чтобы сгенерировать блок, нода pow-майнера одновременно должна быть witness-нодой (witness = делегат)!

Минимальный конфиг witness-ноды

Допустим, pow-майнинг нам не интересен, мы метим в делегаты. Тогда нам достаточно поправаить дефолтный конфиг таким образом, чтобы там были следующие параметры:

public-api = database_api login_api
enable-plugin = witness

# name of witness controlled by this node (e.g. initwitness )
witness = "foo"

# WIF PRIVATE KEY to be used by one or more witnesses or miners
private-key = 5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Q: Что за WIF PRIVATE KEY нужно сюда писать?
A: В cli_wallet нужно сгенерировать пару ключей с помощью команды suggest_brain_key. Приватный ключ поместить в private-key, а публичный ключ надо опубликовать с помощью команды update_witness. Подробный пример есть в статье @vik про поднятие ноды делегата, которая тепеь на wiki. witness-информацию можно посмотреть командой get_witness <аккаунт>

Минимальный конфиг miner-ноды с созданием нового аккаунта

А теперь вкусное: как же собственно настроить рабочую майнинг-ноду. Для чистоты примера мы воспользуемся несуществующим аккаунтом, намайнив его.

public-api = database_api login_api
enable-plugin = witness

# name of witness controlled by this node (e.g. initwitness )
witness = "foo"
miner = ["foo", "5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]

Здесь мы говорим, что у нас на ноде должен быть майнер "foo" с таким-то ключом (WIF PRIVATE KEY - генерируется так же, с помощью suggest_brain_key) и одноимённый witness (делегат). Аккаунт несуществуюший, никакие update_witness делать не надо.

Q: Что произойдёт после запуска ноды с таким конфигом?
A: Нода запустит майнинг, начнётся поиск PoW, в логе будут строчки вида Broadcasting Proof of Work for foo. Через некоторое время PoW будет найден (строчки перестанут выводиться), одновременно с нахождением PoW создаётся новый аккаунт foo и встаёт в очередь майнеров на генерацию/подпись блока. Вот зачем нам нужен witness в конфиге - без этого не получится сгенерировать блок, когда очередь дойдёт до нашего майнера foo.

Директиву private-key в конфиге указывать не нужно! Нода и так знает private key foo потому, что он указан в директиве miner.

После того, как до "foo" дойдёт очередь, он сгенерирует блок с записью в логе вида Generated block #10172618 with timestamp 2017-10-07T16:29:39 at time 2017-10-07T16:29:39 by foo, одновременно с этим ему начислится награда в Силу Голоса. После этого майнер опять начнёт искать PoW и снова встанет в очередь, и так по кругу.

Где тут подводные камни?

Свеженамайненный аккаунт имеет нулевой баланс и не может отправлять в сеть транзакции. Если до него дойдёт очередь на генерацию блока, но он его пропустит (например, вы выключили ноду или неправильно сконфигурировали), в witness-информации signing_key сбросится на специальный ключ GLS1111111111111111111111111111111114T1Anm, и после этого ваш майнер перестанет искать PoW и соответственно попадать в очередь. Если такое произошло, на аккаунт вашего майнера надо передать немного Силы Голоса, чтобы он смог отправлять транзакции в сеть, и сделать ему update_witness, примерно так:

transfer_to_vesting "от_кого" "кому" "0.010 GOLOS"  true
update_witness "foo" "https://golos.io/@foo" "GLS_публичный_ключ" {"account_creation_fee":"3.000 GOLOS","maximum_block_size":65536,"sbd_interest_rate":1000,"fee":"1.000 GBG"} true

После этого майнер опять пойдёт искать PoW и встанет в очередь на генерацию блоков.

Ещё один момент - у намайненного аккаунта все ключи одинаковые, и например на golos.io им залогиниться не получится. Это не проблема, ему надо будет просто сменить posting-ключ. Вот статья от @primus как это сделать.

Как узурпировать майнинг на Голосе

А вот про это не писал ещё никто. Очередь майнеров можно посмотреть командой get_miner_queue в cli_wallet. Сейчас например мы там видим кучу однотипных аккаунтов:

[
  "itsmine-11",
  "jackpot",
  "vvk7",
  "itsmine-53",
  "kazna",
  "itsmine-23",
  "big.brother",
  "itsmine-24",
  "itsmine-25",
  "itsmine-26",
  "itsmine-27",
  "vvk11",
  "itsmine-29",
  "itsmine-30",
  "itsmine-54",
  "bigler",
  "vvk12",
  "itsmine-81",
  "itsmine-31",
....

Когда я это увидел, сразу возник вопрос - неужели кто-то держит такое количество нод голоса чисто ради майнинга? Да ну нафиг! Я начал копаться и быстро выяснил, что на одной ноде на самом деле можно запустить кучу майнеров. В конфиге указываем несколько директив, и всё:

witness = "foo2"
witness = "foo3"
miner = ["foo2", "5_our_secret_key"]
miner = ["foo3", "5_our_secret_key"]

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

Получается, количество майнеров на одной ноде можно выставить таким образом, чтобы нода постоянно искала PoW. Потому что когда PoW найден, майнер просто встаёт в очередь и ждёт.

Каков размер награды за генерацию блока?

Размер награды снижается с течением времени. На данный момент награда примерно такая:
387.560510 GESTS ~ 0.102851055 GOLOS ~ 0.00000233 BTC ~ 0.59 RUB

Здесь GESTS - это сколько намайнилось Силы Голоса, она пересчитывается в GOLOS умножением на steem_per_mvests (можно посмотреть в cli_wallet командой get_steem_per_mvests), ну а дальше понятно - биржевые курсы.

Количество сгенерированных блоков за сутки одним майнером зависит от сложности, а она - от размера очереди. При майнинге с нескольких аккаунтов может получиться несколько десятков блоков.


Данный пост участвует в программе 50/50.

0
132.518 GOLOS
На Golos с September 2017
Комментарии (14)
Сортировать по:
Сначала старые