整合介绍#

This documentation is also available as a 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.

The Basics#

Dash is a Proof of Work network, and similar to Bitcoin, Dash has a mining network but uses a different block hashing algorithm. Dash serves as an improvement of Bitcoin’s shortcomings by offering a robust solution for instant transactions, enhancing user privacy, and offering a self-sustainable decentralized governance model.

Notably, Dash InstantSend provides a mechanism for zero-confirmation transactions to be safely accepted and re-spent. InstantSend also provides enhanced security compared to the conventional practice of waiting for multiple block confirmations. Therefore, implementing InstantSend is the recommended best practice for all Dash integrations.

JSON-RPC Interface#

The majority of commands are unchanged from Bitcoin making integration into existing systems relatively straightforward. For a complete listing of RPC commands please refer to the ​Dash Developer Guide.

Note that the following commands have been modified to support InstantSend:

特殊交易#

Dash Core v0.13.0 introduced the concept of “Special Transactions” as specified in DIP002. Special Transactions provide a more native way to implement additional features which do not fit into the original concept of transactions. Please see the Special Transactions section below for more information.

Block Hashing Algorithm#

Dash uses the X11 algorithm in place of SHA256 used in Bitcoin. It’s important to note, however, that this only affects the hashing of the block itself. All other internals utilize SHA256 hashes (transactions, merkle root, etc.), which allows for most existing libraries to work in the Dash ecosystem.

特殊交易#

This documentation is also available as a PDF.

Dash 0.13.0及随后版本实现了 DIP002 特殊交易,它构建了一种新的交易类型来提供线上元数据从而帮助不同的共识机制。存在如下特殊交易类型:

版本

类型

载荷大小

Transaction Purpose / Example

3

0

标准交易

3

1

variable

Masternode Registration

3

2

variable

Update Masternode Service

3

3

variable

Update Masternode Operator

3

4

variable

Masternode Revocation

3

5

variable

Masternode List Merkle Proof

3

6

variable

Quorum Commitment

整合须知:

  1. DIP002 Special Transactions introduced a new Transaction Version and related “Payload” to the network.

  2. Integrated Systems must be able to serialize and deserialize these new Transaction Types to accurately encode and decode Raw Transaction data.

  3. From a backwards compatibility perspective, the 4 byte (32-bit) version field included in Classical Transactions was split into two fields: version and type (each consisting of 2 bytes).

  4. Refer to the Special Transactions section of the Dash developer reference for additional detail on these data types, e.g. <variable int>.

  5. InstantSend status and Payload JSON (e.g. proRegTx) is included in the JSON-RPC response, please note that this data is not part of the calculated hash and is provided for convenience.

See the transaction types integration documentation (PDF) for worked examples of each transaction type.

即时支付#

本文档的 PDF 版本 PDF.

InstantSend is a feature provided by the Dash network that allows for zero-confirmation transactions to be safely accepted and re-spent. The network attempts to lock the inputs of every valid transaction when it is broadcast to the network. Every secured transaction is included in a following block in accordance with standard blockchain principles. Transactions are typically locked by InstantSend within 3 seconds of being propagated to the network.

InstantSend is enabled by the Masternode Network which comprises several thousand masternode servers. These nodes are differentiated from standard nodes by having proven ownership of 1,000 Dash, making the network highly resistant to Sybil attacks. Masternodes form Long-Living Masternode Quorums (LLMQs), which are responsible for providing near-instant certainty to the transaction participants that the transaction inputs cannot be re-spent, and that the transaction will be included in a following block instead of a conflicting transaction.

This concept works as an extension to Nakamoto Consensus to provide additional security. InstantSend enables transacted funds to be immediately and securely re-spent by the recipient, even before the transaction is included in a block.

接收即时发送交易#

备注

An “InstantSend Transaction” is simply a standard transaction that has been provided additional assurances by the masternode network. As a result, and from an integration perspective, the only technical difference is the InstantSend status.

接收一个即时发送交易需要两个条件:

  1. 确认一个交易的”即时发送状态“

  2. 独立地调整区块确认数与”确认状态“。

