La firma de una transacción de bitcoin SIN CONEXIÓN falla

Sé que se ha hablado bastante de este tema, pero después de varios días buscando que esto funcione, me doy por vencido.

Quiero crear una transacción en una billetera de solo lectura que está conectada a Internet y sincronizada, luego firmar esta transacción en una máquina fuera de línea "fría" que tiene la clave privada, luego enviar esta transacción en la billetera de solo lectura.

La billetera de solo lectura será [VOTO]

La billetera fría sin conexión será [OCW]

Alguna otra billetera de bitcoin será [SOW] (en otra tercera máquina, que jugará con el par)

Primero simulemos los nodos, con un nodo en cada máquina:

[VOW] bitcoind -regtest -wallet=/path/daemon1.dat -datadir=/path/.bitcoin1 -rpcport=18334 -port=18434 -addnode=127.0.0.1:18435
[SOW] bitcoind -regtest -wallet=/path/daemon2.dat -datadir=/path/.bitcoin2 -rpcport=18335 -port=18435 -addnode=127.0.0.1:18434
[OCW] bitcoind -regtest  -datadir=/path2/.bitcoin -wallet=/path2/wallet -rpcport=18336 -port=18436

Con estos alias para llamar al bitcoin-cli:

alias BITVOW='bitcoin-cli -regtest -datadir=/path/.bitcoin1 -rpcport=18334'
alias BITSOW='bitcoin-cli -regtest -datadir=/path/.bitcoin2 -rpcport=18335'
alias BITOCW='bitcoin-cli -regtest -rpcport=18336'

Entonces, los dos [VOW] y [SCW] se conectan entre sí, no hay problema con eso (forman una pequeña red de 2 nodos).

En la máquina fuera de línea, hago esto:

$ BITOCW getnewaddress
2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL
$ BITOCW dumpprivkey
2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL
cQgMpjZKVnYon1cfKaMuSpAsNQS3rw49BKUmmWV3n3UbEc1ywcQj

Quiero enviar 500 BTC a 2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL , entonces genero fondos a la "otra" billetera, para pagar mi billetera, con un generar para validar la transacción:

$ BITSOW generate X
$ BITSOW getbalance
550.00000000
$ BITSOW sendtoaddress 2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL 500
33f30a3efd7d9b14be28b727f61884cba22bfd69a6fa1b1a475d384fbe2db5f1
$ BITSOW generate 1
$ BITSOW getnewaddress
2NF64kzg5R4wdA3bjJAtVyvKmvgbo1FJ8SM

Usaré esta dirección 2NF64kzg5R4wdA3bjJAtVyvKmvgbo1FJ8SM para recibir fondos de mi billetera principal con una firma fuera de línea.

Importo la dirección de bitcoin en una billetera con vista de billetera y verifico el saldo:

$ BITVOW importaddress  2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL
$ BITVOW getbalance "*" 0 true
500.00000000

Perfecto. Ahora viene la parte en la que quiero enviar esos 500 a 2NF64kzg5R4wdA3bjJAtVyvKmvgbo1FJ8SM mediante una firma de transacción fuera de línea.

Primero identifiquemos el TX que se puede usar:

$ BITVOW listunspent 1 99999999 '["2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL"]'
[
  {
    "txid": 
    "33f30a3efd7d9b14be28b727f61884cba22bfd69a6fa1b1a475d384fbe2db5f1",
    "vout": 0,
    "address": "2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL",
    "label": "",
    "scriptPubKey": "a9144b17c1384ded51b51a60915fa56be6cc7d00212087",
    "amount": 500.00000000,
    "confirmations": 1,
    "spendable": false,
    "solvable": false,
    "safe": true
  }
]
$ BITVOW createrawtransaction '[{"txid":"33f30a3efd7d9b14be28b727f61884cba22bfd69a6fa1b1a475d384fbe2db5f1","vout":0,"scriptPubKey":"a9144b17c1384ded51b51a60915fa56be6cc7d00212087"}]' '{"2NF64kzg5R4wdA3bjJAtVyvKmvgbo1FJ8SM":499.9999}'

Esto se obtiene como una transacción sin procesar (que puse en $RAW_TRANSACTION, por ejemplo):

