August 19, 2022

Блокчейн. Мягкое погружение. Часть 2. Блокчейн своими руками

В предыдущей статье мы познакомились с предпосылками появления блокчейна и осознали его преимущества. Чтиво было достаточно легкое. Ознакомиться с предыдущей статьей можно по ссылке ниже:

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

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

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

Криптовалюта - это то, что циркулирует в данной системе как платежная единица.

Очень грубая аналогия: Блокчейн - это сам банк, но распределенный, без головного офиса и топ-менеджмента, которым может пользоваться каждый человек на земле независимо от расы, вероисповедания, политических взглядов и *добавьте то, что считаете важным*. Нужен лишь интернет, причем не самый быстрый. А криптовалюта - это валюта, которая используется в банке для осуществления расчётов (в российском банке это рубли, доллары в США, а в блокчейне биткоина - Bitcoin.
Да, здесь есть некоторая тавтология, т.к. в большинстве случаев сам блокчейн и криптовалюта, которая в нем циркулирует, имеют одно и то же название.

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

Ну, а для тех, кто увидел для себя что-то занимательное, приступим!

И сразу предлагаю перейти к примерам, а в конце вернемся к вам с формальным определением. Теория – это, вообще, для скучных лекций в университете. На основе достаточно простых аналогий из реального мира, я покажу вам, как на самом деле работает блокчейн. Предположим, однажды вы осознали, что тратите деньги как-то неразумно, т.к. в начале месяца после зарплаты мед течет рекой, вы живете на широкую ногу и, возможно, часто одалживаете деньги людям из своего окружения. И, вроде бы, вы помните, что ваш друг Вася вам должен 2000, Лёха – 5000, а сосед по подъезду Альберт за последние несколько месяцев уже, вроде как, настрелял порядка 7-10 тысяч. Допустим, урегулирование всего этого безобразия вы начали с того, что будете записывать, сколько вы кому занимаете. Пусть вас зовут, к примеру, Герман. Вы главный герой этого повествования. Вы посидели, прикинули и пришли к выводу, что Альберт офигел в край и должен вам уже 10 000 рублей.

Это точка отсчёта вашей финансовой истории, а сам факт долга в 10 000 рублей – это запись в вашем блокноте.

Герман -> Альберт 10 000 руб.

На данном этапе здесь есть все, что вам нужно. Одна сторона, вторая сторона, сумма.

Продолжим. Альберт через некоторое время вернул 1000 рублей. Делаем новую запись.

Альберт -> Герман 1000 руб.

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

Итак, у Германа 1000 рублей, у Альберта 9000 рублей.

Но ваш сосед оказался тем ещё прохиндеем. Зная, что вы ведете такую финансовую историю, он, попав в вашу квартиру под каким-то ловким предлогом, немножко меняет последнюю запись, добавляя в конце лишний нолик:

Альберт -> Герман 10000 руб.

И с нечистой совестью уходит домой. Это один из способов как при таком способе организации информации можно было бы “рассчитаться” с долгом. Что можно было бы сделать ещё?

Да можно было бы просто добавить новую запись:

Альберт → Герман 9000 руб.

И все, долга как ни бывало.

Ценность вашей финансовой истории уже нулевая – любой может вписать, изменить любую транзакцию, а вы даже не сможете проверить, верна она или нет.

Целостность

Защитимся от этого. Как? Математикой, конечно!

Существует такая чудесная математическая функция как хеширование. Хеширование – это преобразование строки любой длины в строку фиксированной длины. Черт, опять звучу как профессор из университета. Давайте наглядно.

Берем любой текст, кидаем в хэш-функцию, а на выходе строка из мешанины букв и цифр, НО "мешанина" эта фиксированной длины

Строка:

Герман -> Альберт 2000 руб.

Хеш (результат хеширования):

40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a

Строка:

Герман -> Лев Валерьянович Лещенко 10 000 000 руб.

Хеш:

7f2c05a4eeb66ace430d087860d555bfc6d0ce2e3ddbaf0c7922ee8e6f111251

Как видно из примера, две исходные строки отличаются по длине, но вот их хэши имеют одну и ту же длину. Очень удобно. По секрету скажу: хэш можно посчитать даже от файла в 100 Гб. И результат всегда будет таким вот коротким.

Хэши имеют несколько чудесных свойств:

  1. Посчитать хэш любой строки можно за долю секунды. Посчитать исходное значение строки имея хэш – займет у вас тысячелетия. Буквально. Потому что так работает сама функция – она однонаправленная, и для нее не предполагается считать исходное значение по результату.
  2. Изменение хотя бы одного символа в исходной строке ПОЛНОСТЬЮ меняет хэш.
  3. Результат хеширования одной и той же строки всегда один и тот же (строго говоря, только у криптографических хэш-функций, коей и является функция SHA256 в биткоине)

Строка:

Герман -> Альберт 2000 руб.

Хеш (результат хеширования):

40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a

Измененная строка:

Герман -> альберт 2000 руб.

Хеш:

2888a1392da12949b9080aaf21331de789f14d854222d269ba6ff5ecedb85c98

Я поменял всего одну заглавную букву в имени Альберт на строчную. Хеш изменился вплоть до каждого символа!

Эти три замечательных свойства позволяют контролировать целостность данных. То есть факт того, что данные никто не изменял.

Однако сами по себе хэши вас не спасут – ведь про хэши знают все (или могут загуглить). Если вы просто начнете писать хэш напротив ваших строк, это, конечно, подтвердит целостность строки, но только пока злой должник не подменит и сам хэш. Или не допишет, например, новую запись и новый хеш.

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

  • Герман -> Альберт 2000 руб. = 40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a
  • Альберт -> Герман 1000 руб. + 40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a= d49f407b5aa6f80b6a2223284a2d82f46240ff5eacca903ab5ee853e2eec0ac3

Прим. в данном случае знак “+” означает не сложение как таковое, а конкатенацию. По сути просто дописывание одной строки в конец другой. Ох, сколько умных слов: хеширование, конкатенация… Пора, наверное, глоссарий заводить. Упс, еще одно слово 😅

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

  • Герман -> Альберт 2000 руб. = 40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a
  • Альберт -> Герман 2000 руб. + 40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a = 692040a862fb9d8a7112e90c91be82834bb03b9d2df5702f69acc19e8061f375

Стало сильно надежнее. Но пытливый ум Альберта может все равно сломать эту конструкцию – Альберт может также потратить время и пересчитать все хэши и заменить их значения. Ну, или просто дописать в конце новую запись, связав ее с последней.

Неужели все эти усложнения были зря? Вовсе нет! Добавим новую примочку в нашу схему. Заставим каждого, кто захочет внести запись в данную книжку, решать математическую задачу. Из минусов – вам тоже придется ее решать, чтобы внести запись. Из плюсов – Альберту придется поломать голову прежде, чем вас обмануть.

Но мы не можем ставить задачки типа "сколько будет дважды два?". Да и логарифмическое уравнение тоже не поможет, ведь хоть и Альберт плохо учился и не знает, как их решать – у него есть компьютер, а вот уж он точно легко с ними справится.

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

Найти такое число, чтобы сложив его с исходной строкой, хэш результата начинался бы с 10 нулей.

Запишем в явном виде:

Герман -> Альберт 2000 руб. + 40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a + Х =

= 0000000000aj35ch………..

Как это выглядит на практике:

Как видите, к исходной строке мы добавляем впритык хэш предыдущей записи, а в конце добавляем 1 и, собственно, хэшируем

Опа, на 6 попытку получили хэш, у которого в начале присутствует один 0

Вы уже знаете, что стоит изменить в данной строке хотя бы один символ и хэш полностью изменится. Именно это свойство и гарантирует, что для такой задачи нет никакого способа решения, кроме полного перебора. Вам нужно просто подставлять вместо Х числа в выражение до тех пор, пока итоговый хэш не начнется с 10 нулей. Как только нужное число будет найдено (оно, кстати, называется nonce) – добавляем запись в наш список.

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

Если хотите, поиграйтесь в данном калькуляторе, взяв, к примеру, свое имя и попробовав получить в начале хэша хотя бы 2 нуля. Пишите в комментариях к статье (или в нашем чате), за сколько попыток у вас вышло :)

