Пару дней назад на инфостарте появилась новость о том, выборы в мосгордуму пройдут с применением блокчейна. При этом в статье данные выборы описывались как "прозрачные". И сама статья, и разгоревшиеся под ней жаркие комментарии, показали, что многие даже технические специалисты до сих пор не понимают, что это за такой блокчейн, зачем он нужен, что в нём такого, что его теперь везде пытаются внедрить.
Сразу спешу успокоить читателя — данная статья не будет посвящена теоретическим выкладкам о том, что такое блокчейн. Благо таких статей — воз и маленькая тележка. Наоборот, я постараюсь как можно более абстрактно рассмотреть блокчейн вообще и как средство реализации прозрачных выборов в частности. Потому что здесь и наблюдается просадка в понимании у многих пользователей — вроде как понятно, что такое блокчейн, но зачем он, что с ним делать, где его применять и, ещё важнее, где его применять не надо — почему-то до сих пор непонятно многим.
В двух словах, что такое блокчейн
Блокчейн — это просто способ работы с базой данных. Всё. Чем этот способ отличается от обычного — "записал строку/прочитал строку"? Тем, что строка 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% и может быть совершенно приемлимым.
Опять подведём итоги
- Для базы с одним владельцем блокчейн как средство проверки без доверия теряет смысл.
- Блокчейн — не волшебное средство для проверки без доверия. Его результаты также можно подделать, если большинство владельцев копии базы сговорится (или если большинство копий базы окажется в руках одного пользователя).
- Чем больше владельцев базы-блокчейна, тем меньше шанс сговора и подделки.
С основами блокчейна разобрались, в следующей статье посмотрим на применение его как средства решения задач.
Спсб за понятное разъяснение.
.
«Получается, если база внутренняя, с санкционированным доступом ограниченного количества ответственных лиц, то блокчейн для проверки изменения базы тоже не нужен, в том числе и как защита от несанкционированного доступа.»
— здесь понимается, что если есть несанкционированный доступ — то злоумышленник может подменить/модифицировать данные, в т.ч. и переформировать хеши.
— но ведь можно «сделать» так чтобы вычисление хеша было достаточно ресурсоемким, тогда пересчет множества хешей за приемлемое время (а ресурс у лоумышленника ограничен) будет проблемным…?
.
опять же — если мы в текущий момент времени не можем сразу сказать изменилось что-то где-то раньше в цепочке — то смысл всей цепочки? только в том, что рано или поздно когда-то будет обнаружено что было вмешательство и блок данных, по которому стоит «неверный» хеш является «неправильным» — и все? какая с этого существенная польза в момент расчета текущего хеша? (как пример, есть блокчейн собственности на «квартиру». я, покупая «квартиру», в момент покупки (а покупака должна совершаться БЫСТРО, за отведенное время) — должен быть уверен, что я покупаю «правильную» квартиру. и еслия я не проверю всю цепочку — я не смогу этого сказать (а время проверки всей цепочки превышает отведенное время на покупку)… И — всё, приплыли..?!
.
или я неправильно все понимаю?
Вот это как-то не особо понятно
«Что если база-блокчейн будет копироваться каждым пользователем к себе на компьютер, каждая строка будет записываться в конец блокчейна, а при записи хэши будут сверяться между всеми базами? Если я удалю строку, у себя в базе — она останется у всех, если я удалю базу — она останется у всех, если я попробую перезаписать строку — все узнают, если я попробую отправить неправильный хэш, его не примут.»
— еслия пишу в базу которая у меня на компе — то все должны ждать пока я посчитаю хеш и выложу последний блок в общедоступный экземпляр..? если пишущих — много — то будут длинные исключительные «блокировки»…?
«если я удалю базу — она останется у всех» — но где-то же д.б. общедоступный экземпляр базы, который каждый «копирует» к себе на комп? и если этот общедоступный экземпляр «погибнет» — то что считать правильной базой — какой из экземпляров, при том что они могут быть разные (часть из пиплов — «злоумышленники» и подправили базу в своих интересах). Какая из баз — правильная? брать все доступные экземпляры на частных компах и вычислять минимальный совпадающий у всех отрезок от начала базы? а если база подправлена близко к началу? кто будет арбитром, чтобы принимать (?) решение какая база правильная?
(2)
Да, примерно так. На самом деле просто посчитать хэш практически ничего не стоит, если бы в этом состояла цель. Но там (снова нарушаю своё обещание не трогать реализацию, а плавать на абстракции) ещё всякие PoW обычно, т.е. хэш — это не просто хэш, а какой-нибудь хитрый хэш, чтобы вы конкурировали с другими пользователями за право сделать именно ваш блок следующим. Т.е. да — времени уходит много, в биткоине сейчас, я слышал, вообще одному компьютеру практически нереально создать блок — только целыми пулами мощных компьютеров вычисляют эти сложные хэши. Но суть примерно такая — да, работа с такими базами занимает время и в разных известных блокчейнах реализованы целые вселенные всяких хитростей для того, чтобы всё это работало приемлемо.
(1)
Это — уже тонкости реализации, в которые я обещал не вдаваться. Но принципиально — да, можно и нужно создавать механизмы защиты от таких вещей. Но не забывайте, что и у вас тоже тогда мощности будут требоваться для записи таких блоков и для периодической проверки. Ведь если сделать вычисление одного хэша за час, то да, наверное, сложно злоумышленнику пересчитать всю цепь, но и вам при каждой записи нужно будет тратить час на формирование блока. Плюс это, по сути, даёт злоумышленнику ещё больше свободы — он ведь может и не пересчитывать всё: заменил нужные данные, и забыл, вы со сложным механизмом пересчёта может только через неделю или через месяц сможете проверить, что где-то в базе было изменение. Не говоря уже о том, что злоумышленнику, наверное, и не нужно ничего прятать даже на простых хэшах — ему нужно только изменить запись, например, сделать свой счёт в банке равным миллиону долларов.
Но «бессмысленность» приватных блокчейнов применительно к тем же выборам не в этом, во второй части статьи я попытался показать на примерах. Соответственно, даже без этой проблемы они теряют свой смысл. Честно говоря, я слабо представляю ситуацию, где можно было бы применить приватный блокчейн.
(1)
Именно приплыли — вы всё правильно поняли) В том же биткоине, если вы когда-нибудь пользовались обменниками, то вы им перечисляете биткоины, а они вам деньги слать не торопятся — потому что ждут подтверждения от множества узлов о том, что ваша транзакция попала в правильный блок и блок не отвергнут сетью. Т.е. да, приходится ждать, пока не будет проверена вся цепь от начала времён. Уже от разработчика зависит — как долго это всё будет происходить. Теоретически, наверное, можно придумать какие-то «индексы», но я бы в правильную техническую реализацию какого-то большого блокчейна не лез без как минимум докторской степени.
(3)
Это опять же зависит от реализации. Но для настоящего публичного распределённого блокчейна какая-то эталонная база, наверное, будет противоречить самому принципу. Ведь ею кто-то владеет, а это уже получается приватный блокчейн. Эталонной базой будет консенсус — подтверждённая большинством копий совокупность данных. Т.е. по какому-то алгоритму вы соединяетесь с одним узлом, берёте оттуда копию, дальше соединяетесь с другими узлами и сверяете вашу копию. Как торрент. Но, повторюсь — блокчейн — это просто способ работы с БД. А уже прикладные детали реализации могут быть очень разными.
(3) дочитал до конца, вроде этот вопрос ок.
Ваши ошибки относительно приватного блокчейна.
1. Он не дает существенной дополнительной нагрузки на базу. Потому что база сама по себе, а блокчейн сам по себе. Он физически может вестись в другой базе.
2. Блокчейн прекрасно работает в ситуации, когда требуется менять уже введенные документы. Запись о таком изменении точно так же попадает в блокчейн. Тут нет ничего особенного.
Ваш вывод о бесполезности приватного блокчейна — неверен. Также неверно противопоставление распределенного блокчейна и приватного. Они оба полезны. Но для разных случаев. Для криптовалюты нужен распределенный. Для доверия достаточно приватного.
(8)Михаил, я вас давно жду)) Вы в самой новости поучаствовали в спорах на 200 комментариев, так и не приведя ни одного аргумента, теперь и сюда перебрались)) И вот теперь здесь вы пишете глубокомысленные:
(8)
, опять не приведя никаких доказательств. Особенно смешно то, вы спорите с тем, чего я не говорил — что приватный блокчейн бесполезен в принципе, я привёл разобранный аргументированный пример только того, что приватный блокчейн бесполезен в выборах, в результате которых заинтересован владелец базы. В остальном использовать приватный блокчейн или нет — дело каждого, если он вам нужен, то используйте, не нужен — не используйте. Само по себе владение блокчейном уже убивает доверие и вы так и не смогли ничего привести в противовес. Но если доверие обеспечивается какими-то внешними инструментами, или если все участники согласны с тем, что есть какой-то владелец у блокчейна и всех это устраивает, то… ну используйте, я ж не против)
(8)
Я разве говорил о существенной нагрузке? Я говорил о том, что блокчейн требует доп. трудозатрат. На своё создание и поддержание. Также сами размеры записей базы будут больше, чем при обычном способе хранения — потому что хэши нужно где-то хранить.
Я понимаю, почему вам больно слышать укоры в адрес приватного блокчейна — вы создали блокчейн на 1С, почему-то этим гордитесь (хотя особого ума для вашего варианта не нужно) и даже кое-как пытаетесь продавать это чудо техники. Поэтому вас разражает, что всякие тут ходят и пишут, что приватный блокчейн не вызывает доверия. Но, поверьте, я ничего против вашего блокчейна не имею — если вам удастся кому-то его продать и кому-то он действительно нужен — ну здорово же, я за вас буду очень рад!
(8)
Кстати, видите, вы до сих пор так и не поняли сути блокчейна)) База сама по себе быть не может, иначе это не блокчейн, а какое-то непонятное создание. Допускаю, что теоретически можно считать хэши динамически, но вот это действительно будет сумасшедшая ненужная нагрузка по сравнению со стандартной реализацией. Это же надо постоянно бегать по всей базе и вычислять их, более того, вам ведь всё равно нужно где-то хранить уже вычисленные хэши, чтобы данные не поменяли. И только для того, чтобы не записывать хэши вместе с данными? А зачем?
Так что, как и прежде, я крайне рекомендую вам разобраться в работе блокчейна и вообще в том, что это такое. Потому что, насколько я понял, вы смастерили какую-то обработку на 1С и решили, что вы — мастер блокчейнов)) И теперь не хотите больше ничего понимать. А понимать вам ещё много, насколько я вижу по вашим комментариям.
(10) Можно хранить в отдельной базе ИД документов и хэши. Вот вам и будет «база сама по себе, а блокчейн сам по себе».
(11)
И велосипед, который будет постоянно ходить по базе и пересчитывать хэши?)
У меня такой вопрос. Допустим база существует несколько лет и я новый участник. Скачал и обновил базу с нескольких узлов. Теперь я должен на своем компе хранить все это добро и стать узлом базы? Обычный пользовательский ПК потянет такую базу?
(12) А в чем проблема? Пользователи постоянно ходят по базе и чего-там считывают. У вас появляется еще один пользователь (очень скормный, потому что он ничего не пишет в базу). Вот и вся дополнительная нагрузка.
(13)
Да, так и есть. Например, даже если вы скачаете клиент того же лайткоина (форк биткоина) и скачаете себе его клиент, то он вам закачает на комп всю базу за все годы существования. И пользоваться им вы сможете только пока у вас лежит вся база. Комп тянет, но скачать нужно десятки Гб.
Сейчас уже появились всякие шлюзы, т.е. сайт в интернете, который хранит эту базу за вас, а вам предоставляет только окошко пользователя. Но тут уже вступает пример из приватного блокчейна — т.е. вам нужно доверять этому сайту, потому что проверить, что он там делает вообще и с вашими ключами доступа в частности, никто не знает.
(14)
Михаил)) Я вам в который раз предлагаю разобраться с работой блокчейна)) Вам ведь не только я говорю, что вы совершенно безграмотны в этой сфере. Не верить одному человеку — это ладно, но когда вам целый хор говорит, что вы мелете чушь… я бы прислушался. Устал вам что-то доказывать, если хотите — сами смоделируйте ситуацию, когда ваш велосипед может обмануть пользователей, или сам себя, или владелец базы может обмануть этот велосипед (если он снаружи) или с помощью этого велосипеда обмануть пользователей. Повторю то, что говорят вам уже неделю — вы так ничего и не поняли. И, видимо, уже и не поймёте. Удачи в продажах велосипеда)) Не удивляйтесь, если они будут идти плохо))
(13)
Именно поэтому выгода от владения копией базы должна быть обязательно. Иначе пользователи просто не будут этим геморроем заниматься.
(16) С работой блокчейна вообще, и в приложении к криптовалютам, я знаком. И познакомился с ней задолго до того, как реализовал приватный блокчейн на 1С. И, по видимому, значительно раньше вас. На чем основано ваше стремление отправить меня учиться? Вы думаете, что в области блокчейна я не знаю чего-то, что знаете вы? Почему вы так решили?
(17) Спасибо за ответ. Во второй части статьи самостоятельно нашел его ))
(17) Сам почему-то не дошел до этой мысли, а в прочитанных ранее статьях это как-то особенно не выделялось, хотя и было написано.