Глава 15 завершалась констатацией того факта, что структура данных блокчейна хранит данные способом, чрезвычайно чувствительным к каким-либо изменениям. Любое изменение данных, хранящихся в структуре данных блокчейна, сразу же обнаруживается и требует выполнения трудоемкого процесса правильного включения этого изменения в существующую структуру. В этой главе рассматривается, как указанное выше свойство можно использовать для подготовки хронологии данных транзакций, совместно используемой и распределенной в ненадежной, не внушающей доверия среде, не опасаясь того, что нечестные участники пиринговой системы смогут изменять содержимое хронологии в личных корыстных целях.
Предположим, что я надеюсь стать членом престижной аристократической семьи. Как я могу добиться этого? Здесь может помочь составление генеалогического древа моей семьи. Например, в таком генеалогическом древе я мог бы создать дедушку-аристократа и установить связь между ним и мной. Будет ли это достаточно убедительным аргументом, чтобы убедить окружающих в существовании моих поддельных аристократических корней? Эта фальсификация будет быстро разоблачена, так как родословные редко существуют в полной изоляции, они объединяются и пересекаются с другими родословными с помощью семейных взаимоотношений. Следовательно, если ни в одном генеалогическом древе настоящих аристократических семей не упоминается мой выдуманный дед, то быстро обнаружится, что история моей, якобы аристократической семьи является поддельной. Чтобы семейная хронология была признана настоящей, необходимо подредактировать архивные документы некоторых настоящих аристократических семей, включив ссылки на мое генеалогическое древо в их историю. Но даже это может оказаться недостаточным. Люди проживают реальную жизнь и оставляют различные следы в нашем мире. Мой выдуманный дедушка никогда не существовал в действительности. Поэтому я должен «создать» его жизнь, чтобы моя уловка выглядела вполне настоящей. Предполагается, что мне следует придумать всю жизнь вымышленного деда, включая его детство, школьные годы, дальнейшую карьеру и прочее. Кроме того, потребуются соответствующие поддельные документы, такие как свидетельство о рождении, документы о поступлении в школу, аттестат об окончании школы, университетские дипломы, свидетельства о профессиональной деятельности, о членстве в различных организациях и т. п. Школы, университеты и организации хранят архивные записи о своих учениках и сотрудниках и публикуют альманахи-ежегодники и фотографии групп и подразделений. Таким образом, необходимо подредактировать и эти документы, чтобы сделать моего вымышленного деда бывшим членом некоторых организаций. Поскольку тайное редактирование всех перечисленных документов с большой вероятностью станет очень сложным и дорогим занятием, я, скорее всего, приму решение оставить неизменной историю моей действительной неаристократической семьи.
Эта интеллектуальная игра показывает, что фальсификация прошлого возможна, но чрезвычайно трудна и связана с немалыми затратами, так как требует редактирования и подмены большого количества хронологических документов и свидетельств, чтобы внести в них ложную информацию, искажающую реальную историю. Затраты на подобные действия непомерно высоки, следовательно, гораздо проще и дешевле работать с правдивой информацией. В этой главе рассматривается, как в технологии блокчейна применяется эта концепция для защиты хронологии данных транзакций от подделок.
Важно, чтобы вся хронология данных транзакций в целом, поддерживаемая блокчейн-системой, всегда представляла истинную информацию, следовательно, являлась бы надежным источником подтверждения фактов, связанных с правами владения собственностью.
Блокчейн-система – это полностью распределенная пиринговая система, открытая для всех. Поэтому существует опасность того, что нечестные участники могут изменить или подделать хронологию данных транзакций в своих корыстных целях. Главной задачей является сохранение полной открытости системы с обеспечением защиты хронологии данных транзакций от возможных подделок и изменений.
В открытой системе заранее отличить честных участников от нечестных очень трудно или даже невозможно. Поэтому, чтобы защитить хронологию данных транзакций от манипуляций нечестных участников, необходимо в первую очередь запретить кому-либо любые действия, изменяющие хронологию. Если никто не имеет возможности изменять хронологию данных транзакций, независимо от честности или нечестности его намерений, можно не опасаться каких бы то ни было манипуляций с этими данными. Таким образом, изначальное сохранение неизменяемости данных транзакций решает возникшую проблему. В результате система остается открытой для всех, но исключается возможность внесения каких-либо изменений в хронологию транзакций.
Неизменяемость (immutability) означает, что невозможно изменить объект, обладающий этим свойством. Неизменяемые данные не могут быть изменены после того, как они были созданы или записаны. Именно поэтому такие данные называют данными только для чтения (read-only data). Главное их преимущество – представление информации исключительно для чтения или в демонстрационных целях. Это свойство особенно необходимо, если данные передаются сторонним лицам и теряется возможность управления способом использования этих данных. Передача неизменяемых данных представляет собой эффективную методику предотвращения изменений или прочих манипуляций с данными. В реальной жизни примерами неизменяемых объектов являются водительские права, паспорта и дипломы о высшем образовании. Компетентные органы выдают эти документы, чтобы подтвердить указанные в них факты, а законодательство ограничивает их использование только предъявлением и чтением.
Основная идея, используемая технологией блокчейна для сохранения неизменяемости хронологии транзакций, заключается в том, чтобы сделать любые изменения чрезвычайно затруднительными и дорогостоящими, то есть сложность должна заставить отказаться от попыток внесения изменений. Методика обеспечения неизменяемости хронологии данных транзакций включает три элемента:
1) сохранение хронологии данных транзакций таким способом, при котором даже минимальное изменение содержимого сразу обнаруживается и становится заметным;
2) установление такого порядка внесения изменений в хронологию транзакций, при котором требуются редактирование и перезапись огромной части всей хронологии;
3) операции добавления, записи и перезаписи данных в хронологию преднамеренно делаются многозатратными с точки зрения вычислительных мощностей.
Обнаружение любых изменений
Структура данных блокчейна, хранящая данные с обеспечением высокой чувствительности к изменениям, соответствует первому элементу. Никто не сможет незаметно изменить данных, являющихся частью структуры данных блокчейна, и при этом надеяться, что это изменение останется незамеченным. Любое изменение вызовет «большой шум» из-за нарушенных хэш-ссылок, ставших некорректными в результате изменений в данных, на которые они указывают.
Принудительная перезапись всей хронологии при внутренних изменениях
Структура данных блокчейна также поддерживает второй элемент, поскольку применяет бескомпромиссный подход «все или ничего», когда возникает необходимость в изменении существующих данных: либо изменяется вся структура данных полностью, начиная с того места, где вносится изменение, и заканчивая головой всей цепочки, либо данные остаются в своем первоначальном состоянии, без изменений.
Добавление данных чрезвычайно многозатратно с точки зрения вычислительных мощностей
Третий элемент предназначен для тех, кто не испугался перезаписи крупных частей структуры данных блокчейна с целью внесения изменений в существующую хронологию транзакций. Но поскольку запись или перезапись структуры данных блокчейна связана с огромными накладными расходами на вычислительные мощности, следует хорошенько подумать, прежде чем принять окончательное решение о целесообразности попытки внесения изменений.
Комплект технологий блокчейна делает содержимое структуры данных блокчейна неизменяемым, устанавливая при этом весьма высокий уровень стоимости затрат на вычислительные мощности для каждой операции записи, перезаписи или добавления блока в структуру данных блокчейна. Высокая стоимость вычислительных мощностей создается при помощи хэш-головоломок, различных для каждого заголовка блока [26]. Таким образом, тот, кто пытается внести изменения, принимает на себя полностью все затраты по изменению структуры данных с места внесения изменений до головы всей цепочки, решая при этом хэш-головоломки для каждого заголовка блока, вовлеченного в этот процесс, или оставляет всю структуру неизменной.
Процедура добавления нового блока в структуру данных блокчейна, описанная в главе 15, не связана с чрезмерными накладными расходами, потому что она требует лишь добавления хэш-ссылки, указывающей на заголовок нового блока в цепочке и объявление этой ссылки как новой головы цепочки. Главная задача создания состояния неизменяемости структуры данных блокчейна заключается в том, чтобы сделать добавление нового блока задачей, дорогостоящей с точки зрения вычислительных мощностей. Для достижения этой цели необходимо рассмотреть следующие аспекты:
• обязательность данных заголовков блоков;
• процесс создания заголовка нового блока;
• правила проверки для заголовков блоков.
Обязательность данных
Заголовок каждого блока структуры данных блокчейна обязательно должен содержать, как минимум, следующие данные [27]:
• корень дерева Меркле, содержащего данные транзакции;
• хэш-ссылка на заголовок предыдущего блока;
• уровень сложности хэш-головоломки;
• время начала решения хэш-головоломки;
• одноразовый случайный код (nonce), который решает данную хэш-головоломку.
Процесс создания нового блока
При создании нового блока выполняются следующие действия:
1. Сформировать корень дерева Меркле, содержащего данные добавляемой транзакции.
2. Создать хэш-ссылку на заголовок блока, являющегося предшествующим с точки зрения заголовка нового блока.
3. Установить требуемый уровень сложности.
4. Установить текущее время.
5. Создать подготовительный заголовок блока, содержащий данные, перечисленные в пунктах 1-4.
6. Решить хэш-головоломку для подготовительного заголовка блока.
7. Завершить создание нового блока, добавив одноразовый случайный код (nonce), решающий хэш-головоломку для подготовительного заголовка.
На рис. 16.1 показана хэш-головоломка, которую необходимо решить при добавлении нового блока в структуру данных блокчейна. Здесь изображены данные заголовка блока, хэш-значение которого должно соответствовать заданному ограничению или уровню сложности. Отметим, что уровень сложности является частью заголовка блока, следовательно, и частью хэш-значения этого блока. Это дает уверенность в том, что никто не сможет обойтись без непомерных издержек на вычислительные мощности при решении хэш-головоломки, произвольным образом снижая уровень сложности.
Рис. 16.1 Схема хэш-головоломки, которую необходимо решить при добавлении нового блока в структуру данных блокчейна
Правила проверки
Каждый заголовок блока должен выполнять следующие правила:
1. Обязательно содержать корректную хэш-ссылку на предыдущий блок.
2. Обязательно содержать корректный корень дерева Меркле, содержащий данные транзакции.
3. Обязательно содержать корректный уровень сложности.
4. Метка времени должна быть более поздней, чем метка времени предыдущего заголовка блока.
5. Обязательно содержать одноразовый случайный код (nonce).
6. Хэш-значение всех пяти элементов данных, взятых вместе, должно соответствовать заданному уровню сложности.
Эти правила проверки гарантируют, что в структуру данных блокчейна добавляются только те блоки, для которых решена соответствующая хэш-головоломка и «погашены» все вычислительные издержки. Правило 4 обеспечивает правильное расположение блоков и соответствующих данных транзакций в том порядке, в котором они были добавлены по времени.
Примечание
Операция добавления нового блока в структуру данных блокчейна посредством решения хэш-головоломки также называется майнингом (mining) или майнингом блока (block mining).
Структура данных блокчейна позволяет сразу обнаружить любое изменение в своих данных благодаря высокой чувствительности соответствующих хэш-ссылок. При внесении изменений необходимо перезаписывать все блоки, на которые воздействует производимое изменение. Хэш-головоломка создает вычислительные накладные расходы для каждого блока, требующего перезаписи из-за внесения изменения. Суммарные вычислительные накладные расходы на перезапись всей структуры данных блокчейна из-за внесения единственного изменения сразу же заставляют задуматься о целесообразности каких-либо попыток изменить хронологию транзакций. В итоге структура данных блокчейна становится хранилищем неизменяемых данных, в которое можно только добавлять новые блоки.
Предположим, что мы все-таки решили сделать попытку внесения изменений в конкретный элемент данных транзакции, являющихся частью дерева Меркле, на которые указывает заголовок блока, расположенный 20 блоками ниже текущей головы структуры данных блокчейна. Внесение изменений в данные транзакции потребует выполнения следующих операций:
1) перезаписи дерева Меркле, которому принадлежит изменяемая транзакция;
2) перезаписи заголовка блока, в котором содержится корень перезаписанного дерева Меркле;
3) перезаписи всех последующих заголовков блоков вплоть до головы структуры данных блокчейна.
В пункте 2 требуется решение хэш-головоломки, так как изменение корня дерева Меркле повлекло за собой изменение хэш-значения заголовка блока, поэтому соответствующая хэш-головоломка должна быть решена заново. В пункте 3 требуется решение 20 хэш-головоломок из-за последовательного изменения хэш-ссылок на предыдущие заголовки блоков. Если предположить, что решение хэш-головоломки занимает в среднем 10 минут, то потребуется 210 минут на внесение единственного изменения в транзакцию, принадлежащую заголовку блока, расположенного 20 блоками ниже текущей головы структуры. Значительные накладные расходы на вычисления должны удержать узлы от попыток изменения структуры данных блокчейна.
Неизменяемость структуры данных блокчейна зависит от накладных расходов на вычисления, создаваемых хэш-головоломкой. Сложность хэш-головоломок определяет объем вычислений, следовательно, время, необходимое для их решения, которое, в свою очередь, определяет неизменяемость структуры данных блокчейна. Если уровень сложности слишком низкий, то вычислительные накладные расходы при изменении структуры данных блокчейна уменьшаются и, возможно, перестают быть фактором, удерживающим узлы от попыток изменения хронологии данных транзакций. С другой стороны, если уровень сложности слишком высокий, то накладные расходы даже на добавление нового блока могут стать непомерно большими, и это становится препятствием для добавления данных новой транзакции. Таким образом, главной задачей при проектировании блокчейн-системы является определение правильного уровня сложности хэш-головоломок. Эта задача становится еще более важной с учетом постоянного роста вычислительных мощностей компьютеров как следствия технического прогресса. Вероятно, уровень сложности должен определяться динамически.
Блокчейн-приложения в реальном мире редко используют постоянный уровень сложности для всех блоков. Вместо этого обычно применяется динамически изменяемый уровень сложности, основанный на скорости, с которой добавляются новые блоки [27, 39]. Это гарантирует, что время, необходимое для решения хэш-головоломки, остается на уровне, препятствующем изменению хронологии данных транзакций, тогда как действительные затраты на вычисления могут увеличиваться.
В этой главе рассматривалась методика, применяемая блокчейном для защиты хронологии данных транзакций от изменений и подделок посредством превращения структуры данных блокчейна в хранилище неизменяемых данных, в которое можно только добавлять новые блоки. В следующей главе основное внимание будет уделено тому, как сделать это хранилище данных общедоступным в распределенной пиринговой системе.
• Блокчейн защищает хронологию данных транзакций от изменений и подделок, сохраняя данные транзакций в неизменяемом хранилище.
• Неизменяемость хронологии транзакций реализуется на основе двух идей:
– хранение данных транзакций в чувствительной к изменениям структуре данных блокчейна, в которой при любых изменениях требуется перезапись данных структуры, начиная с места внесения изменений и заканчивая головой всей цепочки в целом;
– обязательное требование решения хэш-головоломки для записи, перезаписи или добавления каждого отдельного заголовка блока в структуру данных блокчейна.
• Хэш-головоломка является единственной в своем роде для каждого заголовка блока, потому что зависит от его уникального содержимого.
• Необходимость перезаписи структуры данных блокчейна при ее изменении и значительные накладные расходы, связанные с этим, создают существенные трудности в изменении хронологии данных транзакций.
• Обязательность решения хэш-головоломки для каждой операции записи, перезаписи или добавления заголовков блоков в структуре данных блокчейна превращает ее в хранилище с возможностью только добавления данных.
• Заголовок блока содержит как минимум следующие данные:
– хэш-ссылка на заголовок предыдущего блока;
– корень дерева Меркле, содержащего данные транзакции;
– уровень сложности хэш-головоломки;
– время начала решения хэш-головоломки;
– одноразовый случайный код (nonce), который решает данную хэш-головоломку.