Bitcoin Forum
May 01, 2024, 08:28:04 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1] 2 »  All
  Print  
Author Topic: ¿Firmar transacciones offline? La parte más oscura de BTC  (Read 3026 times)
AbraxasCcs (OP)
Legendary
*
Offline Offline

Activity: 1568
Merit: 1032


Beyond the flavor!


View Profile
May 28, 2013, 05:41:55 AM
 #1

No entiendo eso de firmar transacciones y menos transacciones offline. ¿Hay alguien con la suficiente paciencia y nivel pedagógico que pueda ayudarnos? (somos varios con la duda) 

Mine Chococoin, eat real chocolate!
Bitrated user: Abraxas.
It is a common myth that Bitcoin is ruled by a majority of miners. This is not true. Bitcoin miners "vote" on the ordering of transactions, but that's all they do. They can't vote to change the network rules.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714552084
Hero Member
*
Offline Offline

Posts: 1714552084

View Profile Personal Message (Offline)

Ignore
1714552084
Reply with quote  #2

1714552084
Report to moderator
1714552084
Hero Member
*
Offline Offline

Posts: 1714552084

View Profile Personal Message (Offline)

Ignore
1714552084
Reply with quote  #2

1714552084
Report to moderator
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 28, 2013, 07:34:34 AM
Last edit: May 28, 2013, 08:12:05 AM by Polvos
 #2

Si, yo a lo mejor te puedo ayudar (de hecho le he pagado una recompensa a un programador en el subforo de desarrollo para que una web con javascript hiciera exactamente eso).

Como la mayoría sabéis, Bitcoin es un concepto abstracto, un sistema de pago descentralizado, que puede entenderse de forma simplificada como una especie de base de datos (la cadena de bloques) que es compartida por todos los usuarios, ya que  todos los usuarios del cliente_qt se descargan y van actualizando dicha base de datos.

Pagar mediante bitcoins se asemejaría a realizar una modificación dentro de esa base de datos compartida de forma que, las unidades contables (bitcoins) que se encontraban en un registro (dirección bitcoin desde la que salen), pasan a estar en otro diferente (dirección bitcoin a la que llegan).

Pero para poder realizar esta operación de pago se deben cumplir dos condiciones. La primera es que quien ordena el pago sea el legítimo propietario de los bitcoins que se encuentran en la dirección de salida. Y la segunda es que toda la red de usuarios se aseguren de que tu pago no se trata de un intento de fraude en forma de doble gasto.

El posible intento de fraude se comprueba efectivamente en la cadena de bloques, ya que todas las unidades contables (BTC) y su histórico de movimientos son públicos.

Y la legítima propiedad se valida cuando todos los usuarios comprueban que el propietario de los bitcoins de la dirección de salida firma con la correspondiente clave privada. Esta clave privada se guarda en su billetera (archivo wallet.dat) y corresponde de forma unívoca con la dirección bitcoin que hay publicada en la cadena de bloques y que contiene los bitcoins que serán transferidos a la dirección de destino.

Así pues, aquel que posea la clave privada, estará en disposición de firmar una transacción válida de todos los bitcoins que su correspondiente y unívoca dirección bitcoin pueda contener en la cadena de bloques. Dicho en román paladino, aquel que posea la clave privada podrá gastar los bitcoins.

Por eso es de vital importancia que guardemos celosamente las claves privadas que dan acceso a nuestros bitcoins. Si alguien consigue acceder a esas claves tendrá acceso directo a nuestros ahorros.

Sabiendo esto, los cerebritos de esta comunidad desarrollaron mecanismos para reducir la exposición de las claves privadas a posibles atacantes. Las formas principales fueron cifrando la billetera y posibilitando la creación de parejas de claves públicas-privadas en ordenadores que nunca tendrán contacto con internet y por tanto, nunca habrán sido expuestos a troyanos, keyloggers, etc. Son las llamadas paperwallets. Estas paperwallets son muy interesantes ya que permiten enviar bitcoins a direcciones cuyas claves privadas jamás han sido expuestas al riesgo de hackeo, ya que sus propietarios las conservan a buen recaudo en forma de papel.

