Learning-Bitcoin-from-the-C.../pt/04_5_Sending_Coins_with_Automated_Raw_Transactions.md
2021-07-01 17:00:12 -03:00

8.1 KiB

4.5: Enviando Moedas com Transações Brutas Automatizadas

Este capítulo apresenta três maneiras de enviar fundos por meio da interface cli do Bitcoin. A seção §4.1 descreveu como fazer isso com um comando simples e a seção §4.4 detalhou como usar uma transação bruta mais perigosa. Esta seção fica no meio termo de ambas, mostrando como tornar as transações brutas mais simples e seguras.

Deixando o Bitcoin Fazer os Cálculos Para Nós

A metodologia para transações brutas automatizadas é simples: criamos uma transação bruta, mas usamos o comando fundrawtransaction para pedir ao bitcoind para executar os cálculos para nós.

Para usar este comando, precisaremos garantir que nosso arquivo ~/.bitcoin/bitcoin.conf contenha as variáveis racionais para calcular as taxas de transação. Podemos consultar a seção §4.1: Enviando Moedas da Maneira Fácil para obter mais informações sobre isso.

Vamos usar números conservadores, por isso sugerimos adicionar o seguinte ao bitcoin.conf:

mintxfee=0.0001
txconfirmtarget=6

Para manter o tutorial em movimento (e para movimentarmos nosso dinheiro rapidamente), sugerimos o seguinte:

mintxfee=0.001
txconfirmtarget=1

Criando uma Transação Bruta

Para usar o fundrawtransaction primeiro precisamos criar uma transação bruta básica que liste nenhuma entrada e nenhuma mudança de endereço. Apenas listaremos o nosso destinatário e quanto desejamos enviar, neste caso $recipient e 0,0002 BTC.

$ recipient=n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi
$ unfinishedtx=$(bitcoin-cli -named createrawtransaction inputs='''[]''' outputs='''{ "'$recipient'": 0.0002 }''')

Financiando Nossa Transação Bruta

Dizemos ao bitcoin-cli para financiar essa transação básica:

$ bitcoin-cli -named fundrawtransaction hexstring=$unfinishedtx
{
  "hex": "02000000012db87641c6a21e5a68b20c226428544978e6ac44964d5d8060d7388000c584eb0100000000feffffff02204e0000000000001976a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac781e0000000000001600140cc9cdcf45d4ea17f5227a7ead52367aad10a88400000000",
  "fee": 0.00022200,
  "changepos": 1
}

Isso fornece muitas informações úteis, mas uma vez que tenhamos certeza de como funciona, vamos querer usar o JQ para salvar nosso hex em uma variável, como de costume:

$ rawtxhex3=$(bitcoin-cli -named fundrawtransaction hexstring=$unfinishedtx | jq -r '.hex')

Verificando Nossa Transação Financiada

Parece mágica, então nas primeiras vezes que usarmos o fundrawtransaction, provavelmente vamos querer verificá-la.

Vamos executar o comando decoderawtransaction para mostrar que a transação bruta agora está disposta corretamente, usando um ou mais dos nossos UTXOs e enviando fundos excedentes de volta para um endereço de troco:

$ bitcoin-cli -named decoderawtransaction hexstring=$rawtxhex3
{
  "txid": "b3b4c2057dbfbef6690e975ede92fde805ddea13c730f58401939a52c9ac1b99",
  "hash": "b3b4c2057dbfbef6690e975ede92fde805ddea13c730f58401939a52c9ac1b99",
  "version": 2,
  "size": 116,
  "vsize": 116,
  "weight": 464,
  "locktime": 0,
  "vin": [
    {
      "txid": "eb84c5008038d760805d4d9644ace67849542864220cb2685a1ea2c64176b82d",
      "vout": 1,
      "scriptSig": {
        "asm": "",
        "hex": ""
      },
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.00020000,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 e7c1345fc8f87c68170b3aa798a956c2fe6a9eff OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi"
        ]
      }
    },
    {
      "value": 0.00007800,
      "n": 1,
      "scriptPubKey": {
        "asm": "0 a782f4c6e1e75a5b24f3d675d6f11b5ebf3b2142",
        "hex": "0014a782f4c6e1e75a5b24f3d675d6f11b5ebf3b2142",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1q57p0f3hpuad9kf8n6e6adugmt6lnkg2zzr592r"
        ]
      }
    }
  ]
}

