Aller au contenu
buybitcoinsmart

Glossaire / Minage et consensus

Bloc de Merkle

Aussi appelé Branche de Merkle partielle.

Qu'est-ce qu'un bloc de Merkle ?
Un bloc de Merkle est la réponse qu'un portefeuille léger reçoit lorsqu'il demande le contenu filtré d'un bloc : l'en-tête de 80 octets plus juste assez de hachages pour prouver quelles transactions correspondaient.

Spécifié dans BIP-37.

Le BIP37 permettait à un portefeuille de remettre un filtre à un nœud et de ne recevoir que ce qui correspondait, enveloppé dans une preuve que rien n'avait été fabriqué. La conception a échoué sur la confidentialité et sur la charge : Bitcoin Core a désactivé la fonction par défaut dans la version 0.19.0, publiée en novembre 2019. Si vous utilisez un portefeuille léger moderne, il emploie presque certainement les filtres de blocs compacts à la place.

Comment cela fonctionne

Statut : le filtrage par filtre de Bloom du BIP37, et le message merkleblock qui le sert, ont été désactivés par défaut dans Bitcoin Core 0.19.0 en novembre 2019 pour des motifs de confidentialité et de déni de service. Les filtres de blocs compacts, spécifiés dans les BIP157 et BIP158, les ont remplacés, et Bitcoin Core peut les servir à ses pairs depuis la version 0.21.0 en janvier 2021.

Un bloc de Merkle est une preuve, pas un résumé. Sa structure comporte quatre parties : l'en-tête de bloc, le nombre total de transactions du bloc, une liste ordonnée de hachages et un champ de bits compact de drapeaux. Les drapeaux décrivent un parcours en profondeur d'abord dans l'arbre de Merkle du bloc, indiquant au portefeuille destinataire s'il doit descendre dans une branche ou prendre le hachage suivant de la liste comme substitut de tout ce qui se trouve en dessous. Le portefeuille rejoue ce parcours, aboutit à une racine et la compare à la racine de l'en-tête qui lui a été remis.

Cette comparaison est tout l'intérêt. Un pair hostile peut vous cacher des transactions en ne les mentionnant simplement pas, et aucun protocole filtré ne peut l'empêcher. Ce qu'il ne peut pas faire, c'est inventer une transaction que vous n'avez jamais reçue, car le hachage fabriqué ne reconstituerait pas une racine correspondant à un en-tête adossé à une preuve de travail réelle.

En demander un est un échange en deux étapes. Le portefeuille téléverse un filtre avec un message filterload, puis demande un bloc en utilisant un type d'inventaire de bloc filtré plutôt que le type ordinaire. Le bloc de Merkle revient d'abord, suivi des transactions correspondantes complètes dans des messages distincts. Un bloc de 2 000 transactions avec une seule correspondance coûte au portefeuille un en-tête, une douzaine de hachages environ et une transaction, au lieu d'un mégaoctet ou plus.

Où le voir

Les blocs de Merkle appartiennent à une génération de portefeuilles mobiles largement retirée.

La bibliothèque BitcoinJ les a popularisés, et les portefeuilles Android construits sur elle ont passé la majeure partie des années 2010 à se synchroniser de cette façon. Quiconque exécute une ancienne version de l'une de ces applications peut encore émettre des messages filterload et échouer silencieusement à trouver un pair qui répondra, car le service exige qu'un opérateur ait réactivé peerbloomfilters à la main.

Ce qui les a remplacés inverse le sens de la demande. Avec les filtres de blocs compacts, le nœud publie un petit filtre par bloc décrivant ce que ce bloc contient, et le portefeuille télécharge les filtres, décide localement quels blocs l'intéressent et récupère ceux-là en entier. Rien sur les adresses du portefeuille ne quitte l'appareil. C'est le modèle qui sous-tend le backend Neutrino de lnd et les portefeuilles Lightning mobiles construits sur lui.

L'échec de confidentialité mérite d'être énoncé clairement, car c'est la raison du changement. Des travaux publiés en 2014 par Arthur Gervais et ses coauteurs ont montré qu'un nœud servant un client filtré par filtre de Bloom pouvait retrouver la grande majorité des adresses de ce client, et que demander deux blocs avec le même filtre en divulguait encore plus. Le remplissage de faux positifs censé masquer le portefeuille ne l'a pas masqué.

Bloc de Merkle vs filtre de Bloom

Le filtre de Bloom est ce qu'un portefeuille envoie ; le bloc de Merkle est ce qui redescend. Un filtre est une description probabiliste et avec perte des adresses et des outpoints qui intéressent quelqu'un, et il réside sur le nœud qui sert. Un bloc de Merkle est une preuve déterministe concernant un bloc précis, et il réside dans la réponse. Ils ont été dépréciés ensemble, mais seul le filtre posait le problème de confidentialité. Les preuves de Merkle elles-mêmes restent valables, et c'est pourquoi les filtres de blocs compacts ont gardé l'idée de preuve et écarté la partie où vous dites à un inconnu ce que vous possédez.

À ne pas confondre avec

Questions fréquentes

Les blocs de Merkle sont-ils encore utilisés ?

Rarement. Bitcoin Core est livré avec le service de filtres de Bloom désactivé par défaut depuis la version 0.19.0 en novembre 2019, de sorte qu'un portefeuille qui demande des blocs de Merkle ne trouve souvent aucun pair disposé à répondre. Les filtres de blocs compacts sont le remplacement moderne.

Les blocs de Merkle ont-ils divulgué mes adresses ?

Oui, en pratique. Des recherches publiées en 2014 ont montré que le remplissage de faux positifs d'un filtre de Bloom ne suffisait pas à masquer les adresses qu'un portefeuille surveillait, de sorte que le nœud qui vous servait pouvait généralement identifier la majeure partie du portefeuille.

Termes associés

Plus de termes : Minage et consensus

Lire cette page en anglais