Bitcoin je ponudil prvi programski jezik pametnih pogodb, ki ga je svet kdaj videl. Skript, kot se imenuje ta jezik, omogoča uporabnikom, da kodirajo različne pogoje, pod katerimi lahko porabite kovance. A čeprav je bil to revolucionaren koncept, ga ni enostavno uporabljati, zlasti za bolj zapletene pogoje porabe. Tako pisanje zapletene pogodbe kot tudi preverjanje, ali pogodba naredi to, kar naj bi, sta nagnjeni k človeškim napakam. Kljub temu pa je pravilna razlaga pogojev, zlasti ko gre za denar, izrednega pomena.
V zadnjem letu so se inženirji blockchainov Andrew Poelstra, Pieter Wuille in Sanket Kanjalkar lotili izboljšanja tega. Z odstranitvijo skripta na najnujnejše, je njihov “novi” programski jezik – “Miniskript”- odstrani kompleksnost in naj olajša in varneje programira Bitcoin za vse vpletene.
“Miniscript je v teoretičnem smislu bolj omejujoč kot scenarij,” je za revijo Bitcoin povedal direktor raziskav in soustvarjalec Miniscripta Andrew Poelstra. “Lahko pa vse, za kar ljudje dejansko uporabljajo skripte.”
Skripta
Začnimo od začetka.
Vsaka Bitcoin transakcija je sestavljena iz dveh glavnih delov: vhodov in izhodov, ki sta sestavljena iz kosov kode. Vhodi “odklenejo” kovance, izhodi pa jih znova “zaklenejo” in določijo, pod katerimi pogoji jih je mogoče odkleniti pri naslednjem vnosu transakcije. Takšne zahteve običajno vključujejo veljaven kriptografski podpis, vendar obstaja več možnosti; na primer, morda je moral miniti določen čas, preden je mogoče porabiti kovanec ali pa vključiti določeno tajno številko.
Ta koda pri transakcijah je ustvarjena s skriptom, programskim jezikom, ki je posebej zasnovan za Bitcoin. Scenarij je navdihnil Forth, programski jezik, izumljen v šestdesetih letih prejšnjega stoletja, ki je bil prvotno zasnovan za upravljanje radijskih teleskopov. Skript pa je prilagojen, da je bolj primeren za Bitcoin.
Na primer, skript nima kode opcij (navodila), ki naredi “zanke”: jezik ne podpira izvajanja istega izračuna neomejeno število krat. V Bitcoinu ni treba opraviti istega izračuna neomejeno številokrat, ker Bitcoin vozlišča dejansko ne izračunajo transakcij – potrjujejo transakcije. (Za bolj tehnično razlago, zakaj je temu tako, glej to objavo inženir Blockstream Russell O’Connor.)
Tudi skript je »netipkan«. To pomeni, da je mogoče rezultate izračuna izračunati in uporabiti na različne načine. Rezultat veljavnega podpisa je na primer lahko “true”, “true” pa je nato mogoče razlagati in uporabljati kot številko “1” in nato uporabiti v matematičnih enačbah: “true” plus “true” bi dodalo do “2”, kar bi lahko na primer pomenilo, da je bilo zagotovljenih dovolj podpisov, če sta potrebna vsaj dva veljavna podpisa.
To nas pripelje do najpomembnejše lastnosti Scripta v kontekstu tega članka: težko je “razlog za.”To v bistvu pomeni, da je mogoče rezultate izračunavanja razlagati na več načinov. Tudi če je podpis na primer neveljaven, lahko skript napišemo tako, da je transakcija še vedno veljavna iz nekega drugega razloga.
“V Bitcoin Scriptu obstajajo opcode, ki naredijo res absurdne stvari,” je pojasnil Poelstra. »Tako kot razlagajte podpis kot resnično / napačno vrednost, vejte na to; pretvorite to logično vrednost v število, nato indeksirajte v sklad in prerazporedite sklad na podlagi te številke. In posebna pravila, kako to počnejo, so super norci. “
Zaradi tega je skript lahko težaven za delo. Še posebej, če postanejo zahteve za porabo (»odklepanje«) kovancev bolj zapletene, lahko avtor transakcije nenamerno v kodo vključi nekaj, kar omogoča porabo kovancev pod drugačnimi pogoji, kot so predvideni. Nasprotno pa prejemnik transakcije morda ne bo opazil takšne muhe in izgubil svoje kovance napadalcu, ki opazi.
Konkreten primer problema
Tu je konkreten primer, kako te težave omejujejo uporabnost skripta.
Denarnica Blockstream Green ima standardno nastavitev “cosigning”. Uporabnik denarnice nadzoruje eno od dveh tipk, Blockstream pa drugo. Sredstva je mogoče porabiti na dva načina. Najprej, kadar uporabnik želi porabiti kovanec, podpiše transakcijo in zahteva, da jo podpiše tudi Blockstream. Blockstream bi to običajno storil, čeprav lahko to zahteva, da uporabnik potrdi, da resnično želi opraviti transakcijo, s sekundarnimi sredstvi, kot je potrditev po e-pošti. Toda na koncu Blockstream-a bi lahko šlo kaj narobe – morda podjetje izgine ali izgubi svoj ključ ali pa iz kakšnega drugega razloga ne more podpisati. V tem primeru ima uporabnik še vedno nadomestno rešitev za porabo svojih bitcoinov: po poteku časovne zapore lahko po preteku vnaprej določenega časa ustvari veljavno transakcijo. Morda mesec dni.
To deluje v redu, vendar je tudi omejeno. Uporabnik ne more več uporabljati potenciala pametne pogodbe Bitcoin, čeprav bo morda želel dodati več prilagodljivosti na koncu namestitve.
“Trenutno ima Green fiksni skript, ki ga uporablja za vse stranke, kar je v bistvu le preprost večpodpis,” je dejal Poelstra. »Toda v resnici bi nas moralo skrbeti, kaj piše v scenariju. Skrbimo samo za naslednje: ali je pred konec časovne omejitve kovancev nemogoče porabiti brez našega podpisa? Če želi uporabnik z nami uporabiti neko noro politiko, bi ga morali podpirati, če je izpolnjen en pogoj, za katerega skrbimo. “
Uporabnik lahko na primer svojim najbližjim dovoli, da kovanec porabijo po preteku enega leta, če umrejo. Ali pa je uporabnik dejansko podjetje in želi ustvariti nastavitev multisig, kjer lahko katera koli dva od treh članov uprave skupaj porabijo kovance (v kombinaciji z Blockstreamom).
Trenutno bi bilo to tehnično mogoče z Bitcoin Script. Vendar bi bilo potrebno, da uporabnik oblikuje nastavitev po meri, Blockstream pa bi moral sodelovati pri tej nastavitvi po meri.
“Če pa nam uporabnik da poljuben skript, nam ni težko ugotoviti, ali je izpolnjen tisti pogoj, za katerega skrbimo, ker je skupni nabor vseh vedenj skriptov res zapleten,” je pojasnil Poelstra. »Če se na primer zdi, da skript sprejme podpis, moramo razmisliti, kaj se zgodi, če uporabnik podpiše podpis. Ali ga je mogoče prevarati, da se kovanci porabijo? “
Miniskript
V zadnjem letu so Miniscript oblikovali Poelstra, tehnološki inženir Blockstream Core Pieter Wuille in pripravnik Blockstream Sanket Kanjalkar. (Vendar Miniscript uradno ni izdelek Blockstream.)
Skratka, Miniscript je “odstranjena” različica Scripta: izbor “orodij” iz “Script toolkit”, ki olajšajo uporabo in jih ljudje lažje preverijo. Orodja so skrbno izbrana, da omogočajo skoraj vse, kar je mogoče storiti s skriptom – obstaja le nekaj izjem, ki jih v resnici nihče ne uporabi. Torej, čeprav je vrstica Miniscripta še vedno veljavna vrstica Scripta, se v bistvu izogne človeškim napakam s preprečevanjem nepričakovanih, morda nenamernih izidov kode.
Če vzamemo primer zgornje težave, lahko uporabnik z Miniscriptom enostavno oblikuje nastavitev tako, da lahko Blockstream trivialno preveri, ali je izpolnjen en njen pogoj. Natančneje, Blockstream lahko vidi, da je sredstva mogoče kdaj porabiti le, če se podpiše ali če je pretekel mesec dni – ne glede na to, kateri drugi pogoji so vključeni na koncu nastavitve uporabnika, pa naj gre za dodatne časovne zaklepe ali večkratne podpise ali kaj drugega. Z Miniscriptom ne more biti nepričakovanih domislic, ki bi preglasile konec Blockstream-a.
Miniscript je pravzaprav tako preprost in predvidljiv, da je nastavitev vedno mogoče spremeniti v drevo odločitev: vizualizacijo (“picturalno kodiranje”) namestitve, kar je zelo enostavno razložiti o.
Spodnja vizualizacija na primer prikazuje nastavitev, pri kateri se morata dva od treh uporabnikov podpisati za premikanje kovancev. Kot rezervno možnost lahko kovance premikate s ključem v sili, vendar šele čez nekaj časa.
Vizualizacija Miniscripta
[Opomba avtorja: Hvala Tejaswi Nadahalli za opozarja da je bil prejšnji opis vizualizacije napačen.]
»Z Miniscriptom lahko Blockstream enostavno sodeluje v bolj zapletenih nastavitvah – skript dešifriramo v drevo, nato preverimo vsak list drevesa in vprašamo (a), ali ima ta list časovno omejitev ?; ali (b) ali ta list zahteva enega od naših podpisov? ” Je dejal Poelstra.
Če je odgovor na obe vprašanji pozitiven, lahko sodeluje Blockstream.
Miniskript v uporabi
Čeprav je Miniscript v teku, so bile izdane zgodnje različice in so pripravljene za uporabo.
Da bi postopek pisanja Miniscripta še olajšal, je Wuille oblikoval tudi “jezik pravilnika”. Jezik pravilnikov je res kot lasten programski jezik. Po programiranju pogojev, pod katerimi je mogoče kovanec porabiti v tem jeziku pravilnika, ga je mogoče zbrati (“prevesti”) v Miniscript in torej v veljaven skript, da se vključi v izhod Bitcoin transakcije.
Velika dodatna prednost tega jezika pravilnikov je, da se samodejno zbere v najboljšo in najučinkovitejšo različico Miniscripta, odvisno od tega, kaj skript dejansko kodira.
“Stvar pri Miniscriptu je, da je v bistvu Script … imate na tone različnih načinov za pisanje” ali “, tone načinov za pisanje” in “, nekateri pa so učinkovitejši od drugih,” je dejal Poelstra. “Jezik pravilnika ima samo eno” ali “, eno” in “in tako naprej, Pieter [Wuille] pa je napisal ta super optimiziran prevajalnik, ki ga bo za vas pretvoril v Miniscript in to naredil na optimalen način.”
To ni le teoretičen koncept. Čeprav trenutna različica Miniscripta in prevajalnika nista končni različici, jo Blockstream interno uporablja za razvojno vejo svoje funkcionalne programske opreme Liquid sidechain. (Poelstra je poudaril, da je uporaba optimizacijskega prevajalnika Wuille shranila 22 bajtov Blockstream-a v primerjavi s prvotnim, “ročno valjanim” skriptom.) Wuille v prevajalnik Miniscript gosti predstavitveno različico jezika pravilnika, ki ga lahko uporabljajo vsi na http://bitcoin.sipa.be/miniscript/.