Blockchain – Een technische introductie in de blockchain

Dit artikel is een introductie in de blockchain. Je leest waar het idee van de blockchain is ontstaan en wat de vijf ingrediënten zijn waaruit elke blockchain bestaat. Een volgend artikel zal ingaan op distributed ledgers (technologie die door de blockchain is geïnspireerd), waarbij ook codevoorbeelden aan bod zullen komen.

Mark van Cuijk

 

Bitcoin

In 2009 is de eerste openbare blockchain in productie gegaan: Bitcoin. Tijdens het ontwerpen van Bitcoin was als doel gesteld: het moet mogelijk zijn om digitaal iets van waarde (geld) van eigenaar te laten veranderen, zodanig dat een derde partij individuele transacties niet zou kunnen censureren. Deze eigenschap van het niet kunnen censureren, heeft er bijvoorbeeld voor gezorgd dat WikiLeaks nog donaties in Bitcoin kon ontvangen, toen banken en creditcardmaatschappijen betalingen opschortten. De kern, die voor Bitcoin is bedacht, heeft later een naam gekregen: de blockchain.

In zo’n systeem moet je in essentie een digitale representatie kiezen voor je geld. Dat kan op twee manieren. De eerste manier is, zoals contant geld: munten en biljetten. Wanneer je een munt in de fysieke wereld aan iemand anders geeft, heb jij dat zelf niet meer in je bezit. Met deze methode voldoen we aan de voorwaarde, dat een derde partij de transactie niet kan tegenhouden.

Er ontstaat echter een probleem als we deze methode digitaal gaan invoeren. Je bedenkt eerst een manier om zo’n munt digitaal te representeren. Zodra je die munt echter aan iemand anders zou willen overdragen, dan zou je deze reeks met bytes moeten doorsturen en gelijktijdig op een manier moeten garanderen, dat je zelf niet een kopie hebt bewaard. Voor dat laatste deelprobleem is nog geen oplossing bekend.

Je zou geld ook kunnen representeren met een tabel, waarin voor elk account wordt bijgehouden wat het huidige saldo is. Als je nu geld wilt overdragen aan iemand, kun je een transactie uitvoeren, waardoor het saldo van jouw account wordt verlaagd en gelijktijdig het saldo van de ontvanger wordt verhoogd. Deze tabel noemen we een grootboek (Engels: ledger). Dit is in essentie wat banken doen.

Echter voldoet een implementatie bij een bank niet aan de voorwaarde, dat derde partijen niet in staat mogen zijn om transacties te censureren. De bank kan immers kiezen je transactie niet uit te voeren. Om dit probleem op te lossen, is de blockchain bedacht. Een blockchain bestaat uit vijf ingrediënten.

 

Vijf ingrediënten

Een state machine begint in toestand q0. Er worden drie berichten aangeleverd aan de state machine: “7”, “-5” en “16”. De validatiefunctie weigert het tweede bericht, omdat deze lager is dan de toestand (“7”) op dat moment. De transitiefunctie telt de vorige toestand en het inkomende bericht bij elkaar op om een nieuwe toestand op te leveren.

 

1. State machine

Het eerste ingrediënt om een blockchain te bouwen, is een state machine. Een state machine heeft twee types: het type voor de toestanden en het type voor berichten, die de state machine in gaan. Het voorbeeld in figuur 1 heeft hele getallen voor beide typen. Daarnaast heeft een state machine een initiële toestand q0, waarin het systeem zich bevindt direct nadat het gestart wordt. Tenslotte zijn er twee functies: de validatiefunctie en de transitiefunctie.

De validatiefunctie heeft als input een toestand en een bericht en levert een “ja/nee”-antwoord. Het doel van deze functie is om berichten te weigeren, die in de huidige toestand niet mogen worden aangeleverd. Wanneer de validatiefunctie een “ja” als antwoord geeft, worden de huidige toestand en het bericht als input gebruikt voor de transitiefunctie. De transitiefunctie levert een nieuwe toestand op.

Een belangrijke eigenschap van een state machine is dat deze deterministisch is. Wanneer je er dezelfde reeks berichten in stopt, dan zal je elke keer op dezelfde toestand aan het einde uitkomen. De validatie- en transitiefuncties hebben alleen de huidige toestand en het binnenkomende bericht als input, dus geen waardes uit andere bronnen of willekeurige getallen.

 

