Больше денег: что такое Ethereum и как блокчейн меняет мир - Виталий Дмитриевич Бутерин
Шрифт:
Интервал:
Закладка:
С технической точки зрения реестр криптовалюты вроде биткойна можно воспринимать как систему изменения состояний. «Состояние» описывает, как распределены все существующие биткойны между различными адресами, а «функция изменения состояния» анализирует состояние и транзакцию, чтобы выдать новое состояние. Например, в стандартной банковской системе состояние – список балансов каждого из клиентов, транзакция – запрос о переводе $х от A к B, и функция изменения состояния уменьшает значение на счете A на $х и увеличивает значение на счете B на $х. Если на счете A меньшая сумма, чем $х, функция изменения состояния возвращает ошибку. Формально это выглядит так:
APPLY(S,TX) – > S’ or ERROR
В банковской системе, описанной выше:
APPLY([ Alice: $50, Bob: $50 ],”send $20
from Alice to Bob”) = [ Alice: $30, Bob: $70 ]
Но:
APPLY([ Alice: $50, Bob: $50 ],”send $70
from Alice to Bob”) = ERROR
«Состояние» системы Bitcoin – множество всех добытых и пока не потраченных монет (технически – «выход неизрасходованных транзакций» или UTXO (unspent transaction output), где у каждого UTXO указаны достоинство и владелец (последний обозначен 20-байтовым адресом, который по сути является криптографическим публичным ключом[112]). У каждой транзакции есть один или больше «входов», и каждый из входов содержит указание на имеющиеся UTXO и криптографическую подпись, созданную приватным ключом, связанным с адресом владельца. Выходов тоже может быть один или несколько, и каждый выход содержит новые UTXO, которые нужно добавить к состоянию.
Принцип работы функции изменения состояния APPLY(S,TX) – > S’ выглядит так.
1. Для каждого входа в TX:
◊ если пересылаемый 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. Дождаться получения продукта.
3. Произвести другую транзакцию, переслав 100 BTC на другой свой адрес.
4. Попытаться убедить систему, что вторая транзакция была произведена раньше первой.
Через несколько минут после первого шага какой-то майнер включит эту транзакцию в блок – скажем, в блок 270 000. Примерно за час в блокчейн попадет еще