Miniscript

Difficoltà: avanzato

Argomento: tecnologia


DEFINIZIONE

Miniscript può essere considerato un framework (o template) per Bitcoin Script, il linguaggio di programmazione nativo di Bitcoin. Non è un linguaggio che sostituisce Bitcoin Script e che chiede quindi aggiornamenti al protocollo o ai nodi, ma un modo diverso di scrivere gli script che viene poi trasformato in Bitcoin Script.

Bitcoin Script consente di creare tutte le condizioni di spesa e degli smart contract Bitcoin, tra cui, ad esempio, quella che forse è la più semplice: determinare chi è autorizzato a spendere un determinato importo Bitcoin.

Per ogni transazione Bitcoin, il mittente richiede l'indirizzo del destinatario e con queste informazioni costruisce uno script che blocca i bitcoin inviati in modo che solo il destinatario possa spenderli. Sebbene sia abbastanza facile costruire script semplici come quello sopra descritto con Bitcoin Script, più lo script diventa complesso, maggiore è la possibilità di errore umano.

Bitcoin Script è un linguaggio stack-based (come il Forth), progettato per implementare condizioni di spesa costituite da varie combinazioni di firme, hash lock e time lock. Tuttavia, nonostante le sue funzionalità limitate, non è affatto banale fare degli script che gestiscano casi come questi:

  • Data una combinazione di condizioni di spesa, trovare lo script più economico per implementarla.
  • Dati due script, costruire uno script che implementi una composizione delle loro condizioni di spesa (ad esempio un multisig dove una delle "chiavi" è un altro multisig).
  • Dato uno script, scoprire quali condizioni di spesa consente.
  • Dato uno script e l'accesso a un insieme sufficiente di chiavi private, costruire un testimone generale soddisfacente per esso.
  • Dato uno script, essere in grado di prevedere il costo di spesa di un output.
  • Dato uno script, sapere se particolari limitazioni di risorse, come il limite di operazioni, potrebbero essere raggiunte durante la spesa.

Miniscript è una rappresentazione degli script che rende più semplice implementare questo tipo di operazioni.

Miniscript consente di scrivere un sottoinsieme di script Bitcoin in modo strutturato. Consente, tra l'altro, l'analisi, la composizione e la firma generica, permettendo agli sviluppatori di scrivere script avanzati in modo più sicuro. In altre parole, Miniscript "contiene" alcune funzionalità degli script Bitcoin preimpostati in base a un modello di comportamento previsto, limitando eventuali rischi in quanto il comportamento inatteso è ridotto al minimo. In pratica, fornisce agli sviluppatori una "cassetta degli attrezzi" per armeggiare e creare script avanzati e complessi per Bitcoin, invece di dover fare tutto manualmente attraverso Bitcoin Script.

Miniscript è stato progettato per gli script embedded P2WSH e P2SH-P2WSH. La maggior parte delle sue costruzioni funziona bene anche in P2SH, ma alcune delle proprietà di sicurezza (opzionali) si basano su regole specifiche di Segwit. Inoltre, i compilatori di policy implementati assumono un modello di costi specifico per Segwit.

A ottobre 2023 è stata aggiunta al codice di Bitcoin Core l'opzione miniscript per i descrittori di output P2TR, Taproot.

un'opzione , aggiungendo il supporto sia per guardare che per firmare i "descrittori TapMiniscript". In precedenza, miniscript era disponibile solo per i descrittori di output P2WSH. L'autore nota che un nuovo frammento multi_a viene introdotto esclusivamente per i descrittori P2TR che corrisponde alla semantica di multi nei descrittori P2WSH. La discussione sul PR rileva che la maggior parte del lavoro è stata finalizzata al corretto monitoraggio dei limiti modificati delle risorse per tapscript.

Miniscript consente al software di analizzare automaticamente uno script, determinando anche quali witness data devono essere generati per spendere i bitcoin protetti da quello script. Con miniscript che dice al wallet cosa deve fare, gli sviluppatori di wallet non devono scrivere nuovo codice quando passano da un modello di script a un altro.

La rappresentazione strutturata degli script Bitcoin fornita da miniscript consente ai wallet di essere molto più dinamici riguardo agli script che utilizzano. A sostegno di questa dinamicità, i miniscript possono essere creati utilizzando un linguaggio di policy di facile scrittura. Le politiche sono componibili, consentendo a qualsiasi sottoespressione valida di essere sostituita da un'altra sottoespressione valida (entro certi limiti imposti dal sistema Bitcoin).

Per esempio lo script Bitcoin:

<A> OP_CHECKSIG OP_IFDUP OP_NOTIF OP_DUP OP_HASH160 <hash160(B)> OP_EQUALVERIFY OP_CHECKSIGVERIFY <144> OP_CSV OP_ENDIF

dove A e B sono le chiavi pubbliche, può essere convertito nella notazione Miniscript come:

or_d(c:pk(A),and_v(vc:pk_h(B),older(144)))

con una notazione che rende chiaro che lo script consente la spesa o quando A firma, o quando B firma dopo 144 blocchi.

Bitcoin Core a partire dalla versione 24.0, consente agli utenti di creare un wallet contenente uno script Miniscript, creare indirizzi per quel wallet e finanziarli con bitcoin. Tuttavia, la spesa da questi indirizzi non è ancora supportata dal wallet di Bitcoin Core, il che significa che i wallet abilitati a Miniscript su Bitcoin Core sono per il momento solo del tipo watch-only.
A ottobre 2023 è stata aggiunta al codice di Bitcoin Core l'opzione per i descrittori di output P2TR, aggiungendo il supporto sia per guardare che per firmare i "descrittori TapMiniscript". In precedenza, miniscript era disponibile solo per i descrittori di output P2WSH. Un nuovo frammento multi_a viene introdotto esclusivamente per i descrittori P2TR che corrisponde alla semantica multi nei descrittori P2WSH.


aggiornato il 2022-11-29