Je bekijkt nu Hoe werkt een Bitcoin transactie (deel 2)

Hoe werkt een Bitcoin transactie (deel 2)

Net als echt geld wordt bitcoin opgeslagen in portefeuilles (wallets). Maar deze wallet is uiteraard digitaal. Het is hoe je toegang krijgt tot jouw bitcoins. Je wallet houdt je bitcoins niet echt op je computer of telefoon; de Bitcoins staan altijd op de blockchain. Elke wallet heeft een uniek adres. Een Bitcoin-walletadres is slechts een reeks cijfers en letters. Het is het enige stuk informatie dat vereist is om Bitcoin te verzenden en te ontvangen, dus je naam wordt niet gedeeld. 

Publieke sleutel (public key), privé sleutel (private key) en digitale handtekening

Om bitcoin van de ene wallet naar de andere te verzenden, moet je eerst de transactie autoriseren. Bij elke Bitcoin-transactie wordt gebruik gemaakt van ‘public key encryptie’ om de transactie mogelijk te maken en te beveiligen. De public key encryptie bestaat uit: twee sleutels, een Bitcoin-adres en een digitale handtekening. Het werkt als volgt:

De wallet maakt één privé sleutel aan en één of meerdere publieke sleutels.

De publieke sleutel identificeert de Bitcoin-gebruiker en laat het Bitcoin-adres van de Bitcoin-gebruiker zien. Het Bitcoin-adres kan gezien worden als de naam van de bank in combinatie met het rekeningnummer van de rekeninghouder. Een goed gebruik is elke keer een nieuw Bitcoin-adres gebruiken bij een transactie om veiligheid en anonimiteit te waarborgen. Een publieke sleutel is dus nodig voor het verifiëren (en ontvangen) van bitcoins.
Met de privé sleutel kan aangetoond worden dat de publieke sleutel, en het daaraan verbonden Bitcoin-adres, aan diegene toebehoort. Het werkt, in vergelijking met het reguliere betalingsverkeer, als het ware als de pincode van een bankrekening. De in de wallet bewaarde privé sleutel vormt het bewijs dat jij de eigenaar bent van de, in block chain bestaande, bitcoins. Met de privé sleutel is diegene in staat om transacties met die bitcoins aan te gaan. Een wallet zonder privé sleutel is dus waardeloos. Een privé sleutel is dus nodig voor het ondertekenen (en versturen) van bitcoins.

De privé sleutel geeft de volledige controle over de toegekende bitcoins aangezien je ze er mee kunt versturen naar een publieke sleutel van een andere Bitcoin wallet. De veiligheid van de privé sleutel in een Bitcoin wallet moet je eerste prioriteit zijn!  

Bij een transactie leidt de ondertekening van die transactie met de privé sleutel tot een, bij elke transactie andere, digitale handtekening. Dit werkt, in vergelijking met het reguliere betalingsverkeer, als het ware als de verificatiecode op een ‘identifier’ bij een girale overboeking. De combinatie van de privé sleutel (pincode) en de publieke sleutel  (het rekeningnummer) leidt tot een verificatiecode (ondertekening) die elke keer anders is.

Laten we een voorbeeld gebruiken om het allemaal samen te stellen: stel dat Bob naar Jane één bitcoin wil sturen.

De bitcoin wordt verzonden van de wallet van Bob naar de wallet van Jane. Om dit te doen, voert Bob het Bitcoin-adres van Jane in en vervolgens gebruikt zijn wallet de digitale handtekening (privé sleutel) om de transactie te autoriseren.

Zodra Bob op ‘Verzenden’ klikt, wordt zijn bitcoin-transactie aan de Blockchain toegevoegd voor verwerking. De bitcoin-transactie van Bob is nog niet helemaal verzonden. In plaats daarvan heeft Bob alleen aangekondigd dat hij zijn bitcoin wil sturen.

De nodes van het bitcoinnetwerk controleren of Bob voldoende saldo heeft. Alleen dan wordt de transactie goedgekeurd. Na verificatie is de bitcoin van Bob onderweg.

Verwerking transactie

Als jij een transactie doet, geef je deze een bepaalde ‘fee’ mee. Vervolgens komt de transactie (tx) in de memorypool (mempool) terecht. Alle Bitcoin-transacties worden door de miner gebundeld (gekozen uit de mempool). Elk van deze bundels wordt een blok genoemd. Samen vormen de blokken de blockchain, vandaar de naam. Elk Bitcoin-blok wordt gevuld met nieuwe transacties totdat het vol is. Vanuit daar concurreren de miners om de blokken om als eerste een volgende block toe te kunnen voegen. Elke 10 minuten wordt de blockchain ge update omdat er ongeveer om die periode een nieuw blok wordt gemaakt.

Een transactie bestaat uit drie onderdelen: de header, de input en de output.

Header

In de header van een transactie zitten een aantal dingen:

Target (bits)

