- Objavljeno datuma
Bitcoin: Segregated witness (SegWit)
- Autori
- Ime
- Vladimir Stevic
- X
Uvod
Segregated witness ili SegWit je inovacija koja dolazi na Bitcoin blockchain 2017-te godine. Ova promjena donosi izmjenu strukture podataka transakcije u Bitcoin-u. Razloga za ovu promjenu bilo je više, ali osnovni su izmjenjivost transakcije i kapacitet bloka. Nešto više o njima kasnije u tekstu, za sad pogledajmo konkretnu promjenu koja se desila.
SegWit Transakcijski podaci
Kako su se podaci transakcije promijenili? U primjeru ispod vidimo strukturu "stare" transakcije i njenog input-a:
Transakcija:
[Version][Input Count][Inputs][Output Count][Outputs][Locktime]
Jedan input
[Previous Transaction Hash (txid)][Output Index][ScriptSig][Sequence]
Posebno ćemo obratiti pažnju na ScriptSig (više o ovome u članku o Bitcoin Script i osnovnim skriptama) dio koji predstavlja "unlocking" kod za ovaj input, te vidimo da se on nalazi unutar podataka samog inputa. Skripta koja otključava ovaj input za potrošnju sadrži potpis pošaljioca i dodatne potrebne podatke, kao što je javni ključ. U teoriji ove podatke možemo nazvati "witness" ili svjedok, svjedočansto da možemo potrošiti ove bitcoin-e.
U SegWit transakcijama, kako samo ime kaže mi vršimo segregaciju ili odvajanje witness podataka. Dakle, sada potpis i javni ključ, kao svjedočanstvo da možemo potrošiti ovaj input se odvajaju na drugo mjesto:
SegWit Transakcija
[Version][Marker][Flag][Input Count][Inputs][Output Count][Outputs][Witness][Locktime]
Jedan input u SegWit transakcijama
[Previous Transaction Hash (txid)][Output Index][ScriptSig][Sequence]
Možemo primjetiti da u input-u i dalje imamo ScriptSig, ali je najčešće prazan. Svi podaci iz njega se sada nalaze u Witness dijelu SegWit transakcije i to za svaki input.
Struktura koju sada sadrži "Witness" dio transakcije je sljedeća:
[Number of items][{[Size][Item]}, {...}]
Početni dio ukazuje na to koliko imamo witness podataka - ukoliko imamo jedan input, imaćemo jedan witness podatak ili jednu unlocking script-u. Zatim za witness sadrži dva dijela, "size" ili veličinu koja upućuje kolika je veličina sljedećih witness podataka za ovaj input. Na kraju vidimo sam "item" ili unlocking script (potpis i javni ključ) za određeni input.
Transaction malleability
Osnovni problem koji SegWit riješava je izmjenjivost transakcije. U ranijim oblicima, node (čvor) je mogao napraviti minimalne izmijene u vašem potpisu, što bi i dalje bio validan potpis, ali ID transakcije ili TXID bi se promijenio. Ovo nije naročit "bug", ali može da bude dosadan. U kontekstu toga da vi pošaljete transakciju i čekate preko njenog TXID-a da se izvrši, a zapravo se ona izvrši pod drugim TXID-em.
S obzirom da sada hashed oblik transakcije ili TXID ne uzima u obzir witness (potpis), bez obzira na ovu promijenu koju node može da uradi nad potpisom, transakcija uvijek ostaje pod istim TXID-em.
Block capacity
Veličina bloka nije zapravo promijenjena, ipak sada u blok može da stane više transakcija. Ovdje se uvodi novi pojam "weight". Tako novi proračun kaže da je maximalan kapacitet bloka 4,000,000 weight units, pri proračunu gdje:
- Normal byte u transakciji predstavlja 4 weight-a. On i dalje ostaje 1 byte
- Witness byte u transakciji je 1 weight, ovdje 1 byte witness podataka zapravo je 0.25 byte-a.
Takođe, witness ili unlocking dio transakcije više nije sačuvan u block header-u - merkle root-u, nego u posebnom dijelu koji se naziva witness merkle root. On se nalazi u output-u coinbase transakcije (transakcija koja dodjeljuje nagradu miner-u) sa kodom OP_RETURN.