В этой статье я постараюсь объяснить, как работает биткоин. Без аналогий с добычей золота и прочих глупостей.
Начать стоит с того, что он вообще из себя представляет. Биткоин, это одноранговая (P2P) сеть которая формирует механизм глобального консенсуса, который позволяет всем узлам сети договориться об общем состоянии леджера и дает возможность локально проверить весь этот леджер, не доверяя никому. Это система где есть только пользователи и нет администраторов. Это permissionless система, то есть вам не нужно ничье одобрение чтобы в ней участвовать. Используется эта система для формирования глобальной системы денег. Леджер хранит всю историю транзакций за все время, формируя цепочку блоков транзакций - блокчейн.
Если по-человечески то биткоин это просто глобальная универсальная книга бухгалтерского учета, где навсегда фиксируются все взаиморасчеты, где нет возможности смухлевать, отменить или оспорить перевод или создать деньги из воздуха.
Биткоин это не первая попытка создать систему такого рода, но ему первому это удалось. Биткоин решил две ключевые проблемы, которые до этого не удавалось решить никому.
Для понимания его устройства стоит начать стоит с криптографических примитивов, из которых он собран. Как только у вас будет понимание того, как каждый из них работает, понять устройство биткоина будет гораздо проще.
В его составные части входит:
Криптографическая хэш функция
Криптография открытого ключа
Дерево Меркла
Доказательство работы (Proof of Work)
Хэш функция
Начать стоит с того, что такое хэш функция. Хэш функция это тип односторонней функции.
Односторонняя функция это функция, которую легко выполнить в одну сторону, но очень сложно или невозможно в другую. Пример односторонней функции это умножение двух простых чисел. Это тривиально выполнить в одну сторону. Но имея результат этой функции невозможно выяснить из чего он был создан без полного перебора. Если брать очень большие числа, это свойство становится полезным для некоторых функций сокрытия данных.
Хэш функция это такая функция, которая получает на вход любой объем данных и отдает на выход строку фиксированной длины или контрольную сумму.
Самый примитивный пример хэш функции это сумма всех чисел входного массива. Или алгоритм Луна, который используется в номерах банковских карт. Последняя цифра банковской карты это контрольное число, которое используется для проверки целостности введённого номера. Он нужен для того чтобы легко было определить ошибку ручного ввода номера, если вы когда-то вводили номер карты с ошибкой на сайте, и он сразу сказал что в номере есть ошибка, не делая никаких запросов в сеть, вы могли видеть этот алгоритм в работе.
Для того чтобы хэш функция считалась криптографически безопасной, она должна следовать некоторым требованиям.
Изменение хоть одного бита входящих данных полностью меняет контрольную сумму
Невозможно подобрать такие входные данные, чтобы получить определённую контрольную сумму
Имея контрольную сумму невозможно выяснить из каких данных она была сделана
Она не должна иметь коллизий, то есть не иметь двух наборов входных данных, которые выдадут одну контрольную сумму
В биткоине используется криптографически стойкая хэш функция SHA-256. Выглядит это примерно так:
SHA-256("The quick brown fox jumps over the lazy dog") = D7A8FBB3 07D78094 69CA9ABC B0082E4F 8D5651E4 6D3CDB76 2D02D0BF 37C9E592
Детали ее реализации мы оставим за рамками, нам важно что эта функция работает и соответствует нашим требованиям крииптографической стойкости, то есть для нас это черная коробка.
В биткоине SHA-256 используется для нескольких целей:
Идентификация транзакций: у каждой транзакции свой уникальный хэш фиксирующий адреса отправителя и получателя, сумму, время
Формирования дерева Меркля: оно позволяет получить компактную "упаковку" всех транзакций в блоке, это позволяет проверить любую транзакцию на предмет нахождения в блоке очень быстро, без перебора
Связывание блоков в блокчейн: каждый блок (кроме самого первого) содержит в себе хэш предыдущего блока, оттуда и название блокчейн. Это позволяет различать транзакции во времени и строго фиксировать состояние системы. Если изменить хоть одну транзакцию в прошлом, посыпется вся цепочка: изменится хэш этой транзакции, значит изменится хэш блока, в котором эта транзакция содержится, значит изменится и хэш следующего блока (так как в нем хэш предыдущего).
Доказательство работы (Proof of Work): один из ключевых механизмов системы, о нем позже
Криптография открытого ключа
Криптография открытого ключа (ассиметричное шифрование) - это способ шифрования данных, где есть пара публичный и приватный ключ. Публичный ключ может передаваться спокойно кому угодно, приватный остается только у владельца.
Данные зашифрованные публичным ключом можно расшифровать только приватным. То есть зная мой публичный ключ собеседник может зашифровать для меня сообщение и эту шифрограмму расшифровать смогу только я своим приватным ключом.
Но в биткоине нам ничего скрывать не нужно, тут эта схема используется наоборот. Мы шифруем данные своим приватным ключом, а расшифровать их можно нашим публичным ключом. Это позволяет генерировать цифровую подпись к сообщению, то есть доказать что мы обладаем приватным ключом в паре к заявленному публичному и что мы одобряем это конкретное сообщение.
Это позволяет нам подписывать транзакции. Обладая какими-то средствами на подконтрольном нам адресе (привязанному к публичному ключу), мы можем подписать транзакцию где указываем на какой адрес мы хотим ее передать.
Но тут у нас возникает первая из двух проблем, которую до биткоина решить не мог никто: проблема двойной траты. Сгенерировать подпись мне не стоит ничего и сделать я могу это неограниченное количество раз. Поэтому ничего не мешает мне подписать транзакцию с переводом на один адрес, а потом следом другую с переводом на другой адрес.
Проблема двойной траты и блокчейн
Тут мы подходим к тому, зачем нам вообще нужен блокчейн и зачем нам группировать транзакции в блоки. Просто подписанная транзакция не имеет какого-то веса в сети биткоин, имеет вес только транзакция включенная в блок, потому что блок это фиксированная точка во времени. Блокчейн позволяет нам определить какая транзакция была раньше, а какая позже. Это позволяет исключить двойную трату, если мы видим транзакцию, которая тратит монеты, которые уже были потрачены до этого, значит эта транзакция недействительная и будет отклонена системой.

