Idag, 24 november 2019, markeras det officiella släppet av Bitcoin Core 0.19.0, den 19: e stora utgåvan av Bitcoins ursprungliga programvaruklient som lanserades av Satoshi Nakamoto för nästan 11 år sedan och fortfarande den dominerande Bitcoin-implementeringen i nätverket idag. (Men på grund av ett problem som kom fram i ett sent skede av Bitcoin Core 0.19.0-utgivningen är versionen som släpptes för nedladdning faktiskt 0.19.0.1.) Övervakad av Bitcoin Core ledande underhållare Wladimir van der Laan, den här senaste stora utgåvan utvecklades av över hundra bidragsgivare under en period av cirka sex månader.
Resultatet av 550 sammanslagna dragförfrågningar, Bitcoin Core 0.19.0 innehåller en rad prestandaförbättringar, moderniseringar och buggfixar samt andra ändringar.
Här är en översikt över några av dessa förändringar.
Bech32 adresserar som standard i GUI
Adressformatet “bech32” (BIP 173) hade redan införts i Bitcoin Core 0.16.0, släppt i början av 2018, men är nu för första gången inställt som standardalternativ i Bitcoin Core-plånbokens grafiska användargränssnitt (GUI).
Bech32-adresser är adresserna som börjar med “bc1” (i motsats till adresser som börjar med en 1 eller en 3.) Dessa adresser är också lite längre, men använder färre olika tecken än det aktuella adressformatet, eftersom det inte längre finns någon skillnad mellan gemener och versaler. (Detta minskar potentialen för mänskliga misstag, till exempel när en adress läses upp högt.) Bech32-adresser är också utformade för att begränsa misstag orsakade av skrivfel..
Dessutom erbjuder bech32 fördelar inom SegWit. Vissa plånböcker som erbjuder SegWit – inklusive Bitcoin Core-plånboken som standard hittills – gör det genom att “slå in” den i P2SH-utgångar (med adresser som börjar med “3”). För att spendera bitcoin från en sådan adress måste användarna avslöja en kod – “lösa in skript” – för att visa att bitcoin verkligen var låst i en SegWit-utdata. Med de nya bech32-adresserna kan detta steg hoppas över, vilket innebär att utgifter från en SegWit-utdata kommer att kräva att lite mindre data överförs över Bitcoin-nätverket och ingår i blockchain. Detta gör transaktioner från en bech32-utgång ännu billigare än SegWit-transaktioner från en P2SH-utdata.
Eftersom inte alla bitcoinplånböcker stöder sändning till bech32-adresser än, kommer Bitcoin Core 0.19.0-användare fortfarande att kunna generera en PS2H-mottagningsadress istället genom en växling i GUI.
Två block-endast utgående anslutningar extra som standard
Bitcoin-noder ansluter till flera andra Bitcoin-noder och bildar tillsammans peer-to-peer-nätverket. Över detta nätverk delar noderna block, transaktioner och ytterligare transaktionsdata.
Men peer-to-peer-nätverket kan utsättas för attacker, till exempel “partitioneringsattacker”. Om en angripare kontrollerar ett tillräckligt stort antal Bitcoin-noder, kan det potentiellt “stänga av” vissa delar av Bitcoin-nätverket (eller till och med specifika noder) genom att fånga upp all trafik till det. Den partitionerade delen av nätverket kan då till exempel luras till att acceptera en minoritetskedja – inte den längsta kedjan – som giltig, vilket i sin tur kan öppna dörren för dubbla utgiftsattacker.
En partitioneringsattack motverkas om en nod i den partitionerade delen av nätverket till och med bara har en anslutning till en ärlig nod i huvudnätverket. Det skulle då ta emot och vidarebefordra alla transaktioner och block och avvisa minoritetskedjan till förmån för majoritetskedjan.
Ett sätt att inse detta och att göra partitioneringsattacker svårare att dra av sig är att noder skapar fler anslutningar till varandra. Fler anslutningar kommer dock med mer krav på minne och bandbredd; det finns en kompromiss.
Bitcoin Core 0.19.0 ökar standard för utgående anslutningar med två, men – smart – dessa två extra anslutningar används bara för att vidarebefordra block – de vidarebefordrar inte transaktioner eller ytterligare transaktionsdata. Detta ökar kraven på extra bandbredd minimalt, samtidigt som partitioneringsattacker fortfarande blir svårare att lyckas.
Bloom-filter föråldrade
Bitcoin Core är en fullständig nodimplementering, vilket innebär att den laddar ner och verifierar alla Bitcoin-block. Även om detta är optimalt säkert, gör det det inte särskilt bra för resursdåliga datorenheter, som mobiltelefoner. Mobila plånböcker (liksom vissa skrivbordsplånböcker) är därför vanligtvis “lätta klienter”: dessa laddar bara ner transaktioner och (delar av) block som specifikt berör dem.
Ett sätt att göra detta är med Bloom Filters, som används av ett par plånböcker idag. Kort sagt, Bloom Filters är ett kryptografiskt trick som används av lätta klienter för att begära relevant data från mer eller mindre slumpmässiga fullständiga noder i nätverket. Tyvärr har det dock blivit tydligt genom åren att Bloom Filters är ganska integritetsvänliga: De avslöjar i princip alla sina adresser till hela noden. Dessutom stöder Bloom Filter-förfrågningar en kostnad i CPU och diskutrymme för hela noder – utan direkt fördel för hela noden.
Av särskilt sist anledning stöder Bitcoin Core 0.19.0 inte längre Bloom Filter-förfrågningar som standard. Användare kan fortfarande byta standard för att stödja Bloom-filter om de så önskar.
Det är också värt att notera att Bitcoin-nätverket som helhet nästan säkert kommer att fortsätta att stödja Bloom-filter i många år framöver, även om ingen byter standardvärden, helt enkelt för att äldre Bitcoin Core-noder vanligtvis fortsätter att användas i flera år efter att nya versioner släpptes.
Mer stöd för kompakt blockfiltrering på klientsidan
Ett alternativ till Bloom Filters är en nyare lösning som kallas “kompakt blockfiltrering på klientsidan” (BIP 158). Kompakt blockfiltrering på klientsidan vänder i huvudsak trick på Bloom Filter. Istället för att lätta plånböcker skapar filter för att skicka till hela noder skapar fulla noder filter för varje block. Lätta klienter kan sedan använda dessa filter för att ta reda på om transaktioner som är relevanta för dem kan ha hänt i ett block. I så fall kommer den lätta plånboken att hämta hela blocket och välja relevant transaktionsdata ur det.
Bitcoin Core 0.19.0 fortsätter att gå mot kompakt blockfiltrering på klientsidan. Bitcoin Core-noder kunde redan skapa filtren lokalt, men Bitcoin Core 0.19.0-användare kan nu också göra dem tillgängliga via ett fjärrproceduranrop (RPC) för applikationer som körs ovanpå noden (som en plånbok).
Filtren är dock ännu inte tillgängliga via peer-to-peer-nätverket. Detta innebär att en Bitcoin Core 0.19.0-nod inte automatiskt skickar filter till andra Bitcoin-användares plånböcker. Den här funktionen kan läggas till i en framtida Bitcoin Core-utgåva – eller Bitcoin Core 0.19.0-användare kan välja att erbjuda funktionen genom en anpassad applikation som körs ovanpå sin Bitcoin Core-nod..
Support för betalningsprotokoll inaktiverat från GUI
Betalningsprotokollet (BIP 70) designades för flera år sedan för att förbättra Bitcoins betalningsupplevelse. Utöver den vanliga betalningen som sänds till Bitcoin-nätverket skulle en användare och en säljare kommunicera ytterligare information om en betalning, till exempel en läsbar destinationsadress (namnet på säljaren) och en återbetalningsadress om något skulle gå fel med köpet.
Medan Bitcoin Core integrerade betalningsprotokollet i GUI, antogs standarden aldrig allmänt. Istället använder de flesta plånböcker fortfarande det mer grundläggande URI-schemat (BIP 21) för att ta emot betalningar: Den klickbara länken eller det skannbara QR-kodformatet som till exempel kommunicerar betalningsadressen och beloppet. (Det enda anmärkningsvärda undantaget idag är betalningsprocessorn BitPay, som inte stöder URI-schemat men använder en modifierad version av BIP 70.)
Kanske viktigare än bristen på antagande har betalningsprotokollet BIP 70 lidit ett antal säkerhets- och sekretesssårbarheter över åren. Vissa plånböcker har därför aktivt avvisade för att genomföra protokollet. Bitcoin Core hade också planerat att avskaffa BIP 70 under en tid, eftersom underhåll av det inte ansågs värt ansträngningen – men BitPays antagande av det stoppade denna process.
I Bitcoin Core 0.19.0 har BIP 70 trots allt tagits bort från GUI. Bitcoin Core 0.19.0-användare måste kompilera sin nod med en speciell konfiguration för att fortfarande använda funktionen.
Övrig…
Förutom ändringarna som nämns ovan kommer Bitcoin Core 0.19.0 med en lång lista med mindre förbättringar och moderniseringar.
Det är nu möjligt att starta en beskuren nod omedelbart från installationen, till exempel som låter användare med lite diskutrymme enkelt starta en ny Bitcoin-nod. Bitcoin Core 0.19.0 innehåller också nya funktioner för PSBT-protokollet (Partially Signed Bitcoin Transactions), vilket är användbart för multisignatur- och CoinJoin-transaktioner. På samma sätt finns det flera förbättringar inom domänen för plånboksbeskrivare, vilket är särskilt användbart för programmerare som arbetar med Bitcoin-applikationer. Bitcoin Core 0.19.0-noder accepterar och vidarebefordrar transaktioner som använder en framtida SegWit-version för att säkerställa att kommande uppgraderingar kommer att gå smidigt.
För en mer omfattande lista över uppgraderingar, se även Utgivningsanmärkningar för Bitcoin Core 0.19.0.1.
Tack till Sjors Provoost för feedback om den här artikeln.