/ home / newsletters /
Bulletin Hebdomadaire Bitcoin Optech #358
La newsletter de cette semaine décrit comment le seuil de danger du minage égoïste peut être
calculé, résume une idée pour prévenir le filtrage des transactions à frais élevés, sollicite des
retours sur une proposition de modification du BIP390 de descripteur musig()
, et annonce une nouvelle
bibliothèque pour le chiffrement des descripteurs. Sont également inclus nos sections régulières
avec le résumé d’un Bitcoin Core PR Review Club, les annonces de nouvelles versions et candidates à
la sortie, et les descriptions des changements récents dans les projets d’infrastructure Bitcoin
populaires.
Nouvelles
-
● Calcul du seuil de danger du minage égoïste : Antoine Poinsot a publié sur Delving Bitcoin une expansion des calculs de l’article de 2013 paper qui a donné son nom à l’attaque par minage égoïste (bien que l’attaque ait été précédemment décrite en 2010). Il a également fourni un simulateur de minage et de relais de blocs simplifié qui permet d’expérimenter avec l’attaque. Il se concentre sur la reproduction d’une des conclusions de l’article de 2013 : qu’un mineur malhonnête (ou un cartel de mineurs bien connectés) contrôlant 33 % du hashrate total du réseau, sans avantages supplémentaires, peut devenir marginalement plus rentable à long terme que les mineurs contrôlant 67 % du hashrate. Ceci est réalisé en retardant sélectivement l’annonce de certains des nouveaux blocs qu’il trouve. À mesure que le hashrate du mineur malhonnête augmente au-dessus de 33 %, il devient encore plus rentable jusqu’à ce qu’il dépasse 50 % du hashrate et puisse empêcher ses concurrents de conserver de nouveaux blocs sur la meilleure blockchain.
Nous n’avons pas examiné attentivement le post de Poinsot, mais son approche nous a semblé solide et nous la recommanderions à quiconque intéressé à valider les calculs ou à mieux les comprendre.
-
● Résistance à la censure de relais par réconciliation de l’ensemble supérieur du mempool : Peter Todd a posté sur la liste de diffusion Bitcoin-Dev à propos d’un mécanisme qui permettrait aux nœuds de se déconnecter des pairs qui filtrent les transactions à frais élevés. Le mécanisme dépend du mempool en cluster et d’un mécanisme de réconciliation d’ensemble tel que celui utilisé par erlay. Un nœud utiliserait le mempool en cluster pour calculer son ensemble de transactions non confirmées le plus rentable qui pourrait tenir dans (par exemple) 8 000 000 d’unités de poids (un maximum de 8 MB). Chacun des pairs du nœud calculerait également ses 8 MWU supérieurs de transactions non confirmées. En utilisant un algorithme hautement efficace, tel que minisketch, le nœud réconcilierait son ensemble de transactions avec chacun de ses pairs. Ce faisant, il apprendrait exactement quelles transactions chaque pair a dans le haut de son mempool. Ensuite, le nœud se déconnecterait périodiquement du pair ayant en moyenne le mempool le moins rentable.
En se déconnectant des connexions les moins rentables, le nœud aurait finalement trouvé des pairs qui étaient les moins susceptibles de filtrer les transactions à frais élevés. Todd a mentionné qu’il espère travailler sur une implémentation après que le support du mempool en cluster soit intégré dans Bitcoin Core. Il a attribué l’idée à Gregory Maxwell et à d’autres; Optech a mentionné pour la première fois l’idée sous-jacente dans le Bulletin #9.
-
● Mise à jour de BIP390 pour permettre des clés de participants dupliquées dans les expressions
musig()
: Ava Chow a posté sur la liste de diffusion Bitcoin-Dev pour demander si quelqu’un s’opposait à la mise à jour de BIP390 pour permettre aux expressionsmusig()
dans les descripteurs de script de sortie de contenir la même clé publique de participant plus d’une fois. Cela simplifierait l’implémentation et est explicitement autorisé par la spécification BIP327 de MuSig2. À l’heure actuelle, personne ne s’est opposé, et Chow a ouvert une pull request pour changer la spécification de BIP390. -
● Bibliothèque de chiffrement de descripteur : Josh Doman a posté sur Delving Bitcoin pour annoncer une bibliothèque qu’il a construite qui chiffre les parties sensibles d’un descripteur de script de sortie ou miniscript aux clés publiques contenues en son sein. Il décrit les informations nécessaires pour déchiffrer :
-
Si votre portefeuille nécessite 2 clés sur 3 pour dépenser, il nécessitera exactement 2 clés sur 3 pour déchiffrer.
-
Si votre portefeuille utilise une politique miniscript complexe comme “Soit 2 clés OU (un timelock ET une autre clé)”, le chiffrement suit la même structure, comme si tous les timelocks et hash-locks sont satisfaits.
Cela diffère du schéma de sauvegarde de descripteur chiffré discuté dans le Bulletin #351, dans lequel la connaissance de n’importe quelle clé publique contenue dans le descripteur permet le déchiffrement du descripteur. Doman argue que son schéma offre une meilleure confidentialité pour les cas où le descripteur chiffré est sauvegardé sur une source publique ou semi-publique, comme une blockchain.
-
Bitcoin Core PR Review Club
Dans cette section mensuelle, nous résumons une récente réunion du Bitcoin Core PR Review Club, en soulignant certaines des questions et réponses importantes. Cliquez sur une question ci-dessous pour voir un résumé de la réponse de la réunion.
Séparer l’accès à l’ensemble UTXO des fonctions de validation est un PR de
TheCharlatan qui permet d’appeler des fonctions de validation en passant juste
les UTXOs requis, au lieu de nécessiter l’ensemble UTXO complet. Il fait partie du projet
bitcoinkernel
, et est une étape importante pour rendre la bibliothèque plus
utilisable pour les implémentations de nœuds complets qui n’implémentent pas un ensemble UTXO, comme
les nœuds Utreexo ou SwiftSync (voir le Bulletin #349).
Dans les 4 premiers commits, ce PR réduit le couplage entre les fonctions de validation des
transactions et l’ensemble UTXO en exigeant que l’appelant récupère d’abord les Coin
s ou CTxOut
s
dont ils ont besoin et en les passant à la fonction de validation, au lieu de permettre à la
fonction de validation d’accéder directement à l’ensemble UTXO.
Dans les commits suivants, la dépendance de ConnectBlock()
par rapport à l’ensemble UTXO est
entièrement supprimée en extrayant la logique restante nécessitant une interaction avec l’ensemble
UTXO dans une méthode séparée SpendBlock()
.
-
Pourquoi est-il utile d’extraire la nouvelle fonction
SpendBlock()
deConnectBlock()
pour cette PR ? Comment compareriez-vous le but des deux fonctions ?La fonction
ConnectBlock()
effectuait à l’origine à la fois la validation des blocs et les modifications de l’ensemble UTXO. Cette refactortorisation divise ces responsabilités :ConnectBlock()
est maintenant uniquement responsable de la logique de validation qui ne nécessite pas l’ensemble UTXO, tandis que la nouvelle fonctionSpendBlock()
gère toutes les interactions avec l’ensemble UTXO. Cela permet à un appelant d’utiliserConnectBlock()
pour effectuer la validation des blocs sans un ensemble UTXO. ➚ -
Voyez-vous un autre avantage à cette séparation, à part permettre l’utilisation du noyau sans un ensemble UTXO ?
Outre la possibilité d’utiliser le noyau pour des projets sans ensemble UTXO, cette séparation rend le code plus facile à tester isolément et plus simple à maintenir. Un examinateur note également que la suppression de la nécessité d’accéder à l’ensemble UTXO ouvre la porte à la validation des blocs en parallèle, ce qui est une caractéristique importante de SwiftSync. ➚
-
SpendBlock()
prend unCBlock block
,CBlockIndex pindex
etuint256 block_hash
en paramètres, tous faisant référence au bloc dépensé. Pourquoi avons-nous besoin de 3 paramètres pour cela ?Le code de validation est critique en termes de performance, il affecte des paramètres importants tels que la vitesse de propagation des blocs. Calculer le hash d’un bloc à partir d’un
CBlock
ou d’unCBlockIndex
n’est pas gratuit, car la valeur n’est pas mise en cache. Pour cette raison, l’auteur a décidé de prioriser la performance en passant unblock_hash
déjà calculé comme paramètre séparé. De même, lepindex
pourrait être récupéré à partir de l’index des blocs, mais cela impliquerait une recherche supplémentaire dans une map qui n’est pas strictement nécessaire.
Note : l’auteur a plus tard changé l’approche, en supprimant l’optimisation de performanceblock_hash
. ➚ -
Les premiers commits de cette PR refactorisent
CCoinsViewCache
hors de la signature de fonction de plusieurs fonctions de validation. Est-ce queCCoinsViewCache
contient l’ensemble UTXO complet ? Pourquoi est-ce (ou pas) un problème ? Cette PR change-t-elle ce comportement ?CCoinsViewCache
ne contient pas l’ensemble UTXO complet ; c’est un cache en mémoire qui se trouve devantCCoinsViewDB
, qui stocke l’ensemble UTXO complet sur le disque. Si une pièce demandée n’est pas dans le cache, elle doit être récupérée depuis le disque. Cette PR ne change pas ce comportement de mise en cache en soi. En retirantCCoinsViewCache
des signatures de fonction, cela rend la dépendance UTXO explicite, nécessitant que l’appelant récupère les pièces avant d’appeler la fonction de validation. ➚
” %}
Mises à jour et versions candidates
Nouvelles versions et versions candidates pour des projets d’infrastructure Bitcoin populaires. Veuillez envisager de mettre à niveau vers les nouvelles versions ou d’aider à tester les versions candidates.
-
● Core Lightning 25.05rc1 est un candidat à la version pour la prochaine version majeure de cette implémentation populaire de nœud LN.
-
● LND 0.19.1-beta est une version de maintenance de cette implémentation populaire de nœud LN. Elle contient de multiples corrections de bugs.
Changements de code et de documentation notables
Changements récents dans Bitcoin Core, Core Lightning, Eclair, LDK, LND, libsecp256k1, Interface de Portefeuille Matériel (HWI), Rust Bitcoin, Serveur BTCPay, BDK, Propositions d’Amélioration de Bitcoin (BIPs), Lightning BOLTs, Lightning BLIPs, Inquisition Bitcoin, et BINANAs.
-
● Bitcoin Core #32406 supprime la limite de taille de sortie
OP_RETURN
(règle de standardisation) en augmentant le paramètre-datacarriersize
par défaut de 83 à 100 000 octets (la limite de taille maximale de transaction). Les options-datacarrier
et-datacarriersize
restent, mais sont marquées comme obsolètes et devraient être retirées dans une future version non déterminée. De plus, ce PR lève également la restriction de politique d’une par transaction pour les sorties OP_RETURN, et la limite de taille est maintenant allouée à travers toutes ces sorties dans une transaction. Voir le Bulletin #352 pour un contexte supplémentaire sur ce changement. -
● LDK #3793 ajoute un nouveau message
start_batch
qui signale aux pairs de traiter lesn
messages suivants (batch_size
) comme une seule unité logique. Il met également à jourPeerManager
pour s’appuyer sur cela pour les messagescommitment_signed
pendant le splicing, plutôt que d’ajouter un TLV et un champbatch_size
à chaque message dans le lot. C’est une tentative de permettre à des messages de protocole LN supplémentaires d’être regroupés plutôt que seulement les messagescommitment_signed
, qui sont les seuls regroupements définis dans la spécification LN. -
● LDK #3792 introduit un support initial pour les transactions d’engagement v3 (voir le Bulletin #325) qui s’appuient sur les transactions TRUC et les ancres éphémères, derrière un drapeau de test. Un nœud rejette maintenant toute proposition
open_channel
qui définit un taux de frais non nul, s’assure qu’il n’initie jamais de tels canaux lui-même, et arrête d’accepter automatiquement les canaux v3 pour d’abord réserver un UTXO pour une augmentation de frais ultérieure. Le PR abaisse également la limite HTLC par canal de 483 à 114 parce que les transactions TRUC doivent rester en dessous de 10 kvB.- ● LND #9127 ajoute une option
--blinded_path_incoming_channel_list
à la commandelncli addinvoice
, permettant à un destinataire d’intégrer un ou plusieurs (pour de multiples sauts) ID de canaux préférés pour que le payeur tente de les emprunter via un chemin aveuglé.
- ● LND #9127 ajoute une option
-
● LND #9858 commence à signaler le bit de fonctionnalité de production 61 pour le flux de fermeture coopérative RBF (voir le Bulletin #347) pour permettre une interopérabilité correcte avec Eclair. Il conserve le bit de mise en scène 161 pour maintenir l’interopérabilité avec les nœuds testant la fonctionnalité.
-
● BOLTs #1243 met à jour la spécification BOLT11 pour indiquer qu’un lecteur (expéditeur) ne doit pas payer une facture si un champ obligatoire, tel que p (hash de paiement), h (hash de description), ou s (secret), a une longueur incorrecte. Auparavant, les nœuds pouvaient ignorer ce problème. Cette PR ajoute également une note à la section Exemples expliquant que les signatures Low R, même si elles économisent un octet d’espace, ne sont pas imposées dans la spécification.