Igual me pica la mano por invertir para saber como funciona todo el proceso.
Sería provechoso para todos que me des unas instrucciones de modo que el proceso quede documentado para todos.
En primer lugar creas la transacción, por ejemplo con createrawtransaction. Pongamos que queremos coger la primera salida de la transacción e9519006d274f9e54edea5a9751f342121e4f24f3c8a37be4ec3151dad53d71c y mandar 26 BTC a 12345Vypv2QSmuRXcciT5oEB27mPbWGeva:
$ bitcoind createrawtransaction '[{"txid":"e9519006d274f9e54edea5a9751f342121e4f24f3c8a37be4ec3151dad53d71c","vout":0}]' '{"12345Vypv2QSmuRXcciT5oEB27mPbWGeva":26}'
01000000011cd753ad1d15c34ebe378a3c4ff2e42121341f75a9a5de4ee5f974d2069051e90000000000ffffffff0100daf89a000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000
El churro resultante lo descodificamos con decoderawtransaction (no hace falta en la práctica):
$ bitcoind decoderawtransaction 01000000011cd753ad1d15c34ebe378a3c4ff2e42121341f75a9a5de4ee5f974d2069051e90000000000ffffffff0100daf89a000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000
{
"txid" : "7fbb53a6e1b5abbe20cc9aa5142eb5d262ce6991c4db5a543168d1b952df07a2",
"version" : 1,
"locktime" : 0,
"vin" : [
{
"txid" : "e9519006d274f9e54edea5a9751f342121e4f24f3c8a37be4ec3151dad53d71c",
"vout" : 0,
"scriptSig" : {
"asm" : "",
"hex" : ""
},
"sequence" : 4294967295
}
],
"vout" : [
{
"value" : 26.00000000,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 0b5b86d88f06861798ea629265fb793862c4755d OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "76a9140b5b86d88f06861798ea629265fb793862c4755d88ac",
"reqSigs" : 1,
"type" : "pubkeyhash",
"addresses" : [
"12345Vypv2QSmuRXcciT5oEB27mPbWGeva"
]
}
}
]
}
Ahí puede verse que dentro de vin > scriptSig no hay nada; eso es porque la transacción está sin firmar. Como curiosidad, la parte donde dice "sólo el que tiene tal clave privada puede gastar" está en vout > scriptPubKey > asm. "0b5b86d88f06861798ea629265fb793862c4755d" y "12345Vypv2QSmuRXcciT5oEB27mPbWGeva" son lo mismo, representado de distintas maneras.
Para firmarla, procedemos con signrawtransaction (antes hay que desbloquear el wallet usando walletpassphrase):
$ bitcoind signrawtransaction 01000000011cd753ad1d15c34ebe378a3c4ff2e42121341f75a9a5de4ee5f974d2069051e90000000000ffffffff0100daf89a000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000
{
"hex" : "01000000011cd753ad1d15c34ebe378a3c4ff2e42121341f75a9a5de4ee5f974d2069051e9000000006a4730440220143a4c3008f8502aa64cfffffffffffffffffffffffffa32d587da603d7e40b3022027ead7f994b52a412de6bbd7246f17ec45612c9829a2034b989c36ad10ec8c46012103bf7f10738469801723bb5bebbf54de86121eb48fca2dcd463805bbf7f54b3130ffffffff0100daf89a000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000",
"complete" : true
}
Esto nos devuelve otro churro, que es la misma transacción ya firmada, y un valor que nos dice que ya están todas las firmas incluidas y la transacción puede enviarse a la red (usando sendrawtransaction).
Podemos hacer un decoderawtransaction del churro nuevo para comprobar la presencia de la firma:
$ bitcoind decoderawtransaction 01000000011cd753ad1d15c34ebe378a3c4ff2e42121341f75a9a5de4ee5f974d2069051e9000000006a4730440220143a4c3008f8502aa64cfffffffffffffffffffffffffa32d587da603d7e40b3022027ead7f994b52a412de6bbd7246f17ec45612c9829a2034b989c36ad10ec8c46012103bf7f10738469801723bb5bebbf54de86121eb48fca2dcd463805bbf7f54b3130ffffffff0100daf89a000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000
{
"txid" : "72ca3d55d2774233c4afc72109607d3ea7269b101ed3008d0823ccf65ec95315",
"version" : 1,
"locktime" : 0,
"vin" : [
{
"txid" : "e9519006d274f9e54edea5a9751f342121e4f24f3c8a37be4ec3151dad53d71c",
"vout" : 0,
"scriptSig" : {
"asm" : "30440220143a4c3008f8502aa64cfffffffffffffffffffffffffa32d587da603d7e40b3022027ead7f994b52a412de6bbd7246f17ec45612c9829a2034b989c36ad10ec8c4601 03bf7f10738469801723bb5bebbf54de86121eb48fca2dcd463805bbf7f54b3130",
"hex" : "4730440220143a4c3008f8502aa64cfffffffffffffffffffffffffa32d587da603d7e40b3022027ead7f994b52a412de6bbd7246f17ec45612c9829a2034b989c36ad10ec8c46012103bf7f10738469801723bb5bebbf54de86121eb48fca2dcd463805bbf7f54b3130"
},
"sequence" : 4294967295
}
],
"vout" : [ bla bla bla, lo mismo de antes ]
}
He modificado la firma a mano para que sea inválida, de lo contrario cualquiera podría enviar esa transacción
.
Ahora bien, el meollo de las firmas offline es que las claves privadas no estén en un ordenador conectado a la red. En éste tendríamos lo necesario para consultar nuestras direcciones y sus saldos, y ver las transferencias nuevas que nos van llegando. A la hora de enviar fondos a otro sitio, podríamos hacer el createrawtransaction en esta máquina, pero el signrawtransaction hay que hacerlo allí donde estén las claves privadas, que idealmente sería una máquina sin conexión. Con la transacción ya firmada, podemos volver a la máquina conectada y enviarla con sendrawtransaction. Yo no lo he probado, pero todo el mundo dice que con Armory este proceso está chupao de hacer.