De Bitcoin-whitepaper is duidelijk over de kernfunctie van Bitcoin: het is permissieloos. Iedereen ter wereld kan iedereen betalen door zich bij het peer-to-peer-netwerk aan te sluiten en een transactie uit te zenden. Proof-of-work-consensus stelt zelfs iedereen in staat om blocks te produceren, en zorgt ervoor dat de enige manier om een betaling terug te draaien is om alle anderen te overtroeven met rekenkracht.
Maar proof-of-work definieert alleen hoe je een winnaar kiest tussen concurrerende ketens; het helpt een node niet om die te ontdekken. Een 51%-aanval – of een 100%-aanval – is veel eenvoudiger als een aanvaller kan voorkomen dat nodes over concurrerende ketens horen. De taak van ontdekking behoort toe aan de peer-to-peer-module, die vele tegenstrijdige taken moet combineren: eerlijke peers vinden in een netwerk waar nodes voortdurend komen en gaan, maar dan zonder authenticatie of reputatie. Altijd uitkijken naar blokken en transacties, maar niet verbaasd zijn als de meeste data troep is. Robuust genoeg zijn om extreme vijandige omstandigheden te overleven, maar licht genoeg om op een Raspberry Pi te draaien.
De implementatiedetails voor een permissieloos peer-to-peer-netwerk zijn weggelaten uit de whitepaper, maar vormen tegenwoordig het grootste deel van de complexiteit van Bitcoin-nodesoftware.
Filters zijn voor spam
De whitepaper erkent het openbaar doorgeven van transacties als de hoeksteen van Bitcoins censuurbestendigheid, maar zegt slechts een paar woorden over hoe dat zou moeten werken: ‘Nieuwe transacties worden naar alle nodes uitgezonden. Elke node verzamelt nieuwe transacties in een blok. Elke node werkt aan het vinden van een moeilijke proof-of-work voor zijn blok.’
Veel mensen vinden het amusant dat Satoshi suggereerde dat elke node zou minen. Door de centraliserende druk van de variabiliteit in mining werkt de overgrote meerderheid van de nodes op het huidige netwerk niet aan het vinden van proof-of-work. Misschien is dat een acceptabel of zelfs succesvol resultaat van economische prikkels; we hebben een deel van de decentralisatie ingeruild voor meer hashpower en dus meer veiligheid. Maar Bitcoins censuurbestendigheid zal instorten als we ook het gedecentraliseerde doorgeven van transacties opgeven.
Onze wens voor een diepe poel van nodes die transacties doorsturen, moet het opnemen tegen de praktische bezwaren van alledaagse computers die zich blootstellen aan een permissieloos netwerk en gegevens verwerken van anonieme peers. Dit dreigingsmodel is uniek en vereist zeer defensief programmeren.
Bij het downloaden van blokken fungeert het proof-of-work van een blok op elegante wijze zowel als bescherming tegen Denial of Service (DoS) als een ondubbelzinnige manier om het nut van gegevens te beoordelen. Onbevestigde transactiegegevens daarentegen zijn vrijwel kosteloos te creëren en kunnen gewoon spam zijn. Zo kunnen we bijvoorbeeld niet weten of de transactie aan haar uitgavevoorwaarden voldoet voordat we de UTXO hebben geladen, wat kan vereisen dat deze van een harde schijf opgehaald moet worden. Het kost aanvallers helemaal niets om deze relatief langzame activiteit te triggeren: zij kunnen grote transacties construeren met inputs die niet van hen zijn of zelfs helemaal niet bestaan.
Validatiestappen zoals handtekeningverificatie en het beheren van afhankelijkheden in de mempool kunnen veel rekenkracht vergen. Berucht is dat transacties met een groot aantal legacy-handtekeningen (van vóór segwit) op sommige hardware minuten kunnen kosten om te valideren, waardoor de meeste nodes grote transacties eruit filteren. Bandbreedte en rekenkracht worden niet alleen lokaal belast: geaccepteerde transacties worden doorgaans naar andere peers gegossiped, waarbij bandbreedte wordt gebruikt die evenredig is met het aantal nodes in het netwerk.
Nodes beschermen zichzelf door het geheugen dat wordt gebruikt voor onbevestigde transacties en validatiewachtrijen te beperken, de transactieverwerking per peer te begrenzen en beleidsregels af te dwingen naast de consensusregels. Maar als deze limieten niet zorgvuldig worden ontworpen, kunnen ze ook censuur creëren. De simpele logica om een transactie niet te downloaden die eerder al is afgewezen, de grootte van de transactiewachtrij voor één peer te beperken of verzoeken te laten vallen na mislukte downloadpogingen, kan ertoe leiden dat nodes zichzelf blind maken voor een transactie. Deze bugs worden onbedoelde mogelijkheden tot censuur wanneer ze door de juiste aanvaller worden uitgebuit.
In deze geest is het volkomen logisch om geen onbevestigde transacties te bewaren die elkaars double-spend zijn (slechts één versie kan geldig zijn), maar het afwijzen van een double-spend betekent dat een eerdere uitzending een latere verhindert om gemined te worden. Een double-spend kan een opzettelijke poging zijn om een betaling te fingeren of, wanneer een UTXO in handen is van meerdere partijen, een pinningaanval die misbruik maakt van mempoolbeleid om settlementtransacties op de tweede laag te vertragen of te verhinderen dat ze worden gemined. Hoe moeten nodes kiezen?
Deze vraag brengt ons bij het tweede element van transactierelay: incentive-compatibiliteit. Hoewel vergoedingen voor de consensus niet relevant zijn, behalve om te beperken wat een miner als blokbeloning kan claimen, spelen ze een enorme rol in het nodesbeleid als nutsgraad. Als we aannemen dat miners worden gedreven door economische prikkels, kunnen nodes benaderen welke transacties het aantrekkelijkst zijn om te minen en de minst aantrekkelijke weggooien. Wanneer transacties dezelfde UTXO uitgeven, kan de node de meest winstgevende bewaren. Hoewel nodes geen vergoedingen innen, kunnen ze transacties zonder vergoeding als spam beschouwen: die verbruiken waarschijnlijk netwerkbronnen maar worden nooit gemined, terwijl ze vrijwel niets kosten om te maken.
Deze twee ontwerpdoelen — DoS-bestendigheid en incentive-compatibiliteit — staan voortdurend op gespannen voet met elkaar. Het is aantrekkelijk om een transactie te vervangen door een versie met een hogere fee-rate, maar als herhaalde vervangingen met minieme verhogingen worden toegestaan, kan dat de bandbreedte van het netwerk verspillen. Rekening houden met afhankelijkheden tussen onbevestigde transacties kan tot winstgevendere blokken leiden (en CPFP mogelijk maken), maar kan kostbaar zijn bij complexe topologieën.
Nodes vertrouwden historisch gezien op vuistregels en afhankelijkheidslimieten, met gebruikerswrijving en nieuwe pinningvectoren als gevolg. Mempools die clusters bijhouden kunnen incentivecompatibiliteit nauwkeuriger beoordelen, maar moeten nog steeds mempoolafhankelijkheden beperken. Dit soort beperkingen creëren pinningvectoren voor transacties waarbij meerdere partijen betrokken zijn die elkaar niet vertrouwen: een aanvaller kan voorkomen dat zijn mede-transactor CPFP toepast door de limiet te monopoliseren.
Het is gemakkelijk om deze problemen te bagatelliseren: pinningaanvallen zijn een nichevorm van censuur die alleen van toepassing zijn op gedeelde transacties en doorgaans slechts tot tijdelijke transactievertragingen leiden. Is het de moeite waard om niet-minende nodes te helpen om een paar extra satoshi’s aan vergoedingen binnen te halen?
Een deal met de Mevil
Gedeelde transacties vormen de ruggengraat van UTXO-mixoplossingen voor privacy en second-layerprotocollen. Een groot deel van de Bitcoin-innovatie is gericht op het creëren van schaalbare, private, rijk uitgeruste toepassingen in een tweede laag, die uiteindelijk terugvallen op afwikkeling op de blockchain. Een veelvoorkomend patroon is om opnames of afwikkeling tijdelijk uit te stellen, zodat partijen binnen een bepaalde tijd kunnen reageren op wangedrag. Maar veel ontwerpen – ook die worden gebruikt om consensuswijzigingen te bepleiten – gaan in dit soort scenario’s gemakzuchtig voorbij aan fee-bumping.
Een tijdvenster om wangedrag te voorkomen is tegelijk een kans voor aanvallers. Deze twee voorwaarden – gedeelde transacties en bevestigingsdeadlines om wangedrag te voorkomen – vormen samen de perfecte storm, waardoor pinningaanvallen verergeren van tijdelijke transactievertragingen (mwah) tot mogelijke diefstal (oei!).
Pinning is al jaren onderwerp van onderzoek en ontwikkelwerk, wat heeft geleid tot het Topologically Restricted Until Confirmation (TRUC)-transactieformaat, het Pay to Anchor (P2A)-outputtype, het Ephemeral Dust-beleid, Cluster Mempool, beperkte relay van pakketten en diverse verbeteringen in de betrouwbaarheid van transactierelay. Deze functies zijn ontworpen om sterkere garanties te bieden voor het propageren van vervangende gedeelde transacties met hogere fees.
Toch brengt goed fee-beheer overhead met zich mee in de vorm van grotere transacties, complexere walletlogica en het afhandelen van onwaarschijnlijke randgevallen. Een makkelijke shortcut is een deal sluiten met een miner: in ruil voor een vergoeding garandeert de miner dat diens transacties snel worden gemined. Deze oplossing kan betrouwbaarder blijken dan gebruikmaken van het peer-to-peernetwerk, dat te maken kan hebben met hoge latentie en slechte propagatie door heterogeen mempoolbeleid.
De adoptie van rechtstreekse indiening bij miners kan snel groeien wanneer er commerciële belangen zijn. Exchanges vertegenwoordigen een groot deel van het transactievolume en geven waarschijnlijk de voorkeur aan voorspelbare timing boven het optimaliseren van fees. Populaire toepassingen kunnen geplaagd worden door pinningaanvallen of willen niet-standaardtransacties gebruiken die door gangbare nodebeleidsregels worden verboden. Bedrijven en bewaarders die zich zorgen maken over kwantumaanvallen op korte afstand kunnen een privékanaal met een miner opzetten.
Naarmate private Miner Extractable Value (MEVil) noodzakelijk wordt om concurrerend te blijven, kan het netwerk afglijden naar een model met gecentraliseerde blockspace-makelaars. Deze diensten kunnen doelen worden voor aanvallers en overheden en ondermijnen het uitgangspunt dat je zonder toestemming miner kunt worden.
Als het transactierelaynetwerk irrelevant wordt voor het draaien van een node, kan deelname eraan ook onnodig gaan voelen. Zullen we in die hypothetische toekomst gniffelen om het idee dat elke node in het netwerk onbevestigde transacties doorstuurt, zoals we het nu grappig vinden dat Satoshi zich voorstelde dat elke node een miner zou zijn?
De ironie is dat centralisatie van mining niet begint met openlijke samenspanning of regulatoire greep. Zij begint met een paar rationele shortcuts: efficiëntere afspraken, aangepaste relaypaden of prestatie-optimalisaties die gunstig zijn voor de deelnemers. Niemand kan voorkomen dat deze afspraken tot stand komen. Maar we kunnen wel proberen het concurrentievoordeel van private diensten ten opzichte van het publieke netwerk te verkleinen: strijk mempool-pinningvectoren glad voordat we voorstellen voor consensuswijzigingen overwegen die het potentieel voor MEVil vergroten; maak van het publieke transactierelaynetwerk een efficiënte marktplaats om te bieden (en biedingen bij te werken) op blockruimte.
Het peer-to-peernetwerk is de plek waar veel van de kernideologieën van Bitcoin tot leven komen. Het is ook een technische uitdaging met pijnlijke afwegingen tussen efficiënte node-operatie, censuurbestendigheid, prikkelstructuur en protocolcomplexiteit. Dat zal alleen maar moeilijker worden naarmate Bitcoin groeit. Hoe het ervoor kiest deze concurrerende ontwerpdoelen met elkaar te verzoenen, laten we als oefening aan de lezer.

