Segregated Witness – část první

Návrh zvaný Segregated Witness, neboli SegWit, byl představen na konferenci Scaling Bitcoin v Hongkongu v roce 2015. SegWit vývojáře Pietera Wuilleho zvedl velkou vlnu zájmu mezi jádrovými vývojáři. Z technického hlediska sklízí zaslouženou pochvalu v bitcoinové komunitě a očekává se od něj, že zlepší funkce BTC mnoha způsoby. Někteří dokonce doufají, že vyřeší problémy se škálovatelností (o které jsme již napsali mnohé) a konečně do bitcoinové komunity přinese klid a mír. Toto je první část třídílného seriálu o Segregated Witness.

Cože jsou to ty bitcoinové transakce?

Abychom Segregated Witness pochopili, bude lepší si vysvětlit pojem transakce z techničtějšího hlediska. Pokud máte v této oblasti dostatek znalostí, klidně přeskočte na poslední část.

Pro začátek je důležité si uvědomit, že zásadní část bitcoinového protokolu tvoří transakce. Uzly decentralizované sítě si mezi sebou neposílají Bitcoiny, posílají si balíčky dat, které obsahují informace o transakcích.

Tyto bitcoinové transakce jsou svým způsobem sady zámků – každá transakce obsahuje dva klíčové komponenty. První polovina transakce odemkne Bitcoiny, které předchozí transakce uzamkla, za pomocí takzvaných Inputs, neboli vstupů. Vstupy obsahují skripty, tj. instrukce jakým způsobem input odemknout – ty se nazývají scriptSigs. Druhá polovina obsahuje jeden, nebo více zámků, které se nazývají Outputs, neboli výstupy. Ty pro změnu zase BTC uzamykají. Outputs obsahují skripty, které se nazývají scriptPubKeys. Tímto způsobem bitcoinový protokol umožňuje přejít od vstupů k výstupům v rámci jediné transakce a také přejít hladce od transakce k transakci.

Toto pravidlo má ovšem jednu výjimku. Transakce zvaná Coinbase transaction (neplést se stejnojmennou burzou a peněženkou) je transakce vytvořená těžařem, když vyřeší blok a obsahuje odměnu za vyřešení bloku, která v současnosti činí 12,5 BTC. Těžař může také zvýšit odměnu o Bitcoiny, které byly odemčeny v transakcích, které do bloku umístil, ale nejsou ještě zamčeny. Tj. rozdíl mezi vstupy a výstupy – a to jsou nám známé transakční poplatky.

Všechno toto odemykání a zamykání dělají odesílatelé transakcí a následně jsou tyto informace odeslány sítí jako pakety dat. Následně všechny uzly sítě zkontrolují, jestli byl proces odemčení a uzamčení proveden správně. Pokud vše sedí, pošlou transakci ostatním uzlům – to se nazývá validace transakce. V případě, že je uzel zároveň těžařem, může tuto transakci hned zahrnout do bloku. Zda se tak skutečně stane, záleží jen a pouze na těžaři – a to je důvod, proč neposílat transakce bez poplatků – v dnešním světě by je nemusel žádný těžař do bloku zahrnout, protože za to nedostane zaplaceno a transakcí ve frontě je více než dost. Zahrnutí transakce do bloku se pak nazývá konfirmace.

Je životně důležité, aby pravidla pro ověření transakcí byla kompatibilní s těmi, které používají (téměř) všichni těžaři. Pokud by těžař umístil transakci do bloku, který ostatní uzly odmítnou, celý blok by byl uzlem považován za neplatný. Pokud by tímto uzlem byl zároveň těžař, mohlo by to vést k dvojímu utrácení (double spend), nebo dokonce k forku.

Tato konsenzuální pravidla – tj. pravidla, na kterých se všechny uzly shodnou – umožní transakcím odemykat a zamykat Bitcoiny několika způsoby najednou. Výstupy, které Bitcoiny zase zamykají, typicky obsahují scriptPubKey, který říká: „Dokaž, že vlastníš, respektive znáš soukromý klíč, který odpovídá klíči veřejnému, tj. bitcoinové adrese“.

Je snadné odvodit veřejný klíč ze soukromého, ale prakticky nemožné získat z veřejného klíče klíč soukromý. Stejně tak je snadné odvodit BTC adresu z veřejného klíče, ale obráceně to nejde. Je též snadné odvodit BTC adresu ze soukromého klíče, ale nemožné odvodit soukromý klíč z BTC adresy. Jednoduše řečeno – je to jednosměrka.