0200000001F1B52DBE4F385D471A1BFAA669FD2BA2CB8418F627B728BE149B7DFD3E0AF33330000000000FFFFFFFFFFFFFFFFON

Luego, en la máquina fuera de línea, quiero firmar esto usando la clave privada:

$ BITOCW signrawtransactionwithwallet $RAW_TRANSACTION
{
    "hex": "0200000001f1b52dbe4f385d471a1bfaa669fd2ba2cb8418f627b728be149b7dfd3e0af3330000000000ffffffff01f04c3ba40b00000017a9144b17c1384ded51b51a60915fa56be6cc7d0021208700000000",
    "complete": false,
    "errors": [
   {
   "txid": "33f30a3efd7d9b14be28b727f61884cba22bfd69a6fa1b1a475d384fbe2db5f1",
  "vout": 0,
  "witness": [
  ],
  "scriptSig": "",
  "sequence": 4294967295,
  "error": "Input not found or already spent"
}
]
}

¡Muchas gracias por su ayuda!

[EDITAR] : También probé esto:

$ BITOCW signrawtransactionwithwallet $RAW_TRANSACTION '[{"txid":"33f30a3efd7d9b14be28b727f61884cba22bfd69a6fa1b1a475d384fbe2db5f1","vout":0,"scriptPubKey":"a9144b17c1384ded51b51a60915fa56be6cc7d00212087"}]'
error code: -3
error message:
Missing amount for CTxOut(nValue=21000000.00000000, scriptPubKey=a9144b17c1384ded51b51a60915fa5)

[EDITAR]

Esto es lo que probé usando las soluciones proporcionadas (2) y (3) de Pieter Wuille :

(2) Intenté esto en el sistema fuera de línea [OCW], para obtener RedeemScript para el proceso de firma:

BITOCW getaddressinfo 2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL{
  "address": "2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL",
  "scriptPubKey": "a9144b17c1384ded51b51a60915fa56be6cc7d00212087",
  "ismine": true,
  "iswatchonly": false,
  "isscript": true,
  "iswitness": false,
  "script": "witness_v0_keyhash",
  "hex": "0014dd296fa290135a7c18c3002c41cf020324538d5f",
  "pubkey": "02ff5d370a78346d3fbac9750375a3d773aac9a1daadf870b887712d37c222d2b6",
  "embedded": {
    "isscript": false,
    "iswitness": true,
    "witness_version": 0,
    "witness_program": "dd296fa290135a7c18c3002c41cf020324538d5f",
    "pubkey": "02ff5d370a78346d3fbac9750375a3d773aac9a1daadf870b887712d37c222d2b6",
    "address": "bcrt1qm55klg5szdd8cxxrqqkyrnczqvj98r2l8m5l0f",
    "scriptPubKey": "0014dd296fa290135a7c18c3002c41cf020324538d5f"
  },
  "label": "",
  "timestamp": 1540018166,
  "hdkeypath": "m/0'/0'/4'",
  "hdseedid": "fc9ec97f45384df39d95fc424d5a5349951d5bde",
  "hdmasterkeyid": "fc9ec97f45384df39d95fc424d5a5349951d5bde",
  "labels": [
    {
      "name": "",
      "purpose": "receive"
    }
  ]
}

Tal vez me estoy perdiendo algo, pero no pude encontrar un RedeemScript adecuado para firmar.

(3) En primer lugar, no sabía que era posible hacer tal cosa sin hacer yo mismo la selección de monedas. Si es así, preferiría que la billetera de "solo reloj en línea" haga la selección de monedas automáticamente para que no tenga que seleccionar mediante programación las entradas adecuadas.

Luego, siguiendo su consejo, esto es lo que he intentado hasta ahora, después de la misma transacción createraw que la anterior, en el sistema en línea:

BITVOW converttopsbt 0200000001f1b52dbe4f385d471a1bfaa669fd2ba2cb8418f627b728be149b7dfd3e0af3330000000000ffffffff01f04c3ba40b00000017a9144b17c1384ded51b51a60915fa56be6cc7d0021208700000000
cHNidP8BAFMCAAAAAfG1Lb5POF1HGhv6pmn9K6LLhBj2J7covhSbff0+CvMzAAAAAAD/////AfBMO6QLAAAAF6kUSxfBOE3tUbUaYJFfpWvmzH0AISCHAAAAAAAAAA==

