Блокчейн

Большинство моих ЖЖ-друзей, наверное, в курсе, что это, и как это работает. Но вдруг кто не знает или не понимает.

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

Если два эксперта проведут дактилоскопирование одного и того же человека, они получат (во всяком случае, должны) одинаковый результат. Так и с компьютерами — если два человека будут использовать один и тот же алгоритм хеширования на одном и том же наборе данных, они должны получить один и тот же хеш. То-есть, если у тебя есть кусок текста, и у меня есть кусок текста, мы его хешируем одним и тем же алгоритмом, и у нас получается одинаковый хеш — это значит, что куски текста, которые мы анализировали, 100% идентичны (1).

Теперь построим свой собственный примитивный блокчейн. Блокчейн — это block chain, т.е. цепь из блоков. Каждым блоком внутри нашей цепи будут 5 кусков текста, разделённых запятыми: хеш предыдущего блока, три куска “полезной нагрузки”, и хеш для этого блока. Хранить в блокчейне можно любые данные, но допустим у нас будет хранится информация о финансовых транзакциях. Использовать будем алгоритм хеширования MD5 (2)

Построим первый блок. Так как это начальный блок в цепи блоков, у него не может быть хеша предыдущего блока. Ну и плевать, придумаем свой. abcdefghijklmopqrstuvwxyz1234567 — вполне сгодится. Далее указываем транзакцию, кто кому заплатил, и сколько: Маша,Олег,5 рублей. И хешируем всё это вместе:

md5sum <<< "abcdefghijklmopqrstuvwxyz1234567,Маша,Олег,5 рублей", получаем хеш a61d142c8be7fac8b41da05d11c9f76e.

Всё, вот первый блок в нашем блокчейне:

abcdefghijklmopqrstuvwxyz1234567,Маша,Олег,5 рублей,a61d142c8be7fac8b41da05d11c9f76e

Строим второй блок, где Серёжа заплатил Тане 3 рубля:

md5sum <<< "a61d142c8be7fac8b41da05d11c9f76e,Серёжа,Таня,3 рубля", получаем хеш 20e22c43963d6ee9bbc71d65c4251492, и, соответственно, блок:

a61d142c8be7fac8b41da05d11c9f76e,Серёжа,Таня,3 рубля,20e22c43963d6ee9bbc71d65c4251492

И теперь наш блокчейн выглядит так:

abcdefghijklmopqrstuvwxyz1234567,Маша,Олег,5 рублей,a61d142c8be7fac8b41da05d11c9f76e
a61d142c8be7fac8b41da05d11c9f76e,Серёжа,Таня,3 рубля,20e22c43963d6ee9bbc71d65c4251492

Ну, и так далее, блоков можно добавлять до окончания места на жёстком диске.

Чем это круто? Тем, что блокчейн лежит в свободном доступе, и ЛЮБОЙ человек, взяв этот блокчейн, может собственноручно перевычислить все хеши и проверить все записи: если хеши совпадают, значит, информации можно доверять. Именно этим и занимаются майнеры — они перепроверяют транзакции для криптовалют, то-есть, обеспечивают функционирование платёжной системы, за что им отстёгивают денег.

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

1. 100% гарантии, разумеется, быть не может, но если алгоритм шифрования нормальный и не имеет коллизий (это когда два разных набора данных дают один и тот же хеш), то вероятность совпадения будет примерно 1/количество возможных хешей, т.е. для хеша длиной 128 бит это 2.94E-39, или пренебрежительно мало. Для хеша длиной 512 бит это вообще число со 150+ символами после десятичной точки.
2. Алгоритм хеширования MD5 достаточно хреновый по современным меркам, и имеет коллизии. Правда, для реально читаемого человеком текста можно пренебречь — все существующие примеры коллизий это хеши специально сгенерированных двоичных данных. Но в реально рабочих приложениях, тем не менее, рекомендуется использовать более коллизионноустойчивые алгоритмы, типа SHA-256 (используется в блокчейне для биткоина) или SHA-3.