Signatures du réseau Monero

Nous ouvrons une série de publications sur le dispositif de diverses chaînes de blocs et commençons des recherches avec Monero. Il s'agit d'une crypto-monnaie assez bien connue, elle met en œuvre un certain nombre de solutions algorithmiques et cryptographiques intéressantes. Il y a plusieurs mois, la prise en charge des signatures multiples a été ajoutée à Monero Core, et dans l'article d'aujourd'hui, nous examinerons de plus près cette technologie.

image

Les signatures multiples sont un mécanisme pour créer et utiliser des portefeuilles partagés. Le concept lui-même n'est pas nouveau, il a déjà été mis en œuvre dans certaines crypto-monnaies, comme Bitcoin, Ethereum et d'autres. Son essence réside dans la copropriété et la cession des portefeuilles. Certaines restrictions sont imposées à la disposition des fonds: pour effectuer une transaction, il est nécessaire de recueillir un certain nombre de votes, qui est défini lors de la création d'un portefeuille et dépend du nombre de ses propriétaires.

Ces paramètres caractérisent le soi-disant «schéma» d'un portefeuille, par exemple, 3/3 - un portefeuille pour trois propriétaires avec les trois signatures nécessaires pour envoyer une transaction, ou 2/3 - portefeuille pour trois propriétaires avec les deux signatures nécessaires de l'un de ses propriétaires. Il convient de noter que dans le portefeuille multisignature, il n'y a pas de concept de «votre part» et de «ma part», tous les fonds appartiennent à tous les participants en même temps.

Cryptographie à Monero


La cryptographie dans Monero (comme dans la plupart des autres crypto-monnaies) est construite sur des courbes elliptiques. Vous pouvez les lire sur Wikipedia . En bref, les avantages de ce système de cryptage sont une force cryptographique plus élevée par rapport aux systèmes cryptographiques classiques, une petite taille de clé et une vitesse plus élevée des opérations cryptographiques.

Chaque portefeuille du réseau Monero possède deux paires de clés (privées et publiques) - afficher et dépenser. La vue et les dépenses de la paire de clés publiques sont appelées l'adresse du portefeuille. Vous pouvez l'utiliser comme adresse pour recevoir des fonds. Si vous souhaitez fournir des informations sur le nombre et la taille des reçus à votre portefeuille avec des tiers, vous pouvez, en plus de l'adresse, fournir une clé de vue privée. Une paire de clé de vue privée et de dépenses publiques est appelée clé de suivi. Avec lui, vous pouvez voir la réception des fonds dans le portefeuille (mais pas les coûts) et c'est absolument sûr - posséder une telle paire de clés ne pourra pas dépenser votre argent.
La clé la plus secrète est peut-être la dépense privée - vous ne devez la partager avec personne, car le posséder et une clé de vue privée, vous pouvez gérer le portefeuille.

Plus loin dans l'article, nous désignerons les clés publiques en majuscules (par exemple, B - clé de dépenses publiques) et privées - en minuscules (b - clés de dépenses privées). Pour comprendre certains des calculs ci-dessous, dans l'article, nous montrons comment la clé publique est héritée de la clé privée:

Formule: héritage d'une clé publique. B = bg

, où G est un point fixe, multiplier une clé privée (scalaire) par lui donne une clé publique, qui est également un point sur une courbe elliptique.

Signatures du réseau Monero


L'idée sous-jacente à la technologie est simple: chaque participant au portefeuille ne conserve qu'une partie de la clé de dépense privée, et lors de la formation et de la signature des transactions, toutes ces parties sont résumées pour former une seule clé.

Bien sûr, à aucun moment, aucun des participants ne peut récupérer la clé entière. La clé de dépenses publiques est stockée entièrement par chaque participant. Chacun des participants stocke également la version complète de la clé de vue privée et publique, qui, avec les dépenses publiques, vous permet de voir les reçus entrants à une adresse commune.

Création d'un portefeuille multisig dans Monero


La version actuelle de Monero ne prend en charge que les schémas N / N et N - 1 / N.

Le processus de création se déroule en 1 ou 2 étapes pour les circuits N / N et N - 1 / N, respectivement. À la première étape, les participants au processus échangent des vues privées et des clés de dépenses publiques et calculent la somme de ces clés - toutes les vues et toutes les dépenses. Ainsi, la clé de vue privée du portefeuille devient la somme des clés de vue pour tous les régimes, et la clé de dépenses publiques pour le régime N / N est la somme des clés de dépenses publiques de tous les participants. Cela met fin à la génération du portefeuille N / N.