BTC adresa, kterou se zamyká Bitcoin v scriptPubKey je samozřejmě adresa příjemce transakce. A jelikož příjemce adresu vytvořil pomocí soukromého klíče, zná tento soukromý klíč jen a pouze on. Tím pádem je to pouze příjemce transakce, kdo může vytvořit platný scriptSig a tudíž je to pouze on, kdo může odemknout novou transakci a utratit tak daný Bitcoin.

A jak s tím vším souvisí podpisy?

Aby bylo prokázáno vlastnictví soukromého klíče, který se shoduje s klíčem veřejným a s BTC adresou, můžeme teoreticky zahrnout soukromý klíč do scriptSig dané transakce. Nicméně to by samozřejmě nebylo příliš bezpečné. Hlavně by kdokoli, kdo danou transakci vidí, mohl vzít soukromý klíč a použít ho na vytvoření další transakce (nebo změnu transakce předchozí) a získat tak tolik Bitcoinů, kolik je jich uzamčeno před umístěním původní transakce do bloku. Pro těžaře, který umísťuje a vybírá transakce do bloku, by pak bylo snadné Bitcoiny krást ve velkém.

Namísto toho tudíž uzavírací scriptPubKeys vyžaduje, aby scriptSig zahrnul jeden, nebo více podpisů, aby bylo možné BTC odemknout.

Podpisy jsou v podstatě kryptografické finty, které využívají soukromé klíče v kombinaci s dalšími daty, aby vypočítaly unikátní řetězec čísel. A pak, za použití kryptografie, může být odpovídající veřejný klíč použit k ověření, že podpis byl skutečně vytvořen za použití daného soukromého klíče. Podpisy tak dokazují jak vlastnictví soukromého klíče, tak schválení konkrétní sady dat vlastníkem soukromého klíče. A to vše bez vlastního odhalení soukromého klíče.

V případě Bitcoinu jsou soukromé klíče použity k podepsání transakce, po odečtení Inputů. Tzn., že jejich použití se týká scriptPubKeys, uzamčené částky a některých dalších detailů. Následně jsou tento podpis a veřejná adresa, ze které se Bitcoin vydává, přidány do input části dané transakce. To dokazuje, že vlastník soukromého klíče skutečně chtěl transakci vytvořit a zamezuje možnosti s transakcí jakkoli manipulovat.

Následně jsou všechna tato data – tentokrát včetně inputuzahešována, čímž je vytvořen unikátní identifikátor (ID) transakce. Je-li transakce následně umístěna do bloku, těžař zahešuje danou transakci s další transakcí, čímž vytvoří zcela nový heš. A poté je tento výsledný heš zahešován znovu, tentokrát s hešem dalších dvou transakcí. Tento proces pokračuje, dokud nezbyde jen jeden jediný heš. Tato hešovací struktura se nazývá Merkle Tree a výsledný heš Merkle Root. Ten se pak zkombinuje s dalšími daty o bloku a vytvoří tak hlavičku bloku, která se používá k unikátní identifikaci daného bloku. Heš této hlavičky se následně umístí do hlavičky dalšího bloku, čímž se vytvoří pevně daný řetězec bloků, známý jako blockchain. Pozornému čtenáři našich článků už je asi jasné, proč se hashrate sítě měří v exaheších – tj. miliardách miliard hešů (1018).

Bitcoin je považován za nezměnitelný, protože změna v jakékoli části transakce zpětně by změnila ID této transakce, čímž by se změnila i hlavička bloku. Tato změněná hlavička by pak neodpovídala konceptu proof-of-work (hlasování na základě prokázaného vlastnictví výpočetního výkonu), na kterém stojí celá měna. A jelikož se hlavička bloku umísťuje do bloku následujícího, nebyly by platné ani všechny následující bloky.

Co je Segregated Witness?

Koncept SegWit, prezentovaný Wuillem v Hongkongu, je založen na konceptu, který používá společnost Blockstream ve svém vedlejším řetězci zvaném Elements, v kombinaci s doplňujícím nápadem jádrového vývojáře Luka Dashjra. Koncept byl vyladěn již v roce 2015 ve spolupráci s jádrovými vývojáři Gregorym Maxwellem a Ericem Lombrozem. Zatím však nebyl uveden do praxe, ale probíhá hlasování pomocí vytěžených bloků.

