Механизм, лежащий в основе proof-of-work, стал прорывом в этой области, поскольку одновременно решал две проблемы. Во-первых, он предоставил простой и в меру эффективный алгоритм консенсуса, позволяющий нодам сети коллективно согласовывать набор канонических обновлений состояния реестра Bitcoin. Во-вторых, он обеспечил механизм, позволяющий свободно участвовать в процессе достижения консенсуса, решая политическую проблему определения того, кто будет влиять на консенсус, и одновременно предотвращая атаки Сивиллы. Это достигается путем замены формального барьера для участия, например требования быть зарегистрированным в качестве уникального объекта в определенном списке, на экономический барьер – вес одной ноды в процессе консенсусного голосования прямо пропорционален вычислительной мощности, которую она предоставляет. После этого появилась идея альтернативного подхода под названием proof-of-stake, где вес ноды рассчитывается пропорционально ее валютным запасам, а не вычислительным мощностям. Выявление относительных достоинств каждого из этих подходов выходит за рамки этой статьи, но следует отметить, что оба можно использовать в качестве основы криптовалюты.
Биткойн как система изменения состояний
С технической точки зрения реестр криптовалюты вроде биткойна можно воспринимать как систему изменения состояний. «Состояние» описывает, как распределены все существующие биткойны между различными адресами, а «функция изменения состояния» анализирует состояние и транзакцию, чтобы выдать новое состояние. Например, в стандартной банковской системе состояние – список балансов каждого из клиентов, транзакция – запрос о переводе $х от 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.
В этой парадигме действует следующий алгоритм проверки валидности.