Как работает биткоин: шесть попыток сжульничать

Если совсем коротко. Биткоин — это открытый список переводов, который никто не ведёт. Монет нет: есть только записи «столько-то от такого-то такому-то», подписанные так, что подделать подпись нельзя. Вся трудность в одном — как чужим друг другу людям договориться, в каком порядке эти записи случились: порядок и решает, кто потратил деньги первым. Ответ биткоина: право дописать очередную страницу списка разыгрывается лотереей, билеты в которой покупаются электричеством, а каждая страница намертво пришита к предыдущей.

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

Сначала главное: монет не существует

Понять биткоин мешает привычка: кажется, что где-то лежит файл с вашими монетами. Не лежит. Нет ни файла, ни счёта, ни монет.

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

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

Накамото, раздел 2. В подлиннике: «We define an electronic coin as a chain of digital signatures»

Не предмет, а история переходов. Всё остальное — механика того, как чужие друг другу люди договариваются, каким считать этот список.

Шесть способов сжульничать

Устройство биткоина проще всего собрать самому: попробуйте его обмануть, и на каждом шаге станет видно, чего в нём не хватает. Каждая часть биткоина появится ровно там, где без неё обман удаётся.

1. Расписаться за другого

Напишу в список: «Пётр — мне, 10» — и всё.

Мешает подпись. У каждого пара ключей: секретный знает только он, открытый виден всем. Подписать перевод можно лишь секретным, а проверить подпись — открытым, то есть кто угодно. Адрес, который вы даёте плательщику, и есть отпечаток вашего открытого ключа.

Здесь не запрет, а невозможность: чтобы расписаться за Петра, надо угадать его секретный ключ, а вариантов у него 1,16 · 1077. Всей вычислительной мощи биткоина — а она ниже посчитана — на подбор одного ключа не хватило бы и за 1048 лет.

2. Потратить одно и то же дважды

Отправлю одни и те же деньги двум продавцам разом.

А вот это уже интересно. Обе записи подписаны верно, к каждой по отдельности не придраться. Кто прав? Тот, чья запись была раньше. Значит нужен общий порядок событий — и вот это, а вовсе не «шифрование», и есть вся задача биткоина.

Нужен способ участникам сойтись на единой истории того, в каком порядке [переводы] были получены.

Накамото, раздел 3. В подлиннике: «we need a system for participants to agree on a single history of the order in which they were received»

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

3. Устроить себе большинство

Пусть порядок выбирают голосованием. Тогда я заведу миллион участников и проголосую сам за себя.

Если бы большинство считалось по правилу «один IP-адрес — один голос», его подорвал бы всякий, кто способен раздобыть много адресов. Доказательство работы — это по сути «один процессор — один голос».

Накамото, раздел 4. В подлиннике: «Proof-of-work is essentially one-CPU-one-vote»

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

4. Подделать работу

Хорошо, скажу, что проделал работу, а сам ничего делать не буду.

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

От заголовка считают SHA-256. Это счётная мясорубка: подаёте что угодно — получаете ровно 64 знака. Обратно не провернуть, а от перемены одной буквы результат меняется целиком. Вот, посчитано прямо сейчас:

Школярdb714acb454b011904520c50a59f2b5b1a44b3d5c835dfd71feaecd7c0605f05
Школяpe8feeef08d19942ec750dca90b1b2eee96f7b86caf29007b70afc2521503e82a

Слова различаются одной буквой: во втором «р» латинская. Общего в ответах — ничего.

Правило одно: имя блока — тот самый хеш — должно оказаться меньше заданного числа. Это число называют целью. Считать назад нельзя: остаётся менять свободное число в заголовке и пробовать снова.

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

Накамото, раздел 4

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

нулей в началепопыток понадобилосьв среднем нужновремени
0…5160,000 с
00…1742560,000 с
000…2504 0960,000 с
0000…38 12365 5360,014 с

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

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

000000000000000000023cc10000000000000000000000000000000000000000

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

540 345 524 393 959 676 682 311

вариантов — это 0,9 числа Авогадро, то есть примерно столько атомов, сколько их в 10,8 граммах углерода. Перебрать поатомно щепоть угля — и так каждые десять минут, круглые сутки, без перерыва с января 2009 года.

Отсюда и обещание из первой попытки: сеть перебирает 900 575 873 989 932 794 470 имён в секунду, и даже с такой скоростью на один чужой ключ ушло бы 1048 лет.

Цель и число попыток — на 5 сентября 2026 года, блок 965 630. Трудность пересчитывают раз в две недели, поэтому число меняется; порядок — нет.

5. Переписать прошлое

Заплачу, дождусь товара, а потом перепишу тот блок, где стоит мой платёж.

Мешает то, что каждый блок называет предыдущий по имени. Это и есть вся «цепочка блоков», и рисовать её незачем — её видно. Вот три первых блока биткоина; имена посчитаны страницей из их же байтов при отдаче:

блок 0внутри записано имя предыдущего: нет предыдущего — это первый блок
собственное имя: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
3 января 2009 года, 18:15 UTC
блок 1внутри записано имя предыдущего: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
собственное имя: 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048
9 января 2009 года, 02:54 UTC
блок 2внутри записано имя предыдущего: 00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048
собственное имя: 000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd
9 января 2009 года, 02:55 UTC

Присмотритесь: имя нулевого блока и строка «внутри» у первого — одно и то же. Второй так же держится за первый.

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

