Vad är en dubbel utgift?
Dubbla utgifter är ett potentiellt problem i ett digitalt kontantsystem, där samma tillgång skickas till två mottagare samtidigt. Utan några ordentliga motåtgärder blir ett protokoll som inte löser problemet i grunden värdelöst – användarna har inget sätt att verifiera att de tillgångar de har fått inte redan har spenderats någon annanstans.
När det gäller digitala kontanter är det av största vikt att se till att specifika enheter inte kan dupliceras. Hela systemet skulle gå under om Alice kunde ta emot 10 enheter, kopiera och klistra in dem 10 gånger och därmed inneha 100 enheter. På liknande sätt kan ett sådant system inte fungera om hon kan skicka samma 10 enheter till både Bob och Carol samtidigt. Så för att digitala pengar ska fungera måste det finnas fungerande mekanismer för att förhindra detta beteende.
Hur kan dubbla utgifter förhindras?
Det centraliserade tillvägagångssättet
Det centraliserade sättet är betydligt enklare att implementera än decentraliserade alternativ. Detta innebär vanligtvis att en övervakare hanterar systemet och kontrollerar utfärdandet och distributionen av alla enheter. Ett bra exempel på en centraliserad lösning på problemet med dubbla utgifter är David Chaums eCash.
För att ge användarna en digital tillgång som efterliknar kontanter (som klarar av utbyte av tillgångar anonymt och via peer-to-peer) kan en bank använda blinda signaturer – vilka beskrivs av kryptografen David Chaum i hans artikel Blind Signatures for Untraceable Payments från 1982.
Om en användare (låt oss kalla honom Dan) vill få 100 dollar i digitala kontanter, är han i ett sådant sammanhang skyldig att informera banken först. Förutsatt att han har den balansen på sitt konto kommer han sedan att generera ett slumpmässigt nummer (eller många sådana för mindre valörer). Låt oss anta att han producerar fem nummer och var och ett ska tilldelas ett värde på 20 dollar. För att förhindra att banken spårar specifika enheter döljer Dan slumptalen genom att lägga till en blind faktor till var och en av dem.
Han överlämnar sedan dessa uppgifter till banken, som debiterar 100 dollar från hans konto och undertecknar meddelanden som intygar att var och en av de fem delarna med information kan lösas in för 20 dollar. Dan kan nu spendera tillgångarna som utfärdats av banken. Han går till Eriks restaurang och köper en måltid som kostar honom 40 dollar.
Dan kan ta bort den blinda faktorn för att exponera slumptalet som är associerat med varje digital "kontanträkning", vilken fungerar som en unik identifierare för varje enhet (ungefär som ett serienummer). Han avslöjar två av dessa för Erik, som nu måste lösa in dem omedelbart med banken för att hindra Dan från att spendera dem på ett annat ställe. Banken kommer att kontrollera att signaturerna är giltiga och om allt verkar stämma kommer den att kreditera Eriks konto med 40 dollar.
De räkningar som har använts är nu i huvudsak brända och fler måste utfärdas om Erik vill spendera sin nya balans på samma sätt.
Upplägget med David Chaums eCash kan vara användbart för privata överföringar. Men det är inte flexibelt, eftersom banken är en central felpunkt. En utfärdad räkning är inte värd något i sig, eftersom dess värde enbart kommer från bankens vilja att byta ut den mot dollar. Kunderna är beroende av banken och måste förlita sig på dess goda vilja för att pengarna ska kunna användas. Det är just detta problem som kryptovalutor försöker åtgärda.
Det decentraliserade tillvägagångssättet
Att se till att tillgångar inte kan spenderas dubbelt i ett ekosystem utan övervakare är svårare. Deltagare med samma makt måste samordna kring en uppsättning regler som förhindrar bedrägerier och uppmuntrar alla användare att agera ärligt.
Den största innovationen som presenterades i Bitcoins vitbok var en lösning på problemet med dubbla utgifter. Även om det inte refereras till som sådant, föreslog Satoshi datastrukturen som nu är allmänt känd som en blockkedja.
En blockkedja är egentligen bara en databas med vissa unika egenskaper. Deltagarna i nätverket (kallas noder) kör en specialiserad programvara, vilken gör det möjligt för dem att synkronisera sin kopia av databasen med de andra. Resultatet blir att hela nätverket kan granska historien om transaktionerna hela vägen tillbaka till genesis-blocket. Genom att göra blockkedjan offentligt synlig är det enkelt att upptäcka och förhindra skadliga handlingar, till exempel transaktioner som försöker dubbla utgifterna.
När en användare sänder en transaktion läggs den inte omedelbart till i blockkedjan – den måste först inkluderas i ett block genom utvinning. Därför bör mottagaren endast betrakta transaktionen som giltig efter att dess block har lagts till i kedjan. Annars riskerar denne att förlora tillgångarna, eftersom avsändaren kan spendera samma coin någon annanstans.
När transaktionen har bekräftats kan coin inte spenderas dubbelt, eftersom ägandet tilldelas en ny användare – och hela nätverket kan verifiera detta. Det är av denna anledning som många rekommenderar att du väntar på flera bekräftelser innan du godkänner en betalning som giltig. Varje efterföljande block ökar drastiskt mängden ansträngning som krävs för att ändra eller skriva om kedjan (vilket kan inträffa under en 51 %-attack).
Låt oss gå tillbaka till restaurangscenariot. Dan återvänder till restaurangen och ser nu ett klistermärke med texten "Vi accepterar Bitcoin som betalning" på fönstret. Han gillade maten han åt förra gången, så han beställer den igen. Den kostar honom 0,005 BTC.
Erik ger honom en offentlig adress som han måste skicka tillgångarna till. Dan skickar transaktionen, som i huvudsak är ett undertecknat meddelande om att 0,005 BTC som var i Dans ägo nu är i Eriks. Utan att gå in på för många detaljer kan alla som presenteras med Dans undertecknade transaktion verifiera att han verkligen hade dessa coin och därför hade befogenhet att skicka dem.
Som nämnts tidigare är transaktionen dock endast giltig om den ingår i ett block som bekräftas. Att acceptera obekräftade transaktioner är ungefär som att acceptera 40 dollar i eCash från föregående exempel, utan att omedelbart lösa in dem med banken – detta gör att avsändaren kan spendera dem någon annanstans. Så det rekommenderas att Erik väntar på minst 6 blockbekräftelser (ungefär en timme) innan han accepterar Dans betalning.
Dubbla utgifter inom Bitcoin
Bitcoin är noggrant utformat för att förhindra attacker med dubbla utgifter, åtminstone när protokollet används som förväntat. Med detta menas att om man väntar på att transaktionen ska bekräftas i ett block, finns det inget enkelt sätt för avsändaren att ta tillbaka den. För att göra detta skulle denne behöva "vända" blockkedjan, vilket kräver en orealistisk mängd hashkraft.
Det finns dock en del attacker med dubbla utgifter som riktar in sig på dem som accepterar obekräftade transaktioner. För ett litet köp kanske en handlare inte vill vänta på att transaktionen ska inkluderas i ett block. En populär snabbmatsrestaurang har förmodligen inte råd att vänta på att nätverket bearbetar varje köp. Så om ett företag accepterar "omedelbara" betalningar riskerar de dubbla utgifter. Någon kan beställa en hamburgare, betala för den och sedan omedelbart skicka samma tillgångar till sin egen adress. Med en högre avgift kommer denna nya transaktion sannolikt att bekräftas först och kommer därför att ogiltigförklara den tidigare.
Det finns tre populära metoder för att utföra dubbla utgifter:
51 %-attacker: när en enda enhet eller organisation lyckas kontrollera mer än 50 % av hashhastigheten, vilket gör att den kan utesluta eller ändra ordningen på transaktioner. En sådan attack är mycket osannolik på Bitcoin, men har inträffat i andra nätverk.
Race-attacker: två motstridiga transaktioner sänds i följd med samma tillgångar – men bara en transaktion bekräftas. Angriparens mål är att ogiltigförklara betalningen genom att endast validera transaktionen som gynnar hen (till exempel skicka samma tillgångar till en adress som hen kontrollerar). Race-attacker kräver att mottagaren accepterar en obekräftad transaktion som betalning.
Finney-attacker: en angripare utvinner en transaktion i ett block i förväg utan att omedelbart skicka den till nätverket. Istället spenderar hen samma coin i en annan transaktion och skickar därefter sitt tidigare utvunna block, vilket kan ogiltigförklara betalningen. Finney-attacker kräver att ett specifikt händelseförlopp inträffar och är också beroende av mottagarens godkännande av obekräftade transaktioner.
Som vi kan se kommer en handlare som väntar på blockbekräftelserna att avsevärt minska riskerna för att bli offer för dubbla utgifter.
Sammanfattningsvis
En dubbel utgift gör det möjligt för en användare att använda ett elektroniskt kontantsystem för ekonomisk vinning och använda samma tillgångar mer än en gång. Traditionellt sett har bristen på bra lösningar på problemet stått i vägen för framsteg inom området.
Som tur är föreslog dock användningen av blinda signaturer en intressant lösning för centraliserade finansiella system. Senare introducerade skapandet av mekanismen arbetsbevis och blockkedjeteknik Bitcoin, som en kraftfull form av decentraliserade pengar – vilket i sin tur har inspirerat tusentals andra kryptovalutaprojekt.