Блокчейн: простое объяснение

Эта статья представляет шаг за шагом введение в блокчейн

Введение

Блокчейн - слово на слуху. Вы вероятно слышали его так много раз, что кажется, должны понимать, что это значит. К концу этой статьи, очень может быть, так и будет.

Изначальная сложность исходит из идеи, что нечто представленное в виде цифрового объекта может быть безопасно передано одной стороной другой стороне. Представьте, что вы хотите перевести деньги, которые лежат на счету в банке, какому-то другому человеку. Обычно это выполняется электронной транзакцией - физически деньги не передаются. Здесь все просто. Но такая транзакция подразумевает доверие банку. А возможно ли, что бы цифровой объект, хранящийся на моем компьютере и представляющий собой деньги, был безопасно передан на чужой компьютер без вовлечения банка? Да, это возможно. Однако, независимо от того, как этот электронный объект выглядит, он всегда может быть скопирован. Именно это и создает проблему известную как "двойное расходование" (double-spending) - возможность сделать оплату больше одного раза теми же самыми деньгами. Эта проблема не была решена достаточно хорошо до появления первой криптовалюты, Биткоин, в 2009.

В последующие годы появились другие криптовалюты следуя тому же принципу блокчейн, который решает проблему "двойной оплаты" без участия банка. Электронные объекты передаются от одного человека другому без возможности копирования и двойной оплаты посредством помещения однго хешчейна внутрь другого. Что такое хешчейн? Давайте сначала вспомним что такое хеш.

Хеш функции

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

Хеш-функции с таким свойством иногда называют криптографическими хеш- функциями, если необходимо их отличить от других. Такие функции переваривают биты входных данных очень запутанным способом что бы восстановление входных данных по хешу было невозможным. Наиболее известные криптографические функции это MD5, SHA1, SHA2. Пример MD5:

    MD5("abc") = 900150983cd24fb0d6963f7d28e17f72
Результатом является 128-битная строчка показанная здесь в шестнадцатеричном формате.

Если хеш результат представленный в какой-либо форме дать опять на вход хеш- функции, то получится новый хеш. Если этот процесс повторять и результаты собрать в последовательность, мы получим хешчейн.

Хешчейн

Хешчейн - это последовательность гомогенных блоков данных, попросту блоков, соединенных вместе хеш-функцией. Рисунок 1 схематично показывает простой хешчейн.

 Рисунок 1

Каждый блок состоит из хеша и пэйлоуда (payload - полезная нагрузка). Хеш каждого блока вычисляется из целого предыдущего блока. Пэйлоуд каждого блока - это произвольные данные. Такой хешчейн обладает важным свойством: данные в блоке не могут быть изменены без нарушения целостности цепочки. Например если пэйлоуд первого блока изменить, тогда нужно изменить хеш второго блока, а значит и третьего, и так далее.

Следующий шаг - разрешить только одному человеку создавать новый блок в цепочке. Одним из способов является криптография публичного ключа (PKC - Public Key Cryptography).

Криптография Публичного Ключа

Основная идея PKC такая же, как и у хеш-функций - одностороннее вычисление. Имея некоторые данные m любой может вычислить зашифрованное значение Enc(m). Но только тот, кто знает специальный ключ шифра, может сделать обратное вычисление, то есть найти m из Enc(m). Этот процесс называется раcшифрование.

Для достижения PKC нужно создать так называемую пару ключей: публичный и приватный. Публичный ключ используется для шифрования данных и может быть открыт для всех. Приватный ключ используется для расшифрования и должен быть сохранен в секрете.

Рисунок 2 схематично показывает направления вычислений. Верхняя стрелка представляет теоретическую возможность расшифрования без знания наперед приватного ключа. Например, RSA шифр основан на математическом свойстве факторизации больших чисел.

 Рисунок 2

Если кто-нибудь найдет способ факторизовать большое число (что и есть публичный ключ в RSA), тогда он сможет расшифровать данные без знания наперед приватного ключа, фактически взламывая криптографию.

