Продолжаем наш рассказ о криптовалютах

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Продолжаем наш рассказ о криптовалютах. В прошлой заметке мы рассмотрели идею системы блокчейн. Сегодня мы несколько её дополним.

Итак, мы поставили задачу: защитить от подделки содержимое записной книжки. Центральной идеей была связь всех её страниц в последовательность, изменение одного из элементов которой влекло бы за собой изменение всех последующих. Этого удалось добиться, вычисляя тем или иным способом некоторую числовую характеристику каждой исписанной страницы и занося результат расчетов в заголовок следующей страницы. Таким образом, единичная подделка в общем случае вызовет необходимость сплошной фальсификации почти всей книжки, что довольно затруднительно. В общем случае блокчейн состоит из вполне определенных объемов информации – блоков и из способа их связи. В начало последующего блока вносится определенное число – полученная по одному из существующих алгоритмов хэш-сумма предыдущего блока. Таким образом достигается связность всей цепи блоков и гарантируется подлинность данных.

Поставим теперь задачу сделать построенное нами защищенное хранилище информации публичным. Отныне каждый должен иметь возможность добавлять данные в заполняемый блок и знать всю информацию, содержащуюся в сети. Первый шаг в этом направлении – дать каждому участнику системы копию всей последовательности блоков. Это несколько ресурсозатратный, но наиболее простой и надежный способ сделать блокчейн общедоступным – просто-напросто растиражировать его среди всех пользователей сети.

Возникает естественный вопрос: нельзя ли упростить жизнь абонентам системы тем, чтобы поместить весь блокчейн в центральное хранилище и предоставить пользователем возможность удаленного к нему доступа? Технически при наличии современных средств связи это осуществимо. Однако используемый в реальной практике блокчейн децентрализован. Дело в том, что, поручая какому-либо хранилищу функцию по поддержанию системы блокчейн и превращая её в централизованную структуру, мы рискуем заполучить две проблемы. Во-первых, существенно снижается отказоустойчивость сети. В случае сбоя в хранилище она станет недоступна сразу всем её пользователям, а информация может быть переписана или утрачена. Во-вторых, наличие управляющего элемента в системе порождает неустранимое неравенство и незащищенность рядовых абонентов. Центральный орган такой системы может безнаказанно фальсифицировать новые записи, хотя старые переделать в своих интересах ему будет сложно в силу самих защитных механизмов блокчейна. Эти недостатки концентрации всей системы слишком тяжелы. Поэтому в дальнейшем будем предполагать, что реализуется распределенная модель, в которой каждый участник имеет полную копию всей цепи блоков.

Второй шаг в развитии публичного блокчейна – выяснить, как будут вноситься новые записи во все существующие блоки. Ведь в случае децентрализованной сети сколько пользователей, столько копий всего блокчейна. Каждый при появлении новой записи в системе должен внести ее в свою копию последнего блока. Будем считать, что все абоненты связаны тем или иным способом: по интернету, по телефонным линиям или по радиосвязи – выбор физической стороны способа связи несуществен. Пусть один из пользователей – назовем его А – решил внести новую запись в блокчейн. Добавить её в имеющуюся у А копию системы не составит труда. Необходимо же, чтобы эта новая запись оказалась у каждого из абонентов. Если А разошлет новую запись по каналам связи каждому из пользователей сети, то у принимающей стороны – пользователя Б – возникнет два закономерных вопроса. Вопрос первый: является ли А автором новой записи? Вполне возможно, что используемые А и Б механизмы связи оказались атакованы злоумышленником, вещающим в сеть от имени А. Это нужно совершенно исключить. Вопрос второй: не пытается ли А всех обмануть поодиночке? Может случиться, что А находит для себя выгодным сообщить пользователю Б что-то одно, пользователю В другое и так далее. Нужно добиться того, чтобы подобный массовый обман был неосуществим. Как же устранить обе эти уязвимости?

Первым делом добьемся того, чтобы от имени А новые записи рассылал исключительно А. Технология, позволяющая спасти систему от подлога, называется цифровой подписью. Этот способ подтверждения личности используется в наши дни очень широко, заметно шире, чем блокчейн. Значительная часть крупных компаний, и в том числе «Росатом», дают официальные ответы на обращения граждан, подписанные цифровой подписью. Ядром цифровой подписи служит та или иная хэш-функция. Мы уже сталкивались с упоминанием хэш-функций в предыдущем выпуске, где было сказано, что их использование – путь к повышению стойкости системы блокчейн.

