Panoramica di integrazione#
Questa documentazione è disponibile anche come 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.
Le basi#
Dash è una rete Proof of Work e, simile a Bitcoin, Dash ha una rete di mining ma utilizza un diverso algoritmo di hashing dei blocchi. Dash serve a migliorare le carenze di Bitcoin offrendo una solida soluzione per transazioni istantanee, migliorando la privacy degli utenti e offrendo un modello di governance decentralizzata autosostenibile.
In particolare, Dash InstantSend fornisce un meccanismo per accettare e spendere nuovamente in modo sicuro le transazioni a conferma zero. InstantSend fornisce inoltre una maggiore sicurezza rispetto alla pratica convenzionale di attendere più conferme di blocco. Pertanto, implementare InstantSend è la procedura consigliata per tutte le integrazioni Dash.
Tempo di blocco: ~2,6 minuti per blocco
Fonte Github: dashpay/dash
Ultima versione: dashpay/dash
Interfaccia JSON-RPC#
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.
Tieni presente che i seguenti comandi sono stati modificati per supportare InstantSend:
Transazioni Speciali#
Dash Core v0.13.0 ha introdotto il concetto di «Transazioni speciali» come specificato in DIP002. Le transazioni speciali forniscono un modo più nativo per implementare funzionalità aggiuntive che non rientrano nel concetto originale di transazioni. Per ulteriori informazioni, consultare la sezione Transazioni speciali di seguito.
Algoritmo di hashing dei blocchi#
Dash utilizza l’algoritmo X11 al posto di SHA256 utilizzato in Bitcoin. È importante notare, tuttavia, che ciò influisce solo sull’hashing del blocco stesso. Tutti gli altri componenti interni utilizzano hash SHA256 (transazioni, merkle root, ecc.), che consentono alla maggior parte delle librerie esistenti di funzionare nell’ecosistema Dash.
Transazioni Speciali#
Questa documentazione è disponibile anche come PDF.
Dash 0.13.0 e versioni successive implementano DIP002 Special Transactions <https://github.com/dashpay/dips/blob/master/dip-0002.md> __, che costituiscono una base per i nuovi tipi di transazione che forniscono on-chain metadati per assistere vari meccanismi di consenso. Esistono i seguenti tipi di transazioni speciali:
Versione |
Modello |
Payload Size |
Scopo/Esempio della transazione |
|---|---|---|---|
3 |
0 |
n/a |
Transazione standard |
3 |
1 |
variabile |
|
3 |
2 |
variabile |
|
3 |
3 |
variabile |
|
3 |
4 |
variabile |
|
3 |
5 |
variabile |
|
3 |
6 |
variabile |
Note di integrazione:
DIP002 Special Transactions ha introdotto una nuova versione della transazione e il relativo «Payload» nella rete.
I sistemi integrati devono essere in grado di serializzare e deserializzare questi nuovi tipi di transazione per codificare accuratamente e decodificare i dati grezzi delle transazioni.
Dal punto di vista della «compatibilità con le versioni precedenti <dashpay/dips>»__, il campo «versione» da 4 byte (32 bit) incluso in Classical Transactions è stato suddiviso in due campi: «versione» e «tipo» (ciascuno composto da 2 byte).
Refer to the Special Transactions section of the Dash developer reference for additional detail on these data types, e.g. <variable int>.
InstantSend e Payload JSON (ad esempio
proRegTx) sono inclusi nella risposta JSON-RPC, tieni presente che questi dati non fanno parte dell’hash calcolato e vengono forniti per comodità.
Consulta la documentazione sull’integrazione dei tipi di transazione (PDF) per esempi pratici di ciascun tipo di transazione .
InstantSend#
Questa documentazione è disponibile anche come file PDF.
InstantSend è una funzionalità fornita dalla rete Dash che consente di accettare e spendere nuovamente in modo sicuro le transazioni senza conferma. La rete tenta di bloccare gli input di ogni transazione valida quando viene trasmessa alla rete. Ogni transazione protetta è inclusa in un blocco successivo in conformità con i principi standard della blockchain. Le transazioni vengono generalmente bloccate da InstantSend entro 3 secondi dalla propagazione alla rete.
InstantSend è abilitato dalla rete Masternode che comprende diverse migliaia di server masternode. Questi nodi si differenziano dai nodi standard per aver dimostrato di possedere 1.000 Dash, rendendo la rete altamente resistente agli attacchi Sybil. I Masternode formano Long-Living Masternode Quorums (LLMQ), che hanno il compito di fornire certezza quasi istantanea ai partecipanti alla transazione che gli input della transazione non possono essere spesi nuovamente e che la transazione verrà inclusa in un blocco successivo invece che in una transazione in conflitto.
Questo concetto funziona come un’estensione del Consenso Nakamoto per fornire ulteriore sicurezza. InstantSend consente al destinatario di rispendere immediatamente e in modo sicuro i fondi negoziati, anche prima che la transazione venga inclusa in un blocco.
Ricezione di transazioni InstantSend#
Nota
Una «Transazione InstantSend» è semplicemente una transazione standard a cui sono state fornite ulteriori garanzie dalla rete masternode. Di conseguenza, e dal punto di vista dell’integrazione, l’unica differenza tecnica è lo stato InstantSend.
La ricezione di una transazione InstantSend introduce a due requisiti:
Capacità di determinare lo «Status di InstantSend» di una data transazione.
Possibilità di regolare lo «Status di conferma» indipendentemente dalla conferma del blocco.
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.
Connessione diretta#
Lo stato di InstantSend può essere identificato tramite la connessione diretta con il demone Dash utilizzando il protocollo JSON-RPC. L’attributo instantlock della risposta JSON riflette lo stato della transazione ed è incluso nei seguenti comandi:
Notifica ZMQ#
Ogni volta che una transazione entra nella mempool e ogni volta che una transazione è bloccata nel mempool, le notifiche ZMQ possono essere trasmesse dal nodo. Fare riferimento all’elenco delle possibili notifiche ZMQ <dashpay/dash>`__ per maggiori dettagli.
Le seguenti notifiche sono rilevanti per il riconoscimento delle transazioni e dei relativi blocchi istantanei:
zmqpubhashtx
zmqpubhashtxlock
zmqpubrawtx
zmqpubrawtxlock
Notifica del portafoglio#
Il Dash Core Daemon può essere configurato per eseguire uno script esterno ogni volta che viene osservata una transazione InstantSend relativa a quel portafoglio. Questo viene configurato aggiungendo la seguente riga al file dash.conf:
instantsendnotify=/path/to/concurrent/safe/handler %s
Questo viene in genere utilizzato con un portafoglio che è stato popolato con «watch-only <https://docs.dash.org/projects/core/en/stable/docs/resources/glossary.html#watch-only-address>» __ indirizzi.
Trasmissione di transazioni InstantSend#
Suggerimento
Poiché tutte le transazioni sulla rete Dash vengono automaticamente inviate a InstantSend, non sono necessarie modifiche procedurali per trasmettere le transazioni come InstantSend.
Poiché Dash v0.14.0 ha stabilito LLMQs sulla rete Dash, i quorum tenteranno ora di bloccare ogni transazione valida per impostazione predefinita senza alcuna commissione o azione aggiuntiva da parte del portafoglio o dell’utente che invia. Una transazione è idonea per InstantSend quando ciascuno dei suoi input è confermato. Questo è il caso in cui si verifica almeno una delle seguenti circostanze:
la transazione precedente a cui fa riferimento l’entrata viene confermata con 6 blocchi
la transazione precedente viene confermata tramite un blocco InstantSend più vecchio
il blocco contenente la transazione precedente è ChainLocked
Quando si controlla la transazione precedente per un blocco InstantSend, è importante farlo sulle transazioni mempool (non estratte). Ciò consente il blocco InstantSend concatenato.
Risorse addizionali#
Le seguenti risorse forniscono ulteriori informazioni su InstantSend e hanno lo scopo di fornire una comprensione più completa delle tecnologie sottostanti.
ChainLocks#
I ChainLocks sono una funzionalità fornita da Dash Network che fornisce certezza nell’accettazione dei pagamenti. Questa tecnologia, in particolare se utilizzata in parallelo con InstantSend, crea un ambiente in cui i pagamenti possono essere accettati immediatamente e senza il rischio di “Eventi di riorganizzazione Blockchain”.
Il rischio di riorganizzazione della blockchain viene in genere risolto richiedendo più conferme prima che una transazione possa essere accettata in modo sicuro come pagamento. Questo tipo di sicurezza indiretta è efficace, ma comporta un costo in termini di tempo e di esperienza dell’utente. I ChainLocks sono una soluzione a questo problema.
Ricevere ChainLocks#
Nota
Una volta osservato un ChainLock per un blocco, ogni transazione in quel blocco e in tutti i blocchi precedenti può essere considerata irreversibilmente e completamente confermata.
Ricevere un ChainLock introduce due requisiti:
La capacità di determinare lo “Stato ChainLock” di un determinato blocco o transazione.
Possibilità di regolare lo «Status di conferma» indipendentemente dalla conferma del blocco.
ChainLock status is provided by the dash daemon, typically through a direct connection (e.g. RPC) or by a ZMQ notification.
Connessione diretta#
Lo stato di ChainLock può essere identificato tramite la connessione diretta con il demone Dash utilizzando il protocollo JSON-RPC. L’attributo booleano chainlock della risposta JSON riflette lo stato ChainLock del blocco o della transazione ed è incluso nei seguenti comandi:
Notifica ZMQ#
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.
Le seguenti notifiche sono rilevanti per il riconoscimento dei blocchi e dei relativi ChainLock:
zmqpubhashblock
zmqpubhashchainlock
zmqpubrawblock
zmqpubrawchainlock
zmqpubrawchainlocksig
Questo codice di esempio utilizza la libreria js-dashd-zmq per ascoltare le notifiche ChainLock ZMQ e restituire l’hash dei blocchi che ricevono un ChainLock.
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}`)
});
})();
Notifica del portafoglio#
Il daemon Dash Core può essere configurato per eseguire uno script esterno ogni volta che viene ricevuto un ChainLock. Questo viene configurato aggiungendo la seguente riga al file dash.conf:
chainlocknotify=/path/to/concurrent/safe/handler %s
Risorse addizionali#
Le seguenti risorse forniscono ulteriori informazioni su InstantSend e hanno lo scopo di fornire una comprensione più completa delle tecnologie sottostanti.