Ett block, eller block på engelska, är en tidsstämplad och validerad uppsättning av transaktioner. Dessa transaktioner är vanligtvis överföringar av kryptovalutor, men kan också vara interaktioner med smart contracts eller innehålla godtyckliga data. Blocken är länkade till varandra på ett sätt som skapar en linjär struktur kallad blockkedjan, eller blockchain.
Hur byggs block?
Som vi vet utgör blockkedjan registret över alla transaktioner för en kryptovaluta och delas mellan medlemmarna i ett distribuerat nätverk av datorer. Denna kedja består av en linjär sekvens av block, som börjar med det första blocket, vilket anses vara giltigt som standard, och som kallas för genesis block.
Blocken byggs och länkas samman enligt specifika regler, kallade konsensusregler, som definieras av nätverket. Till exempel är blockens storlek vanligtvis begränsad av dessa regler för att förhindra DDoS-attacker och för att säkerställa att nätverket förblir decentraliserat.
Validatören (kallad « miner » i fallet med Bitcoin) förbereder sitt block genom att samla in nya transaktioner, kontrollera att de följer reglerna och inkludera dem i blocket. Sedan genomförs valideringen. I Bitcoin och andra system som använder proof-of-work, måste validatören spendera energi för att lösa ett matematiskt problem, och denna lösning gör det möjligt att länka blocket till kedjan. I system som använder proof-of-stake eller proof-of-authority, behöver validatören endast producera en digital signatur som autentiserar honom mot nätverket. Eftersom blocket måste innehålla identifieraren för det föregående blocket, länkas det nya blocket till detta.
Vid valideringen läggs en tidsstämpel till blocket, vilket är det ungefärliga datumet och klockslaget då blocket hittades. Detta gör att nätverket kan ha sin egen tid och se till att intervallet mellan varje block varken blir för kort eller för långt: i Bitcoin bör detta teoretiskt sett vara 10 minuter i genomsnitt.
Data som skrivs in i blocken anses vara väldigt svåra att ändra och blir oförfalskbara efter en viss tid. En transaktion anses vara bekräftad när den ingår i ett validerat block. När ytterligare ett block läggs till efter detta block talar man om två bekräftelser, och så vidare. Ju fler bekräftelser en transaktion har, desto mer kan man lita på dess irreversibilitet.
Varje block har en identifierare, vilket är en unik kryptografisk hash, som genereras genom att hashfunktionen appliceras på blockets data. Exempelvis: 000000000000000000024bead8df69990852c202db0e0097c1a12ea637d7e96d. Man kan också identifiera blocket genom dess höjd i kedjan: Genesis-blocket anses vara block 0, följt av block 1, och så vidare. Den 11 maj 2020 nådde Bitcoin-kedjan block nummer 630 000.
Strukturen av ett block i Bitcoin
I Bitcoin består ett block av två huvuddelar: en blockheader (blockhuvud) och transaktioner, vilka används för att bygga upp ett Merkle-träd (Merkle tree). Låt oss fokusera på transaktionerna innan vi går in på blockhuvudet.
Transaktionerna
Transaktionerna placeras efter varandra i blocket. Den enda regeln som måste följas är att den första transaktionen måste vara belöningstransaktionen (även kallad coinbase transaction), som betalar ut ersättning till minern. Denna transaktion skapar nya bitcoins: beloppet är för närvarande 6,25 bitcoins per block. Den samlar också in transaktionsavgifterna från blockets transaktioner.
Belöningstransaktionen innehåller också ytterligare information. Speciellt brukar mining pools (gruvkooperativ) ange sina namn i ett speciellt fält i transaktionen, så att användare kan få en uppfattning om hur mining-kapaciteten är fördelad (detta är en konvention, men inte obligatoriskt). Till exempel, eftersom vi hittar meddelandet « Mined by AntPool » i block 630 000, kan vi dra slutsatsen att det troligen grävdes av den kinesiska mining poolen AntPool.
Merkle-trädet
Transaktionerna placeras i en viss ordning i blocket och bildar grunden för en struktur som kallas Merkle-träd eller hashträd. Detta innebär att man hashar transaktionerna (« bladen »), sedan grupperar de resulterande hasharna två och två, och hashar dem igen, och så vidare tills man får en unik hash, kallad Merkle-roten för trädet. Hashfunktionen som används för att konstruera detta träd är dubbel SHA-256.
Låt oss ta ett exempel med ett block som innehåller 6 transaktioner, där vi använder bokstäver för att identifiera dem: txA, txB, osv. Först hashar vi dessa transaktioner för att få deras unika hashvärden: hA, hB, osv. Notera att dessa hashar fungerar som identifierare för transaktionerna, vilket gör det möjligt att hitta dem på blockchain.
Sedan kombineras (genom konkatenering) de erhållna hashvärdena två och två, och hashfunktionen appliceras igen på varje kombination: kombinationen av hA och hB hashas för att få hAB, hCD erhålls från hC och hD, och hEF skapas från hE och hF.
Processen upprepas sedan. Om antalet hashvärden att kombinera är udda, kombineras det sista hashvärdet med sig självt: i vårt exempel måste hEF kombineras med sig självt för att beräkna hEFEF.
Slutligen, när endast ett enda hashvärde återstår (Merkle-roten), placeras detta hashvärde i blockhuvudet, exempelvis b191f5f973b9040e81c4f75f99c7e43c92010ba8654718e3dd1a4800851d300d.
Om en av transaktionerna modifieras, förändras Merkle-roten. Denna struktur säkerställer alltså att transaktionerna inte kan ändras utan att förändra hela blockkedjan. Dessutom möjliggör den en lätt verifiering av transaktionerna för plånböcker.
Notera att sedan SegWit aktiverades den 24 augusti 2017, består varje block av två Merkle-träd:
- Transaktionsträdet (utan signaturer), som beskrivs här.
- Vittnesträdet (som inkluderar signaturerna för SegWit-transaktioner).
Rötterna till vittnesträdet placeras i belöningstransaktionen, så att Merkle-roten för hela blocket beror på den.
Blockhuvudet
Ett block börjar alltid med ett blockhuvud på 80 byte. Detta består av följande data:
- Blockets version: Utöver att ange versionsnumret kan detta fält också användas av miners för att signalera om de godkänner en förändring av protokollet.
- Identifieraren för det föregående blocket, vilket gör det möjligt att länka blockhuvudet till föregående block.
- Merkle-roten, som länkar blockhuvudet till resten av blocket, som vi såg ovan.
- Tidsstämpeln: Datum och tid för miningen.
- En parameter som indikerar mining-svårigheten för blocket.
- Nonce, relaterad till proof-of-work.
Blockets identifierare
Blockets identifierare har en specifik funktion: förutom att den gör det enkelt att hitta blocket, utgör den i sig själv beviset på arbetet (proof-of-work). Detta syns genom antalet nollor i början av dess hash: exempelvis har block 630 000 följande identifierare:
000000000000000000024bead8df69990852c202db0e0097c1a12ea637d7e96d.
Hur beräknas den?
Det är helt enkelt resultatet av att blockhuvudet hashats med dubbel SHA-256. Detta är dock inte lätt att hitta, eftersom Bitcoin kräver att det erhållna värdet är lägre än en målvärde som definieras i blockhuvudet, i enlighet med nätverkets svårighetsgrad.
För att uppnå detta varierar minern nonce (ett fält som endast existerar för detta syfte) i blockhuvudet tills en lösning hittas. Denna lösning fungerar som bevis på att energi har spenderats för att beräkna dessa hashvärden.
Notera att nonce, som ursprungligen planerades av Satoshi Nakamoto, endast är kodad på 4 byte, vilket gör det möjligt att testa 4,3 miljarder värden, vilket är för lite för dagens beräkningskraft. Därför varierar miners också en extra nonce inom belöningstransaktionen.
Sammanfattning
Här är ett schematiskt sammanfattning av vad ett Bitcoin-block innehåller (sedan aktiveringen av SegWit) :
I blått representeras identifieraren för det föregående blocket, vilket är resultatet av dubbel hashing med SHA-256 av föregående blockhuvud. Detta är vad som gör det möjligt att koppla samman blocken, så att man får en kedja av proof-of-work.
I rött representeras Merkle-trädet för transaktioner med deras vittnesdata (signaturer). Hashvärdena för dessa transaktioner är deras SegWit-identifierare (wtxid eller witness transaction identifier). Merkle-roten för detta träd skrivs in i belöningstransaktionen i blocket (tx0), vilket gör det möjligt att koppla signaturerna till resten av blocket.
I grönt representeras Merkle-trädet för transaktioner utan deras vittnesdata. Hashvärdena för dessa transaktioner är deras klassiska identifierare (txid). Merkle-roten för detta träd skrivs in i blockhuvudet. Eftersom allt är kopplat samman, är det omöjligt att ändra en transaktion eller dess signatur utan att ändra blockhuvudet, och därmed utan att påverka hela proof-of-work-kedjan.
Slutsats
Ett block är alltså en organiserad samling av transaktioner, som innehåller en tidsstämpel (datum och tid för validering) samt ett bevis (proof-of-work, proof-of-stake eller proof-of-authority) som inkluderas av validatören. Blocken är länkade till varandra, med start från ett första referensblock, vilket skapar en kedja, dvs. blockkedjan.
Tack vare sin struktur är blockkedjan en tillförlitlig och oföränderlig reskontra: när en transaktion har inkluderats i ett block och ett visst antal ytterligare block har lagts till, kan den betraktas som irreversibel.
Vi hoppas att denna förklarande artikel om block har varit användbar och att du nu har en bättre förståelse av ämnet.