Wat is Proof-of-Work?
Een blockchain zoals die van Bitcoin en Ethereum is distributed en permissionless, en moet daarom worden beschermd tegen kwaadwillende deelnemers.
Er zijn verschillende manieren om het netwerk te laten besluiten wat de inhoud is van het grootboek. De bekendste is Proof-of-Work, de methode die Bitcoin en Ethereum gebruiken.
Voordat we bekijken hoe Proof-of-Work werkt, moeten we eerst weten wat een hash is.
Hash
Een hash is het controlegetal van een verzameling gegevens (de input) volgens een bepaald algoritme (de hashing functie). Die algoritmes hebben namen als SHA, Blake, Groestl of Skein.
In dit artikel gebruik ik het algoritme sha1 en de programmeertaal php voor de voorbeelden.
De basics
Hoe groot de input ook is, de hash heeft altijd een vaste lengte.
php > echo sha1('kort');
7040a4371165d0f8cb7b0ca321627b1750139a49
php > echo sha1('een stuk langer');
ccc3eaefb28a26bc8a2ba34634884855323ae798
De hash is altijd hetzelfde als de input hetzelfde is.
php > echo sha1('Lekker cryptisch');
33d795bfde8eb71e8c80816c8792d9932ac8c568
php > echo sha1('Lekker cryptisch');
33d795bfde8eb71e8c80816c8792d9932ac8c568
Vanuit de hash zijn de originele gegevens niet te herleiden. Daarom moet de hash heel sterk veranderen als de input maar een klein beetje verandert.
php > echo sha1('test-1');
cbda819156a1a5eedad38dc64871b8ca157df994
php > echo sha1('test-2');
987d4cc40e5e5c0fdb68adc87e3445740670e2d0
Wat heb je eraan?
Als je een hash hebt, kun je controleren dat de originele gegevens niet zijn aangepast door de hash opnieuw te berekenen, en te vergelijken met de hash die je gekregen hebt.
Dit mechanisme wordt gebruikt om te kunnen controleren of je wachtwoord juist is, zonder het wachtwoord zelf op te slaan. De hash van je wachtwoord wordt vergeleken met de opgeslagen hash. Als het klopt, dan klopt je wachtwoord ook.
Hashes zijn essentieel in blockchains.
In elk block wordt de hash van het het voorgaande block opgeslagen. Daarmee stelt de maker van het nieuwe block dat hij uitgaat van de situatie zoals die in het voorgaande block is vastgelegd. En daarin zit weer de hash van het block dáárvoor, enzovoorts.
Als ergens in een block ook maar één teken aangepast zou worden, dan zou de hash van elk block erna anders worden.
De Nonce
Bij een Proof-of-Work blockchain worden de blocks gemaakt door miners. Het nieuwe block bestaat uit de hash van het voorgaande block, de nieuwe transacties en een nonce.
Die nonce is de kern van de puzzel. Onderdeel van de regels van de blockchain is dat een block moet voldoen aan een minimale difficulty, of moeilijkheidsgraad. Die difficulty is een bepaalde eis die gesteld wordt aan de hash van het nieuwe block.
De nonce heeft geen betekenis voor het block. De miner mag zelf allerlei nonces proberen om een hash te vinden die voldoet aan de eisen van de difficulty.
Die eisen kunnen bijvoorbeeld zijn: De hash moet beginnen met 7 nullen.
Laten we eens naar een voorbeeld kijken.
Stel dat het block de inhoud "test" heeft. Dan zou de hash zijn:
php > echo sha1('test');
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Nu gaan we als nonce elke keer een getal toevoegen aan de inhoud.
php > echo sha1('test-1');
cbda819156a1a5eedad38dc64871b8ca157df994
php > echo sha1('test-2');
987d4cc40e5e5c0fdb68adc87e3445740670e2d0
Nog geen nullen aan het begin. Pas bij 21 zien we de eerste nul. En bij 54 zien we twee nullen. Voor 7 nullen hebben we al een half miljard keer moeten proberen!
test-21: 06e7aaca0dad419d313d91a28d8d8f1148506e3e
test-54: 0021951941d89ead126de4b8c2b49018bffc54ca
test-7187: 0006ef0ac52d6336074f72d776b7c7434c216d9e
test-153597: 0000df670477acc9ee7f11418e9a2e97a84778f8
test-1154156: 00000befc421545042898434d4554b40d1789ba8
test-11494477: 000000730e360ccf7eeaddfe3bc477e0fd228d88
test-581016028: 0000000ef9f1df95c6b14f150ec08a74650fb6ef
Proof-of-Work
Omdat alle miners elke keer een willekeurige nonce gebruiken, is het toeval welke miner als eerste een hash vindt die voldoet aan de difficulty. De gelukkige maakt een block en verdient de block reward.
Doordat zijn hash voldoet aan de difficulty, levert hij daarmee het bewijs dat hij (en alle andere miners die tegelijk bezig waren!) een bepaalde hoeveelheid werk heeft verricht. Vandaar: Proof-of-Work.
Difficulty
Hoe meer miners meedoen, hoe hoger de difficulty zal worden. Daarmee houdt het netwerk de block time constant.
Omdat miners van toeval afhankelijk zijn, zal het volgende block soms heel snel en soms heel laat gevonden worden. De block time is dan ook een gemiddelde. Als een blockchain elke twee minuten een block wil vinden, dan is het gemiddeld twee minuten. Soms misschien al na een paar seconden, en soms pas na 5 minuten.
Hoe meer miners meedoen, hoe meer kosten er in totaal voor een block gemaakt worden. Denk aan de aanschaf van de hardware en de stroomkosten. Als de beloning voor een block te laag is, is het niet meer interessant om te minen.
Het is wel belangrijk voor een netwerk om veel miners te hebben. Meer miners betekent meer decentralisatie, en dat betekent meer bescherming tegen kwaadwillenden.
Kritiek
Veelgehoorde kritiek op Proof-of-Work blockchains is dat de hoeveelheid hardware en stroom die het oplossen van de puzzel kost onverantwoord is. Het zorgt ook voor ongelijkheid omdat de stroomprijs over de wereld heen sterk verschilt, en het nodigt uit tot criminaliteit, zoals aftappen van stroom.
Onder andere daardoor wordt veel geëxperimenteerd met blockchains die een ander consensus-algoritme gebruiken. De bekendste is Proof-of-Stake. Daar gaan we in een latere blog op in.
Iedereen heeft een mening
Onder de noemer Opinie
schrijven we regelmatig over een spraakmakende podcast, video of tweetstorm.
We zijn het niet noodzakelijkerwijs eens met de spreker of schrijver, maar vinden het interessant genoeg om
te delen, duiden en ondertitelen.