Bitcoin nabídl první inteligentní programovací jazyk kontraktů, jaký kdy svět viděl. Skript, jak se tento jazyk nazývá, umožňuje uživatelům kódovat různé podmínky, za kterých lze mince utratit. I když se jednalo o revoluční koncept, jeho použití není snadné, zejména pro složitější výdajové podmínky. Jak psaní složité smlouvy, tak ověření, že smlouva dělá to, co má, jsou náchylné k lidské chybě. Přesto je obzvláště u peněz v sázce nanejvýš důležitá správná interpretace podmínek.

V uplynulém roce se blockchainoví inženýři Andrew Poelstra, Pieter Wuille a Sanket Kanjalkar rozhodli toto vylepšit. Svléknutím Scriptu na to nejnutnější, jejich „nový“ programovací jazyk – „Miniscript„- abstrahuje od složitosti a měl by usnadnit a bezpečněji programovat bitcoiny pro všechny zúčastněné.

“Miniscript je v teoretickém smyslu omezenější než scénář,” řekl řediteli výzkumu Blockstream a spolutvůrci Miniscript Andrew Poelstra pro Bitcoin Magazine. “Může však dělat všechno, k čemu lidé ve skutečnosti používají skript.”

Skript

Začněme od začátku.

Každá bitcoinová transakce se skládá ze dvou hlavních částí: vstupů a výstupů, které se skládají z částí kódu. Vstupy „odemknou“ coiny a výstupy je znovu „zamknou“, přičemž specifikují, za jakých podmínek je lze odemknout v následném transakčním vstupu. Takové požadavky obvykle zahrnují platný kryptografický podpis, ale existuje více možností; například možná musela uplynout určitá doba, než bude možné minci utratit, nebo musí být zahrnuto konkrétní tajné číslo.

Tento kód v transakcích je vytvořen pomocí skriptu, programovacího jazyka speciálně navrženého pro bitcoiny. Skript byl inspirován Forthem, programovacím jazykem vynalezeným v šedesátých letech minulého století, který byl původně navržen pro provoz rádiových dalekohledů. Skript je však upraven tak, aby byl vhodnější pro bitcoiny.

Například Script nemá operační kód (instrukci), který by vytvářel „smyčky“: jazyk nepodporuje provádění stejného výpočtu bez omezení početkrát. V bitcoinech není třeba provádět stejný výpočet neomezeně, protože uzly bitcoinů ve skutečnosti nevypočítávají transakce – ověřují transakce. (Podrobnější vysvětlení, proč tomu tak je, viz tento příspěvek inženýr Blockstream Russell O’Connor.)

Skript je také „netypový“. To znamená, že výsledky výpočtů lze interpretovat a použít různými způsoby. Výsledek platného podpisu může být například „true“, ale „true“ lze naopak interpretovat a použít jako číslo „1“ a následně použít v matematických rovnicích: „true“ plus „true“ by přidalo až „2“, což může například znamenat, že bylo poskytnuto dostatek podpisů, pokud jsou požadovány minimálně dva platné podpisy.

Tím se dostáváme k nejdůležitější vlastnosti Script v kontextu tohoto článku: je těžké „důvod o.„To v podstatě znamená, že výsledky výpočtů lze interpretovat mnoha způsoby. I když je podpis například neplatný, lze skript napsat tak, že transakce je stále platná z nějakého jiného důvodu.

“V bitcoinu jsou skripty, které dělají opravdu absurdní věci,” vysvětlil Poelstra. “Jako, interpretovat podpis jako skutečnou / nepravdivou hodnotu, větev na tom; převeďte tento boolean na číslo a poté indexujte do zásobníku a uspořádejte zásobník na základě tohoto čísla. A konkrétní pravidla, jak to dělá, jsou super ořechy. “

Díky tomu může být práce se Scriptem obtížná. Zejména pokud se požadavky na utrácení („odemknutí“) mincí stanou složitějšími, může autor transakce neúmyslně do kódu zahrnout něco, co umožňuje utrácení mincí za jiných podmínek, než bylo zamýšleno. Naopak příjemce transakce si nemusí všimnout takové vtípky a ztratit své mince útočníkovi, který si toho všimne.

Konkrétní příklad problému

Zde je konkrétní příklad toho, jak tyto problémy omezují užitečnost Script.

Peněženka Blockstream Green má standardní „cosigning“ nastavení. Uživatel peněženky ovládá jeden ze dvou klíčů a Blockstream druhý. Prostředky lze utratit dvěma způsoby. Nejprve, kdykoli chce uživatel utratit coinu, podepíše transakci a požádá ji, aby ji podepsal i Blockstream. Blockstream by to obvykle udělal, i když to může vyžadovat, aby uživatel potvrdil, že skutečně chce provést transakci sekundárním způsobem, například e-mailovým potvrzením. Na konci Blockstream se ale něco může pokazit – možná společnost zmizí nebo ztratí klíč, nebo se nemůže podepsat z nějakého jiného důvodu. V takovém případě má uživatel stále záložní řešení pro utrácení svých bitcoinů: Po vypršení časového limitu může po uplynutí předem stanoveného času vytvořit platnou transakci. Možná měsíc.

To funguje dobře, ale je to také omezené. Uživatel již nemůže využívat potenciál chytrých kontraktů bitcoinu, i když na konci instalace může chtít přidat větší flexibilitu.

