Table Des Matières
Abstrait
Le Bitcoin est une version purement P2P (pair à pair) de la monnaie digitale permettant d’envoyer directement les paiements en ligne d’une partie à l’autre sans passer par une institution financière centrale. Les signatures numériques fournissent une partie de la solution,mais les principaux avantages seront perdus si un tiers de confiance est toujours nécessaire pour éviter les doubles dépenses.
Nous proposons une solution au problème de la double dépense en utilisant un réseau P2P.
Le réseau expédie les transactions en les amenant dans une chaîne continue de hash basé sur la preuve de travail. formant un enregistrement qui ne peut pas être changé sans refaire la preuve de travail. La chaîne la plus longue ne sert pas seulement de preuve que la séquence des événements a été témoin, mais ça prouve aussi qu’elle provenait d’un groupe groupement plus grand des puissances CPU. Tant que la majorité de la puissance du processeur est contrôlée par des noeuds qui ne coopèrent pas avec les attaquants du réseau, elle générera une plus longue chaîne et distancera les attaquants. Le réseau lui-même nécessite une structure minimale. Les messages sont diffusés sur la base d’un meilleur effort, et les nœuds peuvent partir et rejoindre le réseau à volonté, acceptant la plus longue chaîne de preuve de travail comme preuve de ce qui s’est passé lorsqu’ils étaient partis.
Psssss: Au Moment où j’achève cet article le Bitcoine a atteint une somme vraiment importante dans le marché des changes l’image vous dira le reste!
1. Introduction
Le commerce sur Internet est venu s’appuyer presque exclusivement sur les institutions financières servant en tant que tiers de confiance pour traiter les paiements électroniques. Bien que le système fonctionne assez bien pour la plupart des transactions, il souffre toujours de certaines faiblesses natives dans un modèle basé sur la confiance. Les transactions totalement non réversibles ne sont pas vraiment possibles, du moment que les institutions financières ne peuvent pas éviter de régler les différends. Le coût de la médiation augmente les coûts de transaction, limite la taille minimale de la transaction pratique, et coupe la possibilité de petites transactions insouciantes, et il y a un coût plus grand dans la perte de la capacité de faire des paiements non réversibles pour des services non réversibles. Avec la possibilité de renversement, la nécessité de confiance se propage. Les commerçants doivent se méfier de leurs clients, les harceler pour plus d’informations dont ils auraient besoin. Un certain pourcentage de fraude est accepté comme inévitable. Ces coûts et incertitudes de paiement peuvent être évités en utilisant la monnaie physique, mais il n’existe aucun mécanisme pour effectuer des paiements sur un canal de communication sans une partie confiante.
Ce qu’il faut, C’est un système de paiement électronique basé sur une preuve cryptographique au lieu de la confiance, permettant à deux parties disposées de traiter directement entre elles sans avoir besoin d’un tiers de confiance. Les transactions qui sont peu pratiques pour le remboursement protégeront les vendeurs des fraudes, et les mécanismes d’engagement systématique pourraient facilement être mis en place pour protéger les acheteurs. Dans cet article, nous proposons une solution au problème de la double dépense en utilisant un serveur d’horodatage distribué par le système pair-à-pair (P2P) pour générer une preuve de calcul de l’ordre chronologique des transactions. Le système est sécurisé tant que les nœuds honnêts contrôlent collectivement plus de puissance du processeur (CPU) que tout groupe coopérant avec les nœuds d’attaquant.
2. Transactions
Nous définissons une pièce électronique comme une chaîne de signatures numériques. Chaque propriétaire transfère la pièce au suivant en signant numériquement le hachage de la transaction précédente et la clé publique du prochain propriétaire et en les ajoutant à la fin de la pièce. Le bénéficiaire peut vérifier les signatures pour vérifier la chaîne de la possession.
Le problème, bien sûr, le bénéficiaire ne peut pas vérifier que l’un des propriétaires n’a pas dépensé deux fois la pièce. Une solution commune consiste à introduire une autorité centrale de confiance, ou monnayer (Mint) qui vérifie s’il y a une double dépense pour chaque transaction. Après chaque transaction, la pièce doit être renvoyée au monnayer pour émettre une nouvelle, et seules les pièces émises directement à partir du monnayer, ne font pas l’objet d’une double dépense. Le problème avec cette solution est que le destin de l’ensemble du système monétaire dépend de la société qui gère la monnaie, chaque transaction aura à y passer, tout comme une banque.
Nous avons besoin d’un moyen qui permet au bénéficiaire de savoir si les propriétaires précédents ont ou non signé de transactions antérieures. Pour nos besoins, la première transaction est celle qui compte, nous ne nous soucions pas donc au sujet des tentatives ultérieures de double-dépenses. La seule façon de confirmer l’absence de transaction est d’être au courant de toutes les transactions. Dans le modèle monnayer, le monnayer doit être informé de toutes les transactions et c’est à lui que revient la décision de qui arrive le premier. Pour que cela puisse se réaliser sans le besoin d’une partie tiers de confiance, les transactions doivent êtres annoncées publiquement, et nous avons besoin d’un système pour que les participants acceptent un historique unique de l’ordre dans lequel ils ont été reçus. Le bénéficiaire a besoin de la preuve qu’au moment de chaque transaction, la majorité des nœuds ont convenu que c’était le premier reçu.
3. Serveur d’Horodatage
La solution que nous proposons commence par un serveur d’horodatage. Un serveur d’horodatage fonctionne en prenant un hash d’un bloc d’éléments à horodater et en le publiant largement, comme dans un journal ou une publication Usenet. L’horodatage prouve que les données doivent avoir existé à une telle date, évidemment, pour entrer dans le (hash). Chaque horodatage comprend l’horodatage précédent dans son hash, formant une chaîne, dont le rôle de chaque horodatage nouveau est de renforcer ceux qui le précédaient.
4. Preuve de travail
Pour implémenter un serveur d’horodatage distribué sur une base P2P, nous devrons utiliser un système de preuve de travail semblable à “Hashcash d’Adam Back”, plutôt que des journaux ou des publications de Usenet. La preuve de travail implique la recherche d’une valeur qui, lorsqu’elle est hachée, par exemple avec SHA-256, le hachage commence avec un nombre de zéro bits. Le travail moyen nécessaire est exponentielle au nombre zéro bits requis et peut être vérifié par l’exécution d’un seul hachage.
Pour notre réseau d’horodatage, nous accomplissons la preuve de travail en incrémentant un nonce dans le bloc jusqu’à ce que la valeur qui donne au hachage du bloc le zéro bits requis soit trouvée . Une fois l’effort du CPU a été dépensé pour rendre satisfaisante la preuve du travail, le bloc ne peut pas être changé sans refaire le travail. Vus que les blocs sont enchaînés, changer un bloc c’est changer tous ceux qui le suivent.
La preuve de travail résout également le problème de la détermination de la représentation dans la prise de décision de la majorité. Si la majorité était basée sur “one-IP-address-one-vote” (une adresse IP et un vote), elle pourrait être subverti par n’importe qui capable d’allouer de nombreuses adresses IP. La preuve de travail est essentiellement “one-CPU-one-vote” (un processeur-un-vote). La décision de la majorité est représentée par la chaîne la plus longue, qui a le plus grand effort de preuve de travail investi. Si la majorité de la puissance du CPU est contrôlée par des nœuds honnêtes, la chaîne honnête augmentera plus rapidement et dépassera toutes les chaînes concurrentes. Pour modifier un bloc ancien, un attaquant doit refaire la preuve de travail du bloc et celles de tous les blocs venant après et ensuite rattraper et dépasser tout le travail que les nœuds honnêtes ont pu faire. Nous montrerons plus tard que la probabilité qu’un attaqueur plus lent puisse ratrapper tout le travail que les blocs ont exécuté, diminue de manière exponentielle à mesure que les blocs suivants sont ajoutés. Pour compenser l’augmentation de la vitesse du matériel et l’intérêt variable pour le fonctionnement des nœuds avec le temps, la difficulté de la preuve de travail est déterminée par la moyenne mobile ciblant le nombre moyen de blocs par heure.
5. Réseau
Les étapes pour exécuter un réseau sont les suivantes:
- Les nouvelles transactions sont diffusées à tous les nœuds
- Chaque noeud collecte de nouvelles transactions dans un bloc.
- Chaque noeud cherche à trouver une preuve de travail difficile pour son bloc.
- Lorsqu’un nœud trouve une preuve de travail, il diffuse le bloc sur tous les nœuds
- Les noeuds acceptent le bloc uniquement si toutes les transactions sont valides et ne font pas l’objet d’une double dépense.
- Les nœuds expriment leur acceptation du bloc en travaillant sur la création du bloc suivant dans la chaîne, en utilisant la valeur de hachage du bloc acceptée comme celle du hachage précédente.
Les noeuds considèrent toujours la chaîne la plus longue comme la bonne et continueront à travailler pour l’étendre. Si deux nœuds diffusent simultanément différentes versions du prochain bloc, certains nœuds peuvent recevoir l’un ou l’autre en premier. Dans ce cas, ils travaillent sur le premier qu’ils ont reçu, mais sauvegardent l’autre branche au cas où elle devient plus longue. Le noeud sera interrompu lorsque la prochaine preuve de travail sera trouvée et une branche devient plus longue; les nœuds qui travaillaient sur l’autre branche passent ensuite à la plus longue.
Les nouvelles émissions des transactions ne doivent pas nécessairement toucher tous les nœuds, tant qu’elles atteignent de nombreux noeuds, elles entreront dans le bloc avant longtemps. Les émissions de blocs tolèrent également les messages abandonnés. Si un noeud ne reçoit pas de bloc, il le demandera quand il recevra le bloc suivant et se rend compte qu’il en a manqué un.
6. Incitatif
Par convention, la première transaction dans un bloc est une transaction spéciale qui déclenche une nouvelle pièce appartenant au créateur du bloc. Cela ajoute une incitation aux nœuds pour soutenir le réseau, et fournit un moyen de distribuer initialement les pièces en circulation, tant qu’il n’y a pas d’autorité centrale pour les émettre. L’addition régulière d’une quantité constante de pièces nouvelles est semblable aux mineurs d’or qui dépensent des ressources pour ajouter de l’or à la circulation. Dans notre cas, c’est le temps de fonctionnement du CPU et l’électricité qui sont dépensés.
L’incitatif peut également être financé avec les frais de transaction. Si la valeur de sortie d’une transaction est inférieure à sa valeur d’entrée, la différence est une taxe de transaction ajoutée à la valeur incitative du bloc contenant la transaction. Une fois qu’un nombre prédéterminé de pièces entre en circulation,l’incitation peut transiter entièrement aux frais de transaction et être entièrement sans inflation. Si un attaquant gourmand est capable d’assembler plus de puissance de CPU que tous les noeuds honnêtes, il devrait choisir de l’utiliser pour frauder les gens en volant ses paiements ou en l’utilisant pour générer de nouvelles pièces. Il devrait trouver que c’est plus rentable pour lui de respecter les règles du jeux, des règles qui le favorisent avec plus de pièces nouvelles que tout le monde combiné, que de saper le système et en même temps la validité de sa propre richesse!
7. Récupération de l’espace disque
Une fois que la dernière transaction dans une pièce de monnaie est enterrée sous suffisamment de blocs, les transactions passées avant, peuvent être jetées pour économiser de l’espace dans le disque. Pour faciliter cela sans casser le hachage du bloc, les transactions sont hachées dans l’arbre de Merkle “ Merkle Tree “, avec seulement la racine incluse dans le hachage du bloc. Les vieux blocs peuvent ensuite être compactés en écrasant les branches de l’arbre. Les hachages intérieurs n’ont pas besoin d’être stockés.
Un en-tête de bloc sans transaction serait d’environ 80 bytes. Si nous supposons que les blocs sont générés toutes les 10 minutes, 80 octets * 6 * 24 * 365 = 4,2 Mo par an. Avec les systèmes informatiques généralement vendus avec 2GB de RAM à partir de 2008, et Moore’s Law prédisant une croissance actuelle de 1,2 GB par an, le stockage ne devrait pas poser de problème même si les en-têtes des blocs doivent être conservés dans la mémoire.
8. Vérification du paiement simplifié
Il est possible de vérifier les paiements sans exécuter les nœud du réseau complet. L’utilisateur doit seulement conserver une copie des en-têtes de blocs de la chaîne de la plus longue preuve de travail, qu’il peut obtenir en demandant les noeuds du réseau jusqu’à ce qu’il soit convaincu qu’il ait la chaîne la plus longue et obtienne la branche Merkle qui relie la transaction au bloc dans lequel elle été horodifée. Il ne peut pas vérifier la transaction pour lui-même, mais en la reliant à une place dans la chaîne, il peut voir qu’un noeud de réseau l’a accepté, et les blocs ajoutés après la confirmation du réseau l’ont aussi accepté.
En tant que tel, la vérification est fiable tant que les nœuds honnêts contrôlent le réseau, mais est plus vulnérables si le réseau est surchargé par un attaquant. Alors que les nœuds du réseau peuvent vérifier les transactions pour eux-mêmes, la méthode simplifiée peut être trompée par les transactions fabriquées par un attaquant tant que ce dernier peut continuer à surpasser le réseau. Une stratégie pour se protéger contre cela consiste à accepter les alertes des noeuds du réseau lorsqu’ils détectent un bloc invalide, incitant le logiciel de l’utilisateur à télécharger le bloc complet et a alerté les transactions pour confirmer l’incohérence. Les sociétés qui reçoivent des paiements fréquents voudront probablement exécuter leurs propres nœuds pour une sécurité plus indépendante et une vérification plus rapide.
9. Combinaison et fractionnement de la valeur
Bien qu’il soit possible de gérer les pièces individuellement, Il serait difficile d’effectuer une transaction distincte pour chaque cent dans un transfert. Pour permettre la répartition et la combinaison de la valeur, les transactions contiennent plusieurs entrées et sorties. Normalement, il y aura une seule entrée depuis une transaction précédente plus grande ou des entrées multiples combinant des sommes plus petites, et au plus deux sorties: l’une pour le paiement, et l’autre renvoyant la modification, le cas échéant, à l’expéditeur.
Il convient de noter qu’un fan-out, où une transaction dépend de plusieurs transactions, et que ces transactions à leur tour dépendent de plusieurs d’autre, n’est pas un problème ici. Il n’est jamais nécessaire d’extraire une copie complète autonome d’un historique d’une transaction.
10. Confidentialité
Le modèle bancaire traditionnel atteint un niveau de vie privée en limitant l’accès à l’information aux parties concernées et au tiers de confiance. La nécessité d’annoncer toutes les transactions publiquement exclue cette méthode, mais la vie privée peut encore être maintenue en brisant le flux d’information dans un autre endroit: en gardant les clés publiques anonymes. Le public peut voir que quelqu’un envoie un montant à quelqu’un d’autre, mais sans informations reliant la transaction à quiconque. Ceci est similaire au niveau d’information publié par les bourses, où le temps et la taille des échanges individuels, la transaction est rendue publique, mais sans dire qui étaient les parties.
En tant que pare-feu supplémentaire, une nouvelle paire de clés devrait être utilisée pour chaque transaction afin de les empêcher d’être lié à un propriétaire commun. Certains liens sont encore inévitables avec les transactions multi-entrées, ce qui révèle nécessairement que leurs entrées appartenaient au même propriétaire. Le risque est que si le propriétaire d’une clé est révélé, la liaison pourrait révéler d’autres transactions appartenant au même propriétaire.
11. Les calculs
Nous considérons le scénario d’un attaquant essayant de générer une chaîne alternative plus rapide que la chaîne honnête. Même si cela est accompli, il ne lance pas le système à des changements arbitraires, comme créer une valeur qui n’existait pas ou prendre de l’argent qui n’a jamais été le sien. Les nœuds n’accepteront pas une transaction invalide en paiement, et les nœuds honnêtes n’accepteront jamais un bloc qui les contient. l’attaquant peut seulement essayer de changer une de ses propres transactions pour récupérer l’argent qu’il a récemment dépensé.
La course entre la chaîne honnête et une chaîne d’attaquants peut être caractérisée comme une Randonnée de marche Binomiale. L’événement de réussite est la chaîne honnête qui s’étend d’un bloc, en augmentant son avance par +1, et l’événement d’échec est que la chaîne de l’attaquant soit étendue d’un bloc, réduisant l’écart par -1.
La probabilité qu’un attaquant atteigne le déficit donné est semblable à un parieur ruiné. Supposons qu’un joueur avec un crédit illimité joue, puis il a tout perdu et commence à jouer potentiellement un nombre infini d’essais pour tenter de sortir de l’état de déficit.
Nous pouvons calculer la probabilité que ce joueur sort de l’état déficitaire, ou qu’un attaquant rattrape la chaîne honnête, comme suit:
Compte tenu de notre hypothèse selon laquelle p> q, la probabilité diminue exponentiellement, car le nombre de blocs auxquels l’attaquant doit rattraper augmente. Avec les chances contre lui, s’il ne fait pas un coup de foudre chanceux dès le début, ses chances deviennent de plus en plus faibles car il perd beaucoup de terrain en tombant davantage en arrière.
Nous considérons maintenant combien de temps le destinataire d’une nouvelle transaction doit attendre avant d’être suffisamment certain que l’expéditeur ne peut pas modifier la transaction. Nous supposons que l’expéditeur est un attaquant qui veut faire croire au destinataire qu’il l’a payé pendant un certain temps, puis il a changé pour se rembourser lui même après un certain temps. Le destinataire sera averti lorsque cela se produira, mais l’expéditeur espère que cela arrivera trop tard.
Le destinataire génère une nouvelle paire de clés et donne la clé publique à l’expéditeur peu avant la signature. Cela empêche l’expéditeur de préparer une chaîne de blocs à l’avance en travaillant continuellement jusqu’à ce qu’il ait la chance d’aller assez loin avant d’exécuter la transaction à ce moment-là. Une fois la transaction envoyée, l’expéditeur malhonnête commence à travailler en secret sur une chaîne parallèle contenant une autre version de sa transaction. Le destinataire attend jusqu’à ce que la transaction ait été ajoutée à un bloc et que des blocs z ont été liés après cela. Il ne connaît pas le montant exact des progrès réalisés par l’attaquant, mais en supposant que les blocs honnêtes ont pris le temps moyen attendu par bloc, le progrès potentiel de l’attaquant sera une distribution de Poisson avec une valeur attendue:
Pour obtenir la probabilité que l’attaquant puisse encore rattraper maintenant, nous multiplions la densité de Poisson pour chaque niveau de progrès qu’il aurait pu réaliser par la probabilité qu’il puisse rattraper ce point:
Réorganiser pour éviter de résumer la queue infinie de la distribution …
Conversion en C code …
#include <math.h> double AttackerSuccessProbability(double q, int z) { double p = 1.0 - q; double lambda = z * (q / p); double sum = 1.0; int i, k; for (k = 0; k <= z; k++) { double poisson = exp(-lambda); for (i = 1; i <= k; i++) poisson *= lambda / i; sum -= poisson * (1 - pow(q / p, z - k)); } return sum; }
En exécutant certains résultats, on peut voir que la probabilité diminue exponentiellement avec z
q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006
Résoudre pour P moins de 0,1% …
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340
12. Conclusion
Nous avons proposé un système de transactions électroniques sans compter sur la confiance. Nous avons commencé avec le cadre habituel des pièces en provenance de signatures numériques, qui assurent un fort contrôle de la propriété, mais est incomplète sans prévenir les dépenses doubles. Pour résoudre ce problème, nous avons proposé un réseau peer-to-peer à l’aide d’une preuve de travail pour enregistrer un historique public de transactions qui devient rapidement impraticable au calcul pour un attaquant voulant changer quoi que ce soit si les nœuds honnêtes contrôlent la majorité de la puissance du processeur. Le réseau est robuste dans sa simplicité non structurée. Les noeuds fonctionnent tous à la fois avec peu de coordination. Ils n’ont pas besoin d’être identifiés, puisque les messages ne sont pas expédiés vers un endroit particulier et ne doivent être livrés que sur la base du meilleur effort. Les nœuds peuvent partir et rejoindre le réseau à volonté, accepter la chaîne de la preuve de travail comme preuve de ce qui s’est produit alors qu’ils étaient partis. Ils votent avec leur puissance CPU, expriment leur acceptation de blocs valides en travaillant pour les étendre et rejeter les blocs non validés en refusant de travailler sur eux. Toutes les règles et les incitations nécessaires Toutes les règles et les incitations nécessaires peuvent être appliquées avec ce mécanisme de consensus.
Note: Cet article est une traduction française de Satoshi Nakamoto white paper