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:
- Potpisi koji nisu u DER formatu.
- Operacije u polju scriptSig koje ne stavljaju podatke na stog.
- Operacije koje stavljaju podatke na stog za transakcije nestandardne veličine.
- Brojevi predvođeni nulama.
- Negativna vrijednost broja S u potpisu.
- Suvišni podaci u polju scriptSig.
- Skripta zanemaruje ulazne podatke.
- 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.