Стресс-тест Bitshares.
Представляем вашему вниманию уникальный материал, посвященный выполнению стресс-теста при реализации смарт-контрактов и транзакций в системе Bitshares 2.0. Выполненный специалистами немецкого подразделения BitShares Europe, данный текст будет интерсен всем энтузиастам Blockchain технологий. Здесь вы найдете исчерпывающую информацию о возможностях системы и узнаете, почему Bitshares 2.0 является одной из наиболее передовых систем при реализации смарт-контрактов. BitShares 2.0 - это децентрализованная платформа промышленного уровня, созданная для реализации высокопроизводительных финансовых смарт-контрактов. Чтобы показать возможности системы в этой области, был проведен стресс-тест на публичной тестовой сети. Тестовая сеть была развернута с той же базой кода, которая используется для сети BitShares, имеющей узлы по всему миру. Были выполнены минимальные изменения, с целью правильно отличать тестовую сеть от продуктивной сети. При проведении стресс-теста был предложен и принят многоступенчатый стресс-тест, изменяющий максимальный размер транзакции, максимальный размер блока и время подтверждения блока в рабочей сети во время стресс-теста.
BitShares 2.0 - это децентрализованная платформа промышленного уровня, созданная для реализации высокопроизводительных финансовых смарт-контрактов. Чтобы показать возможности системы в этой области, был проведен стресс-тест на публичной тестовой сети. Тестовая сеть была развернута с той же базой кода, которая используется для сети BitShares, имеющей узлы по всему миру. Были выполнены минимальные изменения, с целью правильно отличать тестовую сеть от продуктивной сети. При проведении стресс-теста был предложен и принят многоступенчатый стресс-тест, изменяющий максимальный размер транзакции, максимальный размер блока и время подтверждения блока в рабочей сети во время стресс-теста. Валидаторы были обновлены с помощью взвешенного голосования.
1. Введение
Платформа Graphene была разработана Cryptonomex специально для BitShares. Она претерпела множество изменений и была расширена, чтобы оставаться на технологической вершине blockchain. Одна из ее публичных версий, BitShares, публично торгуется более двух лет и еще не продемонстрировала свой максимальный потенциал в плане пропускной способности. По этой причине была развернута тестовая сеть, которая использует ту же технологию, на которой базируется BitShares, с конкретной целью - тестирование алгоритмов, применимости, а также масштабируемость сети.
Термин «масштабируемость» относится к количеству транзакций, которые могут быть применены к блочной цепи в масштабе. Необходимо учитывать несколько факторов, чтобы правильно интерпретировать любые результаты, полученные при тестировании. Среди них - спецификация развернутых серверов (ЦП / ОЗУ), которые создают блоки (валидаторы), взаимосвязь узлов в сети Peer-2-Peer, время округления и задержку, а также географическое расстояние между узлами.
Кроме того, количество валидаторов не влияет на пропускную способность до тех пор, пока активные валидаторы могут соответствовать требованиям сети. Все активные валидаторы обрабатываются одинаково и получают слот для создания своих блоков в каждом раунде [1]. Увеличение количества валидаторов (свидетелей) связано с повышенной устойчивостью к отказам сервера, но также приводит к увеличению длительности окончательных транзакции [1], которая описывает их абсолютную необратимость после того, как 2/3 всех валидаторов одобрили данный блок и его транзакции.
Целью публичного стресс-теста, выполняемого на тестовой сети на основе Graphene, заключалась в определении ограничивающих факторов и узких мест при масштабировании с участием нескольких сторон. Кроме того, мы хотели продемонстрировать масштабируемость современных технологий blockchain.
2. Подготовка к тесту.
Была развернута разделенная блок-цепь для публичной тестовой сети, которая была запущена в январе 2016 года. Эта блок-цепь была открыта для доступа, и каждая новая учетная запись создавалась на пожертвования некоторых основных активов под названием TEST. К моменту стресс-теста блокчейн имел более 6 800 000 блоков и более 25 000 000 операций.
2.1. Программное обеспечение.
Программное обеспечение для тестового сервера поддерживалось BitShares Europe и доступно для просмотра на github.com. Она практически идентична базе кода Graphene, на котором построена BitShares, но с незначительными изменениями, приспособленными для разделенной блочной цепи.
Инструменты, разработанные для стресс-теста и анализа, в большинстве своем доступны в отдельных репозиториях.
2.2. Валидаторы.
Работа валидаторов заключается в сборе неподтвержденных и ожидающих выполнения транзакций, полученных в сети Peer-2-Peer, их проверки и публикации вашего одобрения в виде подписанного блока, который несет эти транзакции.
Учитывая, что тестовая сеть Graphene также использует делегированное доказательство ставки (DPOS) в качестве своего консенсусного механизма, валидаторы (производители блоков) могут быть проголосованы и выведены с помощью системы управления на основе ставок [1].
Это позволяет нам:
1. Изменять количество валидаторов;
2. Заменять отказные валидаторы резервными;
3. Выбирать для валидаторов, находящихся ближе географически (если местоположение известно) интервал обслуживания. Этот интервал используется для подсчета всех голосов, сделанных с предыдущего блока, и для тестовой сети устанавливается равным 5 минутам
В начале стресс-теста у нас имеются следующие активные валидаторы:
blckchnd-x Intel Xeon E3, 32GB RAM, barebone, Germany
blckchnd-test Intel Xeon E3, 32GB RAM, barebone, Germany
jim.witness1 Intel XeonA E5, 28-56GB RAM, Azure, South Korea
smailer-5 Intel Xeon E3, 32GB RAM, Germany
init0 Intel Core i7, 32GB RAM, barebone, Germany
init2 Intel Core i7, 32GB RAM, bare bone, Germany
lafona2 Intel Avoton, 32GB RAM, France
delegate.ihashfury Intel Atom C2750, 32GB RAM, barebone, France
f0x Intel Xeon E5, 56GB RAM, Azure, USA
alpha-jpn Intel Xeon E5, 56GB RAM, Azure, Japan
bravo-bra Intel Xeon E5, 56GB RAM, Azure, Brasil
charlie-usa Intel Xeon E5, 56GB RAM, Azure, USA
delta-gbr Intel Xeon E5, 56GB RAM, Azure, UK
rngl4b Intel Xeon E5, 32GB RAM, barebone, Luxembourg
taconator-witness Intel Xeon E5, 24GB RAM, Switzerland
arthur-devling Intel Xeon E5, 39GB RAM, France
fr-blockpay Intel Xeon E5, 256GB RAM, Germany
de-blockpay Intel Xeon E5, 128GB RAM, France
2.3. Справочный узел.
Справочный узел предоставляется BitShares Europe, что позволяет участникам взаимодействовать с сетью Peer-2-Peer без использования собственных полных узлов. Конечная точка доступна по адресу wss: //node.testnet.bitshares.eu и работает на Intel Core i7 с 64 ГБ оперативной памяти, которая имеет два полностью сбалансированных полных узла для работы с трафиком. Интерфейс кошелька доступен по адресу https://testnet.bitshares.eu.
3. Ограничивающие факторы.
В этом разделе мы кратко обсудим ограничивающие факторы, которые были определены еще до начала стресс-теста. Для корректного их описания мы сначала должны изучить различия между блоками, транзакциями и операциями.
Транзакции и операции. В отличие от других блокчейнов, цепочка на основе Graphene позволяет объединить несколько операций в одну транзакцию. Подобный механизм реализован в блокчейне Биткоина, он позволяюет объединить несколько выходов с возможностью последовательно выполнять различные смарт-контракты, предлагаемые последовательностью блоков. Самое простое приложение похоже на функцию множественной отправки Bitcoin, когда один пользователь отправляет биткойны на несколько адресов. В случае Graphene/BitShares пользователь также будет подписывать одну транзакцию одной подписью, но транзакция будет включать множественные операции перевода. Кроме того, пользователь может поместить комбинацию операций торговли/передачи/заимствования (или чего-то еще) в одну транзакцию, чтобы гарантировать их последовательное выполнение.
Как можно заметить, основное различие между объединением многих транзакций в блок и объединением многих операций в транзакции состоит в том, что в последнем случае операции будут выполняться последовательно и что только одна авторизация (например, подпись) необходима для проверки и подтверждения.
Это различие имеет важное значение, так как наши результаты теста четко разграничивают пропускную способность операций и сквозные транзакции.
Проверка подписи. Подобно другим технологиям блокчейн (например, биткойн), один блок может содержать несколько транзакций. Каждая транзакция подписывается одним или несколькими объектами и, следовательно, требуется, чтобы валидаторы выполняли проверку подписи по эллиптической кривой, а также использовали восстановление с открытым ключом для авторизации. С точки зрения масштабируемости, предельными факторами являются время и ресурсы, необходимые для проверки подписи для данной транзакции, а также время и ресурсы, которые необходимы для добавления транзакций в блок-цепочку и выполнения соответствующего смарт-контракта/операции.
Поскольку технология Graphene построена таким образом, что валидация подписи может быть выполнена независимо от текущего состояния базы данных блокчейн, проверка подписи и восстановление ключей могут быть тривиально распаралеллены с помощью кластера при использовании графического процессора (GPU). Однако, поскольку требуемое программное обеспечение для этой параллельной проверки не было доступно во время стресс-теста, мы ожидаем, что пропускная способность будет значительно выше того что мы можем проверить на графическом процессоре.
По этой причине, а также потому, что мы хотим увидеть ограничивающие факторы при применении проверенных транзакций к блочной цепи, части нашего тестового сценария сосредоточены на создании транзакций, которые несут сотни транзакций передачи только с одной подписи, подлежащей проверке.
Соединение. Очевидно, что глобально распределенная сеть отражает наихудший сценарий, когда дело доходит до задержки между узлами, ограниченными в основном скоростью света и размером планеты. Сеть, размещенная локально, может привести к повышению общей производительности, но не обеспечивает такой же надежности и избыточности, что и глобальная сеть.
Требования к памяти. В предыдущих тестах мы определили значительно возрастающую потребность в памяти для программного обеспечения блокчейн цепей для конечных пользователей. Это в основном было вызвано так называемыми плагинами, которые обрабатывают историю событий по совершенным транзакциям или историю торговли. Эти плагины сохраняют свои данные в памяти по причинам, связанным с производительностью систем. При отключении плагинов программному обеспечению потребовалось всего несколько мегабайт памяти.
Производство транзакций. Чтобы провести стресс-тест в сети, нам нужно произвести фактический стресс, чего нелегко достигнуть в масштабе, необходимом для наших задач. Кроме того, мы хотели смоделировать более или менее реалистичный сценарий, в котором несколько независимых сторон, распределенных по всему земному шару, производят транзакции, каждая из которых пытается превратить их в следующий блок. По этим причинам мы попросили сообщество BitSharesTalk принять участие в стресс-тестировании не только с помощью предоставления узлов проверки по всей планете, но и для получения стрессовых нагрузок.
Сеть Peer-2-Peer. Исходная кодовая база Graphene имеет жестко закодированный предел в своем сетевом коде Peer-2-Peer (не является частью консенсусного протокола blockchain). Это помешало нам достичь более 1000 tps из-за ограничения в количестве транзакций, полученных через сеть Peer-2-Peer. После преодоления этого предела, превышающего тот, что мы хотели достичь в нашем стресс-тесте, мы разрешили проверяющим узлам получать до тысячи транзакций в секунду из сети Peer-2-Peer.
Тем не менее, сетевой код Peer-2-Peer оптимизирован для блочного интервала в пределах около 10 секунд и, таким образом, оставляет множество возможностей для оптимизации, когда речь идет о высокой пропускной способности при низких задержках.
4. Фазы стресс-теста.
Поскольку мы используем Graphene в качестве нашей базовой технологии, большинство параметров блокчейн можно изменять в режиме реального времени без необходимости обновления протокола или жестких рамок.
В отличие от публичной сети BitShares, большая часть доли в публичной тестовой сети принадлежит BitShares Europe, что позволило нам изменять параметры без необходимости координировать работу с другими заинтересованными сторонами. Это дало возможность провести многоступенчатый стресс-тест, который прошел через набор различных параметров блокчейна, постепенно увеличивая количество обработанных транзакций на блочной цепи.
4.1. Изменение параметров Blockchain
Для нашего стресс-теста мы решили сосредоточиться только на трех параметрах используемого блокчейна.
Максимальный размер блока. Этот предел позволил нам изменить размер блоков, которые считаются действительными для сети. Для нашего теста размер был установлен в пределах от 1 до 10 МБ. Ограничивающим фактором является поддерживаемая скорость передачи данных и возможность подключения проверяющих узлов, поскольку блоки необходимо создавать и транслировать в течение определенного временного интервала. Вещательный блок должен быть принят последующим валидатором во времени, иначе последующий блок не может быть привязан к ожидаемому предыдущему должным образом.
Максимальный размер транзакции. Каждый блок может выполнять множественные транзакции и в отличие от многих других технологий blockchain, транзакции на блочных цепях Graphene могут выполнять несколько операций. В нашем тесте мы предполагаем, что большая часть операций - это простые передачи размером 22 байта. Вместе с заголовком простая транзакция с одиночной передачей (без знака) составляет 36 байт. Во время стресс-теста мы допустили, что от 50 до 1000 операций переноса будут объединены в одну транзакцию.
Время подтверждения блока. Время подтверждения блока - это ожидаемое время работы между блоками. Мы начали с 3-секундного блочного интервала, сократив его до 1 с. В этот момент мы ожидали, что сеть потеряет свою надежность из-за ее глобального распределения, а также из-за длительности передачи в оба конца вместе с необходимостью передавать непустые блоки, на что может потребоваться значительно больше времени.
Эти параметры могут быть изменены решением комитета через динамическую учетную запись с несколькими подписями. Члены комитета голосуют коллективно с акционерами (с 50% + 1голос), и комитет может изменять параметры блокчейна по одной транзакции. Процедура требует, чтобы члены комитета одобрили/подписали транзакцию, предлагающую изменения. После утверждения параметры изменяются в течение создания следующего блока.
4.2. Протестированные наборы параметров.
Проводимый стресс-тест состоял из семи фаз. Как видно из таблицы, последние две фазы изменили время подтверждения блока и резко уменьшили максимальный размер блока, чтобы дать хотя бы какую-то гарантию их своевременного выполнения. Независимо от того, распространяется ли блок своевременно свидетелям, он находится вне прямого контроля тестировщиков, поскольку мы работаем в общедоступной и глобально распределенной сетью Peer-2-Peer. phase max. tx size max. block size block interval 1 1 kb 1 MB 3 s 2 1 kb 5 MB 3 s 3 10 kb 5 MB 3 s 4 100 kb 5 MB 3 s 5 100 kb 1 MB 2 s 6 100 kb 1 MB 10 s 7 100 kb 1 MB 1 s
5. Результаты.
5.1. Обработанные транзакции/операции.
Во время нашего 4-х часового стресс-теста между 14:00 и 18:00, блокчейн обработал 4 011 110 транзакций и 16 398 274 операций в 4233 блоках. Мы варьировали три параметра блокчейн, включая время подтверждения блока от 1 до 10 с. 5.2. Пропускная способность транзакции/операции. После стресс-теста, когда транзакции и операции были добавлены в блокчейн, мы рассмотрели блокировку в режиме оффлайн. Учитывая, что транзакции и операции записываются в блочной цепи, мы начали с изучения общих результатов.
Как видно из рис.1, выделяется несколько периодов активности. Очевидно, что большинство транзакций начали передаваться с 15:00, в среднем совершено было примерно 1000 транзакций. Мы также отмечаем, что пропускная способность не была постоянной во время стресс-теста, что можно объяснить транзакциями, требующими некоторого времени для распространения через сеть Peer-2-Peer.
На рис. 1 видно, что участники постоянно пытались модифицировать свой метод создания спама (увеличивая количество транзакций или связывая больше операций за транзакцию) до тех пор, пока не был достигнут максимум обработанных операций на блок, что произошло примерно в 16:40. Затем участникам было предложено увеличить количество создаваемых транзакций, а потому обработанные операции на блок впоследствии уменьшились.
Самое интересное заключается в том, что в течение всего стресс-теста мы наблюдали несколько коротких пиков проделанных транзакций и операций. Как выяснилось, причины этих пиков могут быть объяснены одним участником, который решил использовать свой блок для проверки транзакций. Таким образом, он пропустил распространение транзакций через сеть Peer-2-Peer как подтверждение того, что сетевой код представляет собой одно из наиболее узких мест.
Рисунок 1: Обзор пропускной способности ops / s и txs / s в течение всего стресс-теста.
Рисунок 4: Максимальные значения ops/s во время стресс-теста.
Рисунок 2: Максимальные значения Ops/s во время стресс-теста. На рис. 2, мы приблизили периоды довольно высокой сквозной пропускной способности (2500 транзакций). Здесь мы по-прежнему видим пики, полученные путем пропусков в сети.
Рисунок 3: Максимальные значения Ops/s во время стресс-теста.
Ну и наконец, результаты на рис. 3 показывают, что блокчейн смог обработать в среднем более 8000 операций с блоком при довольно высоких пиках и нерегулярной пропускной способностью блоков. Неравномерность может быть решена путем развертывания аналогичного оборудования, обрабатывающего одно и то же количество транзакций/операций. Мы смогли подтвердить это поведение позже, заменив все валидаторы, кроме одного, что значительно уменьшает дисперсию пропускной способности, как это видно на рис. 4 (выше, справа от рис. 1). Здесь напряжение создавалось одним узлом, подключенным непосредственно к проверяющему узлу, тогда как другой единственный валидатор был подключен только через сеть Peer-2-Peer.
5.3. Время подтверждения блока. После изучения пропускной способности блокчейн мы также протестировали сеть Peer-2-Peer на возможность обрабатывать различное время подтверждения блоков. Напомним, что протестированная нами технология способна изменять различные параметры блокчейна на лету. Одним из этих параметров является время блокировки, которое представляет собой время между созданием блоков при синхронном консенсусном механизме, делегированным DPOS.
Рисунок 5: Максимальные значения Ops/s во время стресс-теста. На рис. 5, мы можем видеть фактическое время подтверждения блока, которое отслеживается блокчейном. Эти значения были получены из каждого заголовка блока, который также содержит метку времени. Небольшие вариации следует ожидать из-за незначительной неточной синхронизации местного времени, в то время как большие отклонения указывают на то, что один или несколько валидаторов пропустили свои блоки. Графики, показанные на рисунке, усредняются более чем на 100 блоков для уменьшения шума.
Мы можем видеть, что во время стресс-теста было протестировано несколько различных временных промежутков для подтверждения блока, от 5 до 2 секунд, затем до 10 с, пока мы не решили также проверить время подтверждения блока со временем 1 с. К сожалению, мы наблюдали картину, когда некоторые свидетели, которые не производили во время стресс-теста больших частей, допускали средние значения в большинстве случаев превышающие целевые показатели. Для нашего следующего стресс-теста мы планируем быть более строгим в замене свидетелей при пропуске ими производимых блоков. В выделенном периоде, когда время подтверждения блока было уменьшено до 1 с., мы можем видеть, что большинство блоков были созданы вовремя, и были отмечены только 3 валидатора, которые не справились с этим временным промежутком (т.е. черные пики продолжались не более 4 с). Это стало для нас большим сюрпризом, так как мы ожидали, что их будет значительно больше.
Рисунок 6: Максимальные значения Ops/s во время стресс-теста.
6. Выводы.
При проведении тестирования мы отметили, что база кода намного более надежна, чем этого можно было ожидать. Создание и проверка блока выполняется достаточно быстро, так что мы можем запускать блокчейн с синхронными подтверждениями блоков в период 1с. без исключения валидаторов.
Очевидно, что код Peer-2-Peer работает хорошо, но результаты показывают, что это может быть одним из узких мест, которые в настоящее время ограничивают нас от дальнейшего продвижения. Вычислительные ресурсы наших валидаторов имеют более чем достаточную отдачу при более высокой пропускной способности, но сетевой код не смог предоставить достаточно данных (например, по транзакциям), чтобы поднять ее во время нашего стресс-теста.
Мы также определили еще одно узкое место при проведении транзакций. Подписание транзакций требует больше ресурсов, поэтому мы будем тщательнее готовиться к следующему стресс-тесту. Этот результат был подтвержден в более поздней частной тестовой сети, где 36 ядер активировались во время теста последовательно. В результате блокчейн легко справился со всеми произведенными транзакциями соответственно увеличению пропускной способности, когда при создании транзакций каждый раз добавлялись дополнительные ядра.
В заключение стоит отметить, что текущий стек программного обеспечения по-прежнему имеет несколько ограничений и границ, которые необходимо оптимизировать для дальнейшего улучшения масштабируемости, ведь фундамент системы разработан таким образом, чтобы обеспечивать еще большую пропускную способность. Наши текущие ограничения касаются исключительно аспектов реализации применительно к сетям, а не к архитектуре программного обеспечения и протоколов.
7. Благодарности.
Мы хотели бы поблагодарить всех, кто участвовал в стресс-тесте, создании транзакций и настройки надежной сети Peer-2-Peer. Выражаем признательность всем, кто помогал в ходе подготовки стресс-теста и оставлял отзывы, которые очень помогли нам при написании этой статьи. Наконец, но не в последнюю очередь мы благодарим за финансовую поддержку, предоставленную всеми, кто предоставил оборудование для стресс-теста, а также BitShares-Munich, предоставившего основной узел API на bithares.eu.
Ждем ваших комментариев и отзывов.
И не забывайте подписываться на телеграм чаты OpenLedger и Genesis Block, чтобы оставаться в курсе последних и самых важных событий в мире криптовалют.