Децентрализация

Предположим на мгновение, что записей в книжке у Германа не так много, скажем 30. А чтобы посчитать хэш нужен один мощный игровой ноутбук, который может провести поиск одного хэша за 5 мин. Итого чтобы пересчитать все записи нам нужно:

30 * 5 = 150 (мин) ~ 2.5 ч

Относительно недолго, опять же при заданных условиях. И, вроде бы, Альберт готов раствориться в ночи победителем, но не тут то было!

Оказалось, что Герман ведет учет не только своих операций, но и операций своих друзей (сейчас неважно, как они в течение дня ими обмениваются). Но вот, что действительно важно, так это то, что каждый день перед сном Герман созванивается с тремя друзьями, живущими в разных городах, и они по очереди диктуют друг другу последний хэш, чтобы удостовериться, что их бухучёт верный. В итоге, Альберт, который потратил несколько часов в ночи и, скорее всего, немало нервов (т.к. ведь могут и застукать же!) ушел, в общем-то, ни с чем. Ведь в конце следующего дня на созвоне Герман продиктует свой последний хэш и выяснится, что он неверный и его версия бухгалтерской книги отличается от версий его друзей, а это может означать лишь одно - произошла подмена. Герман сотрет или вырвет из книги пару листочков и попросить продиктовать друзей верную копию. И справедливость восторжествует!!!

Именно благодаря подобной синхронизации людей (компьютеров/узлов в сети) и решается проблема подмены операций!

Такой связанный список и действующий по вышеперечисленным правилам и называется блокчейном. А процесс вычисления nonce – это и есть тот самый майнинг. Да, сотни тысяч устройств по всему миру заняты решением вот такой простой задачи.

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

Чтобы подытожить, дадим формальное определение блокчейна:

Блокчейн (англ. Blockchain, block – блок, chain - цепочка) – распределенная база данных, которая представляет собой цепочку записей – блоков – соединенных криптографическими методами. Каждый блок хранит в себе транзакции пользователей, причем только те, которые не противоречат протоколу.

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


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

Мы всегда рады новым членам: как с опытом в сфере блокчейна и криптовалют, так и без. Присоединяйтесь к нашему сообществу, поможем, чем сможем и двинемся вместе покорять новые вершины 💪🏼

Telegram channel | Telegram Chat