Обзор по интеграции#

Данная документация также доступна в формате PDF.

Dash Core is a fork of Bitcoin Core and shares many common functionalities. Key differences are found in existing JSON-RPC commands which have been customized to support unique functionalities such as InstantSend.

Основы#

Dash - это сеть Proof of Work, в которой, как и в Bitcoin, есть сеть майнинга, но используется другой алгоритм хеширования блоков. Dash служит улучшением недостатков Bitcoin, предлагая надежное решение для мгновенных транзакций, повышая конфиденциальность пользователей и предлагая самодостаточную децентрализованную модель управления.

В частности, Dash InstantSend обеспечивает механизм безопасного принятия и повторного проведения транзакций с нулевым подтверждением. Кроме того, InstantSend обеспечивает повышенную безопасность по сравнению с традиционной практикой ожидания подтверждения от нескольких блоков. Поэтому внедрение InstantSend является рекомендуемой лучшей практикой для всех интеграций Dash.

  • Время нахождения блока: ~2,6 минуты

  • Github source: dashpay/dash

  • Последний релиз: dashpay/dash

Интерфейс JSON-RPC#

Большинство команд остались неизменными по сравнению с Bitcoin, что делает интеграцию в существующие системы относительно простой. Полный список RPC-команд приведен в Руководство разработчика Dash.

Обратите внимание, что следующие команды были изменены для поддержки InstantSend:

Специальные транзакции#

В Dash Core v0.13.0 введена концепция «специальных транзакций», как указано в DIP002. Специальные транзакции позволяют реализовать дополнительные возможности, которые не вписываются в первоначальную концепцию транзакций. Более подробная информация приведена ниже в разделе Специальные транзакции.

Алгоритм хэширующий блоки#

Dash использует алгоритм X11, вместо SHA256, который используется в Биткойне. Однако стоит отметить, что это относится только к хешированию Блока. Все прочие внутренние функции работают с хешами SHA256 (транзакции, корни merkle, и т.д.), благодаря чему большинство существующих библиотек совместимы с экосистемой Dash.

Специальные транзакции#

Эта документация также доступна в формате PDF.

В Dash 0.13.0 и в последующих релизах, реализованы Специальные Транзакции DIP002, которые формируют основу для новых типов транзакций, снабжающих блокчейн метаданными, которые оказывают помощь в работе различных механизмов консенсуса. Существуют следующие типы специальных транзакций:

Версия

Тип

Размер нагрузки

Назначение транзакции / Пример

3

0

n/a

Стандартная транзакция

3

1

переменная

Регистрация мастерноды

3

2

переменная

Обновления сервиса мастерноды

3

3

переменная

Обновление оператора мастерноды

3

4

переменная

Отзыв мастерноды

3

5

переменная

Доказательство Меркла списка мастернод

3

6

переменная

Обязательство по кворуму

Примечания по интеграции:

  1. DIP002 Специальный транзакции представил в сети новую версию транзакции и связанную с ней «полезную нагрузку».

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

  3. С точки зрения обратной совместимости <dashpay/dips>`__, 4-байтовое (32-битное) поле версия, включенное в классические транзакции, было разделено на два поля: версия и тип (каждое из которых состоит из 2 байт).

  4. Дополнительную информацию об этих типах данных см. в разделе Специальные транзакции справочника разработчика Dash, например, <variable int>.

  5. Статус InstantSend и JSON нагрузка (например proRegTx) включёна в ответ JSON-RPC, пожалуйста, обратите внимание, что эти данные не являются частью рассчитываемого хеша и предоставлены для удобства.

Отработанные примеры каждого типа транзакций см. в документации по интеграции типов транзакций (PDF) <dashpay/docs>`__.

InstantSend#

Эта документация также доступна в формате PDF.

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

InstantSend обеспечивается сетью мастернод, состоящей из нескольких тысяч серверов мастернод. Эти узлы отличаются от обычных узлов тем, что имеют подтвержденное право собственности на 1000 Dash, что делает сеть высокоустойчивой к атакам Sybil <https://en.wikipedia.org/wiki/Sybil_attack>`__. Мастерноды формируют «долгоживущие кворумы мастернод» (LLMQ) <dashpay/dips>`__, которые отвечают за практически мгновенную уверенность участников транзакций в том, что средства, вложенные в транзакцию, не могут быть потрачены повторно, и что транзакция будет включена в следующий блок вместо конфликтующей транзакции.

Эта концепция работает как расширение консенсуса Накамото, обеспечивая дополнительную безопасность. InstantSend позволяет получателю немедленно и безопасно повторно расходовать транзакции, даже до того, как транзакция будет включена в блокчейн.

Получение транзакций InstantSend#

Примечание

Транзакция InstantSend - это просто стандартная транзакция, получившая дополнительные гарантии от сети мастернодов. В результате, с точки зрения интеграции, единственным техническим отличием является статус InstantSend.

Вводится два требования для получения транзакций InstantSend:

  1. Возможность определить «статус InstantSend» в заданной транзакции.

  2. Возможность настройки «статуса подтверждения» независимо от подтверждения блока.

