Est-ce ainsi que fonctionnent une réorganisation et un fork dans Bitcoin ?
J'essaie de comprendre comment fonctionnent les réorganisations et les forks qui y sont liés dans Bitcoin. J'ai passé en revue toutes les questions (environ 80/90 d'entre elles) liées à la balise de réorganisation en chaîne, et je pense avoir acquis une certaine idée de la façon dont tout fonctionne, mais j'ai encore quelques incertitudes, que je vais décrire ci-dessous. Tout d’abord, je commencerai par comment je comprends la réorganisation et les forks, puis je poserai les questions.
Les réponses qui m'ont le plus aidé à comprendre comment tout fonctionne (Un grand merci à ces gens formidables ! ) :
Murch :
Pieter Wuille :
Ava Chow :
Merci à tous d'avance pour votre compréhension et votre aide et nous nous excusons sincèrement pour le texte excessif. Toute aide serait appréciée
J'envisage une situation dans laquelle nous sommes synchronisés, n'avons pas été hors ligne, puis nous nous reconnectons.
Les fourches se produisent lorsque deux mineurs créent le bloc suivant (bloc A et bloc B) à peu près en même temps. Dans cette situation, le bloc A est accepté par une partie du réseau, tandis que le bloc B est accepté par une autre partie du réseau. En fonction du bloc qu'un nœud reçoit en premier (via un en-tête ou un message cmpct), le nœud validera d'abord ce bloc (disons A), et si tout va bien, déclarera sa branche comme branche principale/canonique, en la laissant en place. Le bloc A est ensuite propagé à tous ses pairs. Quant au deuxième bloc (bloc B), qu'il ait reçu uniquement l'en-tête ou la totalité du bloc en raison de cmpct, il effectuera uniquement une validation pour vérifier s'il a un PoW valide et un parent connu (tous les autres détails ne sont pas pertinents ; si les transactions sont correctes ou non). De plus, nous transmettrons uniquement le bloc A à tous nos pairs puisqu'il fait partie de notre chaîne principale, tandis que nous gardons B uniquement localement comme l'un des conseils de chaîne. À ce stade, nous avons deux chaînes (principale et « secondaire »), attendant de voir laquelle de ces deux sera ensuite étendue (bloc C). Si la chaîne avec le bloc A est étendue, tout va bien ; nous effectuons une validation régulière, et c'est tout. Cependant, si la chaîne avec le bloc B est étendue, une réorganisation est nécessaire. Dans ce cas, toutes les transactions du bloc A sont renvoyées au pool de mémoire et tous les UTXO dépensés sont renvoyés à l'ensemble UTXO. Après cela, une validation complète est effectuée sur les autres champs de l'en-tête et les transactions du bloc B (si on n'avait que l'en-tête, il faut également envoyer une requête getdata pour l'ensemble du bloc ou une requête getblocktxn pour les transactions manquantes restantes ). Si tout va bien, le bloc C est validé. Si C convient également, il est transmis à tous les pairs et cette branche devient la nouvelle branche canonique/principale.
Mes questions sont :
