Note : je me relirai demain, il est possible que des améliorations ou simplifications soient apportées plus tard.
Hello !
Bon, le post ne date pas d'hier donc je pense que tu as dû trouver quelques réponses entre temps. Mais sait-on jamais, tu trouveras peut-être une ou deux choses intéressantes dans ce qui suit. J'ai fait un sacré pavé (ça m'avait presque manqué !), mais au moins ça me fait réviser et je pourrai faire référence à ce post dans le futur. J'ai essayé de tout détailler donc on va peut-être (sûrement) au-delà de la question originale.
Admettons que tu aies des bitcoins que tu souhaites dépenser. Il se trouvent donc actuellement sur une adresse qui t'appartient. La première étape, qui peut se faire sans communiquer avec le reste du réseau, va être de former une transaction (en gros, dire vers quelle(s) adresse(s) tu veux envoyer les bitcoins, et dans quelles proportions), puis la signer. La signature apposée à cette transaction est faite à l'aide de ta clé privée. N'importe qui peut vérifier la signature de cette transaction juste avec l'adresse "de départ" (qui est publique et fait partie de la transaction de toute façon).
Maintenant que ta transaction est prête, il faut la communiquer au reste du réseau. Il faut donc avoir un nœud Bitcoin, qui va envoyer la transaction à la dizaine de nœuds auxquels il est connecté, qui vont eux aussi envoyer la transaction aux nœuds auxquels ils sont connectés, et de cette manière ta transaction se propage en quelques secondes sur le réseau Bitcoin, dans ce qu'on appelle la mempool.
2 choses à noter :
- Si tu utilises un client léger (qui n'a pas eu besoin de télécharger toute la blockchain), comme Electrum, Sparrow, Samourai, etc., alors ce client est connecté à un autre nœud Bitcoin (qui peut t'appartenir ou non) qui lui a eu besoin de synchroniser la blockchain entière. La transaction passe alors par ce nœud, qui sert de point d'acccès au réseau Bitcoin.
- "La mempool", c'est un abus de langage. En effet, il se peut que certains nœuds ne voient pas ta transaction, ou ne la retiennent pas car leur mempool est déjà pleine. En fait il y a autant de mempools que de nœuds. Mais ce n'est pas grave : l'essentiel est que ta transaction se propage et que les mineurs (pas forcément tous) en aient connaissance.
Pour le moment, ta transaction n'est pas "confirmée" (car pas encore incluse dans un bloc). Mais comme elle a été diffusée au réseau, les mineurs l'ont certainement reçue.
(NB. Pour être tout à fait rigoureux il faudrait distinguer les pools de minage et les mineurs eux-mêmes, mais pour ce post on considérera qu'il s'agit d'une seule et même entité).
Les mineurs cherchent en permanence à ajouter de nouveaux blocs à la blockchain (c'est leur business). Leurs profits viennent à la fois de la récompense de blocs (6,25
BTC par bloc actuellement, qui passeront à 3,125
BTC par bloc dans la nuit de vendredi à samedi), et des frais des transactions qu'ils mettent dans ce bloc. Ce sont eux qui choisissent quelles transactions ils mettent dans les blocs qu'ils essaient de miner. Ils vont donc sélectionner en priorité les transactions qui ont le plus de frais (lorsqu'il n'y a pas de place pour tout le monde) et créer un bloc avec ces transactions. Ils vont aussi vérifier que ces transactions sont valides (qu'elles sont conformes aux règles du consensus, notamment que leur signature est valide). Ce procédé ne demande pas beaucoup de calculs.
À ce stade, différents mineurs (/ pools) peuvent avoir des blocs candidats différents (mais pas nécessairement). Maintenant, dans ce bloc, il y a un champ réservé où les mineurs peuvent mettre un nombre arbitraire. Sauf que la plupart des valeurs possibles pour ce nombre ne donnent pas un bloc valide, et il est impossible de "deviner" les valeurs qui donneront un bloc valide. Le seul moyen de trouver une valeur qui fonctionne, c'est de les essayer une à une et voir si le bloc qui en résulte est valide ou non.
Et c'est ça qui consomme beaucoup d'énergie. Ce n'est pas la vérification des transactions, mais ce qu'on appelle la Preuve de Travail (Proof of Work). Le seul but étant de rendre difficile l'ajout de nouvelles transactions à la blockchain (et donc assurer sa sécurité).
Lorsqu'un mineur trouve (après beaucoup, beaucoup d'essais) une valeur pour ce nombre qui donne un bloc valide, il envoie le bloc au reste du réseau (il se propage en plusieurs secondes, comme la transaction de tout à l'heure). Tous les nœuds (mineurs ou non) vont le recevoir, vont vérifier que toutes les transactions que contient le bloc sont valides, et vérifier que le bloc lui-même (notamment sa preuve de travail) est valide (encore une fois, cette vérification est peu coûteuse en ressources).
À partir de là, toutes les transactions incluses dans ce bloc sont considérées comme "confirmées" : elles font désormais partie de la blockchain (puisque le nouveau bloc a été ajouté à la suite du précédent et respecte les règles du consensus). Tout le monde est donc d'accord sur le fait que tes bitcoins sont passés de ton adresse à celle de ton destinataire.
Maitenant, reprenons tes questions.
Comment est constitué le bloc?
Je me trompe peut-être, mais je pars du principe qu'une adresse effectuant une transaction la communique à un nœud ( tous les nœuds ?) simultanément, en fait la communication est l'exécution.
Puis tous les X temps, un bloc contenant tout ce qui a été communiqué est soumis à validation, mais qu'est ce qui empêche une adresse de "mentir " ?
Tu as raison sur le fait qu'une fois la transaction prête, elle est communiquée à un nœud, qui la transmet au reste du réseau (pas tous les nœuds d'un coup, comme on l'a vu, mais ça se propage quand même assez vite).
Ce n'est pas pour autant que la transaction est "exécutée". Pour moi, cela correspondrait plutôt au moment où la transactions est "confirmée", c'est-à-dire quand elle est incluse dans un bloc. Tant qu'elle n'est pas dans un bloc (donc tant qu'elle est dans la mempool), on ne peut pas dire avec certitude qu'elle est définitive / immuable.
Je n'aime pas trop la formulation "un bloc est soumis à validation". Soumis à qui ?
Chaque mineur crée son propre bloc candidat dans son coin, essaie de résoudre la preuve de travail (trouver le fameux nombre gagnant) dans son coin, et uniquement lorsqu'un mineur sait qu'il a trouvé la combinaison gagnante, il l'envoie au reste du réseau (en étant, sauf erreur, certain qu'il sera accepté).
Et donc, comme dit au-dessus, chaque mineur est libre de décider arbitrairement ce qu'il inclut dans ses blocs, tant que ça respecte les règles du consensus.
qu'est ce qui empêche une adresse de "mentir " ?
Les mineurs, mais aussi tous les autres nœuds, vérifient toutes les nouvelles transactions qu'ils reçoivent. Pour dépenser depuis une adresse, il faut pouvoir signer une transaction avec la clé privée dont est dérivée ladite adresse.
Est ce que le travail cryptographique qui sert à valider le bloc implique une analyse du contenu poussée, qui permet d'invalider la cohérence du bloc avec le bloc précédent ( bloc qui contiendrait une sorte d'état du réseau ? ), et que ce travail est au fondement du travail des validateurs ?
En fait, "validateurs" pour Bitcoin ça ne veut pas dire grand chose. Car tous les nœuds valident toutes les transactions, même ceux qui ne minent pas.
Le seul rôle des mineurs, c'est de fournir une preuve de travail (en gros, prouver qu'ils ont dépensé des ressources pour fournir un calcul qui n'a pas d'utilité intrinsèque, mais qui vise à introduire une notion de rareté, autrement absente du monde informatique).
Donc "au fondement du travail des mineurs", non.
En revanche, tu touches un point intéressant : tu as compris que les blocs contenaient des transactions (Alice à envoyé 1
BTC à Bob) et pas des états (Bob possède 2
BTC). Donc pour savoir si ton adresse peut dépenser 1
BTC, il faut vérifier que :
- tu peux signer une transaction pour cette adresse
- tu possèdes bien 1
BTC sur cette adresse
Et pour le 2ème point, comme tu le suggères, il n'y a pas d'autres choix que de consulter les transactions précédentes.
Cependant, on ne fait pas ça au cas par cas. À la place, lorsque le nœud se synchronise, il maintient une base de donnée de qui (quelle adresse) possède quoi.
On appelle ça l'UTXO-set (un UTXO (Unspent Transaction Output), c'est un morceau de bitcoin qui peut être dépensé).
NB : C'est pour ça que même les nœuds prunés / élagués (ceux qui ne conservent que la fin de la blockchain) ont quand même besoin de tout télécharger depuis le début (et suppriment au fur et à mesure).
Et que, par exemple, si un bloc était truqué, l'algorythme lui attacherait une autre "étiquette ", qui pourrait être validée si une bonne partie du réseau ( 51% produisait la même étiquette ? )
Si un mineur tente de diffuser un bloc qui n'est pas valide, les nœuds qui le recevront vont le vérifier, voir qu'il n'est pas valide, et ne vont donc pas le transmettre aux autres nœuds.
Si une partie du réseau n'est pas d'accord sur les règles à appliquer pour déterminer si le bloc est valide, alors on verra le réseau se scinder et deux blockchains co-exister en parallèle. Les utilisateurs (comprendre, ceux qui font tourner un nœud) choisiront quel logiciel Bitcoin (et donc laquelle de ces deux versions de Bitcoin) ils veulent utiliser.
À terme, cela crée donc deux réseaux différents. C'est un hard-fork. Si tu veux un exemple concret, tu peux faire des recherches sur la blocksize war et comment est né Bitcoin Cash.
Voilà, c'est tout pour aujourd'hui ! Je ne pensais pas que ce serait aussi massif