Antes de encerrarmos esta visão geral das transações P2SH, vamos abordar como gastá-las. Esta seção é principalmente uma visão geral, referindo-se a uma seção anterior onde já gastamos uma transação P2SH.
Como vimos na seção §6.2: Gastando uma Transação com Multsig, gastar uma transação P2SH tem tudo a ver com ter aquela versão serializada do script de bloqueio, o chamado redeemScript. Portanto, o primeiro passo para poder gastar uma transação P2SH é ter certeza de salvar o redeemScript antes de fornecer o endereço P2SH para todos.
Como endereços P2SH além dos endereços especiais multisig e nested Segwit não estão integrados no bitcoin-cli
, não haverá atalhos para gastarmos o P2SH como vimos na seção §6.3: Enviando e Gastando um Multisig de Maneira Automatizada . Vamos precisar coletar todas as variáveis mais complexas por conta própria!
Isso significa que precisaremos coletar:
- O
hex
doscriptPubKey
para a transação que estamos gastando; - O
redeemScript
serializado; - Quaisquer chaves privadas, já que assinaremos manualmente;
- Todos os
txids
,vouts
eaddresses
regulares que precisarmos.
Como vimos na seção §6.2, a criação de uma transação é bem padrão:
$ rawtxhex=$(bitcoin-cli -named createrawtransaction inputs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout' } ]''' outputs='''{ "'$recipient'": 0.00005}''')
$ echo $rawtxhex
020000000121654fa95d5a268abf96427e3292baed6c9f6d16ed9e80511070f954883864b10000000000ffffffff0188130000000000001600142c48d3401f6abed74f52df3f795c644b4398844600000000
No entanto, a assinatura requer a inserção de informações extras para o (1) scriptPubKey
; (2) o redeemScript
e; (3) quaisquer chaves privadas necessárias.
Aqui está o exemplo de como fazer isso para aquele multisig P2SH integrado na seção §6.2:
$ bitcoin-cli -named signrawtransactionwithkey hexstring=$rawtxhex prevtxs='''[ { "txid": "'$utxo_txid'", "vout": '$utxo_vout', "scriptPubKey": "'$utxo_spk'", "redeemScript": "'$redeem_script'" } ]''' privkeys='["cNPhhGjatADfhLD5gLfrR2JZKDE99Mn26NCbERsvnr24B3PcSbtR"]'
Com qualquer outro tipo de P2SH, incluiremos um redeemscript
diferente, mas, fora isso, a prática é exatamente a mesma. A única diferença é que depois de dois capítulos de trabalho com scripts agora entendemos o que é o scriptPubKey
e o que é o redeemScript
, então, esperançosamente, o que eram elementos misteriosos a quatro capítulos atrás, agora não são tão misteriosos assim.
Já gastamos um P2SH no Capítulo 6, quando reenviamos uma transação multsig da maneira mais difícil, que exigia alinhar as informações do scriptPubKey
e do redeemScript
. Agora sabemos que o scriptPubKey
é um script de bloqueio P2SH padronizado, enquanto o redeemScript
corresponde a um hash naquele script de bloqueio e que precisamos ser capazes de executá-lo com as variáveis adequadas para receber um resultado True
. Mas além disso, não há nada de novo ao gastar uma transação P2SH, porque já fizemos isso!
Vamos avançar com "Programando Bitcoin" no Capítulo 11: Capacitando Timelock com Scripts no Bitcoin.