Vad är RingCT?

RingCT döljer det överförda beloppet i varje Monero-transaktion. Det är det tredje sekretesslagret i protokollet: ring signatures döljer avsändaren, stealth addresses döljer mottagaren och RingCT döljer beloppet. Utan RingCT skulle beloppet vara synligt på kedjan för alla, precis som på Bitcoin.

Tekniken publicerades ursprungligen av Shen Noether vid Monero Research Lab i rapporten "Ring Confidential Transactions" från 2015. Implementationen bygger på kryptografiska åtaganden som gör det möjligt för nätverket att verifiera att en transaktion är korrekt, det vill säga att ingående och utgående summor balanserar, utan att de faktiska beloppen avslöjas för någon part.

Det matematiska fundamentet är att en observatör på kedjan ser krypterade åtaganden i stället för klartextbelopp. Inga lösenord eller nycklar behöver delas med nätverket för att verifieringen ska fungera. Noden bekräftar transaktionens giltighet uteslutande genom algebraiska egenskaper hos åtagandena.

Mer om hur alla fyra sekretesslager hänger ihop finns i den samlade genomgången av Moneros integritet.

Pedersen commitments

RingCT bygger på Pedersen commitments, en typ av kryptografiskt åtagande som formaliserades av Torben Pedersen 1991. Ett åtagande C beräknas som C = rG + vH, där v är beloppet, r är en slumpmässig blindingfaktor som väljs av avsändaren, och G samt H är fasta punkter på den elliptiska kurvan som Monero använder.

Åtagandet har två centrala egenskaper. Det är binding: givet ett publicerat C går det inte att hitta ett annat par (r', v') som ger samma åtagande, vilket gör det omöjligt att i efterhand ändra beloppet utan att bryta kryptografin. Det är också hiding: åtagandet C avslöjar ingenting om v för en utomstående som inte känner r.

Den avgörande egenskapen för nätverket är att Pedersen commitments är homomorphiska under addition. Om C1 = r1G + v1H och C2 = r2G + v2H, då gäller C1 + C2 = (r1 + r2)G + (v1 + v2)H. Det innebär att noden kan summera alla inputs-commitments och jämföra med summan av outputs-commitments plus transaktionsavgiften, och verifiera att de är lika, utan att känna till ett enda underliggande belopp.

Blindingfaktorn r skickas krypterat till mottagaren via ECDH-nyckelutbyte, inbäddat i transaktionsdatan. Mottagarens plånbok dekrypterar r och kan därmed beräkna v, det faktiska beloppet de tagit emot. Resten av nätverket ser bara det krypterade åtagandet.

Aktivering januari 2017

RingCT aktiverades frivilligt i Monero-nätverket i januari 2017 via en softfork som introducerade protokollversion 5. Under en övergångsperiod kunde användare välja om de ville använda det nya formatet eller skicka transaktioner med synliga belopp enligt det gamla sättet.

Från september 2017 blev RingCT obligatoriskt för alla nya transaktioner. Transaktioner utan dolda belopp accepterades inte längre av nätverket. Övergången var praktiskt taget transparent för slutanvändarna eftersom plånböckerna hanterade uppgraderingen automatiskt.

Före RingCT var beloppen synliga på kedjan för vem som helst, precis som på Bitcoin och de flesta andra blockkedjor. En observatör med tillgång till kedjedata kunde se exakt hur mycket XMR som skickades i varje transaktion, kartlägga saldoutveckling och identifiera mönster i betalningsflöden.

Alla äldre XMR som gavs ut under perioden 2014 till 2017 konverterades automatiskt till RingCT-format vid sin första spendering efter aktiveringen. Det gick inte att spendera gamla outputs utan att samtidigt övergå till det nya formatet, vilket innebar att det gamla transparent-läget fasades ut naturligt allteftersom coins cirkulerade.

Bulletproofs och transaktionsstorlek

RingCT kräver range proofs för att garantera att beloppen är positiva heltal och inte orsakar overflow i protokollet. Utan range proofs skulle en avsändare kunna konstruera ett negativt belopp och därigenom skapa XMR ur tomma intet, vilket vore en katastrofal bugg.

De ursprungliga range proofs som ingick i RingCT 2017 var effektiva kryptografiskt men dyra storleksmässigt. En genomsnittlig transaktion tog omkring 13 kB enbart för range proofs, vilket lade en betydande börda på nätverket, ökade lagringsbehovet för noder och höjde transaktionsavgifterna.

