Блокчейн. Мягкое погружение. Часть 2. Блокчейн своими руками
В предыдущей статье мы познакомились с предпосылками появления блокчейна и осознали его преимущества. Чтиво было достаточно легкое. Ознакомиться с предыдущей статьей можно по ссылке ниже:
Сегодня же мы разберем принцип того, как устроен блокчейн. А сделаем это на примере биткоина – первой в истории криптовалюты, работающей на основе технологии блокчейна. И не только разберем, а по сути изобретем его с нуля. Постепенно такая внешне сложная и многоступенчатая конструкция как блокчейн станет ясной и понятной, а потом вы сможете блеснуть новыми знаниями перед своими друзьями.
Биткоин, блокчейн, криптовалюта… понятия, которые часто можно слышать вместе, и все понятно до тех пор, пока не попробуешь объяснить их различия.
Блокчейн - технология, система с четко организованной структурой (блоки транзакций пользователей, которые линейно связаны между собой), порядком взаимодействия в ней (протокол) и с особым соглашением между участниками о том, как в данной системе оперировать при условии отсутствия доверия участников друг к другу (консенсус).
Криптовалюта - это то, что циркулирует в данной системе как платежная единица.
Очень грубая аналогия: Блокчейн - это сам банк, но распределенный, без головного офиса и топ-менеджмента, которым может пользоваться каждый человек на земле независимо от расы, вероисповедания, политических взглядов и *добавьте то, что считаете важным*. Нужен лишь интернет, причем не самый быстрый. А криптовалюта - это валюта, которая используется в банке для осуществления расчётов (в российском банке это рубли, доллары в США, а в блокчейне биткоина - Bitcoin.
Да, здесь есть некоторая тавтология, т.к. в большинстве случаев сам блокчейн и криптовалюта, которая в нем циркулирует, имеют одно и то же название.
Почему вам это все надо? Тут как посмотреть. Если вам не нужен полный контроль над вашими средствами (уверенность в том, что вы сможете воспользоваться вашими средствами, когда этого захотите, и что никакой банк не вмешается и не отклонит вашу транзакцию), если вас не интересует безопасность ваших средств (что никто не сможет их украсть, как, например, при взломе банка), если вас не интересует гибкость, с которой можно отправить перевод в любую точку мира с небольшой комиссией, и главное, если у вас нет желания потенциально на этом заработать, в конце концов, то тогда да, вам это не нужно.
Ну, а для тех, кто увидел для себя что-то занимательное, приступим!
И сразу предлагаю перейти к примерам, а в конце вернемся к вам с формальным определением. Теория – это, вообще, для скучных лекций в университете. На основе достаточно простых аналогий из реального мира, я покажу вам, как на самом деле работает блокчейн. Предположим, однажды вы осознали, что тратите деньги как-то неразумно, т.к. в начале месяца после зарплаты мед течет рекой, вы живете на широкую ногу и, возможно, часто одалживаете деньги людям из своего окружения. И, вроде бы, вы помните, что ваш друг Вася вам должен 2000, Лёха – 5000, а сосед по подъезду Альберт за последние несколько месяцев уже, вроде как, настрелял порядка 7-10 тысяч. Допустим, урегулирование всего этого безобразия вы начали с того, что будете записывать, сколько вы кому занимаете. Пусть вас зовут, к примеру, Герман. Вы главный герой этого повествования. Вы посидели, прикинули и пришли к выводу, что Альберт офигел в край и должен вам уже 10 000 рублей.
Это точка отсчёта вашей финансовой истории, а сам факт долга в 10 000 рублей – это запись в вашем блокноте.
На данном этапе здесь есть все, что вам нужно. Одна сторона, вторая сторона, сумма.
Продолжим. Альберт через некоторое время вернул 1000 рублей. Делаем новую запись.
Имея две такие записи можем посчитать итог. Аналогично вы могли бы подсчитать ваши взаимные обязательства, если бы в блокноте было больше записей, причем и об операциях с другими людьми. В таком случае вы бы просто прошлись по списку, посмотрели все записи вида Герман -> Альберт, сложили все числа и получили бы общую сумму вашего займа Альберту. Затем сделали бы то же самое для записей вида Альберт –> Герман и получили бы общую сумму, которую он вам отдал. Останется лишь вычесть из первой суммы вторую, и вы получите, сколько вам должен Альберт на данный момент.
Итак, у Германа 1000 рублей, у Альберта 9000 рублей.
Но ваш сосед оказался тем ещё прохиндеем. Зная, что вы ведете такую финансовую историю, он, попав в вашу квартиру под каким-то ловким предлогом, немножко меняет последнюю запись, добавляя в конце лишний нолик:
И с нечистой совестью уходит домой. Это один из способов как при таком способе организации информации можно было бы “рассчитаться” с долгом. Что можно было бы сделать ещё?
Да можно было бы просто добавить новую запись:
Ценность вашей финансовой истории уже нулевая – любой может вписать, изменить любую транзакцию, а вы даже не сможете проверить, верна она или нет.
Целостность
Защитимся от этого. Как? Математикой, конечно!
Существует такая чудесная математическая функция как хеширование. Хеширование – это преобразование строки любой длины в строку фиксированной длины. Черт, опять звучу как профессор из университета. Давайте наглядно.
40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a
7f2c05a4eeb66ace430d087860d555bfc6d0ce2e3ddbaf0c7922ee8e6f111251
Как видно из примера, две исходные строки отличаются по длине, но вот их хэши имеют одну и ту же длину. Очень удобно. По секрету скажу: хэш можно посчитать даже от файла в 100 Гб. И результат всегда будет таким вот коротким.
Хэши имеют несколько чудесных свойств:
- Посчитать хэш любой строки можно за долю секунды. Посчитать исходное значение строки имея хэш – займет у вас тысячелетия. Буквально. Потому что так работает сама функция – она однонаправленная, и для нее не предполагается считать исходное значение по результату.
- Изменение хотя бы одного символа в исходной строке ПОЛНОСТЬЮ меняет хэш.
- Результат хеширования одной и той же строки всегда один и тот же (строго говоря, только у криптографических хэш-функций, коей и является функция SHA256 в биткоине)
40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a
2888a1392da12949b9080aaf21331de789f14d854222d269ba6ff5ecedb85c98
Я поменял всего одну заглавную букву в имени Альберт на строчную. Хеш изменился вплоть до каждого символа!
Эти три замечательных свойства позволяют контролировать целостность данных. То есть факт того, что данные никто не изменял.
Однако сами по себе хэши вас не спасут – ведь про хэши знают все (или могут загуглить). Если вы просто начнете писать хэш напротив ваших строк, это, конечно, подтвердит целостность строки, но только пока злой должник не подменит и сам хэш. Или не допишет, например, новую запись и новый хеш.
Поэтому нам нужен не просто список наших транзакций. Нам нужен связный список. Такая структура данных, в которой каждый следующий элемент жестко связан с предыдущим каким-нибудь правилом.
Прим. в данном случае знак “+” означает не сложение как таковое, а конкатенацию. По сути просто дописывание одной строки в конец другой. Ох, сколько умных слов: хеширование, конкатенация… Пора, наверное, глоссарий заводить. Упс, еще одно слово 😅
И так далее. То есть каждая запись формируется путем хеширования строки текущей записи, к которой добавляется хэш прошлой. И такой список не займет много места – ведь хеширование любой строки дает короткий результат. И подменить что-то в середине просто не получится – обладатель списка всегда может его просто пересчитать, и если в список закралась подмена транзакции – хэши не будут совпадать. Если Альберт изменит 1 на 2, то финальный хэш выглядит абсолютно иначе:
Стало сильно надежнее. Но пытливый ум Альберта может все равно сломать эту конструкцию – Альберт может также потратить время и пересчитать все хэши и заменить их значения. Ну, или просто дописать в конце новую запись, связав ее с последней.
Неужели все эти усложнения были зря? Вовсе нет! Добавим новую примочку в нашу схему. Заставим каждого, кто захочет внести запись в данную книжку, решать математическую задачу. Из минусов – вам тоже придется ее решать, чтобы внести запись. Из плюсов – Альберту придется поломать голову прежде, чем вас обмануть.
Но мы не можем ставить задачки типа "сколько будет дважды два?". Да и логарифмическое уравнение тоже не поможет, ведь хоть и Альберт плохо учился и не знает, как их решать – у него есть компьютер, а вот уж он точно легко с ними справится.
Поэтому нам нужна такая задача, чтобы даже компьютер не имел алгоритма ее решения. И все, что бы мог делать как человек, так и машина – это просто перебирать все возможные варианты до тех пор пока не повезет найти ответ. И таких задач много. Но создатель биткоина - Сатоши Накомото - выбрал следующую:
Найти такое число, чтобы сложив его с исходной строкой, хэш результата начинался бы с 10 нулей.
Герман -> Альберт 2000 руб. + 40698c1a4e6e63977d250490b44273596b5f8c73371b76ccb2c1507995bdea4a + Х =
Вы уже знаете, что стоит изменить в данной строке хотя бы один символ и хэш полностью изменится. Именно это свойство и гарантирует, что для такой задачи нет никакого способа решения, кроме полного перебора. Вам нужно просто подставлять вместо Х числа в выражение до тех пор, пока итоговый хэш не начнется с 10 нулей. Как только нужное число будет найдено (оно, кстати, называется nonce) – добавляем запись в наш список.
Теперь Альберт уж точно не успеет изменить что-то в списке и пересчитать все хэши в то время, как вы отошли на кухню поставить чайник или пока вы спите – на подделывание записей будет уходить не только время, но и вычислительные ресурсы. В конечном счете, Альберту уже просто невыгодно пытаться вас обмануть – итоговые затраты на взлом существенно выше награды. Теперь Альберт может только добавить поддельную транзакцию в конец. Ведь для этого ему не придется ничего пересчитывать, а только лишь добавить свою запись, решить одну задачку и преспокойно добавить её решение - хэш - после самой записи. Но у нас и на это есть ответ 😈
Если хотите, поиграйтесь в данном калькуляторе, взяв, к примеру, свое имя и попробовав получить в начале хэша хотя бы 2 нуля. Пишите в комментариях к статье (или в нашем чате), за сколько попыток у вас вышло :)
Децентрализация
Предположим на мгновение, что записей в книжке у Германа не так много, скажем 30. А чтобы посчитать хэш нужен один мощный игровой ноутбук, который может провести поиск одного хэша за 5 мин. Итого чтобы пересчитать все записи нам нужно:
Относительно недолго, опять же при заданных условиях. И, вроде бы, Альберт готов раствориться в ночи победителем, но не тут то было!
Оказалось, что Герман ведет учет не только своих операций, но и операций своих друзей (сейчас неважно, как они в течение дня ими обмениваются). Но вот, что действительно важно, так это то, что каждый день перед сном Герман созванивается с тремя друзьями, живущими в разных городах, и они по очереди диктуют друг другу последний хэш, чтобы удостовериться, что их бухучёт верный. В итоге, Альберт, который потратил несколько часов в ночи и, скорее всего, немало нервов (т.к. ведь могут и застукать же!) ушел, в общем-то, ни с чем. Ведь в конце следующего дня на созвоне Герман продиктует свой последний хэш и выяснится, что он неверный и его версия бухгалтерской книги отличается от версий его друзей, а это может означать лишь одно - произошла подмена. Герман сотрет или вырвет из книги пару листочков и попросить продиктовать друзей верную копию. И справедливость восторжествует!!!
Именно благодаря подобной синхронизации людей (компьютеров/узлов в сети) и решается проблема подмены операций!
Такой связанный список и действующий по вышеперечисленным правилам и называется блокчейном. А процесс вычисления nonce – это и есть тот самый майнинг. Да, сотни тысяч устройств по всему миру заняты решением вот такой простой задачи.
Вам осталось мысленно подставить вместо действующих лиц в нашем рассказе компьютеры, каждый из которых хранит в себе ту самую книжку/блокнот с записями (базу данных) и которые постоянно проверяют верность своих и чужих записей (транзакций пользователей), а также занимаются обработкой новых, выполняя поиск хэша и все, блокчейн готов! Практически :)
Чтобы подытожить, дадим формальное определение блокчейна:
Блокчейн (англ. Blockchain, block – блок, chain - цепочка) – распределенная база данных, которая представляет собой цепочку записей – блоков – соединенных криптографическими методами. Каждый блок хранит в себе транзакции пользователей, причем только те, которые не противоречат протоколу.
Надеюсь, теперь в данном определении ничего вас не пугает, и каждое слово в нем носит осознанный смысл. Готовьтесь, в следующей статье мы нанесем на прочный скелет, который мы сегодня построили, несколько интересных деталей, таких как майнинг, что на самом деле из себя представляет криптовалюта Bitcoin и др., и тогда вы станете поистине знатоками блокчейна биткоина.
Investment Hollow - компания единомышленников, которая видит в криптоиндустрии будущее, а также хороший источник заработка. Ежедневно анализируем рынок в поисках интересных проектов для инвестиций.
Мы всегда рады новым членам: как с опытом в сфере блокчейна и криптовалют, так и без. Присоединяйтесь к нашему сообществу, поможем, чем сможем и двинемся вместе покорять новые вершины 💪🏼