Как взломать Bitcoin? Как блокчейн считает время? Как меняется сложность майнинга?
Что будет если два майнера одновременно смайнили блок? Где хранятся транзакции до подтверждения, как высчитывается их комиссия и можно ли отправить без нее? Какие узлы есть в блокчейне и чем они отличаются? Когда можно пользоваться наградой от майнинга?

 Примерно так я изучал всю информацию по этим темам.
Примерно так я изучал всю информацию по этим темам.

Тут даны ответы на эти вопросы более глубокие, потому что в популярных материалах про Bitcoin про эти вещи либо не рассказано совсем, либо очень поверхностно. Для понимания этой статьи вам нужно минимальное понимание работы блокчейна, которое можете получить тут — https://vas3k.blog/blog/blockchain/

TLDR:

  • Как взломать Bitcoin?
    Квантовый компьютер сможет получить приватный ключ из публичного, только после отправки транзакции. Если транзакции не было, кошелек защищен.
    Атака 51% даст только возможность отменить свои и чужие транзакции чтобы дважды потратить свои монеты. Контроль над чужими монетами получить невозможно.

  • Как меняется сложность майнинга?
    Раз в 2 недели идет пересчет сложности основанный на времени майнинга предыдущих двух недель.

  • Что будет если два майнера одновременно смайнили блок?
    Произойдет разделение блокчейна, пока одна из двух веток не станет длиннее, более длинная = надежная и она превратится в главную.

  • Когда можно пользоваться наградой от майнинга?
    Через 100 блоков.

  • Как блокчейн считает время?
    По медиане времени прошлых 11 блоков и по системному времени узлов.

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

  • Какие узлы есть в блокчейне и чем они отличаются?
    Полные ноды — имеют всю информацию о блокчейне и контролируют выполнение правил.
    Майнеры — обращаются к полным нодам за информацией для новых блоков.
    Легкие ноды — Зачастую используются для кошельков на слабых устройствах, за необходимой информацией обращаются к полным нодам.

В чем суть Bitcoin, кроме как спекуляции на его цене, вкратце для чайников:

Чайник для полного погружения в тему
Чайник для полного погружения в тему

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

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

  • Некастодиальный кошелек — кошелек который принадлежит только тому кто имеет от него приватный ключ, и является просто небольшим файлом.

  • Кастодиальный кошелек — аккаунт на бирже, которая контролирует ваши активы и хранит ваши средства на своих некастодиальных кошельках. Что дает бирже возможность блокировать и забирать ваши средства в случае нарушений ее правил или законов страны. Но взамен биржа дает удобный и более расширенный функционал.

Интересный факт: кошелёк в Bitcoin — это не объект внутри блокчейна, а программа, которая хранит ключи и подписывает транзакции.

В блокчейне хранятся UTXO (Unspent Transaction Outputs) — неизрасходованные выходы транзакций. Каждый UTXO “заперт” условием (программой), которое обычно привязано к адресу (на практике — к хешу публичного ключа).

Чтобы потратить UTXO, кошелёк создаёт транзакцию, в которой ссылается на этот UTXO как на вход и добавляет подпись. Узлы сети проверяют подпись и выполнение условий скрипта. В результате старый UTXO становится потраченным, а транзакция создаёт новые выходы — новые UTXO для получателей.

Приватный ключ — число. Публичный ключ можно вычислить имея приватный, но наоборот практически невозможно, о том как это сделать описано ниже, в части про атаки на Bitcoin.
С помощью приватного ключа можно подписать информацию, но эту подпись невозможно подделать публичным ключом (ну или не совсем так). Однако публичный ключ может подтв��рдить факт того, что именно тем самым приватным ключом, который является прародителем этого публичного, была сделана подпись.

 — —  — — —END-PRIVATE-KEY — — — — —
 — —  — — —END-PRIVATE-KEY — — — — —

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

А владельцем кошелька является владелец приватного ключа. Так что не стоит им делиться.

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

Заголовок блока

В каждом блоке есть заголовок с важными данными, там хранятся версия, хеш прошлого блока, merkle root (хеш всех транзакций в нынешнем блоке), время, bits (сложность майнинга) и nonce.

Вот пример блока 900К:

  • версия: 0x20aba000

  • хеш прошлого блока: 0000000000000000000196400396be46d0816dc462df4c3450972f589f4d7d24

  • merkle root: 0cfb54e522b07bd1a381adc774ec1851590ef4c3add83958135106534569f970

  • время (unix): 1749188499 (2025-06-06 06:41:39 UTC)

  • bits (nBits): 0x17023774

  • nonce: 0x925fd07a

