Gevaar van blockchain-vertakkingen
Hoe afgesloten transacties uit de blockchain verdwijnen
Wat in een blockchain zit, lijkt gegoten in beton, voor altijd onveranderlijk en door miljoenvoudige kopieën niet meer weg te krijgen - zou je denken. Toch verdwijnen er telkens weer uitgevoerde transacties en lijkt het of ze nooit hebben bestaan. Dat is niet het werk van hackers, maar van de uitvinders van de bitcoin.
Af en toe spookt het in de blockchain. Je hebt in een bitcoin-client net nog met eigen ogen gezien dat een overschrijving voor de tweede keer bevestigd werd – maar een paar minuten later is het geld verdwenen en lijkt het alsof die transactie nooit heeft bestaan. Was het een hallucinatie? Of is het een bug in de bitcoin-client? Niets van dat alles, maar gewoon puur toeval – of een poging van een mining-farm om snel geld te maken.
Afgestorven en vergeten
Bitcoin-transacties kunnen verdwijnen als afzonderlijke blokken of hele vertakkingen van de blockchain afsterven waarin de transacties voor de hele wereld inzichtelijk ingeboekt werden. Dat lijkt paradoxaal, want het is immers de basisfunctie van een blockchain om alle blokken met alle daarin opgeslagen transacties voor eeuwig te bewaren, zonder dat ze veranderd kunnen worden of kunnen kwijtraken. De blockchain bevat echter alleen blokken die op dit moment nog relevant zijn. Dat zijn dan alle blokken die in een keten van het laatst toegevoegde blok tot het oorspronkelijke oerblok uit 2009 zitten.
Het probleem is dat iedere miner zijn eigen kopie heeft van de blockchain omdat het bitcoin-netwerk een peer-to-peer netwerk zonder een centrale instantie is. Als een miner het nieuwste blok vindt, bijvoorbeeld nummer 363997, dan verspreidt hij dit via het miner-netwerk naar zijn buren. Die hangen dat blok aan hun kopie van de blockchain en geven dat weer aan hun buren door.
Bovendien staken de buren van de vinder hun huidige delfpoging, want het door hen gezochte blok 363997 is net gevonden. Ze verwijderen de in het nieuwe blok afgewerkte transacties uit de lokale mempool. Vervolgens beginnen ze met het zoeken naar het blok 363998, dat als voorganger-ID de ID (of beter gezegd: de hash-waarde) van het net toegevoegde blok 363997 bevat.
Concurrentie
De netwerktopologie zorgt ervoor dat het bekend worden van het blok met nummer 363997 zich gaat verspreiden binnen het bitcoin-netwerk. Dat kan in de praktijk een paar minuten duren. Een deel van de miners blijft dus doorgaan met het berekenen van een eigen oplossing voor blok 363997, en bij sommige leidt dat ook tot een succes.
Dan gaat de tweede vinder zijn versie van blok nummer 363997 naar zijn buren sturen, die van het eerste gevonden blok nog niets meegekregen hebben. Die buren hangen die versie van blok 363997 aan hun blockchain, verspreiden dat verder en beginnen meteen met het zoeken naar blok 363998 met een referentie naar het zojuist ontvangen blok 363997.
Op die manier komt er een vertakking in de blockchain: een deel van de miners probeert op basis van de eerste versie van blok 363997 het volgende blok 363998 te vinden, en de rest op basis van de tweede versie. Omdat het eenduidig bepalen van de leeftijd van een blok niet kan zonder een centrale referentie, kunnen de miners niet vaststellen welke blok het eerste was en welk als tweede werd gevonden. Daarom houden ze alleen rekening met de blokken waar ze voor het eerst van hun buren over gehoord hebben.
De vermeende bitcoin-uitvinder Satoshi Nakamoto heeft die situatie voorzien en daar bij de regels voor de cryptovaluta rekening mee gehouden. In de blockchain komt steeds het blok te staan dat de
meeste opvolgers heeft. In eerste instantie zijn dan ook beide blockchains van blok 363997 geldig, want nog niemand heeft blok 363998 gevonden. Als een miner blok 363998 vindt en daarin refereert naar de eerste versie van blok 363997, dan heeft de eerste versie van blok 363997 een opvolger en de tweede versie niet – waardoor de tweede versie van blok 363997 een zachte dood sterft en een zogeheten 'stale block' wordt. Zo gauw blok 363998 over het hele miner-netwerk verspreid is, werken alle miners weer met dezelfde blockchain.
Af en toe weg
Het afsterven van een blok heeft grote gevolgen voor de bitcoin-gebruiker waarvan de transacties daarin opgeslagen waren. De bitcoin-clients hebben de transacties van het blok al bevestigd en daarmee bestempeld als afgehandeld. Omdat het blok echter afgestorven is en vervangen door het overlevende blok, verdwijnen de eerder als afgehandeld beschouwde transacties als het overlevende blok binnenkomt – alsof de bevestiging nooit bestaan heeft.
Bovendien hebben de miners die het net afgestorven blok in hun blockchain opgenomen hebben, de in het blok opgeslagen transacties al uit hun mempool verwijderd waarin de aanstaande transacties op hun afwerking wachten. Dat betekent in het ergste geval dat alle in een afgestorven blok opgeslagen transacties naar de eeuwige jachtvelden verdwenen zijn, alsof ze nooit bestaan hebben – waardoor de afzender de transacties nog een keer moet versturen.
Eigenlijk zou het feit dat het moeilijk is om een volgend blok te berekenen moeten verhinderen dat meerdere miners bijna tegelijkertijd geldige blokken vinden. De moeilijkheidsgraad wordt elke twee weken dusdanig aangepast dat de miners er gemiddeld tien minuten voor nodig hebben voordat de eerste een passend blok vindt. Door puur toeval of omdat er tijdelijk heel veel miners actief zijn, kan het tot een dubbele vondst komen. In de praktijk gebeurt dat om de paar maanden wel een keer. Door het vertraagde aanpassen van de moeilijkheidsgraad gebeurt het dan vaker binnen een paar dagen.
Kettingreactie
Het komt duidelijk minder vaak voor dat een hele vertakking met meerdere blokken afsterft, zoals in de afbeelding in het kader onderaan op deze pagina, waarop een toestand van de blockchain van medio 2015 te zien is. Er ontstonden toen niet alleen twee blokken met nummer 363997, die het bitcoin-netwerk splitsten, maar bij beide vertakkingen werden ook voor de blokken 363998 en 363999 telkens twee geldige oplossingen gevonden. Pas bij blok 364000, dat slechts éénmaal gevonden werd, kwam er een beslissing en stierf de uit drie blokken bestaande eerste vertakking definitief af. De blokken van de vertakking werden als wezen gekenmerkt, ook al was de eerste in principe een stale block.
Omdat dergelijke vertakkingen uit meerdere blokken kunnen bestaan, kun je er niet op vertrouwen dat je een bitcoinbetaling definitief binnen hebt als de transactie in het laatste of één na laatste blok in de blockchain uitgevoerd is. De bitcoin-client Electrum verwerkt transacties bijvoorbeeld pas als het blok met de transactie vijf andere blokken als opvolgers heeft – wat een goed uur zal duren. Dat is wel een rem op de handel: als je je koffie betaalt met bitcoins, moet je bij Electrum een heel uur wachten voordat de betaling overgeboekt is en je hem te zien krijgt.
Maar ook dan ben je niet per se absoluut veilig: op 4 juli 2015 was er van blok nummer 363730 zelfs een vertakking met zes blokken, maar die stierf toch af. Daarmee verdwenen opeens de transacties van de laatste twee uur – een nachtmerrie voor alle shops die bitcoins accepteren en digitale goederen volautomatisch na een bepaald aantal bevestigingen aan de klant leveren. In de blockchain zelf is dat achteraf niet meer te herstellen, wacht alle blokken van de afgestorven vertakking werden bij het verschijnen van blok 363738 verwijderd.
Op blockchain.info/orphaned-blocks worden dergelijke afgestorven blokken gearchiveerd. Dat helpt de getroffenen om te begrijpen wat er met de verdwenen transacties gebeurd is en waarom een bepaalde shop een bestelling geleverd heeft zonder dat er iets van een betaling in de boeken staat. Achter dergelijke effecten zit dus niet meteen een softwarebug, het wordt door de blockchain zelf veroorzaakt. (nkr)