Когда создавалась эта статья, в сети Bitcoin насчитывалось уже 658 413 блоков — и я не удивлюсь, если публикаций на тему «Что такое блокчейн?» когда-нибудь станет столько же. Пока авторы пытаются на пальцах объяснить принцип работы blockchain, я расскажу, как создать простейшую блокчейн-цепочку своими руками прямо в блокноте.
Но сначала предлагаю погрузиться в историю вопроса — чтобы понять, что это за технология и зачем она нужна. Мы, люди, очень ценим уверенность в завтрашнем дне. Поэтому с давних времён любую договорённость старались зафиксировать в тексте и поставить подписи, а ещё лучше — печати. А затем отдать один экземпляр подписанного договора на хранение независимому человеку — сейчас это нотариусы. Такие меры гарантируют, что ни одна сторона не изменит условия договора: подделка подписи трудозатратна и наказуема. А наличие экземпляра у третьей стороны и вовсе делает подделку бессмысленной, поскольку в суде такая изменённая копия договора противопоставлялась бы двум оригинальным.
Практика надёжная, но очень уж трудозатратная. На помощь должны были прийти компьютеры, но это случилось не так давно. Дело в том, что тексты, сканы, фотографии, хранящиеся в памяти ПК, легко подделать, а то и вовсе удалить. Даже если очень значимая информация располагается на серверах известных и уважаемых компаний. В частности из-за этого электронные деньги долгое время не воспринимались как способ хранения и оборота крупных сумм.
До появления биткойна только банки предоставляли клиентам надёжный способ оперировать большими суммами через интернет.
Они под влиянием регулятора брали на себя ответственность за хранение истории движения денег, за их безопасность, за то, что они внезапно не исчезнут со счёта. Банковское ПО считается самым надёжным. Но на серверах банка данные тоже в принципе можно изменить. Последняя преграда на пути ушлого сотрудника банка, решившего скорректировать пару записей в базе данных, — это служба безопасности. Которая, впрочем, тоже состоит из людей.Благодаря Bitcoin появилась возможность надёжно хранить и переводить деньги онлайн, не боясь, что кто-то сможет «поменять пару цифр в нужных местах». В блокчейне архитектурно невозможно подделать или удалить данные. И заметьте: банки стали самыми заинтересованными потребителями технологии!
Перейдём от слов к делу. Отстранимся от серых трудовых будней и представим себя в роли ростовщика, который решил стать тотально открытым и вести книгу учёта в формате блокчейна. Открываем блокнот и записываем:
=== 10 ноября 2020 года === Клиент Б: вернул займ вместе с процентами в размере 4300 рублей, залог в виде наручных часов возвращён клиенту Клиент A: получил займ в размере 1000 рублей с обязательством вернуть 1100 рублей вместе с процентами 12 ноября 2020 года, в качестве залога оставлен живой мадагаскарский таракан в стеклянной банке (клиент взял риски на себя и заверил, что за 2 дня таракан не сдохнет) === конец блока ===
Теперь нам нужно чем-то подписать этот блок. Для этого в блокчейне используются хеш-функции. Они появились задолго до блокчейна как идейное продолжение контрольной суммы. Посмотрим определение контрольной суммы из Википедии: «Контрольная сумма — некоторое значение, рассчитанное по набору данных путём применения определённого алгоритма и используемое для проверки целостности данных при их передаче или хранении». Если проще, то это какое-то число, которое всегда одинаково для одних и тех же данных.
Контрольные суммы полезны при передаче данных по сети. Если отправить пакет данных и его контрольную сумму, то принимающая сторона может заново вычислить контрольную сумму полученного пакета и сравнить её с тем значением, которое пришло. Если они совпадают — с вероятностью 99,99% (и больше, в зависимости от размера пакета и алгоритма) данные в сохранности. А если контрольные суммы отличаются — значит, данные повреждены.
Рассмотрим самый простой пример. Допустим, при переезде всё ваше имущество поместилось в 20 коробок. Число 20 — это примитивная контрольная сумма. Если при выгрузке коробок в новом месте их количество хотя бы на 1 больше или меньше 20 — значит, что-то пошло не так. Впрочем, число 20 тоже не даёт гарантий, но вселяет базовую уверенность. А вот если взять отдельно порядковый номер, вес, размеры каждой коробки, всё это определённым образом сложить, то полученная контрольная сумма станет более надёжной.
Образно говоря, хеш данных — это контрольная сумма на стероидах. Давайте вычислим хеш нашего ростовщического блока, воспользовавшись алгоритмом sha256 — он довольно надёжен, а результат не слишком громоздкий. Можно использовать для этого онлайн-сервис:
Заметьте, что даже точка в конце предложения приводит к изменению хеша до неузнаваемости:
Уберём точку, а получившийся хеш запишем в начало следующего блока на 11 ноября:
=== 10 ноября 2020 года === Клиент Б: вернул займ вместе с процентами в размере 4300 рублей, залог в виде наручных часов возвращён клиенту Клиент A: получил займ в размере 1000 рублей с обязательством вернуть 1100 рублей вместе с процентами 12 ноября 2020 года, в качестве залога оставлен живой мадагаскарский таракан в стеклянной банке (клиент взял риски на себя и заверил, что за 2 дня таракан не сдохнет) === конец блока === === 11 ноября 2020 года === d7998a218df60c6d9b1c415cc077f4b30a6b7380c300bcf44b82d1e43a5e59d6 Клиент C: вернул займ в размере 2200 рублей вместе с процентами, залог в виде обручального кольца возвращён клиенту === конец блока ===
Вычисляем хеш нового блока и вставляем его в начало следующего:
=== 10 ноября 2020 года === Клиент Б: вернул займ вместе с процентами в размере 4300 рублей, залог в виде наручных часов возвращён клиенту Клиент A: получил займ в размере 1000 рублей с обязательством вернуть 1100 рублей вместе с процентами 12 ноября 2020 года, в качестве залога оставлен живой мадагаскарский таракан в стеклянной банке (клиент взял риски на себя и заверил, что за 2 дня таракан не сдохнет) === конец блока === === 11 ноября 2020 года === d7998a218df60c6d9b1c415cc077f4b30a6b7380c300bcf44b82d1e43a5e59d6 Клиент C: вернул займ в размере 2200 рублей вместе с процентами, залог в виде обручального кольца возвращён клиенту === конец блока === === 12 ноября 2020 года === 4ca9565815823b0850f3bd0d90359acff26e76c326069606b168c7248a16d613 Клиент А: вернул займ в размере 1100 рублей вместе с процентами, залог в виде мадагаскарского таракана в стеклянной банке (правда, мёртвого) возвращён клиенту === конец блока ===
Каждому клиенту при выдаче займа и возврате мы даём актуальную версию всего нашего блокчейна в виде распечатки. Мы же ничего ни от кого не прячем, а клиенты обозначены условно, без персональных данных. Так что у каждого есть копия блокчейна.
Теперь представим неприятную ситуацию: владелец мадагаскарского таракана не смог пережить утрату и захотел взыскать с нас компенсацию за смерть питомца. Он решил подделать блок от 10 ноября и вместе с претензиями предоставляет нам такую бумагу:
=== 10 ноября 2020 года === Клиент Б: вернул займ вместе с процентами в размере 4300 рублей, залог в виде наручных часов возвращён клиенту Клиент A: получил займ в размере 1000 рублей с обязательством вернуть 1100 рублей вместе с процентами 12 ноября 2020 года, в качестве залога оставлен живой мадагаскарский таракан в стеклянной банке (клиент не взял риски на себя и заверил, что таракан может жить без пищи и воды неделями) === конец блока === === 11 ноября 2020 года === 2f124d2fd7191221c9c484eaa27db4cab3557fde32b1cda392239cba314122da Клиент C: вернул займ в размере 2200 рублей вместе с процентами, залог в виде обручального кольца возвращён клиенту === конец блока === === 12 ноября 2020 года === 4ca9565815823b0850f3bd0d90359acff26e76c326069606b168c7248a16d613 Клиент А: вернул займ в размере 1100 рублей вместе с процентами, залог в виде мадагаскарского таракана в стеклянной банке (правда, мёртвого) возвращён клиенту === конец блока ===
Он даже не поленился вычислить новый хеш и заменить им старое значение в начале блока от 11 ноября. Но фальсификация всё равно не удалась, потому что, вычисляя хеш блока за 11 ноября, мы получаем значение, которое не совпадает с тем, что указано в начале блока за 12 ноября:
Даже беглого взгляда достаточно, чтобы понять, что deed58817411a699a0526a90adb023e49d9e79adc264d7921a8cbb2cbfa0e9ef отличается от 4ca9565815823b0850f3bd0d90359acff26e76c326069606b168c7248a16d613.
Таким образом, изменение даже одного бита в любом блоке блокчейна приводит к изменению хешей всех последующих блоков: они друг с другом неразрывно и последовательно связаны.
Найти же два разных текста, у которых будет один и тот же хеш (это называется коллизией) — задача очень трудоёмкая, с негарантированным результатом. При этом она требует огромных вычислительных мощностей, которые будут на порядки дороже фальсифицируемой информации. А получившийся текст будет просто бессмысленной мешаниной из букв. Ещё нюанс: реальный блокчейн использует гораздо более сложные правила получения хешей — из-за этого майнеры биткоинов в масштабах мира жгут петаватты электроэнергии. Так что задача становится просто невыполнимой на нынешнем уровне развития нашей цивилизации.
Но рано радоваться: в нашей системе учёта ещё остаётся слабое место. Что если заводчик мадагаскарских тараканов пересчитал все хеши и принёс нам бумагу с новыми, утверждая, что его версия блокчейна правильная, а наша нет? Тут мы вспоминаем, что у всех клиентов есть копии нашего блокчейна и что хеши у всех одинаковые — так что возмутитель спокойствия остаётся в меньшинстве. Хеширование и распределённость — вот два главных столпа блокчейна.
В блоках может храниться любая информация, и это делает блокчейн универсальным инструментом. Можно сделать на его основе криптовалюту, а ещё предусмотреть смарт-контракт. Это как договор, только в виде программного кода, который начинает выполняться с момента заведения такого контракта.
Предположим, вы с другом заключили пари: вы утверждаете, что завтра в 12 часов будет снегопад, а приятель — что пойдёт дождь. Если осадков вообще не случится, ваши ставки отправятся в благотворительный фонд. Достаточно оформить это в формате программы смарт-контракта и совершить взносы на него в виде транзакций. Программа беспристрастна, поэтому ни смухлевать, ни отменить пари будет уже невозможно. Честность как она есть — вот в чём суть блокчейна.
Заинтересовала блокчейн-разработка? Вы можете освоить её на базовом уровне с помощью профессии «Блокчейн-разработчик» в GeekBrains.