Pero tienen el inconveniente de que, si en algún momento queremos gastar esos bitcoins ahorrados en la dirección de la paperwallet, tenemos que firmar la correspondiente transacción con la clave privada que hay imprimida en el papel en un ordenador que tenga acceso a internet para poder publicar en la red dicha transacción. Y esto nos devuelve de nuevo al riesgo de los keyloggers, troyanos, etc.

Así que la solución para obtener una seguridad máxima es el poder construir y firmar una transacción válida desde un ordenador que jamás haya tenido o vaya a tener contacto con internet. Esto es, construir y firmar una transacción offline.

Por eso me gasté 1BTC en pagar a alguien para que hiciera algo tan extremadamente útil para evitar robos de claves y hackeos varios a novatos e inexpertos como yo.

AbraxasCcs (OP)
Legendary
*
Offline Offline

Activity: 1568
Merit: 1032


Beyond the flavor!


View Profile
May 28, 2013, 07:42:31 AM
 #3

Lo pregunto porque todos los días intento aprender algo nuevo sobre el bitcoin y como se utiliza y las transacciones firmadas ha sido algo que siempre se me ha escapado. He preguntado a varios amigos y todos me mandan a leer más pero incluso se me hace difícil entender lo que leo al respecto, pues a la hora de hacer lo que leo no obtengo ningún resultado.

Mine Chococoin, eat real chocolate!
Bitrated user: Abraxas.
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 28, 2013, 08:07:46 AM
 #4

Aquí tienes el post con los links del programador que hizo la página con la que poder construir la transacción (la online) que después pasas al ordenador desconectado de internet (offline) donde se firmará con la clave privada.

The first prototype of w1R903's bitcoin-secured seems to work fine. I tried to make it more straightforward to use.

Online part:
http://offlinewallet.appspot.com/

Offline part:
http://offlinewallet.appspot.com/signtransaction.zip

Una vez firmada la transacción ya puede publicarse por la red bitcoin sin miedo, bien mediante el cliente_qt o bien mediante https://blockchain.info/pushtx

AbraxasCcs (OP)
Legendary
*
Offline Offline

Activity: 1568
Merit: 1032


Beyond the flavor!


View Profile
May 28, 2013, 09:11:05 AM
Last edit: May 28, 2013, 09:38:39 AM by AbraxasCcs
 #5

Gracias!!!

Recien he visto tu esfuerzo y te agradezco enormemente, ahora me pongo a leer. Si me surje una duda te la hago llegar seguramente.

Gracias again.

Edito luego de leer:

Veamos si ahora entiendo.

Una persona A por un servicio prestado exige a una persona B un pago X:

La persona A opta por una transacción segura por lo que genera una clave publica de una clave privada también generada de modo offline. De este movimiento offline nuestro personaje A obtiene la clave publica con la cual le pedirá el pago a B.

B deposita el dinero en la clave publica.

Y luego con el tiempo A retira los fondos de dicha clave pública "firmando" con su clave privada en un movimiento online.

¿es más o menos así?

Edito de nuevo: 

Ya veo que no es así... porque la firma se hace también de manera offline y luego se hace el lo que se llama push.

Mine Chococoin, eat real chocolate!
Bitrated user: Abraxas.
dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
May 28, 2013, 09:25:53 AM
 #6

No entiendo eso de firmar transacciones y menos transacciones offline. ¿Hay alguien con la suficiente paciencia y nivel pedagógico que pueda ayudarnos? (somos varios con la duda) 

Una transacción consta de "entradas" y "salidas". Las entradas apuntan a salidas de transacciones previas. Cuando tú me haces una transacción, las entradas apuntan a las salidas de otras transacciones que has recibido en el pasado. Y en las salidas no pones mi dirección, realmente lo que pones es "el que tenga la clave privada correspondiente a esta dirección". Y yo, a la hora de querer gastar esas coins, ¿cómo demuestro que la tengo? Pues firmando mi nueva transacción con ella.
AbraxasCcs (OP)
Legendary
*
Offline Offline

Activity: 1568
Merit: 1032


Beyond the flavor!


View Profile
May 28, 2013, 09:44:23 AM
Last edit: May 28, 2013, 09:56:41 AM by AbraxasCcs
 #7

