Продолжаем знакомство с тем, как устроена и как работает децентрализованная электронная денежная система Биткоин. Начало смотрите здесь: Введение в Биткоин: Краткое техническое руководство.
Ранее мы рассмотрели устройство и работу Биткоин-сети, а также зачем нужен Майнинг, как он работает, и что такое Блокчейн и его составляющие — Блоки...
Сейчас мы рассмотрим механизм регулирования времени, необходимого для «добычи» блока, в основе которого лежит Сложность (difficulty) .
Что такое difficulty?
Difficulty — это число, которое регулирует время, необходимое майнерам для добавления новых блоков транзакций в блокчейн.
Значение difficulty (сложности) обновляется примерно каждые 2 недели(точнее — после каждых 2016 блоков) таким образом, чтобы обеспечить добавление нового блока в блокчейн в среднем за 10 минут.
Почему сложность майнинга (difficulty) важна?
Потому что это гарантирует, что блоки транзакций добавляются в блокчейн регулярно через примерно одинаковые промежутки времени, даже когда больше майнеров присоединяются к сети.
Если сложность (difficulty) будет неизменной, то потребуется меньше времени между добавлением новых блоков в блокчейн по мере присоединения новых майнеров к сети и увеличении суммарной мощности компьютеров (процессоров), занимающихся майнингом.
Когда меняется сложность майнинга (difficulty)?
Значение difficulty настраивается через каждые 2016 блоков (примерно каждые 2 недели).
На этом интервале каждый узел принимает ожидаемое время для этих блоков 2016, которые будут добыты (2016 x 10 минут), и делит его на фактическое время, которое потребовалось:
ожидаемое время/ фактическое время
20160 минут / фактическое время
Если бы майнеры могли добавлять каждый блок быстрее, чем ожидалось, скажем, тратя 9 минут на блок, мы бы получили такое число:
20160 / (2016 х 9)
20160 / 18144 = 1,11
Теперь каждый майнер использует это число для настройки сложности для «добычи» следующих 2016 блоков:
difficulty x 1,11 = new difficulty
- Если полученное число больше 1 (т. е. блоки были добыты быстрее, чем ожидалось), сложность (difficulty) возрастает.
- Если число меньше 1 (т. е. блоки добывались медленнее, чем ожидалось) сложность уменьшается.
И это всё! Каждый майнер в Биткоин-сети теперь работает с этим новым значением difficulty для «добычи» следующих 2016 блоков.
Важно! Сложность (difficulty) может корректироваться не более чем в 4 раза (то есть увеличиваться не более чем в 4 или уменьшаться не менее чем в 0,25 раза). Это сделано для предотвращения резких изменений значения difficulty.
Как сложность майнинга (difficulty) изменяет время между блоками?
Начнем с простого примера…
Допустим, имеется диапазон чисел от 1 до 100:
Необходимо случайным образом генерировать случайное число от 1 до 100 каждую минуту. И наша цель — получить число, которое будет меньше некоторого заданного (target) числа.
Допустим, заданное число или target равно 50:
Поскольку мы можем генерировать число от 1 до 100 один раз в минуту, то это займет у нас в среднем 2 минуты — вероятность получить случайное число, которое меньше 50 равна 0,5 или 50%.
Но это слишком просто. Теперь уменьшим target до 20.
Это означает, что вероятность сгенерировать выигрышное число (менее 20) составит только 1/5 или 20%. Поэтому мы получим результат в среднем за 5 минут. Разумеется, это не будет каждый раз длиться 5 минут, потому что может повезти и первое же сгенерированное число будет менее 20. Но в долгосрочной перспективе это будут 5-минутные интервалы.
Таким образом, чем меньше значение target, тем сложнее получить выигрышное число.
Основываясь на том, сколько случайных чисел генерируется каждую минуту, можно использовать такое значение target, чтобы контролировать, сколько времени потребуется для нахождения выигрышного числа.
Введение сложности (difficulty)
Вместо того, чтобы сообщать значение target напрямую, проще указать target, разделив имеющийся диапазон чисел новым числом.
Это новое число и есть difficulty (сложность), и оно используется как простой способ менять значение target.
Для расчета значения target используется простая формула:
target = targetmax / difficulty
Кроме того, можно использовать это значение difficulty, чтобы установить target на любой желаемый уровень:
Чем больше difficulty, тем меньше target.
Поэтому difficulty (сложность) используется, чтобы менять target, и, следовательно, время, необходимое для поиска выигрышного числа.
Как это используется в Биткоине
Сложность (difficulty) в Биткоине работает точно так же — она используется для установки значения target, и майнеры, хэшируя свои блоки-кандидаты, перебирают числа (nonce), в надежде, что получат такое значения хэша, которое будет ниже этого target:
И поскольку майнеры могут генерировать тысячи чисел (хеш-значений) в секунду, Биткоин использует колоссальный диапазон для значений target:
В Биткоине диапазон чисел просто в гораздо большем масштабе.
В связи с тем, что сейчас тысячи майнеров пытаются найти выигрышные номера, чтобы гарантировать, что выигрышный номер будет найден каждые 10 минут (а не каждые несколько секунд), диапазон успешных чисел в конечном итоге будет совсем маленьким:
Несмотря на то, что это значение target выглядит очень большим, попасть в диапазон искомых чисел всё ещё чрезвычайно трудно. Это как лотерея.
Введение шестнадцатеричных чисел
Как видим, значения target очень велики, но компьютеры предпочитают работать с ними в шестнадцатеричном формате.
Вот почему значения хеш-функции для блоков выглядят так: 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
Это шестнадцатеричный код.
И хотя там есть буквы, это все же число в шестнадцатиричном формате. Таким образом, target имеет шестнадцатеричное значение, и майнеры пытаются получить шестнадцатеричное значение хеша ниже target.
Вот почему вы обычно видите хэш и target как группы цифр и букв — они в шестнадцатеричном, а не в привычном нам десятичном виде.
Примечание:
Текущее установленное Биткоин-сетью значение difficulty можно узнать здесь: http://chainquery.com/bitcoin-api/getdifficulty
* * *
В следующей публикации мы рассмотрим Транзакции, какую информацию они содержат и как хранятся в блокчейне Биткоина.
Подписывайтесь на мой аккаунт @uanix и голосуйте за меня, как делегата Голоса: https://golos.id/~witnesses
Хороший автор!
Искренне ваш @fomka