9.5 KiB
9.3: Provare uno Script Bitcoin
Bitcoin Scripting consente un notevole controllo aggiuntivo sulle transazioni Bitcoin, ma è anche alquanto pericoloso. Come descriveremo nel Capitolo 10.1, gli script effettivi sono in qualche modo isolati dalla rete Bitcoin, il che significa che è possibile scrivere uno script e farlo accettare dalla rete anche se è impossibile riscattarlo quello script! Quindi, devi testare a fondo i tuoi script prima di investire i tuoi soldi in essi.
Questo capitolo descrive quindi un metodo fondamentale per testare gli script Bitcoin, che utilizzeremo anche per esempi occasionali nel resto di questa sezione.
Installa btcdeb
Bitcoin Script Debugger (btcdeb) di @kallewoof è uno dei metodi più affidabili che abbiamo trovato per eseguire il debug degli script Bitcoin. Richiede, tuttavia, la configurazione di C++ e alcuni altri accessori sul computer, quindi offriremo anche alcune altre opzioni verso la fine di questo capitolo.
Per prima cosa devi clonare il repository GitHub btcdeb, che richiederà anche l'installazione di git se non lo hai ancora
.
$ sudo apt-get install git
$ git clone https://github.com/bitcoin-core/btcdeb.git
Tieni presente che quando esegui git clone copierà btcdeb nella tua directory corrente. Abbiamo scelto di farlo nella nostra directory '~standup'.
$ ls
bitcoin-0.20.0-x86_64-linux-gnu.tar.gz btcdeb laanwj-releases.asc SHA256SUMS.asc
Successivamente è necessario installare il C++ richiesto e gli altri pacchetti.
$ sudo apt-get install autoconf libtool g++ pkg-config make
Dovresti anche installare readline, poiché ciò rende il debugger molto più semplice da usare supportando la cronologia utilizzando le frecce su/giù, il movimento da sinistra a destra, il completamento automatico utilizzando la scheda e altre buone interfacce utente.
$ sudo apt-get install libreadline-dev
Ora sei pronto per compilare e installare btcdeb:
$ cd btcdeb
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
Dopo tutto ciò, dovresti avere una copia di btcdeb:
$ which btcdeb
/usr/local/bin/btcdeb
Usa btcdeb
btcdeb funziona come un debugger standard. Richiede uno script (così come un numero qualsiasi di voci dello stack) come argomento di avvio. È quindi possibile 'correre' attraverso lo script.
Se invece lo avvii senza argomenti, otterrai semplicemente un interprete in cui puoi eseguire i comandi exec [opcode] per eseguire direttamente le azioni.
Usa btcdeb per un esempio di addizione
L'esempio seguente mostra l'uso di btcdeb per l'esempio di addizione della sezione precedente, "1 2 OP_ADD"
$ btcdeb '[1 2 OP_ADD]'
btcdeb 0.2.19 -- type `btcdeb -h` for start up options
warning: ambiguous input 1 is interpreted as a numeric value; use OP_1 to force into opcode
warning: ambiguous input 2 is interpreted as a numeric value; use OP_2 to force into opcode
miniscript failed to parse script; miniscript support disabled
valid script
3 op script loaded. type `help` for usage information
script | stack
--------+--------
1 |
2 |
OP_ADD |
#0000 1
Mostra il nostro script iniziale, eseguito dall'alto verso il basso, e mostra anche cosa verrà eseguito successivamente nello script.
Digitiamo step e avanza di un passo prendendo il primo elemento nello script e inserendolo nello stack:
btcdeb> step
<> PUSH stack 01
script | stack
--------+--------
2 | 01
OP_ADD |
#0001 2
E ancora:
btcdeb> step
<> PUSH stack 02
script | stack
--------+--------
OP_ADD | 02
| 01
#0002 OP_ADD
Ora eseguiamo OP_ADD e c'è grande eccitazione perché il codice operativo estrae i primi due elementi dallo stack, li somma insieme, quindi inserisce la loro somma nello stack.
btcdeb> step
<> POP stack
<> POP stack
<> PUSH stack 03
script | stack
--------+--------
| 03
Ed è qui che finisce il nostro script, senza più nulla da eseguire e uno 03 in cima al nostro stack come risultato dello script.
NOTA:
btcdebti consente di ripetere il comando precedente premendo invio. Lo faremo negli esempi successivi, quindi non sorprenderti se il promptbtcdeb>non contiene nulla come input. Si tratta semplicemente di ripetere il comando precedente (spessostep).
Usa btcdeb per un esempio di sottrazione
La sezione precedente includeva anche un esempio di sottrazione leggermente più complesso di Scripting: 3 2 OP_ADD 4 OP_SUB. Ecco come appare:
$ btcdeb '[3 2 OP_ADD 4 OP_SUB]'
btcdeb 0.2.19 -- type `btcdeb -h` for start up options
warning: ambiguous input 3 is interpreted as a numeric value; use OP_3 to force into opcode
warning: ambiguous input 2 is interpreted as a numeric value; use OP_2 to force into opcode
warning: ambiguous input 4 is interpreted as a numeric value; use OP_4 to force into opcode
miniscript failed to parse script; miniscript support disabled
valid script
5 op script loaded. type `help` for usage information
script | stack
--------+--------
3 |
2 |
OP_ADD |
4 |
OP_SUB |
#0000 3
btcdeb> step
<> PUSH stack 03
script | stack
--------+--------
2 | 03
OP_ADD |
4 |
OP_SUB |
#0001 2
btcdeb>
<> PUSH stack 02
script | stack
--------+--------
OP_ADD | 02
4 | 03
OP_SUB |
#0002 OP_ADD
btcdeb>
<> POP stack
<> POP stack
<> PUSH stack 05
script | stack
--------+--------
4 | 05
OP_SUB |
#0003 4
btcdeb>
<> PUSH stack 04
script | stack
--------+--------
OP_SUB | 04
| 05
#0004 OP_SUB
btcdeb>
<> POP stack
<> POP stack
<> PUSH stack 01
script | stack
--------+--------
| 01
Torneremo a btcdeb di tanto in tanto e rimarrà uno strumento eccellente per testare i tuoi script.
Usa la potenza di btcdeb
btcdeb ha anche alcune funzioni più potenti, come print e stack, che mostrano lo script e lo stack in qualsiasi momento.
Ad esempio, nello script sopra, una volta che sei passato al comando "OP_ADD", puoi vedere quanto segue:
btcdeb> print
#0000 3
#0001 2
-> #0002 OP_ADD
#0003 4
#0004 OP_SUB
btcdeb> stack
<01> 02 (top)
<02> 03
L'uso di questi comandi può rendere più semplice vedere cosa sta succedendo e dove ti trovi.
⚠️ AVVISO:
btcdebè molto più complesso da usare se stai cercando di verificare le firme. Vedi Controllo della firma con btcdeb. Questo è vero per qualsiasi test di script, quindi non lo consigliamo se stai cercando di verificare unOP_CHECKSIGo unOP_CHECKMULTISIG.
Prova uno script online
Esistono anche alcuni simulatori web che puoi utilizzare per testare gli script online. Possono essere superiori a uno strumento da riga di comando offrendo un output più grafico, ma scopriamo anche che tendono ad avere dei difetti.
In passato abbiamo cercato di fornire linee guida dettagliate sull'utilizzo di siti come Script Playground o Bitcoin Online Script Debugger, ma diventano obsoleti e/o scompaiono troppo rapidamente per poter stare al passo con loro.
Supponiamo che questi debugger abbiano il vantaggio di mostrare le cose visivamente e di dirti esplicitamente se uno script riesce (si sblocca) o fallisce (rimane bloccato). Supponiamo che abbiano degli svantaggi con le firme, dove molti di loro restituiscono sempre "true" per i test di firma oppure hanno meccanismi molto macchinosi per incorporarli.
Prova uno script con Bitcoin
Anche con un ottimo strumento come btcdeb o risorse transitorie come i vari tester di script online, non lavori con la realtà. Non puoi garantire che seguano le regole di consenso di Bitcoin, il che significa che non puoi garantire i loro risultati. Ad esempio, Script Playground afferma esplicitamente di ignorare un bug implicito nelle multifirme Bitcoin. Ciò significa che qualsiasi codice multisig testato con successo su Script Playground si romperà nel mondo reale.
Quindi l'unico modo per testare veramente gli script Bitcoin è provarli su Testnet.
E come lo fai? Si dà il caso che questo sia l'argomento del Capitolo 10, che esamina l'introduzione di questi script astratti nel mondo reale di Bitcoin incorporandoli nelle transazioni P2SH. (Ma anche in questo caso, probabilmente avrai bisogno di un'API per inviare la tua transazione P2SH sulla rete Bitcoin, quindi i test completi saranno ancora possibili in futuro.)
Quali siano gli altri metodi di test che hai utilizzato, testare uno script su Testnet dovrebbe essere il tuo test finale prima di inserire lo script su Mainnet. Non fidarti che il tuo codice sia corretto; non limitarti a guardarlo. Non fidarti nemmeno dei simulatori o debugger che hai utilizzato. Farlo è un altro ottimo modo per perdere fondi su Bitcoin.
Riepilogo: Provare uno script Bitcoin
Dovresti installare btcdeb come strumento da riga di comando per testare i tuoi script Bitcoin. Al momento della stesura di questo articolo, produce risultati accurati che possono passare attraverso l'intero processo di scripting. Puoi anche consultare alcuni siti online per una rappresentazione più visiva. Quando avrai finito, dovrai andare su testnet per assicurarti che le cose funzionino correttamente, prima di eseguire la distribuzione in modo più generale.
Qual è il prossimo argomento?
Continua "Presentazione degli script Bitcoin" con il nostro primo esempio reale: Capitolo 9.4:09_4_Programmare una P2PKH.