Bitcoin tilbød det første smarte kontraktprogrammeringssprog, verden nogensinde havde set. Script, som dette sprog kaldes, giver brugerne mulighed for at kode forskellige betingelser, hvorunder mønter kan bruges. Men selvom dette var et revolutionerende koncept, er det ikke let at bruge, især under mere komplekse udgiftsforhold. Både at skrive en kompleks kontrakt såvel som at kontrollere, at kontrakten gør, hvad den skal, er tilbøjelig til menneskelige fejl. Alligevel, især med penge på spil, er korrekt fortolkning af betingelserne af største betydning.
I løbet af det sidste år satte blockchain-ingeniører Andrew Poelstra, Pieter Wuille og Sanket Kanjalkar sig for at forbedre dette. Ved at fjerne scriptet til dets nøglepunkter, deres “nye” programmeringssprog – “Miniscript”- abstraherer kompleksiteten og bør gøre programmering på Bitcoin nemmere og mere sikker for alle involverede.
“Miniscript er i teoretisk forstand mere begrænsende end script,” fortalte Blockstream-direktør for forskning og Miniscript-meddesigner Andrew Poelstra Bitcoin Magazine. “Men det kan gøre alt, hvad folk faktisk bruger script til.”
Manuskript
Lad os starte fra starten.
Hver Bitcoin-transaktion består af to hoveddele: input og output, som begge består af kodestykker. Indgangene “låser op” mønter og output “låser dem op” igen og angiver under hvilke betingelser de kan låses op i en efterfølgende transaktionsinput. Sådanne krav inkluderer normalt en gyldig kryptografisk signatur, men der er flere muligheder; for eksempel skal der muligvis gå en vis tid, før en mønt kan bruges, eller et specifikt hemmeligt nummer skal medtages.
Denne kode i transaktioner oprettes med Script, et programmeringssprog, der er specielt designet til Bitcoin. Script blev inspireret af Forth, et programmeringssprog, der blev opfundet i 1960’erne, og som oprindeligt var designet til at betjene radioteleskoper. Script justeres dog for at gøre det mere egnet til Bitcoin.
F.eks. Har Script ikke en opcode (en instruktion), der gør “loops”: sproget understøtter ikke udførelse af den samme beregning et ubegrænset antal gange. I Bitcoin er der ikke behov for at udføre den samme beregning et ubegrænset antal gange, fordi Bitcoin-noder faktisk ikke beregner transaktioner – de validerer transaktioner. (For en mere teknisk forklaring på, hvorfor dette er tilfældet, se dette indlæg af Blockstream-ingeniør Russell O’Connor.)
Script er også “utypet.” Dette betyder, at beregningsresultater kan fortolkes og bruges på forskellige måder. For eksempel kan resultatet af en gyldig signatur være “sand”, men “sand” kan igen fortolkes og bruges som et tal “1” og efterfølgende bruges i matematiske ligninger: “sand” plus “sand” vil tilføje op til “2”, hvilket for eksempel kan betyde, at der blev leveret tilstrækkelige underskrifter, hvis der kræves mindst to gyldige underskrifter.
Dette bringer os til den vigtigste egenskab ved Script i forbindelse med denne artikel: det er svært at “grund til.”Dette betyder i det væsentlige, at resultaterne af beregninger kan fortolkes på mange måder. Selv hvis en signatur f.eks. Er ugyldig, kan scriptet skrives således, at transaktionen stadig er gyldig af en anden grund.
”Der er opkoder i Bitcoin Script, der gør virkelig absurde ting,” forklarede Poelstra. “Som, fortolke en signatur som en sand / falsk værdi, forgren dig derpå; konverter den boolske til et tal og indeksér derefter i stakken, og omarranger stakken baseret på dette tal. Og de specifikke regler for, hvordan det gør dette, er super nødder. ”
Dette kan gøre Script vanskelig at arbejde med. Især hvis kravene til at bruge (“låse op”) mønter bliver mere komplekse, kan forfatteren af en transaktion utilsigtet medtage noget i koden, der gør det muligt at bruge mønterne under andre forhold end beregnet. Omvendt kan modtageren af en transaktion undlade at bemærke en sådan finurlighed og miste sine mønter til en angriber, der bemærker.
Et konkret eksempel på et problem
Her er et konkret eksempel på, hvordan disse problemer begrænser scriptets anvendelighed.
Blockstream Green tegnebogen har en standard “cosigning” opsætning. Tegnebogsbrugeren styrer en af to nøgler, og Blockstream styrer den anden. Midlerne kan bruges på to måder. Først når brugeren ønsker at bruge en mønt, underskriver de transaktionen og anmoder om, at Blockstream også underskriver den. Blockstream ville normalt gøre dette, selvom dette muligvis kræver, at brugeren bekræfter, at de virkelig ønsker at foretage transaktionen på en sekundær måde, som en e-mail-bekræftelse. Men noget kan gå galt i Blockstreams ende – måske forsvinder virksomheden eller mister sin nøgle, eller den kan ikke underskrive af en anden grund. I så fald har brugeren stadig en reserveløsning til at bruge deres bitcoin: Efter at en tidslås er udløbet, kan de oprette en gyldig transaktion efter en forudbestemt tid er gået. Måske en måned.
Dette fungerer fint, men det er også begrænset. Brugeren kan ikke bruge mere af Bitcoins smarte kontraktpotentiale, selvom de måske ønsker at tilføje mere fleksibilitet i slutningen af opsætningen.
”Lige nu har Green et fast script, som det bruger til alle kunder, hvilket stort set kun er en simpel multisignatur,” sagde Poelstra. ”Men virkelig, vi burde ikke være ligeglade med, hvad scriptet siger. Hvad vi holder af er: er det umuligt for mønterne at blive brugt uden vores underskrift inden nogen timeout? Hvis brugeren ønsker at bruge en skør politik hos os, skal vi være i stand til at støtte den, så længe den ene betingelse, vi holder af, er opfyldt. ”
Brugeren vil for eksempel muligvis tillade deres kære at bruge mønten efter et år er gået, hvis de går bort. Eller måske er brugeren faktisk et firma, og det ønsker at oprette et multisig-setup, hvor to ud af tre bestyrelsesmedlemmer sammen kan bruge mønterne (i kombination med Blockstream).
I øjeblikket kan dette teknisk være muligt med Bitcoin Script. Det vil dog kræve, at brugeren designer en brugerdefineret opsætning, og Blockstream bliver nødt til at deltage i denne brugerdefinerede opsætning.
“Men hvis brugeren giver os et vilkårligt script, er det umuligt for os at fortælle, om den ene betingelse, vi er interesseret i, [er] opfyldt, fordi det samlede sæt af alle scriptadfærd er virkelig kompliceret,” forklarede Poelstra. ”For eksempel, hvis et script ser ud til at tage en signatur, er vi nødt til at tænke over, hvad der sker, hvis brugeren giver en ikke-signatur. Kan det blive narret til at lade mønterne bruges? ”
Miniscript
I løbet af det sidste år blev Miniscript designet af Poelstra, Blockstream Core tech ingeniør Pieter Wuille og Blockstream praktikant Sanket Kanjalkar. (Miniscript er dog ikke officielt et Blockstream-produkt.)
Kort sagt, Miniscript er en “strippet ned” version af Script: et udvalg af “værktøjer” fra “Script toolkit”, der gør det lettere at bruge og lettere at kontrollere af mennesker. Værktøjerne er omhyggeligt udvalgt for at muliggøre praktisk talt alt, hvad der kan gøres med Script – der er kun nogle frynsede undtagelser, som ingen faktisk bruger alligevel. Så selvom en linje af Miniscript stadig er en gyldig linje af Script, undgår den i det væsentlige menneskelige fejl ved at forhindre uventede, måske utilsigtede resultater af koden.
Med eksemplet på ovenstående problem med Miniscript kan en bruger let designe en opsætning på en sådan måde, at Blockstream trivielt kan kontrollere, at dens ene betingelse er opfyldt. Specifikt kan Blockstream se, at pengene kun nogensinde kan bruges, hvis de underskriver, eller hvis der er gået en måned – uanset hvilke andre betingelser der er inkluderet i brugerens afslutning af opsætningen, hvad enten det er ekstra timelåse eller multisigs eller noget andet. Med Miniscript kan der ikke være uventede quirks, der tilsidesætter Blockstreams ende.
Miniscript er faktisk så ligetil og forudsigeligt, at opsætningen altid kan omdannes til et beslutningstræ: en visualisering (“billedkodning”) af opsætningen, som det er meget let at begrunde.
Visualiseringen nedenfor viser for eksempel en opsætning, hvor to ud af tre brugere skal underskrive for at flytte mønter. Som en backupmulighed kan mønterne flyttes med en nødnøgle, men først efter nogen tid er gået.
Visualisering af Miniscript
[Forfatterens note: Tak til Tejaswi Nadahalli for påpege at en tidligere beskrivelse af visualiseringen var forkert.]
”Med Miniscript er det let for Blockstream at deltage i mere komplekse opsætninger – vi afkoder scriptet til et træ, så kontrollerer vi hvert blad i træet og spørger (a) har dette blad en timeout-tilstand på det ?; eller (b) kræver dette blad en af vores underskrifter? ” Sagde Poelstra.
Hvis svaret er ja på begge spørgsmål, kan Blockstream deltage.
Miniscript i brug
Mens Miniscript er et igangværende arbejde, er tidlige versioner af det frigivet og klar til brug.
For at gøre processen med at skrive Miniscript endnu nemmere designede Wuille også et “politiksprog.” Politiksproget er virkelig som et eget programmeringssprog. Efter programmering af de betingelser, hvorunder en mønt kan bruges på dette politiksprog, kan den kompileres (“oversættes”) til Miniscript og derfor til et gyldigt script, der skal inkluderes i en Bitcoin-transaktionsoutput.
En stor ekstra fordel ved dette politiksprog er, at det automatisk kompileres til den bedste og mest effektive version af Miniscript muligt, afhængigt af hvad scriptet faktisk koder.
“Sagen ved Miniscript er, at det grundlæggende er Script … du har masser af forskellige måder at skrive ‘eller,’ masser af måder at skrive ‘og’ på, og nogle er mere effektive end andre,” sagde Poelstra. “Politiksproget har kun et ‘eller’ et ‘og’ og så videre, og Pieter [Wuille] har skrevet denne superoptimerede kompilator, der konverterer det til Miniscript for dig og gør det på den optimale måde.”
Dette er ikke kun et teoretisk koncept. Selvom den aktuelle version af Miniscript og compileren ikke er endelige versioner, bruger Blockstream det internt til udviklingsgrenen af dets Liquid sidechain-funktionelle software. (Poelstra påpegede, at brugen af Wuilles optimeringscompiler gemte Blockstream 22 bytes i forhold til det originale, “håndrullede” script.) Wuille er vært for en demo-version af et politiksprog til Miniscript-kompilatoren, som alle kan bruge på http://bitcoin.sipa.be/miniscript/.