Основы майнинга

0 393
  1. Что такое майнинг
  2. Процесс майнинга
  3. Пулы и вида начисления наград
  4. Эмиссия
  5. Подтверждение транзакции
  6. Блок и его структура
  7. Proof of work
  8. Proof of stake
  9. Сложность
  10. Double-spending

1.Что такое майнинг

Майнинг (англ., «mining») — это процесс записи транзакций с биткоинами в блокчейн, общедоступную базу данных по всем операциям с Bitcoin, которая отвечает за подтверждение транзакции. Узлы сети используют блокчейн, чтобы отличить реальные транзакции от попыток потратить одни и те же средства дважды. Основная цель майнинга — это достижение консенсуса между узлами сети относительно того, какие транзакции считать легитимными.

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

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

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

2.Процесс майнинга

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

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

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


3.Объединение в пулы

Майнинг биткоинов представляет собой очень сложный процесс, для выполнения которого требуется наличие существенных мощностей. Постоянно возрастающая сложность майнинга и развитие рынка криптовалют привело к тому, что заниматься майнингом в одиночку стало практически невозможно. В результате появилось понятие «майнинг в пулах», подразумевающее объединение вычислительных мощностей нескольких участников в группу для генерации новых блоков. Вознаграждение, полученное пулом за закрытый блок, распределяется между его участниками. Пользователи предоставляют пулу свои вычислительные мощности. Особенность задачи позволяет применить максимальное распараллеливание вычислений, когда каждый участник ищет свой вариант решения без увязки его результатов с решениями других. Часто выплаты майнеру рассчитываются исходя из отправленных им пулу шар (shares) (блоков с хешем, который подошёл бы при сложности равной единице). В среднем нужно 232 операций хеширования для нахождения одной шары. Для нахождения блока в среднем требуется количество шар, равное текущей сложности.

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

  • Proportional — После нахождения пулом блока награда делится пропорционально вкладу каждого участника.
  • PPS — Вознаграждается каждая присланная шара. Оценивается как текущее вознаграждение за блок, деленные на текущую сложность.
  • Score — Оценочная система вознаграждения шар, алгоритм определяется организатором пула.

У этих типов начисления есть следующие популярные варианты:

  • SMPPS — Аналогично PPS, но пул никогда не передаёт пользователям больше, чем реально получил сам. Разница между реальным получением награды пулом и вознаграждением шары в PPS, если таковая есть, компенсируется постепенно.
  • ESMPPS — Аналогично SMPPS, но уравнивает приоритеты вознаграждения постоянным и новым участникам пула.
  • RSMPPS — Аналогично SMPPS, но первыми в очереди на вознаграждение ставятся новые пользователи.
  • PPLNS — Аналогично Proportional, но деление награды осуществляется пропорционально вкладу в последние сложность присланных на пул шар, умноженному на N, где N обычно равно 2.

4.Эмиссия

Выпуск новых биткойнов децентрализован, не зависит от какого-либо регулирующего органа, объём эмиссии известен заранее. Стандартную порцию новых биткойнов в качестве вознаграждения получает тот, кто добавил очередной блок в базу транзакций. Вероятность успеха пропорциональна доле задействованной вычислительной мощности в суммарной мощности сети Биткойн, но результат в конкретный момент носит случайный характер. После формирования каждых 210 000 блоков (приблизительно раз в 4 года) запрограммировано размер вознаграждения уменьшать вдвое, то есть его значение является убывающей геометрической прогрессией. Общий объём эмиссии биткойнов ограничен как сумма членов убывающей геометрической прогрессии и не превысит 21 миллион. На май 2014 года в обращении находилось 12,7 миллионов биткойнов.

Первоначально размер эмиссии при создании блока составлял 50 биткойнов. 28 ноября 2012 года произошло первое уменьшение эмиссионной награды с 50 до 25 биткойн. Следующее уменьшение в два раза произошло 9 июля 2016 года. В 2031 году эмиссия будет остановлена вовсе (размер вознаграждения 50 → 25 → 12.5 → … → 0). Формирование блоков продолжится и далее, но за них уже не будет начисляться вознаграждение новыми биткойнами. Предполагается, что постепенно основным источником вознаграждения за формирования новых блоков станут комиссионные сборы.

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