No entiendo eso de firmar transacciones y menos transacciones offline. ¿Hay alguien con la suficiente paciencia y nivel pedagógico que pueda ayudarnos? (somos varios con la duda)  

Una transacción consta de "entradas" y "salidas". Las entradas apuntan a salidas de transacciones previas. Cuando tú me haces una transacción, las entradas apuntan a las salidas de otras transacciones que has recibido en el pasado. Y en las salidas no pones mi dirección, realmente lo que pones es "el que tenga la clave privada correspondiente a esta dirección". Y yo, a la hora de querer gastar esas coins, ¿cómo demuestro que la tengo? Pues firmando mi nueva transacción con ella.

Perfecto. Ya entendí la teoría. Solo me falta hacerlo en la practica.

¿Algún voluntario? tengo 0.0035 BTC para dedicarlos a esta practica.


EDIT:

Gracias a ambos ya entendí perfectamente todo. Te voy a donar mis 0.0035 BTC como un pequeño pago a tu esfuerzo y tu contribución. Polvos, veamos si lo sé hacer desde los link que colocaste acá. Todo sea en nombre de la ciencia.

Mine Chococoin, eat real chocolate!
Bitrated user: Abraxas.
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 28, 2013, 10:12:01 AM
 #8

Me alegra ver que lo has entendido. Si haces la donación mediante la aplicación esa que te he puesto, pon el link a la transacción de blockchain.org y así podremos ver todos que el construir y firmar transacciones offline es sencillo.

Lo que cuenta dserrano5 es muy importante. Generalmente la condición para que alguien pueda hacer uso de los bitcoins que le has transferido suele ser "demostrar que posee la clave privada correspondiente a esta dirección". Pero en un futuro esa condición podrá condicionarse de formas distintas, dando lugar a la posibilidad de realizar "contratos" complejos.

Por ejemplo, poder gastar esos bitcoins sólamente después de haber pasado un determinado tiempo, o necesitar la firma conjunta de varias personas, etc. (Buscad en google Bitcoin - Contracts y veréis la de posibilidades que se abrirán en el futuro)

AbraxasCcs (OP)
Legendary
*
Offline Offline

Activity: 1568
Merit: 1032


Beyond the flavor!


View Profile
May 28, 2013, 10:17:46 AM
 #9

Me alegra ver que lo has entendido. Si haces la donación mediante la aplicación esa que te he puesto, pon el link a la transacción de blockchain.org y así podremos ver todos que el construir y firmar transacciones offline es sencillo.

Ok, pero aqui de nuevo me quedo pegado.  Grin

¿Debes darme tu una dirección a donde mandarte el donativo? o ¿debo generar una y luego mandarte la llave privada por otra vía?

---------------------------------------------------------------------------------------------------

Ok, un momento. Ya se me estan cruzando los cables de nuevo.

Acabo de ver una opción en Blockchain que dice "Sign a message" "Use this tool to sign a message which proves that you own an address. Only Sign Detailed Messages you fully agree with, never sign vague messages. Pressing Sign Message may cause your browser to become unresponsive for a few seconds."

¿Esto es más de lo mismo o es otra cosa? Porque te da un espacio donde escribir y luego te da un código todo extraño.

Mine Chococoin, eat real chocolate!
Bitrated user: Abraxas.
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 28, 2013, 10:26:09 AM
 #10

Las claves privadas no se entregan jamás. A NADIE.
Si yo quisiese un donativo te daría una dirección pública (una dirección Bitcoin válida) a la que tu podrías enviarme los bitcoins.

Recuerda, si me das la clave privada de alguna de tus direcciones, te podré robar el dinero que tengas en ellas en cualquier momento (actual o futuro).

Imagina que me das una clave privada de las que hay en tu billetera (wallet.dat) y resulta que, en algún momento en el futuro, el cambio de una de tus transacciones recae en la dirección bitcoin de la clave privada que me diste tiempo atrás. Yo podría robarte ese dinero.

Para pagar mediante bitcoin símplemente has de hacer una transacción. Y agradezco tu ofrecimiento pero lo declino ya que, en un futuro, tendrás seguro ocasión de agradecer la ayuda de gente más pedagógica que yo o podrás regalárselos a alguien para introducirlo en el universo Bitcoin.

Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 28, 2013, 10:35:23 AM
 #11