Поскольку следом пристроены другие блоки, работа по изменению блока включала бы переделку всех блоков после него.

Накамото, раздел 4

Отсюда и «подтверждения», которые считает кошелёк: каждый новый блок — ещё один слой работы поверх вашего платежа. Не обещание, а гиря.

6. Напечатать себе монет

Я ведь собираю блок сам. Впишу себе тысячу монет.

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

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    // Force block reward to zero when right shift is undefined.
    if (halvings >= 64)
        return 0;

    CAmount nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy >>= halvings;
    return nSubsidy;
}

Bitcoin Core, src/validation.cpp. nSubsidyHalvingInterval равен 210 000 (src/kernel/chainparams.cpp), >>= — деление пополам.

Пятьдесят монет за блок; вдвое меньше каждые 210 000 блоков — примерно раз в четыре года. Ни слова про двадцать один миллион здесь нет.

Всё. Устройство биткоина кончилось: подпись, порядок, работа, цепь и награда — больше в нём ничего нет. Дальше — то, что из этого следует, и как всё сказанное проверить.

Сколько всего будет монет: не 21 миллион

Сложим награды всех этапов, пока они не станут нулём. Страница делает это при каждой отдаче тем же действием, что и код выше:

20 999 999,9769 BTC

Не 21 000 000, а на 0,0231 монеты меньше. Разница — остаток от деления пополам в целых сатоши: на 33-м этапе награда доходит до одной сатоши, а следующее деление даёт ноль. Первый блок вовсе без награды — 6 930 000-й, это около 2140 года.

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

блокположеновзяточто вышло
124 72450,0000000049,99999999взято на одну сатоши меньше
501 72612,500000000,00000000награда не взята вовсе
526 59112,500000006,25000000взята половина

Только на этих трёх блоках не родилось 18,75000001 монеты. Перечень не полон — мы проверили ровно эти три, а не все девятьсот с лишним тысяч блоков.

Что до самого числа «21 000 000», то в коде оно есть — и рядом стоит оговорка разработчиков, которая стоит всех пересказов:

Заметьте, что эта постоянная не есть общее количество денег, которого в биткоине сейчас по разным причинам меньше 21 000 000 BTC; это проверка на разумность.

Bitcoin Core, src/consensus/amount.h, комментарий к MAX_MONEY

Проверьте сами за одну минуту

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

0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c

и посчитайте от них SHA-256 дважды — в любой командной строке Linux или macOS:

echo -n 0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c \
  | xxd -r -p | openssl dgst -sha256 -binary | openssl dgst -sha256

Ответ будет такой:

6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000

А теперь посмотрите на начало первого блока: те же цифры стоят в нём сразу после первых восьми.

010000006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000982051fd…

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

Привычная запись имени блока (000000000019d668…) — те же байты, перевёрнутые задом наперёд: биткоин хранит числа младшим байтом вперёд, а показывает старшим. Оттого имена блоков и выглядят начинающимися с нулей.

И последнее: газета в нулевом блоке

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

«The Times 03/Jan/2009 Chancellor on brink of second bailout for banks»

Заголовок «Таймс» за 3 января 2009 года: «Канцлер на грани второго спасения банков». Это одновременно дата — раньше 3 января 2009-го нулевой блок сделать было нельзя — и объяснение, зачем всё затевалось. Всё, что описано выше, придумано затем, чтобы список переводов не зависел ни от чьего решения.

То же самое коротко

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

Биткоин анонимен? Наоборот: это самая публичная платёжная система в истории. Каждый перевод виден каждому и остаётся видимым навсегда. Скрыто только одно — какое имя стоит за адресом. Это называется псевдонимностью, и она рассыпается, как только адрес хоть раз связали с человеком: вся его история переводов уже лежит на виду и задним числом не прячется.

Что будет, когда монеты кончатся? Останутся комиссии, и так задумано с самого начала. Накамото пишет об этом прямо: «Как только заранее назначенное число монет войдёт в обращение, вознаграждение может целиком перейти на комиссии за переводы и стать полностью свободным от инфляции». Последний блок с ненулевой наградой — примерно 6 930 000-й; при десяти минутах на блок это около 2140 года.

Почему именно десять минут? Это не свойство, а цель. Раз в 2016 блоков (около двух недель) сеть смотрит, за какое время они вышли, и подкручивает трудность так, чтобы среднее держалось у десяти минут. Число выбрано Накамото и записано в коде: nPowTargetSpacing = 10 * 60. Отдельный блок может выйти и через минуту, и через час: это лотерея, а десять минут — её средний шаг.

Можно ли отменить перевод или вернуть деньги? Нет. Отмены не предусмотрено вовсе: чтобы убрать запись из цепочки, надо переделать всю работу с того места и обогнать всю остальную сеть. Это не строгость правил, а следствие устройства — отменять некому, поскольку нет того, кто ведёт список.

А если кто-то соберёт больше половины мощности? Тогда он сможет переписывать недавние блоки и отменять собственные платежи — но не сможет ни подделать чужую подпись, ни выписать себе монет сверх положенного: это проверяет каждый узел отдельно. Накамото добавляет довод не из математики, а из корысти: такому нападающему выгоднее играть по правилам, «которые дают ему больше новых монет, чем всем остальным вместе», чем подрывать ценность собственного богатства.

Школяр. Как работает биткоин: шесть попыток сжульничать // scolaire.ru : образовательный портал. — Проверено 5 сентября 2026 г. — URL: https://scolaire.ru/kak-rabotaet-bitkoin.php