Bitcoin — самая популярная блокчейн-платформа на планете. Но из чего состоят звенья этой цепи? Cryptonomist разобрался, как устроены блоки Bitcoin.
Общее представление
Каждый блок, который добавляется в блокчейн биткоина, имеет размер до 1 МБ. Так как протокол предполагает майнинг нового блока примерно каждые 10 минут, на заре криптовалютной эры реальный размер блоков был меньше:
Блок состоит из заголовка (Head), в котором хранится служебная информация, и информации о транзакциях (payload).
Состав заголовка блока
Первая составляющая заголовка блока биткоина — поле Magic no. размером 4 байта, которое всегда содержит значение 0xD9B4BEF9. За ним следует размер блока (blocksize) — в этом поле указывается количество байт, которые остались до конца блока. Размер blocksize — также 4 байта.
Заголовок блока (blockheader) размером 80 байт состоит из шести компонентов:
- версия блока;
- дата и время создания блока;
- хэш-код заголовка блока;
- хэш-код предыдущего блока;
- хэш-код всех транзакций в блоке;
- специальные параметры nonce и bits, которые записываются при майнинге.
Хэш-код заголовка блока обеспечивает связность блокчейн-цепи, соединяя предыдущий блок с последующим. По сути хэш-код — это математическая функция, для вычисления которой используются все байты блока. Именно её значение вычисляют майнеры.
Хэш-код транзакций рассчитывается с использованием алгоритма бинарного дерева хэшей, или дерева Мёркла. Вычисление выполняется в такой последовательности:
- хэши всех транзакций в блоке;
- хэши от суммы хэшей пар транзакций;
- хэши от суммы получившихся пар хэшей.
Эти действия выполняются циклически до тех пор, пока не будет получен единственный хэш-код. Причём если на каком-то из шагов, кроме последнего, количество хэшей становится нечетным, для получения пары последний хэш дублируется.
Значение nonce — это параметр криптографической задачи. Если его добавить к заголовку сформированного блока, то должен получиться хэш-код, начинающийся с заданного количества нулевых битов (bits). Это равносильно хэшу, который не больше заданного большого числа, определяющего сложность (Difficulty Target или попросту Target).
Сложность меняется каждые 2016 блоков (они майнятся примерно за две недели). Биткоин-клиент анализирует, насколько быстрее или медленнее находились блоки по сравнению со стандартными значениями, и регулирует сложность соответственно в большую или меньшую сторону.
Состав части с информацией о транзакциях
За заголовком блока следует счётчик транзакций. Это положительное целое число размером от 1 до 9 байт. Далее, собственно, в блок записывается список транзакций.
Транзакции в блокчейне биткоина условно можно описать так:
С [адреса1] отправить [N] биткоинов на [адрес2]
Но в протоколе биткоина предусмотрены входы (Inputs или In) и выходы для транзакций (Outputs или Out). Входы — транзакции, которые пополняют биткоин-адрес, а выходы — это суммы, которые переводятся на другие биткоин-адреса. Поэтому правильнее говорить, что каждая биткоин-транзакция через один или несколько входов ссылается на один или несколько выходов предыдущих транзакций и формирует один или несколько выходов для последующих транзакций.
Таким образом, каждая транзакция в списке включает такие данные:
- количество используемых входов;
- хэш-код и индекс каждого входа и его служебная информация;
- количество используемых выходов;
- суммы выходов и их служебная информация;
- метка времени транзакции.
В блоке обязательно содержится bitcoin-адрес, на который отправляется плата за майнинг (12,5 биткоина). Эта запись называется generation transaction (транзакция генерации биткоина), и в списке транзакций блока она всегда стоит на первом месте.
Здесь же отметим, что майнер получает не только плату за майнинг, но и вознаграждение от отправителей транзакций — разницу между суммой выходов и суммой входов.