Skip to content

Commit 24099cd

Browse files
authored
Merge pull request #335 from javiervargas/patch-21
Chapter 09-3 09_3_Probando_un_Script_Bitcoin.md
2 parents 44f3a51 + ebc0e66 commit 24099cd

File tree

1 file changed

+210
-0
lines changed

1 file changed

+210
-0
lines changed
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
# 9.3: Probando un script de Bitcoin
2+
3+
Bitcoin Scripting permite un control considerable adicional sobre las transacciones de Bitcoin, pero también es algo peligroso. Como describiremos en [§10.1](10_1_Entendiendo_la_Base_de_P2SH.md), los scripts reales están algo aislados de la red Bitcoin, lo que significa que es posible escribir un script y hacer que la red lo acepte incluso si es imposible canjearlo desde ese script. Por lo tanto, debe probar a fondo sus scripts antes de invertir su dinero en ellos.
4+
5+
Por lo tanto, este capítulo describe un método principal para probar los scripts de Bitcoin, que también usaremos para ejemplos ocasionales en el resto de esta sección.
6+
7+
## Instalar btcdeb
8+
9+
Bitcoin Script Debugger (`btcdeb`) de @kallewoof es uno de los métodos más confiables que hemos encontrado para depurar Bitcoin Scripts. Sin embargo, requiere configurar C++ y algunos otros accesorios en su máquina, por lo que también ofreceremos algunas otras opciones hacia el final de este capítulo.
10+
11+
Primero, debe clonar el repositorio `btcdeb` de GitHub, que también requerirá la instalación `git` si aún no lo tiene.
12+
13+
```
14+
$ sudo apt-get install git
15+
$ git clone https://github.com/bitcoin-core/btcdeb.git
16+
```
17+
Tenga en cuenta que cuando ejecute `git clone` se copiará `btcdeb` en su directorio actual. Hemos elegido hacerlo en nuestro directorio `~standup`.
18+
```
19+
$ ls
20+
bitcoin-0.20.0-x86_64-linux-gnu.tar.gz btcdeb laanwj-releases.asc SHA256SUMS.asc
21+
```
22+
Posteriormente debe instalar C++ y otros paquetes requeridos.
23+
```
24+
$ sudo apt-get install autoconf libtool g++ pkg-config make
25+
```
26+
También debe instalar readline, ya que esto hace que el depurador sea mucho más fácil de usar al admitir el historial usando las flechas arriba / abajo, movimiento de izquierda a derecha, autocompletado usando la pestaña y otras buenas interfaces de usuario.
27+
```
28+
$ sudo apt-get install libreadline-dev
29+
```
30+
Ahora está listo para compilar e instalar `btcdeb`:
31+
```
32+
$ cd btcdeb
33+
$ ./autogen.sh
34+
$ ./configure
35+
$ make
36+
$ sudo make install
37+
```
38+
Después de todo eso, debería tener una copia de `btcdeb`:
39+
```
40+
$ which btcdeb
41+
/usr/local/bin/btcdeb
42+
```
43+
44+
## Utilice btcdeb
45+
46+
`btcdeb` funciona como un depurador estándar. Toma una secuencia de comandos (así como cualquier número de entradas de la pila) como argumento de inicio. A continuación, puede usar `step` para recorrer el script.
47+
48+
Si, en cambio, lo inicia sin argumentos, simplemente obtiene un intérprete donde puede emitir `exec [opcode]` comandos para realizar acciones directamente.
49+
50+
### Utilice btcdeb para un ejemplo de adición
51+
52+
El siguiente ejemplo muestra el uso de `btcdeb` para el ejemplo de adición de la sección anterior, `1 2 OP_ADD`
53+
```
54+
$ btcdeb '[1 2 OP_ADD]'
55+
btcdeb 0.2.19 -- type `btcdeb -h` for start up options
56+
warning: ambiguous input 1 is interpreted as a numeric value; use OP_1 to force into opcode
57+
warning: ambiguous input 2 is interpreted as a numeric value; use OP_2 to force into opcode
58+
miniscript failed to parse script; miniscript support disabled
59+
valid script
60+
3 op script loaded. type `help` for usage information
61+
script | stack
62+
--------+--------
63+
1 |
64+
2 |
65+
OP_ADD |
66+
#0000 1
67+
```
68+
Muestra nuestro script inicial, que se ejecuta de arriba a abajo, y también muestra lo que se ejecutará a continuación en el script.
69+
70+
Escribimos `step` y avanza un paso tomando el primer elemento del script y empujándolo a la pila:
71+
```
72+
btcdeb> step
73+
<> PUSH stack 01
74+
script | stack
75+
--------+--------
76+
2 | 01
77+
OP_ADD |
78+
#0001 2
79+
```
80+
Y otra vez:
81+
```
82+
btcdeb> step
83+
<> PUSH stack 02
84+
script | stack
85+
--------+--------
86+
OP_ADD | 02
87+
| 01
88+
#0002 OP_ADD
89+
```
90+
Ahora ejecutamos el `OP_ADD` y hay una gran emoción porque ese código de operación saca los dos primeros elementos de la pila, los suma y luego empuja su suma a la pila.
91+
```
92+
btcdeb> step
93+
<> POP stack
94+
<> POP stack
95+
<> PUSH stack 03
96+
script | stack
97+
--------+--------
98+
| 03
99+
```
100+
Y ahí es donde termina nuestra secuencia de comandos, sin nada más que ejecutar y un `03` posicionado en la parte superior de nuestra pila como resultado de la secuencia de comandos.
101+
102+
> **NOTA:** `btcdeb` permite repetir el comando anterior presionando enter. Haremos esto en los siguientes ejemplos, así que no se sorprenda de las indicaciones `btcdeb` sin nada como entrada. Está simplemente repitiendo el comando previo (a menudo `step`).
103+
104+
### Utilice btcdeb para un ejemplo de resta
105+
106+
La sección anterior también incluyó un ejemplo de secuencias de comandos con resta un poco más compleja : `3 2 OP_ADD 4 OP_SUB`. Así es como se ve:
107+
```
108+
$ btcdeb '[3 2 OP_ADD 4 OP_SUB]'
109+
btcdeb 0.2.19 -- type `btcdeb -h` for start up options
110+
warning: ambiguous input 3 is interpreted as a numeric value; use OP_3 to force into opcode
111+
warning: ambiguous input 2 is interpreted as a numeric value; use OP_2 to force into opcode
112+
warning: ambiguous input 4 is interpreted as a numeric value; use OP_4 to force into opcode
113+
miniscript failed to parse script; miniscript support disabled
114+
valid script
115+
5 op script loaded. type `help` for usage information
116+
script | stack
117+
--------+--------
118+
3 |
119+
2 |
120+
OP_ADD |
121+
4 |
122+
OP_SUB |
123+
#0000 3
124+
btcdeb> step
125+
<> PUSH stack 03
126+
script | stack
127+
--------+--------
128+
2 | 03
129+
OP_ADD |
130+
4 |
131+
OP_SUB |
132+
#0001 2
133+
btcdeb>
134+
<> PUSH stack 02
135+
script | stack
136+
--------+--------
137+
OP_ADD | 02
138+
4 | 03
139+
OP_SUB |
140+
#0002 OP_ADD
141+
btcdeb>
142+
<> POP stack
143+
<> POP stack
144+
<> PUSH stack 05
145+
script | stack
146+
--------+--------
147+
4 | 05
148+
OP_SUB |
149+
#0003 4
150+
btcdeb>
151+
<> PUSH stack 04
152+
script | stack
153+
--------+--------
154+
OP_SUB | 04
155+
| 05
156+
#0004 OP_SUB
157+
btcdeb>
158+
<> POP stack
159+
<> POP stack
160+
<> PUSH stack 01
161+
script | stack
162+
--------+--------
163+
| 01
164+
```
165+
Volveremos a `btcdeb` de vez en cuando, y seguirá siendo una excelente herramienta para probar sus propios scripts.
166+
167+
### Usar el poder de btcdeb
168+
169+
`btcdeb` también tiene algunas funciones más poderosas, como `print` and `stack`, que le muestran el script y la pila en cualquier momento.
170+
171+
Por ejemplo, en la secuencia de comandos anterior, una vez que haya avanzado al comando `OP_ADD`, puede ver lo siguiente:
172+
```
173+
btcdeb> print
174+
#0000 3
175+
#0001 2
176+
-> #0002 OP_ADD
177+
#0003 4
178+
#0004 OP_SUB
179+
btcdeb> stack
180+
<01> 02 (top)
181+
<02> 03
182+
```
183+
El uso de estos comandos puede hacer que sea más fácil ver lo que está sucediendo y dónde se encuentra.
184+
185+
## Probar un script en línea
186+
187+
También hay algunos simuladores web que puede utilizar para probar scripts en línea. Pueden ser superiores a una herramienta de línea de comandos al ofrecer una salida más gráfica, pero también encontramos que tienden a tener deficiencias.
188+
189+
En el pasado, hemos intentado brindar pautas detalladas sobre el uso de sitios como [Script Playground](http://www.crmarsh.com/script-playground/) o [Bitcoin Online Script Debugger](https://bitcoin-script-debugger.visvirial.com/), pero se desactualizan y / o desaparecen demasiado rápido para mantenerse al día con ellos.
190+
191+
Suponga que estos depuradores tienen la gran ventaja de mostrar las cosas visual y explícitamente que le dicen si un script tiene éxito (se desbloquea) o falla (permanece bloqueado). Asumimos que tienen desventajas con las firmas, donde muchos de ellos siempre regresan `true` para las pruebas de firmas o tienen mecanismos muy engorrosos para incorporarlas.
192+
193+
194+
## Pruebe un script con Bitcoin
195+
196+
Incluso con una gran herramienta como `btcdeb` o recursos transitorios como los diversos probadores de scripts en línea, no está trabajando con un ambiente real. No puede garantizar que sigan las reglas de consenso de Bitcoin, lo que significa que no puede garantizar sus resultados. Por ejemplo, Script Playground dice explícitamente que ignora un error implícito en las firmas múltiples de Bitcoin. Esto significa que cualquier código multifirma que pruebe con éxito en Script Playground se romperá en el mundo real.
197+
198+
Entonces, la única forma de probar _realmente_ los scripts de Bitcoin es probándolos en Testnet.
199+
200+
Y como se hace eso? Da la casualidad que es el tema del [capítulo 10](10_0_Embebiendo_Bitcoin_Scripts_en_Transacciones_P2SH.md), que busca introducir estos scripts abstractos en el mundo real de Bitcoin incrustándolos en transacciones P2SH. (Pero incluso entonces, probablemente necesitará una API para impulsar su transacción P2SH a la red Bitcoin, por lo que las pruebas completas seguirán siendo una forma en el futuro).
201+
202+
_Independientemente_ de los otros métodos de prueba que haya utilizado, probar un script en Testnet debería ser su prueba final antes de poner su script en Mainnet. No confíe en que su código sea correcto; no se limite a mirarlo. Ni siquiera confíe en los simuladores o depuradores que ha estado usando. Hacerlo es otra excelente manera de perder fondos en Bitcoin.
203+
204+
## Resumen: probando un script de Bitcoin
205+
206+
Debería instalar `btcdeb` como una herramienta de línea de comandos para probar sus scripts de Bitcoin. En el momento de escribir este artículo, produce resultados precisos que pueden recorrer todo el proceso de creación de scripts. También puede buscar en algunos sitios en línea para obtener una representación más visual. Cuando haya terminado, deberá ir a testnet para asegurarse de que todo funciona correctamente, antes de implementarlo de manera más general.
207+
208+
## ¿Que sigue?
209+
210+
Continue con "Introduciendo Bitcoin Scripts" con nuestro primer ejemplo de la vida real: [§9.4: Codificando una P2PKH](09_4_Codificando_una_P2PKH.md).

0 commit comments

Comments
 (0)