После изучения пяти предыдущих глав вы получили возможность проследить историю права владения собственностью на основе полной хронологии данных транзакций, а также описать отдельные процедуры передачи права владения безопасным способом посредством авторизации транзакций с помощью цифровых подписей и недвусмысленной идентификации учетных записей пользователей. Но пока еще ничего не было сказано о том, как обеспечивается защищенное хранение всех этих данных транзакций, формирующих полную хронологию. Для этого применяются структуры данных блокчейна. В этой главе рассматриваются структура данных блокчейна и способ ее создания.
Попробуйте вспомнить, когда вы в последний раз ходили в библиотеку и пользовались обычными карточными каталогами. Библиотечные каталоги представляют собой реестры всех книг, принадлежащих библиотеке. В некоторых библиотеках продолжают использоваться бумажные карточные каталоги для контроля и управления библиотечными фондами. Каждая карточка в таком каталоге представляет одну книгу, а также сообщает общую информацию об этой книге, например фамилию автора, название, дату выхода из печати и местонахождение данной книги в библиотеке: этаж, зал, номер стеллажа и номер полки. Для более точной идентификации книг в карточках каталога часто указывают уникальные библиотечные номера, которые также записаны на корешках книг. В большинстве библиотек имеется несколько карточных каталогов, отличающихся по критериям упорядочения карточек. Например, в каталоге авторов карточки отсортированы по фамилиям авторов в алфавитном порядке, в каталоге названий – по заглавиям книг также в алфавитном порядке. Может существовать даже особый каталог, в котором сортировка выполнена в порядке поступления книг в библиотеку. В этой главе рассматривается способ хранения данных транзакций блокчейна, похожий на способ, применяемый для библиотечных каталогов.
Цель блокчейн-системы – поддержание полной хронологии данных транзакций в упорядоченном виде.
Главная задача – организовать хранение данных всех выполненных транзакций таким способом, который позволяет сохранить порядок выполнения транзакций, а также быстро и просто обнаружить любые изменения, внесенные в эти данные. Быстрое обнаружение изменений важно, потому что это является основой для предотвращения искажений или подделок хронологии транзакций.
Основная идея заключается в создании библиотеки данных транзакций и в обслуживании упорядоченного каталога, сохраняющего порядок, в котором транзакции добавлялись в библиотеку. Чтобы упростить обнаружение любых изменений, внесенных в порядок ведения каталога или в данные отдельных транзакций, данные обязательно должны храниться с обеспечением строгого контроля за изменениями, что подразумевает использование хэш-ссылок.
В этом разделе рассматривается постепенное превращение обычной книги в небольшую библиотеку с упорядоченным каталогом, которая в итоге оказывается упрощенной версией структуры данных блокчейна.
Исходная позиция: обычная книга
В течение многих веков информация записывалась на громоздких листах пергамента, которые назывались свитками. В наши дни мы привыкли пользоваться печатной информацией в другом виде: жестко скрепленные пачки пронумерованных страниц, которые мы называем книгами. Поскольку книги стали привычной вещью, их полезность можно принять без доказательств. Ниже перечислены некоторые наиболее важные свойства книг:
• хранение содержимого: книги хранят содержимое на своих страницах;
• упорядоченность: предложения на страницах и сами страницы в книге размещены в определенном порядке;
• связанность страниц: страницы физически объединены с помощью переплета и логически связаны содержимым и номерами страниц.
Благодаря этим свойствам мы можем просматривать книги в прямом и обратном направлениях, листая страницы, или сразу переходить к нужной странице по ее номеру. Посмотрим, чего можно достичь, если изменить некоторые из этих свойств.
Преобразование 1: создание явной зависимости между страницами
На рис. 14.1 показано схематическое изображение двух страниц из простейшей книги. На каждой странице имеются верхнее поле с номером страницы и область содержимого, в которой размещено только одно слово.
Рис. 14.1 Схематическое изображение страниц книги
Номера страниц служат важной цели: вы сразу же можете обнаружить отсутствие страницы в книге, проверяя правильность последовательности номеров без пропусков. Предположим, что в настоящий момент вы читаете страницу 42 нашей простейшей книги. Какой номер должна иметь предыдущая страница? Это очень просто: номер предыдущей страницы 41, то есть 42 минус 1. Для проверки действительного существования предыдущей страницы мы сравниваем ее фактически обозначенный номер с ожидаемым, то есть с номером текущей страницы, уменьшенным на 1. Если оба числа равны, то можно сделать вывод, что предыдущая страница не удалена.
Откуда мы знаем, что номер предыдущей страницы должен быть равен разности номера текущей страницы и единицы? Мы предполагаем, что во всех книгах соблюдается соглашение о последовательной нумерации страниц с помощью натуральных чисел. Но что, если наше предположение неверно, потому что автор или издатель книги решил использовать другую схему нумерации страниц (например, с помощью только четных чисел или с помощью чисел, кратных трем)? В этом случае наш подход к проверке существования предыдущей страницы не работает. Для упрощения процедуры проверки того факта, что предыдущая страница не была удалена из книги, можно установить явную связь каждой страницы с предыдущей. На рис. 14.2 показано, как это сделано в нашей простейшей книге. На каждой странице указан не только ее номер, но и номер предыдущей страницы. Такая схема нумерации страниц создает явную зависимость между любой страницей и предшествующей ей страницей. Явная ссылка на предыдущую страницу существенно упрощает процедуру проверки ее наличия, поскольку при этом не делается никаких неявных предположений.
Рис. 14.2 Страницы книги с явными ссылками на предыдущие страницы
Преобразование 2: отделение содержимого
На страницах нашей книги хранятся содержимое и информация, необходимая для поддержания порядка: номера страниц. Можно сделать книгу более удобной, если отделить содержимое и сосредоточить внимание на задаче поддержания порядка страниц. На рис. 14.3 показано, как выглядят страницы нашей условной книги после отделения содержимого. Теперь содержимое расположено вне страниц, а вместо этого на страницах размещены числовые ссылки, указывающие на содержимое, которое можно хранить в любом месте по нашему выбору (например, в ящике стола, на полке или где-то еще).
Рис. 14.3 Страницы книги с числовыми ссылками на отделенное содержимое
На этом этапе мы преобразовали книгу в небольшую библиотеку. Книга, ранее хранившая содержимое и номера страниц вместе, превращена в каталог, единственной задачей которого является сохранение порядка содержимого отдельных страниц, идентифицируемых по неповторяющимся числовым ссылкам.
Преобразование 3: замена номеров страниц
Теперь наша книга представляет собой упорядоченный каталог, поддерживающий порядок страниц двумя различными способами: во-первых, по физическому расположению страниц книги, скрепленных переплетом, во-вторых, по номерам страниц и явным ссылкам на предыдущие страницы. Благодаря своей физической структуре книга сохраняет порядок страниц, поэтому мы можем экспериментировать с различными схемами нумерации страниц. Можно заменить натуральные числа в верхних полях страниц числовыми ссылками. На рис. 14.4 показан результат этого преобразования. Например, страница, ранее определяемая номером 42, теперь идентифицируется по числовой ссылке 8118E736. Аналогично страница, прежде имевшая номер 41, теперь определяется по числовой ссылке B779E800. Отметим, что ссылки на предыдущие страницы также изменились соответствующим образом. Страница с числовой ссылкой 8118E736 содержит корректную числовую ссылку на предшествующую ей страницу.
Рис. 14.4 Страницы книги, использующие числовые ссылки в качестве номеров страниц
Преобразование 4: создание числовых ссылок
В предыдущем преобразовании номера страниц книги были заменены числовыми ссылками. Но ничего не было сказано о том, как эти ссылки должны создаваться. Наилучший способ создания неповторяющихся числовых ссылок – использование криптографических хэш-значений. Таким образом, можно идентифицировать страницы нашего каталога и соответствующие страницы содержимого с помощью криптографических хэш-значений, являющихся цифровыми отпечатками содержимого. Для упрощения на рис. 14.3 и 14.4 используются укороченные хэш-значения. (Вы можете проверить результаты вычислений с помощью инструмента, представленного на веб-странице .) Например, страница, содержащая слово Hello, идентифицируется по укороченному хэш-значению для этого слова, равному 185F8DB3. Числовые ссылки на страницы книги вычисляются на основе их содержимого, то есть на основе числовой ссылки на содержимое и числовой ссылки на предыдущую страницу. Например, числовая ссылка на страницу B779E800 является хэш-значением, вычисленным для комбинации данных 011C01C1 185F8DB3.
Преобразование 5: отказ от переплета книги
Созданный выше упорядоченный каталог представляет собой не совсем обычную книгу, поскольку каждая его страница содержит собственную числовую ссылку, числовую ссылку на предыдущую страницу и числовую ссылку на соответствующую страницу содержимого. Но этот каталог все еще остается книгой в привычном понимании, так как ее страницы скреплены переплетом.
Что произойдет, если удалить переплет и превратить упорядоченную книгу в стопку ничем не связанных листов? Сделав это, мы разрушим физическую связанность страниц и потеряем возможность сохранения их физического порядка. К счастью, возможность поддержания порядка страниц не утрачена полностью. На каждой странице есть числовая ссылка на предыдущую страницу. Поэтому мы можем перемещаться по страницам в обратном порядке, используя для этого числовые ссылки на предыдущие страницы. Если мы отдельно сохраним самую последнюю страницу нашего упорядоченного каталога, то всегда будем иметь возможность просмотра всех страниц в обратном порядке.
Цель достигнута: оценка результата
Подведем итог наших достижений в этом примере. Мы превратили обычную книгу в две физически неупорядоченные стопки отдельных страниц, которые связаны друг с другом с помощью уникальных числовых ссылок. В одной стопке собраны страницы содержимого, в другой стопке хранятся страницы, обеспечивающие порядок. Для упрощения мы называем вторую стопку страниц упорядоченным каталогом. На каждой странице этого упорядоченного каталога указаны числовая ссылка на предыдущую страницу и числовая ссылка на соответствующую страницу содержимого. В итоге мы отделили схему упорядочения от хранимой информации, а логическое место расположения (установленный порядок) – от физического места расположения страниц. Благодаря использованию хэш-значений в качестве числовых ссылок можно без затруднений проверить их корректность простым повторным вычислением. Так как страницы в упорядоченном каталоге уже не скреплены переплетом, мы можем просматривать их только постранично в обратном порядке, следуя по числовым ссылкам на предыдущие страницы. В табл. 14.1 описаны свойства книги, рассмотренной в примере, до и после выполнения преобразований.
Таблица 14.1 Сравнение свойств книги до и после выполнения всех преобразований
Что такое структура данных блокчейна? В действительности вы уже знаете ответ, потому что в рассмотренном выше примере фактически разработана упрощенная структура данных блокчейна. Но мы использовали другую терминологию. В этом разделе подводится итог обсуждения примера с использованием аналогии, и элементы преобразованной книги связываются с терминами, применяемыми в контексте блокчейна.
Преобразованная книга состоит из следующих элементов:
• воображаемый элемент, состоящий из страницы упорядоченного каталога и соответствующей ему страницы содержимого;
• стопка отдельных страниц, называемая упорядоченным каталогом;
• стопка отдельных страниц, называемая содержимым;
• числовые ссылки на страницы для идентификации и установления связей между страницами упорядоченного каталога;
• числовые ссылки на страницы содержимого для идентификации и установления связей между ними.
В конце текущего раздела приведена табл. 14.2, объединяющая результаты сравнения элементов простейшей книги из примера после ее преобразования с элементами структуры данных блокчейна.
Таблица 14.2 Сравнение преобразованной книги со структурой данных блокчейна
Воображаемый элемент, состоящий из страницы упорядоченного каталога и соответствующей ему страницы содержимого
Воображаемый элемент, состоящий из страницы упорядоченного каталога и соответствующей ему страницы содержимого, соответствует одному блоку в структуре данных блокчейна. Вместе все эти блоки формируют структуру данных блокчейна. Важно понимать, что элемент, состоящий из страницы упорядоченного каталога и соответствующей ему страницы содержимого, существует только в нашем воображении, потому что страницы упорядоченного каталога и страницы содержимого являются физически разделенными, независимыми объектами. Страницы каталога указывают на страницы содержимого с помощью хэш-ссылок, которые позволяют мысленно представить эту связь как воображаемый элемент.
Упорядоченный каталог
Упорядоченный каталог преобразованной книги равнозначен цепочке заголовков блоков в структуре данных блокчейна. Каждая страница упорядоченного каталога соответствует одному заголовку блока в структуре данных блокчейна. Поскольку заголовки блоков связаны друг с другом с помощью ссылок в линейную последовательность, они образуют цепочку заголовков блоков. Как и упорядоченный каталог, цепочка заголовков блоков не хранит самих данных транзакции, а содержит только хэш-ссылки на соответствующие данные транзакции. Здесь особенно важным становится понимание роли воображаемого элемента, объединяющего упорядоченный каталог и содержимое.
Страницы содержимого
Содержимое преобразованной книги соответствует данным транзакции, выполняемой блокчейн-системой. В рассматриваемой прикладной области эти данные предназначены для управления правом владения. В реальных блокчейн-приложениях нет страниц содержимого, здесь этот термин введен исключительно в учебных целях. Реальные блокчейн-приложения хранят данные содержимого (то есть данные транзакции) напосредственно в базе данных, и мы ссылаемся на эти данные как на деревья Меркле, корни которых сохранены в заголовках блоков.
Числовые ссылки на страницы каталога
Числовые ссылки на страницы каталога преобразованной книги, используемые для идентификации страниц упорядоченного каталога, соответствуют криптографическим хэш-значениям отдельных заголовков блоков в структуре данных блокчейна. Они называются хэшем блока или хэшем предыдущего блока соответственно и используются для недвусмысленной идентификации каждого заголовка блока и для ссылки на заголовок предыдущего блока. Действительный переход от одного заголовка блока к предшествующему заголовку выполняется с помощью хэш-ссылки.
Числовые ссылки на содержимое
Числовые ссылки на содержимое преобразованной книги, используемые для идентификации страниц содержимого, соответствуют хэш-ссылкам в цепочке заголовков блоков, указывающим на связанные с ними данные транзакции. Если говорить точнее, то числовая ссылка на содержимое, хранимая в заголовке блока, является корнем дерева Меркле, то есть данных транзакции, сохраненных в базе данных. Именно здесь создается воображаемый элемент, связывающий упорядоченный каталог (заголовок блока) с соответствующим содержимым (дерево Меркле с данными транзакции).
На рис. 14.5 схематически показаны все рассмотренные ранее элементы в виде структуры данных блокчейна, хранящей четыре транзакции. На этой схеме показана упрощенная структура данных блокчейна, состоящая из двух блоков: БЛОК 1 и БЛОК 2. Эти блоки изображены штриховыми линиями, чтобы подчеркнуть их воображаемую, нематериальную сущность. Блоки содержат заголовки, обозначенные как Заголовок блока 1 и Заголовок блока 2 соответственно. БЛОК 1 – самый первый блок в этой структуре данных, поэтому у него нет предыдущего блока, значит, нет и ссылки на заголовок предыдущего блока. Для БЛОКа 2 имеется предшествующий блок, поэтому в Заголовке блока 2 содержится хэш-ссылка B1 на заголовок предыдущего блока. В этой структуре данных блокчейна также содержатся хэш-ссылки на два различных дерева Меркле с корнями R12 и R34 соответственно. Метки корней деревьев Меркле указывают непосредственно на данные транзакций, которые они содержат (например, дерево Меркле с корнем R12 содержит первые две транзакции, обозначенные как Транзакция 1 и Транзакция 2, а также соответствующие хэш-ссылки R1 и R2, указывающие на эти транзакции).
Если вы присоединитесь к пиринговой системе, поддерживающей структуру данных блокчейна, как показано на рис. 14.5, то сможете получить все данные транзакций, все значения хэш-ссылок и все заголовки блоков. На основе этих данных локальный компьютер способен создать структуру данных блокчейна, включающую хэш-ссылки на данные, хранимые на этом локальном компьютере. Имея в распоряжении все данные и ссылку на самый последний текущий заголовок блока, вы можете последовательно в обратном порядке просматривать полную хронологию всех данных транзакций, когда-либо выполненных в системе с момента ее создания, то есть в нашем примере – все четыре транзакции. Следует обратить особое внимание на то, что ссылка на текущий заголовок блока, добавленного самым последним, называется головой (head) структуры данных блокчейна, потому что именно здесь будет добавляться следующий блок. Иногда головой структуры данных блокчейна называют заголовок блока, добавленного последним, и ссылку на него. На рис. 14.5 головой структуры данных блокчейна является ссылка B2. Очень важно не путать термины голова (head) и заголовок (header): структура данных блокчейна состоит из множества блоков, у каждого из которых есть собственный заголовок, но вся структура в целом имеет только одну голову.
Рис. 14.5 Упрощенная схема структуры данных блокчейна, содержащей четыре транзакции
Примечание
Структура данных блокчейна, рассматриваемая в этой главе и показанная на рис. 14.5, упрощена в учебных целях. Многие подробности, касающиеся информации, хранимой в заголовках блоков, преднамеренно опущены. Некоторые из этих подробностей будут рассматриваться в следующих главах, помогая вам лучше понять технологию блокчейна.
В этой главе рассматривались структура данных блокчейна и ее внутреннее устройство. Способ применения хэш-ссылок делает структуру данных блокчейна весьма чувствительной к изменениям структуры хранения данных. В следующей главе это свойство рассматривается более подробно, поскольку является ключом к пониманию того, как обеспечить безопасность блокчейн-системы.
• Структура данных блокчейна – это особый тип структуры данных, составленной из упорядоченных элементов, называемых блоками.
• Каждый блок структуры данных блокчейна состоит из заголовка блока и дерева Меркле, содержащего данные транзакции.
• Структура данных блокчейна состоит из двух основных структур данных: упорядоченная цепочка заголовков блоков и деревья Меркле.
• Упорядоченную цепочку заголовков блоков можно мысленно представить как цифровой аналог традиционных библиотечных карточных каталогов, в которых отдельные карточки отсортированы в порядке их добавления в каталог.
• Каждый заголовок блока ссылается на предшествующий ему заголовок блока, тем самым сохраняя порядок отдельных заголовков и соответствующих блоков, формирующих структуру данных блокчейна.
• Каждый заголовок блока в структуре данных блокчейна идентифицируется по собственному криптографическому хэш-значению и содержит хэш-ссылку на предыдущий заголовок блока, а также хэш-ссылку на специализированные прикладные данные, порядок которых необходимо сохранять.
• Хэш-ссылка на специализированные прикладные данные обычно является корнем дерева Меркле, которое поддерживает хэш-ссылки на конкретные данные приложения.