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