Bitcoin erbjöd det första programmeringsspråket för smarta kontrakt som världen någonsin hade sett. Script, som detta språk kallas, låter användare koda olika förhållanden under vilka mynt kan spenderas. Men även om detta var ett revolutionerande koncept är det inte lätt att använda, särskilt för mer komplexa utgiftsvillkor. Både att skriva ett komplext kontrakt och att verifiera att kontraktet gör vad det ska göra är benägna att mänskliga fel. Ändå är korrekt tolkning av villkoren av yttersta vikt, särskilt med pengar som står på spel.
Under det senaste året planerade blockchainingenjörerna Andrew Poelstra, Pieter Wuille och Sanket Kanjalkar att förbättra detta. Genom att ta bort skriptet till dess viktiga saker, deras “nya” programmeringsspråk – “Miniscript”- tar bort komplexiteten och bör göra programmering på Bitcoin enklare och säkrare för alla inblandade.
“Miniscript är i teoretisk mening mer begränsande än manus”, säger Blockstreams forskningschef och Miniscript-meddesigner Andrew Poelstra till Bitcoin Magazine. “Men det kan göra allt som människor faktiskt använder manus till.”
Manus
Låt oss börja från början.
Varje Bitcoin-transaktion består av två huvuddelar: in- och utgångar, som båda består av bitar av kod. Ingångarna “låser upp” mynt och utgångarna “låser upp dem” igen och anger under vilka förhållanden de kan låses upp i en efterföljande transaktionsingång. Sådana krav inkluderar vanligtvis en giltig kryptografisk signatur, men det finns fler möjligheter; till exempel kanske en viss tid måste ha gått innan ett mynt kan spenderas eller ett specifikt hemligt nummer måste inkluderas.
Den här koden i transaktioner skapas med Script, ett programmeringsspråk som är särskilt utformat för Bitcoin. Script inspirerades av Forth, ett programmeringsspråk som uppfanns på 1960-talet och som ursprungligen var utformat för att använda radioteleskop. Skriptet justeras dock för att göra det mer lämpligt för Bitcoin.
Skriptet har till exempel inte en opcode (en instruktion) som gör “loopar”: språket stöder inte att utföra samma beräkning obegränsat antal gånger. I Bitcoin finns det inget behov av att utföra samma beräkning ett obegränsat antal gånger eftersom Bitcoin-noder faktiskt inte beräknar transaktioner – de validerar transaktioner. (För en mer teknisk förklaring av varför så är fallet, se den här posten av Blockstream-ingenjör Russell O’Connor.)
Skriptet är också “otypat.” Detta innebär att resultaten av beräkningar kan tolkas och användas på olika sätt. Till exempel kan resultatet av en giltig signatur vara “true”, men “true” kan i sin tur tolkas och användas som ett nummer “1” och därefter användas i matematiska ekvationer: “true” plus “true” skulle lägga till upp till “2”, vilket till exempel kan innebära att tillräckligt med signaturer tillhandahölls om minst två giltiga signaturer krävs.
Detta leder oss till den viktigaste egenskapen hos Script inom ramen för denna artikel: det är svårt att ”anledning till.”Detta innebär i princip att resultaten av beräkningar kan tolkas på många sätt. Även om en signatur till exempel är ogiltig kan manuskriptet skrivas så att transaktionen fortfarande är giltig av någon annan anledning.
“Det finns opkoder i Bitcoin Script som gör riktigt absurda saker”, förklarade Poelstra. “Gilla, tolka en signatur som ett sant / falskt värde, förgrena dig på det; konvertera den booleska till ett tal och indexera sedan till stacken och ordna om stacken baserat på det numret. Och de specifika reglerna för hur det gör det här är supernötter. ”
Detta kan göra Script svårt att arbeta med. Särskilt om krav på att spendera (“låsa upp”) mynt blir mer komplexa kan författaren till en transaktion oavsiktligt inkludera något i koden som gör att mynten kan spenderas under andra förhållanden än tänkt. Omvänt kan mottagaren av en transaktion misslyckas med att märka en sådan besvär och förlora sina mynt till en angripare som märker.
Ett konkret exempel på ett problem
Här är ett konkret exempel på hur dessa problem begränsar skriptets användbarhet.
Blockstream Green plånboken har en standard “cosigning” -installation. Plånboksanvändaren styr en av två nycklar och Blockstream styr den andra. Pengarna kan användas på två sätt. Först, när användaren vill spendera ett mynt, undertecknar de transaktionen och begär att Blockstream också undertecknar det. Blockstream skulle vanligtvis göra detta, även om detta kan kräva att användaren bekräftar att de verkligen vill göra transaktionen på ett sekundärt sätt, som en e-postbekräftelse. Men något kan gå fel i Blockstreams slut – kanske försvinner företaget eller tappar sin nyckel, eller så kan det inte skriva av någon annan anledning. I så fall har användaren fortfarande en reservlösning för att spendera sin bitcoin: Efter att en tidlås har löpt ut kan de skapa en giltig transaktion efter att någon förutbestämd tid har gått. Kanske en månad.
Det här fungerar bra, men det är också begränsat. Användaren kan inte använda mer av Bitcoins smarta kontraktspotential, även om de kanske vill lägga till mer flexibilitet i slutet av installationen.
“Just nu har Green ett fast skript som det använder för alla kunder, vilket i grunden bara är en enkel multisignatur”, sa Poelstra. ”Men egentligen borde vi inte bry oss om vad manuset säger. Vad vi bryr oss om är att det är omöjligt för mynt att spendera utan vår underskrift före en viss tidsgräns? Om användaren vill använda någon galen policy med oss, borde vi kunna stödja den, så länge det ena villkoret vi bryr oss om är uppfyllt. ”
Användaren kanske till exempel vill låta sina nära och kära spendera myntet efter att ett år har gått, om de går bort. Eller kanske är användaren faktiskt ett företag, och den vill skapa en multisig-inställning där två av tre styrelseledamöter tillsammans kan spendera mynten (i kombination med Blockstream).
För närvarande kan detta tekniskt vara möjligt med Bitcoin Script. Det skulle dock kräva att användaren utformar en anpassad installation, och Blockstream skulle behöva delta i denna anpassade installation.
“Men om användaren ger oss ett godtyckligt skript är det omöjligt för oss att säga om det villkoret vi bryr oss om det [är] uppfyllt, eftersom den totala uppsättningen av alla skriptbeteenden är väldigt komplicerad”, förklarade Poelstra. ”Till exempel, om ett skript verkar ta en signatur, måste vi tänka på vad som händer om användaren ger en icke-signatur. Kan det luras att låta mynten spenderas? ”
Miniscript
Under det senaste året designades Miniscript av Poelstra, Blockstream Core teknikingenjör Pieter Wuille och Blockstream praktikant Sanket Kanjalkar. (Miniscript är dock inte officiellt en Blockstream-produkt.)
Kort sagt, Miniscript är en “avskalad” version av Script: ett urval av “verktyg” från “Script toolkit” som gör det lättare att använda och lättare att verifiera av människor. Verktygen är noga utvalda för att möjliggöra praktiskt taget allt som kan göras med Script – det finns bara några undantag som ingen ändå använder sig av. Så även om en linje med Miniscript fortfarande är en giltig skriptrad, undviker den i princip mänskliga fel genom att förhindra oväntade, kanske oavsiktliga, resultat av koden.
Med exempel på ett problem ovan, med Miniscript, kan en användare enkelt utforma en installation på ett sådant sätt att Blockstream trivialt kan kontrollera att dess enda villkor är uppfyllt. Specifikt kan Blockstream se att pengarna bara kan användas om de undertecknar eller om en månad har gått – oavsett vilka andra villkor som ingår i användarens slut på installationen, vare sig det är extra tidlås eller multisiggar eller något annat. Med Miniscript kan det inte finnas några oväntade problem som skulle åsidosätta Blockstreams slut.
Miniscript är så enkelt och förutsägbart, faktiskt, att installationen alltid kan förvandlas till ett beslutsträd: en visualisering (“bildkodning”) av installationen, vilket är mycket lätt att resonera om.
Visualiseringen nedan visar till exempel en inställning där två av tre användare behöver skriva för att flytta mynt. Som ett reservalternativ kan mynten flyttas med en nödnyckel, men först efter en tid.
Visualisering av Miniscript
[Författarens anmärkning: Tack till Tejaswi Nadahalli för pekar ut att en tidigare beskrivning av visualiseringen var felaktig.]
”Med Miniscript är det enkelt för Blockstream att delta i mer komplexa inställningar – vi avkodar skriptet till ett träd, sedan kontrollerar vi varje träd i trädet och frågar (a) har detta blad en tidsgräns på det ?; eller (b) kräver detta blad en av våra signaturer? ” Sa Poelstra.
Om svaret är ja på båda frågorna kan Blockstream delta.
Miniscript används
Medan Miniscript är ett pågående arbete har tidiga versioner av det släppts och är redo att användas.
För att göra processen att skriva Miniscript ännu enklare designade Wuille också ett ”policyspråk”. Policyspråket är verkligen som ett eget programmeringsspråk. Efter att ha programmerat under vilka villkor ett mynt kan spenderas på detta policyspråk kan det sammanställas (“översättas”) till Miniscript, och därför till ett giltigt skript, för att inkluderas i en Bitcoin-transaktionsoutput.
En stor extra fördel med detta policyspråk är att det automatiskt sammanställs till den bästa, mest effektiva versionen av Miniscript möjligt, beroende på vad skriptet faktiskt kodar.
“Saken med Miniscript är att det i grunden är Script … du har massor av olika sätt att skriva” eller “, massor av sätt att skriva” och “och vissa är effektivare än andra”, sa Poelstra. “Policyspråket har bara en” eller, “en” och “och så vidare, och Pieter [Wuille] har skrivit denna superoptimerade kompilator som kommer att konvertera det till Miniscript åt dig och göra det på ett optimalt sätt.”
Detta är inte bara ett teoretiskt koncept. Trots att den nuvarande versionen av Miniscript och kompilatorn inte är slutliga versioner, använder Blockstream den internt för utvecklingsgrenen för dess funktionella programvara Liquid sidechain. (Poelstra påpekade att användning av Wuilles optimerande kompilator sparade Blockstream 22 byte kontra dess ursprungliga, “handrullade” skript.) Wuille är värd för en demoversion av ett policyspråk till Miniscript-kompilatorn för alla att använda http://bitcoin.sipa.be/miniscript/.