Что нам стоит блокчейн построить?
- Децентрализованные сети,
- Криптография,
- Анализ и проектирование систем,
- Биллинговые системы,
- Криптовалюты
Вся история человечества — это непрерывное избавление от цепей и создание новых, еще более крепких. (Анонимный автор)
Анализируя многочисленные blockchain проекты (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin и др.), я понимаю, что с технической точки зрения все они построены по одним принципам. Блокчейны напоминают дома, у которых при всем разнообразии конструкций, декора и назначений имеются фундамент, стены, крыша, окна, двери, которые связаны друг с другом определенными способами. И если понять основные принципы проектирования зданий, знать свойства применяемых материалов, то можно определить целевое назначение конкретного дома. В настоящее время с блокчейном возникла ситуация, что все про него слышали, но мало кто понимает архитектуру и принципы работы. Поэтому возникает непонимание для чего и как имеет смысл использовать технологии блокчейна.
В данной статье мы разберем общие для всех блокчейнов свойства и принципы. Далее посмотрим на задачи, которые можно решать с помощью блокчейна и для закрепления материала построим маленький, но настоящий блокчейн на своем виртуальном участке!
Итак, давайте вспомним какие проблемы изначально решил блокчейн.
Уверен, что многие скажут про распределенную, децентрализованную, публичную и неизменяемую базу данных. Но зачем это все было нужно?
Я предпочитаю начинать изучение любой технологии с чтения стандартов, так как именно на них основываются все статьи и книги по исследуемой теме. Но стандарты блокчейна в настоящее время отсутствуют, в ISO созданы только комитеты для их разработки. На текущий момент в каждом публичном блокчейн проекте имеется свой документ White paper, который по сути является техническим заданием. Первый общеизвестный блокчейн проект — это сеть Bitcoin. Идем на официальный сайт сети и смотрим с чего все начиналось.
Задача блокчейна
Итак, задача, которую решил блокчейн в сети пионере Bitcoin — это совершение доверительной передачи собственности на цифровые активы (assets) в недоверительной среде без посредников. Например, в сети Bitcoin цифровой актив — это цифровые монеты bitcoin. И все технические решения Bitcoin и других блокчейнов сводятся к решению этой задачи.
Проблемы, которые решает блокчейн
Предположим некая финансовая организация говорит, что построила сеть по всему миру, с помощью которой можно переводить деньги любому человеку. Поверите ли вы ей? Если эта организация Visa или MasterCard, скорее всего, поверите, а если, условно говоря, AnonymousWorldMoney, наверное, нет. Почему же? А потому, что мы прекрасно знаем, как делаются распределенные системы частными компаниями, с какими целями, и к чему это может привести. Рассмотрим подробнее проблемы таких систем, и как они могут быть решены с применением технологий блокчейна.
Допустим, в условной AnonymousWorldMoney стоят сервера с базами данных, и хорошо, если их будет несколько в разных дата-центрах. Когда отправитель переводит деньги, регистрируется транзакция, которая реплицируется на все сервера, и деньги доходят до получателя.
В идеальном мире такая схема прекрасно работает, в нашем же возникают следующие проблемы:
- Проблема идентификации участников с одной стороны и необходимость анонимности транзакций с другой. Т.е. надо перевести деньги конкретному получателю и так, чтобы об этой транзакции никто не знал, кроме участников сделки. У банков есть номера счетов и банковских карт, привязанных к конкретному физическому или юридическому лицу, а банковская тайна защищает информацию о транзакциях. А кто гарантирует, что условная AnonymousWorldMoney не использует персональные данные и информацию о транзакциях в своих целях?
- Как убедиться, что получатель получил именно ту сумму, которую ему перевели? Условно говоря, отправитель перевел $100, а получатель получил $10. Приходит отправитель в офис AnonymousWorldMoney со своей квитанцией, а клерк показывает свою версию, где записано, что отправитель перевел только $10.
- Проблема недоверительной среды, например, мошенничество, называемое double-spending. Недобросовестный участник может потратить свой баланс несколько раз, пока платеж не реплицировался на все сервера. CAP теорему, конечно, никто не отменял, и согласованность в конечном итоге будет достигнута, но кто-то не получит деньги за оказанные услуги или товары. Поэтому, если нет полного доверия к платежной организации или участникам сделок, то надо строить сеть, основанную не на доверии, а на криптографии.
- Условная AnonymousWorldMoney имеет конечное число серверов, которые могут стать недоступными непредумышленно или по злому умыслу.
- AnonymousWorldMoney возьмет свою ощутимую комиссию.
- Возможность управления. В процессе эксплуатации Bitcoin выяснилось, что люди хотят не только переводить монеты друг другу, но и проверять различные условия прохождения транзакции, программировать сценарии работы, автоматически выполнять действия в зависимости от условий и т.д.
Как блокчейн решает эти проблемы
- Идентификация участников осуществляется с помощью пары ключей: приватного и открытого, а алгоритм цифровой подписи однозначно идентифицирует отправителя и получателя, оставляя их личности анонимными.
- Транзакции собираются в блоки, вычисляется хеш блока, который записывается в следующий блок. Такая последовательность записи хешей в блоках и дала название технологии blockchain, и она же делает невозможным незаметное изменение / удаление блоков или отдельных транзакций из блоков. Таким образом, если транзакция попала в блокчейн, то можно быть уверенным, что ее данные останутся неизменными.
- Мошенничество double-spending предотвращается путем достижения консенсуса в сети, какие данные считать верными, а какие отбрасывать. В сети Bitcoin консенсус достигается доказательством выполнения работы PoW (Proof-of-Work).
- Надежность функционирования сети достигается тем, что блокчейн является публичным, где каждый участник может запустить свою ноду, получить полную копию блокчейна и, более того, самостоятельно начать проверять транзакции на правильность. Надо отметить, что современные блокчейны позволяют строить не только публичные (открытые), но и частные (закрытые) блокчейны, а также использовать комбинированные схемы.
- Полностью от комиссии в блокчейне не избавится, т.к. надо платить людям поддерживающим сеть, но в блокчейне необходимость комиссии доказывается так убедительно, что не остается сомнений в ее необходимости.
- Современные блокчейны имеют возможность реализовывать бизнес логику, которая в блокчейне называется Smart Contracts. Логика смарт контрактов реализуются на различных языках высокого уровня.
Далее рассмотрим эти решения подробнее.
Архитектура блокчейна
Составные части блокчейна
Каждый участник может запустить свою ноду с полной копией блокчейна (full node). Полные ноды, которые могут записывать транзакции в блокчейн, называются узлами консенсуса (witness) или майнерами (miner). Полные ноды, которые только проверяют правильность транзакций называются узлами аудита (audit). Легкие клиенты (light clients) не хранят полных копий блокчейна, а взаимодействуют с сетью, используя полные ноды.
Большинство пользователей для совершения транзакций используют именно легких клиентов или web кошельки. Все ноды связаны друг с другом. При таком наборе элементов архитектура сети становится более устойчивой:
Жизненный цикл транзакции
Посмотрим на жизненный цикл транзакции и разберем его по частям:
Технологии блокчейна
Остановимся подробнее на технических решениях и их связях друг с другом.
Идентификация
Каждая блокчейн транзакция должна быть подписана цифровой подписью. Поэтому для совершения транзакции каждый участник должен иметь пару ключей: private / public. Иногда пару ключей называют кошелек (wallet), т.к. ключи однозначно связаны с уникальным цифровым адресом и балансом участника. В реальности ключи и адреса — это просто строки цифр в разных системах счисления. Примеры ключей и адреса кошелька:
Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V
Для создания цифровой подписи в блокчейнах используется алгоритм, основанный на эллиптических кривых: Elliptic Curve Digital Signature Algorithm (ECDSA). Для его работы приватный ключ (256 битное число), обычно, берется случайно. Число вариантов ключей составляет 2 в степени 256, поэтому можно говорить о практической невозможности совпадения значений приватных ключей.
Далее, публичный ключ получается из приватного путем умножения его значения на координаты точки, находящейся на эллиптической кривой, в результате чего получаются координаты новой точки этой же кривой. Это действие гарантирует получение пары ключей, пригодной для цифровых подписей транзакций. И наконец адрес кошелька однозначно вычисляется из публичного ключа.
Есть масса статей с подробностями по криптографии, используемой в блокчейне, например: Bitcoin in a nutshell — Cryptography
Приватный ключ должен быть строго секретен и храниться в безопасности. Публичный ключ известен всем. При утере приватного ключа доступ к активу (монетам) восстановить невозможно и деньги будут утеряны навсегда. Поэтому задача надежного хранения приватных ключей крайне актуальна, т.к. это не банк, куда всегда можно прийти с паспортом и восстановить счет. Существует целая индустрия по производству, так называемых, холодных криптокошельков, похожих на флешки:
или можно использовать более надежные способы, как пример, выбивать значение приватного ключа на жетонах:
Транзакции
Подробнее про структуру транзакции можно посмотреть в статье Bitcoin in a nutshell — Transaction. Нам же важно понимать, что каждая транзакция имеет по крайней мере следующие данные:
From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - цифровой адрес отправителя
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - цифровой адрес получателя
Value: 0.0001 - сумма транзакции
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - хэш транзакции
Далее транзакция подписывается приватным ключом и рассылается (см. подробности по работе протокола Bitcoin in a nutshell-Protocol) всем нодам в блокчейне, которые проверяют транзакции на валидность. Алгоритм проверки транзакции нетривиален и включает два десятка шагов.
Блоки транзакций
Проверив валидность транзакций, ноды формируют из них блоки. Помимо транзакций в блок записывается хеш предыдущего блока, число (счетчик Nonce), и происходит вычисление хеша текущего блока по алгоритму SHA-256. Хеш должен обладать установленным условиям сложности. Например, в сети Bitcoin сложность хеша автоматически меняется раз в 2 недели в зависимости от мощности сети так, чтобы блок генерировался примерно раз в 10 минут. Сложность определятся следующим условием: найденный хеш должен быть меньше заранее заданного числа. Если данное условие не выполняется, то к Nonce прибавляется 1, и работа по вычислению хеша повторяется. Для подбора хеша используется поле Nonce, т.к. это единственные данные в блоке, которые можно изменить, остальные должны оставаться неизменными. Правильный хеш должен иметь определенное число нулей в начале, например, один из реальных хешей:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91
Успешное нахождение хеша и является доказательством проделанной работы (Proof-of-Work, PoW) для сетей Bitcoin или Ethereum. Процесс нахождения хешей называется майнингом (mining), по аналогии с добычей золота. Название достаточно точно определяет суть процесса, т.к. происходит простой перебор вариантов, и если кто-то нашел подходящий хеш, то это действительно удача. Это как найти реальный самородок золота в тоннах пустой породы. Вознаграждение за блок сейчас составляет 12.5 BTC и если умножить на актуальный курс биткоина $3900, то получается больше килограмма чистого золота. Есть за что побороться!
После успешного нахождения хеша блок и сам найденный хеш записываются в блокчейн следующим блоком. Подробнее по структуру блоков можно посмотреть в статье Bitcoin in a nutshell-Blockchain, а ниже приведу упрощенную схему:
Блокчейн начинается с блока, у которого еще нет хеша предыдущего блока. Такой блок в блокчейне один и имеет собственное название Genesis block. У остальных блоков одинаковая структура и отличаются они только числом транзакций. Реальные транзакции и блоки создающиеся в настоящее время в Bitcoin или Ethereum можно смотреть в Block Explorer.
Размер блоков в Bitcoin ограничен 1Мб и при минимальном объеме информации в транзакции около 200 байт, максимально в блоке может быть около 6000 транзакций. Отсюда, кстати, и следует производительность Bitcoin, над которой все смеются: блок генерируется примерно раз в 10 мин * 60 сек = 600 сек, что и дает формальную производительность около 10 TPS. Хотя на самом деле — это не производительность, а сознательно реализованный алгоритм работы. В Ethereum для конкуренции просто сделали время генерации блока 15 сек. и производительность формально взлетела. Поэтому в блокчейнах, использующих PoW в качестве консенсуса вообще бессмысленно сравнивать производительность, т.к. она напрямую зависит от сложности вычисления кеша, которую можно назначить любую.
Форки
А что происходит, если, например, несколько узлов нашли хеши удовлетворяющие условиям сложности, но разные по значению (иными словами, пришли к разным консенсусам) и записали блоки в блокчейн? Давайте посмотрим, как блокчейн защищается от данной ситуации. В этом случае происходит, так называемый, форк (‘вилка’), и блокчейн имеет две версии цепочки:
Что происходит далее? Далее часть сети начинает работать над блоком N+2 от одной цепочки, а часть от другой:
Какой-то из этих блоков будет найден раньше и отправлен в блокчейн и тогда по правилам блокчейн должен будет переключиться на более длинную цепочку и отменить все транзакции из альтернативного блока:
При этом, может сложиться ситуация, когда транзакция участника находилась только в одном из блоков форка, который и был отменен. Поэтому, чтобы быть уверенным, что нужная транзакция записалась в блокчейн, есть общая рекомендация — прежде чем доверять транзакции надо подождать пока следующие несколько блоков не будут добавлены в блокчейн. Рекомендации, сколько блоков ждать для разных блокчейнов различаются. Например, для сети Bitcoin минимум — это 2 блока, максимум 6.
Такая же картина с форком блоков будет наблюдаться и при, так называемой, атаке 51% — это когда группа майнеров будет пытаться вырастить альтернативную цепочку блоков, добиваясь отмены цепочки cо своими мошенническими транзакциями. Хотя в настоящее время, вместо мошенничества, выгоднее тратить свои мощности на честный майнинг.
Консенсус
Для записи блока в блокчейн сеть должна прийти к консенсусу. Давайте вспомним, задачу достижения консенсуса в компьютерных сетях связи. Проблема формулируется, как задача византийских генералов BFT (Byzantine fault tolerance). Опуская живописное описание проблем византийской армии, задачу можно сформулировать так: как узлам сети прийти к общему результату, если часть узлов сети могут сознательно их искажать. Существующие алгоритмы решения задачи BFT показывают, что сеть может функционировать правильно, если мошенников меньше 1/3. Почему в сети Bitcoin не был применен консенсус BFT? Зачем нужно было использовать PoW? Есть несколько причин:
- BFT хорошо работает с небольшим фиксированным набором нод, а в публичном блокчейне число нод непредсказуемо и, более того, ноды могут произвольно включаться-выключаться.
- Необходимо мотивировать людей запускать блокчейн ноды. Для этого люди должны получать вознаграждение. В BFT формально не за что получать вознаграждение, а вот за что идет вознаграждение в PoW всем понятно на интуитивном уровне: за электричество, потребленное процессором в процессе нахождения хеша блока.
Помимо PoW существует еще несколько консенсусов, которые используются в современных блокчейнах, например:
- PoS (Proof-of-Stake) — в блокчейне Hyperledger
- DPoS (Delegated Proof-of-Stake) — в блокчейне BitShares
- Модификации BFT: SBFT ( Simplified BFT ) и PBFT ( Practical BFT ), например, в блокчейне Exonum
Немного остановимся на консенсусе PoS, т.к. именно PoS и его разновидности получили наибольшее распространение в приватных блокчейнах. Почему именно в приватных? С одной стороны, характеристики PoS лучше по сравнению с PoW, т.к. для достижения консенсуса нужны меньшие вычислительные ресурсы, а значит увеличивается скорость записи данных в блокчейн. Но с другой стороны в PoS больше возможностей для мошенничества, поэтому для нейтрализации этого все участники блокчейна должны быть известны.
Консенсус PoS основан на выборе узла, который может записать блок с транзакциями в блокчейн в зависимости от количества средств на счету, вернее, не на счету, а в залоге, Т.е. чем у тебя больше средств в залоге, тем с большей вероятностью сеть выберет твой узел для записи блока. Залог не возвратится, если блок окажется невалидным. Таким образом реализована защита от мошенничества. Есть следующие вариации PoS:
- Консенсус Delegated PoS (DPoS) разделяет участников на «голосующие» и «валидирующие». Держатели монет (голосующие участники) делегируют свое право проверять и записывать транзакции в блокчейн другим участникам. Таким образом, валидаторы выполняют всю вычислительную работу и получают за это вознаграждение, а наличие голосующих участников гарантирует честность валидаторов, т.к. их можно сменить в любой момент.
- Консенсус LPoS (Leased Proof-of-Stake) позволяет отдать свои средства в аренду другим узлам, чтобы те имели больше шансов для проверки блоков. Т.о. можно получать комиссию за транзакции, при этом не участвуя в самой проверке транзакций и майнинге блоков.
Существует еще ряд консенсусов, которые пока не получили широкого распространения, здесь просто перечислю для информации, а обзор самих алгоритмов консенсуса можно посмотреть, например, в статье: Алгоритмы Консенсуса в Блокчейне.
- PoET ( Proof-of-Elapsed Time )
- PoC ( Proof-of-Capacity )
- PoB ( Proof-of-Burn )
- PoWeight ( Proof-of-Weight )
- PoA ( Proof-of-Activity ) — PoW + PoS
- PoI ( Proof-of- Importans )
Надежность и модели развертывания блокчейнов
Публичный блокчейн
Устойчивость Public или другое название Permissionless blockchain достигается тем, что каждый может подключиться и просмотреть информацию или даже подключить свой узел, а доверие строится на консенсусе PoW.
Приватный блокчейн
Private или Private Permissioned blockchain. В этих блокчейнах только определенная группа участников (организаций или людей) имеет доступ к информации. Такие блокчейны строят организации с целью увеличения общей выгоды или эффективности. Их надежность обеспечивается общими целями участников и алгоритмами консенсуса PoS и BFT.
Блокчейн-консорциум
Существуют Consortium или Public Permissioned blockchain. Это такие блокчейны, к которым каждый может подключиться для просмотра, но добавлять информацию или подключить свой узел участник может только с разрешения других участников. Такие блокчейны строят организации с целью повышения доверия со стороны заказчиков или потребителей продукции или общества в целом. Здесь надежность также достигается присутствием доверия между участниками и теми же алгоритмами консенсуса PoS и BFT.
Smart Contracts
В блокчейны, реализованные после Bitcoin, в той или степени добавлена возможность выполнения смарт-контрактов. По сути смарт-контракт — это транзакция, в которой помещен программный код для выполнения. Смарт-контракты в сети Ethereum выполняются в EVM (Ethereum Virtual Machine). Для начала выполнения смарт-контракта его надо явно запустить другой транзакцией, или должно выполниться предусловия для выполнения. Результаты выполнения смарт-контракта также запишутся в блокчейн. Получение данных извне блокчейна возможно, но крайне ограничено.
Какую бизнес логику можно реализовать с помощью смарт-контракта? На самом деле не так уж много, например проверка условий по данным из блокчейна, изменение собственников цифровых активов в зависимости от этих условий, запись данных в постоянное хранилище внутри блокчейна. Реализуется логика на специальном языке высокого уровня Solidity.
Классическим примером функциональности, которую реализуют с использованием смарт-контрактов — это выпуск токенов для проведения ICO. Например, мной был реализован смарт-контракт на выпуск скромных 500 000 000 AlexToken. По ссылке в Etherscan находится
Больше подробностей про смарт-контракты можно узнать в статье: Что такое смарт-контракты в Ethereum.
Заключение
Мы перечислили технологии на которых построены современные блокчейны и как они связаны друг с другом. Теперь давайте сформулируем, какие задачи можно решить с помощью блокчейна, а решения каких будет, в лучшем случае, неэффективно. Итак, использование блокчейна не обязательно, если:
- Транзакции совершаются в доверительной среде;
- Наличие комиссии посредников не ухудшает жизнь участников;
- У участников нет собственности, которую можно представить в виде цифровых активов;
- Нет распределенности в цифровых активах, т.е. ценностью владеет или поставляет только один участник.
Какое будущее ждет блокчейн? Сейчас можно только предполагать возможные пути развития блокчейн технологий:
- Блокчейн станет такой же обычной технологией баз данных, как, например, SQL или NoSQL для решения своего определенного круга задач;
- Блокчейн станет широко распространенным протоколом, как HTTP для Интернета;
- Блокчейн станет основой для новой финансовой и политической системы планеты!
Мы же в следующей части посмотрим какие сейчас существуют блокчейны и для чего они применяются в разных индустриях.
It’s only the beginning!