Bitcoin, ether, litecoin, allemaal munten gebaseerd op blockchain. In dit artikel gaan we dieper in op de blokken waaruit een blockchain is opgebouwd.
De blockchain is een keten van datablokken. Elk blok kan worden beschouwd als een pagina in een grootboek. De individuele blokken zijn samengesteld uit verschillende componenten. Grofweg kunnen deze worden onderscheiden in de kop van het blok (blockheader) en haar lichaam (blockbody).
Blockheader
De kop van het blok is verdeeld in zes componenten:
- het versienummer van de software
- de hash van het vorige blok
- de root-hash van de merkle tree
- de tijd in seconden sinds 1970-01-01 T00: 00 UTC
- de moeilijkheidsgraad
- de nonce
Het versienummer van de software
Het versienummer van de software doet er in de meeste gevallen niet toe. Een miner met een bepaald versienummer kan echter aangeven welke protocolbeslissingen hij ondersteunt.
De hash van het vorige blok
De hash is wel belangrijk, hiermee wordt namelijk het chain-gedeelte van blockchain gegarandeerd. De hash van het vorige blok wordt verwerkt in de hash van het nieuwe blok, hierdoor bouwen de blokken van de blockchain allemaal op elkaar door. Zonder dit component zou er geen verbinding en chronologie tussen de blokken zijn.
De root-hash van de Merkle tree
Alle transacties in een blok kunnen worden samengevoegd in een hash. Dit is de root-hash van de Merkle tree. Weet je niet wat een Merkle-tree is? Geen probleem, komen we later op terug.
De tijd in seconden sinds 1970-01-01 00: 00 UTC
Dit wordt ook wel de tijdsstempel genoemd. De tijd wordt weergegeven in verstreken seconden sinds 1.1.1970. Deze wordt toegevoegd op het moment dat een miner begint met het zoeken naar een block.
De moeilijkheidsgraad
De moeilijkheidsgraad geeft een bepaald doel aan wat behaald moet worden om te ‘winnen’ met minen. Dit doel geeft op haar beurt weer aan hoe klein of groot de hash moet zijn die miners moeten vinden.
Een voorbeeld: stel je een tafel met duizend bekers voor. Onder elke beker ligt een papiertje met een getal tussen 1 tot 1000. Bij de makkelijkste moeilijkheidsgraad vraag je een miner om een getal te vinden tussen 1 en 1000. Die heeft hij op zijn eerste poging al gevonden. We maken iets moeilijker. Hij moet een getal tussen 1 en 500 vinden. Dat gaat al wat moeilijker. Een vriend van de miner komt aangelopen en wil ook meedoen. Met z’n tweeën zoeken ze nu naar een getal tussen 1 en 500. Nu wordt het weer te makkelijk, ze vinden het getal heel snel. Uit het niets gaat de bel en willen tien anderen ook meedoen. Het systeem moet zichzelf nu reguleren om het nog spannend te houden. Nu moeten ze op zoek gaan naar een getal tussen 1 en 5.
Een miner schiet een getal in een algoritme en dat getal (samen met getallen die vanuit het vorige blok komen) wordt gehashed tot een uitkomst. Die uitkomst moet dus lager of gelijk zijn aan de moeilijkheidsgraad. De miner heeft dus alleen invloed door het getal aan te passen wat hij in het algoritme stopt. En dat getal noemen we de nonce.
De nonce
De nonce is een getal waarmee miners de juiste hash zoeken. De miner raadt een geldige hash, door de juiste nonce in te voeren in een algoritme.
Op deze manier raadt de mijnwerker een geldige hash, een hash die gelijk aan of kleiner is dan het doel aangegeven door de moeilijkheidsgraad.
Deze zes onderdelen vormen de block-header. De block-header speelt een belangrijke rol in bitcoin omdat deze alle blokken met elkaar verbindt. Een goed vergelijk is de cockpit of truck van een vrachtwagen. Hier bevinden zich alle transportdocumenten die een vrachtwagen nodig heeft om geaccepteerd te worden door het distributienetwerk.
Block Body
Het lichaam van het blok is dan weer vergelijkbaar met de laadruimte van een vrachtwagen. Hierin staan alle transacties die door het blok zijn bevestigd. Overigens is de eerste transactie in een blok de coinbase transactie. Dit is de transactie waarin vastgelegd is hoeveel de miner aan reward en fee ontvangt.
Als een miner een blok wil toevoegen aan de blockchain, dan valideert hij eerst de transacties. Ofwel, heeft de afzender genoeg geld om uit te geven? Deze informatie haalt de miner dan weer uit de blockchain. Wil de afzender tien bitcoin verzenden? Dan controleert de miner in voorgaande blokken op de blockchain of die tien bitcoin ook via een transactie in zijn bezit zijn gekomen.
De transacties in een blok staan niet alleen in een lijst, maar in een zogenaamde Merkle Tree.
Wat is een Merkle Tree?
De Merkle Tree ontleent haar naam aan de wiskundige Ralph Merkle. Hij ontdekte dat je veel informatie kon weergegeven in een enkele hash.
Die informatie moet dan wel eerst gehashed worden. Daarna worden de hashes weer gehashed en samengevoegd. Ten slotte wordt de Merkle Tree samengevoegd tot een enkele hash. Deze laatste hash wordt ook root hash genoemd, de wortel van de boom.
Het vertegenwoordigt alle informatie van zijn "bladeren" (individuele transacties) en "takken" (hashes van de bladeren) in een relatief korte reeks.
Het maken van de root hash gaat snel en gemakkelijk, mits alle takken en bladeren bekend zijn. Denk aan hoe een hash werkt: je kan snel gegevens gegevens hashen in één richting en is onmogelijk in de andere richting op te splitsen. Met alleen de root-hash kan je nooit transacties achterhalen of ontcijferen.
Alleen het opslaan van de root-hash is daarom niet genoeg, ook de rest van het blok moet worden opgeslagen. De miner kan de root-hash op elk moment controleren of valideren door de informatie uit het blok opnieuw te hashen.
Zolang de hashfunctie hetzelfde is, krijgen de mijnwerkers altijd dezelfde hash als hij dezelfde gegevens invoert.
Met minen zoek je naar een speciale hash
Met bovenstaande informatie is het ook makkelijker te begrijpen wat proof-of-work is.
Bij het minen wordt de blockheader van het blok stapsgewijs gewijzigd om een speciale hash te krijgen. De kop bestaat uit vijf constanten en één variabele.
De constanten zijn het versienummer van de software, de hash van het vorige blok, de root-hash van de Merkle-tree, het tijdstempel en de doelgrootte van de gezochte hash in bytes.
De variabele is de nonce.
Een nonce is een nummer dat steeds met één wordt verhoogd. Deze nonce wordt door een algoritme gehaald zodat er een hash uitkomt. Of de hash geldig is, hangt af van welk doel er gevonden moet worden.
Is de hash-waarde groter is dan het doelwit, dan herhaalt de miner het proces; Dus de miner verhoogt de nonce met één, gooit de cijfers door een algoritme en controleert opnieuw. Dit proces wordt constant herhaald totdat een hash gelijk aan, of onder het doel wordt gevonden. Maar wat nog veel vaker gebeurt, is dat de miner een signaal krijgt dat een andere miner de doelwaarde al heeft gevonden.
Het proces van minen is een repetitief proces waarvan het doel is om een speciale hash te vinden. Zodra de hash is gevonden, begint het spel opnieuw. De kans op het vinden van een speciale hash hangt af van de moeilijkheidsgraad en hoeveel rekenkracht je tot je beschikking hebt. Gemiddeld vinden bitcoinminers elke tien minuten een nieuw blok. De moeilijkheid blijft zich aanpassen aan de beschikbare computerkracht op het bitcoinnetwerk, zodat het gemiddelde van eens per tien minuten gehandhaafd blijft. Die aanpassing is eens per twee weken.
Eigenlijk kan je die speciale hash alleen maar vinden door simpelweg de nonce te raden. Dit wordt brute forcing genoemd en kost rekenkracht. En die rekenkracht kost weer energie.
Hieronder een voorbeeld van zo'n hash van de Bitcoin blockchain. Wat opvalt is dat de hash met een boel nullen begint.
000000000000000000094bfa4edb1245c347e42452e4418e9fe5a1d24e335b16
Hoe lager de moeilijkheidsgraad, hoe minder nullen, des te makkelijker het is om de hash te raden.