В главе 14 рассматривалась структура данных блокчейна, состоящая из двух основных компонентов: упорядоченной цепочки заголовков блоков и деревьев Меркле, содержащих данные транзакций. Предназначение этой структуры данных – хранение данных транзакций с обеспечением их защиты. Но что означает обеспечение защиты хранимых данных в текущем контексте? Ответ на этот вопрос является основной целью данной главы. Здесь рассматриваются последовательности изменяемых данных в блокчейн-системе и демонстрируется, как структура данных блокчейна обнаруживает изменения. Далее особо подчеркивается важная роль хэш-ссылок при хранении данных, чувствительных к изменениям. В конце главы описывается корректный способ добавления новых блоков в структуру данных блокчейна.
Ткачество – это искусство превращения отдельных нитей в ткань или материю посредством создания последовательности многочисленных взаимосвязанных петель, так называемых переплетений или петельных швов (stitches). При ручном производстве размеры петель существенно отличаются. Таким образом, в производственном процессе иногда возникает необходимость в корректировке отдельных петель. Для того чтобы поправить петельный шов, расположенный где-то в структуре ткани, необходимо распустить все последующие петли в обратном порядке, начиная с конца ряда, до тех пор, пока не встретится петля, требующая корректировки. После исправления этой петли восстанавливаются все последующие петли ряда. Это очень трудоемкая процедура, поэтому важно, чтобы все петли соответствовали требованиям по качеству сразу после своего первоначального создания. В этой главе показано, что использование структуры данных блокчейна похоже на ткацкое ремесло: добавление нового блока в конец структуры данных выполняется просто, но изменение данных где-либо в середине цепочки связано с существенными трудностями. С помощью описанной выше метафоры будет проще понять, как структура данных блокчейна обнаруживает изменения, с одной стороны, и каким образом выполняется корректное добавление и изменение данных – с другой.
Чтобы лучше понять процедуру добавления новых транзакций в существующую структуру данных блокчейна, рассмотрим простой пример. На рис. 15.1 показано начальное состояние структуры данных блокчейна, состоящей из одного блока. Эта структура содержит только две транзакции. Транзакция 3 и Транзакция 4 в нижней части рис. 15.1 пока еще не добавлены в рассматриваемую структуру данных. Чтобы добавить новые данные транзакции, необходимо выполнить следующие действия:
1. Создать новое дерево Меркле, содержащее все данные новой транзакции, которую нужно добавить, как показано на рис. 15.2.
2. Создать заголовок нового блока (Заголовок блока 2), содержащий хэш-ссылку (B1), указывающую на заголовок предыдущего блока (Заголовок блока 1), и корень дерева Меркле, содержащий данные новой транзакции (R34), как показано на рис. 15.3.
3. Создать новую хэш-ссылку (B2) на заголовок нового блока, как показано на рис. 15.4, и объявить ее новой головой обновленной структуры данных блокчейна. Следует помнить, что ссылка, которая указывает на самый последний добавленный элемент данных, называется головой (head) всей цепочки в целом (см. главу 11).
Рис. 15.1 Начальное состояние: в существующую структуру данных блокчейна нужно добавить две новые транзакции (Транзакция 3 и Транзакция 4)
Рис. 15.2 Шаг 1: создание нового дерева Меркле, которое содержит новые транзакции
Рис. 15.3. Шаг 2: создание заголовка нового блока, содержащего хэш-ссылку на заголовок предыдущего блока и корень дерева Меркле, в котором сохранены данные новых транзакций
Рис. 15.4 Шаг 3: создание новой хэш-ссылки, указывающей на заголовок нового блока, являющегося теперь новой головой всей обновленной структуры данных блокчейна
Действие, показанное на рис. 15.4, представляет собой начальное состояние для исследования воздействия изменений в данных, которые уже являются частью структуры данных блокчейна. Ниже будут рассматриваться следующие ситуации:
• изменение содержимого данных транзакции;
• изменение ссылки на дерево Меркле;
• замена транзакции;
• изменение корня дерева Меркле;
• изменение ссылки на заголовок блока.
Изменение содержимого данных транзакции
На рис. 15.5 показано, что происходит при изменении Транзакции 2. Эта транзакция является частью дерева Меркле, состоящего из хэш-ссылок. При изменении некоторых свойств Транзакции 2 (например, количества передаваемой продукции или учетной записи, принимающей право владения) изменяется также соответствующий отпечаток или криптографическое хэш-значение. После этого хэш-ссылка R2, указывающая на исходные данные транзакции, становится некорректной. Это свидетельствует о том, что первоначальные данные указываемой транзакции были изменены после их фиксации, следовательно, нарушено правило неизменяемого состояния данных. В итоге вся структура данных блокчейна становится неправильной.
Рис. 15.5 Изменение элементов транзакции приводит к некорректности хэш-ссылки, указывающей на первоначальные данные, в результате чего нарушается вся структура данных в целом
Изменение ссылки на дерево Меркле
На рис. 15.6 показано, что происходит, если изменяются не только элементы транзакции, но и хэш-ссылка, указывающая на эту обновленную транзакцию. Измененная хэш-ссылка (R2) корректна, так как правильно указывает на новые данные транзакции. Но эта обновленная хэш-ссылка является частью дерева Меркле, корень которого также представляет собой хэш-ссылку. Корень дерева Меркле R12 указывает на элемент данных, содержащий хэш-ссылки R1 и R2. Вторая ссылка была изменена для сохранения логической согласованности с измененной версией Транзакции 2. При этом изменилось и криптографическое хэш-значение элемента данных, включающего обновленную версию R2, поэтому корень дерева Меркле R12 стал некорректным.
Рис. 15.6 Изменение транзакции и хэш-ссылки на нее в дереве Меркле приводит к некорректности корня дерева Меркле, из-за чего вся структура данных становится неправильной
Замена транзакции
На рис. 15.7 рассматривается случай замены всей транзакции полностью, отличающийся от варианта изменения элементов существующей транзакции, а также обновление соответствующей хэш-ссылки.
При сравнении рис. 15.6 и 15.7 можно заметить минимальное различие в имени транзакции и соответствующей хэш-ссылки. В целом отображение последовательностей на обеих схемах одинаково. И в том, и в другом случае корень дерева Меркле R12 становится некорректным из-за изменений, внесенных в само дерево.
В итоге обнаруживается, что изменение транзакции и полная замена транзакции оказывают одинаковое воздействие на структуру данных блокчейна. Изменения выявляются в обоих вариантах, но в любом случае вся структура данных становится некорректной.
Рис. 15.7 Замена транзакции и хэш-ссылки на нее в дереве Меркле приводит к некорректности корня дерева Меркле, из-за чего вся структура данных становится неправильной
Примечание
Изменение или замена данных в структуре данных блокчейна приводит к одинаковому результату, так как оба варианта оказывают одинаковое воздействие на хэш-ссылки.
Изменение корня дерева Меркле
На рис. 15.8 показано, что происходит при изменении всего дерева Меркле, включая его корень.
Корень измененного дерева Меркле R12 является частью заголовка блока (Заголовок блока 1). При изменении корня изменяется и криптографическое хэш-значение Заголовка блока 1, что, в свою очередь, приводит к некорректности хэш-ссылки B1 на этот заголовок. После обнаружения изменения хэш-ссылка B1, обеспечивающая соединение или служащая связью между Заголовком блока 2 и Заголовком блока 1, становится некорректной. В итоге становится некорректной и вся структура данных блокчейна.
Рис. 15.8 Изменение дерева Меркле приводит к некорректности хэш-ссылки, указывающей на заголовок блока, содержащий эту ссылку, из-за чего вся структура данных становится неправильной
Изменение ссылки на заголовок блока
На рис. 15.9 показано, что происходит при изменении не только всего дерева Меркле, но и хэш-ссылки на заголовок изменяемого блока.
Рис. 15.9 Изменение хэш-ссылки в заголовке блока приводит к некорректности хэш-ссылки, указывающей на заголовок изменяемого блока, из-за чего вся структура данных становится неправильной
При изменении хэш-ссылки B1 на заголовок изменяемого блока (Заголовок блока 1) происходит следующее: начиная с хэш-ссылки B1, все хэш-ссылки, указывающие на изменяемые данные, остаются согласованными и корректными, поскольку они были отредактированы в соответствии с внесенными изменениями. Но измененная хэш-ссылка B1 является частью Заголовка блока 2, следовательно, ее криптографическое хэш-значение изменилось, после чего стала некорректной хэш-ссылка B2, указывающая на заголовок блока, содержащего первоначальную версию хэш-ссылки B1. Поэтому вся структура данных блокчейна становится некорректной.
После рассмотрения нескольких способов изменения структуры данных блокчейна, приводящих к нарушению ее корректности, необходимо объяснить, что нужно сделать, чтобы правильно изменить или обновить структуру данных блокчейна. На рис. 15.10 показано, как внести изменения в структуру данных блокчейна корректным способом.
Рис. 15.10 При корректном изменении транзакции последовательно изменяются все связанные с ней хэш-ссылки
Если нужно изменить или обновить некоторые элементы Транзакции 2, то необходимо соответствующим образом обновить всю последовательность хэш-ссылок: R2, R12, B1 и B2. Это означает, что все хэш-ссылки, начиная с той, которая указывает непосредственно на измененные данные, и заканчивая той, которая ссылается на самый последний заголовок блока (разумеется, и все хэш-ссылки между ними), должны быть изменены или обновлены таким образом, чтобы отображались изменения в указываемых объектах. Это достаточно трудная задача, и затруднена она преднамеренно. Вся описанная выше работа необходима для сохранения логической связанности всей структуры данных блокчейна и для поддержания ее целостности. Другие способы изменения или редактирования данных, являющихся частью структуры данных блокчейна, приведут к некорректности хэш-ссылок, из-за чего вся структура данных станет некорректной.
В предыдущем разделе было показано, что структура данных блокчейна применяет бескомпромиссный подход «все или ничего» при необходимости изменения данных: изменяется вся структура данных полностью, от места исходного редактирования данных до головы всей цепочки, или вся структура остается неизменной. Все прочие нерешительные, половинчатые и частичные изменения приводят всю структуру данных блокчейна в несогласованное состояние, которое быстро и легко обнаруживается благодаря свойствам хэш-ссылок, хотя структура данных блокчейна и не различает преднамеренных и непреднамеренных изменений. В действительности с точки зрения блокчейна вообще не существует преднамеренных и непреднамеренных изменений. Эти слова обозначают оценку причин или намерений человека, вносящего изменения. Но структура данных блокчейна не оценивает ни людей, ни каких-либо других факторов, приводящих к несогласованности. Блокчейн-система заботится только о корректности и логической связности всех своих хэш-ссылок. Если одна из ссылок некорректна, то некорректна и вся структура данных, вне зависимости от того, кто или что внес изменение и с какой целью оно было сделано. Именно благодаря этому свойству структура данных блокчейна становится весьма полезной.
В этой главе подробно рассматривались возможные варианты изменений в структуре данных блокчейна и особо отмечено, что структура данных блокчейна весьма чувствительна к изменениям. При необходимости внесения каких-либо изменений применяется бескомпромиссный подход «все или ничего». В следующей главе будет показано, как это свойство можно применить, чтобы сделать данные неизменяемыми, благодаря чему структура данных блокчейна становится превосходным средством хранения данных в ненадежной и не внушающей доверия среде.
• Чтобы добавить новые данные транзакции, необходимо выполнить следующие действия:
– создать новое дерево Меркле, содержащее все данные новой транзакции, которую нужно добавить;
– создать заголовок нового блока, содержащий хэш-ссылку, указывающую на заголовок предыдущего блока, и корень дерева Меркле, содержащий данные новой транзакции;
– создать хэш-ссылку на заголовок нового блока и объявить ее текущей головой обновленной структуры данных блокчейна.
• Изменение данных в структуре данных блокчейна требует обновления всех хэш-ссылок, начиная с той, которая указывает непосредственно на измененные данные, и заканчивая той, которая ссылается на самый последний заголовок блока (разумеется, и всех хэш-ссылок между ними).
• Структура данных блокчейна применяет бескомпромиссный подход «все или ничего» при необходимости изменения данных: изменяется вся структура данных полностью, от места исходного редактирования данных до головы всей цепочки, или вся структура остается неизменной.
• Все прочие нерешительные, половинчатые и частичные изменения приводят всю структуру данных блокчейна в несогласованное состояние, которое быстро и легко обнаруживается благодаря свойствам хэш-ссылок.
• Полноценное изменение структуры данных блокчейна преднамеренно сделано весьма трудоемким процессом.
• Высокая чувствительность структуры данных блокчейна к изменениям обеспечивается свойствами хэш-ссылок.