Дерево хэшей Меркля

С помощью этой структуры данных все транзакции упаковываются в один хэш, т.н. корень дерева. Устроена она достаточно просто, транзакции хэшируются, хэши транзакций попарно складываются и хэшируются повторно. hash(hash(tx1)+hash(tx2)) и так далее пока не допакуемся до одного хэша. Этот хэш мы и положим в блок. Этого хэша достаточно чтобы зафиксировать данные о транзакциях произошедших в этом блоке.

Выше пример доказательства включения транзакции в блок, вы предоставляете саму транзакцию, ее хэш, хэш "соседа" по паре и их комбинацию, и так далее вверх по дереву пока не дойдете до корня. На таком маленьком дереве экономия ресурсов не выглядит столь убедительной, но это очень хорошо масштабируется. К примеру при 65536 транзакциях, доказательство включения занимает всего 512 байт, а размер всех транзакций 2097152 байт. Размер сэкономленного пространства ~99.98%.
Доказательство работы (Proof of Work) и майнинг
Теперь мы можем сформировать систему где все транзакции учтены, упорядочены и двойная трата исключена. Остается последняя нерешенная проблема, кто и как будет формировать блоки, а также откуда деньги будут браться в системе изначально. Эта проблема в биткоине решается уникальным образом. Формировать блоки и добавлять их в цепочку может кто угодно, но на это есть некоторый вычислительный ценз. Те кто решают вычислительную задачу, формируя блоки транзакций называют майнеры. Взамен за выполненую работу, за каждый успешно найденый блок майнер получает награду блока, специально отведенное количество монет, а также комиссии из транзакций.
В конце каждого блока есть поле nonce, в него майнер может поместить любую строку данных, для того чтобы блок считался действительным, хэш блока должен начинаться с определенного количества нулей, для этого берется шаблон блока, к нему добавляется случайный nonce, блок хэшируется и проверяется на количество нулей в начале хэша, если он подходит под требования, блок публикуется и распространяется между другими участниками сети. Далее все майнеры майнят уже поверх этого блока. Главный источник истины в биткоине это цепочка с самым большим суммарным количеством работы.
Сложность майнинга регулируется с помощью изменения необходимого количества нулей в начале хэша блока. Этот параметр называется целевая сложность (difficulty target). Меняется раз в 2016 блоков (где-то две недели). Меняется он чтобы подстроиться под целевое время блока раз в 10 минут. В момент коррекции сложности, если последние 2016 блоков были в среднем чаще чем раз в 10 минут (блоки майнятся чаще чем нужно) сложность пропорционально увеличится, если реже, то уменьшится.
Таким образом мы получаем полностью децентрализованную систему, в которой может участвовать кто угодно. Помимо того что это делает систему нейтральной и неподконтрольной, это также далает ее очень отказоустройчивой, отключтся один майнер, тясячи других продолжают майнить. Одна страна решит запретить у себя майнить, майнинг продолжится в других. В 2021 году, когда Китай запретил майнить биткоин, хэшрейт сети значительно упал, в какой-то момент блоки майнились раз в 30 минут. Продлилось это всего две недели, потом сложность скорректировалась и биткоин продолжил работать как раньше.
Монетарная политика
Одна из главных особенностей этой сети, это ее фиксированная монетарная политика. Монеты появляются в циркуляции через награду блока. Награда блока расчитывается исходя из высоты блока, изначально она была 50 BTC. Она делится пополам каждые 210000 блоков (раз в 4 года).

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

