top of page

Платформа Qbit

Qbit - это блокчейн-платформа по работе с множественными активами, ориентированная на конфиденциальность, основанная на настраиваемом консенсусе Proof-of-Stake/Proof-of-Content/Proof-of-Time с принципами UTXO (несвязанные выходы транзакций).

 

Основные функции Qbit:

  • Сущностно-ориентированное управление;

  • Различные виды типизированных транзакций;

  • Schnorr-подписи/мульти-подписи по умолчанию;

  • Поддержка различных схем электронной подписи;

  • Поддержка "из коробки" конфиденциальных транзакций для передачи средств (скрытые транзакции);

  • Возможность определять различные типы активов (токенов) и производить эмиссию;

  • Масштабируемая архитектура;

  • Поддержка атомарных свопов;

  • Сверхбыстрая обработка транзакций;

  • Поддержка мульти-цепочек с принципами шардинга (включая различные параметризованные консенсусы для каждого шарда);

  • Поддержка смарт-контрактов;

  • Быстрая виртуальная машина (QVM) с машинными кодами на основе asm (qASM);

  • Гибкая интеграционная инфраструктура для поддержки альтернативных цепочек и ответвлений (gatekeepers);

  • Инфраструктура поддержки создания DApp (front-to-back);

  • Встроенная поддержка принципов "открытой цифровой организации".

Консенсус

Сеть Qbit поддерживает протокол хронологически-временной синхронизации. Этот p2p протокол гарантирует, что универсальное сетевое время рассчитывается правильно для каждого однорангового узла в сети посредством обмена тайм-тикетами с относительно близкими одноранговыми узлами. И в течение почти постоянного отрезка времени оно должно быть одинаковым для всех узлов сети. Универсальное сетевое время используется для поддержки согласованного протокола с привязкой ко времени.

Proof-of-Time (PoT)

Каждый узел выбирает следующий узел, который будет авторизован для создания следующего блока цепочки (основного или сегмента). Упрощенный общий алгоритм должен быть следующим (применимо к каждому узлу в сети):

  • Каждый узел собирает статус других узлов вместе с собственным статусом в отсортированный список.

  • Получает текущее универсальное сетевое время и использует его в качестве начального значения для генератора монотонных псевдослучайных чисел.

  • Выбирает номер узла из списка.

  • Если выбранный узел является текущим, то в следующем временном интервале (квант времени) узел создает новый блок (блоки) с выбранными транзакциями и транслирует заголовок блока с вычисленным корнем меркла транзакций, поэтому остальная часть сети ожидает этой информации.

  • Проверка доказательства проста - каждый заголовок блока содержит «цикл пиров» или активных пиров, которые вовлечены в консенсус и универсальную отметку времени, которая используется как начальное число для генератора монотонных псевдослучайных чисел, а алгоритм проверки блока таков:

    • Создать отсортированный список пиров из «цикла»;

    • Проинициализировать генератор псевдочлучайных чисел значением временной метки;

    • Сделать псевдослучайное распределение внутри генератора в диапазоне 0 - N, где N - количество пиров в «цикле»;

    • Использовать полученный индекс из распределения, чтобы выбрать соответствующий пир и свериться с источником блока (источник - участник, который утверждает, что создал блок).

Такой подход значительно снизит нагрузку на сеть. Этот факт становится более важным, если учесть, сколько параллельных потоков данных будет обрабатываться внутри сети.

Proof-of-Content (PoC)

Каждый узел в сети, поддерживающий конкретный сегмент или основную цепочку, должен требовать так называемой проверки контента и иметь возможность проверить предыдущую, выполненную предыдущим лидером. Схема вызова выглядит так:


 

 

 

 

Где хеш блока и индекс tx - случайно выбранный блок и индекс транзакции в нем с учетом универсальной временной метки. Это требование проверки контента должно быть решено следующим лидером, чтобы быть уверенным, что контент доступен под контролем текущего лидера. И текущий лидер во время процедуры создания блока должен затребовать проверку контента у лидера СЛЕДУЮЩЕГО блока.

Proof-of-Stake (PoS)

Кроме того, чтобы получить право создавать блоки, узел должен иметь достаточное количество токенов QTT на своем основном адресе (или ключе). Начальная сумма - N токенов. Хэш транзакции с неизрасходованным выводом должен быть добавлен в заголовок блока, а владелец tx должен быть равен источнику (pkey текущего лидера). И последнее действие - сделать подпись для данных заголовка блока и поместить эту подпись в заголовок блока. Вся эта информация будет использоваться для проверки того, что источник является правильным и законным владельцем блока.

Протокол хронологически-временной синхронизации

Для реализации правильного алгоритма консенсуса нам нужны строгие тайминги для синхронизации универсального времени в сети. Буквально каждый узел (включая легкие клиенты) должен поддерживать протокол синхронизации времени.

Хронологически-временная синхронизация основывается на обмене временными метками между доступными узлами. Временная метка должна иметь микросекундную точность.

 

 

 

 

 

 

 

 

 

 

Каждый узел инициирует обмен метками времени по собственному несинхронизированному расписанию. Но циклы обмена не должны превышать 2-х секунд. И отправляет на узлы пакет со своей временной меткой. Узлы назначения должны дать ответы со своими временными метками. Когда ответ получен, исходный узел выполняет следующие действия (см. рис.):

  • Расчет: N5latency = | N1ts - N5ts |

  • Добавление N5ts, N5latency в хроно-карту

  • Расчет временной метки карты (сумма временных меток всех узлов), исключая те узлы, чья временная метка находится между собственной временной меткой +/- N блоков

  • Расчет: median time = timestamps / peers

  • Расчет: universal time = round(median time)