Y:

BITVOW walletprocesspsbt cHNidP8BAFMCAAAAAfG1Lb5POF1HGhv6pmn9K6LLhBj2J7covhSbff0+CvMzAAAAAAD/////AfBMO6QLAAAAF6kUSxfBOE3tUbUaYJFfpWvmzH0AISCHAAAAAAAAAA==
{
  "psbt": "cHNidP8BAFMCAAAAAfG1Lb5POF1HGhv6pmn9K6LLhBj2J7covhSbff0+CvMzAAAAAAD/////AfBMO6QLAAAAF6kUSxfBOE3tUbUaYJFfpWvmzH0AISCHAAAAAAABAP0lBQIAAAALfARlDuNzSr0JSrElwpd+izM03irULESrdcQzBmKw8CQAAAAASEcwRAIgKRmcygxX+LVIzMLYpwHVPbTSNYYQjZaMXUyQCBIDBLICIFFntYpDI+G0yUH+yL7b/4YIrYjDUk08q/4A+I/2hh84Af7///+n2vDIPJrmbmA2RRL2RMtbVp+Sf4AU/JUUm53K1JOoJwAAAABIRzBEAiBOLc842GEgXdiq0gagWZ5Vvni5e6DiFGZYG+m6xGrA0QIgf1mtao/3/dGA3u6LvgI2s7bLMtDAr+cxCU/lNJ1PC8cB/v///6ePR81CkwFcpxZub36mqRIemlMGNfvWhNxlDPPZW5LyAAAAAEhHMEQCIEEl9vU7Ezn4zApn1bgUS7DR3Wvz3J9YMEzvVKgmbRaXAiA3Xv8Q5bDbLKEJ/tHn+Adr1u+EUsaKdp8LnWM8cLajHwH+////unzoFharwYU9mElHKsCWwwmoqvbtEbzL8i2dzUFq8RcAAAAASEcwRAIgVoSlc5RumxBU/O4gDzrFdXcxuCBDt30DczglDmuvSegCIFkZIqu1OS5UNncEThnNS8th+38lFf71PDa9Og2n3TKFAf7////Zq7QRMc7AhtcyGYE/HdvSAR146Dv659BXuzrHycdrcQAAAABIRzBEAiBctxeVGCoN8zlKnG19Tgs4GKnQ1r/Ge6Hjr/kIX0LJSQIgNHhYFpt2aabQEWA06apQpTcscoBH1hkDO9b9P3kNBKsB/v///0dInKhhB5SbX3zsU4+I8irL8UFXYDWqM2njZ8cDJQw4AAAAAEhHMEQCIEy0Fm9FwnEMSm6Cx37tMs8VFKNWypz3iXDZGinXpoGLAiAtH98TAw71JPde6+85VXuy5iuFa1AHt+wkF7kNipEMLQH+////4bM2jf15ocNZ2pgM9vFpX4WcMkfA2Ynvjs66xsnCGZ8AAAAASEcwRAIgaRsu6KSp27b3WZBWBv64sSWpDLywr2c7/JFwQ3yEHqwCIAC6OvBe4nMKxKu05HQADoT8e+KWLpUdrUkjM1UaM4jbAf7////8b5WwVRpa4j9w73Dg1cy3zygIu4YGBCGnFujB2T/QagAAAABIRzBEAiBKVpF+WbZJ2TJMYkujmLxEhkTAwV35Z4FgNBlYt0d28gIgCQbediJ7kTw6Hr94o4I2IiwaD3xHFN8qQI0aNl5Bjh4B/v///zPoBvkyeie1HxFTJRUrG/J7pE67/XCDa8t+uxpZKwQ8AAAAAEhHMEQCIAo5RI1TtAoOSjUfHLiBi1rZN7e9v+4cNKfiEjXvaqCYAiAAq/59k9LxVFjf8mkSs7u49wDR127cFd1vLU3bk3vifQH+////XTiaFEkYHocUhIg+XmbMi3nnpSw1qgKYKbZh1oS7dlsAAAAASEcwRAIgc/2/mN/evEi/hBA4JtTw/82mndVSuISAeTcqDQ5yyfQCIADnr/yfLKbOVj3hbqjUwewVu44xRSoBeHt3ptEwB02BAf7///87CVHCCJ4KsgaiAtMhT2h38YkXIqFy9cYDmU/IthPSmgAAAABIRzBEAiAfkNsXRjf7sPjyknV38nY1WLQ4K7oV8iqP+nhI8/jV5gIgDpJCo3VPg2M4GT9uSuDKlp4w6BqDnJsIyGdZ6XRj0SUB/v///wIAdDukCwAAABepFEsXwThN7VG1GmCRX6Vr5sx9ACEghxyLBSoBAAAAF6kULDnWiZNlc9lyYG7jv4tHeqBx1H6HbwAAAAAA",
  "complete": false
}