5.Подтверждение транзакции

Подтверждение транзакции (англ., «confirmation») необходимо для предотвращения повторной траты одних и тех же денежных средств.

Назначение

Обычно при получении bitcoin-монет новый владелец не может сразу же распоряжаться ими. Как только транзакция произведена – она отправляется в сеть Bitcoin для исполнения и должна быть включена в блок, чтобы стать легитимной. Процесс включения транзакции в состав найденного блока называется подтверждением транзакции. Включение в 1 блок = 1 подтверждение, когда таких подтверждений набирается 6 и выше транзакция считается подтвержденной. Такая функция была введена для защиты от повторной траты одних и тех же биткоинов. Включением транзакции в блок присходит во время процесса майнинга.


6.Блок

Блок — перманентно записываемые файлы в сети Bitcoin, содержащие информацию о произошедших транзакциях. Блок — это запись части или всех недавних транзакций, которые еще не были записаны в предыдущие блоки. Практически во всех случаях блоки добавляются в конец цепи, которая содержит все транзакции и носит название block chain («блокчейн»). Когда блок добавлен в конец цепи, он не может быть изменен. Каждый блок содержит информацию обо всём, что произошло в предыдущих блоках, перед тем как он был создан.

Структура блока

Поле Описание Размер
Magic no. Значение всегда равно 0xD9B4BEF9 4 байта
Размер блока (blocksize) Число байт, которые надо добавить в конец блока 4 байта
Заголовок блока (blockheader) Состоит из 6ти компонентов 80 байт
Счетчик транзакций (transaction counter) Положительное целое число VI = VarInt 1-9 байт
Транзакции (transactions) Список транзакций Множество транзакций

Описание

Каждый блок, помимо остальных компонентов, содержит в своем заголовке запись о нескольких или всех последних транзакциях и запись о блоке, который шел непосредственно перед текущим. Для создания нового блока майнерунеобходимо решить на своём оборудовании задачу, которую выдает сеть. У каждого блока — свое уникальное решение, которое так же записывается в заголовок блока. Эта задача сложна для решения и занимает большое количество времени, но как только один из пользователей (майнеров) решает задачу, остальная сеть очень быстро подтверждает, что решение верно. Существует несколько решений для каждого блока – достаточно найти хотя бы одно из них.

Так как за нахождение блока выдается награда в 25 BTC, блок так же содержит Bitcoin-адрес, на который отправлена награда. Запись об этой транзакции называется – generation transaction, т.е. транзакция создания Bitcoin, в списке транзакций блока она всегда находится на 1м месте. Bitcoin транзакции транслируются на всю сеть отправителем – узлы собирают информацию о них и, руководствуясь определенными условиями, включают их в найденный блок.


7.Proof-Of-Work

Proof of work (в дальнейшем PoW) — это часть информации, которую было сложно (времязатратно, дорого) произвести для удовлетворения определенных условий. Проверка же этой информации должна быть максимально проста. Назначение proof-of-work — проверить, что вычисления действительно были осуществлены при создании нового блока.

Принцип работы

Hashcash функция используется в Bitcoin для создания блоков. PoW, которое привязано к содержимому блока, необходимо для принятия блока системой. Сложность этой задачи варьируется для контроля частоты нахождения блоков. Система запрограммирована таким образом, что бы частота нахождения блоков, в среднем, составляла 1 блок в 10 минут.

В виду того, что процесс нахождения блока весьма трудозатратен и случаен, невозможно с точностью предсказать какой Bitcoin-worker (майнер) решит задачу и найдет блок. Для того, что бы система признала блок истинным необходимо, чтобы его hash составлял значение меньшее по сравнению с текущей целью (target). Таким образом, каждый блок показывает, что была проделана определенная работа по его нахождению.

Каждый блок содержит хеш предыдущего блока, образуя цепь. Изменить блок невозможно – возможно лишь создать блок на той же высоте, который будет содержать в себе hash предыдущего блока. Для проведения такого процесса необходимо проделать работу по нахождению всех предыдущих блоков. Высокая сложность этого процесса защищает цепочку блоков (block chain) от несанкционированного доступа и атак типа double-spending.