Bulletproofs, presenterade av Bünz, Bootle, Boneh, Poelstra, Wuille och Maxwell i en rapport 2018, löste problemet med ett nytt och kompaktare bevisformat. Uppgraderingen aktiverades i Monero i oktober 2018 och komprimerade range proofs från ungefär 13 kB till ungefär 2 kB per transaktion, en minskning med 80 procent.

Bulletproofs+ introducerades i hardforken april 2022 och gav ytterligare 5 till 7 procents effektivisering jämfört med Bulletproofs. Uppgraderingen kombinerades med view tags och den höjda ring size på 16. Sammantaget innebar paketet lägre avgifter, snabbare verifiering på nodnivå och billigare infrastrukturdrift för de som kör egna noder.

Bulletproofs kräver ingen betrodd setup, till skillnad från det zk-SNARK-format som Zcash ursprungligen använde. Det innebär att det inte finns någon ceremoni eller parametergenerering som kan komprometteras i förväg för att förfalska bevis i efterhand.

Före och efter RingCT

Tabellen nedan visar de konkreta skillnaderna i sekretess, transaktionsstorlek och avgifter före och efter att RingCT aktiverades och efterföljande uppgraderingar genomfördes.

Egenskap Före RingCT (2014–sept 2017) Efter RingCT + Bulletproofs+
Belopp synliga Ja, klartextbelopp på kedjan Nej, Pedersen commitments
Transaktionsstorlek Mindre (inget range proof) Kompakt tack vare Bulletproofs+, ca 1,4 kB range proof
Avgift Lägre i absoluta tal Lägre per sekretessgrad, Bulletproofs minskade kostnad 80 %
Anonymity set för belopp Inget, belopp läsbara Fullständigt dolt för alla utom avsändare och mottagare
Spårbarhet av belopp Möjlig för alla med kedjedata Omöjlig utan avsändarens eller mottagarens privata nyckel

Perioden 2014 till september 2017 innebär att transaktioner med synliga belopp fortfarande finns bevarade i blockkedjan. De kan läsas av vem som helst. Moderna plånböcker väljer bort dessa outputs som decoys i ring signatures, men de historiska beloppen är permanent synliga eftersom blockkedjedata är oföränderlig.

Vanliga frågor om RingCT

Vad är RingCT i Monero?

RingCT, Ring Confidential Transactions, är det protokolllager i Monero som döljer beloppet i varje transaktion. Tekniken bygger på Pedersen commitments, kryptografiska åtaganden som gör det möjligt för nätverket att verifiera att in- och utgående belopp balanserar utan att beloppens faktiska värden avslöjas. RingCT aktiverades frivilligt i januari 2017 och blev obligatoriskt i september samma år.

Hur fungerar Pedersen commitments?

En Pedersen commitment är ett kryptografiskt åtagande på formen C = rG + vH, där v är beloppet, r är en slumpmässig blindingfaktor och G samt H är punkter på en elliptisk kurva. Åtagandet är binding, det vill säga det går inte att byta ut värdet i efterhand, och hiding, det vill säga det avslöjar inte beloppets storlek. Nätverket verifierar att summan av inputs-commitments är lika med summan av outputs-commitments via commitments homomorphiska egenskap, utan att känna till de underliggande beloppen.

Vad är Bulletproofs och varför är de viktiga?

Bulletproofs är ett komprimerat bevisformat för range proofs, de kryptografiska bevis som visar att ett belopp är positivt och inte orsakar overflow. Ursprungliga range proofs i RingCT tog omkring 13 kB per transaktion. Bulletproofs, aktiverade 2018, komprimerade detta till ungefär 2 kB, en minskning med 80 procent. Bulletproofs+ 2022 gav ytterligare 5 till 7 procents effektivisering. Resultatet är lägre transaktionsavgifter, snabbare verifiering och billigare noddrift.

Hur döljer RingCT belopp utan att nätverket kan fuska?

RingCT kombinerar två mekanismer. Pedersen commitments gör att nätverket matematiskt kan verifiera balansen mellan inputs och outputs via commitments homomorphiska egenskap, utan att se de faktiska beloppen. Range proofs, nu i form av Bulletproofs, bevisar dessutom att varje enskilt belopp är ett positivt tal inom ett giltigt intervall, vilket förhindrar att en avsändare skapar negativa belopp för att generera XMR ur tomma intet. Kombinationen garanterar korrekthet utan att röja värden. Läs mer om hur Monero-transaktioner ser ut utifrån i guiden om Monero block explorer.