Luego exporté esto en el sistema fuera de línea e hice:

BITOCW  walletprocesspsbt "cHNidP8BAFMCAAAAAfG1Lb5POF1HGhv6pmn9K6LLhBj2J7covhSbff0+CvMzAAAAAAD/////AfBMO6QLAAAAF6kUSxfBOE3tUbUaYJFfpWvmzH0AISCHAAAAAAABAP0lBQIAAAALfARlDuNzSr0JSrElwpd+izM03irULESrdcQzBmKw8CQAAAAASEcwRAIgKRmcygxX+LVIzMLYpwHVPbTSNYYQjZaMXUyQCBIDBLICIFFntYpDI+G0yUH+yL7b/4YIrYjDUk08q/4A+I/2hh84Af7///+n2vDIPJrmbmA2RRL2RMtbVp+Sf4AU/JUUm53K1JOoJwAAAABIRzBEAiBOLc842GEgXdiq0gagWZ5Vvni5e6DiFGZYG+m6xGrA0QIgf1mtao/3/dGA3u6LvgI2s7bLMtDAr+cxCU/lNJ1PC8cB/v///6ePR81CkwFcpxZub36mqRIemlMGNfvWhNxlDPPZW5LyAAAAAEhHMEQCIEEl9vU7Ezn4zApn1bgUS7DR3Wvz3J9YMEzvVKgmbRaXAiA3Xv8Q5bDbLKEJ/tHn+Adr1u+EUsaKdp8LnWM8cLajHwH+////unzoFharwYU9mElHKsCWwwmoqvbtEbzL8i2dzUFq8RcAAAAASEcwRAIgVoSlc5RumxBU/O4gDzrFdXcxuCBDt30DczglDmuvSegCIFkZIqu1OS5UNncEThnNS8th+38lFf71PDa9Og2n3TKFAf7////Zq7QRMc7AhtcyGYE/HdvSAR146Dv659BXuzrHycdrcQAAAABIRzBEAiBctxeVGCoN8zlKnG19Tgs4GKnQ1r/Ge6Hjr/kIX0LJSQIgNHhYFpt2aabQEWA06apQpTcscoBH1hkDO9b9P3kNBKsB/v///0dInKhhB5SbX3zsU4+I8irL8UFXYDWqM2njZ8cDJQw4AAAAAEhHMEQCIEy0Fm9FwnEMSm6Cx37tMs8VFKNWypz3iXDZGinXpoGLAiAtH98TAw71JPde6+85VXuy5iuFa1AHt+wkF7kNipEMLQH+////4bM2jf15ocNZ2pgM9vFpX4WcMkfA2Ynvjs66xsnCGZ8AAAAASEcwRAIgaRsu6KSp27b3WZBWBv64sSWpDLywr2c7/JFwQ3yEHqwCIAC6OvBe4nMKxKu05HQADoT8e+KWLpUdrUkjM1UaM4jbAf7////8b5WwVRpa4j9w73Dg1cy3zygIu4YGBCGnFujB2T/QagAAAABIRzBEAiBKVpF+WbZJ2TJMYkujmLxEhkTAwV35Z4FgNBlYt0d28gIgCQbediJ7kTw6Hr94o4I2IiwaD3xHFN8qQI0aNl5Bjh4B/v///zPoBvkyeie1HxFTJRUrG/J7pE67/XCDa8t+uxpZKwQ8AAAAAEhHMEQCIAo5RI1TtAoOSjUfHLiBi1rZN7e9v+4cNKfiEjXvaqCYAiAAq/59k9LxVFjf8mkSs7u49wDR127cFd1vLU3bk3vifQH+////XTiaFEkYHocUhIg+XmbMi3nnpSw1qgKYKbZh1oS7dlsAAAAASEcwRAIgc/2/mN/evEi/hBA4JtTw/82mndVSuISAeTcqDQ5yyfQCIADnr/yfLKbOVj3hbqjUwewVu44xRSoBeHt3ptEwB02BAf7///87CVHCCJ4KsgaiAtMhT2h38YkXIqFy9cYDmU/IthPSmgAAAABIRzBEAiAfkNsXRjf7sPjyknV38nY1WLQ4K7oV8iqP+nhI8/jV5gIgDpJCo3VPg2M4GT9uSuDKlp4w6BqDnJsIyGdZ6XRj0SUB/v///wIAdDukCwAAABepFEsXwThN7VG1GmCRX6Vr5sx9ACEghxyLBSoBAAAAF6kULDnWiZNlc9lyYG7jv4tHeqBx1H6HbwAAAAAA"
{
  "psbt": "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",
  "complete": true
}

