Qu’est-ce que Replace-by-Fee ?

 

Bitcoin Replace-by-Fee

 

Quand on s’intéresse au protocole Bitcoin, il arrive qu’on entende parler de Replace-by-Fee ou de RBF, et cela nous paraît tout de suite obscur. Dans cet article, je vous propose de découvrir en détail quelle est la logique se trouvant derrière Replace-by-Fee et d’étudier un peu son fonctionnement.

Replace-by-Fee (littéralement « remplacer par des frais ») est une fonctionnalité de Bitcoin qui permet à l’émetteur d’une transaction non confirmée de la remplacer par une autre en augmentant les frais associés à cette transaction. Le remplacement des transactions n’est pas une idée nouvelle et était déjà prévue par Satoshi Nakamoto lui-même. L’idée a été reprise par les développeurs de Bitcoin Core en 2015 lorsque la taille moyenne des blocs a commencé à se rapprocher de la taille limite de 1 Mo. Replace-by-Fee est en application sur le réseau Bitcoin depuis février 2016.

 

À quoi sert Replace-by-Fee ?

Pour comprendre à quoi sert Replace-by-Fee, il faut comprendre comment les transactions sont traitées par le protocole. Dans Bitcoin (tout comme dans les autres systèmes crypto-économiques), les transactions créées par les utilisateurs ne sont pas directement incluses dans la chaîne de blocs, mais sont d’abord conservées dans ce qu’on appelle la mempoolzone mémoire ») de chaque nœud du réseau. Même s’il peut y avoir des variations, cette zone mémoire est sensiblement la même pour tous les nœuds.

Les mineurs incluent ensuite ces transactions dans le bloc qu’ils minent pour percevoir les frais associés à ces transactions et pour garantir le bon fonctionnement de Bitcoin. Lorsque le réseau fonctionne normalement, toutes les transactions de la mempool sont intégrées dans les blocs ajoutés à la chaîne toutes les 10 minutes en moyenne.

Cependant, la capacité du réseau Bitcoin est limitée. Cette limite est n’est pas du ressort des nœuds (le nombre de transactions qu’ils peuvent traiter), mais est inscrite artificiellement dans le protocole afin de permettre aux petites configurations de pouvoir fonctionner (assurant ainsi la décentralisation du système) : il s’agit de la taille limite des blocs. Ce seuil était de 1 Mo par bloc jusqu’à l’implémentation de SegWit et est aujourd’hui plus complexe à déterminer, ce qui fait que la taille d’un bloc peut atteindre 1.5 Mo ou 2 Mo selon les circonstances.

Cette limitation oblige le développement d’un marché des frais impliquant la participation des mineurs. En effet, si la taille de la mempool des transactions en attente est plus grande que la taille limite d’un bloc, alors les mineurs doivent choisir les transactions à inclure dans le bloc qu’ils valident. Puisque les mineurs ne travaillent pas bénévolement, cette discrimination se fait en fonction des frais associés à la transaction, ou plus précisément du ratio entre les frais et la taille de la transaction (typiquement mesuré en satoshis par octet, notés sat/o en français et sat/B en anglais). Les mineurs valident les transactions qui maximisent ce ratio.

Ce seuil crée donc des congestions du réseau en rendant difficile la confirmation des transactions, c’est-à-dire leur inclusion dans un bloc. Ces congestions sont caractérisées par une accumulation des transactions en attente dans la mempool (comme on peut le voir ci-dessous) et par une forte élévation des frais.

 

Mempool de Bitcoin 13 mai 2019

 

Dans ce type de situation, un utilisateur souhaitant envoyer une transaction est confronté au dilemme suivant :

  • Ou bien il paie des frais faibles, mais devra potentiellement attendre longtemps pour que sa transaction soit confirmée. ⇒ Augmentation des temps de confirmation.
  • Ou bien il ne veut pas attendre et il paie des frais suffisamment hauts pour être prioritaire sur d’autres transactions en attente, par effet d’enchère. ⇒ Augmentation des frais.

Cependant, les utilisateurs, ainsi que leurs portefeuilles, estiment assez mal les frais à payer. Cela est dû au caractère très fluctuant des congestions : la situation peut évoluer en très peu de temps, soit par l’augmentation drastique des frais (la masse souhaite à tout prix faire confirmer ses transactions), soit par leur baisse subite (la masse abandonne).

En particulier, cela pose le problème des transactions bloquées, c’est-à-dire des transactions associées à des frais assez faibles pour ne pas être confirmées du tout pendant une congestion. Puisque les congestions peuvent durer des jours, voire des semaines comme en décembre 2017, ce blocage peut être très problématique. Les nœuds « annulent » la transaction bloquée au bout d’une longue période (d’au moins plusieurs jours), mais le comportement du réseau pair-à-pair fait que cela n’est pas certain (des nœuds peuvent toujours avoir cette transaction dans leur mempool et la rediffuser). Ainsi, si l’utilisateur a mis des frais trop faibles, il se trouve coincé dans une situation embarrassante.