InstantSend Status is provided by the dash daemon, typically through a direct connection (e.g. RPC), ZMQ notification, or through the usage of an external wallet notification script.

Direct Connection#

InstantSend Status can be identified through direct connection with the Dash daemon using JSON-RPC protocol. The instantlock attribute of the JSON response reflects the status of the transaction and is included in the following commands:

ZMQ Notification#

Whenever a transaction enters the mempool and whenever a transaction is locked in the mempool, ZMQ notifications can be broadcast by the node. Refer to the list of possible ZMQ notifications for more details.

以下通知与识别交易及相对的即时锁有关:

  • zmqpubhashtx

  • zmqpubhashtxlock

  • zmqpubrawtx

  • zmqpubrawtxlock

Wallet Notification#

The Dash Core Daemon can be configured to execute an external script whenever an InstantSend transaction relating to that wallet is observed. This is configured by adding the following line to the dash.conf file:

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

This is typically used with a wallet that has been populated with watch-only addresses.

广播即时发送功能的交易信息#

小技巧

Because all transactions on the Dash network are automatically InstantSend, no procedural changes are required to broadcast transactions as InstantSend.

自Dash v0.14.0在网络上创建长效节点仲裁链以来,仲裁链会默认锁定每一个有效交易,用户无需发送附加费用或额外操作。当每个交易输入被确认后,该交易即适用于即时支付。满足条件至少要符合以下一种情况:

  • 先前的交易是指由6个区块确认的交易输入

  • 先前的交易是由更早的即时支付锁确认

  • 包含先前交易的区块由 链锁锁定

When checking the previous transaction for an InstantSend lock, it is important to do this on mempool (non-mined) transactions. This allows chained InstantSend locking.

其它资源#

下列资源提供即时发送功能的更多信息,以便帮助用户全面地了解它的基础技术。

ChainLocks#

ChainLocks are a feature provided by the Dash Network which provides certainty when accepting payments. This technology, particularly when used in parallel with InstantSend, creates an environment in which payments can be accepted immediately and without the risk of “Blockchain Reorganization Events”.

The risk of blockchain reorganization is typically addressed by requiring multiple confirmations before a transaction can be safely accepted as payment. This type of indirect security is effective, but at a cost of time and user experience. ChainLocks are a solution for this problem.

Receiving ChainLocks#

备注

Once a ChainLock is observed for a block, each transaction in that block and all previous blocks can be considered irreversibly and fully confirmed.

Receiving a ChainLock introduces two requirements:

  1. The ability to determine the “ChainLock Status” of a given block or transaction.

  2. 独立地调整区块确认数与”确认状态“。

ChainLock status is provided by the dash daemon, typically through a direct connection (e.g. RPC) or by a ZMQ notification.

Direct Connection#

ChainLock status can be identified through direct connection with the Dash daemon using JSON-RPC protocol. The boolean chainlock attribute of the JSON response reflects the ChainLock status of the block or transaction and is included in the following commands:

ZMQ Notification#

ChainLock signatures are created shortly after the related block has been mined. As a result it is recommended that integrated clients use ZMQ (ZeroMQ) notifications in order to ensure that this information is received as promptly as possible. Refer to the list of possible ZMQ notifications for more details.

The following notifications are relevant for recognizing blocks and their corresponding ChainLocks:

  • zmqpubhashblock

  • zmqpubhashchainlock

  • zmqpubrawblock

  • zmqpubrawchainlock

  • zmqpubrawchainlocksig

This sample code uses the js-dashd-zmq library to listen for ChainLock ZMQ notifications and return the hash of blocks that receive a ChainLock.

Subscribe to ChainLock hash ZMQ notifications#
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}`)
   });
})();

Wallet Notification#

The Dash Core daemon can be configured to execute an external script whenever a ChainLock is received. This is configured by adding the following line to the dash.conf file:

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

其它资源#

下列资源提供即时发送功能的更多信息,以便帮助用户全面地了解它的基础技术。