Книги

Больше денег: что такое Ethereum и как блокчейн меняет мир

22
18
20
22
24
26
28
30

◊ если пересылаемый UTXO отсутствует в состоянии S – выдать ошибку;

◊ если предоставленная цифровая подпись не совпадает с подписью владельца UTXO – выдать ошибку.

2. Если сумма средств всех UTXO входа меньше суммы средств всех UTXO выхода – выдать ошибку.

3. Выдать состояние S с удаленными UTXO входа и добавленными UTXO выхода.

Первая часть первого пункта не позволяет отправителям тратить несуществующие монеты, а вторая не позволяет тратить монеты других людей. Второй пункт помогает сохранять ценность. Оплата по такой схеме может выглядеть следующим образом. Допустим, Алиса хочет переслать 11,7 BTC Бобу. Для начала Алиса должна будет найти набор UTXO, обладание которыми она может подтвердить и сумма средств которых равна минимум 11,7 BTC. В большинстве ситуаций Алисе не удастся найти у себя несколько UTXO, сумма средств на которых составит ровно 11,7 BTC; например, наименьшее, что у нее найдется: 6 UTXO + 4 UTXO + 2 UTXO = 12. Поэтому она создает транзакцию с тремя входами и двумя выходами. Первым выходом будут 11,7 BTC, которые отправятся на адрес Боба, а вторым – 0,3 BTC «сдачи», которые вернутся самой Алисе.

Майнинг

Если бы речь шла о построенном на доверии централизованном сервисе, все было бы просто: транзакции проходят через центральные серверы, и там же хранится их история. Однако биткойн подразумевается как по-настоящему децентрализованная валюта, поэтому здесь необходимо объединить систему состояний транзакций с системой консенсуса, чтобы обеспечить общую договоренность о порядке транзакций. Для этого децентрализованный консенсус системы Bitcoin задействует сеть нод, которые постоянно пытаются создать пакеты транзакций – так называемые блоки. Протокол устроен так, что майнеры производят новый блок примерно раз в десять минут; каждый блок содержит временнýю метку, одноразовый код, отсылку к предыдущему блоку (то есть его хеш) и список всех транзакций, прошедших после создания предыдущего блока. Так образуется неизменный и постоянно растущий блокчейн, который регулярно обновляется, чтобы показывать самую актуальную информацию о реестре Bitcoin.

В этой парадигме действует следующий алгоритм проверки валидности.

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. Дождаться получения продукта.