Replace-by-Fee intervient pour remédier à ce problème. Il permet en effet à l’émetteur d’une transaction non confirmée de remplacer cette transaction en l’échange de frais supplémentaires. En pratique, cela entraîne un déblocage de la transaction : son ratio de frais augmentera et les mineurs l’inclueront dans un bloc. Replace-by-Fee permet également de fusionner plusieurs transactions non confirmées entre elles, dans le cas où l’utilisateur souhaite par exemple réaliser une autre transaction et réduire ses frais globaux.

Spécifions que d’autres méthodes de déblocage de transaction existent. La première est CPFP (acronyme de l’anglais Child Pays for Parent) qui consiste, pour le récepteur d’une transaction non confirmée, à dépenser les fonds reçus en payant des frais forts. Le ratio pris en compte par les mineurs sera calculé en fonction des frais payés par les deux transactions (puisque l’une dépend de l’autre). Notons que bien souvent l’émetteur a également la possibilité d’utiliser cette méthode, puisque le système d’UTXO de Bitcoin le contraint à se « rendre la monnaie » s’il n’utilise pas l’intégralité des fonds disponibles.

La seconde est l’accélération des transactions proposée comme un service par les mineurs et les coopératives de minage. Pour l’utilisateur, cela consiste à payer le mineur de manière externe afin qu’il débloque la situation. Citons l’accélérateur de ViaBTC qui permet de débloquer des transactions contre un paiement en BCH.

 

Comment fonctionne RBF ?

Contrairement à l’idée qu’on peut s’en faire, Replace-by-Fee n’est pas une règle de consensus mais une règle pratique de gestion de la zone mémoire des transactions en attente, c’est-à-dire que les nœuds peuvent appliquer (ou pas) Replace-by-Fee sans risque d’être déconnectés du réseau ou de provoquer un embranchement de la chaîne.

Cependant, même si les nœuds peuvent adopter RBF, ils ne le font pas pour des raisons (principalement) économiques. Les nœuds, et particulièrement les mineurs, appliquent généralement la règle appelée first-seen rule qui consiste à considérer que la première transaction reçue est la bonne, et à rejeter tout paiement en contradiction avec celle-ci. Il s’agit d’une règle de bon sens qui a le mérite d’assurer le fonctionnement fluide du système. Surtout, cette règle permet de considérer comme sûre les transactions non confirmées impliquant de faibles montants (« paiements en 0-conf »). Même si des attaques de « double dépense » existent, une transaction non confirmée est en effet vérifiée par les nœuds du réseau avant d’être conservée dans la mempool, ce qui lui assure un certain niveau de validité.

Il existe plusieurs variantes de Replace-by-Fee :

  • Le full RBF ou RBF complet qui permet de remplacer n’importe quelle transaction.
  • Le first-seen-safe RBF qui consiste à considérer qu’une transaction non confirmée est remplaçable uniquement si les sorties transactionnelles (adresses de réception et montants) de la nouvelle transaction sont les mêmes. Il s’agit d’un compromis permettant la continuité avec la first-seen rule susmentionnée.
  • L’opt-in RBF ou RBF optionnel, qui offre le choix à l’utilisateur de s’en servir ou non. C’est cette variante qui est intégrée dans Bitcoin Core, l’implémentation principale de Bitcoin utilisée actuellement par plus de 95 % des nœuds du réseau.

Le Replace-by-Fee utilisé par le réseau Bitcoin est décrit dans le BIP 125. Il s’agit d’un RBF quasi-complet, et la seule règle qui le sépare du RBF complet est que les frais payés pour la nouvelle transaction doivent être strictement supérieurs aux frais absolus des transactions qu’elle remplace (ils doivent même les dépasser d’un certain montant prédéfini). Cela prémunit le réseau contre les attaques par déni de service.

Comme on l’a dit, le Replace-by-Fee implémenté sur Bitcoin est optionnel, c’est-à-dire que l’utilisateur a le choix de l’utiliser ou non. Pour cela, il doit signaler au réseau que sa transaction est « remplaçable ». Cela se fait par l’intermédiaire du paramètre nSequence situé dans les entrées des transactions. Plus précisément, une transaction est signalée comme remplaçable si au moins une de ses entrées est signalée comme telle par :

nSequence ≤ 0xfffffffd

Pour utiliser Replace-by-Fee, il faudra donc le spécifier au préalable au moment de l’envoi de la transaction. Nous verrons plus bas comment cela fonctionne avec le portefeuille Electrum. De plus, une transaction peut hériter du caractère remplaçable d’une transaction précédente qui n’a pas été confirmée, typiquement dans le cas où un utilisateur dépense ses fonds juste après leur réception.