Ok, un momento. Ya se me estan cruzando los cables de nuevo.

Acabo de ver una opción en Blockchain que dice "Sign a message" "Use this tool to sign a message which proves that you own an address. Only Sign Detailed Messages you fully agree with, never sign vague messages. Pressing Sign Message may cause your browser to become unresponsive for a few seconds."

¿Esto es más de lo mismo o es otra cosa? Porque te da un espacio donde escribir y luego te da un código todo extraño.

Ese botón es para firmar un mensaje, no para realizar una transacción. Firmar un mensaje sirve para demostrar que eres el propietario de una determinada clave privada.

Te voy a poner un ejemplo de para lo que sirve. Imagínate que yo tengo una web en la que vendo juguetes sexuales a cambio de Bitcoins. En esa web yo tengo una única dirección bitcoin a la que tenéis que enviar los bitcoins para pagarme. Tú me pagas allí 2 bitcoins por un liguero y un consolador XXL.

Como las transacciones bitcoin son públicas y cualquiera sabe cuál es la dirección bitcoin de mi tienda, un listillo puede intentar suplantar tu identidad y enviarme un email diciéndome que ha sido él el que me ha efectuado el pago, pero que se acaba de mudar de domicilio y quiere que le envíe los productos a una dirección distinta a la que tú me diste cuando hiciste el pedido.

¿Cómo puedo saber yo cuál de los dos dice la verdad? Pues pediría que me enviáseis un mensaje con la dirección de entrega de la mercancía firmado con la clave privada desde la que los bitcoins salieron hacia mi dirección. De esta forma sólamente aquel que tenga en su posesión esa clave privada podrá acreditar la titularidad de los bitcoins que participaron en la transacción.

AbraxasCcs (OP)
Legendary
*
Offline Offline

Activity: 1568
Merit: 1032


Beyond the flavor!


View Profile
May 28, 2013, 10:47:13 AM
 #12

Eso es correcto. Si yo te daba una clave privada lo hacia de modo protegido es decir que no pertenezca a ninguna de las llaves privadas de las que yo hago uso en mi wallet.

Estaba viendo que en https://coinb.in/brainwallet.html te permite hacer llaves (privadas y su correspondiente dirección pública) generandolas de una password. De modo que pensaba hacerte el donativo a una address generada por ese medio y luego mandarte por privado la privkey para que luego tu cobres el monto depositado en tal address. Tal sistema tiene el inconveniente que tu desecharas tal address porque ya seremos dos las personas que tenemos la privkey de esa dirección.

Además hay un mayor pago de comisiones de esa forma. Porque tu transferirás ese donativo a una cuenta segura y allí hay que pagar de nuevo comisión.

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.


Mine Chococoin, eat real chocolate!
Bitrated user: Abraxas.
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 28, 2013, 01:08:13 PM
 #13

¿Se te habría ocurrido enviarme la clave privada cifrada con mi clave pública de GPG? Te lo digo porque, en el caso de que me enviases por correo electrónico o por mensaje privado del foro esa clave privada lo estarías haciendo a través de dos cauces extremadamente inseguros.

Si lo hicieras por correo electrónico, éste es fácilmente hackeable y algunos organismos estatales de espionaje tendrían acceso a él (ECHELON, SITEL). Si lo intentases por Whassup o por SMS, las operadoras de telefonía tienen acceso directo al SMS y el whassup también está crackeado e intervenido por los servicios secretos.

Y si lo intentases por mensaje privado del foro, los administradores tienen acceso a dichos mensajes y ten por seguro que algunos de ellos seguro que están olfateándolos por si a algún novato se le ocurriese cometer semejante error.

Si en algún momento tienes que enviar información sensible SIEMPRE debes hacerlo de forma cifrada, porque TODOS los canales de comunicación están intervenidos.

Imagínate que soy un moderador/administrador que quiero dejar mi cargo en el foro, pero antes quiero llevarme un "dinerillo" conmigo. Símplemente he de olfatear todos los privados sin cifrar que enviáis a Vescudero (por poner un ejemplo) y hacer un ataque man in the middle, de forma que iría sustituyendo vuestras direcciones bitcoin en las que confiáis que os envíe los bitcoins que estáis comprando, por direcciones de mi propiedad y a él le enviaría esos mensajes privados modificados.


dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
May 28, 2013, 01:54:13 PM
 #14

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:

Code:
$ bitcoind createrawtransaction '[{"txid":"e9519006d274f9e54edea5a9751f342121e4f24f3c8a37be4ec3151dad53d71c","vout":0}]' '{"12345Vypv2QSmuRXcciT5oEB27mPbWGeva":26}'
01000000011cd753ad1d15c34ebe378a3c4ff2e42121341f75a9a5de4ee5f974d2069051e90000000000ffffffff0100daf89a000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000

El churro resultante lo descodificamos con decoderawtransaction (no hace falta en la práctica):

Code:
$ 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):

Code:
$ 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:

Code:
$ 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 Wink.

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.
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 28, 2013, 09:38:06 PM
 #15

dserrano5, veo un problemilla en tu planteamiento. Y es que, si no recuerdo mal, el cliente_qt sólamente puede crear transacciones que incluyen "unspent outputs" de direcciones bitcoin cuyas claves privadas se encuentran en tu billetera. Esto significa que con el comando createrawtransaction podrías construir una transacción válida según la cadena de bloques de tu cliente, pero con bitcoins cuyas claves privadas ya se encuentran en el archivo wallet.dat. Por lo tanto esa clave privada ya podría haber sido "expuesta" a posibles hackeos.

No dudes en corregirme si me equivoco, pero como te digo, creo que había un problemilla a la hora de construir raw transactions a través de comandos rpc sin tener la correspondiente clave privada en la billetera. De ahí que tuviera que consultarse a servidores externos (blockchain.org o electrum) la información sobre unspent outputs de direcciones bitcoin cuyas claves privadas no se encontraban en el equipo.

Aunque puede ser que esté equivocado, ya que no tengo ni idea de programación.

btcven
Hero Member
*****
Offline Offline

Activity: 715
Merit: 500


Bitcoin Venezuela


View Profile WWW
May 28, 2013, 10:18:26 PM
 #16

Para usuarios básicos:

Electrum usando seedless wallets (carteras sin semilla).

Admin: rdymac (PGP) | contacto@bitcoinvenezuela.com | @cafebitcoin | Electrum, lightweight bitcoin client
If I've been helpful tip me a coffee! Cheesy1rdymachKZpA9pTYHYHMYZjfjnoBW6B3k Bitrated user: rdymac.
dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
May 29, 2013, 04:36:14 AM
 #17

dserrano5, veo un problemilla en tu planteamiento. Y es que, si no recuerdo mal, el cliente_qt sólamente puede crear transacciones que incluyen "unspent outputs" de direcciones bitcoin cuyas claves privadas se encuentran en tu billetera. Esto significa que con el comando createrawtransaction podrías construir una transacción válida según la cadena de bloques de tu cliente, pero con bitcoins cuyas claves privadas ya se encuentran en el archivo wallet.dat. Por lo tanto esa clave privada ya podría haber sido "expuesta" a posibles hackeos.

No dudes en corregirme si me equivoco, pero como te digo, creo que había un problemilla a la hora de construir raw transactions a través de comandos rpc sin tener la correspondiente clave privada en la billetera. De ahí que tuviera que consultarse a servidores externos (blockchain.org o electrum) la información sobre unspent outputs de direcciones bitcoin cuyas claves privadas no se encontraban en el equipo.

Aunque puede ser que esté equivocado, ya que no tengo ni idea de programación.

Code:
$ bitcoind createrawtransaction '[{"txid":"deadbeef","vout":0}]' '{"12345Vypv2QSmuRXcciT5oEB27mPbWGeva":2}'
0100000001efbeadde000000000000000000000000000000000000000000000000000000000000000000ffffffff0100c2eb0b000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000
$ bitcoind decoderawtransaction 0100000001efbeadde000000000000000000000000000000000000000000000000000000000000000000ffffffff0100c2eb0b000000001976a9140b5b86d88f06861798ea629265fb793862c4755d88ac00000000
{
    "txid" : "395791169994ef6826a952a21f8329ff132ffdb8c93a148103fc0ec069f2b670",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "00000000000000000000000000000000000000000000000000000000deadbeef",
            "vout" : 0,
            "scriptSig" : {
                "asm" : "",
                "hex" : ""
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 2.00000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 0b5b86d88f06861798ea629265fb793862c4755d OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a9140b5b86d88f06861798ea629265fb793862c4755d88ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "12345Vypv2QSmuRXcciT5oEB27mPbWGeva"
                ]
            }
        }
    ]
}

