Först en kort repetition av den blockkedjeteknik som ligger till grund för Bitcoin (se också Hur fungerar Bitcoin?). Varje block, som innehåller en samling verifierade transaktioner, pekar tillbaka på (ett fingeravtryck av) det föregående blocket, så att en kedja bildas. Det är oerhört svårt att skriva om historien eftersom modifikation av ett block ändrar dess fingeravtryck och därmed skulle kräva att även alla block därefter behöver ändras. För att få nätverket att acceptera en sådan ändring måste man i princip ha 51% av den totala beräkningskraften i systemet.
Den längsta, giltiga, kedjan (räknat på mängden beräkningskraft som ligger bakom) är den som nätverket kommer att acceptera som den rätta. Ibland uppstår dock situationer när nätverket inte är överens om vilken som är den rätta kedjan. Detta kallas för en fork, eller förgrening, och innebär alltså att vi har två konkurrerande kedjor.
Tillfällig förgrening
Tillfälliga förgreningar sker ganska ofta och det beror på att 2 (eller fler) miners lyckas skapa ett nytt block ungefär samtidigt. Beroende på hur informationen om dessa block sprids i nätverket kan nätverket delas i två delar, med olika åsikter om vilket som är det senaste blocket.
En sådan här förgrening löses nästan alltid automatiskt, när nästa block dyker upp. Då kommer den ena förgreningen att ha en längre kedja och nätverket blir överens om att denna kedja är den rätta. Den här typen av förgrening sker i stort sett varje dag och då och då händer det också att även nästa block skapas samtidigt, vilket ger en förgrening som är 2 block lång. Bitcoins designval att ha ett block var tionde minut handlar delvis om hur ofta man kan acceptera att sådant här händer. De block som skapats i den ”felaktiga” kedjan kallas för ”orphaned” och är ju bortkastad energi så man vill inte att det ska hända för ofta.
Buggar
En tillfällig förgrening kan också ske p.g.a av buggar i mjukvaran som används. Ett exempel på detta är från 2013 när en ny version av det som nu kallas Bitcoin Core innehöll förändringar i hur datan sparades på disk. Man hade bytt databas från BerkelyDB till den mer effektiva LevelDB utan att inse att BerkeleyDB hade en begräsning, som inte hade någon motsvarighet i den nya databasen. Detta fick till följd att den nya versionen av Bitcoin accepterade vissa block som den gamla versionen ansåg ogiltiga och därmed uppstod en förgrening mellan de som körde senaste versionen och de som körde en tidigare. Denna förgrening existerade i ca 6 timmar och man kom efter en del diskussion fram till att försöka få alla att gå tillbaka till den tidigare versionens logik, eftersom man annars skulle tvinga alla gamla noder att uppgradera.
Notera att detta var en tillfällig förgrening bara eftersom man manuellt kom överens om en lösning. Hade man inte gjort det hade denna förgrening varit permanent och man hade haft två olika valutor, ”gamla bitcoin” och ”nya bitcoin”. Vi har tidigare skrivit om denna bugg här: Förgrenad blockkedja – vad var det som hände?
Permanenta förgreningar
Permanenta förgreningar kan ske om det finns olika åsikter om vilka konsensusreglerna faktiskt är. Om man inte hade kommit överens om vilket som faktiskt var det ”riktiga” bitcoin i exemplet ovan så hade det funnits två olika.
Numera finns flera exempel där man medvetet förgrenat sig från Bitcoin för att skapa nya valutor. Det handlar oftast om att man vill göra uppgraderingar/förändringar som alla inte är överens om. Den mest kända, och högst värderade, förgreningen är Bitcoin Cash som 2017 uppstod under stora kontroverser och som kulmen på en hätsk debatt om hur Bitcoinprotokollet skulle utvecklas vidare. Förespråkarna för Bitcoin Cash ville omedelbart höja blockstorleken medan den andra sidan först ville fokusera på teknologi som SegWit för att hantera kapacitetsproblemen. I det här fallet så var målet för Bitcoin Cash att faktiskt bli ”det riktiga” Bitcoin och det var en anledning till att det blev så mycket bråk mellan lägren.
Andra förgreningar har medvetet profilerat sig under ett nytt namn och därmed inte väckt samma uppmärksamhet. Exempel på detta är Bitcoin Gold och Bitcoin Private. Intressant att förstå är att om du äger Bitcoin vid tillfället för en förgrening så äger du också genast lika mycket av den nya valutan. Hade du några Bitcoin under 2017 så är du nu alltså ägare till lika många Bitcoin Cash, Bitcoin Gold och Bitcoin Private. Detta under förutsättning att du själv kontrollerar dina privata nycklar, eftersom du annars är i händerna på t.ex. en börs och då beroende av om de har stöd för den nya valutan eller ej.
Hårda och mjuka förgreningar
För planerade uppgraderingar eller förändringar av konsensusprotokollet så pratar man om hard forks och soft forks. Vid en hård förgrening så måste alla Bitcoinnoder uppgradera till de nya reglerna för att inte hamna utanför nätverket. Många vill så långt som möjligt undvika hårda förgreningar p.g.a. riskerna men det medför, men det råder olika meningar här.
En hård förgrening innebär att reglerna förändras så att de blir ”mindre strikta”. Det kan alltså komma nya block som är konstruerade så att gammal mjukvara inte tycker att de uppfyller kraven för ett giltigt block. Ett exempel på detta är om man skulle öka blockstorleken från 1MB till 2MB.
En mjuk förgrening däremot innebär en förändring där reglerna görs striktare och då kommer således gammal mjukvara att acceptera block från den nyare mjukvaran. Ett exempel på detta skulle vara om man minskade blockstorleken till ½ MB. Noder med den gamla mjukvaran kommer att acceptera alla nya block eftersom de fortfarande följer reglerna men om block skulle produceras enligt de gamla reglerna, och vara större än ½ MB, så skulle inte den nya mjukvaran acceptera dem.
Detta innebär alltså att alla noder inte nödvändigtvis behöver uppgradera sin mjukvara utan kan köra vidare på äldre versioner. Är du däremot en miner så behöver du se till att du följer de nya reglerna, för att inte producera block som inte längre accepteras. Så länge mer än 50% av beräkningskraften använder de nya reglerna så uppstår aldrig någon (permanent) förgrening eftersom den längsta kedjan kommer att vara den som använder de nya reglerna. Det är också intressant att notera att om de gamla reglerna faktiskt får övertag och man har en ihållande förgrening så kommer ändå denna sida att raderas ut om de nya reglerna senare får övertaget.
För och emot
Mjuka förgreningar gör det alltså enklare att genomföra uppgraderingar eftersom inte alla noder behöver uppgradera samtidigt. Det har också visat sig att så gott som alla förändringar faktiskt går att utforma som mjuka förgreningar även om det från början inte verkat så.
Det finns dock även en del kritik mot denna lösning. Dels hävdar många att man skapar onödig teknisk skuld, alltså att programkoden blir mer komplicerad och svårare att underhålla. Det är ju också så att även om gamla noder inte måste uppgradera så hamnar de i ett läge där de faktiskt inte längre validerar alla konsensusregler. I fallet med en sänkning av blockstorleken så kommer förvisso gamla noder att acceptera alla block men de validerar inte blockstorleken enligt de nya reglerna.
Ett exempel på en förändring som först föreslogs som en hård förgrening men sedan lyckades konstrueras som en mjuk förgrening är SegWit.
Kommentarer