Het target wordt opgeslagen in het bits veld in de header van elk blok.
Het target is een bestand van 4 bytes, ook wel Bits genoemd. Het target wordt elke 2.016 blokken op het Bitcoin-netwerk aangepast. Deze informatie is vooral belangrijk voor miners.

Merkle Root (mrkl_root)

De Merkle Root bevat de hash van de Merkle Root van de blockchain. Het gebruikt dezelfde functie als de vorige blokhash. De Merkle-root is afgeleid van de hashes van alle transacties in dit blok.
Het is dus de hash van alle transacties binnen het blok. Dit is gehasht met het SHA256-algoritme.

Hashing zorgt ervoor dat geen van deze transacties kan worden gewijzigd zonder de volledige header te wijzigen en is dus een beveiliging voor het blok en een belangrijk kenmerk van een openbaar, gedecentraliseerd en betrouwbaar systeem. De Merkle-root bestaat uit alle TXID’s (transactie-ID) van transacties in het blok. De TXID’s worden geplaatst in de volgorde zoals vereist door de consensusregels

Nonce

De nonce is een veld van 4 bytes waarmee miners de hash van de header wijzigen om een hash te produceren die kleiner is dan of gelijk is aan de target. De nonce is als het “magische nummer”, want wie het het eerste ontdekt, mag zijn block toevoegen aan de blockchain. De beloning wordt vervolgens in het coinbase veld gezet en aan de miner gegeven die het nonce als eerste heeft ontdekt. Het ontdekken van de nonce is de belangrijkste activiteit die miners ondernemen tijdens het consensusmechanisme van het valideren van blokken.

Previous Block Hash (prev_block)

De hash van het vorige block. Een zeer belangrijke functie in een blockchain.
Dit is wat een blok koppelt aan de rest van de blockchain.
Een hash is een soort van verkorte weergave waarin alles van een transactie staat weergeven. Zie hieronder een voorbeeldje van de allereerste transactie die er is gedaan:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

Timestamp (time)

Deze tijdsstempel begint wanneer de miner de header begint te hashen.
Volgens de Bitcoin-protocollen moet het ontstaan van elk blok gemiddeld 10 minuten zijn, dus de tijdstempel moet binnen dit tijdspad vallen. De variabiliteit is echter te wijten aan de moeilijkheidsgraad.

Version (ver)

Een miner met een bepaald versienummer kan aangeven welke protocolbeslissingen hij ondersteunt. ‘’Versie 4’’ wordt op dit moment gebruikt en zit, via BIP 65, sinds december 2015 in het protocol ingebakken. De versie verwijst naar welke blokvalidatieregels het blok volgt. Als het versienummer van het blok verschilt van andere blokken, kunnen ze geen deel uitmaken van dezelfde blockchain. In dat geval loopt hij op een andere chain en kan dit resulteren in een hard fork.

Input

In de input zit ten eerste een verwijzing naar de vorige output hash. Dit verwijst naar de vorige unspent transaction output (UTXO). In wezen is dit het geld dat jij op het punt staat om uit te geven met deze transactie.

De letter n is de index in de outputs van de vorige transactie. Het is het eigenlijke bedrag dat jij wilt versturen. Ten derde zit er in de input een soort van bewijs, een spending script (scriptSig) dat aangeeft dat er rechten zijn om deze transactie met de informatie van de output hash en n te versturen.

Output (UTXO: Unspent Transaction Output)

Vervolgens zien we in de output een value wat aangeeft hoeveel satoshi’s er zijn verstuurd. Hierbij geldt: 1 BTC = 100.000.000 Satoshi. Ten tweede zit er een scriptje in met de naam scriptPubKey wat verwijst naar de hashed public key van de ontvanger.

In totaal ziet een transactie met bitcoin er dus als volgt uit:

Input:

Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6

Index: 0

scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10

90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501

Output:

Value: 5000000000

scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d

OP_EQUALVERIFY OP_CHECKSIG

Het Bitcoin netwerk bestaat vervolgens uit een netwerk van duizenden nodes die álle transacties controleren. Nodes bekijken of alles eerlijk gaat (volgens de consensus regels). Als een miner een transactie in een block stopt, houden zij als het ware in de gaten of niemand vals speelt:

  • Ze controleren of de output past bij de input;
  • De digitale handtekening van de input moet goed zijn. De scriptjes moeten goed uitgevoerd worden.
  • Er mag geen UTXO meer dan één keer worden uitgegeven in een transactie;
  • De waarden van transacties mogen niet negatief zijn;
  • De som van de waarden van de input moet groter zijn dan die van de output. Dit omdat er altijd een bepaalde fee moet worden afgestaan aan de miner die de betaling in een block stopt.

Op deze manier komt de betaling die jij doet terecht bij de ontvanger. Deze persoon kan met zijn private key van de corresponderende public key (en adresses) aantonen de rechtmatige nieuwe eigenaar te zijn van deze BTC’s.