1. Проверить, существует ли и валиден ли предыдущий блок
2. Убедиться, что временнáя метка рассматриваемого блока больше, чем временнáя метка предыдущего[113], но не более, чем на два часа.
3. Проверить валидность proof-of-work рассматриваемого блока.
4. Пусть S[0] – состояние после добавления в блокчейн предыдущего блока.
5. Пусть TX – список транзакций в рассматриваемом блоке, а всего этих транзакций n. Для всех i из набора 0…n–1 зададим S[i+1] = APPLY(S[i],TX[i]). Если хоть одна подобная процедура выдает ошибку, происходит выход из цикла и отказ.
6. Код выполнен успешно, а S[n] регистрируется как состояние на момент формирования этого блока.
По сути, каждая транзакция в блоке должна обеспечивать валидный переход из канонического состояния до выполнения транзакции в какое-то новое состояние. Заметим, что состояние никак не включено в сам блок; это лишь абстракция, которую запоминают ноды-валидаторы и которую можно лишь (безопасно) вычислить для каждого блока, проходя весь путь по блокчейну с самого начала. При этом важен порядок, в котором майнер включает транзакции в блок: если в блоке есть две транзакции A и B, где B тратит UTXO, оставшийся после A, то блок будет валидным, если А предшествует В, но не наоборот.
В приведенном выше алгоритме представлено условие валидности, которого нет в других системах, – так называемая концепция proof-of-work. Условие заключается в том, что двойной хеш SHA256 каждого блока, воспринимаемый как 256-битное число, должен быть меньше динамически изменяющегося таргета, равного на момент написания этих строк примерно 2187. Это необходимо для того, чтобы сделать нахождение блоков вычислительно «сложным» и не допустить атаки Сивиллы с полной перестройкой всего блокчейна. Поскольку SHA256 – совершенно непредсказуемая псевдослучайная функция, единственный способ создать валидный блок – метод проб и ошибок, простой перебор значений одноразового кода, чтобы попасть в новый хеш.
Для текущего таргета ~2187 сети понадобится примерно ~269 попыток, чтобы найти валидный блок. Как правило, перекалибровка таргета в сети происходит каждые 2016 блоков, так что в среднем новый блок создается какой-либо нодой сети каждые десять минут. Чтобы компенсировать майнерам эту вычислительную работу, майнер каждого блока имеет право включить транзакцию, где передаст себе ниоткуда взявшиеся 25 BTC. Кроме того, если сумма на входе больше, чем сумма на выходе, майнер, нашедший блок, в который попала эта транзакция, забирает «комиссию за транзакцию». К слову, это также единственный механизм эмиссии BTC; в изначальном состоянии не существовало ни одной монеты.
Для лучшего понимания смысла майнинга посмотрим, что произойдет при попытке атаки. Поскольку криптография, лежащая в основе Bitcoin, проверена временем и на данный момент считается надежной, целью злоумышленника будет часть системы, напрямую не связанная с шифрованием, – порядок транзакций. Вот как может выглядеть его стратегия.
1. Переслать продавцу 100 BTC за некоторый продукт (предпочтительно цифровой продукт, который можно получить сразу же).
2. Дождаться получения продукта.
3. Произвести другую транзакцию, переслав 100 BTC на другой свой адрес.
4. Попытаться убедить систему, что вторая транзакция была произведена раньше первой.
Через несколько минут после первого шага какой-то майнер включит эту транзакцию в блок – скажем, в блок 270 000. Примерно за час в блокчейн попадет еще пять блоков, и каждый из новых блоков будет косвенно указывать на транзакцию из первого шага, тем самым подтверждая ее. В этот момент продавец решит, что оплата завершена, и покупатель получит купленный продукт, поскольку мы рассматриваем случай цифрового продукта с моментальной доставкой. Теперь злоумышленник создает другую транзакцию, пересылая эти 100 BTC себе. Если он просто отправит транзакцию в сеть, она не пройдет; майнеры, пытаясь провести эту транзакцию, запустят APPLY(S,TX) и получат ошибку, поскольку TX пытается потратить уже несуществующие UTXO. Так что вместо этого злоумышленник создает «форк» блокчейна: начинает майнить другую версию блока 270 000, отмечая предыдущий блок 269 999 как родительский, но с новой транзакцией вместо изначальной. Поскольку информация в этом блоке другая, для своей версии блока 270 000 ему придется заново вычислять нужный хеш. Более того, новая версия блока 270 000 имеет другой хеш, так что изначальные блоки 270 001–270 005 уже «указывают» не на него, поэтому блокчейн всей сети и блокчейн злоумышленника совершенно различны. По правилам протокола истинной считается самая длинная цепочка блокчейна; соответственно, «честные» майнеры продолжат майнинг цепи блокчейна длиной 270 005, а злоумышленник будет в одиночку майнить свою. Злоумышленник может сделать свою цепь самой длинной, только если его вычислительные мощности будут больше суммарной вычислительной мощности всей остальной сети (так называемая атака 51 %).
Дерево Меркла