В предыдущей статье мы поговорили о структурах данных их плюсах и минусах, а также о том, на что больше похож биткоин "на пальцах".
Если Вы еще не читали эту статью, то, пожалуйста, ознакомьтесь. В этой статье мы затронем уже в деталях состав блокчейна, объекты из которых он состоит, их свойства и процессы, которые протекают в нём. Ну что ж, начнём!
Введение
Блокчейн похож на связный список в контексте структур данных. Блокчейн организует данные, разбивая их на подмножества или контейнеры, называемые блоками. Блоки вполне аналогичны узлам в связанном списке. Каждый блок содержит ссылку, которая является хешем предыдущего блока. Это служит ссылкой на предыдущий блок и устанавливает порядок в цепочке блоков.
Каждый блок содержит несколько элементов. Элементы блока обычно разделяются на заголовок блока и его транзакции. В то время как транзакции в блоке составляют большую часть данных, заголовок блока содержит важные метаданные о каждом блоке, такие как временная метка и высота блока.
Ключевое различие между блокчейном и связанным списком заключается в том, что каждая ссылка в блокчейне криптографически защищена и поэтому не подлежит взлому. В отличие от этого, указатели в связанном списке могут быть изменены в любое время без ущерба для целостности данных. Защищенные ссылки устанавливают порядок во всех блоках и фактически превращают блокчейн в структуру данных "только для добавления", где новые данные могут быть добавлены только с новыми блоками. Это означает, что добавить данные в блокчейн можно только путем добавления их на передний план.
Хеш-значение заголовка предыдущего блока (previous block header hash) включается в следующий блок в качестве ссылки, поскольку хеш-блока зависит от данных блока, даже изменение одного символа в одной из транзакций сделает ссылку недействительной.
Защищенные ссылки постоянно проверяются на валидность. Если бы вы вставили вредоносный блок в середину блокчейна или изменили данные в существующем блоке, например, между блоками 1 и 3 на графике ниже, вы могли бы включить ссылку на его предшественника, блок 1. Тем не менее, было бы невозможно заставить блок 3 ссылаться на ваш недавно вставленный блок.
Каждый новый блок, построенный поверх существующего блока, принято называть подтверждением. Чем старше становится блок, тем больше у него подтверждений. Каждое подтверждение усложняет подделку данных в блоке, так как приходится создавать дополнительные действующие ссылки.
Чтобы подделать его данные, вам придется воссоздать один действительный блок, включая новую действительную ссылку. С каждым подтверждением вам придется воссоздавать дополнительный блок. Это означает, что чем старше блок, тем больше уверенности в том, что в нем не произойдет никаких изменений.
Важно отметить, что не структура данных делает данные в блокчейне неизменяемыми. Неизменной является только информация. Изменения легко обнаружить. Неизменность невозможна, если нет сильных правил консенсуса и достаточно большого количества узлов в сети. Стимулы должны быть выстроены таким образом, чтобы большинство участников следовали протоколу и отклоняли недействительные блоки.
Ссылки между блоками зависят не только от порядка следования блоков, но и от данных, содержащихся в каждом блоке. В блокчейне невозможно добавить или удалить данные из блока. Это свойство является основой доверия, которое люди оказывают данным, хранящимся в блокчейне. Структура данных блокчейна естественным образом не поддается взлому. Любое изменение данных нарушает ссылки всех последующих блоков.
Хотя изменить или удалить данные невозможно, их легко добавить в цепочку новым блоком. Например, можно добавить новую транзакцию в блокчейн криптовалюты. Транзакцию легко проверить, поскольку все предыдущие транзакции, записанные в сети, неизменяемы — это делает проверку транзакций простой. Когда адрес Y хочет потратить сумму X, он должен иметь на балансе сумму не менее X.
Свойства блокчейна
Давайте рассмотрим свойства блокчейна, прежде чем подробно изучать данные в блоке. Мы предполагаем децентрализованную систему без центрального органа власти и надежный механизм консенсуса.
Текущие недостатки
Во-первых, для начала уместно сделать некоторые оговорки. Разработка блокчейна более строгая и медленная по сравнению с традиционными базами данных. Ошибка, нарушающая целостность данных, делает всю конструкцию бесполезной. Следовательно, разработка должна вестись очень тщательно. В централизованной среде ошибку, возможно, легко исправить, но в распределенной среде без центрального органа это становится очень сложно.
Во-вторых, разработка стимулов является неотъемлемой частью создания блокчейна. Добавление данных в блокчейн всегда связано с определенными затратами. Эта стоимость должна быть достаточно высокой, чтобы предотвратить добавление большого количества бесполезных данных, но в то же время она должна быть достаточно низкой, чтобы не стать запретительной. После развертывания блокчейна его нелегко исправить по той же причине, что и выше.
Обслуживание блокчейна также на порядки дороже, чем традиционной базы данных. Данные записываются не один раз, а тысячи раз. Данные также проверяются каждым полным узлом сети, тысячи раз параллельно. Кроме того, передача данных неэффективна по своей конструкции, что приводит к росту стоимости обслуживания. Эта избыточность на каждом этапе использования блокчейна затрудняет его масштабирование.
Преимущества использования блокчейна
Все эти накладные расходы могут быть оправданы только за счет полезности. Наличие глобальных денег с предсказуемым графиком инфляции, а также надежные транзакции без централизованного контроля и единых точек отказа, вероятно, достаточно полезны для использования блокчейна в этих целях. Для многих других случаев использования время покажет, является ли блокчейн подходящим решением.
Как и в случае с атрибутом неизменности, важно отметить, что нынешние недостатки публичных блокчейнов обусловлены не структурой данных, а их распределенностью. Хотя высокий уровень избыточности делает данные безопасными, сам такой подход не эффективен по определению.
В свою очередь, с помощью блокчейна можно получить некоторые уникальные свойства, которые, если они необходимы для конкретного случая использования, делают его бесценным. Главный фактор, отличающий блокчейн от обычной базы данных, заключается в том, что существуют определенные правила добавления данных в базу.
Этот набор правил, или протокол, может обладать следующими характеристиками:
· Согласованность: вновь добавленные данные не могут противоречить данным, уже имеющимся в базе данных.
· Доказательство несанкционированного доступа: добавлять только такую структуру данных, которая позволяет сразу определить, были ли данные изменены. В сочетании с сильным механизмом консенсуса, стимулирующим отказ от недействительных блоков, это приводит к неизменности.
· Возможность владения: данные могут быть приписаны единственному владельцу. Данные могут быть публично проверены, но только владелец может вносить в них изменения. В контексте криптовалют это означает, что все могут видеть транзакции, но только владелец может ее потратить.
· Распределенный: База данных является согласованной без центральной стороны, выступающей в качестве привратника. Это происходит благодаря тому, что протокол стимулирует правильное поведение. Консенсус и отказоустойчивость — это святой грааль распределенных систем, которого Биткойн достиг впервые в истории.
Неизменность данных достигается только при наличии сильного механизма консенсуса, который заставляет участников сети отклонять недействительные блоки. В противном случае блокчейн является только несанкционированным.
Рассмотрев свойства, вытекающие из конструкции, давайте посмотрим, как она устроена. Сначала мы рассмотрим сами блоки. Затем мы представим концепцию, которая позволяет нам создать эффективную сводку всех транзакций - дерево Меркла. И наконец, мы рассмотрим сами транзакции, которые составляют большую часть данных в блоке.
Структура блока
Блоки состоят из заголовка, который содержит основные данные о блоке - своего рода резюме. Самую большую часть блока с точки зрения хранения составляют транзакции.
Заголовок блока
Заголовок блока содержит самую важную информацию о блоке:
· Версия указывает, какую версию программного обеспечения использовал майнер блока и какой набор правил проверки блока был соблюден.
· Заголовок предыдущего блока hashPrevBlock служит двум целям. Во-первых, он устанавливает порядок в цепочке блоков, а во-вторых, гарантирует, что ни один предыдущий блок не может быть изменен без влияния на текущий и все последующие блоки.
· Корневой хеш Меркла- hashMerkleRoot - представляет собой сводку всех транзакций, включенных в блок.
· Time — это время эпохи Unix, когда майнер начал хешировать заголовок для процесса майнинга.
· Bits или nBits - закодированная версия текущей сложности поиска нового блока.
· Nonce - или число, используемое один раз — это переменная, которую майнеры изменяют для модификации хеша заголовка блока, чтобы его значение соответствовало сложности. (Скоро у нас будет статья о майнинге, подписывайтесь и ждите обновлений!)
Деревья Меркле играют важную роль в обеспечении целостности данных в блокчейне. Они также используются в других системах, таких как IPFS, InterPlanetary файловая (file) система (system) и несколько реализаций баз данных NoSQL. Давайте рассмотрим, как они работают и что они делают, прежде чем мы продолжим рассмотрение того, как выглядит транзакция с точки зрения данных.
Деревья Меркла
Дерево Меркла - это структура данных, используемая внутри блоков. Транзакции в блоке составляют "листья" дерева Меркла. Корень дерева Меркла служит сводкой всех транзакций и включается в заголовок блока.
Построение дерева Меркла происходит следующим образом: транзакция, вознаграждающая майнера новыми монетами, размещается первой, за ней следуют все остальные транзакции в блоке. Во-первых, каждый листок (транзакция) хешируется. Затем хеши двух транзакций объединяются и снова хешируются. Если количество транзакций нечетное, хеш последней транзакции объединяется с копией самого себя. Этот процесс продолжается до тех пор, пока не останется только один хеш - корень Меркла.
Путь Меркла - это просто набор хеш-значений, необходимых для восстановления всего дерева. Путь Меркла для транзакции K состоит из хеша транзакции L (HL), с которым она сначала конкатенируется, и объединенных хешей HIJ, HMNOP и, наконец, HABCDEFGH. Эти четыре хеша, вместе с исходной транзакцией, позволяют верификатору проверить целостность дерева. См. картинку ниже, чтобы понять о чём это мы тут.
С этим вроде разобрались. То есть в конечном счёте целостность даных о транзакциях хранится в заголовке блока.
Как выглядит транзакция?
Каждая транзакция, за исключением транзакции вознаграждения, имеет как минимум один вход и один выход. Когда вы создаете транзакцию, вы тратите UTXO - неизрасходованные выходные данные транзакции - используя их в качестве входных данных для вновь создаваемой транзакции. В то же время вы создаете один или несколько новых UTXO, которые затем может потратить получатель платежа - новый владелец.
Чтобы быть точными в наших формулировках, лучше ввести здесь новое понятие: аутпоинты. Outpoint — это структура данных, характеризующая конкретный выход транзакции. Она включает в себя идентификатор транзакции, в которой был создан выход, а также индекс выхода, идентифицирующий конкретный выход среди потенциально многих выходов, созданных в транзакции. Таким образом, точка выхода — это просто более четкий способ обозначения того, что обычно называется выходом.
Транзакция — это сообщение сети о переводе денег. Это сообщение стандартизировано и состоит из следующей информации:
· Версия: так же как каждый блок указывает версию программного обеспечения, с помощью которого он был создан, каждая транзакция включает эту информацию.
· tx_ in count: Количество использованных входов - таким образом, количество потребленных UTXO.
· tx_ in: Каждый использованный вход характеризуется четырьмя полями (как у объекта в ООП): точка выхода, которую он расходует, размер подписи, необходимой для расходования этой точки выхода, сама подпись и порядковый номер. Порядковый номер может быть использован для изменения условий расходования аутпоинта, но мы забегаем вперед.
· tx_ out count: Количество выходов, созданных в транзакции.
· tx_ out: Выходы транзакции. Каждый выход характеризуется тремя полями: потраченной суммой, размером условия расходования и самим условием расходования, которое может быть удовлетворено цифровой подписью на основе закрытого ключа нового владельца.
· lock_ time: Время эпохи Unix или номер блока, после которого выходы могут быть потрачены. Это необязательный параметр.
Каждая транзакция передается в сериализованном формате байтов, называемом "сырым" форматом. Затем она дважды хешируется (SHA256(SHA256()) для создания идентификатора транзакции - TXID, который, как вы уже знаете, используется для создания дерева Меркла.
Транзакции, являющиеся основным строительным блоком блокчейна.
Чтобы глубже понимать этот факт, необходимо:
Во-первых, понимать модели учета UTXO.
Во-вторых, необходимо понять основные принципы криптографии с открытым ключом: закрытые ключи, открытые ключи, адреса и цифровые подписи. Каждая транзакция на входе содержит подпись, санкционирующую расходование средств, а каждый вновь созданный выход содержит информацию о том, как должна выглядеть подпись, чтобы санкционировать его расходование. Но не всё сразу, обо всём по-порядку.
Выводы
Блокчейн сам по себе является структурой данных, в которой хранятся транзакции. Она похожа на связный список тем, что данные разбиты на контейнеры - блоки. Каждый блок связан со своим предшественником криптографически защищенной ссылкой. Это делает структуру данных несанкционированной, изменения в старых блоках легко обнаружить и отменить.
Публичные блокчейны обладают мощными возможностями, которые были недостижимы ранее. Невозможно изменить информацию постфактум. Информация неизменна и очень надежна. Вот почему блокчейн имеет ценность. Это неизменяемый цифровой реестр, который надежно хранит данные в условиях отсутствия доверия. Именно поэтому блокчейн идеально подходит для поддержки цифровых денег.
Блок состоит из заголовка и содержащихся в нем транзакций. Внутри блока используется дерево Меркла для создания 256-битной сводки всех транзакций, корня Меркла, который включается в заголовок блока.
Транзакция — это сообщение в сеть о том, какие неизрасходованные выходы транзакций (UTXO) расходуются в транзакции и какие новые UTXO создаются. Мы ненадолго прощаемся и уже следующих статьях мы постараемся изложить суть протокола блокчейна и попытаемся глубже понять, где же там ценность. До встречи!
Команда EasyHex.