Статус InstantSend предоставляется демоном dash, обычно через прямое соединение (например, RPC), ZMQ уведомление, или через использование внешнего скрипта уведомления кошелька.

Прямое соединение#

Статус InstantSend может быть определен путем прямого соединения с демоном Dash по протоколу JSON-RPC. Атрибут instantlock JSON-ответа отражает статус транзакции и включается в следующие команды:

Уведомление ZMQ#

Всякий раз, когда транзакция попадает в mempool и когда транзакция блокируется в mempool, узел может транслировать уведомления ZMQ. Более подробная информация приведена в списке возможных ZMQ-уведомлений.

Для распознавания транзакций и соответствующих им мгновенных блокировок актуальны следующие уведомления:

  • zmqpubhashtx

  • zmqpubhashtxlock

  • zmqpubrawtx

  • zmqpubrawtxlock

Уведомление кошелька#

Dash Core Daemon может быть настроен на выполнение внешнего скрипта каждый раз, когда наблюдается транзакция InstantSend, относящаяся к данному кошельку. Это настраивается путем добавления следующей строки в файл dash.conf:

instantsendnotify=/path/to/concurrent/safe/handler %s

Обычно это используется с кошельком, в который добавлены адреса только для просмотра.

Распространение транзакций InstantSend#

Совет

Поскольку все транзакции в сети Dash автоматически являются InstantSend, никаких процедурных изменений для трансляции транзакций как InstantSend не требуется.

С момента появления в сети Dash версии 0.14.0 LLMQ, кворумы теперь будут пытаться заблокировать каждую действительную транзакцию по умолчанию без какой-либо дополнительной комиссии или действий со стороны отправляющего кошелька или пользователя. Транзакция имеет право на InstantSend, когда все ее входы считаются подтвержденными. Это происходит, если верно хотя бы одно из следующих обстоятельств:

  • предыдущая транзакция, на которую ссылается вход, подтверждена 6 блоками

  • предыдущая транзакция подтверждается через более старую блокировку InstantSend

  • блок, содержащий предыдущую транзакцию, является ChainLocked.

При проверке предыдущей транзакции на наличие блокировки InstantSend важно выполнять эту проверку для транзакций mempool (не майнинговых). Это позволяет использовать блочную блокировку InstantSend.

Дополнительные ресурсы#

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

ChainLocks#

ChainLocks - это функция, предоставляемая сетью Dash, которая обеспечивает определенность при приеме платежей. Эта технология, особенно при использовании параллельно с InstantSend, создает условия, в которых платежи могут быть приняты немедленно и без риска «событий реорганизации блокчейна».

Риск реорганизации блокчейна обычно устраняется путем требования многократного подтверждения, прежде чем транзакция может быть безопасно принята к оплате. Такой тип косвенной защиты эффективен, но требует больших затрат времени и пользовательского опыта. ChainLocks - это решение данной проблемы.

Получение ChainLocks#

Примечание

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

Получение ChainLock влечет за собой два требования:

  1. Возможность определения «ChainLock Status» данного блока или транзакции.

  2. Возможность настройки «статуса подтверждения» независимо от подтверждения блока.

Статус ChainLock предоставляется демоном dash, обычно через прямое соединение (например, RPC) или через уведомление ZMQ.

Прямое соединение#

Статус ChainLock может быть определен через прямое соединение с демоном Dash по протоколу JSON-RPC. Атрибут boolean chainlock в JSON-ответе отражает статус ChainLock блока или транзакции и включается в следующие команды:

Уведомление ZMQ#

Подписи ChainLock создаются вскоре после майнинга соответствующего блока. В связи с этим рекомендуется, чтобы интегрированные клиенты использовали ZMQ (ZeroMQ) notifications 1 для обеспечения максимально оперативного получения этой информации. Более подробная информация приведена в списке возможных ZMQ-уведомлений.

Следующие уведомления относятся к распознаванию блоков и соответствующих им ChainLocks:

  • zmqpubhashblock

  • zmqpubhashchainlock

  • zmqpubrawblock

  • zmqpubrawchainlock

  • zmqpubrawchainlocksig

Данный пример использует библиотеку js-dashd-zmq для прослушивания ZMQ-уведомлений ChainLock и возврата хэша блоков, получивших ChainLock.

Следить за ZMQ-уведомлениям ChainLock hash#
const { ChainLock } = require('@dashevo/dashcore-lib');
const ZMQClient = require('@dashevo/dashd-zmq');
const client = new ZMQClient({
   protocol: 'tcp',
   host: '0.0.0.0',
   port: '20009',
});

(async () => {
   await client.connect();
   client.subscribe(ZMQClient.TOPICS.hashchainlock);
   client.on(ZMQClient.TOPICS.hashchainlock, async (hashChainLockMessage) => {
      console.log(`ChainLock received for block ${hashChainLockMessage}`)
   });
})();

Уведомление кошелька#

Демон Dash Core может быть настроен на выполнение внешнего скрипта при получении ChainLock. Это настраивается путем добавления следующей строки в файл dash.conf:

chainlocknotify=/path/to/concurrent/safe/handler %s

Дополнительные ресурсы#

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