Estaba feliz cuando vi complete = true, pero esto es lo que sucedió:

BITOCW finalizepsbt "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"
error code: -22
error message:
TX decode failed PSBT is not sane.: iostream error

Encontré que el problema #14473 en el proyecto bitcoin de github parece estar relacionado con eso, pero no estoy seguro ( https://github.com/bitcoin/bitcoin/issues/14473 ).

[EDITAR] :

Acerca de (2) : obtuve scriptPubKey dentro del campo incrustado como se sugirió, que es 0014dd296fa290135a7c18c3002c41cf020324538d5f , y también la cantidad, ya que no está en la transacción sin procesar (según lo aconsejado por Peter):

BITOCW -named signrawtransactionwithkey hexstring=$RAW_TRANSACTION prevtxs='[{"txid":"33f30a3efd7d9b14be28b727f61884cba22bfd69a6fa1b1a475d384fbe2db5f1","vout":0,"scriptPubKey":"0014dd296fa290135a7c18c3002c41cf020324538d5f", "amount":499.9999}]' privkeys='["cQgMpjZKVnYon1cfKaMuSpAsNQS3rw49BKUmmWV3n3UbEc1ywcQj"]'
{
  "hex": "02000000000101f1b52dbe4f385d471a1bfaa669fd2ba2cb8418f627b728be149b7dfd3e0af3330000000000ffffffff01f04c3ba40b00000017a914ef9751cb4e8dbe30f6070c546cb5fa6538231f56870246304302204385ab257825a678365ed1dfd9e06dd8c0f31ecf1f12ffd8058dff9cb952a98f021f7b0919da9ba57d94b0b5f24eaa27bcf6902460008e7db0f51890761e291c2b012102ff5d370a78346d3fbac9750375a3d773aac9a1daadf870b887712d37c222d2b600000000",
  "complete": true
}

Entonces puedo transmitir la transacción firmada en la máquina en línea, pero:

BITVOW sendrawtransaction 02000000000101f1b52dbe4f385d471a1bfaa669fd2ba2cb8418f627b728be149b7dfd3e0af3330000000000ffffffff01f04c3ba40b00000017a914ef9751cb4e8dbe30f6070c546cb5fa6538231f56870246304302204385ab257825a678365ed1dfd9e06dd8c0f31ecf1f12ffd8058dff9cb952a98f021f7b0919da9ba57d94b0b5f24eaa27bcf6902460008e7db0f51890761e291c2b012102ff5d370a78346d3fbac9750375a3d773aac9a1daadf870b887712d37c222d2b600000000
error code: -26
error message: mandatory-script-verify-flag-failed (Operation not valid with the current stack size) (code 16)

Acerca de la selección de monedas con fundrawtransaction , creé una transacción vacía e intenté financiarla, desde la billetera en línea de "solo lectura":

$ BITVOW createrawtransaction '[]' '{"2NF64kzg5R4wdA3bjJAtVyvKmvgbo1FJ8SM":1}'02000000000100e1f5050000000017a914ef9751cb4e8dbe30f6070c546cb5fa6538231f568700000000
$ BITVOW fundrawtransaction 02000000000100e1f5050000000017a914ef9751cb4e8dbe30f6070c546cb5fa6538231f568700000000 '{"includeWatching":true}'
error code: -4
error message:
Insufficient funds

