logo
Objavljeno datuma

Bitcoin: Segregated witness (SegWit)

4 minuta čitanja
Autori
  • avatar
    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:

  1. Normal byte u transakciji predstavlja 4 weight-a. On i dalje ostaje 1 byte
  2. 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.