“Právě teď má Green pevný skript, který používá pro všechny zákazníky, což je v podstatě jen jednoduchý multi-podpis,” řekl Poelstra. “Ale opravdu by nás nemělo zajímat, co říká Skript.” Záleží nám na tom: před nějakým časovým limitem je nemožné, aby byly mince utraceny bez našeho podpisu? Pokud chce uživatel u nás použít nějakou šílenou politiku, měli bychom být schopni ji podpořit, pokud bude splněna jedna podmínka, na které nám záleží. “

Uživatel může například chtít umožnit svým blízkým utratit mince po uplynutí roku, pro případ, že by pominuly. Nebo možná je uživatel ve skutečnosti společnost a chce vytvořit multisig nastavení, kde mohou dva ze tří členů představenstva společně utratit coiny (v kombinaci s Blockstream).

V současné době je to technicky možné s bitcoinovým skriptem. Vyžadovalo by to však, aby uživatel navrhl vlastní nastavení, a Blockstream by se tohoto vlastního nastavení musel účastnit.

“Ale pokud nám uživatel poskytne libovolný skript, je nemožné, abychom zjistili, zda je splněna jedna podmínka, na které nám záleží, protože celková sada veškerého chování skriptu je opravdu komplikovaná,” ​​vysvětlil Poelstra. “Pokud se například zdá, že skript vezme podpis, musíme přemýšlet o tom, co se stane, když uživatel dá nepodpis.” Lze to podvodem nechat nechat utratit mince? “

Miniscript

Minulý rok Miniscript navrhli Poelstra, technologický inženýr Blockstream Core Pieter Wuille a stážista Blockstream Sanket Kanjalkar. (Miniscript však není oficiálně produktem Blockstream.)

Stručně řečeno, Miniscript je „svléknutá“ verze Script: výběr „nástrojů“ z „Script toolkit“, které usnadňují používání a snazší ověřování lidmi. Nástroje jsou pečlivě vybírány tak, aby umožňovaly prakticky cokoli, co lze s programem Script provést – existují pouze některé okrajové výjimky, které vlastně nikdo vlastně nevyužívá. Takže zatímco řada Miniscript je stále platná řada Script, v podstatě se vyhne lidské chybě tím, že zabrání neočekávaným, možná nechtěným výsledkům kódu.

Na příkladu výše uvedeného problému může uživatel s Miniscriptem snadno navrhnout nastavení takovým způsobem, že Blockstream může triviálně zkontrolovat, zda je splněna jeho jedna podmínka. Blockstream konkrétně vidí, že finanční prostředky lze kdykoli utratit, pouze pokud to podepíše, nebo pokud uplynul měsíc – bez ohledu na to, jaké další podmínky jsou zahrnuty na konci nastavení uživatele, ať už jde o časové zámky nebo multisigny nebo cokoli jiného. S Miniscriptem nelze očekávat žádné neočekávané vtípky, které by přepsaly konec Blockstream.

Miniscript je ve skutečnosti tak přímý a předvídatelný, že nastavení lze vždy proměnit v rozhodovací strom: vizualizaci („obrazové kódování“) nastavení, což je velmi snadné zdůvodnit.

Vizualizace níže například ukazuje nastavení, kdy se dva ze tří uživatelů musí podepsat, aby mohli přesunout mince. Jako záložní možnost lze mince přesunout pomocí nouzového klíče, ale pouze po uplynutí určité doby.

Vizualizace Miniscript

[Poznámka autora: Děkuji Tejaswi Nadahalli za poukazuje že dřívější popis vizualizace byl nesprávný.]

“S Miniscriptem je pro Blockstream snadné účastnit se složitějších nastavení – dekódujeme skript do stromu, poté zkontrolujeme každý list stromu a zeptáme se (a) má tento list časový limit?” nebo (b) vyžaduje tento list jeden z našich podpisů? “ Řekla Poelstra.

Pokud je odpověď na obě otázky ano, může se zúčastnit Blockstream.

Používá se miniscript

Zatímco Miniscript je nedokončená výroba, jeho rané verze byly vydány a jsou připraveny k použití.

Aby byl proces psaní Miniscript ještě jednodušší, Wuille také navrhl „politický jazyk“. Politický jazyk je opravdu jako jeho vlastní programovací jazyk. Po naprogramování podmínek, za kterých lze minci utratit v tomto politickém jazyce, ji lze zkompilovat („přeložit“) do miniscriptu, a tedy do platného skriptu, který bude zahrnut do výstupu transakce bitcoin.

Velkou výhodou tohoto politického jazyka je, že se automaticky kompiluje do nejlepší a nejefektivnější možné verze Miniscript, v závislosti na tom, co Skript ve skutečnosti kóduje.

“V Miniscript je to, že je to v zásadě Script … máte spoustu různých způsobů psaní ‘nebo’, spoustu způsobů psaní ‘a’ a některé jsou efektivnější než jiné,” řekl Poelstra. “Politický jazyk má pouze jeden ‘nebo, jeden’ a ‘atd. A Pieter [Wuille] napsal tento superoptimalizovaný kompilátor, který jej převede na Miniscript a provede to optimálním způsobem.”

Nejde jen o teoretický koncept. I když aktuální verze Miniscript a kompilátor nejsou finální verze, Blockstream ji interně používá pro vývojovou větev svého funkčního softwaru Liquid sidechain. (Poelstra poukázal na to, že použití optimalizačního kompilátoru Wuille ušetřilo Blockstream 22 bajtů oproti jeho původnímu „ručně válcovanému“ skriptu.) Wuille hostuje demo verzi politického jazyka kompilátoru Miniscript, který může kdokoli použít na http://bitcoin.sipa.be/miniscript/.