Все эти данные суммируются и еще раз хешируются через SHA-256.
SHA-256 — это технология хеширования, ее суть взять данные, и превратить в набор других чисел, которые уже нельзя взять и превратить в первоначальные данные зная только хеш. Но хеш можно проверить, так как для фиксированного X результат всегда один и тот же Y. То есть зная Х, можно получить Y. Но зная Y получить обратно X фактически невозможно. Даже с помощью квантового компьютера.
Можете попробовать захешировать любые данные на этом сайте .
Он также является одним из главных инструментов в HTTPS-соединении которое мы испол��зуем каждый день и в сотнях других интернет протоколах он занимает важную роль.

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

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

Например в нашем примере хеш прошлого блока 0000000000000000000196400396be46d0816dc462df4c3450972f589f4d7d24, имеет 19 нулей. Такой хеш достаточно сложно подобрать. На это уходит примерно 10 минут вычислений всей вычислительной мощности майнеров Bitcoin. Так как блоки должны появляться примерно каждые 10 минут, так решил Satoshi Nakamoto, создатель Bitcoin.

И тут мы подходим к первому вопросу который у меня появился при глубоком изучении Bitcoin.

Почему именно столько нолей, и как меняется сложность майнинга?

Proof of Work наглядно
Proof of Work наглядно

Если копать еще глубже в первый вопрос, то выяснится, что дело не в нулях, а в target.
Target как раз определяет сложность майнинга, и чем он меньше, тем выше сложность, выглядит это так: хеш заголовка блока ≤ target в заголовке он записывается как bits или nBits. А target записывается в шестнадцатеричном виде (hex), и там числа близкие к нулю начинаются на нули.

Близкие к нулю числа в Bitcoin это числа которые намного меньше 2^{256} \approx 1.16 \times 10^{77}

Если target ≈ 1.8406 × 10^53, это значит, что валидным считается любой хеш заголовка блока, который как число попадает в диапазон от 0 до target: 0 ≤ hash ≤ target. Никакого фиксированного количества нулей нет — из-за малого target большинство подходящих значений в hex выглядят как числа, близкие к нулю и такие записи часто начинаются с большого числа нулей. Поэтому можно увидеть хеши с большим числом ведущих hex-нулей (например, около ~19 или больше), но это не закон: чем меньше target, тем реже случайный хеш окажется ниже порога и тем сложнее майнинг.

Лайфхак высчитывания сложности: если сложность вырастает в 16 раз, то требуемый порог становится в 16 раз ниже — и зачастую это выглядит как плюс один ведущий hex-ноль (потому что один hex-ноль соответствует фактору 16).

Но target может меняться, в зависимости от сложности. Называется retarget, это происходит каждые 2016 блоков. Учитывая что на создание 1 блока уходит в среднем 10 минут, то получается ровно 2 недели. Но не всегда 1 блок создается ровно 10 минут.

Во время retarget блокчейн использует довольно простую формулу для подсчета нового target:
Target_{new}= Target_{old}*T_{act}/T_{exp}, 4T_{exp}

Target_{new} = новый target, новая сложность майнинга.
Target_{old} = старый target.
T_{act} = время которое ушло на блоков 2016 блоков.
T_{exp} = ожидаемое время которое должно было уйти на майнинг 2016 блоков, 2016*600 (10 минут = 600  секунд)
4T_{exp} = Сложность не может меняться более чем в 4 раза в любую из сторон.

Если за время с последнего retarget, за прошедшие 2016 блоков, общий хешрейт (мощность всех майнеров) вырос, то с вероятностью почти 100%, время майнинга одного блока сократится. Значит T_{act} будет меньше T_{exp} = T_{act}/T_{exp} будет меньше 1, и Target_{new} уменьшится, а чем меньше Target_{new} тем сложнее майнинг. И наоборот, если общий хешрейт упадет, то Target_{new} увеличится и майнинг будет легче.

Но что делать если два разных майнера смайнили блок одновременно?

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

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

Если создаются два блока, то они сохраняются в узлах, и эти две цепи передаются дальше. А перед майнерами встает вопрос, по какому блоку продолжать цепочку и майнить. Зачастую они выбирают тот, что пришел раньше. И когда находят следующий блок для одной из цепочки, то он распространяется дальше и узлы соглашаются с ним, а более короткую версию забывают. Это правило более длинной цепи. Даже если образуется 2,3 и больше блоков подряд у двух цепочек, то рано или поздно, одна цепь обгонит другую.

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

Немного чисел:
Примерная вероятность создания второй цепочки при задержке между узлами в 1 секунду —0.17%, второго блока в этой же цепочки — 0.00028%, третьего —4.6\times10^{-9}, четвертого — 7.7\times10^{-12}. И именно поэтому биржи не пополняют ваш баланс после первого подтверждения транзакции в блокчейне. Зачастую ожидают 6 подтверджений, учитывая что на 1 блок уходит в среднем 10 минут, то на 6 подтверждений уйдет час.

