Est-il possible de dépenser un même bitcoin plusieurs fois ?


Il est évidemment impossible de dépenser deux fois le même bitcoin.

Si Josiane essaye de dépenser un même bitcoin pour payer un achat effectué auprès de Robert (transaction TRobert), et régler sa dette envers Gérard (transaction TGérard). En supposant une communication un peu lente entre Robert et Gérard, il se pourrait que parallèlement ces deux transactions se trouvent validées. Le réseau est alors divisé en deux, ceux qui ont été informés de la transaction TRobert, et ceux qui ont été informés de la transaction TGérard. Dans les deux cas, la transaction correspondante a été ajoutée au registre des comptes, et les deux registres résultants ne sont plus cohérents (mais personne n’est encore au courant de cette situation). Lorsqu’un participant apprendra l’existence des transactions TRobert et TGérard, la supercherie sera révélée, et il faudra alors décider du registre qui fait foi, et donc de la transaction à garder. On connaîtra enfin l’heureux détenteur du bitcoin de Josiane.

L’idée de base est de travailler sur le registre le plus long dont on ait connaissance. Il se pourrait qu’il y ait localement des divergences, mais, dans un réseau où la communication est suffisamment rapide et où une majorité de nœuds jouent le jeu, il devrait se dégager un registre significativement plus long assez rapidement. Une fois une transaction réalisée, il faudrait donc laisser passer ce temps nécessaire à la synchronisation des registres pour garantir que la transaction se retrouve bien dans le registre qui fait foi, et pouvoir la valider définitivement.

Le problème est que la longueur d’un registre serait alors facilement manipulable par quelqu’un de mal intentionné. Josiane pourrait en ajoutant des transactions faire en sorte que les registres contenant respectivement TRobert et TGérard deviennent les registres de références à tour de rôle. Elle pourrait ainsi faire croire à Robert qu’il doit lui faire parvenir son livre, puis à Gérard qu’elle a réglé sa dette. Robert se rendrait compte que le bitcoin est finalement dans les mains de Gérard… mais ce serait trop tard.

L’idée centrale est de rendre la validation d’une transaction (ou en réalité d’un bloc contenant plusieurs transactions) coûteuse. Ainsi, Josiane ne pourra pas aisément ajouter des transactions au registre et ainsi valider l’opération avec Gérard. Pour expliquer ce mécanisme central de Bitcoin, on a besoin d’introduire une nouvelle notion : celle de fonction de hachage.

Le hachage est une opération qui consiste à transformer un texte de longueur arbitraire en un texte de longueur fixe. Dans le cas de Bitcoin, une suite de 256 bits. Mais cette suite (appelée hash du texte) doit vérifier une propriété fondamentale : il est virtuellement impossible de reconstituer le texte original à partir de son hash.

Dorénavant, mettre à jour le registre des transactions sera plus compliqué. Plutôt que de simplement vérifier si la transaction TRobert  est valide avant de l’ajouter au registre, il faudra aussi trouver un nombre x tel que le message “TRobert + x” ait un hash se terminant par dix zéros (par exemple). Trouver une bonne valeur pour x demande du temps de calcul mais il est en revanche très facile, étant donné x, de vérifier que la valeur convient bien. Ainsi, pour chaque transaction, ou pour être précis bloc de transactions, des utilisateurs de Bitcoin, appelés « mineurs », vont vérifier que celui-ci est valide et trouver une valeur de x. Le premier mineur ayant réussi à trouver x l’enverra aux autres utilisateurs, qui pourront ajouter ces transactions à leur registre. On appelle cette opération réaliser une preuve de travail ou encore « minage » dans le vocabulaire des crypto-monnaies.

Maintenant, si Josiane veut ajouter un nouveau bloc de transactions au registre pour tenter de faire valider TGérard plutôt que TRobert, elle va devoir effectuer de lourds calculs en un temps très réduit (avant que d’autres mineurs ne minent les blocs correspondants), ce qui lui sera concrètement impossible, à moins que Josiane ne contrôle l’essentiel de la puissance de calcul de l’ensemble du réseau. L’utilisation d’une fonction de hachage permet par ailleurs de chaîner les différents blocs de transactions : en ajoutant à tout nouveau bloc le hash du bloc précédent, il est désormais impossible pour quiconque d’introduire de nouvelles transactions au milieu du registre commun.

Extrait de : binaire.blog.lemonde.fr