Блокче́йн (Merriam-Webster Dictionary , Oxford Dictionary ., изначально — цепь из блоков) — выстроенная по определённым правилам непрерывная последовательная цепочка блоков (связный список), содержащих какую-либо информацию. Связь между блоками обеспечивается не только нумерацией, но и тем, что каждый блок содержит свою собственную хеш-сумму и хеш-сумму предыдущего блока. Изменение любой информации в блоке изменит его хеш-сумму. Чтобы соответствовать правилам построения цепочки, изменения хеш-суммы нужно будет записать в следующий блок, что вызовет изменения уже его собственной хеш-суммы. При этом предыдущие блоки не затрагиваются. Если изменяемый блок последний в цепочке, то внесение изменений может не потребовать существенных усилий. Но если после изменяемого блока уже сформировано продолжение, то изменение может оказаться крайне трудоёмким процессом. Дело в том, что обычно копии цепочек блоков хранятся на множестве разных компьютеров независимо друг от друга.
Впервые термин появился как название полностью реплицированной распределённой базы данных, реализованной в системе «Биткоин», из-за чего блокчейн часто отождествляют с реестром транзакций в различных криптовалютах. Однако технология цепочек блоков может быть распространена на любые взаимосвязанные информационные блоки. Появившаяся в октябре 2008 года система Биткоин стала первым применением технологии блокчейн.
В настоящее время блокчейн-технологии находят применение в таких областях, как финансовые операции, идентификация пользователей или создание технологий кибербезопасности, а также актуальны для банковских учреждений и государственных организаций.
История
Впервые протокол, подобный блокчейну, предложил американский криптограф Дэвид Чаум в своей диссертации 1982 года «Компьютерные системы, созданные, поддерживаемые и пользующиеся доверием взаимно подозрительных групп» (). Далее, С.Хабер и У. Скотт Сторнетта в 1991 году в своей работе описали криптографически защищённую цепочку блоков. Математики преследовали цель внедрить систему, в которой временны́е метки документов нельзя было бы подделать. В 1992 году Хабер, Сторнетта и Дейв Бейер включили в свою технологию дерево хешей, что повысило её эффективность, позволив собирать несколько сертификатов документов в один блок. Поняв коммерческий потенциал разрабатываемой технологии, исследователи создали сервис временны́х меток под названием Surety, чтобы привести свою схему в действие. Хэши сертификатов документов Surety с 1995 года еженедельно публикуются в New York Times.
В 2008 году разработчик под псевдонимом Сатоси Накамото (реальная личность остаётся неизвестной, возможно, что под этим ником работала группа) предложил общий алгоритм системы биткоин, ключевым элементом которой была система из непрерывной последовательной цепочки блоков информации, названной blockchain. Принципиальным отличием от всех предыдущих вариантов подобных технологий (в том числе Hashcash) стало объединение цепного хэша с формальным механизмом выработки консенсуса о корректности очередного блока, что позволило во всей системе отказаться от необходимости верификации информации доверенным агентом (администратором) и система в целом стала децентрализованной.
В 2009 году была запущена первая версия криптовалюты биткоин с реализацией децентрализованного блокчейна, который обеспечивает хранение всех транзакций в системе.
Реализация в системе Биткоин
Блок транзакций Блок транзакций — специальная структура для записи группы транзакций в системе Биткоин и аналогичных ей. Транзакция считается завершённой и достоверной («подтверждённой»), когда проверены её формат и подписи, и когда сама транзакция объединена в группу с несколькими другими и записана в специальную структуру — блок. Содержимое блоков может быть проверено, так как каждый блок содержит информацию о предыдущем блоке. Все блоки выстроены в одну цепочку, которая содержит информацию обо всех совершённых когда-либо операциях в базе. Самый первый блок в цепочке — первичный блок () — рассматривается как отдельный случай, так как у него отсутствует родительский блок.
Блок состоит из заголовка и списка транзакций. Заголовок блока включает в себя свой хеш, хеш предыдущего блока, хеши транзакций и дополнительную служебную информацию. В системе Биткоин первой транзакцией в блоке всегда указывается получение комиссии, которая станет наградой майнеру за созданный блок. Далее идёт список транзакций, сформированный из очереди транзакций, ещё не записанных в предыдущие блоки. Критерий отбора из очереди задаёт майнер самостоятельно. Это не обязательно должна быть хронология по времени. Например, могут включаться только операции с высокой комиссией или с участием заданного списка адресов. Для транзакций в блоке используется древовидное хеширование, аналогичное формированию хеш-суммы для файла в протоколе BitTorrent. Транзакции, кроме начисления комиссии за создание блока, содержат внутри параметра input ссылку на транзакцию с предыдущим состоянием данных (в системе Биткоин, например, даётся ссылка на ту транзакцию, по которой были получены расходуемые биткоины). Операции по передаче майнеру комиссии за создание блока не имеют «входных» транзакций, поэтому в данном параметре может указываться любая информация (для них это поле носит название ).
Создать новый блок может любой участник в любой момент. Но если это будет легко сделать, то не будет препятствий для изменения некоторого количества ранее созданных блоков, что будет приводить к неопределённости, какой из блоков считать истинным. Кроме того, за создание блока система выплачивает вознаграждение «новыми» биткоинами, эмиссия которых не должна быть массовой и хаотичной по времени. Чтобы создание нового блока требовало некоторого времени в системе Биткоин и многих других используется доказательство выполнения работы — правильным считается не любой блок заданной структуры, а только тот, у которого числовое значение хеша не превышает целевого числа, величина которого периодически корректируется. Если хеш не удовлетворяет условию, то в заголовке изменяется параметр nonce и хеш пересчитывается. Результат хеширования функцией SHA-256 считается необратимым — кроме случайного или полного перебора неизвестен алгоритм прямого определения такого параметра nonce, чтобы хеширование блока дало нужный результат. Когда вариант найден, узел рассылает полученный блок другим подключённым узлам, которые проверяют блок. Если ошибок нет, то блок считается добавленным в цепочку и следующий блок должен включить в себя его хеш.
Обычно (статистически) требуется большое количество пересчётов, на что затрачивается значительное время. Величина целевого числа, с которым сравнивается хеш, в системе Биткоин корректируется через каждые 2016 блоков таким образом, чтобы вся сеть на поиск нового блока тратила в среднем 10 минут. Если очередные 2016 блоков сформированы быстрее 20160 минут, то целевое число немного уменьшается и получить удовлетворяющий ему хеш подбором параметра nonce становится труднее; если медленнее — целевое число увеличивается. Изменение сложности вычислений не влияет на надёжность сети Биткоин и требуется лишь для того, чтобы система генерировала блоки почти с постоянной скоростью, не зависящей от вычислительной мощности участников сети.
Механизм доказательства выполнения работы очень энергозатратен и приводит к концентрации процесса создания блоков исключительно среди владельцев огромных вычислительных мощностей. В ряде других криптовалют были реализованы альтернативные алгоритмы (доказательство доли владения, доказательство активности), которые также препятствуют изменению ранее сформированных блоков, но не требуют столь большого объёма вычислений.
Цепочка блоков
Блоки одновременно формируются множеством «майнеров». Удовлетворяющие критериям блоки отправляются в сеть, включаясь во все репликации распределённой базы блоков. Регулярно возникают ситуации, когда несколько новых блоков в разных частях распределённой сети называют предыдущим один и тот же блок, то есть цепочка блоков может ветвиться. Специально или случайно можно ограничить ретрансляцию информации о новых блоках (например, одна из цепочек может развиваться в рамках локальной сети). В этом случае возможно параллельное наращивание различных ветвей. В каждом из новых блоков могут встречаться как одинаковые транзакции, так и разные, вошедшие только в один из них. Когда ретрансляция блоков возобновляется, майнеры начинают считать главной цепочку с учётом уровня сложности хеша и длины цепочки. При равенстве сложности и длины предпочтение отдаётся той цепочке, конечный блок которой появился раньше. Транзакции, вошедшие только в отвергнутую ветку (в том числе по выплате вознаграждения), теряют статус подтверждённых. Если это транзакция по передаче биткоинов, то она будет поставлена в очередь и затем включена в очередной блок. Транзакции получения вознаграждения за создание отсечённых блоков не дублируются в другой ветке, то есть «лишние» биткоины, выплаченные за формирование отсечённых блоков, не получают дальнейших подтверждений и «утрачиваются».
Таким образом, цепочка блоков содержит историю владения, с которой можно ознакомиться, например, на специализированных сайтах.
Блокчейн формируется как непрерывно растущая цепочка блоков с записями обо всех транзакциях. Копии базы или её части одновременно хранятся на множестве компьютеров и синхронизируются согласно формальным правилам построения цепочки блоков. Информация в блоках не шифрована и доступна в открытом виде, но отсутствие изменений удостоверяется криптографически через хеш-цепочки (элемент цифровой подписи).
База публично хранит в незашифрованном виде информацию о всех транзакциях, подписываемых с помощью асимметричного шифрования. Для предотвращения многократной траты одной и той же суммы используются метки времени, реализованные путём разбиения БД на цепочку специальных блоков, каждый из которых, в числе прочего, содержит в себе хеш предыдущего блока и свой порядковый номер. Каждый новый блок осуществляет подтверждение транзакций, информацию о которых содержит и дополнительное подтверждение транзакций во всех предыдущих блоках цепочки. Изменять информацию в блоке, который находится в цепи, не практично, так как в таком случае пришлось бы редактировать информацию во всех последующих блоках. Благодаря этому успешная double-spending атака (повторная трата ранее израсходованных средств) на практике крайне маловероятна.
Чаще всего умышленное изменение информации в любой из копий базы или даже в достаточно большом количестве копий не будет признано истинным, так как не будет соответствовать правилам. Некоторые изменения могут быть приняты, если будут внесены во все копии базы (например, удаление нескольких последних блоков из-за ошибки в их формировании).
Для более наглядного объяснения механизма работы платёжной системы Сатоси Накамото ввёл понятие «цифровая монета», определив его как цепочку цифровых подписей. В отличие от стандартизированных номиналов обычных монет, каждая «цифровая монета» имеет свой собственный номинал. Каждому биткоин-адресу может сопоставляться любое количество «цифровых монет». При помощи транзакций их можно делить и объединять, при этом сохраняется общая сумма их номиналов за вычетом комиссии.
До версии 0.8.0 для хранения цепочки блоков основной клиент использовал Berkeley DB, начиная с версии 0.8.0 разработчики перешли на LevelDB.
Подтверждение транзакций