Оглавление:

Биткойн-майнер ESP8266: 3 шага
Биткойн-майнер ESP8266: 3 шага

Видео: Биткойн-майнер ESP8266: 3 шага

Видео: Биткойн-майнер ESP8266: 3 шага
Видео: Майнинг для начинающих ✅ Как зайти в майнинг и добывать криптовалюту? | МАЙНИНГ ИНСТРУКЦИЯ 2024, Июль
Anonim
Биткойн-майнер ESP8266
Биткойн-майнер ESP8266

Поскольку цена Биткойна продолжает расти, а пара ESP8266 всегда подключена, но мало что делает, я подумал, почему бы не попробовать реализовать Solo Bitcoin Miner. После небольшого экспериментирования я получил ESP8266 до ~ 1200 хешей в секунду, и по состоянию на декабрь 2017 года сеть Биткойн выполняла около 12 000 000 тера хэшей в секунду (последние числа вы можете проверить в blockchaininfo).

Таким образом, исходя из этих чисел, у нас будет шанс 1 из 1e16 успешно добывать блок каждые десять минут, где в настоящее время блок стоит 212 000 долларов. Конечно, это очень похоже на покупку лотерейного билета, только с гораздо меньшими шансами на выигрыш., но вы знаете старую поговорку: кто-то должен победить. И с проектами Gate Mate, и с Super Squirter ESP8266 большую часть времени они не выполняют никакой работы, они просто подключены и ждут запросов или входов, так почему бы не поместить их в него и, возможно, выиграть немного монет. Первым шагом было попытаться выяснить, возможно ли вообще выполнить двойной SHA256 для заголовка блока на ESP8266. В мире биткойнов «хеш» на самом деле представляет собой двойной SHA256, но мы будем называть его просто хешем. В любом случае, немного погуглив, я нашел эти две страницы, на которых была вся информация, необходимая для хеширования.

1. Алгоритм блочного хеширования

2. Биткойн-майнинг на горьком опыте: алгоритмы, протоколы и байты.

Стоит отметить, что протокол getwork, описанный в приведенных выше ссылках, устарел. Он был заменен протоколом getblocktemplate, что немного усложняет создание заголовка блока, в частности, вам нужно создать свой собственный корень Меркла. Чтобы узнать обо всех подробностях, посетите вики-страницу getblocktemplate.

Шаг 1: алгоритм

Алгоритм
Алгоритм

Давайте сразу перейдем к делу, код ESP8266 находится в репозитории ESP8266BitcoinMiner на GitHub. Я не собираюсь перефразировать всю информацию из приведенных выше ссылок, а просто выделю основные моменты.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc88692d74df2c8c882d2d2d1cd7d797f7ffc88692b4d1

char header_hex - это заголовок блока, который состоит из шести полей: Version, hashPrevBlock, hashMerkleRoot, Time, Bits и Nonce, объединенных вместе как маленькие конечные значения в шестнадцатеричной нотации. Это было просто скопировано из приведенной выше ссылки, но в реальном полноценном майнере вы получите каждое из этих полей в объекте json, а затем вам нужно будет отсортировать порядок байтов и собрать их на лету каждые 10 минут.

uint8_t * hex_decode (const char * in, size_t len, uint8_t * out) {

беззнаковое int i, mg, ng, rg; for (mg = 0, i = 0; i '9'? in - 'a' + 10: in - '0'; rg = in [i + 1]> '9'? in [i + 1] - 'a' + 10: in [i + 1] - '0'; out [mg] = (ng << 4) | rg;} return out;}

hex_decode принимает строку header_hex, которая содержит шестнадцатеричные символы ascii, и заполняет хэш-байты uint8_t [80] соответствующими байтовыми значениями, готовыми для хеширования SHA256.

