För tio år sedan idag publicerade pseudonymen Satoshi Nakamoto beskrivningen av vad som skulle bli världens första decentraliserade digitala valuta. "Bitcoin - A Peer-to-peer eletronic cash system" är relativt lättläst för att vara en teknisk publikation men för den som ännu inte tagit sig tid att gå igenom den ska vi nu göra det tillsammans. Nedan följer en sammanfattning av publikationen, på svenska.
1. Introduktion
Handel på internet har kommit att bli helt beroende av tredjeparter och detta innebär att alla transaktioner i praktiken är reversibla. Med detta följer därför att ett mått av tillit krävs vid varje transaktion vilket leder till kostnader samt att handlare behöver be kunder om mer information än annars skulle vara nödvändigt. I den fysiska världen kan man komma runt detta m.h.a. kontanter och vi behöver därför en motsvarighet i den digitala världen. Den här publikationen innehåller ett förslag på lösning på double spending-problemet som är säkert så länge ärliga noder tillsammans kontrollerar mer än 50% av CPU-kraften i nätverket.
2. Transaktioner
Ett elektroniskt mynt definieras som en kedja av digitala signaturer. En ägare överför ett mynt genom att signera en hash av den tidigare transaktionen tillsammans med den nya ägarens publika nyckel. Problemet här är att man inte kan bevisa att myntet inte spenderats två gånger, något som normalt sett löses genom en central part som agerar bank/utgivare. Vi behöver alltså ett sätt för mottagaren att bekräfta att det inte finns någon tidigare transaktion med samma mynt och för att det ska vara möjligt behöver alla transaktioner sändas ut till alla deltagare och vi behöver ett sätt för deltagarna att komma överens om en enda sann historia.
3. Tidsstämplingsserver
Lösningen börjar med en tidsstämplingsserver. En sådan server fungerar genom att skapa en hash av en mängd information (nedan kallad ett block) och sedan publicera denna hash, t.ex. i en dagstidning eller dylikt. Detta garanterar i efterhand att information i fråga måste ha existerat vid den givna tidpunkten. Varje tidsstämpel innehåller sedan en hash av den föregående och bildar därmed en kedja.
4. Proof-of-work
För att implementera en distribuerad tidsstämplingsserver behövs ett proof-of-work-system liknande Adam Backs Hashcash istället för en dagstidning. Vi implementerar proof-of-work genom att öka en godtycklig siffra i blocket tills ett resultat hittas där blockets hash börjar med ett visst antal nollor. När en viss mängd CPU-kraft använts för att uppfylla villkoret finns sedan inget sätt att ändra på innehållet i blocket utan att göra om hela arbetet. Efter att fler block byggts på krävs att alla dessa block ändras.
Proof-of-work löser också hur majoritetsbeslut ska fattas. Om majoriteten baserades på IP-adresser så skulle den som lyckas få många IP-adresser ha en stor fördel men nu blir istället principen "1 CPU - 1 röst". Majoritetsbeslutet representeras av den längsta kedjan, d.v.s. den kedja som har mest CPU-kraft investerad. För att kompensera för snabbare hårdvara så bestäms svårighetsgraden för arbetet genom ett glidande medelvärde med målet att få ett visst antal nya block per timme. Om blocken skapas för snabbt så ökas svårighetsgraden.
5. Nätverket
Stegen för att köra nätverket är följande:
- Nya transaktioner skickas ut till alla noder i nätverket
- Varje nod samlar nya transaktioner i ett block
- Varje nod arbetar för att hitta ett giltigt proof-of-work
- När en nod hittar ett proof-of-work så skickas det nya blocket ut till alla noder
- Noderna accepterar blocket om transaktionerna är giltiga och inte redan spenderats
- Noderna visar sin acceptans för blocket genom att börja arbeta på ett nytt block, som innehåller en hash av det föregående blocket
Noderna ser alltid den längsta kedjan som den korrekta. Om två noder lyckas skapa ett block samtidigt kan två olika grenar uppstå, men situationen löser sig när nästa block hittas och det igen är uppenbart vilken kedja som är längst. Alla transaktioner måste inte nödvändigtvis nå alla noder eftersom det räcker med att många sett en transaktion för att den till slut ska komma med i ett block. Inte heller gör det något om en nod skulle missa ett block eftersom den själv inser detta när nästa block kommer och då kan be om det föregående.
6. Incitament
Den första transaktionen i varje block är en speciell transaktion som startar ett nytt mynt, som tillfaller skaparen av blocket. Detta ger incitament till deltagare att stödja nätverket och är samtidigt ett sätt att distribuera nya mynt som sätts i cirkulation, då ingen central auktoritet finns som kan sköta denna distribution. Vi kan dra en parallell mellan denna stadiga tillkomst av nya mynt och hur guld bryts i den fysiska världen. I vårt fall är CPU-tid och elektricitet de resurser som går åt. Som ett ytterligare incitament kan en frivillig avgift bifogas varje transaktion. När en förutbestämd mängd mynt skapats kan nätverket helt gå över till transaktionsavgifter och vara fritt från inflation.
7. Få tillbaka diskutrymme
När ett mynts senaste transaktion byggts på med tillräckligt många block kan tidigare transaktioner som redan spenderats slängas bort för att spara diskutrymme. För att kunna göra detta utan att bryta blockets hash så hashas transaktioner i ett s.k. Merkle Tree och bara trädets rot inkluderas i blockets hash. Gamla block kan då minskas i storlek genom att kapa grenar av trädet.
8. Simple Payment Verification
Det är möjligt att verifiera betalningar utan att köra en komplett, full nod på nätverket. En användare behöver bara behålla en kopia av blockets header för varje block i den längsta kedjan och be om den Merkle-gren som kopplar ihop en viss transaktion med sitt block. Användaren kan inte själv kontrollera transaktionen men kan se dess plats i kejdan och att nätverket byggt på med block efter detta.
Verifikationen är pålitlig så länge ärliga noder kontrollerar nätverket men mer sårbar om nätverket attackeras.
9. Kombinera och dela upp värden
Även om det skulle vara möjligt att handera alla mynt individuellt så skulle det bli klumpigt att behöva göra en separat transaktion för varje cent i en överföring. För att möjliggöra att värde delas upp eller slås samman så kan en transaktion innehålla flera "inputs" och "outputs". Normalt sett kommer det antingen att finnas en enda stor input från en större transaktion eller flera små som ska kombineras samt två outputs, den ena till mottagaren och den andra tillbaka till sändaren som växel.
10. Integritet
Det traditionella banksystemet uppnår en viss nivå av integritet genom att begränsa tillgång av information till de den berör samt den tredje parten. Behovet av att publikt publicera alla transaktioner utesluter den möjligheten men integritet kan ändå uppnås genom att de publika nycklarna hålls anonyma. Vem som helst kan se att någon skickar en viss summa till någon annan men kan inte koppla ihop transaktionen med någon person.
Som ett extra skydd bör en ny adress skapas för varje transaktion för att undvika att olika transaktioner kan kopplas till samma person. En viss sammankoppling kommer dock fortfarande att vara oundviklig när flera inputs slås samman i en transaktion.
11. Beräkningar
I det här avsnittet gås vissa beräkningar igenom för att räkna ut att risken att en angripare kan skapa en alternativ kedja som blir längre än originalkedjan. Detta kan användas för att avgöra hur många block man bör vänta för att försäkra sig om att ens transaktion inte kan hävas. För detaljerna rekommenderas att man läser originalpublikationen.
12. Slutsats
Ett förslag har presenterats för elektroniska transaktioner som inte är beroende av tillit. Vi började med ett ramverk för mynt baserade på digitala signaturer som är ett säkert sätt att kontrollera ägande men inte förhindrar dubbelspendering. För att lösa detta föreslås ett peer-to-peer-nätverk som använder proof-of-work för att skapa en publik historik av transaktioner som i praktiken är omöjlig för en angripare att ändra så länge ärliga noder kontrollerar en majoritet av CPU-kraften. Deltagare kan gå med i eller lämna nätverket när de vill och röstar med sin CPU-kraft om vilken historik som är den rätta.
Kommentarer