Elke node in het gedistribueerde netwerk heeft een eigen kopie van de state machine. Wanneer een bericht het netwerk binnenkomt op een node, zal het worden verspreid over het netwerk. Elke node kan zelfstandig de validatie- en transitiefuncties uitvoeren.

 

2. Gedistribueerd netwerk

Het tweede ingrediënt is een gedistribueerd netwerk. Elke deelnemer in de blockchain draait een eigen node in dit netwerk. Nodes verbinden we met elkaar om berichten uit te wisselen en elke node heeft een eigen kopie van dezelfde state machine.

  1. Consensus

Nu we een gedistribueerd netwerk hebben waar berichten binnen kunnen komen, kan er de vervelende situatie ontstaan dat bij twee verschillende nodes tegelijkertijd een bericht binnenkomt. Het kan bijvoorbeeld gebeuren dat op één node het bericht “29” binnenkomt en op een andere node het bericht “72”. Als deze nodes de berichten gaan uitwisselen, zullen sommige nodes eerst “29” en daarna “72” ontvangen, terwijl andere nodes eerst “72” en daarna pas “29” zien.

Stel nou dat dit gebeurt in de toestand, waarin figuur 1 is geëindigd. Dan zal het gebeuren dat in het eerste geval we eindigen in een toestand met de waarde “124” en in het tweede geval het bericht “29” wordt geweigerd door de validatiefunctie en we dus eindigen in een toestand met de waarde “95”. Dit is een probleem.

Als oplossing voor dit probleem hebben we een consensus algoritme nodig. Consensus zorgt ervoor dat alle nodes op het netwerk overeenstemming bereiken over welke berichten nu daadwerkelijk de blockchain ingaan en bovendien in welke volgorde ze worden verwerkt. Omdat elke node een eigen kopie van dezelfde deterministische state machine draait, zal iedereen in dezelfde eindtoestand belanden.

Er zijn diverse consensus algoritmen beschikbaar. Het gaat te ver om ze allemaal in dit artikel te behandelen, maar ze zijn ruwweg in twee categorieën in te delen, waarbinnen de algoritmes een aantal belangrijke eigenschappen delen.

De eerste categorie is consensus door loting. Op conceptueel niveau gebeurt er bij alle algoritmes in deze categorie hetzelfde. Volgens een bepaalde verdeelsleutel worden loten uitgedeeld over het netwerk en zal één van deze loten als winnaar worden geselecteerd. De verdeelsleutel zou bijvoorbeeld kunnen zijn: elke node in het netwerk krijgt één lot. Dit heeft echter als nadeel dat iemand in staat is om meerdere loten te bemachtigen door simpelweg meer nodes op te starten, bijvoorbeeld bij een cloud provider.

Het consensus algoritme dat Bitcoin gebruikt, valt in deze categorie. Het proces bestaat eruit dat een node een voorstel doet van de volgorde van berichten, die het heeft ontvangen. Over dit voorstel berekent de node een hash. Als de hash aan de voorwaarde voldoet, dat het begint met 17 nullen, dan vinden we de hash valide. Je kunt je voorstellen dat de kans dat je zo’n hash per toeval weet te raden extreem klein is. Elke poging, die de node waagt, is als het ware een lot. Zodra een hash wordt gevonden, dat aan de genoemde voorwaarde voldoet, dan heeft de node een winnend lot te pakken en kan die node het voorgestelde groepje berichten over het netwerk distribueren. De andere nodes in het netwerk zullen het voorstel als winnaar herkennen, omdat zij heel snel kunnen controleren dat de hash inderdaad begint met 17 nullen.

De andere categorie is consensus door stemming. Door het volgen van de regels van het algoritme wordt een node geselecteerd, die een voorstel mag doen. Deze node selecteert een volgorde van berichten en zet daar een digitale handtekening onder. Het groepje berichten wordt verspreid onder de nodes, waarmee deze eerste node verbonden is, die ieder ook een digitale handtekening plaatsen. We spreken nu af dat een node nooit twee handtekeningen zet, die met elkaar conflicteren. Bovendien weten we hoeveel nodes meedoen aan het vormen van consensus (deze nodes noemen we validators). Deze twee eigenschappen samen bieden de garantie, dat er maar één volgorde van berichten de meerderheid van stemmen kan verkrijgen.

 

4. Keten van blokken