8.Proof-of-stake

Proof-of-stake — метод генерации блоков, энергоэффективная альтернатива proof-of-work (PoW), в которой вместо вычислительных мощностей используется «вес», рассчитываемый как произведение суммы входа на время прошедшее с его появления на адресе.


9.Cложность

Сложность (англ, «Difficulty») — это единица измерения, которая показывает, насколько сложно найти хеш, который будет ниже предложенной системой цели (таргета).

Принципы функционирования

В сети Bitcoin для всех блоков существует глобальная сложность. Блок, для того, что бы считаться корректным, должен иметь хеш ниже заявленной цели (таргета).

Сложность в сети Bitcoin меняется каждые 2016 блоков. Она рассчитывается по следующей формуле:

difficulty = difficulty_1_target / current_target

где difficulty – сложность, а target – 256 битное число.

Difficulty_1_target может принимать различные значения. Традиционно это хеш, 32 первых бита которого являются 0, остальную часть составляют единицы (это также называется pdiff или pool difficulty). Bitcoin протокол представляет цель (target), как тип с плавающей точкой и ограниченной точностью. Зачастую, именно основываясь на этих данных, Bitcoin клиенты определяют сложность.

Хранение сложности в блоках

Каждый блок хранит в себе запакованную версию (называемую “Bits” или «Биты») шестнадцатеричной цели.

Используя следующую формулу, из каждого блока можно получить его цель. Например, если запакованная цель в блоке имеет вид 0x1b0404cb, то ее шестнадцатеричная версия будет выглядеть следующим образом:

0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000

Максимальное значение для этого поля — 0x7fffff, минимальное же составляет 0x008000.

Максимально возможная цель (при сложности 1) определена как 0x1d00ffff, что в шестнадцатеричном варианте имеет вид:

0x00ffff * 2**(8*(0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

Ниже представлен быстрый способ вычисления сложности сети Bitcoin. Для логарифмирования он использует измененную версию ряда Тейлора и основывается на логах для преобразования вычисления сложности.

#include <iostream>
#include <cmath>
 
inline float fast_log(float val)
{
   int * const exp_ptr = reinterpret_cast <int *>(&val);
   int x = *exp_ptr;
   const int log_2 = ((x >> 23) & 255) - 128;
   x &= ~(255 << 23);
   x += 127 << 23;
   *exp_ptr = x;
 
   val = ((-1.0f/3) * val + 2) * val - 2.0f/3;
   return ((val + log_2) * 0.69314718f);
}
 
float difficulty(unsigned int bits)
{
    static double max_body = fast_log(0x00ffff), scaland = fast_log(256);
    return exp(max_body - fast_log(bits & 0x00ffffff) + scaland * (0x1d - ((bits & 0xff000000) >> 24)));
}
 
int main()
{
    std::cout << difficulty(0x1b0404cb) << std::endl;
    return 0;
}

Максимальная, текущая и минимальная сложности

Текущую сложность можно узнать воспользовавшись Bitcoin-командой getDifficulty.

Ввиду того, что не существует минимальной цели (target), примерно рассчитать максимальную сложность можно следующим образом: maximum_target / 1 (т.к. 0 приведет уравнение к бесконечности), что является невообразимым числом (~ 2 в 224 степени).

Минимальная же сложность равняется 1.

Изменение сложности

Сложность меняется каждые 2016 блоков, основываясь на времени, которое потребовалось для нахождения предыдущих 2016 блоков. Если блок будет находиться каждые 10 минут (как это задумывалось изначально для равномерной эмиссии), нахождение 2016 блоков займет ровно 2 недели. Если предыдущие 2016 блоков были найдены за срок более 2х недель – сложность будет уменьшена, если меньше – сложность будет увеличена. Чем больше (или меньше) времени было затрачено на нахождение предыдущих 2016 блоков, тем больше уменьшится (или увеличится) сложность.

Для нахождения блока хеш должен быть меньше цели (принцип работы proof-of-work). Хеш является случайным числом от 0 до 2*256-1.

Смещение для сложности 1: 0xffff * 2**208
Для сложности D: (0xffff * 2**208)/D
Количество хешей, которое необходимо рассчитать для нахождения блока со сложность D: D * 2**256 / (0xffff * 2**208)
Или просто: D * 2**48 / 0xffff

Сложность заявлена таким образом, как будто мы находили предыдущие 2016 блоков с периодичностью раз в 10 минут.

Соответственно мы рассчитывали (D * 2**48 / 0xffff) хешей за 600 секунд.
Хешрейт нашей сети за предыдущие 2016 блоков составит: D * 2**48 / 0xffff / 600
Без особой потери точности можно упростить до: D * 2**32 / 600.
На сложности 1 это примерно 7 Mhash в секунду.

Среднее время нахождения блока в одиночку рассчитывается по формуле: time = difficulty * 2**32 / hashrate, где difficulty это текущая сложность сети Bitcoin, hashrate это количество хешей, которое ваш майнер находит в секунду и time это среднее время (в секундах) между нахождением вами блока.

10.Double-spending

Double-spending атакой называется удачное использование одних и тех же средств дважды. Bitcoin защищен от double-spending атаки тем, что верифицирует каждую транзакцию, которая добавляется в цепочку блоков (block chain), на предмет того, что средства, содержащиеся в транзакции, не были потрачены ранее.

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

Bitcoin имеет уязвимость к double-spending атаке на начальном этапе нахождения транзакции в сети. Чем больше у транзакции подтверждений, тем меньше риск того, что она будет использована в мошеннических целях.

Типы атак

Race attack

Магазины и сервисы, которые принимают платеж, если у транзакции 0 подтверждений, могут быть подвержены так называемой «Race attack». Например, создаются 2 транзакции на одни и те же средства, затем они направляются в различные магазины/сервисы – в данном случае лишь один из магазинов получит средства – тот, чья транзакция первой окажется в block chain.

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

Finney attack

Еще один тип атаки, которому подвержены магазины или сервисы, которые принимают транзакции с 0 подтверждений. «Finney attack» — это атака, которая требует участие майнера, для включения повторных транзакций в блок. Риск этой атаки не может быть исключен, какие бы средства защиты ни использовал магазин или сервис, но она требует участия майнера и удачного стечения обстоятельств. Она стоит больших средств и не является тривиальной задачей. Так же как и с предыдущим способом атаки, магазин или сервис должны в серьез рассмотреть свою политику на предмет транзакций с 0 подтверждений.

Vector76 attack

Так же носит название «атака с одним подтверждением» — это комбинация 2х предыдущих атак, что дает злоумышленнику возможность дважды потратить средства из транзакции, у которой есть одно подтверждение.

Brute force attack

Эта атака возможна даже в том случае, если магазин или сервис ждут несколько подтверждений транзакции, но требует достаточно высокую производительность оборудования (hashrate) атакующего.

Злоумышленник отправляет магазину транзакцию, которой оплачивает товар/услугу, продолжая в этот момент майнить ответвление цепи блоков (block chain fork), в которую включена эта транзакция. После N подтверждений магазин высылает товар. Если злоумышленник нашел больше, чем N блоков к этому моменту, он ломает свою ветвь цепи блоков и получает назад свои средства, если же злоумышленнику это не удалось — атака считается неудачной, и средства отправляются в магазин, как и положено.

Успех этой атаки напрямую зависит от скорости (hashrate) атакующего и количества подтверждений, которых ждет магазин/сервис. Например, если у атакующего находится 10% вычислительной мощности (hashrate) сети Bitcoin, а магазин, для успешного проведения транзакции, ждет 6 подтверждений — вероятность успеха такой атаки составит 0.1%.

>50% attack”

Если злоумышленник контролирует более 50% мощности сети Bitcoin, вероятность успеха предыдущей атаки становится 100%. В силу того, что злоумышленник может генерировать блоки чаще, чем оставшаяся часть сети – он может создавать свою собственную цепь блоков, пока она не станет длиннее, чем «честная» часть сети.

Оставьте ответ

Ваш электронный адрес не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.