Uma coisa de interesse aqui é o endereço de troco, que é o segundo vout. Observe que é um endereço tb1, o que significa que é do tipo Bech32. Quando demos ao Bitcoin Core a capacidade total de gerenciar as alterações, ele o fez usando o tipo de endereço padrão, Bech32, e funcionou bem. É por isso que nossa mudança para endereços SegWit na seção §4.6 realmente não é um grande negócio, mas existem algumas dicas para uso mais amplo, sobre as quais falaremos lá.

Embora tenhamos visto a taxa na saída de fundrawtransaction, ela não pode ser visível aqui. No entanto, podemos verificar isso com o script JQ txfee-calc.sh criado na seção Prefácio: Usando JQ:

$ ~/txfee-calc.sh $rawtxhex3
.000222

Finalmente, podemos usar o getaddressinfo para ver se o endereço de troco gerado realmente nos pertence:

$ bitcoin-cli -named getaddressinfo address=tb1q57p0f3hpuad9kf8n6e6adugmt6lnkg2zzr592r
{
  "address": "tb1q57p0f3hpuad9kf8n6e6adugmt6lnkg2zzr592r",
  "scriptPubKey": "0014a782f4c6e1e75a5b24f3d675d6f11b5ebf3b2142",
  "ismine": true,
  "solvable": true,
  "desc": "wpkh([d6043800/0'/1'/10']038a2702938e548eaec28feb92c7e4722042cfd1ea16bec9fc274640dc5be05ec5)#zpv26nar",
  "iswatchonly": false,
  "isscript": false,
  "iswitness": true,
  "witness_version": 0,
  "witness_program": "a782f4c6e1e75a5b24f3d675d6f11b5ebf3b2142",
  "pubkey": "038a2702938e548eaec28feb92c7e4722042cfd1ea16bec9fc274640dc5be05ec5",
  "ischange": true,
  "timestamp": 1592335137,
  "hdkeypath": "m/0'/1'/10'",
  "hdseedid": "fdea8e2630f00d29a9d6ff2af7bf5b358d061078",
  "hdmasterfingerprint": "d6043800",
  "labels": [
  ]
}

Observe o conteúdo do ismine.

Enviando a Transação Financiada

Neste ponto, podemos assinar e enviar a transação normalmente.

$ signedtx3=$(bitcoin-cli -named signrawtransactionwithwallet hexstring=$rawtxhex3 | jq -r '.hex')
$ bitcoin-cli -named sendrawtransaction hexstring=$signedtx3
8b9dd66c999966462a3d88d6ac9405d09e2aa409c0aa830bdd08dbcbd34a36fa

Em alguns minutos, teremos o nosso troco de volta:

$ bitcoin-cli listunspent
[
  {
    "txid": "8b9dd66c999966462a3d88d6ac9405d09e2aa409c0aa830bdd08dbcbd34a36fa",
    "vout": 1,
    "address": "tb1q57p0f3hpuad9kf8n6e6adugmt6lnkg2zzr592r",
    "scriptPubKey": "0014a782f4c6e1e75a5b24f3d675d6f11b5ebf3b2142",
    "amount": 0.00007800,
    "confirmations": 1,
    "spendable": true,
    "solvable": true,
    "desc": "wpkh([d6043800/0'/1'/10']038a2702938e548eaec28feb92c7e4722042cfd1ea16bec9fc274640dc5be05ec5)#zpv26nar",
    "safe": true
  }
]

Resumo: Enviando Moedas com Transações Brutas Automatizadas

Se formos enviar fundos usando transações brutas, então o fundrawtransaction oferece uma boa alternativa onde taxas, entradas e saídas são calculadas para nós, para que não percamos acidentalmente muito dinheiro.

🔥 Qual é o poder de enviar moedas com transações brutas automatizadas? As vantagens. Proporciona um bom meio termo. Se estamos enviando fundos manualmente e o sendtoaddress não oferece controle suficiente por qualquer motivo, podemos obter algumas das vantagens das transações brutas sem os perigos dela. Essa metodologia deve ser usada sempre que possível se estivermos enviando transações brutas manualmente. As desvantagens. É uma mistura. Embora existam algumas opções adicionais no fundrawtransaction que não foram mencionadas aqui, nosso controle ainda é limitado. Provavelmente, nunca desejaríamos usar esse método se formos escrever um programa cujo objetivo é saber exatamente o que está acontecendo.

O Que Vem Depois?

Vamos concluir o capítulo "Enviando Transações no Bitcoin" com a seção §4.6: Criando uma Transação SegWit.