Однако в алгоритмах цифровой подписи используются хэш-функции с лазейкой. Ясно, что обыкновенной хэш-функцией можно только зашифровать что-либо. Восстановить результат хэширования практически, кроме как перебором, невозможно в силу самого определения односторонней хэш-функции. Такие алгоритмы очень хороши для использования в формировании цепи блоков в системе блокчейн. Но сейчас нам требуется несколько более широкий функционал. Цифровая подпись должна уметь не только подписывать данные, но и быть проверяемой. Поэтому подписывание некоторого объема информации – а применить эту технологию можно совершенно к чему угодно – осуществляется в три этапа. На первом этапе создается пара ключей – закрытый и открытый. Оба ключа – некоторые строки, обычно не несущие для человека ясного смысла. Закрытый ключ автор подписи должен хранить в тайне. Открытый ключ он рассылает всем пользователям сети. На втором этапе вычисляется хэш-функция от подписываемых данных и закрытого ключа. То есть её аргументами служат и информация, и закрытый ключ одновременно. Результат хэширования – он и называется подписью - встраивается в сообщение, которое затем рассылается пользователям сети. На третьем этапе осуществляется проверка подлинности подписанных данных. Для выполнения этой проверки существует функция, принимающая три аргумента: подписанные данные, саму подпись и открытый ключ. Эта функция способна вернуть лишь два значения: «истина» и «ложь». В том случае, если получено значение «истина», сообщение будет признано подлинным. Любая подмена содержимого сообщения или попытка подписать его неверным секретным ключом будет обнаружена при проверке. Верифицирующая функция вернет значение «ложь». Возможность построения такой функции обеспечена наличием у используемой хэш-функции «лазейки». В случае её отсутствия такая функция могла бы быть реализована только как алгоритм прямого перебора, что совершенно лишено практического смысла. Теперь абонент А будет рассылать сообщения по системе, подписанные с помощью имеющегося только у него секретного ключа. Пользователь Б, желая удостовериться в том, что от имени А действует точно А, подставит полученные данные, саму подпись и открытый ключ в функцию верификации и незамедлительно получит результат – либо он имеет дело с правдой, либо с обманом. Если на месте А оказался действительно А, то новая информация будет включена Б в его собственную копию системы.

Итак, первая проблема массового блокчейна решена. Во избежание обмана злоумышленником, выдающим себя за кого-то из пользователей сети, мы станем использовать цифровую подпись. Однако нужно предотвратить также попытки обмана со стороны самого А. Это – вторая важнейшая задача, решение которой необходимо для построения надежной системы. Возможный обман состоит в том, что пользователю Б А направит одну информацию, а пользователю В – другую. То есть вместо того, чтобы честно вещать во всю сеть, А скроет от Б то, что сообщил В, и от В то, что сообщил Б. В этом А может найти для себя определенную выгоду. Особенно заметно это в случае записи в блокчейн платежей. В самом деле, если А расплатится с Б одной криптовалютной монетой, но никому об этом не скажет, то В и другие пользователи будут убеждены в том, что А этой монетой по-прежнему располагает. Точнее говоря, такой вывод они сделают из записей в своих копиях блокчейна. Ведь А ничего им не сообщал о своей трате! Возникает угроза двойного расходования.

Необходимость закрывать блоки хэшированием устраняет этот изъян. Как мы помним из предыдущего выпуска, вычисление хэшей можно сделать весьма трудозатратным даже для компьютера. Источником трудоемкости служат односторонние хэш-функции. В примере из прошлого выпуска мы искали множитель, произведение которого на числовую характеристику страницы книжки давало результат с пятью единицами в начале. В этом алгоритме искомый множитель – это хэш, а его нахождением обеспечивалась подлинность заполненной страницы. В реальных блокчейнах эксплуатируются существенно более сложные хэш-функции, чем из нашего примера, но принцип работы остается тот же. Их отличительным свойством служит их односторонность. Имея содержимое блока невозможно быстро найти хэш, удовлетворяющий поставленному условию. Только перебором можно отыскать подходящее выражение. Однако имея хэш, соответствующий некоторой странице, можно проверить её подлинность однократным применением хэш-функции. Это выполняется на современных машинах мгновенно.

Предположим теперь, что А оказался обманщиком. Он сообщил что-то Б и больше никому. Теперь копии блокчейна, хранящиеся у А и Б, содержат запись, которой нет больше ни у кого из пользователей сети. Пройдет некторое время, и блок с поддельной записью потребуется закрыть – найти его хэш. Этим займутся не только А и Б, но и другие участники сети. Ясно, что результат подбора хэша будет один у А и Б и другой у всех остальных, ведь обрабатываемые блоки отличаются на одну запись. Поскольку сам блок входит как аргумент в хэш-функцию, результат хэширования будет разниться. А и Б запишут себе в заголовок следующего блока один хэш, а все остальные пользователи – другой. Это отличие неустранимо. Теперь копии блокчейна у А и Б отличаются от копий, хранимых всеми остальными. Долго такое расщепление системы существовать не должно. Всем участникам предстоит выбрать, кто же прав: А и Б со своей версией истории системы или все остальные. Дело решит длина цепочек. А и Б обсчитывают блоки со скоростью, в общем случае меньшей, чем вся остальная сеть. Поэтому им, оттолкнувшись от поддельных блоков, суждено построить более короткую цепочку блоков, чем прочим участникам. Рано или поздно они отстанут настолько, что система автоматически признает их более короткую цепочку неправильной и разошлет самому А и обманутому Б верную версию блокчейна, в которой нет места махинациям А.

Можно сказать, что такой способ подтверждения блоков является цифровым аналогом демократии. Если сеть – то есть большинство – решит путем более быстрого подсчета хэшей, что история блокчейна от А неправильная, то так и будет. Доказательство подлинности, которое было описано, называется proof-of-work или доказательство работы. Вкратце его описание можно сформулировать так: кто успел, тот и съел. Кому удастся быстрее других строить цепочку блоков, тот и прав. Чем больше пользователей работают над закрытием одного блока, тем выше вероятность нахождения хэша. Значит, тем быстрее будет продолжена правильная цепочка – ведь правильной цепочку признает большинство. Этот механизм решает вторую проблему публичного блокчейна и обеспечивает системе функционирование в среде с нулевым доверием. Система никому не верит, кроме вычислительных мощностей большинства пользователей. Эта невиданная надежность блокчейна с доказательством работы обеспечивает практически полную защищенность хранимой в нем информации. По этой причине все описанные методы широко применяются в криптовалютах. Об одном любопытном её применении я расскажу в следующей заметке.

Комментарии: