diff --git a/ejercicios/semana1/soluciones/trt21 b/ejercicios/semana1/soluciones/trt21 new file mode 100644 index 0000000..6150eae --- /dev/null +++ b/ejercicios/semana1/soluciones/trt21 @@ -0,0 +1,95 @@ +#!/bin/bash + +echo "pruebas ejercicio semana 1" +#!/bin/bash + +VERSION="28.0" +wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/bitcoin-$VERSION-x86_64-linux-gnu.tar.gz +wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/SHA256SUMS +wget https://bitcoincore.org/bin/bitcoin-core-$VERSION/SHA256SUMS.asc + +sha256sum --ignore-missing --check SHA256SUMS +echo "Verificación exitosa de la firma binaria" + +mkdir -p ~/.bitcoin + +cat < ~/.bitcoin/bitcoin.conf +regtest=1 +fallbackfee=0.0001 +server=1 +txindex=1 +EOF + +echo "Directorio y archivo de configuración creados correctamente." + +bitcoin-cli loadwallet "Miner" > /dev/null 2>&1 +bitcoin-cli loadwallet "Trader" > /dev/null 2>&1 + +# Si no existen, las crea (esto solo funcionará la primera vez o si borras los datos) +bitcoin-cli createwallet "Miner" > /dev/null 2>&1 +bitcoin-cli createwallet "Trader" > /dev/null 2>&1 + +echo "Billeteras Miner y Trader listas para usar." + + +MINER_ADDR=$(bitcoin-cli -rpcwallet=Miner getnewaddress "Recompensa de Mineria") + +bitcoin-cli generatetoaddress 101 $MINER_ADDR +echo "Se necesitaron 101 bloques para obtener saldo positivo." +echo "Comentario: Las recompensas de bloque tienen una 'madurez' de 100 bloques por seguridad de la red." + +echo "Saldo de Miner:" +bitcoin-cli -rpcwallet=Miner getbalance + + +# 1. Crear dirección para el Trader +TRADER_ADDR=$(bitcoin-cli -rpcwallet=Trader getnewaddress "Recibido") + +# 2. Enviar 20 BTC y capturar el TXID +TXID=$(bitcoin-cli -rpcwallet=Miner sendtoaddress "$TRADER_ADDR" 20) +echo "ID de la transacción (txid): $TXID" + +# 3. Ver la transacción en el mempool (antes de confirmar) +echo "Detalles en el mempool:" +bitcoin-cli getmempoolentry "$TXID" + +# 4. Confirmar la transacción minando 1 bloque más +bitcoin-cli generatetoaddress 1 "$MINER_ADDR" > /dev/null + +# 1. Confirmar la transacción creando 1 bloque adicional +echo "Confirmando transacción..." +bitcoin-cli -rpcwallet=Miner generatetoaddress 1 "$MINER_ADDR" > /dev/null + + + +# 2. Obtener detalles finales usando jq (como pide el ejercicio) +# Extraemos la información de la transacción recién confirmada +TX_INFO=$(bitcoin-cli -rpcwallet=Miner gettransaction "$TXID") + +# 3. Imprimir el reporte que te pide la tarea + +echo "--- REPORTE FINAL ---" +echo "txid: $TXID" +echo "Comisiones: $(echo $TX_INFO | jq '.fee') BTC" +echo "Bloque: $(bitcoin-cli getblockcount)" +echo "Saldo de Miner: $(bitcoin-cli -rpcwallet=Miner getbalance) BTC" +echo "Saldo de Trader: $(bitcoin-cli -rpcwallet=Trader getbalance) BTC" + + + +# Paso final: Confirmar y mostrar detalles +bitcoin-cli -rpcwallet=Miner generatetoaddress 1 "$MINER_ADDR" > /dev/null + +# Extraer info para el reporte detallado +TX_JSON=$(bitcoin-cli -rpcwallet=Miner gettransaction "$TXID") + + + + +echo "--- REPORTE FINAL ---" +echo "txid: $TXID" +echo "Comisiones: $(echo $TX_JSON | jq '.fee') BTC" +echo "Bloque: $(bitcoin-cli getblockcount)" +echo "Saldo de Miner: $(bitcoin-cli -rpcwallet=Miner getbalance) BTC" +echo "Saldo de Trader: $(bitcoin-cli -rpcwallet=Trader getbalance) BTC" + diff --git a/ejercicios/semana2/soluciones/Tu_nobre_en_discord.sh b/ejercicios/semana2/soluciones/Tu_nobre_en_discord.sh deleted file mode 100644 index 7b48218..0000000 --- a/ejercicios/semana2/soluciones/Tu_nobre_en_discord.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -# Sube un archivo como este mediante un pull request en la carpeta soluciones, el archivo debe tener tu nombre en discord diff --git a/ejercicios/semana2/soluciones/trt21 semana 2.sh b/ejercicios/semana2/soluciones/trt21 semana 2.sh new file mode 100644 index 0000000..91ab741 --- /dev/null +++ b/ejercicios/semana2/soluciones/trt21 semana 2.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +# Alias para facilitar los comandos +shopt -s expand_aliases +alias bcli="bitcoin-cli -regtest" + +echo "--- 1. Creando billeteras Miner y Trader ---" +bcli -named createwallet wallet_name="Miner" >/dev/null 2>&1 +bcli -named createwallet wallet_name="Trader" >/dev/null 2>&1 + +echo "--- 2. Fondeando la billetera Miner con 150 BTC ---" +MINER_ADDR=$(bcli -rpcwallet="Miner" getnewaddress) +bcli generatetoaddress 103 "$MINER_ADDR" >/dev/null + +echo "--- 3. Creando transaccion Parent (con RBF) ---" +# Obtener dos UTXOs de 50 BTC +UTXO1_TXID=$(bcli -rpcwallet="Miner" listunspent | jq -r '.[0].txid') +UTXO1_VOUT=$(bcli -rpcwallet="Miner" listunspent | jq -r '.[0].vout') +UTXO2_TXID=$(bcli -rpcwallet="Miner" listunspent | jq -r '.[1].txid') +UTXO2_VOUT=$(bcli -rpcwallet="Miner" listunspent | jq -r '.[1].vout') + +TRADER_ADDR=$(bcli -rpcwallet="Trader" getnewaddress) +MINER_CHANGE_ADDR=$(bcli -rpcwallet="Miner" getrawchangeaddress) + +# Crear transaccion con sequence 1 para activar RBF +RAW_PARENT_TX=$(bcli -named createrawtransaction inputs='''[{"txid":"'''$UTXO1_TXID'''","vout":'''$UTXO1_VOUT''',"sequence":1},{"txid":"'''$UTXO2_TXID'''","vout":'''$UTXO2_VOUT''',"sequence":1}]''' outputs='''{"'''$TRADER_ADDR'''":70,"'''$MINER_CHANGE_ADDR'''":29.99999}''') + +SIGNED_PARENT_TX=$(bcli -rpcwallet="Miner" signrawtransactionwithwallet "$RAW_PARENT_TX" | jq -r '.hex') +PARENT_TXID=$(bcli sendrawtransaction "$SIGNED_PARENT_TX") + +echo "--- 4. Generando JSON de la transaccion Parent ---" +FEE=$(bcli getmempoolentry "$PARENT_TXID" | jq -r '.fees.base') +WEIGHT=$(bcli getmempoolentry "$PARENT_TXID" | jq -r '.weight') + +jq -n \ + --arg txid1 "$UTXO1_TXID" --arg vout1 "$UTXO1_VOUT" \ + --arg txid2 "$UTXO2_TXID" --arg vout2 "$UTXO2_VOUT" \ + --arg spk1 "$MINER_CHANGE_ADDR" --arg amt1 "29.99999" \ + --arg spk2 "$TRADER_ADDR" --arg amt2 "70" \ + --arg fee "$FEE" --arg weight "$WEIGHT" \ + '{ + input: [ + {txid: $txid1, vout: $vout1}, + {txid: $txid2, vout: $vout2} + ], + output: [ + {script_pubkey: $spk1, amount: $amt1}, + {script_pubkey: $spk2, amount: $amt2} + ], + Fees: $fee, + Weight: $weight + }' + +echo "--- 5. Creando transaccion Child ---" +# La entrada es el cambio del minero (vout 1 de la tx parent) +NEW_MINER_ADDR=$(bcli -rpcwallet="Miner" getnewaddress) +RAW_CHILD_TX=$(bcli -named createrawtransaction inputs='''[{"txid":"'''$PARENT_TXID'''","vout":1}]''' outputs='''{"'''$NEW_MINER_ADDR'''":29.99998}''') +SIGNED_CHILD_TX=$(bcli -rpcwallet="Miner" signrawtransactionwithwallet "$RAW_CHILD_TX" | jq -r '.hex') +CHILD_TXID=$(bcli sendrawtransaction "$SIGNED_CHILD_TX") + +echo "Consulta Mempool Transaccion Child (Antes del RBF):" +bcli getmempoolentry "$CHILD_TXID" + +echo "--- 6. Aumentando tarifa con RBF (Reemplazo Manual) ---" +# Misma entrada, diferente salida de cambio (restando 10,000 sats = 0.0001 BTC a la salida del minero) +# 29.99999 - 0.0001 = 29.99989 +RBF_PARENT_TX=$(bcli -named createrawtransaction inputs='''[{"txid":"'''$UTXO1_TXID'''","vout":'''$UTXO1_VOUT''',"sequence":1},{"txid":"'''$UTXO2_TXID'''","vout":'''$UTXO2_VOUT''',"sequence":1}]''' outputs='''{"'''$TRADER_ADDR'''":70,"'''$MINER_CHANGE_ADDR'''":29.99989}''') + +SIGNED_RBF_PARENT=$(bcli -rpcwallet="Miner" signrawtransactionwithwallet "$RBF_PARENT_TX" | jq -r '.hex') +NEW_PARENT_TXID=$(bcli sendrawtransaction "$SIGNED_RBF_PARENT") + +echo "Consulta Mempool Transaccion Child (Despues del RBF):" +bcli getmempoolentry "$CHILD_TXID" || echo "Error esperado: La transacción Child no se encontró en la mempool." + +echo "--- EXPLICACION ---" +echo "La primera consulta a la mempool mostró los detalles de la transacción Child porque su transacción Parent original era válida y existía en la mempool." +echo "Al aplicar RBF, creamos una nueva transacción Parent que gastaba las mismas entradas pero pagaba una mayor comisión, reemplazando a la original." +echo "Al desaparecer la Parent original, la transacción Child quedó intentando gastar una salida (UTXO) que ya no existe. Por lo tanto, el nodo la invalidó y la eliminó automáticamente de la mempool, resultando en el error -5."