sdk_common/doc/Silent-Payments-Specs.md

103 lines
5.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Silent Payments - Specifications
## 1. <a name='Autheursvalidationsdatesversionschangementandhistorique'></a>Autheurs, validations, dates, versions, changement and historique
Cf. [Git SDK COMMON](https://git.4nk.com/4nk/sdk_common/doc)
## 2. <a name='Tabledesmatires'></a>Table des matières
<!-- vscode-markdown-toc -->
* 1. [Autheurs, validations, dates, versions, changement and historique](#Autheursvalidationsdatesversionschangementandhistorique)
* 2. [Table des matières](#Tabledesmatires)
* 3. [Objectif](#Objectif)
* 4. [Portée](#Porte)
* 5. [Documents de référence](#Documentsderfrence)
* 6. [ Fonction](#Fonction)
* 7. [ Structure des outputs](#Structuredesoutputs)
* 8. [Envoi de la transaction SP](#EnvoidelatransactionSP)
* 8.1. [Dans un `PrdMessage`](#DansunPrdMessage)
* 8.2. [Dans un `Envelope` du `PrdMessage`](#DansunEnvelopeduPrdMessage)
* 9. [ En réception les transactions silent Payments SP sont relayées par les relais en temps réel](#EnrceptionlestransactionssilentPaymentsSPsontrelayesparlesrelaisentempsrel)
<!-- vscode-markdown-toc-config
numbering=true
autoSave=true
/vscode-markdown-toc-config -->
<!-- /vscode-markdown-toc -->
## 3. <a name='Objectif'></a>Objectif
## 4. <a name='Porte'></a>Portée
## 5. <a name='Documentsderfrence'></a>Documents de référence
Voir [_Doc_references.md](_Doc_references.md).
## 6. <a name='Fonction'></a> Fonction
La transaction SP à plusieurs objectifs :
1. Permettre l'horodatage de l'empreinte des `Prd` sur la side chain (`PrdMessage` sans `Envelope` confidentiel).
2. Permettre le partage de la `keyConfidential` pour les `Prd` afin de déchiffrer les données confidentielles, sur d'autres relais que ceux qui ont reçu le `Prd`.
La clé `KeyConfidential` d'une`transaction SP` est utilisée pour chiffrer les `Prd`.Cette clé est échangée avec le destinataire via un Diffie-Hellman (cf. [Specs-Security.md](Specs-Security.md)) dans la transaction.
Cette information est parrallèle aux `Prd` et permet une meilleur sécurité et confidentialité des échanges.
La`transaction SP` a aussi une fonction d'horodate et de preuve de publication des `Prd` donc de la validation des données des `Pcd`.Les outputs de la`transaction SP` contiennent les empreintes cryptographiques des `Envelope` et `Prd` et des `Pcd`.Ainsi l'infrastructure blockchain de signet de 4NK permet de vérifier l'intégrité des flux, leur ordre de référence (horodatage) et leur preuve de publication.
Les `PrdConfirm` qui sont des accusés automatiques de réception des `Prd` sont aussi associés à une transaction Silent Payments SP, ce qui permet d'ajouter les preuves de réception des demandes et des validations (ou non).
Il y a une `transactions SP` pour tous les types de `Prd`.
## 7. <a name='Structuredesoutputs'></a> Structure des outputs
Une fois le `Prd` finalisé, une transaction SP est réalisée, dans cette transaction plusieurs hashs sont ajoutés sur un outputs aux index suivants:
0. L'output 0 est toujours un paiment au destinataire
1. L'output 1 c'est toujours l'op_return avec un tableau de hashs en clair selon un tableau de hashs en JSON avec les index suivants :
1.1. Le hash de l'`Envelope` de type `Envelope` correspondant
1.2. Le hash du `Prd`
1.3. Le hash du process
1.4. Le hash de la valeur de la signature (attribut `sig_value` du Prd)
1.5. Le hash de `item_name` de `Item` concerné (le cas échéant)
1.6. Le hash du `Prd` d'origine associé au `Prd` (le cas échéant)
1.7. Le hash du `Pcd` d'origine associé au `Prd` (le cas échéant)
1.8. Le hash du `Pcd` de référence associé au `Prd` (le cas échéant)
1.9. Le hash d'un `Amount` de paiement (le cas échéant)
1.10. Le hash d'un `Amount`de dépôt (le cas échéant)
1.11. Un hash d'un engagement externe ou d'un `Number` (le cas échéant)
Pour des raison de confidentialité, le `Role` associé à `item_name` du `Prd` peut définir (option) un salt pour la génération des hashs dans l'attribut `sp_output_salt_enc`.
## 8. <a name='EnvoidelatransactionSP'></a>Envoi de la transaction SP
Afin d'améliorer la rélisience du broadcast des transactions, la transaction est envoyée à la fois :
1. Dans un `PrdMessage` à un Member du rôle `Member` du `Process` concerné et
2. Dans le `Envelope` du `PrdMessage` sur les relais
### 8.1. <a name='DansunPrdMessage'></a>Dans un `PrdMessage`
Dans l'attribut `raw_transaction_list` du `PrdMessage` associé à la transaction SP.
La transaction sera broadcastée par les noeuds de signet du Member du `Role` `Member` du `Process` concerné qui a reçu cette `Envelope` , il devra alors avoir un noeud de signet pour le broadcast.
### 8.2. <a name='DansunEnvelopeduPrdMessage'></a>Dans un `Envelope` du `PrdMessage`
Dans l'attribut `raw_transaction_list` de l'`Envelope` associé à la transaction SP.
La transaction sera broadcastée par les noeuds de signet des relais.
## 9. <a name='EnrceptionlestransactionssilentPaymentsSPsontrelayesparlesrelaisentempsrel'></a> En réception les transactions silent Payments SP sont relayées par les relais en temps réel
Le relais récupère les transactions depuis l'interface ZMQ du noeud Bitcoin : <https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md>.
Puis il ajoute le tweak data de la transaction Silent Payments, puis il envoie la transaction à tous les connectés.
Puis le relais relaient les transactions dans le format suivant :
* **raw_tx**: La transaction en hexadécimal
* **pubkey**: La clé publique du Member qui a envoyé la transaction
Le même procédé existe pour les blocs :
* **raw_block**: Le bloc en hexadécimal