Sunday, November 13, 2016

Promjenjivost transakcija (malleability)


Svaka Bitcoin transakcija referencira se na neku prethodnu transakciju. Referenca na transakciju dvostruki je hash cijele transakcije. Prije nego se transakcije uključi u blok, taj hash može promijeniti bilo tko od primatelja transakcije. To se naziva promjenjivost transakcija i predstavlja problem ako se transakciju želi koristiti prije nego je dodana u blok.

U Bitcoinu postoji nekoliko uzroka promjenjivosti:
  1. Potpisi koji nisu u DER formatu.
  2. Operacije u polju scriptSig koje ne stavljaju podatke na stog.
  3. Operacije koje stavljaju podatke na stog za transakcije nestandardne veličine.
  4. Brojevi predvođeni nulama.
  5. Negativna vrijednost broja S u potpisu.
  6. Suvišni podaci u polju scriptSig.
  7. Skripta zanemaruje ulazne podatke.
  8. Maskiranje na temelju sighash zastavice.

Potpisi koji nisu u DER formatu

U prošlosti se Bitcoin klijent oslanjao na OpenSSL biblioteku koja nije zahtijevala strogo pridržavanje DER formata. Prihvaćanjem promjena koje je donio BIP66, ovo više nije problem.

Operacije u polju scriptSig koje ne stavljaju podatke na stog

Dodatne operacije u polju scriptSig mogu dati isti rezultat skripte, ali drugačiji hash. Npr. <sig><pubkey><2>OP_DROP.

Operacije koje stavljaju podatke na stog za transakcije nestandardne veličine

Kod višepotpisnih transakcija može se dogoditi da je potpis prevelik (> 75 bajtova) pa se polje za veličinu potpisa počinje tumačiti kao naredba u skripti. Zbog toga je potrebno dodati neku od OP_PUSHDATA naredbi.

Brojevi predvođeni nulama

U polju scriptPubKey brojevi koji se koriste mogu biti predvođeni nulama.

Negativna vrijednost broja S u potpisu

Kod računanja broja S može se uzeti njegova pozitivna ili negativna vrijednost. To je moguće jer se kod izračuna potpisa koristi aritmetika nad eliptičkom krivuljom y2 = x3 + 7. Obje vrijednosti daju ispravan rezultat. BIP66 propisuje da se uzme manja pozitivna vrijednost. To pravilo je dio konsenzusa ne protokola pa ga nije nužno poštivati.

Suvišni podaci u polju scriptSig

Dodavanje podataka na početak polja scriptSig koji se neće koristiti u odgovarajućem polju scriptPubKey.

Skripta zanemaruje ulazne podatke

Ako skripta scriptPubKey počinje naredbom OP_DROP, ostatke skripte se zanemaruje.

Maskiranje na temelju sighash zastavice 

Sighash zastavice mogu se koristiti za ignoriranje pojedinih dijelova transakcije.

Gorenavedene situacije u kojima je moguća promjenjivost transakcija rješava segregated witness.