Met de eerste drie ingrediënten zijn we in principe in staat om met een verzameling aan nodes consensus te bereiken over welke berichten een state machine in gaan en in welke volgorde dat gebeurt. Hierdoor kan elke node zelfstandig vanaf de begintoestand de voortgang berekenen en op dezelfde eindtoestand uitkomen als alle andere nodes. Er is nu echter een probleem waar we tegenaan kunnen lopen: het consensus algoritme heeft tijd nodig. Stel dat we een algoritme hebben, dat een halve seconde nodig heeft om tot consensus te komen en we dit voor elk bericht op individueel niveau willen doen, dan beperken we onszelf automatisch tot een maximale verwerkingssnelheid van 2 berichten per seconde.

De oplossing hiervoor ligt erg voor de hand: we introduceren batches van berichten. Elke batch noemen we een blok en in de header van het blok nemen we een verwijzing op naar het voorgaande blok. Hierdoor bouwen we een keten van blokken op. Een grafische weergave hiervan is te zien in Figuur 3.

 

De blockchain begint in de toestand “0”. Er wordt consensus bereikt over het eerste blok, dat vijf berichten bevat. Nadat deze vijf berichten aan de state machine zijn ingevoerd, komen we terecht in de toestand “124”. In het tweede blok komen drie nieuwe berichten binnen, die ons naar de toestand “1193” brengen.

 

5. Autorisatie

Het laatste ingrediënt dat we toevoegen om een blockchain te maken is autorisatie. We kunnen dit opsplitsen in twee delen: lezen en schrijven. Over lezen zijn we heel snel klaar: alle berichten worden naar alle nodes gedistribueerd en iedereen heeft een eigen kopie van de state machine.

Schrijven in een blockchain betekent dat je berichten kunt aanmaken, die het gevolg hebben dat er een wijziging in de toestand teweeg wordt gebracht, bijvoorbeeld het overschrijven van een bedrag van één account naar een ander. Dit wordt in een blockchain opgelost door als onderdeel van elk bericht een digitale handtekening op te nemen. De validatiefunctie van de state machine controleert van elk bericht of de handtekening valide is en of de private key, waarmee de handtekening is gemaakt, geautoriseerd is om de gevraagde operatie uit te voeren. Het uitgeven van geld vanaf mijn rekening mag bijvoorbeeld alleen als mijn private key is gebruikt voor het maken van de handtekening.

 

Ethereum

Het concept van de blockchain is heel algemeen. In de praktijk zijn er niet veel blockchain-implementaties, die echt interessant zijn om te bekijken. De belangrijkste voorbeelden zijn Bitcoin en Ethereum. Bitcoin focust zich volledig op de overdracht van geld, maar Ethereum is veel breder. Als je Bitcoin een telefoon zou noemen waarop alleen een aantal vaste mogelijkheden zaten, zou je Ethereum een smartphone kunnen noemen, waarop je naar gelieve nieuwe apps kunt installeren.

Elke node in het Ethereum-netwerk bevat een implementatie van de Ethereum Virtual Machine (EVM). In essentie lijkt de EVM op de Java Virtual Machine, maar hij heeft een eigen instructieset. Een belangrijke eigenschap is dat de EVM volledig deterministisch is. Zo is er bijvoorbeeld geen bron voor random getallen en is het niet mogelijk met de buitenwereld te communiceren.

Met de gereedschappen van Ethereum kunnen twee of meer partijen op het Ethereum-netwerk gegevens met elkaar uitwisselen en overeenstemming bereiken over de toestand van hun systemen. Wat de blockchain echter uniek maakt, is dat er niet één partij hoeft te zijn, die de beheerder is van een centrale database, waar de andere partijen maar op moeten vertrouwen.

 

En verder?

Door het ontwerp van een blockchain (met name de distributie van alle informatie naar alle partijen) zijn er een aantal inherente beperkingen aan deze technologie. Privacy is een lastig probleem en qua performance zijn er nog geen goede oplossingen om meer dan enkele tientallen transacties per seconde te behalen.

Er zijn tegenwoordig een aantal platforms beschikbaar, die zich hebben laten inspireren door de blockchain-technologie. Ze wijken echter op een aantal punten af om meer privacy en performance te kunnen bieden. Deze platforms noemen we distributed ledgers. De twee belangrijkste, waarin je ook met Java kunt ontwikkelen, zullen in een volgende editie van Java Magazine worden behandeld.