void hash () {

шестнадцатеричный_декод (header_hex, strlen (header_hex), hashbytes); беззнаковый длинный старт = micros (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); байтовый хеш [SHA256_SIZE]; hasher.doFinal (хеш); hashagain.doUpdate (хеш, sizeof (хеш)); байтовый хэш2 [SHA256_SIZE]; hashagain.doFinal (hash2); беззнаковый длинный конец = micros (); беззнаковая длинная дельта = конец - начало; Serial.println (дельта); Serial.print ("Big Endian:"); for (byte i = 32; i> 0; i -) {if (hash2 [i-1] <0x10) {Serial.print ('0'); } Serial.print (hash2 [i-1], HEX); } Serial.println (); Serial.print ("Little Endian:"); для (байт я = 0; я <SHA256_SIZE; я ++) {если (хэш2 [я] <0x10) {Serial.print ('0'); } Serial.print (hash2 , HEX); }}

hash просто дважды хеширует хеш-байты (двойной SHA256), выводит потребленные им использованные секунды и выводит результирующий хэш как с прямым порядком байтов, так и с прямым порядком байтов. Если бы хэши были вложены только в один хеш-код SHA256, это, вероятно, было бы немного быстрее, но в любом случае с приведенным выше кодом требуется 832 мксекунды для выполнения двойного хеширования, и вы можете видеть на снимке экрана, что мы получаем правильный хеш.

Шаг 2. Попадание в стену и действительно большой блок

Удар о стену и действительно большой блок
Удар о стену и действительно большой блок

Таким образом, если для выполнения одного хеша требуется 832 мксекунды, мы можем выполнить 1 / 0,000834 = 1201 хэш / сек.

Чтобы быть ясным, мы взяли информацию из блока № 125552, где мы знали одноразовый номер, он уже был добыт и использовал эту информацию в качестве тестового примера, чтобы убедиться, что мы можем получить тот же хэш с ESP8266. Таким образом, после получения прибыли с полностью реализованным майнером вы случайным образом угадываете одноразовый номер, хешируете с ним заголовок блока, а затем сравниваете результат со сложностью для этого блока. Если хэш встречает сложность, он затем отправляется в сеть для проверки.

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

Итак, если вы посмотрите на диаграмму, вы увидите, что демон биткойнов, который является частью ядра биткойна, заботится о связи между сетью и майнером. На самом деле это означает, что вам нужно запустить ядро Биткойн на сервере, чтобы ESP8266 мог получать новый заголовок блока каждые 10 минут, а затем иметь возможность отправлять обратно в сеть.

Я не пробовал, но похоже, что вам нужно будет синхронизировать всю цепочку блоков примерно на 130 гигабайт, прежде чем она будет должным образом взаимодействовать с сетью, в вики они упоминают, что определенные шаги должны быть выполнены, прежде чем все функции станут доступны, так что почти уверен вот что они имеют в виду.

Так что это подтолкнуло меня к этому, с точки зрения исследования все это было очень интересно, и было довольно круто видеть, как маленький ESP8266 успешно хеширует тестовый пример, но практически я не вижу, чтобы многие люди загружали ядро, синхронизируя все блокчейн, поддерживая все в актуальном состоянии, не отставая от проблем с безопасностью, и все это дает шанс выиграть блок 1 из 1e16. Для меня мост слишком далеко.

С самого начала я знал, что скорость хеширования будет ужасной, но любопытство взяло верх, и мне пришлось попробовать. Вместо соло-майнинга может быть пул для майнинга, к которому можно подключиться напрямую с ESP8266 без значительных усилий, или может быть другая криптовалюта, которая более подходящая. Если вы найдете что-то, дайте мне знать.

Шаг 3: ссылки

1. Репозиторий биткойн-майнера ESP8266 на GitHub

2. ESP8266 Crypto GitHub репозиторий

3. Трудный путь майнинга биткойнов: алгоритмы, протоколы и байты.

4. Алгоритм блочного хеширования

5. Блок 125552

Рекомендуемые: