Эта статья представляет собой краткую выжимку результатов исследования и изучения протокола Bitshares. Одноименная децентрализованная платформа реализует криптовалюту, смарт-контракты, торговую площадку и еще много интересной функциональности. Материал может быть полезен тем, что уже знаком с особенностями работы протокола Биткоин, но не слышал про Bitshares, который в свою очередь является учетной системой с хорошим компромиссом между децентрализацией и пропускной способностью. Кроме того протокол Bitshares был взят за основу в других децентрализованных системах: Steemit, EOS.
Идея протокола Bitshares состоит в создании инструмента, с помощью которого можно было бы торговать разными активами и валютами в децентрализованной среде, причем без их фактического депонирования на торговую площадку. Сама идея принадлежит программисту по имени Daniel Larimer. Он предложил ее в 2013 году и активно обсуждал на форумах в течении пяти недель. Так Daniel Larimer познакомился с еще одним активным криптовалютным деятелем по имени Charles Hoskinson, который помог проработать бизнес-план и привлечь инвестиции.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/207/401/857/207401857b6245fcdc6779ae5b12a7f3.png)
Дэниэл Лаример в школьной столовой
Daniel Larimer, также известный под ником Bytemaster, является главным идеологом и разработчиком протокола. Платформа Bitshares позволяет кому угодно создавать user issued assets (UIA), или цифровые токены. Таким образом, на платформе учитывается базовая валюта, т. е. криптовалюта с тикером BTS и множество пользовательских токенов.
Протокол реализует децентрализованную биржу, где этими цифровыми активами можно торговать. При проектировании учетной системы и механизма достижения консенсуса разработчики сделали большой упор на пропускную способность. Как результат, Bitshares позиционирует себя как децентрализованная альтернатива учетной системе Visa. В то время как Visa заявляет, что может обрабатывать пару десятков тысяч транзакций в секунду, Bitshares говорит о способности обрабатывать сто тысяч транзакций в секунду, причем децентрализованным образом, с открытой базой данных и возможностью аудита.
Кроме этого, Bitshares позиционирует себя как платформа смарт-контрактов. Правда, смарт-контракты здесь предустановленные и их количество ограничено — реализованы наиболее популярные контракты. Но они более энергоэффективные и, соответственно, обходятся дешевле в отношении комиссий.
Еще одной особенностью платформы является поддержка платежей с повышенным уровнем конфиденциальности пользователей, которые можно использовать опционально. В Bitshares эта технология называется Stealth Transfers.
Кратко познакомимся с историей запуска этой децентрализованной платформы.
Объем работ по созданию задуманной платформы был очень большим. Создатели решили начать привлекать людей и распределять монеты будущей криптовалюты заранее, чтобы понять, привлечет ли проект достаточно большое внимание и стоит ли его дальше поддерживать. Так, в ноябре 2013 года, родилась идея Bitshares PTS, что означает protoshares. Суть ее состояла в том, что распределение монет начнется с помощью майнинга на основе простого протокола, а в это время будет разрабатываться полноценная версия Bitshares.
Для реализации Bitshares PTS сделали форк Биткоина (клон репозитория с исходным кодом), внесли в него мелкие правки и запустили новую сеть. Все, кто был заинтересован в проекте, могли установить себе на компьютер полный узел сети Bitshares PTS, добывать монеты, обмениваться и торговать ими. Конкуренция за добычу этих монет росла, и совсем скоро участникам пришлось объединяться в майнинговые пулы.
Позже разработчиками был представлен протокол Bitshares версии 1.0 и была заранее объявлена дата выпуска последнего блока в блокчейне Bitshares PTS. Поскольку новая версия протокола написана почти с нуля и использует совершенно новые форматы данных, то обновление имеет свои особенности. Делается снимок состояния всех непотраченных монет на момент последнего блока старого блокчейна и переносится в Genesis Block нового блокчейна. Получается, что все соответствия между открытыми ключами и балансами сохраняются, т. е. можно продолжать пользоваться монетами, используя те же личные ключи. Таким образом, 14 декабря 2014 года пользователи перешли на новую версию протокола, где консенсус уже достигается по правилам delegated proof-of-stake, а майнинг и эмиссия новых монет не предусмотрены.
В октябре 2015 года было еще одно крупное обновление протокола Bitshares до версии 2.0, которое прошло подобным образом.
Стоит отметить, что разработчики Bitshares создали само ядро децентрализованной платформы в рамках отдельного проекта под названием Graphene. Graphene — это основа для создания децентрализованных учетных систем следующего поколения. Кроме Bitshares, Graphene лег в основу нескольких других проектов.
Теперь рассмотрим, как устроены аккаунты в протоколе Bitshares 2.0. Здесь используется криптография на эллиптических кривых, причем сама кривая точно такая же, как в протоколе Биткоин. Есть формат адресов, который использует хеш-значение открытого ключа, систему счисления по основанию 58, префикс BTS и не содержит контрольную сумму. Но этот формат используется редко, поскольку общая база данных платформы оптимизирована таким образом, что каждый объект, в том числе и аккаунт пользователя, имеет собственный уникальный идентификатор, который фактически является целым числом размером 8 байт (или 64 бита). В обычных операциях отправки платежа указывается именно такой идентификатор аккаунта. Кроме того, протокол поддерживает регистрацию уникальных имен. Похожую функциональность впервые реализовали в протоколе Namecoin. Таким образом, в Bitshares можно зарегистрировать удобную для восприятия человеком строку, которая будет уникальной в рамках соответствующего блокчейна, и привязать к своему аккаунту, чтобы использовать это имя вместо Account ID.
Как было отмечено ранее, правила работы протокола DPoS предполагают, что все пользователи могут принимать участие в достижении консенсуса, выбирая валидаторов посредством голосования. В процессе голосования вес голоса пользователя определяется его балансом в базовой валюте. Формирование блоков выполняется подмножеством избранных валидаторов. В рамках протокола Bitshares валидатор называется witness (свидетель).
Детальнее остановимся модели транзакций в Bitshares.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/283/9c7/54d/2839c754da7920046c2fa52c8dd49bea.png)
На схеме видно, что тело транзакции состоит из пяти основных полей. Первые два поля транзакции необходимы для того, чтобы привязать ее к определенному блоку. Это нужно, чтобы определить цепочку блоков, в которую эта транзакция может быть добавлена, поскольку по правилам протокола транзакция не может быть подтверждена в той цепочке, к которой не привязана. Поле expiration_time задает время, до которого транзакция может быть добавлена в блок. Если она не была подтверждена до наступления этого времени, то она считается невалидной и уже не может быть включена в блокчейн.
Поле operations_veсtor является особенным. Эта особенность состоит в том, что в него можно поместить много разных операций. Операция — это еще один ключевой объект в протоколе Bitshares. Назовем несколько самых популярных типов операций: transfer (перевод), account_update (обновление аккаунта), asset issue (выпуск токена) и order (торговое предложение). Каждая операция имеет свой формат и необходимые параметры. Например, операция transfer требует указания аккаунта отправителя, типа актива, суммы перевода и аккаунта получателя. Сами операции независимы друг от друга, но могут быть выполнены только вместе, если транзакция будет принята.
Поле extensions нужно, чтобы текущая версия программного обеспечения могла обрабатывать транзакции новой версии, где могут быть добавлены дополнительные поля. Конечно же, старое ПО не будет знать, как правильно верифицировать дополнительные поля новых транзакций, но хотя бы сможет корректно обрабатывать транзакции согласно старым правилам.
Это формат неподписанной транзакции. Для того чтобы транзакцию правильно подписать, нужно проанализировать все операции из поля operations_veсtor и составить список аккаунтов, которые должны подтвердить данную транзакцию. Тогда станет ясно, какими ключами нужно подписывать транзакцию. Все необходимые подписи помещаются в отдельное поле — signatures. Если не будет хватать хотя бы одной подписи, то вся транзакция будет считаться неправильной.
Отметим, что за счет оптимизации размера идентификаторов финальный размер транзакции, которая содержит одну операцию будет равен приблизительно 100 байт. Это действительно очень компактная транзакция, если сравнить ее с транзакцией в других протоколах.
Что касается комиссионных сборов, то в протоколе Bitshares реализован особый подход. Каждая операция требует определенной оплаты, которая снимается с баланса аккаунта инициатора в момент подтверждения транзакции. Комиссия за осуществление операций может быть постоянной, а может меняться. В качество грубого сравнения можно отметить, что комиссии за обычные переводы и торговлю значительно ниже, чем комиссии за выпуск новых активов и регистрацию нового аккаунта.
Теперь разберемся, как работает торговля активами, которые выпущены и учитываются на платформе Bitshares. Пользователь может составить транзакцию с такой операцией, где он заявляет, что готов менять один актив на другой актив в определенном соотношении и на определенную сумму. Эта транзакция распространяется по сети и получает подтверждение, после чего другой пользователь может таким же образом заявить, что хочет менять те же активы в том же соотношении. В момент подтверждения второй транзакции, согласно протоколу, обновляются балансы этих двух пользователей, т. е. фактически совершается обмен активами, на основании того, что оба пользователя подписали заявления об обмене, которые удовлетворяют друг друга.
Поскольку такая торговля осуществляется на базе децентрализованной учетной системы, эта торговая площадка называется децентрализованной биржей.
Еще одной важной особенностью протокола Bitshares является возможность гибкого управления аккаунтами. Система динамических разрешений аккаунта (dynamic account permissions) позволяет задать управление аккаунтом по нескольким ключам, по принципу multisignature. Устроено это так, что каждый аккаунт может управляться взвешенной комбинацией других аккаунтов или ключей электронной подписи. Такой подход позволяет создать иерархическую структуру управления, организация которой подобна системе разрешений в реальной жизни. Получается, что можно организовать многопользовательское управление аккаунтом и его балансами, где каждый пользователь будет иметь определенный вес в принятии решения. Причем для проведения разных операций можно установить разные критерии. Такой механизм управления позволяет значительно снизить риски кражи активов и потери контроля над аккаунтом.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/bd5/a46/3b1/bd5a463b1a50a74c3c9f885d6eccb782.png)
Представим это схематично. На вершине иерархии есть аккаунт, от имени которого невозможно заверить транзакцию одним ключом. Это можно сделать только по подтверждению нескольких других аккаунтов и ключей. Участников нижних уровней иерархии обычно называют подписантами (signers). Каждый из них имеет свой вес в подтверждении операции. Например, на данной схеме подписанты имеют вес 25, 40, 35 и 40 единиц, а необходимый порог для подтверждения определенного типа операций может быть 50, 60 или 70 единиц. В то же самое время для других типов операций может иметь место другое распределение весов и другое пороговое значение.
Как это работает на уровне транзакций? Один из подписантов создает транзакцию с определенными операциями и заверяет от имени своего аккаунта. Транзакция подтверждается, но операции, которые в нее входят, не выполняются, а находятся в режиме ожидания подтверждения. Тогда другие подписанты видят предложение и могут либо подтвердить его, либо отклонить это предложение от имени своего аккаунта с помощью транзакций, содержащих специальные операции.
Детальнее разберем особенности выпуска пользовательских активов на платформе Bitshares. Кто угодно может сформировать транзакцию с операцией создания нового актива, заплатить определенную комиссию, задать параметры этого актива и начать эмиссию соответствующих токенов. Эта функциональность протокола реализована в виде предустановленного смарт-контракта и имеет некоторые особенности.
По желанию эмитента можно удовлетворить требованиям KYC (Know Your Customer – знай своего клиента) с помощью механизма white list (список разрешенных аккаунтов) и дополнительного подтверждения (approve) эмитента. White list содержит аккаунты, которым эмитент актива дает разрешение получать и держать его токены. А механизм дополнительного подтверждения позволяет эмитенту контролировать каждую транзакцию по переводу или торговле токенами (он может отклонить или одобрить каждую транзакцию с его активом).
Кроме того, эмитент может ограничить торговлю токенами и разрешить только хранение и переводы, или ограничить переводы, а разрешить только торговлю. Эмитент также может установить дополнительные комиссии на переводы и торговлю токенами.
Еще одна особенность состоит в том, что эмитент может активировать функцию изымания и перераспределения токенов. Это работает для случаев, когда нужно поддерживать внешние механизмы осуждения сделок и откатывания платежей. Стоит также отметить, что все настройки пользовательских активов задаются в виде параметров смарт-контракта и эмитент задает какие свойства он может менять, а какие будут постоянными. Например он может ограничить себя в дополнительной эмиссии токенов, а может оставить возможность произвольного выпуска. И эти параметры контракта будут видны всем пользователям.
Интересное свойство токенов, которые выпущены на платформе Bitshares состоит в том, что при совершении операций с ними пользователь может оплачивать комиссию либо базовой валютой либо этими самыми токенами. Конвертация выполняется на основании обменного курса, который задает эмитент.
При изучении платформы Bitshares обязательно нужно упомянуть о механизме, который помогает принимать решения в децентрализованной среде — это голосование. Голосованием избираются члены комитета (committee members), валидаторы (witnesses) и разработчики (workers). Члены комитета нужны, чтобы голосовать за изменение некоторых параметров протокола, таких как комиссии, количество валидаторов и т. п. Валидаторы, они же делегаты, нужны, чтобы верифицировать транзакции и формировать блоки. А разработчики предлагают улучшения программного обеспечения. Если они набирают достаточное количество голосов и укладываются в сроки по разработке, то получают вознаграждение.
При голосовании вес голоса каждого аккаунта пропорционален его балансу в базовой валюте. При этом поддерживается опция proxy voting, которая позволяет отдать свой голос другому избирателю. Это удобно в случаях, когда пользователь сам не знает, за кого из кандидатов лучше голосовать, и отдает это право более компетентному пользователю. Вообще, голосование очень важно для обеспечения высокой надежности платформы Bitshares.
Теперь посмотрим на механизм сбора комиссий за транзакции и вознаграждения активных участников сети. Существует такой баланс, который не принадлежит никому из пользователей платформы, а распоряжаться им можно исключительно по правилам протокола. Этот баланс называется Reserve Pool. Правила предполагают, что комиссионные сборы за все операции со всех аккаунтов попадают в Reserve Pool. На аккаунты валидаторов и разработчиков выплачивается вознаграждение из Reserve Pool, как процент от его баланса. Кроме этого, на сбор и распространение комиссионных плат могут накладываться правила реферальной программы, которую также поддерживает платформа (про нее вы можете прочитать отдельно).
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/0f4/af7/89b/0f4af789b7043518054c16d090fee01f.png)
Стоит упомянуть о максимальном количестве монет базовой валюты. Всего выпущено 3.6 млрд монет и дополнительная эмиссия не предусмотрена. При этом на момент 2018 года около 2.6 млрд монет находятся в свободном обороте, а около 1 млрд находятся в Reserve Pool.
До этого мы говорили про смарт-контракт, который реализует обычные токены, а сейчас поговорим про другой смарт-контракт, который реализует market pegged assets, токены которые привязаны по цене к какому-либо внешнему активу. Их также называют SmartCoins. Работает это по принципу contract for difference, т. е. контракт на разницу. Соответственно, эмитировать эти токены может кто угодно, просто замораживая определенную залоговую сумму, например в базовой валюте. Коэффициент залога при этом значительно выше единицы, а рекомендуется 2 и более. Здесь все работает по принципам маржинальной торговли (margin trading), где используются margin positions и автоматические margin calls. Для того чтобы на платформе появились данные о цене актива на внешних рынках, используются доверенные стороны, которые размещают данные о цене актива в блокчейне Bitshares с помощью операции специального типа. В данном случае этими доверенными сторонами являются сами валидаторы.
Заголовок блока в Bitshares имеет более простую структуру и меньший размер, чем заголовок блока в Биткоине.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/fc2/2fd/df6/fc22fddf6fd1abc3260d51c9c0962a2a.png)
Здесь имеются такие поля: идентификатор предыдущего блока, временная метка, идентификатор создателя, хеш-значение входящих транзакций и поле extensions для поддержания совместимости с новыми версиями заголовка блока.
Полный блок будет включать в себя заголовок блока, подпись валидатора, который создал этот блок, и список транзакций, которые входят в этот блок.
В рамках протокола Bitshares существует 4 понятия, которые играют ключевую роль в работе платформы: блоки, транзакции, операции и объекты. Объектами здесь называют аккаунт, актив, баланс, предложение и т. п.
Рассмотрим детальнее понятие операции в контексте данного протоколе. В Bitshares на момент 2018 года около 40 разных типов операций, и с новыми обновлениями протокола можно добавлять новые типы. Операции позволяют инициировать некоторые простые изменения в учетной системе и более сложные механизмы, такие как предустановленные смарт-контракты. Выше уже было сказано, что одна транзакция может содержать несколько операций, которые в случае успеха выполнятся одновременно.
Здесь приведен небольшой список наиболее популярных операций:
Насчет статистики можно сказать, что нагрузка на сеть Bitshares по количеству транзакций сравнима с нагрузкой на сеть Bitcoin или Ethereum. Более того, в некоторые моменты 2018 года платформа Bitshares обрабатывала больше транзакций, чем Bitcoin и Ethereum вместе взятые. А результаты нагрузочного тестирования показывают, что максимальная пропускная способность сети Bitshares в сотни раз превосходит максимальную пропускную способность сетей Bitcoin и Ethereum.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/af3/345/8f7/af33458f7e1263ef9390b20f701f5f61.png)
По данным аналитического ресурса blocktivity.info на момент июля 2018 года платформа Bitshares обрабатывает больше 60% общего количества транзакций, подтвержденных всеми децентрализованными платформами.
Теперь рассмотрим одну важную архитектурную особенность протокола Bitshares, которая помогает достичь настолько высокой пропускной способности.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/433/3f1/fa4/4333f1fa4090fa9333fe1784034f001d.png)
Слева на схеме изображен способ организации базы данных под названием блокчейн, с помощью которого обычно организовано хранение всей истории транзакций. Справа изображен другой способ организации базы данных — Ledger. С его помощью обычно организовано хранение соответствий между идентификаторами и состояниями (например, аккаунт и его баланс).
Свойства блокчейна позволяют легко проверить целостность базы данных и историю ее изменений, а также легко организовать синхронизацию и достичь консенсуса в децентрализованной среде.
Ledger удобен тем, что он компактным образом хранит последнее состояние базы данных и при этом обеспечивает быстрый поиск, чтение и обновление записей. Именно поэтому они принципиально имеют более высокую пропускную способность. Ledger обычно применяют в централизованных учетных системах.
Идея Bitshares состоит в том, чтобы использовать достоинства обоих способов организации базы данных одновременно. Таким образом, полный узел сети ведет учет одновременно с помощью двух баз данных, организованных по типу Blockchain и Ledger соответственно. При этом узлы синхронизируют данные друг с другом с помощью блоков и обновляют локальную копию блокчейна, а верификацию и принятие транзакций они проводят, ориентируясь на последнее состояние базы данных, которое хранит Ledger. Более того, размер всех данных, которые составляют Ledger, оптимизированы таким образом, что узлы сети держат их в оперативной памяти. Это позволяет существенно ускорить процесс верификации и принятия новых транзакций.
Многие учетные системы используют язык сценариев общего назначения для определения всех операций. Эти учетные системы в конечном итоге используют «бизнес-логический процессор» как виртуальную машину, и все транзакции определяются как скрипты, которые будут запускаться виртуальной машиной. Этот подход использует механизмы синхронизации потоков реального процессора и объединяет их, выполняя все инструкции через виртуальный процессор. Виртуальный процессор даже с компиляцией Just-In-Time всегда будет медленнее, чем реальный процессор, но итоговый темп вычислений – не единственная проблема подхода, когда все является скриптом.
Когда транзакции определены на таком низком уровне, это означает, что большая часть статических проверок и криптографических преобразований остаются в бизнес-логической обработке, и общая пропускная способность падает. Для повышения производительности учетной системы и быстрого выполнения бизнес логики нужно вынести все статические проверки в том числе все криптографические преобразования за рамки модуля бизнес-логики.
Еще одним шагом оптимизации является хранение данных конечного состояния учетной системы в оперативной памяти. Это означает, что процессор бизнес-логики может быстро следовать по указателям на память и напрямую получать нужные ему данные, а не вынужден выполнять затратные по времени запросы к базе данных. Это также означает, что данные могут быть доступны без копирования, и что данные могут быть изменены прямо на своем месте. Эта оптимизация обеспечивает прирост производительности по сравнению с использованием подхода, основанного на базе данных.
Таким образом, для создания учетной системы с высокой производительностью не требует сложных технологий и разделения процессов среди узлов сети. Все, что необходимо для создания высокопроизводительного валидатора, заключается в отделении всех независимых вычислений от основной бизнес-логики, выполнение ее в одном потоке без прерываний на синхронизацию и хранение всех зависимостей верификации в оперативной памяти.
Выше было отмечено, что учетная система Bitshares использует аккаунты и балансы, в отличие от Биткоина, где учет ведется на основании непотраченных выходов транзакции. Повысить уровень конфиденциальности на платформе Bitshares — это нетривиальная задача, поскольку в случае аккаунтов и балансов еще проще деанонимизировать пользователей, чем в Биткоине.
Но разработчики Bitshares решили эту задачу интересным образом. Они реализовали возможность задавать несколько входов и выходов в рамках одной операции. Теперь можно включать много входов и выходов в одну транзакцию, что усложняет анализ денежных потоков и повышает конфиденциальность пользователей.
Кроме того, эти операции по умолчанию используют такие методики, как Confidential Transaction и Stealth Addresses. Confidential Transaction скрывает суммы на входах и выходах операции, но при этом использует доказательство того, что сумма выходов не превышает сумму входов. А Stealth Addresses скрывает связь между публичным ключем, который используется как идентификатор получателя, и адресом, который фактически указывается в выходе транзакции.
В Bitshares по умолчанию используются обычные (не конфиденциальные) платежи, но при желании пользователи могут использовать Stealth Transfers. Таким образом, учет монет на платформе ведется двумя разными способами.
Существует такое понятие, как перевод монет из одного способа учета в другой. Для этого реализованы отдельные операции:
Понятное дело, что эти операции по объему данных больше обычных и, соответственно, требуют большей комиссии.
Примечательно, что кто угодно может посчитать, сколько монет ушло в скрытый оборот, поэтому существует такое понятие, как Stealth supply (количество монет в скрытом обороте). Но есть один практический недостаток опции конфиденциальности в Bitshares на данный момент (июль 2018). Дело в том, что до сих пор нет удобных графических интерфейсов для простой работы в режиме повышенной конфиденциальности.
— Поддерживает ли Bitshares возможность задания произвольных условий траты монет, например, с помощью Bitcoin Script?
Нет, текущая версия протокола не поддерживает такую функциональность. Вряд ли она будет добавлена, потому что в Bitshares удобнее всего будет создавать новые типы операций и вводить в последующих обновлениях протокола.
— Существуют ли реализации облегченных узлов для сети Bitshares, которые похожи, например, на SPV узлы для сети Биткоин?
На данный момент нет. Кроме того, технически они будут сложнее, чем SPV в Биткоине, потому что здесь используется DPoS, а не PoW, который устроен очень просто. Вместо облегченного узла можно использовать приложения, которые подключаются к доверенным узлам.
— Какой период формирования блока на платформе Bitshares?
На момент 2018 года это 3 секунды. Интересно, что период формирования блока можно настраивать без обновления протокола.
— Если зарегистрировать красивое имя аккаунта на платформе Bitshares, можно ли его продать другому пользователю?
Да, действительно, такая опция есть и она хорошо работает.
Идея протокола Bitshares состоит в создании инструмента, с помощью которого можно было бы торговать разными активами и валютами в децентрализованной среде, причем без их фактического депонирования на торговую площадку. Сама идея принадлежит программисту по имени Daniel Larimer. Он предложил ее в 2013 году и активно обсуждал на форумах в течении пяти недель. Так Daniel Larimer познакомился с еще одним активным криптовалютным деятелем по имени Charles Hoskinson, который помог проработать бизнес-план и привлечь инвестиции.
![image](https://habrastorage.org/getpro/habr/post_images/207/401/857/207401857b6245fcdc6779ae5b12a7f3.png)
Дэниэл Лаример в школьной столовой
Назначение платформы Bitshares
Daniel Larimer, также известный под ником Bytemaster, является главным идеологом и разработчиком протокола. Платформа Bitshares позволяет кому угодно создавать user issued assets (UIA), или цифровые токены. Таким образом, на платформе учитывается базовая валюта, т. е. криптовалюта с тикером BTS и множество пользовательских токенов.
Протокол реализует децентрализованную биржу, где этими цифровыми активами можно торговать. При проектировании учетной системы и механизма достижения консенсуса разработчики сделали большой упор на пропускную способность. Как результат, Bitshares позиционирует себя как децентрализованная альтернатива учетной системе Visa. В то время как Visa заявляет, что может обрабатывать пару десятков тысяч транзакций в секунду, Bitshares говорит о способности обрабатывать сто тысяч транзакций в секунду, причем децентрализованным образом, с открытой базой данных и возможностью аудита.
Кроме этого, Bitshares позиционирует себя как платформа смарт-контрактов. Правда, смарт-контракты здесь предустановленные и их количество ограничено — реализованы наиболее популярные контракты. Но они более энергоэффективные и, соответственно, обходятся дешевле в отношении комиссий.
Еще одной особенностью платформы является поддержка платежей с повышенным уровнем конфиденциальности пользователей, которые можно использовать опционально. В Bitshares эта технология называется Stealth Transfers.
История разработки и запуска
Кратко познакомимся с историей запуска этой децентрализованной платформы.
Объем работ по созданию задуманной платформы был очень большим. Создатели решили начать привлекать людей и распределять монеты будущей криптовалюты заранее, чтобы понять, привлечет ли проект достаточно большое внимание и стоит ли его дальше поддерживать. Так, в ноябре 2013 года, родилась идея Bitshares PTS, что означает protoshares. Суть ее состояла в том, что распределение монет начнется с помощью майнинга на основе простого протокола, а в это время будет разрабатываться полноценная версия Bitshares.
Для реализации Bitshares PTS сделали форк Биткоина (клон репозитория с исходным кодом), внесли в него мелкие правки и запустили новую сеть. Все, кто был заинтересован в проекте, могли установить себе на компьютер полный узел сети Bitshares PTS, добывать монеты, обмениваться и торговать ими. Конкуренция за добычу этих монет росла, и совсем скоро участникам пришлось объединяться в майнинговые пулы.
Позже разработчиками был представлен протокол Bitshares версии 1.0 и была заранее объявлена дата выпуска последнего блока в блокчейне Bitshares PTS. Поскольку новая версия протокола написана почти с нуля и использует совершенно новые форматы данных, то обновление имеет свои особенности. Делается снимок состояния всех непотраченных монет на момент последнего блока старого блокчейна и переносится в Genesis Block нового блокчейна. Получается, что все соответствия между открытыми ключами и балансами сохраняются, т. е. можно продолжать пользоваться монетами, используя те же личные ключи. Таким образом, 14 декабря 2014 года пользователи перешли на новую версию протокола, где консенсус уже достигается по правилам delegated proof-of-stake, а майнинг и эмиссия новых монет не предусмотрены.
В октябре 2015 года было еще одно крупное обновление протокола Bitshares до версии 2.0, которое прошло подобным образом.
Стоит отметить, что разработчики Bitshares создали само ядро децентрализованной платформы в рамках отдельного проекта под названием Graphene. Graphene — это основа для создания децентрализованных учетных систем следующего поколения. Кроме Bitshares, Graphene лег в основу нескольких других проектов.
Модель аккаунтов
Теперь рассмотрим, как устроены аккаунты в протоколе Bitshares 2.0. Здесь используется криптография на эллиптических кривых, причем сама кривая точно такая же, как в протоколе Биткоин. Есть формат адресов, который использует хеш-значение открытого ключа, систему счисления по основанию 58, префикс BTS и не содержит контрольную сумму. Но этот формат используется редко, поскольку общая база данных платформы оптимизирована таким образом, что каждый объект, в том числе и аккаунт пользователя, имеет собственный уникальный идентификатор, который фактически является целым числом размером 8 байт (или 64 бита). В обычных операциях отправки платежа указывается именно такой идентификатор аккаунта. Кроме того, протокол поддерживает регистрацию уникальных имен. Похожую функциональность впервые реализовали в протоколе Namecoin. Таким образом, в Bitshares можно зарегистрировать удобную для восприятия человеком строку, которая будет уникальной в рамках соответствующего блокчейна, и привязать к своему аккаунту, чтобы использовать это имя вместо Account ID.
Достижение консенсуса на основе DPoS
Как было отмечено ранее, правила работы протокола DPoS предполагают, что все пользователи могут принимать участие в достижении консенсуса, выбирая валидаторов посредством голосования. В процессе голосования вес голоса пользователя определяется его балансом в базовой валюте. Формирование блоков выполняется подмножеством избранных валидаторов. В рамках протокола Bitshares валидатор называется witness (свидетель).
Модель транзакций
Детальнее остановимся модели транзакций в Bitshares.
![image](https://habrastorage.org/getpro/habr/post_images/283/9c7/54d/2839c754da7920046c2fa52c8dd49bea.png)
На схеме видно, что тело транзакции состоит из пяти основных полей. Первые два поля транзакции необходимы для того, чтобы привязать ее к определенному блоку. Это нужно, чтобы определить цепочку блоков, в которую эта транзакция может быть добавлена, поскольку по правилам протокола транзакция не может быть подтверждена в той цепочке, к которой не привязана. Поле expiration_time задает время, до которого транзакция может быть добавлена в блок. Если она не была подтверждена до наступления этого времени, то она считается невалидной и уже не может быть включена в блокчейн.
Поле operations_veсtor является особенным. Эта особенность состоит в том, что в него можно поместить много разных операций. Операция — это еще один ключевой объект в протоколе Bitshares. Назовем несколько самых популярных типов операций: transfer (перевод), account_update (обновление аккаунта), asset issue (выпуск токена) и order (торговое предложение). Каждая операция имеет свой формат и необходимые параметры. Например, операция transfer требует указания аккаунта отправителя, типа актива, суммы перевода и аккаунта получателя. Сами операции независимы друг от друга, но могут быть выполнены только вместе, если транзакция будет принята.
Поле extensions нужно, чтобы текущая версия программного обеспечения могла обрабатывать транзакции новой версии, где могут быть добавлены дополнительные поля. Конечно же, старое ПО не будет знать, как правильно верифицировать дополнительные поля новых транзакций, но хотя бы сможет корректно обрабатывать транзакции согласно старым правилам.
Это формат неподписанной транзакции. Для того чтобы транзакцию правильно подписать, нужно проанализировать все операции из поля operations_veсtor и составить список аккаунтов, которые должны подтвердить данную транзакцию. Тогда станет ясно, какими ключами нужно подписывать транзакцию. Все необходимые подписи помещаются в отдельное поле — signatures. Если не будет хватать хотя бы одной подписи, то вся транзакция будет считаться неправильной.
Отметим, что за счет оптимизации размера идентификаторов финальный размер транзакции, которая содержит одну операцию будет равен приблизительно 100 байт. Это действительно очень компактная транзакция, если сравнить ее с транзакцией в других протоколах.
Что касается комиссионных сборов, то в протоколе Bitshares реализован особый подход. Каждая операция требует определенной оплаты, которая снимается с баланса аккаунта инициатора в момент подтверждения транзакции. Комиссия за осуществление операций может быть постоянной, а может меняться. В качество грубого сравнения можно отметить, что комиссии за обычные переводы и торговлю значительно ниже, чем комиссии за выпуск новых активов и регистрацию нового аккаунта.
Decentralised asset exchange
Теперь разберемся, как работает торговля активами, которые выпущены и учитываются на платформе Bitshares. Пользователь может составить транзакцию с такой операцией, где он заявляет, что готов менять один актив на другой актив в определенном соотношении и на определенную сумму. Эта транзакция распространяется по сети и получает подтверждение, после чего другой пользователь может таким же образом заявить, что хочет менять те же активы в том же соотношении. В момент подтверждения второй транзакции, согласно протоколу, обновляются балансы этих двух пользователей, т. е. фактически совершается обмен активами, на основании того, что оба пользователя подписали заявления об обмене, которые удовлетворяют друг друга.
Поскольку такая торговля осуществляется на базе децентрализованной учетной системы, эта торговая площадка называется децентрализованной биржей.
Гибкость управления аккаунтами
Еще одной важной особенностью протокола Bitshares является возможность гибкого управления аккаунтами. Система динамических разрешений аккаунта (dynamic account permissions) позволяет задать управление аккаунтом по нескольким ключам, по принципу multisignature. Устроено это так, что каждый аккаунт может управляться взвешенной комбинацией других аккаунтов или ключей электронной подписи. Такой подход позволяет создать иерархическую структуру управления, организация которой подобна системе разрешений в реальной жизни. Получается, что можно организовать многопользовательское управление аккаунтом и его балансами, где каждый пользователь будет иметь определенный вес в принятии решения. Причем для проведения разных операций можно установить разные критерии. Такой механизм управления позволяет значительно снизить риски кражи активов и потери контроля над аккаунтом.
![image](https://habrastorage.org/getpro/habr/post_images/bd5/a46/3b1/bd5a463b1a50a74c3c9f885d6eccb782.png)
Представим это схематично. На вершине иерархии есть аккаунт, от имени которого невозможно заверить транзакцию одним ключом. Это можно сделать только по подтверждению нескольких других аккаунтов и ключей. Участников нижних уровней иерархии обычно называют подписантами (signers). Каждый из них имеет свой вес в подтверждении операции. Например, на данной схеме подписанты имеют вес 25, 40, 35 и 40 единиц, а необходимый порог для подтверждения определенного типа операций может быть 50, 60 или 70 единиц. В то же самое время для других типов операций может иметь место другое распределение весов и другое пороговое значение.
Как это работает на уровне транзакций? Один из подписантов создает транзакцию с определенными операциями и заверяет от имени своего аккаунта. Транзакция подтверждается, но операции, которые в нее входят, не выполняются, а находятся в режиме ожидания подтверждения. Тогда другие подписанты видят предложение и могут либо подтвердить его, либо отклонить это предложение от имени своего аккаунта с помощью транзакций, содержащих специальные операции.
Эмиссия UIA
Детальнее разберем особенности выпуска пользовательских активов на платформе Bitshares. Кто угодно может сформировать транзакцию с операцией создания нового актива, заплатить определенную комиссию, задать параметры этого актива и начать эмиссию соответствующих токенов. Эта функциональность протокола реализована в виде предустановленного смарт-контракта и имеет некоторые особенности.
По желанию эмитента можно удовлетворить требованиям KYC (Know Your Customer – знай своего клиента) с помощью механизма white list (список разрешенных аккаунтов) и дополнительного подтверждения (approve) эмитента. White list содержит аккаунты, которым эмитент актива дает разрешение получать и держать его токены. А механизм дополнительного подтверждения позволяет эмитенту контролировать каждую транзакцию по переводу или торговле токенами (он может отклонить или одобрить каждую транзакцию с его активом).
Кроме того, эмитент может ограничить торговлю токенами и разрешить только хранение и переводы, или ограничить переводы, а разрешить только торговлю. Эмитент также может установить дополнительные комиссии на переводы и торговлю токенами.
Еще одна особенность состоит в том, что эмитент может активировать функцию изымания и перераспределения токенов. Это работает для случаев, когда нужно поддерживать внешние механизмы осуждения сделок и откатывания платежей. Стоит также отметить, что все настройки пользовательских активов задаются в виде параметров смарт-контракта и эмитент задает какие свойства он может менять, а какие будут постоянными. Например он может ограничить себя в дополнительной эмиссии токенов, а может оставить возможность произвольного выпуска. И эти параметры контракта будут видны всем пользователям.
Интересное свойство токенов, которые выпущены на платформе Bitshares состоит в том, что при совершении операций с ними пользователь может оплачивать комиссию либо базовой валютой либо этими самыми токенами. Конвертация выполняется на основании обменного курса, который задает эмитент.
Механизм голосований
При изучении платформы Bitshares обязательно нужно упомянуть о механизме, который помогает принимать решения в децентрализованной среде — это голосование. Голосованием избираются члены комитета (committee members), валидаторы (witnesses) и разработчики (workers). Члены комитета нужны, чтобы голосовать за изменение некоторых параметров протокола, таких как комиссии, количество валидаторов и т. п. Валидаторы, они же делегаты, нужны, чтобы верифицировать транзакции и формировать блоки. А разработчики предлагают улучшения программного обеспечения. Если они набирают достаточное количество голосов и укладываются в сроки по разработке, то получают вознаграждение.
При голосовании вес голоса каждого аккаунта пропорционален его балансу в базовой валюте. При этом поддерживается опция proxy voting, которая позволяет отдать свой голос другому избирателю. Это удобно в случаях, когда пользователь сам не знает, за кого из кандидатов лучше голосовать, и отдает это право более компетентному пользователю. Вообще, голосование очень важно для обеспечения высокой надежности платформы Bitshares.
Механизм комиссий
Теперь посмотрим на механизм сбора комиссий за транзакции и вознаграждения активных участников сети. Существует такой баланс, который не принадлежит никому из пользователей платформы, а распоряжаться им можно исключительно по правилам протокола. Этот баланс называется Reserve Pool. Правила предполагают, что комиссионные сборы за все операции со всех аккаунтов попадают в Reserve Pool. На аккаунты валидаторов и разработчиков выплачивается вознаграждение из Reserve Pool, как процент от его баланса. Кроме этого, на сбор и распространение комиссионных плат могут накладываться правила реферальной программы, которую также поддерживает платформа (про нее вы можете прочитать отдельно).
![image](https://habrastorage.org/getpro/habr/post_images/0f4/af7/89b/0f4af789b7043518054c16d090fee01f.png)
Стоит упомянуть о максимальном количестве монет базовой валюты. Всего выпущено 3.6 млрд монет и дополнительная эмиссия не предусмотрена. При этом на момент 2018 года около 2.6 млрд монет находятся в свободном обороте, а около 1 млрд находятся в Reserve Pool.
SmartCoins
До этого мы говорили про смарт-контракт, который реализует обычные токены, а сейчас поговорим про другой смарт-контракт, который реализует market pegged assets, токены которые привязаны по цене к какому-либо внешнему активу. Их также называют SmartCoins. Работает это по принципу contract for difference, т. е. контракт на разницу. Соответственно, эмитировать эти токены может кто угодно, просто замораживая определенную залоговую сумму, например в базовой валюте. Коэффициент залога при этом значительно выше единицы, а рекомендуется 2 и более. Здесь все работает по принципам маржинальной торговли (margin trading), где используются margin positions и автоматические margin calls. Для того чтобы на платформе появились данные о цене актива на внешних рынках, используются доверенные стороны, которые размещают данные о цене актива в блокчейне Bitshares с помощью операции специального типа. В данном случае этими доверенными сторонами являются сами валидаторы.
Формат заголовка блока
Заголовок блока в Bitshares имеет более простую структуру и меньший размер, чем заголовок блока в Биткоине.
![image](https://habrastorage.org/getpro/habr/post_images/fc2/2fd/df6/fc22fddf6fd1abc3260d51c9c0962a2a.png)
Здесь имеются такие поля: идентификатор предыдущего блока, временная метка, идентификатор создателя, хеш-значение входящих транзакций и поле extensions для поддержания совместимости с новыми версиями заголовка блока.
Полный блок будет включать в себя заголовок блока, подпись валидатора, который создал этот блок, и список транзакций, которые входят в этот блок.
В рамках протокола Bitshares существует 4 понятия, которые играют ключевую роль в работе платформы: блоки, транзакции, операции и объекты. Объектами здесь называют аккаунт, актив, баланс, предложение и т. п.
Множество операций и особенности их выполнения
Рассмотрим детальнее понятие операции в контексте данного протоколе. В Bitshares на момент 2018 года около 40 разных типов операций, и с новыми обновлениями протокола можно добавлять новые типы. Операции позволяют инициировать некоторые простые изменения в учетной системе и более сложные механизмы, такие как предустановленные смарт-контракты. Выше уже было сказано, что одна транзакция может содержать несколько операций, которые в случае успеха выполнятся одновременно.
Здесь приведен небольшой список наиболее популярных операций:
- transfer_operation переводит определенный актив с баланса одного аккаунта на другой;
- limit_order_create_operation создает объект заявки по обмену активов;limit_order_cancel_operation отменяет такую заявку;
- fill_order_operation выполняется автоматически, когда две заявки удовлетворяют друг другу, и она не требует создания транзакции, поэтому ее также называют виртуальной операцией;
- account_create_operation создает обычный аккаунт пользователя;
- blind_transfer_operation совершает конфиденциальный платеж;
- asset_create_operation создает объект нового актива;
- asset_update_operation изменяет параметры смарт-контракта существующего токена;
- asset_issue_operation эмитирует токены существующего актива;
- witness_create_operation создает аккаунт кандидата валидатора.
Насчет статистики можно сказать, что нагрузка на сеть Bitshares по количеству транзакций сравнима с нагрузкой на сеть Bitcoin или Ethereum. Более того, в некоторые моменты 2018 года платформа Bitshares обрабатывала больше транзакций, чем Bitcoin и Ethereum вместе взятые. А результаты нагрузочного тестирования показывают, что максимальная пропускная способность сети Bitshares в сотни раз превосходит максимальную пропускную способность сетей Bitcoin и Ethereum.
![image](https://habrastorage.org/getpro/habr/post_images/af3/345/8f7/af33458f7e1263ef9390b20f701f5f61.png)
По данным аналитического ресурса blocktivity.info на момент июля 2018 года платформа Bitshares обрабатывает больше 60% общего количества транзакций, подтвержденных всеми децентрализованными платформами.
Организация базы данных
Теперь рассмотрим одну важную архитектурную особенность протокола Bitshares, которая помогает достичь настолько высокой пропускной способности.
![image](https://habrastorage.org/getpro/habr/post_images/433/3f1/fa4/4333f1fa4090fa9333fe1784034f001d.png)
Слева на схеме изображен способ организации базы данных под названием блокчейн, с помощью которого обычно организовано хранение всей истории транзакций. Справа изображен другой способ организации базы данных — Ledger. С его помощью обычно организовано хранение соответствий между идентификаторами и состояниями (например, аккаунт и его баланс).
Свойства блокчейна позволяют легко проверить целостность базы данных и историю ее изменений, а также легко организовать синхронизацию и достичь консенсуса в децентрализованной среде.
Ledger удобен тем, что он компактным образом хранит последнее состояние базы данных и при этом обеспечивает быстрый поиск, чтение и обновление записей. Именно поэтому они принципиально имеют более высокую пропускную способность. Ledger обычно применяют в централизованных учетных системах.
Идея Bitshares состоит в том, чтобы использовать достоинства обоих способов организации базы данных одновременно. Таким образом, полный узел сети ведет учет одновременно с помощью двух баз данных, организованных по типу Blockchain и Ledger соответственно. При этом узлы синхронизируют данные друг с другом с помощью блоков и обновляют локальную копию блокчейна, а верификацию и принятие транзакций они проводят, ориентируясь на последнее состояние базы данных, которое хранит Ledger. Более того, размер всех данных, которые составляют Ledger, оптимизированы таким образом, что узлы сети держат их в оперативной памяти. Это позволяет существенно ускорить процесс верификации и принятия новых транзакций.
Оптимизация выполнения бизнес логики
Многие учетные системы используют язык сценариев общего назначения для определения всех операций. Эти учетные системы в конечном итоге используют «бизнес-логический процессор» как виртуальную машину, и все транзакции определяются как скрипты, которые будут запускаться виртуальной машиной. Этот подход использует механизмы синхронизации потоков реального процессора и объединяет их, выполняя все инструкции через виртуальный процессор. Виртуальный процессор даже с компиляцией Just-In-Time всегда будет медленнее, чем реальный процессор, но итоговый темп вычислений – не единственная проблема подхода, когда все является скриптом.
Когда транзакции определены на таком низком уровне, это означает, что большая часть статических проверок и криптографических преобразований остаются в бизнес-логической обработке, и общая пропускная способность падает. Для повышения производительности учетной системы и быстрого выполнения бизнес логики нужно вынести все статические проверки в том числе все криптографические преобразования за рамки модуля бизнес-логики.
Еще одним шагом оптимизации является хранение данных конечного состояния учетной системы в оперативной памяти. Это означает, что процессор бизнес-логики может быстро следовать по указателям на память и напрямую получать нужные ему данные, а не вынужден выполнять затратные по времени запросы к базе данных. Это также означает, что данные могут быть доступны без копирования, и что данные могут быть изменены прямо на своем месте. Эта оптимизация обеспечивает прирост производительности по сравнению с использованием подхода, основанного на базе данных.
Таким образом, для создания учетной системы с высокой производительностью не требует сложных технологий и разделения процессов среди узлов сети. Все, что необходимо для создания высокопроизводительного валидатора, заключается в отделении всех независимых вычислений от основной бизнес-логики, выполнение ее в одном потоке без прерываний на синхронизацию и хранение всех зависимостей верификации в оперативной памяти.
Опции повышения конфиденциальности пользователей
Выше было отмечено, что учетная система Bitshares использует аккаунты и балансы, в отличие от Биткоина, где учет ведется на основании непотраченных выходов транзакции. Повысить уровень конфиденциальности на платформе Bitshares — это нетривиальная задача, поскольку в случае аккаунтов и балансов еще проще деанонимизировать пользователей, чем в Биткоине.
Но разработчики Bitshares решили эту задачу интересным образом. Они реализовали возможность задавать несколько входов и выходов в рамках одной операции. Теперь можно включать много входов и выходов в одну транзакцию, что усложняет анализ денежных потоков и повышает конфиденциальность пользователей.
Кроме того, эти операции по умолчанию используют такие методики, как Confidential Transaction и Stealth Addresses. Confidential Transaction скрывает суммы на входах и выходах операции, но при этом использует доказательство того, что сумма выходов не превышает сумму входов. А Stealth Addresses скрывает связь между публичным ключем, который используется как идентификатор получателя, и адресом, который фактически указывается в выходе транзакции.
В Bitshares по умолчанию используются обычные (не конфиденциальные) платежи, но при желании пользователи могут использовать Stealth Transfers. Таким образом, учет монет на платформе ведется двумя разными способами.
Существует такое понятие, как перевод монет из одного способа учета в другой. Для этого реализованы отдельные операции:
- transfer_to_blind_operation используется для перевода монет из открытого оборота в скрытый;
- blind_transfer_operation для перевода монет скрытым образом, а transfer_from_blind_operation для перевода монет из скрытого оборота в открытый.
Понятное дело, что эти операции по объему данных больше обычных и, соответственно, требуют большей комиссии.
Примечательно, что кто угодно может посчитать, сколько монет ушло в скрытый оборот, поэтому существует такое понятие, как Stealth supply (количество монет в скрытом обороте). Но есть один практический недостаток опции конфиденциальности в Bitshares на данный момент (июль 2018). Дело в том, что до сих пор нет удобных графических интерфейсов для простой работы в режиме повышенной конфиденциальности.
Часто задаваемые вопросы
— Поддерживает ли Bitshares возможность задания произвольных условий траты монет, например, с помощью Bitcoin Script?
Нет, текущая версия протокола не поддерживает такую функциональность. Вряд ли она будет добавлена, потому что в Bitshares удобнее всего будет создавать новые типы операций и вводить в последующих обновлениях протокола.
— Существуют ли реализации облегченных узлов для сети Bitshares, которые похожи, например, на SPV узлы для сети Биткоин?
На данный момент нет. Кроме того, технически они будут сложнее, чем SPV в Биткоине, потому что здесь используется DPoS, а не PoW, который устроен очень просто. Вместо облегченного узла можно использовать приложения, которые подключаются к доверенным узлам.
— Какой период формирования блока на платформе Bitshares?
На момент 2018 года это 3 секунды. Интересно, что период формирования блока можно настраивать без обновления протокола.
— Если зарегистрировать красивое имя аккаунта на платформе Bitshares, можно ли его продать другому пользователю?
Да, действительно, такая опция есть и она хорошо работает.