Bitcoin tilbød det første smarte kontraktsprogrammeringsspråket verden noensinne hadde sett. Script, som dette språket kalles, lar brukerne kode forskjellige forhold under hvilke mynter kan brukes. Men selv om dette var et revolusjonerende konsept, er det ikke lett å bruke, spesielt for mer komplekse forbruksforhold. Både å skrive en kompleks kontrakt, så vel som å kontrollere at kontrakten gjør det den skal, er utsatt for menneskelige feil. Likevel, med tanke på penger, er riktig tolkning av forholdene av største betydning.
I løpet av det siste året har blockchain-ingeniører Andrew Poelstra, Pieter Wuille og Sanket Kanjalkar lagt ut for å forbedre dette. Ved å strippe ned Script til det essensielle, deres “nye” programmeringsspråk – “Miniscript”- trekker bort kompleksiteten og bør gjøre programmering på Bitcoin enklere og tryggere for alle involverte.
“Miniscript er, i teoretisk forstand, mer begrensende enn script,” sa Blockstream-forskningsdirektør og Miniscript-meddesigner Andrew Poelstra til Bitcoin Magazine. “Men det kan gjøre alt som folk faktisk bruker skript til.”
Manus
La oss starte fra begynnelsen.
Hver Bitcoin-transaksjon består av to hoveddeler: innganger og utganger, som begge består av kodestykker. Inngangene “låser opp” mynter og utgangene “låser dem opp” igjen, og spesifiserer under hvilke forhold de kan låses opp i en påfølgende transaksjonsinngang. Slike krav inkluderer vanligvis en gyldig kryptografisk signatur, men det er flere muligheter; for eksempel må en viss tid ha gått før en mynt kan brukes eller et bestemt hemmelig nummer må være inkludert.
Denne koden i transaksjoner er opprettet med Script, et programmeringsspråk spesielt designet for Bitcoin. Script ble inspirert av Forth, et programmeringsspråk som ble oppfunnet på 1960-tallet og opprinnelig designet for å betjene radioteleskoper. Skriptet er imidlertid justert for å gjøre det mer egnet for Bitcoin.
For eksempel har Script ikke en opcode (en instruksjon) som gjør “looper”: språket støtter ikke utføring av samme beregning et ubegrenset antall ganger. I Bitcoin er det ikke nødvendig å utføre den samme beregningen et ubegrenset antall ganger fordi Bitcoin-noder faktisk ikke beregner transaksjoner – de validerer transaksjoner. (For en mer teknisk forklaring på hvorfor dette er tilfelle, se denne posten av Blockstream-ingeniør Russell O’Connor.)
Manus er også “utypet.” Dette betyr at utfall av beregninger kan tolkes og brukes på forskjellige måter. For eksempel kan utfallet av en gyldig signatur være “sant”, men “sant” kan i sin tur tolkes og brukes som tallet “1” og deretter brukes i matematiske ligninger: “sant” pluss “sant” vil legge til opp til “2”, som for eksempel kan bety at det ble gitt nok signaturer hvis det kreves minst to gyldige signaturer.
Dette bringer oss til den viktigste egenskapen til Script i sammenheng med denne artikkelen: det er vanskelig å “grunn til.”Dette betyr egentlig at resultatene av beregninger kan tolkes på mange måter. Selv om for eksempel en signatur er ugyldig, kan skriptet skrives slik at transaksjonen fremdeles er gyldig av en annen grunn.
“Det er opkoder i Bitcoin Script som gjør virkelig absurde ting,” forklarte Poelstra. “Som, tolk en signatur som en sann / falsk verdi, forgren deg på det; konvertere den boolske til et tall og deretter indeksere i bunken, og omorganisere bunken basert på dette tallet. Og de spesifikke reglene for hvordan det gjør dette er supernøtter. ”
Dette kan gjøre Script vanskelig å jobbe med. Spesielt hvis kravene til å bruke (“låse opp”) mynter blir mer komplekse, kan forfatteren av en transaksjon utilsiktet inkludere noe i koden som gjør at myntene kan brukes under andre forhold enn beregnet. Motsatt kan mottakeren av en transaksjon unnlate å legge merke til en slik finurlighet og miste myntene sine til en angriper som legger merke til.
Et konkret eksempel på et problem
Her er et konkret eksempel på hvordan disse problemene begrenser Scriptets nytteverdi.
Blockstream Green-lommeboken har et standard “cosigning” -oppsett. Lommebokbrukeren kontrollerer en av to nøkler, og Blockstream styrer den andre. Midlene kan brukes på to måter. Først når brukeren vil bruke en mynt, signerer de transaksjonen og ber om at Blockstream også signerer den. Blockstream vil vanligvis gjøre dette, selv om dette kan kreve at brukeren bekrefter at de virkelig ønsker å gjøre transaksjonen på en sekundær måte, som en e-postbekreftelse. Men noe kan gå galt på Blockstreams slutt – kanskje selskapet forsvinner eller mister nøkkelen, eller det kan ikke signere av noen annen grunn. I så fall har brukeren fremdeles en reserveløsning for å bruke bitcoin: Etter at en tidlås er utløpt, kan de opprette en gyldig transaksjon etter at en forutbestemt tid har gått. Kanskje en måned.
Dette fungerer bra, men det er også begrenset. Brukeren kan ikke bruke mer av Bitcoins smarte kontraktspotensial, selv om de kanskje vil legge til mer fleksibilitet på slutten av oppsettet.
“Akkurat nå har Green et fast skript som det bruker for alle kunder, som i utgangspunktet bare er en enkel multisignatur,” sa Poelstra. “Men egentlig, vi burde ikke bry oss om hva Skriften sier. Det vi bryr oss om er: er det umulig for myntene å bruke uten en underskrift før det tar noe tid? Hvis brukeren vil bruke noen sprø policyer med oss, bør vi kunne støtte den, så lenge den ene betingelsen vi bryr oss om er oppfylt. “
Brukeren kan for eksempel ønske å la sine nærmeste bruke mynten etter at et år har gått, i tilfelle de går bort. Eller kanskje brukeren faktisk er et selskap, og den vil lage et multisig-oppsett der to av tre styremedlemmer sammen kan bruke myntene (i kombinasjon med Blockstream).
For tiden kan dette teknisk være mulig med Bitcoin Script. Imidlertid vil det kreve at brukeren designer et tilpasset oppsett, og Blockstream må delta i dette tilpassede oppsettet.
“Men hvis brukeren gir oss et vilkårlig skript, er det umulig for oss å fortelle om den ene betingelsen vi bryr oss om den [er] oppfylt, fordi det totale settet av all skriptadferd er veldig komplisert,” forklarte Poelstra. For eksempel, hvis et skript ser ut til å ta en signatur, må vi tenke på hva som skjer hvis brukeren gir en ikke-signatur. Kan det bli lurt til å la myntene brukes? “
Miniscript
I løpet av det siste året ble Miniscript designet av Poelstra, Blockstream Core tech engineer Pieter Wuille og Blockstream praktikant Sanket Kanjalkar. (Miniscript er imidlertid ikke offisielt et Blockstream-produkt.)
Kort sagt, Miniscript er en “strippet ned” versjon av Script: et utvalg av “verktøy” fra “Script toolkit” som gjør det enklere å bruke og lettere å verifisere av mennesker. Verktøyene er nøye valgt for å muliggjøre praktisk talt alt som kan gjøres med Script – det er bare noen frynseavvik som ingen faktisk bruker. Så mens en linje med Miniscript fremdeles er en gyldig skriftlinje, unngår den egentlig menneskelige feil ved å forhindre uventede, kanskje utilsiktede resultater av koden.
Hvis vi tar eksemplet på et problem ovenfor, med Miniscript, kan en bruker enkelt designe et oppsett på en slik måte at Blockstream trivielt kan kontrollere at den ene betingelsen er oppfylt. Spesielt kan Blockstream se at midlene bare kan brukes hvis de signerer, eller hvis det har gått en måned – uansett hvilke andre forhold som er inkludert i brukerens slutt på oppsettet, det være seg ekstra tidlås eller multisigger eller noe annet. Med Miniscript kan det ikke være uventede særegenheter som vil overstyre Blockstreams slutt.
Miniscript er så greit og forutsigbart, faktisk at oppsettet alltid kan gjøres om til et beslutningstreet: en visualisering (“bildekoding”) av oppsettet, som er veldig lett å resonnere om.
Visualiseringen nedenfor viser for eksempel et oppsett der to av tre brukere må signere for å flytte mynter. Som et alternativ for sikkerhetskopiering kan myntene flyttes med en nødnøkkel, men bare etter at det har gått litt tid.
Visualisering av Miniscript
[Forfatterens merknad: Takk til Tejaswi Nadahalli for peke ut at en tidligere beskrivelse av visualiseringen var feil.]
“Med Miniscript er det enkelt for Blockstream å delta i mer komplekse oppsett – vi dekoder skriptet til et tre, så sjekker vi hvert blad på treet og spør (a) har dette bladet en tidsavbruddstilstand på det ?; eller (b) krever dette bladet en av underskriftene våre? ” Sa Poelstra.
Hvis svaret er ja på begge spørsmålene, kan Blockstream delta.
Miniscript i bruk
Mens Miniscript er et pågående verk, er tidlige versjoner av det utgitt og klare til bruk.
For å gjøre prosessen med å skrive Miniscript enda enklere, designet Wuille også et “policy-språk”. Politikkens språk er egentlig som et eget programmeringsspråk. Etter å ha programmert vilkårene der en mynt kan brukes på dette policy-språket, kan den kompileres (“oversettes”) til Miniscript, og derfor til gyldig Script, for å inkluderes i en Bitcoin-transaksjonsoutput.
En stor ekstra fordel med dette policy-språket er at det automatisk kompileres til den beste og mest effektive versjonen av Miniscript mulig, avhengig av hva skriptet faktisk koder for.
“Saken med Miniscript er at det i utgangspunktet er Script … du har massevis av forskjellige måter å skrive” eller “, massevis av måter å skrive” og “på, og noen er mer effektive enn andre,” sa Poelstra. “Politikkens språk har bare ett” eller, “ett” og “og så videre, og Pieter [Wuille] har skrevet denne superoptimaliserte kompilatoren som vil konvertere det til Miniscript for deg, og gjøre det på den optimale måten.”
Dette er ikke bare et teoretisk konsept. Selv om den nåværende versjonen av Miniscript og kompilatoren ikke er endelige versjoner, bruker Blockstream den internt til utviklingsgrenen til sin funksjonelle programvare for flytende sidekjede. (Poelstra påpekte at bruk av Wuilles optimaliserende kompilator reddet Blockstream 22 byte i forhold til det originale, “håndrullede” skriptet.) Wuille er vert for en demo-versjon av et policy-språk til Miniscript-kompilatoren som alle kan bruke på http://bitcoin.sipa.be/miniscript/.