From 48f3e5ae87b3c6b9414e5e7a1a2a4f261bfd0c3b Mon Sep 17 00:00:00 2001 From: Said Rahal Date: Tue, 10 Aug 2021 19:35:06 +0200 Subject: [PATCH 01/13] Create 04_2_Interludio_Usando_JQ --- es/04_2_Interludio_Usando_JQ | 413 +++++++++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 es/04_2_Interludio_Usando_JQ diff --git a/es/04_2_Interludio_Usando_JQ b/es/04_2_Interludio_Usando_JQ new file mode 100644 index 0000000..3a07379 --- /dev/null +++ b/es/04_2_Interludio_Usando_JQ @@ -0,0 +1,413 @@ +# Interludio: Usando JQ + +La creación de una transacción en crudo reveló cómo los resultados más complejos de bitcoin-cli no pueden guardarse fácilmente en variables de línea de comandos. La respuesta es JQ, que permite extraer elementos individuales de JSON más complejos. + +## Instalación de JQ + +JQ esta disponible en [Github repository](https://stedolan.github.io/jq/). Descargar para Linux, OS X, or Windows, según corresponda. + +Una vez que haya descargado el binario, puede instalarlo en su sistema. Si está trabajando en un VPS Debian como sugerimos, tu instalación se verá así: +``` +$ mv jq-linux64 jq +$ sudo /usr/bin/install -m 0755 -o root -g root -t /usr/local/bin jq +``` +> :libro: ***¿Qué es JQ?*** JQ es para datos JSON - puedes usarlo para cortar, filtrar, mapear y transformar datos estructurados con la misma facilidad que , , y sus amigos te permiten jugar con el texto." + +## Utilizar JQ para acceder al valor de un objeto JSON por clave + +**Ejemplo de uso:** _Capturar el hex de una transacción cruda firmada._ + +En la sección anterior, el uso de `signrawtransaction` ofreció un ejemplo de no poder capturar fácilmente los datos en las variables debido al uso de JSON como salida: +``` +$ bitcoin-cli signrawtransactionwithwallet $rawtxhex +{ + "hex": "02000000013a6e4279b799791049e1826602e84d2e36797e2005887b98c3ecf16b01b7f361010000006a4730440220335d15a2a2ca3ce6a302ce041686739d4a38eb0599a5ea08305de71965268d05022015f77a33cf7d613015b2aba5beb03088033625505ad5d4d0624defdbea22262b01210278608b54b8fb0d8379d3823d31f03a7c6ab0adffb07dd3811819fdfc34f8c132ffffffff01409c0000000000001976a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac00000000", + "complete": true +} +``` +Afortunadamente, JQ puede capturar fácilmente este tipo de datos. + +Para utilizar JQ, ejecute `jq` en el extremo posterior de una tubería, y utilice siempre la invocación estándar de `jq -r '.'`. El `-r` le dice a JQ que produzca una salida cruda, que funcionará para las variables de la línea de comandos, mientras que el `.` le dice a jq que salga. Protegemos ese argumento en `' ` porque necesitaremos esa protección más adelante cuando nuestras invocaciones de `jq` se vuelvan más complejas. + +Para capturar un valor específico de un objeto JSON, basta con enumerar la clave después del `.`: +``` +$ bitcoin-cli signrawtransactionwithwallet $rawtxhex | jq -r '.hex' +02000000013a6e4279b799791049e1826602e84d2e36797e2005887b98c3ecf16b01b7f361010000006a4730440220335d15a2a2ca3ce6a302ce041686739d4a38eb0599a5ea08305de71965268d05022015f77a33cf7d613015b2aba5beb03088033625505ad5d4d0624defdbea22262b01210278608b54b8fb0d8379d3823d31f03a7c6ab0adffb07dd3811819fdfc34f8c132ffffffff01409c0000000000001976a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac00000000 +``` +Con esa herramienta en la mano, puede capturar información de objetos JSON en variables de línea de comandos: +``` +$ signedtx=$(bitcoin-cli signrawtransactionwithwallet $rawtxhex | jq -r '.hex') +$ echo $signedtx +02000000013a6e4279b799791049e1826602e84d2e36797e2005887b98c3ecf16b01b7f361010000006a4730440220335d15a2a2ca3ce6a302ce041686739d4a38eb0599a5ea08305de71965268d05022015f77a33cf7d613015b2aba5beb03088033625505ad5d4d0624defdbea22262b01210278608b54b8fb0d8379d3823d31f03a7c6ab0adffb07dd3811819fdfc34f8c132ffffffff01409c0000000000001976a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac00000000 +``` +Así podrá utilizar esas variables fácilmente y sin errores: +``` +$ bitcoin-cli sendrawtransaction $signedtx +3f9ccb6e16663e66dc119de1866610cc4f7a83079bfec2abf0598ed3adf10a78 +``` +## Utilizar JQ para acceder a los valores de un objeto JSON en una Arreglo por clave + +**Ejemplo de uso:** _Capturar el txid y vout para un UTXO seleccionado._ + +Sacar datos de un objeto JSON es fácil, pero ¿Qué pasa si ese objeto JSON está en un arreglo JSON? El comando `listunspent` ofrece un gran ejemplo, porque normalmente contendrá un número de transacciones diferentes. ¿Y si quieres capturar información específica de _una_ de ellas? + +Cuando se trabaja con un array JSON, lo primero que hay que hacer es decirle a JQ a qué índice debe acceder. Por ejemplo, puede que hayas mirado tus transacciones en `listunspent` y hayas decidido que quieres trabajar con la segunda de ellas. Usas `'.[1]'` para acceder a ese primer elemento. El `[]` dice que estamos haciendo referencia a un arreglo JSON y el `0` dice que queremos el índice 0. +``` +$ bitcoin-cli listunspent | jq -r '.[1]' +{ + "txid": "91261eafae15ea53dedbea7c1db748c52bbc04a85859ffd0d839bda1421fda4c", + "vout": 0, + "address": "mjehC2KHzXcBDcwTd4LhZ2GzyzrZ3Kd3ff", + "label": "", + "scriptPubKey": "76a9142d573900aa357a38afd741fbf24b075d263ea6e088ac", + "amount": 0.00022, + "confirmations": 9, + "spendable": true, + "solvable": true, + "desc": "pkh([d6043800/0'/0'/3']0278608b54b8fb0d8379d3823d31f03a7c6ab0adffb07dd3811819fdfc34f8c132)#nhjc3f8y", + "safe": true +} +``` +A continuación, puede capturar un valor individual de esa arreglo seleccionada (1) utilizando una tubería _dentro_ de los argumentos JQ; y luego (2) solicitando el valor específico después, como en el ejemplo anterior. Lo siguiente capturaría el `txid` del objeto JSON número 0 del arreglo JSON producido por `listunspent`: +``` +$ bitcoin-cli listunspent | jq -r '.[1] | .txid' +91261eafae15ea53dedbea7c1db748c52bbc04a85859ffd0d839bda1421fda4c +``` +Observe cuidadosamente cómo las `' 's` van alrededor de toda la expresión JQ _incluyendo_ la tubería. + +Este método se puede utilizar para rellenar las variables de un UTXO que se quiera utilizar: +``` +$ newtxid=$(bitcoin-cli listunspent | jq -r '.[1] | .txid') +$ newvout=$(bitcoin-cli listunspent | jq -r '.[1] | .vout') +$ echo $newtxid +91261eafae15ea53dedbea7c1db748c52bbc04a85859ffd0d839bda1421fda4c +$ echo $newvout +0 +``` +¡Voila! Ahora podemos crear una nueva transacción en crudo utilizando nuestro primer UTXO como entrada, ¡Sin tener que teclear ninguna información del UTXO a mano! + +## Utilizar JQ para acceder a valores de objetos JSON coincidentes con un arreglo por clave + +**Ejemplo de uso:** _Lista el valor de todos los UTXOs no gastados._ + +En lugar de acceder a un único valor específico en un objeto JSON específico, se puede acceder a todo un valor específico en todos los objetos JSON. Esto se hace con `.[]`, donde no se especifica ningún índice. Por ejemplo, esto listaría todos los fondos no gastados: +``` +$ bitcoin-cli listunspent | jq -r '.[] | .amount' +0.0001 +0.00022 +``` + +## Utilizar JQ para cálculos sencillos por clave + +**Ejemplo de uso:** _Sumar el valor de todos los UTXOs no gastados._ + +En este punto, puede empezar a usar la salida de JQ para hacer cálculos sencillos. Por ejemplo, sumando los valores de esas transacciones no gastadas con un simple script `awk` te dara el equivalente a `getbalance`: +``` +$ bitcoin-cli listunspent | jq -r '.[] | .amount' | awk '{s+=$1} END {print s}' +0.00032 +$ bitcoin-cli getbalance +0.00032000 +``` + +## Usar JQ para mostrar múltiples valores de objetos JSON en un arreglo de claves múltiples + +**Ejemplo de uso:** _Lista de información de uso para todos los UTXOs._ + +JQ puede capturar fácilmente elementos individuales de objetos JSON y arreglos y colocar esos elementos en variables. Ese será su principal uso en futuras secciones. Sin embargo, también se puede utilizar para reducir las enormes cantidades de información emitidas por `bitcoin-cli` en cantidades razonables de información. + +Por ejemplo, puede querer ver un listado de todos sus UTXOs (`.[]`) y obtener un listado de toda su información más importante (`.txid, .vout, .amount`): +``` +$ bitcoin-cli listunspent | jq -r '.[] | .txid, .vout, .amount' +ca4898d8f950df03d6bfaa00578bd0305d041d24788b630d0c4a32debcac9f36 +0 +0.0001 +91261eafae15ea53dedbea7c1db748c52bbc04a85859ffd0d839bda1421fda4c +0 +0.00022 +``` +Esto hace que sea fácil decidir qué UTXOs gastar en una transacción en crudo, pero no es muy bonito. + +Afortunadamente, JQ también te permite ser elegante. Puedes usar `{}`s para crear nuevos objetos JSON (ya sea para un análisis adicional o para una salida bonita). También puede definir el nombre de la nueva clave para cada uno de sus valores. La salida resultante debería ser mucho más intuitiva y menos propensa a errores (aunque, obviamente, menos útil para volcar información directamente en las variables). + +El siguiente ejemplo muestra exactamente el mismo análisis de `listunspent`, pero con cada objeto JSON antiguo reconstruido como un nuevo objeto JSON abreviado, con todos los nuevos valores nombrados con sus antiguas claves: +``` +$ bitcoin-cli listunspent | jq -r '.[] | { txid: .txid, vout: .vout, amount: .amount }' +{ + "txid": "ca4898d8f950df03d6bfaa00578bd0305d041d24788b630d0c4a32debcac9f36", + "vout": 0, + "amount": 0.0001 +} +{ + "txid": "91261eafae15ea53dedbea7c1db748c52bbc04a85859ffd0d839bda1421fda4c", + "vout": 0, + "amount": 0.00022 +} +``` +You could of course rename your new keys as you see fit. There's nothing magic in the original names: +``` +$ bitcoin-cli listunspent | jq -r '.[] | { tx: .txid, output: .vout, bitcoins: .amount }' +{ + "tx": "ca4898d8f950df03d6bfaa00578bd0305d041d24788b630d0c4a32debcac9f36", + "output": 0, + "bitcoins": 0.0001 +} +{ + "tx": "91261eafae15ea53dedbea7c1db748c52bbc04a85859ffd0d839bda1421fda4c", + "output": 0, + "bitcoins": 0.00022 +} +``` +## Utilizar JQ para acceder a objetos JSON por valor de búsqueda + +**Ejemplo de uso:** _Buscar automáticamente los UTXOs que se utilizan en una transacción._ + +Hasta ahora, las búsquedas en JQ han sido bastante sencillas: se utiliza una clave para buscar uno o más valores en un objeto o arreglo JSON. ¿Pero qué pasa si quieres buscar un valor en un objeto JSON... por otro valor? Este tipo de búsqueda indirecta tiene una aplicación real cuando se trabaja con transacciones construidas sobre UTXOs existentes. Por ejemplo, puede permitirte calcular el valor de la suma de los UTXOs que se utilizan en una transacción, algo que es de vital importancia. + +Este ejemplo utiliza la siguiente transacción en crudo. Tenga en cuenta que esta es una transacción cruda más compleja con dos entradas y dos salidas. Aprenderemos a hacerlas en próximas secciones; por ahora, es necesario para poder ofrecer ejemplos robustos. Observa que, a diferencia de nuestros ejemplos anteriores, éste tiene dos objetos en su matriz `vin` y dos en su matriz `vout`. +``` +$ bitcoin-cli decoderawtransaction $rawtxhex +{ + "txid": "6f83a0b78c598de01915554688592da1d7a3047eacacc8a9be39f5396bf0a07e", + "hash": "6f83a0b78c598de01915554688592da1d7a3047eacacc8a9be39f5396bf0a07e", + "size": 160, + "vsize": 160, + "version": 2, + "locktime": 0, + "vin": [ + { + "txid": "d261b9494eb29084f668e1abd75d331fc2d6525dd206b2f5236753b5448ca12c", + "vout": 1, + "scriptSig": { + "asm": "", + "hex": "" + }, + "sequence": 4294967295 + }, + { + "txid": "c7c7f6371ec19330527325908a544bbf8401191645598301d24b54d37e209e7b", + "vout": 1, + "scriptSig": { + "asm": "", + "hex": "" + }, + "sequence": 4294967295 + } + ], + "vout": [ + { + "value": 1.00000000, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 cfc39be7ea3337c450a0c77a839ad0e160739058 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914cfc39be7ea3337c450a0c77a839ad0e16073905888ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "mzTWVv2QSgBNqXx7RC56zEhaQPve8C8VS9" + ] + } + }, + { + "value": 0.04500000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 166692bda9f25ced145267bb44286e8ee3963d26 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914166692bda9f25ced145267bb44286e8ee3963d2688ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "mhZQ3Bih6wi7jP1tpFZrCcyr4NsfCapiZP" + ] + } + } + ] +} +``` + +### Recuperar el(los) valor(es) + +Supongamos que sabemos exactamente cómo se construye esta transacción: sabemos que utiliza dos UTXOs como entrada. Para recuperar el txid de los dos UTXOs, podríamos usar `jq` para buscar el valor .vin de la transacción, luego referenciar el arreglo 0 del .vin, y luego el valor .txid de ese arreglo. Después, podríamos hacer lo mismo con el 1er arreglo, y luego lo mismo con los dos valores .vout del .vin. Fácil: +``` +$ usedtxid1=$(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[0] | .txid') +$ echo $usedtxid1 +d261b9494eb29084f668e1abd75d331fc2d6525dd206b2f5236753b5448ca12c +$ usedtxid2=$(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[1] | .txid') +$ echo $usedtxid2 +c7c7f6371ec19330527325908a544bbf8401191645598301d24b54d37e209e7b + +$ usedvout1=$(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[0] | .vout') +$ echo $usedvout1 +1 +$ usedvout2=$(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[1] | .vout') +$ echo $usedvout2 +1 +``` +Sin embargo, sería mejor tener un caso general que _automáticamente_ guardara todos los txids de nuestros UTXOs. + +Ya sabemos que podemos acceder a todos los `.txid`s utilizando un valor de matriz `.[]`. Podemos usar eso para construir una búsqueda general de .txid: +``` +$ usedtxid=($(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[] | .txid')) +$ echo ${usedtxid[0]} +d261b9494eb29084f668e1abd75d331fc2d6525dd206b2f5236753b5448ca12c +$ echo ${usedtxid[1]} +c7c7f6371ec19330527325908a544bbf8401191645598301d24b54d37e209e7b + +$ usedvout=($(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[] | .vout')) +$ echo ${usedvout[0]} +1 +$ echo ${usedvout[1]} +1 +``` +El único truco real aquí es cómo guardamos la información usando el shell bash. En lugar de guardar en una variable con `$(comando)`, guardamos en una matriz con `($(comando))`. Entonces pudimos acceder a los elementos individuales de la matriz bash con una construcción `${variable[n]}`. En cambio, podíamos acceder a todo el arreglo con `${variable[@]}`. (Sí, nadie dijo nunca que bash fuera bonito). + +> :advertencia: **ADVERTENCIA:** Recuerde siempre que un UTXO es una transacción _más_ un vout. La primera vez que escribimos este ejemplo de JQ se nos escapó el vout, y dejó de funcionar cuando acabamos con una situación en la que nos habían enviado dos `vouts` de la misma transacción. + +### Recuperar los objetos relacionados + +Ahora puede utilizar la información guardada de `txid` y `vout` para referenciar UTXOs en `listunspent`. Para encontrar la información sobre los UTXOs que están siendo utilizados por la transacción en crudo, es necesario buscar en todo el arreglo JSON (`[]`) de las transacciones no gastadas. A continuación, puede seleccionar (`select`) objetos JSON individuales que incluyan (`contains`) los txids. A continuación, seleccione (`select`) las transacciones que también contengan (`contain`) la salida correcta vout. + +El uso de otro nivel de tuberías es la metodología estándar de JQ: se toma un conjunto de datos, luego se reduce a todas las transacciones relevantes, luego se reduce a los vouts que realmente se usaron de esas transacciones. Sin embargo, los argumentos `select` y `contains` son algo nuevo. Muestran algo de la complejidad de JSON que va más allá del alcance de este tutorial; por ahora, solo hay que saber que esta invocación particular funcionará para agarrar objetos que coincidan. + +Para empezar de forma sencilla, esto escoge los dos UTXO de uno en uno: +``` +$ bitcoin-cli listunspent | jq -r '.[] | select (.txid | contains("'${usedtxid[0]}'")) | select(.vout | contains('${usedvout[0]}'))' +{ + "txid": "d261b9494eb29084f668e1abd75d331fc2d6525dd206b2f5236753b5448ca12c", + "vout": 1, + "address": "miSrC3FvkPPZgqqvCiQycq7io7wTSVsAFH", + "scriptPubKey": "76a91420219e4f3c6bc0f6524d538009e980091b3613e888ac", + "amount": 0.9, + "confirmations": 6, + "spendable": true, + "solvable": true +} +$ bitcoin-cli listunspent | jq -r '.[] | select (.txid | contains("'${usedtxid[1]}'")) | select(.vout | contains('${usedvout[1]}'))' +{ + "txid": "c7c7f6371ec19330527325908a544bbf8401191645598301d24b54d37e209e7b", + "vout": 1, + "address": "mzizSuAy8aL1ytFijds7pm4MuDPx5aYH5Q", + "scriptPubKey": "76a914d2b12da30320e81f2dfa416c5d9499d08f778f9888ac", + "amount": 0.4, + "confirmations": 5, + "spendable": true, + "solvable": true +} +``` +Un simple bucle for-loop de bash podría, en cambio, traer _todos_ sus UTXOs: +``` +$ for ((i=0; i<${#usedtxid[*]}; i++)); do txid=${usedtxid[i]}; vout=${usedvout[i]}; bitcoin-cli listunspent | jq -r '.[] | select (.txid | contains("'${txid}'")) | select(.vout | contains('$vout'))'; done; +{ + "txid": "d261b9494eb29084f668e1abd75d331fc2d6525dd206b2f5236753b5448ca12c", + "vout": 1, + "address": "miSrC3FvkPPZgqqvCiQycq7io7wTSVsAFH", + "scriptPubKey": "76a91420219e4f3c6bc0f6524d538009e980091b3613e888ac", + "amount": 0.9, + "confirmations": 7, + "spendable": true, + "solvable": true +} +{ + "txid": "c7c7f6371ec19330527325908a544bbf8401191645598301d24b54d37e209e7b", + "vout": 1, + "address": "mzizSuAy8aL1ytFijds7pm4MuDPx5aYH5Q", + "scriptPubKey": "76a914d2b12da30320e81f2dfa416c5d9499d08f778f9888ac", + "amount": 0.4, + "confirmations": 6, + "spendable": true, + "solvable": true +} + +``` +Obsérvese que hemos utilizado otra parte de la fealdad de la arreglo `${#usedtxid[*]}` para determinar el tamaño de la arreglo, y luego hemos accedido a cada valor en el arreglo `usedtxid` y a cada valor en el arreglo paralelo `usedvout`, colocándolos en variables más simples para un acceso menos feo. + +## Utilizar JSON para el cálculo simple por valor + +**Ejemplo de uso:** _Calcular automáticamente el valor de los UTXOs utilizados en una transacción._ + +Ahora puedes ir un paso más allá, y solicitar el .amount (o cualquier otro valor-clave JSON) de los UTXOs que estás recuperando. + +Este ejemplo repite el uso de las arreglos `$usedtxid` y `$usedvout` que fueron establecidas de la siguiente manera: +``` +$ usedtxid=($(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[] | .txid')) +$ usedvout=($(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[] | .vout')) +``` +El mismo script `for` se puede utilizar para recorrer esos arreglos, pero con una tubería añadida en el JQ da salida al valor `amount` para cada uno de los UTXOs seleccionados. +``` +$ for ((i=0; i<${#usedtxid[*]}; i++)); do txid=${usedtxid[i]}; vout=${usedvout[i]}; bitcoin-cli listunspent | jq -r '.[] | select (.txid | contains("'${txid}'")) | select(.vout | contains('$vout')) | .amount'; done; +0.9 +0.4 +``` +En este punto, también se pueden sumar las .cantidades con un script `awk`, para ver realmente cuánto dinero hay en los UTXOs que la transacción está gastando: +``` +$ for ((i=0; i<${#usedtxid[*]}; i++)); do txid=${usedtxid[i]}; vout=${usedvout[i]}; bitcoin-cli listunspent | jq -r '.[] | select (.txid | contains("'${txid}'")) | select(.vout | contains('$vout')) | .amount'; done | awk '{s+=$1} END {print s}' +1.3 +``` +¡Uf! + +## Utilizar JQ para cálculos complejos + +**Ejemplo de uso:** _Calcular la tasa de una transacción._ + +Para calcular la tarifa completa de la transacción en este punto sólo hace falta un poco más de matemáticas: determinar cuánto dinero pasa por el .vout. Este es un uso sencillo de JQ en el que simplemente se utiliza `awk` para sumar el `valor` de toda la información de `vout`: +``` +$ bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vout [] | .value' | awk '{s+=$1} END {print s}' +1.045 +``` +Para completar el cálculo de la tasa de transacción, se resta el importe de .vout (1,045) del importe de .vin (1,3). + +Para ello, tendrá que instalar `bc`: +``` +$ sudo apt-get intall bc +``` + +Al juntar todo esto se crea una calculadora completa en sólo cinco líneas de script: +``` +$ usedtxid=($(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[] | .txid')) +$ usedvout=($(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vin | .[] | .vout')) +$ btcin=$(for ((i=0; i<${#usedtxid[*]}; i++)); do txid=${usedtxid[i]}; vout=${usedvout[i]}; bitcoin-cli listunspent | jq -r '.[] | select (.txid | contains("'${txid}'")) | select(.vout | contains('$vout')) | .amount'; done | awk '{s+=$1} END {print s}') +$ btcout=$(bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vout [] | .value' | awk '{s+=$1} END {print s}') +$ echo "$btcin-$btcout"| /usr/bin/bc +.255 +``` +Y este es también un buen ejemplo de por qué hay que comprobar dos veces las tarifas: teníamos la intención de enviar una tarifa de transacción de 5.000 satoshis, pero enviamos 255.000 satoshis en su lugar. ¡Ups! + +> :advertencia: **ADVERTENCIA:** La primera vez que escribimos esta lección, realmente calculamos mal nuestra tarifa y no lo vimos hasta que ejecutamos nuestra calculadora de tarifas. Es *así de fácil*, luego su dinero se esfuma. (El ejemplo de arriba es en realidad de nuestra segunda iteración de la calculadora, y esa vez cometimos el error a propósito). + +Para más magia de JSON (y si algo de esto no está claro), por favor lee el [Manual de JSON](https://stedolan.github.io/jq/manual/) y el [JSON Cookbook](https://github.com/stedolan/jq/wiki/Cookbook). Usaremos regularmente JQ en futuros ejemplos. + +## Crear nuevos alias + +El código JQ puede ser un poco difícil de manejar, así que deberías considerar añadir algunas invocaciones más largas e interesantes a tu ~/.bash_profile. + +Cada vez que busques una gran cantidad de información en un objeto JSON emitido por un comando `bitcoin-cli`, considera escribir un alias para reducirlo a lo que quieres ver. +``` +alias btcunspent="bitcoin-cli listunspent | jq -r '.[] | { txid: .txid, vout: .vout, amount: .amount }'" +``` + +## Ejecutar el script comisión por transacción + +El [Fee Calculation Script](src/04_2_i_txfee-calc.sh) está disponible en el directorio src-code. Puede descargarlo y guardarlo como `txfee-calc.sh`. + +> :advertencia: **ADVERTENCIA:** Este script no ha sido verificado de forma robusta. Si va a utilizarlo para verificar las comisiones de las transacciones reales, sólo deberá hacerlo como triple comprobación después de haber hecho todos los cálculos usted mismo. + +Asegúrese de que los permisos del script son correctos: +``` +$ chmod 755 txfee-calc.sh +``` +A continuación, puede ejecutar el script de la siguiente manera: +``` +$ ./txfee-calc.sh $rawtxhex +.255 +``` +También puedes crear un alias: +``` +alias btctxfee="~/txfee-calc.sh" +``` + +## Resumen: Usando JQ + +JQ facilita la extracción de información de arreglos y objetos JSON. También se puede utilizar en scripts de shell para realizar cálculos bastante complejos que le harán la vida más fácil. + +## ¿Qué sigue? + +Continua "Enviando Transacciones en Bitcoin" con [§4.3 Creando Transacciones en Crudo Usando Argumentos con Nombre](04_3_Creating_a_Raw_Transaction_with_Named_Arguments.md). From 77bcee3472162843c14446041e8ab281473dc5b0 Mon Sep 17 00:00:00 2001 From: Said Rahal Date: Sat, 28 Aug 2021 01:34:33 +0200 Subject: [PATCH 02/13] Update and rename 04_2_Interludio_Usando_JQ to 04_2_Interludio_Usando_JQ.md --- ...Usando_JQ => 04_2_Interludio_Usando_JQ.md} | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) rename es/{04_2_Interludio_Usando_JQ => 04_2_Interludio_Usando_JQ.md} (89%) diff --git a/es/04_2_Interludio_Usando_JQ b/es/04_2_Interludio_Usando_JQ.md similarity index 89% rename from es/04_2_Interludio_Usando_JQ rename to es/04_2_Interludio_Usando_JQ.md index 3a07379..a445255 100644 --- a/es/04_2_Interludio_Usando_JQ +++ b/es/04_2_Interludio_Usando_JQ.md @@ -11,7 +11,7 @@ Una vez que haya descargado el binario, puede instalarlo en su sistema. Si está $ mv jq-linux64 jq $ sudo /usr/bin/install -m 0755 -o root -g root -t /usr/local/bin jq ``` -> :libro: ***¿Qué es JQ?*** JQ es para datos JSON - puedes usarlo para cortar, filtrar, mapear y transformar datos estructurados con la misma facilidad que , , y sus amigos te permiten jugar con el texto." +> :book: ***¿Qué es JQ?*** jq es como sed para datos JSON - puede usarlo para cortar y filtrar y mapear y transformar datos estructurados con la misma facilidad que sed, awk, grep y amigos se permiten jugar con el texto". ## Utilizar JQ para acceder al valor de un objeto JSON por clave @@ -49,9 +49,9 @@ $ bitcoin-cli sendrawtransaction $signedtx **Ejemplo de uso:** _Capturar el txid y vout para un UTXO seleccionado._ -Sacar datos de un objeto JSON es fácil, pero ¿Qué pasa si ese objeto JSON está en un arreglo JSON? El comando `listunspent` ofrece un gran ejemplo, porque normalmente contendrá un número de transacciones diferentes. ¿Y si quieres capturar información específica de _una_ de ellas? +Sacar datos de un objeto JSON es fácil, pero ¿Qué pasa si ese objeto JSON está en un arreglo JSON? El comando `listunspent` ofrece un gran ejemplo, porque normalmente contendrá un número de transacciones diferentes. ¿Y si quiere capturar información específica de _una_ de ellas? -Cuando se trabaja con un array JSON, lo primero que hay que hacer es decirle a JQ a qué índice debe acceder. Por ejemplo, puede que hayas mirado tus transacciones en `listunspent` y hayas decidido que quieres trabajar con la segunda de ellas. Usas `'.[1]'` para acceder a ese primer elemento. El `[]` dice que estamos haciendo referencia a un arreglo JSON y el `0` dice que queremos el índice 0. +Cuando se trabaja con un array JSON, lo primero que hay que hacer es decirle a JQ a qué índice debe acceder. Por ejemplo, puede que haya mirado sus transacciones en `listunspent` y que haya decidido que quiere trabajar con la segunda de ellas. Usas `'.[1]'` para acceder a ese primer elemento. El `[]` dice que estamos haciendo referencia a un arreglo JSON y el `0` dice que queremos el índice 0. ``` $ bitcoin-cli listunspent | jq -r '.[1]' { @@ -127,7 +127,7 @@ ca4898d8f950df03d6bfaa00578bd0305d041d24788b630d0c4a32debcac9f36 ``` Esto hace que sea fácil decidir qué UTXOs gastar en una transacción en crudo, pero no es muy bonito. -Afortunadamente, JQ también te permite ser elegante. Puedes usar `{}`s para crear nuevos objetos JSON (ya sea para un análisis adicional o para una salida bonita). También puede definir el nombre de la nueva clave para cada uno de sus valores. La salida resultante debería ser mucho más intuitiva y menos propensa a errores (aunque, obviamente, menos útil para volcar información directamente en las variables). +Afortunadamente, JQ también le permite ser elegante. Puede usar `{}`s para crear nuevos objetos JSON (ya sea para un análisis adicional o para una salida bonita). También puede definir el nombre de la nueva clave para cada uno de sus valores. La salida resultante debería ser mucho más intuitiva y menos propensa a errores (aunque, obviamente, menos útil para volcar información directamente en las variables). El siguiente ejemplo muestra exactamente el mismo análisis de `listunspent`, pero con cada objeto JSON antiguo reconstruido como un nuevo objeto JSON abreviado, con todos los nuevos valores nombrados con sus antiguas claves: ``` @@ -143,7 +143,7 @@ $ bitcoin-cli listunspent | jq -r '.[] | { txid: .txid, vout: .vout, amount: .am "amount": 0.00022 } ``` -You could of course rename your new keys as you see fit. There's nothing magic in the original names: +Por supuesto, puede cambiar el nombre de sus nuevas llaves como mejor se parezca. No hay nada mágico en los nombres originales. ``` $ bitcoin-cli listunspent | jq -r '.[] | { tx: .txid, output: .vout, bitcoins: .amount }' { @@ -260,7 +260,7 @@ $ echo ${usedvout[1]} ``` El único truco real aquí es cómo guardamos la información usando el shell bash. En lugar de guardar en una variable con `$(comando)`, guardamos en una matriz con `($(comando))`. Entonces pudimos acceder a los elementos individuales de la matriz bash con una construcción `${variable[n]}`. En cambio, podíamos acceder a todo el arreglo con `${variable[@]}`. (Sí, nadie dijo nunca que bash fuera bonito). -> :advertencia: **ADVERTENCIA:** Recuerde siempre que un UTXO es una transacción _más_ un vout. La primera vez que escribimos este ejemplo de JQ se nos escapó el vout, y dejó de funcionar cuando acabamos con una situación en la que nos habían enviado dos `vouts` de la misma transacción. +> :warning: **ADVERTENCIA:** Recuerde siempre que un UTXO es una transacción _más_ un vout. La primera vez que escribimos este ejemplo de JQ se nos escapó el vout, y dejó de funcionar cuando acabamos con una situación en la que nos habían enviado dos `vouts` de la misma transacción. ### Recuperar los objetos relacionados @@ -371,15 +371,15 @@ $ echo "$btcin-$btcout"| /usr/bin/bc ``` Y este es también un buen ejemplo de por qué hay que comprobar dos veces las tarifas: teníamos la intención de enviar una tarifa de transacción de 5.000 satoshis, pero enviamos 255.000 satoshis en su lugar. ¡Ups! -> :advertencia: **ADVERTENCIA:** La primera vez que escribimos esta lección, realmente calculamos mal nuestra tarifa y no lo vimos hasta que ejecutamos nuestra calculadora de tarifas. Es *así de fácil*, luego su dinero se esfuma. (El ejemplo de arriba es en realidad de nuestra segunda iteración de la calculadora, y esa vez cometimos el error a propósito). +> :warning: **ADVERTENCIA:** La primera vez que escribimos esta lección, realmente calculamos mal nuestra tarifa y no lo vimos hasta que ejecutamos nuestra calculadora de tarifas. Es *así de fácil*, luego su dinero se esfuma. (El ejemplo de arriba es en realidad de nuestra segunda iteración de la calculadora, y esa vez cometimos el error a propósito). Para más magia de JSON (y si algo de esto no está claro), por favor lee el [Manual de JSON](https://stedolan.github.io/jq/manual/) y el [JSON Cookbook](https://github.com/stedolan/jq/wiki/Cookbook). Usaremos regularmente JQ en futuros ejemplos. ## Crear nuevos alias -El código JQ puede ser un poco difícil de manejar, así que deberías considerar añadir algunas invocaciones más largas e interesantes a tu ~/.bash_profile. +El código JQ puede ser un poco difícil de manejar, así que debería considerar añadir algunas invocaciones más largas e interesantes a tu ~/.bash_profile. -Cada vez que busques una gran cantidad de información en un objeto JSON emitido por un comando `bitcoin-cli`, considera escribir un alias para reducirlo a lo que quieres ver. +Cada vez que busque una gran cantidad de información en un objeto JSON emitido por un comando `bitcoin-cli`, considera escribir un alias para reducirlo a lo que quiere ver. ``` alias btcunspent="bitcoin-cli listunspent | jq -r '.[] | { txid: .txid, vout: .vout, amount: .amount }'" ``` @@ -388,7 +388,7 @@ alias btcunspent="bitcoin-cli listunspent | jq -r '.[] | { txid: .txid, vout: .v El [Fee Calculation Script](src/04_2_i_txfee-calc.sh) está disponible en el directorio src-code. Puede descargarlo y guardarlo como `txfee-calc.sh`. -> :advertencia: **ADVERTENCIA:** Este script no ha sido verificado de forma robusta. Si va a utilizarlo para verificar las comisiones de las transacciones reales, sólo deberá hacerlo como triple comprobación después de haber hecho todos los cálculos usted mismo. +> :warning: **ADVERTENCIA:** Este script no ha sido verificado de forma robusta. Si va a utilizarlo para verificar las comisiones de las transacciones reales, sólo deberá hacerlo como triple comprobación después de haber hecho todos los cálculos usted mismo. Asegúrese de que los permisos del script son correctos: ``` @@ -399,7 +399,7 @@ A continuación, puede ejecutar el script de la siguiente manera: $ ./txfee-calc.sh $rawtxhex .255 ``` -También puedes crear un alias: +También puede crear un alias: ``` alias btctxfee="~/txfee-calc.sh" ``` @@ -410,4 +410,4 @@ JQ facilita la extracción de información de arreglos y objetos JSON. También ## ¿Qué sigue? -Continua "Enviando Transacciones en Bitcoin" con [§4.3 Creando Transacciones en Crudo Usando Argumentos con Nombre](04_3_Creating_a_Raw_Transaction_with_Named_Arguments.md). +Continua "Enviando Transacciones en Bitcoin" con [§4.3 Creando Transacciones en Cruda con Argumentos Ingresados con Nombre](04_3_Creando_una_Transaccion_Cruda_con_Argumentos_Ingresados_con_Nombre.md). From 24bde9990f0b4d05243e0ef84b0c8710135c15d0 Mon Sep 17 00:00:00 2001 From: Ian Culp <57159226+icculp@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:34:16 -0500 Subject: [PATCH 03/13] Chapter 3.0 translated, pending review --- ..._0_Entendiendo_Su_Configuracion_Bitcoin.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md diff --git a/es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md b/es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md new file mode 100644 index 0000000..db19b68 --- /dev/null +++ b/es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md @@ -0,0 +1,31 @@ +# Capítulo Tres: Entendiendo Su Configuración Bitcoin + +Ahora está listo para comenzar a trabajar con la interfaz de línea de comandos `bitcoin-cli`. Pero eso primero requiere que comprenda la configuración de Bitcoin y las características de su billetera, que es lo que se explicará en este capítulo. + +Para este y futuros capítulos, suponemos que tienes un VPS con Bitcoin instalado, ejecutando `bitcoind`. También suponemos que está conectado a testnet, lo que le permite acceder a bitcoins sin utilizar fondos reales. Puede hacerlo con Bitcoin Standup en Linode.com, según [§2.1: Configuración de un Servidor Privado Virtual de Bitcoin-Core con Bitcoin Standup](02_1_Configurando_un_Bitcoin-Core_VPS_con_StackScript.md), o por otros medios, según [§2.2: Configuración de una Maquina Bitcoin-Core por Otros Medios](02_2_Configurando_Bitcoin_Core_Otros.md). + +## Objetivos de este capítulo + +Después de trabajar en este capítulo, un desarrollador podrá: + + * Demuestre que su nodo Bitcoin está instalado y actualizado + * Cree una dirección para recibir fondos de Bitcoin + * Usar comandos básicos de billetera + * Crear una dirección a partir de un descriptor + +Los objetivos de apoyo incluyen la capacidad de: + + * Comprender el diseño básico de archivos de Bitcoin + * Usar comandos informativos básicos + * Comprenda qué es una dirección de Bitcoin + * Comprender qué es una billetera + * Comprender cómo importar direcciones + +## Tabla de contenido + +* [Sección Uno: Verificando Su Configuración Bitcoin](03_1_Verificando_Su_Configuracion_Bitcoin.md) +* [Sección Dos: Conociendo Su Configuración Bitcoin](03_2_Conociendo_Su_Configuracion_Bitcoin.md) +* [Sección Three: Configurando Su Billetera](03_3_Configurando_Su_Billetera.md) + * [Interludio: Usando Variables de la Linea de Comandos](03_3_Interludio_Usando_Variables_Linea_Comando.md) +* [Sección Recibiendo una Transacción](03_4_Recibiendo_una_Transaccion.md) +* [Sección Cinco: Entendiendo El Descriptor](03_5_Entendiendo_El_Descriptor.md) From 2ccb199fa1571047ab3ed5c489c7c5df0aea7bcb Mon Sep 17 00:00:00 2001 From: Cesar Alvarez Vallero Date: Wed, 22 Sep 2021 22:17:47 -0300 Subject: [PATCH 04/13] Rename file The old file name was breaking the README file link. --- ...ciones.md => 09_1_Entendiendo_la_Base_de_las_Transacciones.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename es/{09_1_Entendiendo_la_base_de_las_Transacciones.md => 09_1_Entendiendo_la_Base_de_las_Transacciones.md} (100%) diff --git a/es/09_1_Entendiendo_la_base_de_las_Transacciones.md b/es/09_1_Entendiendo_la_Base_de_las_Transacciones.md similarity index 100% rename from es/09_1_Entendiendo_la_base_de_las_Transacciones.md rename to es/09_1_Entendiendo_la_Base_de_las_Transacciones.md From 801a45f0e170ef99bb6c237701d4a9480f763401 Mon Sep 17 00:00:00 2001 From: Cesar Alvarez Vallero Date: Wed, 22 Sep 2021 22:26:21 -0300 Subject: [PATCH 05/13] Fix link and correct name of file --- es/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es/README.md b/es/README.md index 53401fa..8036eeb 100644 --- a/es/README.md +++ b/es/README.md @@ -161,7 +161,7 @@ Estamos considerando tentativamente aquello que podríamos incluir en una [v3.0] ## Origen, Autores, Copyright & Licencias -A menos que sea señalado de otra manera (ya sea en este [LEEME.md](./LEEME.md) o en los comentarios en los encabezados de los archivos) el contenido de este repositorio es Copyright © 2020 por Blockchain Commons, LLC, y esta bajo licencia [CC-BY](./LICENSE-CC-BY-4.0.md). +A menos que sea señalado de otra manera (ya sea en este [README.md](./README.md) o en los comentarios en los encabezados de los archivos) el contenido de este repositorio es Copyright © 2020 por Blockchain Commons, LLC, y esta bajo licencia [CC-BY](./LICENSE-CC-BY-4.0.md). ## Apoyo Financiero From ce14af20b4a31a926673b8a8a6c57bfeccf23a29 Mon Sep 17 00:00:00 2001 From: Cesar Alvarez Vallero Date: Wed, 22 Sep 2021 22:41:23 -0300 Subject: [PATCH 06/13] Fix links The Contributor License Agreement and the Creative Commons License won't be translated to spanish, so it's safe to link them to their english originals. --- es/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/es/README.md b/es/README.md index 8036eeb..8185cd2 100644 --- a/es/README.md +++ b/es/README.md @@ -161,7 +161,7 @@ Estamos considerando tentativamente aquello que podríamos incluir en una [v3.0] ## Origen, Autores, Copyright & Licencias -A menos que sea señalado de otra manera (ya sea en este [README.md](./README.md) o en los comentarios en los encabezados de los archivos) el contenido de este repositorio es Copyright © 2020 por Blockchain Commons, LLC, y esta bajo licencia [CC-BY](./LICENSE-CC-BY-4.0.md). +A menos que sea señalado de otra manera (ya sea en este [README.md](./README.md) o en los comentarios en los encabezados de los archivos) el contenido de este repositorio es Copyright © 2020 por Blockchain Commons, LLC, y esta bajo licencia [CC-BY](../LICENSE-CC-BY-4.0.md). ## Apoyo Financiero @@ -171,7 +171,7 @@ Para apoyar financieramente el futuro desarrollo de *Aprendiendo Bitcoin desde l ## Contribuyendo -Animamos las contribuciones publicas a través de issues y pull requests! Por favor, revise [CONTRIBUYENDO.md](./CONTRIBUYENDO.md) para mas detalles sobre nuestro proceso de desarrollo. Todas las contribuciones a este repositorio requieren un [Acuerdo de Licencia de Colaborador](./CLA.md) firmado mediante GPG. +Animamos las contribuciones publicas a través de issues y pull requests! Por favor, revise [CONTRIBUYENDO.md](./CONTRIBUYENDO.md) para mas detalles sobre nuestro proceso de desarrollo. Todas las contribuciones a este repositorio requieren un [Acuerdo de Licencia de Colaborador](../CLA.md) firmado mediante GPG. Si le gustaría proveer una traducción de Aprendiendo Bitcoin desde la Línea de Comandos, por favor, vea también [TRADUCIENDO.md](./TRADUCIENDO.md). From 3761810009f6c8e295b2ec824aace2a073817d85 Mon Sep 17 00:00:00 2001 From: Cesar Alvarez Vallero Date: Fri, 24 Sep 2021 08:30:56 -0300 Subject: [PATCH 07/13] Correct title translation --- es/10_4_Codificando_una_Multifirma.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es/10_4_Codificando_una_Multifirma.md b/es/10_4_Codificando_una_Multifirma.md index 72298fd..acaf706 100644 --- a/es/10_4_Codificando_una_Multifirma.md +++ b/es/10_4_Codificando_una_Multifirma.md @@ -1,4 +1,4 @@ -# 10.4: Guioniendo una Multifirma +# 10.4: Codificando una Multifirma Antes de cerrar esta introducción a las secuencias de comandos P2SH, vale la pena examinar un ejemplo más realista. Desde [§6.1](06_1_Enviando_una_Transaccion_a_una_Direccion_Multifirma.md), hemos estado diciendo casualmente que la `bitcoin-cli` envuelve su transacción multifirma en una transacción P2SH. De hecho, esta es la metodologiá estándar para crear multifirmas en Blockchain. Así es como funciona eso en profundidad. From 05efe2c757b12dc48e788ceb9d2e669ead64abe5 Mon Sep 17 00:00:00 2001 From: Cesar Alvarez Vallero Date: Fri, 24 Sep 2021 08:37:48 -0300 Subject: [PATCH 08/13] Fix accentuation --- es/10_4_Codificando_una_Multifirma.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es/10_4_Codificando_una_Multifirma.md b/es/10_4_Codificando_una_Multifirma.md index acaf706..81c0295 100644 --- a/es/10_4_Codificando_una_Multifirma.md +++ b/es/10_4_Codificando_una_Multifirma.md @@ -1,6 +1,6 @@ # 10.4: Codificando una Multifirma -Antes de cerrar esta introducción a las secuencias de comandos P2SH, vale la pena examinar un ejemplo más realista. Desde [§6.1](06_1_Enviando_una_Transaccion_a_una_Direccion_Multifirma.md), hemos estado diciendo casualmente que la `bitcoin-cli` envuelve su transacción multifirma en una transacción P2SH. De hecho, esta es la metodologiá estándar para crear multifirmas en Blockchain. Así es como funciona eso en profundidad. +Antes de cerrar esta introducción a las secuencias de comandos P2SH, vale la pena examinar un ejemplo más realista. Desde [§6.1](06_1_Enviando_una_Transaccion_a_una_Direccion_Multifirma.md), hemos estado diciendo casualmente que la `bitcoin-cli` envuelve su transacción multifirma en una transacción P2SH. De hecho, esta es la metodología estándar para crear multifirmas en Blockchain. Así es como funciona eso en profundidad. ## Entender el Código Multifirma From 630c3841932c28723ab16228f5ca973901e7997c Mon Sep 17 00:00:00 2001 From: Cesar Alvarez Vallero Date: Fri, 24 Sep 2021 08:38:35 -0300 Subject: [PATCH 09/13] Fix typo --- es/10_4_Codificando_una_Multifirma.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es/10_4_Codificando_una_Multifirma.md b/es/10_4_Codificando_una_Multifirma.md index 81c0295..23bfaa3 100644 --- a/es/10_4_Codificando_una_Multifirma.md +++ b/es/10_4_Codificando_una_Multifirma.md @@ -118,7 +118,7 @@ Luego puede crear una transacción usando esa `scriptPubKey`. ## Desbloquear la Multifirma P2SH -Para desbloquear esta transacción multifirma es necessario que el destinatario produzca un scriptSig que incluya las dos firmas y el `redeemScript`. +Para desbloquear esta transacción multifirma es necesario que el destinatario produzca un scriptSig que incluya las dos firmas y el `redeemScript`. ### Ejecute la Primera Ronda de Validación P2SH From d990c4bf416446b949c70e4f4a2e62f528656d34 Mon Sep 17 00:00:00 2001 From: Cesar Alvarez Vallero Date: Fri, 24 Sep 2021 08:41:36 -0300 Subject: [PATCH 10/13] Remove duplicated line and reword sentence --- es/10_4_Codificando_una_Multifirma.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es/10_4_Codificando_una_Multifirma.md b/es/10_4_Codificando_una_Multifirma.md index 23bfaa3..236e956 100644 --- a/es/10_4_Codificando_una_Multifirma.md +++ b/es/10_4_Codificando_una_Multifirma.md @@ -95,7 +95,7 @@ Desafortunadamente, la técnica de incrustar una multifirma sin procesar en una Estos eran generalmente problemas con cualquier tipo de script de Bitcoin complejo, pero rápidamente se convirtieron en problemas muy reales cuando se aplicaron a multifirmas, que fueron algunos de los primeros scripts complejos que se utilizaron ampliamente en la red de Bitcoin. Las transacciones P2SH se crearon para resolver estos problemas a partir de 2012. -> :book: ***¿Qué es un P2SH multifirma?*** Las multifirmas P2SH fueron la primera implementación de transacciones P2SH. Simplemente empaquetan una transacción estándar de multifirmas en una transacción P2SH estándar. Simplemente empaquetan una transacción estándar de multifirma en una transacción P2SH estándar. Esto permite la estandarización de direcciones; reduce el almacenamiento de datos; y aumenta los recuentos de "m" y "n". +> :book: ***¿Qué es un P2SH multifirma?*** Las multifirmas P2SH fueron la primera implementación de transacciones P2SH. Simplemente empaquetan una transacción multifirma estándar en una transacción P2SH estándar. Esto permite la estandarización de direcciones; reduce el almacenamiento de datos; y aumenta los recuentos de "m" y "n". ## Crear un P2SH Multifirma From b057f22f3f8acedd91f55d68a00f10470331201e Mon Sep 17 00:00:00 2001 From: Said Rahal Date: Sun, 26 Sep 2021 18:33:35 +0200 Subject: [PATCH 11/13] Update 04_2_Interludio_Usando_JQ.md --- es/04_2_Interludio_Usando_JQ.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/es/04_2_Interludio_Usando_JQ.md b/es/04_2_Interludio_Usando_JQ.md index a445255..9b62656 100644 --- a/es/04_2_Interludio_Usando_JQ.md +++ b/es/04_2_Interludio_Usando_JQ.md @@ -161,7 +161,7 @@ $ bitcoin-cli listunspent | jq -r '.[] | { tx: .txid, output: .vout, bitcoins: . **Ejemplo de uso:** _Buscar automáticamente los UTXOs que se utilizan en una transacción._ -Hasta ahora, las búsquedas en JQ han sido bastante sencillas: se utiliza una clave para buscar uno o más valores en un objeto o arreglo JSON. ¿Pero qué pasa si quieres buscar un valor en un objeto JSON... por otro valor? Este tipo de búsqueda indirecta tiene una aplicación real cuando se trabaja con transacciones construidas sobre UTXOs existentes. Por ejemplo, puede permitirte calcular el valor de la suma de los UTXOs que se utilizan en una transacción, algo que es de vital importancia. +Hasta ahora, las búsquedas en JQ han sido bastante sencillas: se utiliza una clave para buscar uno o más valores en un objeto o arreglo JSON. ¿Pero qué pasa si quiere buscar un valor en un objeto JSON... por otro valor? Este tipo de búsqueda indirecta tiene una aplicación real cuando se trabaja con transacciones construidas sobre UTXOs existentes. Por ejemplo, puede permitirse calcular el valor de la suma de los UTXOs que se utilizan en una transacción, algo que es de vital importancia. Este ejemplo utiliza la siguiente transacción en crudo. Tenga en cuenta que esta es una transacción cruda más compleja con dos entradas y dos salidas. Aprenderemos a hacerlas en próximas secciones; por ahora, es necesario para poder ofrecer ejemplos robustos. Observa que, a diferencia de nuestros ejemplos anteriores, éste tiene dos objetos en su matriz `vin` y dos en su matriz `vout`. ``` @@ -324,7 +324,7 @@ Obsérvese que hemos utilizado otra parte de la fealdad de la arreglo `${#usedtx **Ejemplo de uso:** _Calcular automáticamente el valor de los UTXOs utilizados en una transacción._ -Ahora puedes ir un paso más allá, y solicitar el .amount (o cualquier otro valor-clave JSON) de los UTXOs que estás recuperando. +Ahora puede ir un paso más allá, y solicitar el .amount (o cualquier otro valor-clave JSON) de los UTXOs que está recuperando. Este ejemplo repite el uso de las arreglos `$usedtxid` y `$usedvout` que fueron establecidas de la siguiente manera: ``` @@ -353,7 +353,7 @@ Para calcular la tarifa completa de la transacción en este punto sólo hace fal $ bitcoin-cli decoderawtransaction $rawtxhex | jq -r '.vout [] | .value' | awk '{s+=$1} END {print s}' 1.045 ``` -Para completar el cálculo de la tasa de transacción, se resta el importe de .vout (1,045) del importe de .vin (1,3). +Para completar el cálculo de la tasa de transacción, se resta el importe de .vout (1.045) del importe de .vin (1.3). Para ello, tendrá que instalar `bc`: ``` @@ -377,7 +377,7 @@ Para más magia de JSON (y si algo de esto no está claro), por favor lee el [Ma ## Crear nuevos alias -El código JQ puede ser un poco difícil de manejar, así que debería considerar añadir algunas invocaciones más largas e interesantes a tu ~/.bash_profile. +El código JQ puede ser un poco difícil de manejar, así que debería considerar añadir algunas invocaciones más largas e interesantes a su ~/.bash_profile. Cada vez que busque una gran cantidad de información en un objeto JSON emitido por un comando `bitcoin-cli`, considera escribir un alias para reducirlo a lo que quiere ver. ``` From 276d5da9f15dca3d4ee9984775bd541a1fed1b6f Mon Sep 17 00:00:00 2001 From: Said Rahal Date: Sun, 26 Sep 2021 20:54:44 +0200 Subject: [PATCH 12/13] Update 04_2_Interludio_Usando_JQ.md --- es/04_2_Interludio_Usando_JQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es/04_2_Interludio_Usando_JQ.md b/es/04_2_Interludio_Usando_JQ.md index 9b62656..bae36ee 100644 --- a/es/04_2_Interludio_Usando_JQ.md +++ b/es/04_2_Interludio_Usando_JQ.md @@ -386,7 +386,7 @@ alias btcunspent="bitcoin-cli listunspent | jq -r '.[] | { txid: .txid, vout: .v ## Ejecutar el script comisión por transacción -El [Fee Calculation Script](src/04_2_i_txfee-calc.sh) está disponible en el directorio src-code. Puede descargarlo y guardarlo como `txfee-calc.sh`. +El [script de cálculo de tasas](../src/04_2_i_txfee-calc.sh) está disponible en el directorio src-code. Puede descargarlo y guardarlo como `txfee-calc.sh`. > :warning: **ADVERTENCIA:** Este script no ha sido verificado de forma robusta. Si va a utilizarlo para verificar las comisiones de las transacciones reales, sólo deberá hacerlo como triple comprobación después de haber hecho todos los cálculos usted mismo. From 47cd0998d5d4ea17dadc0b1f6d4a1f4cf52ffc4b Mon Sep 17 00:00:00 2001 From: Ian Culp <57159226+icculp@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:07:54 -0500 Subject: [PATCH 13/13] implementing corrections --- es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md b/es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md index db19b68..80a4b6d 100644 --- a/es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md +++ b/es/03_0_Entendiendo_Su_Configuracion_Bitcoin.md @@ -2,14 +2,14 @@ Ahora está listo para comenzar a trabajar con la interfaz de línea de comandos `bitcoin-cli`. Pero eso primero requiere que comprenda la configuración de Bitcoin y las características de su billetera, que es lo que se explicará en este capítulo. -Para este y futuros capítulos, suponemos que tienes un VPS con Bitcoin instalado, ejecutando `bitcoind`. También suponemos que está conectado a testnet, lo que le permite acceder a bitcoins sin utilizar fondos reales. Puede hacerlo con Bitcoin Standup en Linode.com, según [§2.1: Configuración de un Servidor Privado Virtual de Bitcoin-Core con Bitcoin Standup](02_1_Configurando_un_Bitcoin-Core_VPS_con_StackScript.md), o por otros medios, según [§2.2: Configuración de una Maquina Bitcoin-Core por Otros Medios](02_2_Configurando_Bitcoin_Core_Otros.md). +Para este y futuros capítulos, suponemos que tiene un VPS con Bitcoin instalado, ejecutando `bitcoind`. También suponemos que está conectado a testnet, lo que le permite acceder a bitcoins sin utilizar fondos reales. Puede hacerlo con Bitcoin Standup en Linode.com, según [§2.1: Configuración de un Servidor Privado Virtual de Bitcoin-Core con Bitcoin Standup](02_1_Configurando_un_Bitcoin-Core_VPS_con_StackScript.md), o por otros medios, según [§2.2: Configuración de una Maquina Bitcoin-Core por Otros Medios](02_2_Configurando_Bitcoin_Core_Otros.md). ## Objetivos de este capítulo Después de trabajar en este capítulo, un desarrollador podrá: - * Demuestre que su nodo Bitcoin está instalado y actualizado - * Cree una dirección para recibir fondos de Bitcoin + * Demostrar que su nodo Bitcoin está instalado y actualizado + * Crear una dirección para recibir fondos de Bitcoin * Usar comandos básicos de billetera * Crear una dirección a partir de un descriptor @@ -25,7 +25,7 @@ Los objetivos de apoyo incluyen la capacidad de: * [Sección Uno: Verificando Su Configuración Bitcoin](03_1_Verificando_Su_Configuracion_Bitcoin.md) * [Sección Dos: Conociendo Su Configuración Bitcoin](03_2_Conociendo_Su_Configuracion_Bitcoin.md) -* [Sección Three: Configurando Su Billetera](03_3_Configurando_Su_Billetera.md) +* [Sección Tres: Configurando Su Billetera](03_3_Configurando_Su_Billetera.md) * [Interludio: Usando Variables de la Linea de Comandos](03_3_Interludio_Usando_Variables_Linea_Comando.md) -* [Sección Recibiendo una Transacción](03_4_Recibiendo_una_Transaccion.md) +* [Sección Cuatro: Recibiendo una Transacción](03_4_Recibiendo_una_Transaccion.md) * [Sección Cinco: Entendiendo El Descriptor](03_5_Entendiendo_El_Descriptor.md)