Pour les portefeuilles N - 1 / N, un autre jeu de clés apparaît. Cet ensemble est un tableau de clés privées, calculé comme le produit de sa clé de dépenses privée actuelle par chacune des clés de dépenses publiques des autres participants, c'est-à-dire (à l'exclusion de la fonction de hachage pour plus de simplicité):

Formule: Calcul des clés multisig

Et de même pour chacun des participants.

La clé de dépense privée de chacun des participants sera la somme de ses clés multisig, soit:

image

Chaque participant effectue cette opération. Il convient de noter une propriété importante de ces œuvres, par exemple:

image

De cette égalité, il s'ensuit que chaque portefeuille a une (dans notre exemple avec le schéma 2/3) clé multisig, qu'un autre participant a.

Après la génération, les participants échangent des clés multisig publiques:

Formule: Calcul d'une clé multisig publique

Au final, la clé du portefeuille de dépenses publiques est calculée en additionnant les valeurs uniques des clés multisig publiques, c'est-à-dire, pour notre exemple, ce sera:

Formule: calculer la clé de dépenses publiques

Comme nous pouvons le voir, pour calculer la clé de dépense (privée et publique) dans le cas des 2/3, nous avons besoin de suffisamment d'informations de la part de deux participants.

Ceci termine la création du portefeuille et il peut être utilisé conformément au schéma sélectionné.

Transactions à Monero


Pour expliquer comment les transactions multisig sont créées, examinons brièvement comment une transaction est organisée dans Monero. Simplifié (sans ring ring et RingCT) il peut être imaginé comme suit:

Représentation simplifiée des transactions

Figure 1. Vue de transaction simplifiée

Ici, à droite, les sorties de la transaction sont affichées - l'argent qu'elle génère (une analogie directe: les billets dans un portefeuille), et les entrées à gauche sont l'argent qu'elle brûle.

Ainsi, quand Alice veut envoyer 1 XMR à Bob, elle collecte 1 XMR plus une commission parmi ses sorties non dépensées, les place à la place des entrées de transaction, calcule une image clé pour chacune d'elles, génère des sorties pour le montant de 1 XMR et calcule pour chacun des leur clé de sortie.

Après avoir reçu la transaction, Bob récupère la clé de sortie pour chacune des sorties à l'aide d'une vue privée et des clés de dépenses publiques, et si les clés récupérées et reçues dans la transaction correspondent, il considère que cette sortie lui est destinée.

Malgré le fait qu'une transaction multisig du point de vue du réseau ne soit pas différente de toute autre transaction, sa création est un peu plus compliquée et en plusieurs étapes:

  • Les participants échangent des images clés partielles pour des résultats connus (ou simplement échangent des résultats)
  • Les participants resynchronisent leurs portefeuilles afin d'obtenir un équilibre précis, en tenant compte de l'image clé déjà complète
  • L'expéditeur prépare la transaction, la signe et l'envoie au participant suivant
  • Chaque participant suivant ajoute une partie de sa signature RingCT.
  • Le dernier signataire termine RingCT

Et maintenant, la transaction est prête à être envoyée au réseau.

Génération d'images clés et partage de sortie


Pendant le scan de la blockchain (synchronisation), le portefeuille ne peut pas déterminer quelles entrées spécifiques dépensent ses sorties, car il n'a pas la capacité de calculer l'image clé pour elles. Par conséquent, il ne voit que les transactions entrantes (pour elles, seules les paires de clés de suivi sont suffisantes).

Afin de former une transaction correcte, vous devez restaurer l'image clé pour chacune des sorties, scanner la blockchain et déterminer celles qui sont dépensées, puis seulement procéder à sa génération.

Considérez le processus de formation d'une image clé. Il est calculé par la formule:

Formule: Image clé de la formation

, où Hp est une certaine fonction de hachage prédéterminée, P est la clé de sortie publique (voir figure 1), x est la clé de sortie privée qui sera restaurée pour le destinataire de cette sortie, elle est calculée comme suit:

Formule: restaurer la clé de sortie privée

, où Hs est une certaine fonction de hachage cryptographique bien connue, a est une clé de vue privée, R est une clé de transaction publique (clé pub Tx, voir figure 1) et b est une clé de dépense privée. En substituant une expression dans une autre et en ouvrant les crochets, on obtient:

Formule: Image clé de calcul

Mais comme nous n'avons pas de clé de dépenses complète, nous devons la restaurer. Dans le cas de N / N, tout est simple (prenez par exemple 3/3):

Formule: récupération d'image clé pour N / N

Ici H p (P) b i est une image clé partielle reçue du i-ème participant.

Pour les régimes N - 1 / N (2/3 au nom du premier participant sans la participation du troisième):

Formule: récupération d'image clé pour N - 1 / N

dans ce cas, H p (P) b i B j est une image clé partielle.

L'essence du processus d'échange de sorties est précisément que le nombre nécessaire de signataires de la transaction envoie leur image clé partielle pour chacune des sorties à d'autres participants du portefeuille. Dans le même temps, les participants ne divulguent pas leurs clés privées, de sorte qu'un observateur tiers ou un participant sans scrupules n'a pas la possibilité de restaurer la clé de dépense complète et de saisir le portefeuille seul.

Ayant ces données, l'initiateur de la transaction peut les former et les préparer pour la signature. La transaction générée est envoyée à tous ceux qui acceptent de la signer pour générer des signatures Ring CT, toutes les signatures nécessaires sont créées et la transaction est envoyée au réseau.

Automatisation de l'échange de données


Les procédures ci-dessus sont décrites pour l'échange de parties de clés et d'images clés qui doivent être effectuées une fois ou après chaque transaction envoyée. Dans l'implémentation actuelle de Monero Core Wallet, il est proposé d'effectuer ces actions manuellement en échangeant manuellement les données nécessaires via des canaux de communication sécurisés avec leurs correspondants (en exportant les données nécessaires depuis le portefeuille et en les envoyant via des messageries instantanées ou d'une autre manière).

Vous pouvez le démontrer par l'exemple de la création d'un portefeuille selon le schéma 2/3 et la signature de la transaction. Chacun des participants exécute les commandes suivantes à l'aide de l'utilitaire monero-wallet-cli:

  [portefeuille 9uKCgo]: prepare_multisig
 MultisigV1baCWviNomMXe271W8HW4imh8SsnNEWP2bCswQfoB9MGzNZ8FUG3e8UCNm5toKQzSQH2e8rUWUCGazaCcvej1ToCQYBMovJZYaYiYWQvzsvyWruXycZdVDSsyugjEzwQNK3FUEkug2LXiH91NmekGb7kp9gK9kuoxDDhGn1nLKXUpnXR5
 Envoyez ces informations multisig à tous les autres participants, puis utilisez make_multisig <threshold> <info1> [<info2> ...] avec les informations multisig des autres
 Cela inclut la clé de vue PRIVÉE, donc doit être divulgué uniquement aux participants de ce portefeuille multisig 

 [Porte-monnaie 9uKCgo]: make_multisig 2 MultisigV1XQugvU4JwcwTQbKdH5qGFnavxUX54wGxNis2iN6zoLD94DahnXbyNxH1NQBp2rYRFFJCT2uiJbssHLJYEAb8X1tS5UCqTXYu3FkgRNSZt5mRNgE58iXZHPj839Pbm3ozGcXmRT6GcRMMxMjRonfYKpnPq1UyZSMN7Qr9AYin1gYyoJSh MultisigV1HVqTW8P4UNWUE8QfBaEdwDWJuXBWEPnTrKqVJiUudGG14cHREk9TKmeR9xzSs4wf4jd22mV94C2ehSViApawnpp2SpRqp19eKXLHz2JmNp7eGR6TJMt4VsDTqANRwb1FtD9weef342f5KXDRZK7iQT1MTubyHhEcFyV5aLCjjQ8owMkH
 Une autre étape est nécessaire
 MultisigxV1PQwytRuYGkB6UEVJ7v2S7q492cwNTdwySXyasToAuQQq73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA9WKnVpTJGyb7SbS7NwAgmpEhU812RTdzrdHp5sD41duYtRNW6qna5mTMYmtTjAEdKpKCvM6EwhV4ncWscpvoBfyYP
 Envoyez ces informations multisig à tous les autres participants, puis utilisez finalize_multisig <info1> [<info2> ...] avec les informations multisig des autres

 [Porte-monnaie 9uKCgo]: finalize_multisig MultisigxV1PdeMJo5rxcWTXDJ7rbyuacBseugsn2djZKKEdwvFYVmz73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojZTMmCJJ4evwJzcXEDqcAd7ShwxsJtJtXdiATs54BbBfyCbwXbnDRKAtagJF36z74KJA58NgEmnHv23ZQeePCoacM MultisigxV1RTwyE53FjKPQaAn4ZMWM5hc8C92eJndpyKby4L9HpF2TUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA928U2yJFK86jNxtMopxHkcnYjjeYfp8TAB53Y1CukBiHfL2M4EztDALXLReXjJxkMry65Jw6vVePJp2T5CW8T8QE5 

Avant d'envoyer une transaction, les parties doivent échanger des images clés partielles:

  [portefeuille 9uKCgo]: export_multisig_info ki1
 Informations multisig exportées vers ki1
 [portefeuille 9uKCgo]: import_multisig_info ki2 ki3
 Hauteur 1103873, txid <f7e648915287fafca1dc67eb26267e09f92bba7ab7fd52a12600c3e6440db0eb>, 2.000000000000, idx 0/0
 Hauteur 1103882, txid <2e3a5591c741c0943a47a2bcbd1ec26493158088c88308bcbfc97423ea95c491>, 0,009000000000, idx 0/0
 Informations multisig importées 

Ensuite, le portefeuille est resynchronisé en tenant compte des clés complètes et, après avoir reçu des données sur les paiements sortants, le participant peut préparer la transaction:

  [portefeuille 9uKCgo]: transfert 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX 1
 Aucun identifiant de paiement n'est inclus avec cette transaction.  Est-ce que ça va?  (O / Oui / N / Non): O
 Il y a actuellement un carnet de commandes de 2 blocs à ce niveau de frais.  Est-ce que ça va?  (O / Oui / N / Non) O

 Transaction 1/1:
 Dépenses de l'indice d'adresse 0
 Envoi 1.000000000000.  Les frais de transaction sont de 0,012000000000
 Est-ce que ça va?  (O / Oui / N / Non): O
 Transaction (s) non signée (s) correctement écrite (s) dans le fichier: multisig_monero_tx 

Il est nécessaire de transférer le fichier généré vers un autre participant pour signature et envoi au réseau:

  [portefeuille 9twQxU]: sign_multisig multisig_monero_tx
 1 chargé des opérations, pour 1,031762770000, les frais d'envoi, 0,012000000000 1,000000000000 à 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, 0,019762770000 changement 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, avec la taille de l'anneau min 7, no ID de paiement.  Est-ce que ça va?  (O / Oui / N / Non): O
 Transaction signée avec succès dans le fichier multisig_monero_tx, txid 1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6
 [portefeuille 9twQxU]: submit_multisig multisig_monero_tx
 1 chargé des opérations, pour 1,031762770000, les frais d'envoi, 0,012000000000 1,000000000000 à 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX, 0,019762770000 changement 9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk, avec la taille de l'anneau min 7, no ID de paiement.  Est-ce que ça va?  (O / Oui / N / Non): O
 Transaction soumise avec succès, transaction <1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6>
 Vous pouvez vérifier son état en utilisant la commande `show_transfers`. 

De toute évidence, cette approche, même si elle vous permet d'utiliser des portefeuilles multisig si vous le souhaitez vraiment, ne peut pas être appliquée par des utilisateurs inexpérimentés ou, par exemple, des utilisateurs de portefeuilles mobiles.

Par conséquent, nous développons notre propre solution qui automatiserait l'échange de ces données sans violer la confidentialité des parties et la sécurité des transactions afin de rendre la technologie de multi-signature dans Monero accessible à plus de personnes. La solution est basée sur des applications qui prennent en charge les portefeuilles standard et multisig, et une partie serveur ouverte qui fournit l'échange de données et le transfert vers les portefeuilles appropriés.

Vous pouvez en savoir plus sur ce projet sur wallet.exan.tech et sur les ressources que nous prenons en charge pour le réseau Monero, voir exan.tech/en/projects/monero .

Conclusion


Nous avons examiné le mécanisme de création de portefeuilles multisig et de formation de transactions avec plusieurs signatures dans Monero. Actuellement, seul un ensemble limité de schémas de signature est pris en charge, mais il sera étendu à des formules arbitraires de la forme 2/5, etc. Le mécanisme existant pour l'échange des données nécessaires au fonctionnement du portefeuille est plutôt gênant, mais en raison de l'ouverture de l'écosystème Monero à l'aide de solutions tierces, il peut être ramené à la qualité habituelle pour les utilisateurs ordinaires.

Dans les articles suivants, nous parlerons d'autres aspects de l'appareil Monero: RingCT et les signatures en anneau, l'architecture du portefeuille et la bibliothèque libwallet, ainsi que les perspectives de développement de cette blockchain.

Posez vos questions, proposez des sujets pour de nouveaux articles sur les technologies de crypto-monnaie et abonnez-vous à notre groupe sur Facebook pour rester au courant de nos événements et publications.

Source: https://habr.com/ru/post/fr412921/


All Articles