Статьи

О понятии target difficulty в майнинге

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

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

В сети биткоина алгоритм подсчета сложности майнинга отличается от Ethereum, в нем нет составляющей, предопределяющей взрывное увеличение сложности майнинга, зато четко предопределены минимальная и максимальная сложность, а также используется такое понятие как «целевая сложность» майнинга (target difficulty).

О целевой сложности майнинга криптовалют

Сложность проведения вычислений при майнинге (difficulty) связана со временем, которое нужно затратить для нахождения блока (например, в сети bitcoin время между блокам должно быть равно 10 минут, у Ethereum — 13-15 секунд).

Целевую сложность при проведении вычислений (target difficulty) можно упрощенно представить как максимальное количество знаков после запятой в числе π («Пи»). В сети биткоина отбрасываются все решения (хеши SHA256) с целевой сложностью выше заданной и принимаются те, в которых оно ниже заданной:

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

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

У биткоина получаемый результат связан с target difficulty, у Эфириума — со сложностью соседних блоков.

О сложности майнинга в сети биткоина

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

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

В исходном коде биткоина четко указаны значения минимальной и максимальной целевой сложности вычислений (minimum и largest possible target).

Текущая сложность проведения вычислений при майнинге у биткоина определяется соотношением наибольшей возможной целевой сложности (largest possible target) с текущей целевой сложностью (current target):

Difficulty = max target / current target.

Сложность майнинга в сети биткоина обратно пропорциональна величине значения current target (так как оно находится в знаменателе) и может достигать очень большого значения.

Первоначальная целевая сложность майнинга (initial target) при нахождении нулевого (Genesis) блока в сети Bitcoin 03/Jan/2009 была максимальной, а сложность проведения вычислений (difficulty) — минимальной. При этом значение difficulty равнялось 1d00ffff (в десятичной системе это единица), а целевая сложность равнялась 00000000ffff0000000000000000000000000000000000000000000000000000)

Целевая сложность майнинга для нулевого блока равнялась максимуму — 2.695953529101131e+67 в десятичной системе. Поэтому первые блоки находились значительно дольше, чем целевые 10 минут. Так как максимальное значение target в сети биткоин фиксировано, то время между блоками стало равняться 10 минутам только на блоке 32256, добытом 30 декабря 2009 года.

Информация о нулевом блоке в сети биткоин, найденном Сатоши Накамото 3 января 2009 года в 20.15 (целевая сложность указана в строке bits):

Интересно отметить, что во время создания генезесис-блока биткоина были сгенерированы первые 50 BTC (получатель — кошелек 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa), которые в тот момент ничего не стоили:

Траты с BTC-адреса, получившего первые биткоины, ни разу не производились. Сейчас на балансе этого кошелька имеется более 68 BTC, зачисления производятся и в настоящее время:

Действующее значение целевой сложности в сети биткоина (current target) изменяется (как в большую так и меньшую сторону) каждые 2016 блоков (20,160 минут, каждые 2 недели) с тем, чтобы довести целевое время нахождения блока до 10 минут.

В блокчейне биткоина каждый блок содержит метку времени (timestamp), соответствующую Unix time, отсчет которого начался 1 января 1970 года. Эти метки используются как маркеры для вычисления среднего времени между блоками:

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

Если среднее время между блоками меньше десяти минут (например, значительно вырос хешрейт в сети Bitcoin), то снижается значение target difficulty, что увеличивает сложность проведения вычислений:

В противном случае производятся зеркальные действия:

Чем выше сложность майнинга, тем ниже target difficulty (целевая сложность), поэтому, для включения блока в цепочку, его хеши должны быть ниже заданного значения target:

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

Так как число, определяющее целевую сложность (target difficulty), состоит из множества цифр (256 бит), что тяжело воспринимается человеком, то в обиходе чаще используется понятие сложности майнинга (difficulty).

О target difficulty в сети Ethereum

Согласно EIP-2, реализованному в сети Ethereum во время хардфорка Homestead, начиная с блока 1,150,000 формула подсчета сложности для нахождения блока (block_diff) состоит из двух частей и выглядит так:

block_diff = parent_diff + parent_diff // 2048 * max(1 — (block_timestamp — parent_timestamp) // 10, -99) + int(2**((block.number // 100000) — 2)),

где // — это оператор целочисленного деления (division operator).

Как видно из формулы, в блокчейне Ethereum сложность майнинга изменяется в большую или меньшую сторону каждый блок (при этом учитывается хешрейт сети) и постоянно увеличивается каждые 100 тысяч блоков (примерно каждые 15 дней) — постепенно приближается время срабатывания бомбы сложности (подробнее в статье «О сложности майнинга в сети Ethereum»).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

English English Русский Русский