В результате мы получим: универсальное скорректированное время и максимальную задержку в миллисекундах, что дает нам максимальный интервал синхронизации времени.

PoC.png
PoT.png

Платформа Qbit строится на следующих базовых сущностях: транзакции (различных типов) и блоки. Типичная транзакция состоит из одного или нескольких входов, одного или нескольких выходов, включая комиссию. Каждый вход и выход содержит хэш типа "актив", поэтому одна транзакция может содержать несколько активов для передачи с постоянным входящим и исходящим балансом. Транзакции передачи средств - это приватные транзакции со скрытыми суммами (схема обязательств (Pedersen commitments), range proofs). Транзакции не бесплатны - необходимо некоторое количество QBIT для их оплаты.

Основные типы транзакций Qbit:

  • TxCoinBase / "coinbase": транзакция coinbase. Этот тип используется в процессе майнинга или создания блоков. Используется только в основной сети.

  • TxBase / "base": используется в шардах для сбора комиссий за транзакции в блоке. Процесс майнинга или создания блоков.

  • TxBlockBase / "blockbase": специальный тип транзакции, который агрегирует и отправляет на адрес майнера собранную комиссию от процедуры создания блока шардов.

  • TxSpend / "spend": оплата или отправка QBIT или любые другие активы пользователю Qbit (адрес или pkey).

  • TxSpendPrivate / "spend_private": приватная (скрытые суммы) оплата или отправка QBIT или других активов пользователю Qbit (адрес или pkey). Транзакции этого типа в 3 раза (или более) больше по размеру, чем обычные транзакции оплаты. Суммы приватных транзакций скрыты и видны или могут быть запрошены только их получателем.

  • TxFee / "fee": специальный тип, который представляет комиссии в сети Qbit для транзакций DApp, которые находятся в различных шардах.

  • TxAssetType / "asset_type": транзакция, которая создает тип токена с атрибутами (имя, описание, размер, общая сумма).

  • TxAssetEmission / "asset_emission": транзакция, связанная с TxAssetType, которая инициирует фактическую полную или частичную эмиссию. Выпущенные токены отправляются на Qbit адрес её создателя.

  • TxDApp / "dapp": транзакция объявляет экземпляр DApp как объект. Атрибуты: имя, описание, тип шарда, типы экземпляров.

  • TxShard / "shard": тип транзакции, связанный с TxDApp, который создает шард для выбранного DApp.

Расходование или использование несвязанных выходов (UTXO) для соответствующих транзакций, контролируемых  байт-кодом, написанным на QASM, который обрабатывается виртуальной машиной (QVM).

QASM - это полный язык Тьюринга с макро командами ассемблера, который позволяет создавать сложный код для контроля использования/расхода.

QASM и QVM имеют 8 групп регистров:

  • r00-r31: общее использование (r00 - используется как результат выполнения);

  • s00-s07: привязка проверки подписи;

  • c00: результат проверки состояния;

  • th00-th16: регистры "this" (хэш tx, тип tx, входы \ выходы tx);

  • a00-a07: регистры "суммы";

  • d00: регистр пункта назначения (адрес, хэш и т. д.);

  • p00: результат utxo push (только для чтения);

  • e00: результат проверки соответствия пункта назначения (только для чтения).

Короткий пример QASM для кода проверки in[i]:

    mov        s0, 0x2023947283749211              # pubkey
    mov        s1, 0x85389659837439875498347598357 # signature
    lhash256   s2 # hash link, result -> s2
    checksig      # s0 - key, s1 - sig, s2 - message ->

                  # -> result s7 [s7-r/o]
    dtxo          # p0 - pop utxo result

Платформа Qbit имеет богатый расширяемый бинарный протокол сетевого обмена. Основные действия - изменение состояния, нахождение блока, изменение времени, отправка транзакции и т. д. - все эти действия упаковываются в сообщения сетевого обмена. Сам протокол имеет двунаправленный диалоговый характер (за исключением уведомлений - этот тип сообщений является однонаправленным). Стек протоколов работает в асинхронном расширяемом режиме и способен обрабатывать тысячи запросов/сообщений в секунду.

Например, при получении транзакции выполняется базовая проверка границ и транзакция передается в соответствующий пул памяти (mempool). Mempool проходит проверку (включая предварительные условия qasm для входов/выходов транзакций) и добавляет эту транзакцию в дерево mempool. Когда майнер собирает транзакции из пула, селектор проверяет кандидатов (приоритет, левый/правый потомки) и создает консистентный набор транзакций для будущего блока.

Примечание: существуют ссылки на кросс-шардинг транзакции, эта зависимая транзакция откладывается до тех пор, пока родительская транзакция не будет подтверждена.

Майнер, используя указанный алгоритм, находит решение для следующего блока, проверяет результат и пытается передать заголовок блока в сеть и, следовательно, сохраняет найденный блок со всеми транзакциями в цепочке (mempool очищается от совершенных транзакций).

В качестве бэкенда для хранения блоков, транзакций и индексов используется база данных LevelDB.

Qbit node или fullnode предоставляют различные методы поиска и выбора сохраненных данных (например, традиционный блок-эксплорер).

bottom of page