¿Es includeWatching suficiente para que tenga en cuenta la dirección de solo visualización? Para estar seguro, probé:

$ BITVOW fundrawtransaction 02000000000100e1f5050000000017a914ef9751cb4e8dbe30f6070c546cb5fa6538231f568700000000 '{"includeWatching":true, "changeAddress":"2Mz6H8BU3Gg4Nmrv1LyZPm4KcaKj8EjZXxL"}'

E hizo que mi bitcoind abortara con error:

2018-10-27T18:55:19Z Nuevo par saliente conectado: versión: 70015, blocks=112, peer=0 bitcoind: policy/feerate.cpp:25: CAmount CFeeRate::GetFee(size_t) const: Asertion `nBytes_ <= uint64_t(std::numeric_limits::max())' falló. Abortado

Sobre la selección de monedas con walletcreatefundedpsbt , me da:

$ BITVOW walletcreatefundedpsbt '[]' '{"2NF64kzg5R4wdA3bjJAtVyvKmvgbo1FJ8SM":499}'
error code: -4
error message:
Insufficient funds

Respuestas (3)

signrawtransactionwithwalletusa la billetera para dos propósitos:

  • Encontrar las claves privadas necesarias para firmar (con las que se ocupó importando)
  • Encontrar las salidas de transacciones que se están gastando (sin esta información no puede construir una transacción válida, y la billetera fuera de línea, al estar fuera de línea, no tiene acceso a las transacciones que le acreditaron).

Hay una serie de soluciones para esto, en orden creciente de practicidad:

  • Copie el archivo wallet.dat del sistema en línea al sistema fuera de línea, para que vea el historial de transacciones (no lo transfiera nuevamente, ya que contendrá claves privadas)
  • Use el signrawtransactionwithkeyRPC, que le permite especificar la clave privada y la información de UTXO en la llamada RPC, por lo que ya no es necesario importar en el sistema fuera de línea.
  • Utilice las llamadas RPC estilo PSBT; utilícelo walletcreatefundedpsbten el sistema fuera de línea, fírmelo en el sistema en línea usando walletprocesspsbt, extraiga una transacción finalizada usando finalizepsbt, que puede transmitir usando sendrawtransaction. Los archivos PSBT contienen todos los metadatos necesarios para la firma, incluida la transacción anterior (salidas) que se está gastando.
Gracias por tu rápida y precisa respuesta. Acerca de la solución 2 : probé esto antes, y signrawtransactionwithkey me da el código de error: -3 = "Falta el script de redención". Acerca de la solución 3 , que no conocía en absoluto, walletcreatefundedpsbt me da el error "Fondos insuficientes".
Acerca de (2): si está gastando desde una dirección P2SH, también debe proporcionar signrawtransactionwithkeyel script de redimir (se puede encontrar usando getaddressinfo). PSBT también almacena esta información directamente.
Acerca de (3), lo siento, mi consejo fue malo, ya que usted mismo está haciendo la selección de monedas. Puede usar createrawtransactioncomo lo está haciendo ahora, luego invocar converttopsbtel resultado, luego invocar walletprocesspsbtel sistema en línea (que agregará la información de redención y UTXO), y luego walletprocesspsbten el sistema fuera de línea para firmar, seguido de finalizepsbty sendrawtransaction. Si esto funciona, actualizaré mi respuesta.
Gracias de nuevo, Pieter, acabo de editar mi pregunta para permitir un resultado más preciso, ya que no pude hacer que funcionara.
Acerca de (2), lo que necesita es la "scriptPubKey" dentro del campo "incrustado"; da el guión que está envuelto en P2SH. Sin él, el firmante no sabe lo que realmente está tratando de firmar (ya que solo recibe un hash del script).
Acerca de (3) que de hecho parece un error; presumiblemente se solucionará en la versión 0.17.1.
Además, si no quiere hacer la selección de monedas usted mismo, puede usar los RPC fundrawtransactiono . walletcreatefundedpsbtUsted les da la salida que desea enviar, y estos RPcs agregarán entradas y cambiarán desde su billetera según sea necesario.
Gracias de nuevo. Actualicé la publicación original con lo que sugeriste. Desafortunadamente, no pude lograr la "selección automática de monedas" incluso después de leer su respuesta a ( bitcoin.stackexchange.com/questions/58920/… ). La solución que proporcionó con (2) no funcionó para mí (cantidad faltante), lo cual es extraño porque aparentemente la cantidad se especifica en la transacción sin procesar.
( github.com/bitcoin/bitcoin/issues/14401 ) parece estar relacionado con el aborto de bitcoind por cierto
signrawtransactionwithkeynecesita saber los montos de las entradas que está firmando; esta información no es parte de la transacción sin procesar. Encuentra los montos en la lista de resultados no gastados y debe pasarlos junto con los UTXO que se están gastando.
Lo siento pero no pude hacerlo funcionar, con ninguna de las soluciones propuestas. Esperaré la próxima versión de bitcoin-core para ver si funciona mejor.
La solución de Peter (3) funciona con v0.18.1 dados los pasos que detalló en el tercer comentario.

Tengo un tutorial muy antiguo de Greg Maxwell para esta pregunta un poco antigua
https://web.archive.org/web/20171124193914/https://people.xiph.org/~greg/signdemo.txt
El tutorial usa 'bitcoind' como el comando porque fue escrito antes de que 'bitcoin-cli' se convirtiera en el comando correcto. Aparte de este detalle, el tutorial aún debería funcionar con una versión reciente de Bitcoin Core

No estoy seguro de por qué esta discusión se desvió a "PSBT lo hace mejor" sin responder la pregunta que se escribió, pero no argumentaré en contra de "PSBT lo hace mejor".

La pregunta ahora es difícil de seguir, se ha modificado en un tren de pensamiento, por lo que es posible que me haya perdido algo.

La pregunta usa 'signrawtransactionwithwallet'
El tutorial usa 'signrawtransaction'

El interrogador intenta usar 'getaddressinfo' para encontrar el RedeemScript
El tutorial usa 'decoderrawtransaction' para exponer el RedeemScript

A menos que esté leyendo el flujo de consejos incorrectamente, el problema es que una billetera fría no puede conocer el RedeemScript, y es por eso que 'signrawtransactionwithwallet' no funciona. 'signrawtransaction' acepta el RedeemScript como parámetro, y 'decoderrawtransaction' expone el RedeemScript

No he probado el método en el tutorial de Greg Maxwell, pero espero que esta pequeña contribución sea útil para comprender mejor el problema.

Si no puedo encontrar un tutorial de firma fuera de línea más nuevo, intentaré reservar algo de tiempo para escribir una versión nueva.

No tengo suficiente reputación para responder a la respuesta de Pieter Wuille, pero probé usando PSBT (solución 3) con bitcoin-core v0.18.0, ahora funciona bien para esto. En mi caso, usar PSBT fue mucho más fácil que usar signrawtransactionwithkey. Los pasos que he usado son:

  1. createrawtransactionen la billetera de solo reloj.
  2. fundrawtransactionen la billetera de solo reloj.
  3. converttopsbten la billetera de solo reloj.
  4. walletprocesspsbten la billetera de solo reloj. No estoy seguro de por qué esto es necesario, pero cambia la cadena PSBT. Pensé converttopsbtque haría lo que sea que haga este paso.
  5. walletprocesspsbten la billetera fuera de línea.
  6. finalizepsbten la billetera fuera de línea.

No debería marcar la diferencia, pero para que conste, he usado la API de RPC, no la línea de comandos.

Creo que el paso 5 debe realizarse en la billetera fuera de línea.
La razón por la que se necesita el paso 4 es porque las entradas están referenciadas txid:vouty la billetera fuera de línea no puede saber cómo obtener los detalles necesarios (por ejemplo, scriptPubKey) ya que no tiene ningún bloque. Entonces walletprocesspsbt, en la billetera de solo reloj (en línea), complete esta información (en particular, la parte de psbt inputs[]).
@ThalisK. Tienes razón, perdón por el error tipográfico! Y sobre el paso 4, lo entiendo y estoy de acuerdo, pero no veo por qué el paso 3 no lo está haciendo ya. Pero de todos modos, no es un problema hacerlo en dos pasos.
Por lo que entiendo converttopsbt, literalmente, la conversión de un formato de estructura (tx) a otro (psbt). No realiza búsquedas ni rellenado de datos. walletprocesspsbthace la búsqueda y el llenado. La separación de preocupaciones mantiene cada comando simple y enfocado.