Replace-by-Fee offre ainsi un moyen d’éviter le blocage de sa transaction lors des congestions récurrentes du réseau Bitcoin. Néanmoins, cette diffusion de Replace-by-Fee un inconvénient majeur qui qu’il affaiblit considérablement la sécurité des commerçants qui acceptent les transactions non confirmées. En effet, comme le RBF utilisé est un RBF quasi-complet (et pas un RBF restreint comme le first-seen-safe RBF), les commerçants physiques ne peuvent pas accepter comme valide une transaction qui est signalée comme remplaçable. Cela pose un problème évident quand les commerçants qui ne connaissent pas les méandres du fonctionnement de Bitcoin ou quand ils utilisent un portefeuille qui n’indique tout simplement pas le type de la transaction reçue (RBF ou non-RBF).

 

Comment utiliser Replace-by-Fee dans Electrum ?

Pour finir, nous allons voir comment utiliser RBF avec Electrum.

Electrum est un portefeuille léger pour ordinateur. Il permet d’effectuer des opérations avancées pour envoyer des transactions. Si vous voulez savoir comment installer et utiliser Electrum, je vous conseille de lire notre tutoriel sur le sujet : Comment utiliser Electrum ? Portefeuille Bitcoin sur ordinateur.

Replace-by-Fee est disponible par défaut sur Electrum. Pour le désactiver (ou le réactiver le cas échéant), allez dans Outils > Préférences et décochez « Utiliser le remplacement des frais ».

 

Autoriser Replace-by-Fee dans Electrum

 

Voyons comment cela fonctionne. Supposons que nous avons 7.45 mBTC (1 mBTC = 100 000 satoshis) sur notre compte et envoyons par exemple 4 mBTC à une autre adresse. Pour l’illustration nous utilisons les frais minimaux acceptés par le réseau, à savoir 1 satoshi par octet. Notre transaction nous coûte donc 226 satoshis de frais, soit 2 centimes d’euro.

 

Transaction frais faibles Replace-by-Fee Electrum

 

Une fois diffusée sur le réseau, la transaction est visible dans l’historique des transactions et elle est marquée par un « rbf » se trouvant à côté des frais payés (1 sat/o) et de la taille de la mempool (7.19 Mo).

 

Historique transactions frais faibles Replace-by-Fee Electrum

 

RBF sert principalement à augmenter les frais de transaction lorsque la transaction est bloquée. Le réseau subissant une congestion à ce moment-là (les frais s’élevaient à plus de 1 € pour une confirmation rapide), nous avons recouru à un remplacement de la transaction. Pour procéder à ce remplacement, faites un clic droit sur la transaction dans l’historique et sélectionnez « Augmenter les frais ».

 

Augmenter frais transaction Replace-by-Fee Electrum

 

Vous devrez ensuite spécifier de combien augmenter les frais. Pour notre exemple, nous avons choisi un taux de 48.6 sat/o afin que notre transaction soit confirmée dans les 10 blocs suivants (selon l’estimation de Electrum). Vous pouvez également faire en sorte que la transaction devienne finale, c’est-à-dire non remplaçable, ce qu’il est déconseillé de faire (vous pourriez avoir besoin de remplacer la transaction une nouvelle fois).

 

Spécifier frais transaction remplacée Replace-by-Fee Electrum

 

Vérifiez ensuite que la transaction qui remplace l’ancienne correspond bien à vos attentes. En particulier, faites attention aux frais : ici, nous avons payé 10 931 satoshis de frais, soit environ 78 centimes d’euro. Signez et diffusez la transaction pour clore la procédure de remplacement.

 

Détails transaction remplacée Replace-by-Fee Electrum

 

En fonction des frais que vous avez spécifié, votre transaction sera confirmée plus ou moins rapidement. Dans notre cas, elle a été confirmée en moins d’une demi-heure.

 

Transaction remplacée non confirmée Replace-by-Fee Electrum

 

Transaction remplacée confirmée Replace-by-Fee Electrum

 

 

Voilà, c’est tout pour cet article. J’espère qu’il aura été enrichissant pour vous, et qu’à présent vous comprenez mieux le pourquoi et le comment de Replace-by-Fee !


Ludovic

Ludovic est fasciné par les cryptomonnaies et par l'impact qu'elles pourraient avoir sur le monde. De formation scientifique, il s'attache à décrire leur fonctionnement technique de la façon la plus fidèle possible.

facebook-cryptoast twitter-soothsayerdata

 



4
Poster un Commentaire

avatar
1 Comment threads
3 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
LudovicJpp Recent comment authors
plus récents plus anciens
Jpp
Lecteur
Jpp

A noter une 3eme solution quand une transaction est bloquée, faire une nouvelle transaction avec la même adresse bitcoin source avec des gros frais vers une adresse qui nous appartient. Les mineur qui voudrons toucher ces gros frais seront obligés de valider également la première transaction qui a de faible frais

Jpp
Lecteur
Jpp

Oui, mais du côté envoyeur. Je l’ai déjà fait plusieur fois et ca marche bien. Pas besoin que ce soit le receveur qui doive le faire. Pratique quand tu a affaire a un site de vente ou c’est compliqué et long d’avoir le support