Z pohledu uzlů, které nepřistoupí na SegWit (říkejme jim staré uzly), se může velmi brzy zdát, že scriptPubKeys dané transakce je nějaký zvláštní. Zvláštní proto, že tyto scriptPubKeys mohou být z pohledu starého uzlu stěží považované za zámek. Tento koncept se běžně nazývá „Anyone can spend“, tj. „kdokoli může utratit“, protože tyto scriptPubKeys nevyžadují žádný podpis. Obsahovaly by také některé nesmyslné texty (z pohledu starých uzlů).

Staré uzly by tyto transakce považovaly za bláznivé. Myslely by si, že kdokoli může vytvořit nový scriptSig a odemknout výstupy, čímž by tyto transakce byly považovány za vysoce nebezpečné. Ale v konečném důsledku by to starým uzlům bylo úplně jedno. Nakonec to nejsou jejich Bitcoiny, se kterými se takto zachází, a ostatní lidé si se svými penězi přeci mohou dělat, co chtějí. Nesmyslné texty by byly považovány za podivné, ale v konečném důsledku by byly přijaty také. Validace transakce by tedy proběhla a byla by odeslána dalším uzlům.

Nicméně uzly, které upgradovaly na SegWit (říkejme jim nové uzly) si všimnou něčeho jiného. Uvidí starým uzlům nesrozumitelné texty v scriptPubKeys, ale nebudou jim připadat nesmyslné. Namísto toho tyto nové uzly uvidí v daném textu další, velmi specifický typ výstupu.

Stejně jako původní výstupy i tento nový bude vyžadovat jeden, nebo více podpisů, aby odemkl Bitcoin. Ale na rozdíl od běžných výstupů, tento nový druh nebude vyžadovat, aby byl podpis umístěn do scriptSigu následující transakce. Namísto toho bude vyžadovat umístění podpisu do zcela nové části transakce: ta se jmenuje Segregated Witness.

SegWit je v podstatě dodatek, který obsahuje podpisy a některá doplňková data. Důležité je, že Segregated Witness bude starými uzly zcela ignorován, ale nové uzly ho uvidí. Navíc data, která SegWit obsahuje, nebudou zahešována spolu s ostatními částmi transakce do ID dané transakce.

Díky tomu budou jak staré, tak nové uzly považovat transakci s podpisy umístěnými v SegWit za platnou. Staré uzly ji validují proto, že z jejich hlediska nebude tato transakce vyžadovat žádný podpis (protože žádný nevidí) a nové uzly tyto transakce validují, protože uvidí podpis v části Segregated Witness. A jelikož jak staré, tak nové uzly zahešují transakci se stejným ID, všichni si odsouhlasí, že umístění bloku do blockchainu je v pořádku.

Je velice důležité, aby se zabránilo dvojímu utrácení, aby velká většina těžařů používala SegWit – nebo nikdo z nich. Jinak by to mohlo vést také k rozdvojení blockchainu (forku). Pokud by všichni těžaři používali Segregated Witness, mohly by se staré uzly sítě divit, proč nejsou některé transakce umístěny do bloků. Ale jelikož vždy bylo na těžařích, které transakce do bloku umístí, tak by jim to bylo upřímně jedno.

Ale je zde jeden problém: nepodílí-li se podpisy na vytváření bloků a blockchainu jako celku, pak blockchain přestává sloužit jako důkaz, že v transakcích byly použity správné podpisy.

Aby byly tyto správné podpisy v blockchainu obsaženy, musí upgradovaný těžař použít malý trik. Místo pouhého vytvoření Merkle Tree všech transakcí vytvoří také zrcadlový obraz – Merkle tree všech Segregated Witness. Merkle Root Segregated Witness je pak zařazen ve vstupním poli transakce typu coinbase. Tím pádem se změní data coinbase transakce, její ID, a tudíž je ovlivněna hlavička bloku a řetězec bloků je tak zachován i se správnými podpisy.

Díky Wuilleho návrhu mohou být podpisy odstraněny z bitcoinových transakcí, zachována neměnnost Bitcoinu a stejně tak zachována všechna pravidla, na kterých Bitcoin stojí.

To je v kostce, jak SegWit funguje. Příště se podíváme na to, co vlastně dělá.

Související

A máme zde další z nekonečné řady článků o škálovacích řešeních v oblasti Bitcoinu....

PŘIDEJTE SE DO DISKUZE