Пару дней назад на инфостарте появилась новость о том, выборы в мосгордуму пройдут с применением блокчейна. При этом в статье данные выборы описывались как "прозрачные". И сама статья, и разгоревшиеся под ней жаркие комментарии, показали, что многие даже технические специалисты до сих пор не понимают, что это за такой блокчейн, зачем он нужен, что в нём такого, что его теперь везде пытаются внедрить.
Сразу спешу успокоить читателя - данная статья не будет посвящена теоретическим выкладкам о том, что такое блокчейн. Благо таких статей - воз и маленькая тележка. Наоборот, я постараюсь как можно более абстрактно рассмотреть блокчейн вообще и как средство реализации прозрачных выборов в частности. Потому что здесь и наблюдается просадка в понимании у многих пользователей - вроде как понятно, что такое блокчейн, но зачем он, что с ним делать, где его применять и, ещё важнее, где его применять не надо - почему-то до сих пор непонятно многим.
Блокчейн - это просто способ работы с базой данных. Всё. Чем этот способ отличается от обычного - "записал строку/прочитал строку"? Тем, что строка 2 содержит информацию о строке 1, строка 3 - о строке 2 и так далее. Т.е. каждая последующая строка содержит информацию о предыдущей. Получается цепь блоков (блокчейн по-английски).
Какую же информацию содержит строка 3 о строке 2? Какую угодно. Программист, который реализует блокчейн сам определяет какую. Ну как вариант - хэш предыдущей строки.
Что такое хэш? Это такая функция, которая берёт строку 2, что-то с ней делает и на выходе получает что-то другое. Что делает? Да что угодно, опять же, это решает программист. Есть только одно условие - чтобы из одних и тех же данных всегда получался одинаковый результат.
Зачем это нужно? Ну, например, для того, чтобы проверить - вносились ли какие-то изменения в базу. Ведь если изменения строки Х будут видны в строке Х+1, или ещё лучше, если они будут видны во всех строках, которые идут после Х - будет очень сложно что-то изменить в базе без того, чтобы пользователи это заметили.
Хэш-функция возвращает просто переданные данные, никак не преобразовывая.
Блокчейн формируется прибавлением хэша справа от данных.
Получаем такую цепочку блоков:
Вася
ПетяВася
КоляПетяВася
Будет ли такая реализация блокчейном? Да, будет. Очень неэффективным, но тем не менее.
Как улучшить такую реализацию? Мы же видим, что база будет пухнуть, если каждая строка будет содержать всю базу до неё.
Ну например, так:
Вася
ПетяВася
КоляПетя
Да, так хорошо. Хотя нет.
Во-первых, всё-таки изменения строки Х видны только в строке Х + 1, а не во всех строках, больше Х. Во-вторых, что если это какая-то открытая база, например, база транзакций банка. В ней имя пользователя, номер счёта и сумма, которую списали-начислили. При этом пользователь должен иметь доступ к своим строкам, но, понятное дело, будет не очень хорошо, если он сможет прочитать и предыдущую, чужую строку. Надо бы как-то сделать так, чтобы и предыдущую строку не видно было, и чтобы с другой стороны, администратору, проверяя всю базу, можно было понять, что строка не менялась.
Хорошо, давайте попробуем использовать существующие хэш-функции. Их предостаточно, вот только небольшой списочек из Википедии:
Adler-32, CRC, Контрольная сумма Флетчера, FNV, MurmurHash2, MurmurHash2A, MurmurHash3, PJW-32, TTH-Дерево хешей, Jenkins hash, Хеш-сумма, CubeHash, BLAKE, BMW, ECHO, Edonkey2k, FSB, Fugue, Grøstl, JH, Hamsi, HAVAL, Keccak (SHA-3), Kupyna, LM-хеш, Luffa, MD2, MD4, MD5, MD6, N-Hash, RIPEMD-128, RIPEMD-160, RIPEMD-256, RIPEMD-320, SHA-1, SHA-2, SHABAL, SHAvite-3, SIMD, Skein, Snefru, SWIFFT, Tiger, Whirlpool, ГОСТ Р 34.11-94, ГОСТ Р 34.11-2012 (Стрибог)
При этом у многих из них есть такое замечательное свойство, как необратимость. То есть если мы возьмём одно и то же значение ("Вася") и пропустим его через такую функцию несколько раз, то всегда на выходе получим одинаковый результат, но при этом, имея результат, мы не сможем понять, что было на входе! Выходит, даже не зная, какое значение передал пользователь, мы уже можем понять, одинаковое ли значение он передал нам второй раз или нет, пользуясь только хэшем. Вот как, сразу двух зайцев поймали - и уникальность ключа, и надёжное шифрование данных.
Применим, например, хэш-функцию MD5. Вот тут https://www.xorbin.com/tools/md5-hash-calculator да и в миллионе других мест можно даже посмотреть онлайн-калькулятор MD5 и многих других хэш-функций.
Что теперь с нашим блокчейном?
Вася
Петяdc084ef00e94aef49be885f9b01f51c0
Коля38fffdfd623643eba6401fa85f76cc9f
Уже лучше! Теперь он гораздо более похож на блокчейны, которые используются во всём мире.
Итак, что такое блокчейн?
Это такой способ работы с базой данных, когда по любому из блоков (строк) мы можем проверить, что предыдущая строка не менялась, но при этом мы не можем узнать, что было в предыдущей строке.
Какие минусы у блокчейна:
- Нужно заморочиться и написать код, который будет не просто записывать, а ещё и производить манипуляции со строками, что потребует трудозатрат и скажется на производительности.
- Нужно реализовать хэш-функцию - ещё трудозатраты и ещё отъедание производительности.
- База будет больше, чем обычная база, потому что каждая строка содержит дополнительные служебные данные.
Какие плюсы у блокчейна, или проще говоря, почему мы готовы терпеть минусы:
- Последовательно пройдя от конечного блока к начальному (или наоборот), вычисляя хэш и сравнивая с хэшем в базе, мы можем понять, менялось ли что-то в базе или нет.
- При этом, имея доступ только к одной строке, мы не можем узнать, что в других строках.
Какие выводы мы уже можем сделать?
Ну, например, мы уже понимаем, что если нам не нужно проверять, вносил ли кто-то изменения в базу, то блокчейн нам не нужен.
Также мы понимаем, что блокчейн - это билет в один конец. То есть если у нас в базе строки могут меняться, то блокчейн нам тоже не нужен. Например, мы можем сделать обычное проведение документов на блокчейне, но это будет бессмысленно.
С другой стороны блокчейн, при качественной реализации, позволяет однозначно убедиться, что строки не менялись. Ведь если зайти в строку 50, поменять там данные, то хэш в строке 51 будет другой. И в строке 100. И в строке 100500. Во всех строках, начиная с 51. Если задача состоит в том, чтобы выявить факт вмешательства, то блокчейн - отличное решение. Ведь если поменяли строку 50, то нужно переформировать все хэши всех строк от 51 до конца базы! А если админ на бумажечке записал хэш строки 100500? Тогда нужно ещё и бумажечку переделать, да так, чтобы админ не заметил! Шансы несанкционированного изменения базы без того, чтобы админ узнал, стремятся к нулю.
Ещё один важный вывод - никакого волшебства в блокчейне нет, это громоздкая штука с ограниченным кругом решаемых задач. Вывод вроде очевидный, но, как показывают новости, далеко не для всех. А многие, видимо, сознательно этот вывод обходят стороной.
Можно сделать и ещё один вывод. В примере с банком остался какой-то привкус... бессмысленности что ли. Зачем банку проверять строки на изменённость в своей собственной базе? Кто мог их там поменять, кроме самого банка? Хакеры? Но хакеры же могут и хэши переформировать. Получается, банку этот блокчейн и не к чему, если он реализован на внутренней базе. Получается, если база внутренняя, с санкционированным доступом ограниченного количества ответственных лиц, то блокчейн для проверки изменения базы тоже не нужен, в том числе и как защита от несанкционированного доступа.
И что, выходит, что блокчейн вообще не нужен? Где это видано, чтобы базы были общественные? Они всегда кому-то принадлежат, а раз блокчейн не нужен на внутренней (принадлежащей кому-то) базе, то он не нужен вообще?
Да, получается, так. Но если задуматься, то ведь общественные базы как раз и не распространены потому что как можно в общественной базе работать? Ведь если каждый пользователь - админ, то это же хаос! Захочу - удалю строку, захочу - перепишу, захочу - удалю базу! Или свою создам, какую надо.
Ответом на этот хаос как раз и стал блокчейн.
Что если база-блокчейн будет копироваться каждым пользователем к себе на компьютер, каждая строка будет записываться в конец блокчейна, а при записи хэши будут сверяться между всеми базами? Если я удалю строку, у себя в базе - она останется у всех, если я удалю базу - она останется у всех, если я попробую перезаписать строку - все узнают, если я попробую отправить неправильный хэш, его не примут.
Гениально! Теперь можно создавать общественные базы, неподконтрольные никому, более того, можно (и нужно!) не доверять никому в сети, но при этом иметь чёткое подтверждение правильности и неизменности базы!
Так, стоп. Но кто-то же должен эту базу создать? Ок, я создал. Пока что я один пользователь базы. Получается, я сейчас могу сделать с ней что захочу - ведь нет никого, кто мог бы меня проверить.
Ладно, прикрутим блокчейн к жизни - мы тут с коллегами в танки играем, кто меньше всех настреляет к пятнице, тот ставит пиво. Вот как раз и сделаем базу учёта очков, а чтобы не нужно было доверять друг другу, сделаем на блокчейне! Нас трое, копируем базу всем троим! Ура, работает! В среду я сказался больным, целый день играл, а очки записывал в базу. А в пятницу, когда мы синхронизировали наши базы, оказалось, что у них в пять раз больше очков, чем у меня!!! Это они, работая, столько настреляли?? Не верю! Проверил хэши - всё по-настоящему. Явно же врёт база-блокчейн! Но... блокчейн... проверка без доверия... защита от изменения...
Получилась наглядная иллюстрация особенности открытых баз на блокчейне. Оказывается, то, что можно проверить результат без доверия ещё не означает, что результат нельзя подделать! Да, проверка идёт по всем узлам, но мы ведь не можем не принять изменение, если у 99 пользователей написано, что изменение правильное, а у одного - что неправильное. Получается, в блокчейне демократия - решает большинство. То есть если 51% что-то одобрил, это что-то принимается, отверг - отклоняется. И выходит, если большинство вступает в сговор, то база развивается так, как нужно большинству. В случае с тремя пользователями если двое сговорились, третий уже ничего не решает.
Таким образом мы наглядно увидели очень важное свойство блокчейна в открытой базе. Доверять его результатам тем проще, чем больше владельцев копии этой базы (пользователей-админов). Или иными словами - чем меньше шанс на сговор большинства. Двоим сговориться против одного очень легко. Девятерым против восьмерых - сложнее, миллиону против 999999 - практически невозможно (но всё ещё возможно теоретически!). Выходит, 100% доверия к блокчейну может быть только если пользователь-админ один. Он - всегда 100% большинства и сговориться сам против себя не может, поэтому любой результат - это правильный результат. Именно поэтому использовать блокчейн как средство проверки без доверия для базы с одним владельцем (как в примере с банком) бессмысленно. При количестве же пользователей больше одного 100% доверия не может быть ни при каком количестве, но при этом, чем больше количество пользователей, тем больше доверия к такому блокчейну. При достаточно большом количестве пользователей доверие стремится к 100% и может быть совершенно приемлимым.
- Для базы с одним владельцем блокчейн как средство проверки без доверия теряет смысл.
- Блокчейн - не волшебное средство для проверки без доверия. Его результаты также можно подделать, если большинство владельцев копии базы сговорится (или если большинство копий базы окажется в руках одного пользователя).
- Чем больше владельцев базы-блокчейна, тем меньше шанс сговора и подделки.
С основами блокчейна разобрались, в следующей статье посмотрим на применение его как средства решения задач.