L'année dernière, j'ai écrit 5 idées sur Bitcoin, ce qui semble être le premier article sur Bitcoin, et aujourd'hui, je vais vous présenter le protocole Bitcoin.
Cet article est une traduction de l'article de Michael Nielsen sur le protocole Bitcoin, qui est l'article le plus clair que le traducteur ait écrit sur le fonctionnement du protocole Bitcoin. Michael Nielsen est un scientifique, écrivain et programmeur de premier plan qui étudie le calcul quantique. Les détails sont à lire dans sa propre introduction. L'article est traduit parce que le traducteur pense que l'article et la discussion sur Bitcoin ont beaucoup, beaucoup de soutien.
Nakamoto lui-même n'est jamais allé convaincre les autres, mais il a publié l'article sur Internet pour que les autres le jugent eux-mêmes. Il a dit lui-même
Des milliers d'articles ont tenté d'expliquer Bitcoin, une monnaie en ligne "peer-to-peer". La plupart des articles ont été écrits sur le protocole sous-jacent, omettant de nombreux détails. Même les articles très approfondis sont bloqués là où c'est crucial.
Comprendre profondément ce protocole est difficile, car il est facile de prendre Bitcoin comme un fait et de penser à comment l'utiliser pour faire de l'argent spéculatif, de savoir si c'est une bulle, de savoir si Bitcoin signifie la fin des impôts, etc. Ces idées sont intéressantes à penser, mais elles limitent gravement votre compréhension. Comprendre le protocole Bitcoin lui-même ouvrira d'autres perspectives inaccessibles. Par exemple, le protocole est la base du langage de script intégré à Bitcoin, qui vous permet de créer de nouveaux instruments financiers avec Bitcoin, tels que des contrats intelligents.
J'expliquerai les scripts et les contrats intelligents de Bitcoin dans un article ultérieur. Dans cet article, je vais me concentrer sur les détails spécifiques du protocole Bitcoin. Pour comprendre cet article, vous devez probablement être familier avec les mots de passe de clé publique et les signatures numériques associées.
La base de Bitcoin est la cryptographie, ce qui peut vous surprendre, n'est-ce pas que Bitcoin est une monnaie? Est-ce qu'il s'agit d'une façon d'envoyer des informations secrètes? En fait, la plupart des problèmes que Bitcoin veut résoudre concernent la protection des transactions en veillant à ce que les gens ne volent pas les choses des autres ou ne prétendent pas être d'autres personnes, etc. Dans le monde physique composé d'atomes, nous sommes sécurisés par des serrures, des signatures, des coffres-forts bancaires, etc. Dans le monde de l'information, nous sommes sécurisés par la cryptographie.
La stratégie de cet article est de construire Bitcoin en plusieurs niveaux. Nous allons commencer par une monnaie numérique très simple, que nous appelons temporairement le "Infocoin", pour la différencier du Bitcoin. Bien sûr, notre première version d'Infocoin aura beaucoup de défauts, donc nous allons passer par plusieurs itérations, introduisant un ou deux nouveaux concepts à chaque itération.
Cette approche est un peu plus lente que d'expliquer directement Bitcoin dès le début. Mais même si vous pouvez comprendre le principe de Bitcoin, il est difficile de comprendre pourquoi Bitcoin a été conçu de cette façon.
Pour finir, je dois dire que je suis relativement nouveau dans le monde des bitcoins. J'ai eu une attention grossière en 2011, mais j'ai vraiment étudié les détails au début de 2013.
À première vue, une monnaie numérique semble impossible. Supposons qu'une personne que nous appelons Alice ait des pièces numériques qu'elle veut dépenser. Si Alice peut utiliser une série de caractères comme monnaie, comment pouvons-nous l'empêcher d'utiliser la même série de caractères à plusieurs reprises?
Ce ne sont que deux des nombreux problèmes à résoudre avec l'information comme monnaie. Dans la première édition d'Infocoin, nous avons essayé de demander à Alice de donner une chaîne comme monnaie et de trouver un moyen de la protéger contre la contrefaçon. Supposons qu'Alice donne un infocoin à une autre personne, Bob.
Cette méthode n'est pas très connue, mais elle présente quelques avantages. N'importe qui dans le monde peut utiliser la clé publique d'Alice pour vérifier qu'Alice est vraiment la personne qui a signé. Personne d'autre ne peut produire le résultat de cette signature (cette signature ne peut être produite qu'à partir de la clé privée d'Alice, voir la signature numérique mentionnée ci-dessus), donc Alice ne peut pas dire non, je n'ai pas donné l'infocoin à Bob. Ainsi, le protocole fournit la preuve qu'Alice avait vraiment l'intention de donner un infocoin à Bob. De même, personne d'autre ne peut produire un tel message signé, empêchant ainsi d'autres de falsifier le message d'Alice. Bien sûr, une fois qu'Alice a publié son message, il est possible que d'autres le reproduisent, mais il est impossible de le falsifier avant de le publier.
Je n'ai pas encore dit ce qu'est vraiment l'argent dans ce protocole. Ce qui est clair, c'est que l'argent est en fait le message lui-même. C'est-à-dire que la chaîne de signatures représente les caractères que ma mère Alice va donner à Bob pour obtenir un infocoin.
Le problème de notre première version d'Infocoin était qu'Alice pouvait envoyer à Bob le même message signé à plusieurs reprises. Supposons que Bob reçoive 10 messages disant: "Moi, Alice, donnez un infocoin à Bob".
Ce que nous voulons, c'est que l'infocoin ait une identité unique. Elle a besoin d'une balise ou d'un numéro de série. Alice peut signer une fiche d'infocoin avec le numéro de série 8740348 dans le message.
Pour que ce système fonctionne, nous devons avoir une source fiable de numéros de série. Une façon de générer des numéros de série est de créer une institution, comme une banque. Cette banque générera des numéros de série pour les infocoins, enregistrera qui possède lequel et vérifiera l'authenticité des transactions.
Plus en détail, supposons qu'Alice aille à une banque et dise: "Je vais retirer un infocoin de mon compte". Cette banque déduit un infocoin de son compte, puis lui donne un nouveau numéro de série qu'elle n'a jamais utilisé, disons 1234567. Puis, quand Alice veut envoyer un infocoin à Bob, elle signe ce nouveau message en disant: "Alice va donner à Bob un infocoin de série 1234567.
Cette solution semble très prometteuse. Mais nous pouvons faire quelque chose de plus ambitieux. Nous pouvons supprimer les banques de l'accord. Cela change considérablement les propriétés de la monnaie elle-même. Cela signifie qu'il n'y aura pas d'organisation distincte responsable de cette monnaie.
La méthode consiste à faire en sorte que tout le monde travaille ensemble pour devenir une banque. En particulier, supposons que chaque personne qui utilise l'infocoin conserve un enregistrement complet, y compris celui de qui appartient l'infocoin. Vous pouvez l'imaginer comme un registre public partagé, qui enregistre tous les enregistrements de transactions d'infocoin.
Maintenant, supposons qu'Alice va donner un infocoin à Bob. Elle signe à mon message une fiche d'infocoin avec le numéro de série 1234567 à Alice pour Bob. Et elle envoie le message signé à Bob, Bob peut vérifier avec sa propre chaîne de blocs.
Nous avons toujours un problème sur l'origine du numéro de série de l'infocoin, mais c'est en fait facile à résoudre, alors je vais le clarifier plus tard. Le problème plus difficile est que ce protocole permet à Alice de dépenser son infocoin en répétition. Elle peut publier un message signé disant qu'Alice va donner à Bob un numéro de série d'infocoin de 1234567. Elle peut aussi publier un message signé disant qu'Alice va donner à Charlie un numéro de série d'infocoin de 1234567. Bob et Charlie utilisent leur propre blockchain pour vérifier que l'infocoin est bien celui d'Alice.
Nous appelons ce problème le problème du double-spending du double-spending, et à première vue, il semble difficile de réussir. Après tout, si Alice envoie le message à Bob d'abord, puis Bob envoie le message à tous les autres, y compris Charlie, les autres ont mis à jour leur blockchain. À ce moment-là, Charlie ne sera pas dupé par Alice.
Comment résoudre ce problème? Le moyen le plus simple est que Bob ne vérifie pas seul la transaction lorsque Alice envoie des infocoins à Bob. Il devrait publier la transaction en attente sur l'ensemble du réseau d'infocoins pour que d'autres personnes aident à juger si la transaction est légitime. Si tous décident que la transaction est légitime, Bob peut accepter l'infocoin et tout le monde peut mettre à jour leur blockchain.
Plus spécifiquement, supposons qu'Alice veuille donner à Bob un infocoin. Comme précédemment, elle signe un message, et qu'Alice donne à Bob une pièce d'infocoin avec le numéro de série 1234567, et qu'elle signe un message de bonne réputation à Bob. Comme précédemment, Bob fait une vérification sur sa propre blockchain, et la pièce appartient effectivement à Alice.
Il y a encore beaucoup d'incertitudes sur ce protocole. Par exemple, qu'est-ce que cela signifie une fois que suffisamment de personnes ont publié ce message, combien de personnes sont suffisantes? Il ne peut pas s'agir de l'ensemble du réseau infocoin, car nous ne savons pas à l'avance qui est sur le réseau infocoin. De même, il ne peut pas s'agir d'une partie fixe des utilisateurs.
Supposons qu'Alice veuille doubler dans le protocole ci-dessus et qu'elle ait besoin de prendre en charge l'ensemble du réseau d'infocoin. Supposons qu'elle utilise un système automatisé pour créer des comptes avec de nombreuses identités différentes sur le réseau d'infocoin, supposons qu'il y en ait un milliard. Comme précédemment, elle tente de doubler et donne le même infocoin à Bob et Charlie, mais lorsque Bob et Charlie demandent au réseau d'infocoin de vérifier la transaction, les chevaux d'Alice inondent le réseau, disant à Bob et Charlie qu'ils peuvent passer par la transaction et peut-être tromper l'un d'entre eux ou les deux pour accepter la transaction.
Il y a une façon intelligente de vérifier une transaction avec une méthode appelée Proof-of-work. Cette méthode n'est pas intuitive et nécessite une combinaison de deux concepts: 1) faire en sorte que le processus d'examen de la transaction coûte beaucoup plus de coûts de calcul; 2) récompenser ceux qui aident à vérifier la transaction.
C'est le but du certificat de travail. Mais pour vraiment comprendre le certificat de travail, nous devons aller plus loin dans les détails.
Supposons qu'Alice publie un message à l'ensemble du réseau: "Moi, Alice, je vais donner à Bob un message d'infocoin avec le numéro de série 1234567". Lorsque les autres personnes sur le réseau entendent ce message, tout le monde l'ajoute à une liste de transactions en attente, qui n'ont pas encore été acceptées par l'ensemble du réseau. Par exemple, une personne sur le réseau nommée David peut avoir la liste de transactions en attente suivante:
David vérifie sa propre blockchain et voit que les transactions ci-dessus sont légitimes. Il veut aider à diffuser ce message de validation à travers le réseau. Mais, avant cela, le protocole de vérification des transactions nécessite que David résout une énigme de calcul, une preuve de travail.
Pour expliquer cela, nous l'avons inclus dans le protocole lui-même à l'aide d'une fonction hash fixe que tout le monde connaît sur le réseau. Bitcoin utilise une fonction hash SHA-256 bien connue, mais n'importe quelle fonction hash cryptographique peut être utilisée ici. Nous avons donné à ce groupe de transactions en attente un marqueur, un L pour que nous puissions le citer plus tard. Ce groupe de transactions en attente est également équivalent à un bloc dans la blockchain.
Le problème que David va résoudre est de trouver un nombre aléatoire de x, et lorsque nous ajoutons ce x après L et que nous hashons cette combinaison, le résultat commence par plusieurs 0s. La difficulté de ce problème peut être réglée en ajustant le nombre de zéros qui commencent. Une simple preuve de travail de la coquille ne nécessite que 3 ou 4 zéros pour commencer le hash, une preuve de travail de la coquille difficile peut nécessiter plus de zéros, par exemple 15 zéros consécutifs.
Et vous pouvez voir que cela ne fonctionne pas quand x est égal à 1.
Et puis on a essayé x est égal à 2, et puis x est égal à 3, 4, 5... et finalement, on a trouvé x est égal à 4350.
Ce nombre aléatoire de x nous donne un résultat de quatre haschs à zéro début. Cela suffit pour résoudre un simple problème de démonstration de hasard.
Ce qui rend ce problème difficile à résoudre, c'est que les résultats de la fonction de hachage cryptographique sont toujours aléatoires, et qu'un changement mineur de la valeur d'entrée sera si difficile à prévoir que les résultats de la fonction de hachage entièrement différent. Donc, si nous voulons que les résultats de sortie doivent commencer par 10 zéros, David aura besoin en moyenne de 1610 ≈ 1012 x différents pour trouver la valeur appropriée.
De toute évidence, nous pouvons contrôler la difficulté des problèmes de preuve de travail en spécifiant le nombre de zéros nécessaires. En fait, le protocole Bitcoin a un meilleur contrôle de la difficulté des problèmes en modifiant légèrement les preuves de travail ci-dessus. Il n'est plus nécessaire de spécifier le nombre de zéros initiaux, mais le résultat du hash du bloc doit être inférieur ou égal à une valeur cible, qui est automatiquement ajustée pour garantir que chaque bloc de Bitcoin prend en moyenne 10 minutes à résoudre.
Eh bien, supposons que David ait eu la chance de trouver une bonne x (nonce), félicitations! (il sera récompensé pour avoir trouvé cette réponse). Il publie qu'il a prouvé que les transactions dans ce bloc sont légitimes, et en même temps il publie la valeur de x qu'il a trouvée, et les autres participants dans l'infocoin peuvent prouver que cette preuve de travail de x est valide.
Pour que le programme fonctionne, les participants du réseau devraient avoir besoin d'un mécanisme d'incitation pour aider à vérifier les transactions. Sans un mécanisme d'incitation, personne ne serait prêt à dépenser sa propre puissance de calcul pour aider à vérifier les transactions. Si les participants du réseau ne sont pas prêts à dépenser leur propre puissance de calcul, le système ne fonctionnera pas.
Dans le protocole de Bitcoin, ce processus de vérification est appelé "mining"; les récompenses de chaque bloc de transaction seront réduites à 10 à 8 bitcoins. Au début, il y a une récompense de 50 bitcoins par bloc de 210.000 vérifications (soit environ tous les 4 ans), mais la récompense sera réduite de moitié. Jusqu'à présent, cela n'est arrivé qu'une seule fois, c'est-à-dire que la récompense obtenue pour vérifier un bloc est de 25 bitcoins. Le processus de réduction de moitié se poursuivra jusqu'à 2140 environ.
Vous pouvez considérer la preuve de travail comme un processus de transaction de vérification concurrentielle. Chaque participant dépense une partie de la puissance de calcul de l'ordinateur. Les chances de victoire d'un mineur sont probablement proportionnelles à la taille de la puissance de calcul qu'il contrôle par rapport à la puissance de calcul de l'ensemble du réseau. Par exemple, si un mineur contrôle un pour cent de la puissance de calcul de l'ensemble du réseau, il a probablement une probabilité de victoire d'environ un pour cent.
Bien sûr, nous n'avons pas assez de confiance pour utiliser la blockchain comme monnaie, même si les chances de la destruction de l'ensemble de la blockchain par des mineurs malhonnêtes sont minces.
Je vais tout de suite analyser le problème des doubles fleurs, mais avant cela, je voudrais ajouter un détail important à la notion d'Infocoin. Idéalement, nous espérons que le réseau Infocoin unifie l'ordre dans lequel les transactions se déroulent. Si nous n'avons pas un ordre unifié, il n'est pas très clair qui a quel infocoin à un moment donné.
Par hasard, une branche est produite sur une blockchain. C'est parce que parfois, deux mineurs vérifient presque simultanément une transaction de bloc. Ils sont publiés simultanément sur le réseau, certains mettant à jour leur blockchain d'une manière, d'autres mettant à jour leur blockchain d'une autre manière.
Cela crée la situation que nous voulons éviter. Dans cette situation, l'ordre des transactions n'est pas clair, et on ne sait pas qui a quel infocoin. Heureusement, il y a une méthode simple qui peut être utilisée pour déplacer les branches.
Supposons que nous ayons une branche et que certains mineurs reçoivent le bloc A en premier, et que d'autres mineurs reçoivent le bloc B en premier. Les mineurs qui reçoivent le bloc A continueront à creuser le long de leur branche, tandis que d'autres vont creuser le long du bloc B. Supposons que les mineurs de la branche B réussissent à creuser le bloc suivant:
Quand ils reçoivent ce message, les gens de la branche A remarquent que la branche B est la plus longue et passent donc à la branche B. Le travail sur la branche A s'arrête rapidement, de sorte que tout le monde travaille sur la blockchain dans le même ordre. Ensuite, le bloc A est ignoré. Bien sûr, toutes les transactions en attente dans le bloc A restent en attente, puis sont placées dans le nouveau bloc sur la branche B, de sorte que toutes les transactions sont finalement vérifiées.
De la même manière, si le mineur de la branche A creuse le bloc suivant avant le mineur de la branche B, alors le mineur de la branche B s'arrête et passe à la branche A.
Quoi qu'il en soit, ce processus garantit un ordre uniforme sur la blockchain. Dans Bitcoin, une transaction ne peut être confirmée qu'à partir du moment où 1) elle existe dans le bloc le plus long de la branche, et 2) au moins 5 blocs vérifiés sont vérifiés après elle. Dans ce cas, nous disons que la transaction a eu 6 confirmations.
Maintenant que nous comprenons l'ordre chronologique, nous pouvons revenir à la question de savoir ce qui se passerait si une personne malhonnête voulait dépenser deux fois. Supposons qu'Alice donne à Bob et Charlie la même transaction à la fois. Une possibilité est de lui demander de vérifier un bloc avec deux transactions à la fois. Supposons qu'elle ait un pour cent de capacité de calcul.
Mais une autre possibilité est qu'elle essaie de publier deux transactions séparément. Elle peut publier une transaction à une partie des mineurs et une autre transaction à une autre partie des mineurs, et elle souhaite que les deux transactions soient vérifiées. Heureusement, dans ce cas, comme nous venons de le dire, le réseau finit par confirmer une seule transaction.
Une autre possibilité est qu'Alice = Bob, c'est-à-dire qu'Alice essaie de donner une pièce à Charlie et qu'elle la donne à elle-même, car elle peut avoir plusieurs comptes. Dans ce cas, la stratégie d'Alice est d'attendre que Charlie accepte l'Infocoin, c'est-à-dire probablement après que la transaction ait été confirmée 6 fois sur la plus longue blockchain.
Malheureusement, à ce moment-là, Alice était déjà six pas en retard sur la plus longue chaîne de blocs. Elle avait du mal à suivre la branche la plus longue. Les autres mineurs ne l'aidaient pas, car ils devaient tous travailler sur la branche la plus longue pour être récompensés. À moins qu'Alice ne soit capable de se combiner plus rapidement que les autres sur le réseau lorsqu'elle a prouvé sa capacité à résoudre le problème (c'est-à-dire qu'elle avait probablement plus de 50% de la capacité de calcul de l'ensemble du réseau).
Bien sûr, ce n'est pas très strict de dire qu'Alice ne peut certainement pas doubler. Ce n'est qu'une hypothèse raisonnable. Le livre blanc original du Bitcoin n'a pas fait une analyse de sécurité rigoureuse, mais seulement des hypothèses informelles similaires à celles que j'ai ici.
L'auteur de la deuxième partie, Michael, a laissé de côté le concept d'Infocoin pour expliquer le protocole Bitcoin plus en détail à travers la vue des transactions Bitcoin.
Si vous trouvez cela utile, vous pouvez également suivre l'auteur de cet article, Michael Nielsen, à 17ukkKt1bNLAqdJ1QQv8v9Askr6vy3MzTZ, ou suivre le premier chapitre de son prochain livre sur les réseaux neuronaux et l'apprentissage profond.
Nous avons donc décidé d'étudier la Bible en famille.