Есть два сценария работы PKC. В первом сценарии одна сторона, желающая передать секретное сообщение другой стороне, шифрует это сообщение публичным ключом второй стороны. Зашифрованное сообщение может быть открыто, поскольку только вторая сторона способна читать зашифрованные сообщения закодированные их публичным ключом. Единственная уязвимость этого метода (очевидно исключая решение проблемы факторизации) заключается в знании и доверии публичному ключу изначально. Чтобы обеспечить надежность метода существует целая система иерархии публичных сертификатов, например, в протоколе https.

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

Рисунок 2 показывает первый сценарий. Во втором сценарии приватный и публичный ключи поменяны местами. Давайте проследим еще раз. Алис вычисляет хеш из документа m и шифрует этот хеш своим приватным ключом, затем публично открывает документ и зашифрованный хеш. Теперь любой может взять хеш из документа и в то же время расшифровать зашифрованный хеш используя публичный ключ Алис. Если оба значения одинаковые, это значит, что Алис в самом деле подписала документ m. Этот сценарий цифровой подписи как раз тот, который нужен для хешчейн.

Закрепление Хешчейна Криптографией Публичного Ключа

Сейчас давайте вернемся назад к вопросу возможно ли, чтобы только одному человеку было разрешено добавить блок в хешчейн. Если последний блок (Рисунок 1) содержит публичный ключ текущего владельца и цифровую подпись владельца предыдущего блока, тогда создание следующего блока потребует подпись владельца текущего блока, то есть человека который владеет приватным ключом. Текущий владелец создавая новый блок помещает туда публичный ключ нового владельца, а также свою подпись на целый блок. Так что обладателем следующего блока становится тот, кто знает приватный ключ соответствующий этому публичному ключу в новом блоке. И подпись удостоверяет, что только предыдущий владелец мог это сделать.

 Рисунок 3 (из оригинальной статьи Сатоши Накомото про Биткоин)

Рисунок 3 показывает как PKC может быть использована в хешчейн.

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

Блокчейн

Представьте, что где-то есть место (возможно в виртуальной реальности), где непрерывно протекает процесс создания новых блоков для какого-то глобального хешчейна. А также представьте, что вы можете поместить любые данные, какие только пожелаете, в пэйлоуд блоков этого глобального хешчейна. Если бы такое место и такой процесс существовали, то мы бы могли помещать блоки хешчейна представляющие ценности внутрь блоков такого глобального хешчейна. Другими словами, один хешчейн внутри другого хешчейна. Фактически, такой механизм и называется технологией блокчейн.

 Рисунок 4

Рисунок 4 показывает внешний хешчейн, в котором данные блоков содержат блоки внутренних хешчейнов. Блоки внутренних хешчейнов могут появляться хаотично во внешнем хешчейне. Конечно очевидно, что более старые внутренние блоки не могут появляться в более новых внешних блоках.

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

Социальный Стимул

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

Любой участник может создать новый блок для внешнего хешчейна включив в него опубликованные транзакции. Но это не просто. Для избежания хаоса все участники придерживаются определенного набора правил - протокола. И кто нарушает эти правила, тот игнорируется остальными. Протокол основан на трех принципах:

  1. создание нового блока требует существенных вычислительных мощностей;
  2. создание нового блока имеет награду, так что многие хотели бы потратить усилия на успешное создание нового блока; и
  3. если случится ветвление, то самая длинная ветвь побеждает.

Первое условие требует, чтобы хеш, взятый из блока с некоторым случайным модификатором, начинался с определенным количеством нулевых битов. Так что случайный модификатор подбирается до тех пор, пока в результате не будет нужное количество нулевых битов. Это требование делает создание блока трудным.

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

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

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

Так что же такое Блокчейн?

Блокчейн - это определенная организация хешчейнов внутри другого хешчейна. Внешний хешчейн должен быть основан на наборе правил, которые создают баланс между удобством использования, простотой, стимулом, доверием и полномочиями. Его предназначение - это избавление от центрального органа, который может контролироваться и быть злоупотребленным людьми. Внутренние хешчейны должны иметь механизм авторизации, чтобы можно было владеть чем-то, что представляет собой определенную ценность. Механизм авторизации не обязательно должен быть PKC. Например, Hasq хешчейн намного проще и использует только хеш-функции для механизма авторизации.