Tú en createrawtransaction pones una transacción cualquiera, aunque como en este ejemplo no exista (quién sabe, a lo mejor la has creado localmente y todavía no está en la cadena de bloques, pero lo estará en el futuro). Esto no tiene ninguna relación con claves privadas ni nada, simplemente le dices qué inputs y outputs vas a conectar para crear una transacción nueva.

Con signrawtransaction sí que firmas, y sí que las claves privadas entran en juego, pero da igual porque esto idealmente lo realizas en un ordenador offline. Si las claves privadas no están en tu wallet las puedes especificar en la propia línea de comandos, quizá es eso lo que tenías en la cabeza… pero ya te digo, no es en el paso de construir la transacción sino al firmarla.
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 29, 2013, 05:59:13 AM
 #18

Yo cuando he intentado construir transacciones desde la ventana de depuración, para obtener la txid (identificador de la transacción) he tenido que utilizar el comando "listunspent", que te devuelve el listado de unspent_outputs que puedes utilizar en la transacción. Y ese pool de unspent_transactions lo forma el cliente_qt de aquellas direcciones bitcoin cuya clave conserva en la billetera.

Y si pruebo a obtener el txid de cualquier otra transacción (una transacción a cualquier otra dirección bitcoin de una paperwallet) mediante el comando "gettransaction", mira lo que dice la ayuda:

gettransaction <txid>
Get detailed information about in-wallet transaction <txid>

Te da información, pero siempre de transacciones que "entren" en la billetera, o sea, que tengan relación con las claves que conservas allí.

dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
May 29, 2013, 07:40:12 AM
 #19

Y si pruebo a obtener el txid de cualquier otra transacción (una transacción a cualquier otra dirección bitcoin de una paperwallet) mediante el comando "gettransaction"

No puedes obtener el txid de una transacción con ese comando, puesto que necesitas saberlo de antemano para poder usarlo Wink.


mira lo que dice la ayuda:

gettransaction <txid>
Get detailed information about in-wallet transaction <txid>

Te da información, pero siempre de transacciones que "entren" en la billetera, o sea, que tengan relación con las claves que conservas allí.

Esto es así porque el cliente no guarda toda la información de todas las transacciones de la red. Cuando haces un gettransaction el cliente se va a tu wallet a consultarla, ya que tus transacciones se guardan en él.

Esto, de todas formas, no tiene que ver con createrawtransaction. Siempre puedes ir a blockchain.info a mirar el txid que te interese y ponerlo en createrawtransaction, tal como he puesto en el anterior mensaje.
Polvos
Hero Member
*****
Offline Offline

Activity: 597
Merit: 500



View Profile
May 29, 2013, 07:54:40 AM
 #20

Esto, de todas formas, no tiene que ver con createrawtransaction. Siempre puedes ir a blockchain.info a mirar el txid que te interese y ponerlo en createrawtransaction, tal como he puesto en el anterior mensaje.

Si, eso es precisamente lo que hace la aplicación esa que he posteado para hacer transacciones offline, tú le das la dirección bitcoin y la aplicación busca en blockchain.info todas las "unspent_outputs" que tiene para meterlas como input de una transacción.

De todos modos yo aquí sí que tengo una duda muy importante, y creo que tú me podrías ayudar. Yo sé que tú usas linux porque me ha parecido leértelo en algún post anterior (algo así como que en tu oficina donde curras todos usan linux). Yo como usuario de windows, aunque intento construir una transacción mediante la ventana de depuración con el comando "createrawtransaction", siempre me da error aunque los parámetros que introduzca sean correctos.

En este hilo hablan sobre ello:

https://bitcointalk.org/index.php?topic=104512.0

Pero yo no entiendo ni el 50% de lo que están escribiendo en código allí Sad  ¿Tú me puedes ayudar a entenderlo?

Pages: [1] 2 »  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!