Нет лимита длины второй/третьей цепи, потому что они быстро исчезают. Не считая этих двух случаев:
Реорганизация через 53 блока из-за ошибки в софте (источник)
Другой инцидент с реорганизацией через 24 блока (источник)
И также есть вероятность атаки через вторую цепь, но об этом в самом конце.
Отсюда вытекает следующий вопрос:

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

Все довольно просто, через 100 блоков после смайненного блока, майнер может воспользоваться наградой.
Если вы майнер и добыли блок №1000, то воспользоваться наградой за этот блок сможете только начиная с блока 1100. Выглядит это как time-lock транзакция, но технически таковой не является. Про time-lock технологию напишу в следующий раз, уж слишком много текста выходит.

Майнеры добавляют транзакции в блокчейн получая за это комиссию.

Где и сколько времени хранятся неподтвержденные транзакции, и может ли в теории пройти транзакция с нулевой комиссией?

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

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

Как узел назначает комиссию?
У узла есть определенный размер памяти где он хранит такие неподтвержденные транзакции, после их получения, но до момента записи в блокчейн.
По умолчанию он ограничен 300MiB RAM памяти и 336 часами хранения. Однако если включена настройка blocksonly в Bitcoin-Core 25.0, то RAM память будет снижена до 5 MiB, это делают зачастую для валидации блокчейна.

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

А что будет, если отправить транзакцию с минимально допустимой комиссией?
Если узел после принятия не выкинет ее из-за переполнения и майнеры не возьмут ее из-за маленькой комиссии, то она удалится по прошествии 336 часов = 2 неделям.

После принятия транзакции, узлы рассылают ее другим узлам, а майнеры вставляют транзакции с самыми высокими комиссиями в блок.
Учитывая ограничения на размер транзакции в 400 000 weight units ≈ 100KB, но может и больше с SegWit, но это слишком мелкие уже детали. Таких больших транзакций может поместиться максимум 10 в 1 блок, а самых маленьких ≈ 10 000. Но в среднем выходит 2500 транзакций на 1 блок.

Сама комиссия считается по формуле fee (sat) = vsize (vB) * feerate (sat/vB)
fee = комиссия
vsize = размер транзакции
sat = сатоши, в одном Bitcoin 100 000 000 сатоши.
vB = Виртуальный Байт.

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

Средняя транзакция весит 150vB, если в данный момент среднее sat/vB = 2, то транзакция будет стоить 300 sat, и она будет стоить $0,27.

Например за эту транзакцию в 45177 BTC (несколько миллиардов $ ), комиссия составила менее $1
Например за эту транзакцию в 45177 BTC (несколько миллиардов $ ), комиссия составила менее $1

Самый высокий sat/vB был в апреле 2024 во время халвинга и составлял от 1795 до 2751 sat/vB (источник). В тот день средняя транзакция уже стоила бы от 160 до 245$, в зависимости от того, насколько быстро ее нужно обработать.

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

Комиссия транзакции определяется узлом таким образом: fee = sum(inputs) - sum(outputs), и после уже по размеру транзакции высчитывает, подходит ли она под внутренние параметры.

Не забывайте о UTXO, если на ваш кошелек пришло за все время 10 транзакций, и вы хотите вывести всю сумму одной транзакцией, то блокчейн это будет интерпретировать как 10 inputs, значит такая транзакция будет больше весить, и соответственно больше стоить.

Чтобы экономить на комиссиях в будущем, полезно иногда делать "консолидацию" — отправлять самому себе все мелкие остатки одной транзакцией, когда сеть свободна и sat/vB минимален.

Возвращаясь к первой теме и заголовку блока, может возникнуть следующий вопрос:

Как блокчейн понимает что прошло 10 минут, и что майнеры не врут?

Блокчейн получает информацию о времени от майнеров и нод (узлы которые хранят информацию, но не майнят) в формате UTC.
Майнеры пишут время в заголовок блока. Ноды имеют свои часы и сверяют медианное время полученное от других нод.

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

Как блокчейну проверить, не врут ли ноды и особенно майнеры?
Для этого есть MTP — Median Time Past = Медиана Прошедшего время.

Медианное Прошедшее Время понять легче чем Past Simple в английском.
Медианное Прошедшее Время понять легче чем Past Simple в английском.

Не среднее, а именно медиана.
Она высчитывается из последних расставленных по порядку 11 блоков. Например:
18, 2, 12000 (лжец), 14, 6, 20, 10, 4, 16, 12, 8

Если брать среднее значение, то нужно будет суммировать все эти числа и разделить на 11, получится 1100. Из-за лжеца который поставил 12000 все сильно поменялось.
Но если брать медиану, то сначала выстраиваем по порядку:
 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 12000 (лжец)
И берем значение из середины, то есть 12. Так и высчитывается MTP.
Время нового блока всегда больше MTP, иначе блок не примут другие майнеры/ноды и не вставят в блокчейн.

Но если кто-то захочет отправиться в будущее, при каком временном отрыве отклонять блоки?

Что сильнее повлияет на мое будущее, 10 отжиманий или эта статья?
Что сильнее повлияет на мое будущее, 10 отжиманий или эта статья?

Раньше использовали NAT — Network Adjusted Time (время, скорректированное по сети).
NAT сверяет медианное время от других узлов в сети.
Но потом от NAT отказались.

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

Майнеры и другие узлы, чем отличаются и зачем нужны?

Есть 3 главных типа узлов в Bitcoin: полная нода с двумя вариациями (архивная и прореженная), легкая нода и майнер.
Остальные узлы, это надстройки поверх этих трех столпов блокчейна.

  • Полная архивная нода: сервер который имеет всю информацию о блокчейне за все время. Валидирует или отвергает блоки в согласии с правилами блокчейна.

  • Полная прореженная нода: тоже проверяет блоки, но не хранит все данные, а только UTXO и часть последних блоков.

  • Релей нода: надстройка над полной нодой, которая подключена к другим нодам с большим количеством пиров, для быстрого распространения информации. Как torrent раздачи.

  • Легкая нода: хранит только заголовки блоков для проверки их хешей. Для транзакций обращается к полной ноде. Очень удобно для кошельков на телефоне или других устройствах на которых неудобно хранить десятки гигабайт блокчейна.

  • Майнер: берет информацию из полной ноды или является таковой, на основании этой информации подбирает nonce для блока и отправляет новый блок в сеть узлов.

Если вам нужен некастодиальный кошелек на ПК, то возможно полная прореженная нода для этого будет лучшим вариантом. Выбрать нужный вам можно тут: https://bitcoin.org/en/choose-your-wallet?step=1

Как взломать Bitcoin?

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

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

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

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

И также есть много "утерянных" кошельков, с некоторых совершались транзакции, но это было много лет назад. И с помощью квантовых компьютеров монеты с этих кошельков наверное попадут назад в циркуляцию и возможно обвалят цену Bitcoin. Но оставим эти спекуляции аналитикам которых отлично описал один сатирический канал: Прошлонедельная цель по биткойну в 34 тысячи долларов пересмотрена и теперь составляет 240 тысяч.

Так что, квантовый компьютер не уничтожит таким образом Bitcoin.
Но уже думают над созданием многоразового квантово защищенного кошелька. Это потребует soft-fork (изменения правил), что уже не раз делалось.
Пару текстов на эту тему: BIP 0347 и BIP 360.

Атака 51%
Если 1 человек будет иметь более 51% мощности майнинга, то ему будет легко создать вторую цепь блоков так, как он хочет. В этом случае он сможет отменять транзакции и переписать историю своих трат.
Но даже в этом случае не сможет никак украсть чужие монеты, которые никогда не были на его кошельке. Чем более старые транзакции нужно будет переписывать, тем дольше и сложнее это будет, и нет вероятности в 100% что это получится и он сможет сделать свою цепь длиннее и быстрее остальных 49%.
Такая атака возможна и с 30% и с 40%, но в этом случае вероятность намного ниже.

Сколько потребуется денег на такую атаку? Если атакуем с нуля, то придется по сути иметь мощность на 0.5% больше всей мощности майнеров Bitcoin. Хешрейт на сегодняшний день составляет примерно 1 ZH/s =  1 000 000 000 000 000 000 000 находок хеша SHA-256.
Современные асики (устройства для майнинга) имеют мощность примерно в 200 TH/s, значит таких нужно будет 5 000 000 штук. Их эффективность ≈ 17-20 J/TH. Умножим на 10^9 и получится 17-20 ГВт. Что чуть меньше мощности самой большой ГЭС в мире.
К этому мы прибавляем цены на сами асики, что выходит ≈ 7.5 миллиардов $. И это без дополнительного оборудования которое тоже выйдет в копеечку.
Даже все эти затраты приведут максимум к двойным тратам собственных монет в блокчейне и цензуре на транзакции. Да и то, это будет всем видно и цена наверное рухнет и игра не будет стоить свеч.


Если вам интересно глубже погружаться в технологии WEB 3.0, то подписывайтесь на мой Telegram канал где будет больше контента, далеко не всегда такого длинного, но не менее интересного.