Yo es que lo de pagar por software… no lo acabo de ver.
|
|
|
Una cosa sí que hay que reconocerles a estos chicos: la verdad es que son unos profesionales del scam… no han entregado nada y la gente sigue lamiéndoles el ****.
|
|
|
Y el código es bastante más complejo de lo que me esperaba Enhorabuena por tus habilidades y gracias por compartirlo. Gracias. Si tienes preguntas estoy en el IRC, que va a ser más conveniente y menos spammy que ponerse a charlar por aquí.
|
|
|
Bueno, tan offtopic no es, porque estamos hablando de poder construir una transacción offline a través del cliente_qt.
La razón última sí lo es porque a bitcoin hay que pasarle unas comillas (como parte del JSON) pero normalmente el intérprete de comandos que uses elimina algunas comillas y por tanto hay que "escaparlas"/"citarlas"/"quotearlas" y bla bla bla…
|
|
|
To everybody Do you think pywallet would be more practical as a Qt app?
Just as K1773R, I'd like to have a full working command-line interface, and am comfortable enough with a web browser for point n click usage.
|
|
|
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. ¿Qué intentas hacer y qué error te da? Un copy-paste del texto sería bastante ilustrativo . Edito: con 0.8.2rc1 me funciona bien la misma sintaxis que en la terminal de linux, es decir, createrawtransaction '[{"txid":"blabla","vout":0}]' '{"12345":0.01}'. Err, sí, pero es un poco off topic la verdad… además allí tienen la complicación adicional de trabajar en una ventana de msdos, no con la consola de depuración.
|
|
|
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 . 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.
|
|
|
Muy interesante pero... ¿cómo generas el fichero block-sizes-txns?
Ojo que hay par de cochinadas ahí dentro : #!/usr/bin/perl
use warnings; use strict; use List::MoreUtils qw/natatime/; use Data::Dumper;
my $MAGIC = 3652501241; my $BLOCKS_DIR = '/home/btc/.bitcoin/blocks';
## xxd-like output sub print_dump { my ($data) = @_;
my $offset = 0; open my $fd, '<', \$data or die "open: $!"; while (1) { my $read = read $fd, my $bytes, 16; last unless $read; my @bytes = split '', $bytes; my $rawchars = $bytes; $rawchars =~ s/[^ -~]/./g; my @hexpairs; my $iter = natatime 2, @bytes; while (my @vals = $iter->()) { push @hexpairs, join '', map { sprintf '%02x', ord } @vals; } printf "%08x: %-39s %s\n", $offset, (join ' ', @hexpairs), $rawchars; $offset += $read; } close $fd; }
sub read_var_int { my ($fd, $rem) = @_; my $val;
my $read = read $fd, $val, 1; $$rem -= 1; if (!$read) { return undef; } $val = unpack 'C', $val; if ($val == 0xfd) { $read = read $fd, $val, 2; $$rem -= 2; $val = unpack 'S', $val; } elsif ($val == 0xfe) { $read = read $fd, $val, 4; $$rem -= 4; $val = unpack 'L', $val; } elsif ($val == 0xff) { $read = read $fd, $val, 8; $$rem -= 8; $val = unpack 'Q', $val; }
return $val; }
sub read_inputs { my ($fd, $count, $rem) = @_; my $read; ## should be used to check ret vals from read/sysread my $inputs;
for my $input (1 .. $count) { my ($prev_txid, $prev_idx, $sig_script, $seq);
$read = read $fd, $prev_txid, 32; $$rem -= 32; $prev_txid = unpack 'H64', $prev_txid; #print " prev_txid ($prev_txid)\n";
$read = read $fd, $prev_idx, 4; $$rem -= 4; $prev_idx = unpack 'L', $prev_idx; #print " prev_idx ($prev_idx)\n";
my $sig_script_len = read_var_int $fd, $rem; if (!defined $sig_script_len) { print 'sig_script_len undef'; die; }
$read = read $fd, $sig_script, $sig_script_len; $$rem -= $sig_script_len; #printf " sig_script: %d bytes\n", length $sig_script;
$read = read $fd, $seq, 4; $$rem -= 4; $seq = unpack 'L', $seq; #print " seq ($seq)\n";
push @$inputs, { prev_txid => $prev_txid, prev_idx => $prev_idx, sig_script => $sig_script, seq => $seq, } }
return $inputs; }
sub read_outputs { my ($fd, $count, $rem) = @_; my $read; ## should be used to check ret vals from read/sysread my $outputs;
for my $output (1 .. $count) { my ($val, $pubkey_script_len, $pubkey_script);
$read = read $fd, $val, 8; $$rem -= 8; $val = unpack 'Q', $val;
$pubkey_script_len = read_var_int $fd, $rem; if (!defined $pubkey_script_len) { print 'pubkey_script_len undef'; die; }
$read = read $fd, $pubkey_script, $pubkey_script_len; $$rem -= $pubkey_script_len; #printf " pubkey_script: %d bytes\n", length $pubkey_script;
push @$outputs, { val => $val, pubkey_script => $pubkey_script, }; }
return $outputs; }
sub parse_txs { my ($txn_data, $len) = @_; my $read; ## should be used to check ret vals from read/sysread my $txs;
my $remaining = $len; open my $txn_fd, '<', \$txn_data or die "open: $!";
my $txn_count = read_var_int $txn_fd, \$remaining; if (!defined $txn_count) { print 'txn_count undef'; die; } #print " txn_count ($txn_count)\n"; return $txn_count; ## just return this for shevek, don't parse any further
#print_dump $txn_data;
my ($tx_ver, $input_count, $inputs, $output_count, $outputs, $lock_time); for my $tx_idx (1 .. $txn_count) { $read = read $txn_fd, $tx_ver, 4; $remaining -= 4; $tx_ver = unpack 'L', $tx_ver; #print " tx_ver ($tx_ver)\n";
$input_count = read_var_int $txn_fd, \$remaining; if (!defined $input_count) { print 'input_count undef'; die; } #print " input_count ($input_count)\n";
$inputs = read_inputs $txn_fd, $input_count, \$remaining; #print Data::Dumper->Dump ([$inputs],['inputs']);
$output_count = read_var_int $txn_fd, \$remaining; if (!defined $output_count) { print 'output_count undef'; die; } #print " output_count ($output_count)\n";
$outputs = read_outputs $txn_fd, $output_count, \$remaining; #print Data::Dumper->Dump ([$outputs],['outputs']);
$read = read $txn_fd, $lock_time, 4; $remaining -= 4; $lock_time = unpack 'L', $lock_time; #print " lock_time ($lock_time)\n";
push @$txs, { version => $tx_ver, inputs => $inputs, outputs => $outputs, lock_time => $lock_time, }; }
return $txs; }
sub parse_block { my ($height, $block_data, $len) = @_; my $read; ## should be used to check ret vals from read/sysread
my $remaining = $len; open my $block_fd, '<', \$block_data or die "open: $!";
my $block_header; $read = read $block_fd, $block_header, 80; $remaining -= 80;
my ($ver, $prev_block, $mrkl, $ts, $bits, $nonce) = unpack 'L H64 H64 L H8 L', $block_header; $prev_block = reverse $prev_block=~/../g; $mrkl = reverse $mrkl=~/../g;
my $txn_data; $read = read $block_fd, $txn_data, $remaining;
close $block_fd;
my $tx = parse_txs $txn_data, $remaining;
return { version => $ver, height => $height, prev_block => $prev_block, merkle_tree => $mrkl, timestamp => $ts, bits => $bits, nonce => $nonce, tx => $tx, }; }
my $blk_file_num = -1; my $fd; sub open_next_blk_file { close $fd if defined $fd; $blk_file_num++; my $blkfile = sprintf "$BLOCKS_DIR/blk%05d.dat", $blk_file_num; sysopen $fd, $blkfile, 0 or die "sysopen: $!"; binmode $fd; }
#################################################################################################
open_next_blk_file;
my $height = 0; my %prev_blocks_seen; while (1) { my $read; ## should be used to check ret vals from read/sysread my $data; my ($magic, $len, $remaining);
$read = sysread $fd, $data, 8; if (!defined $read) { die "sysread: $!"; } if (!$read) { warn "sysread: null, going to next file"; open_next_blk_file; redo; } if ($read < 8) { warn "sysread: short read, going to next file"; open_next_blk_file; redo; } ($magic, $len) = unpack 'L L', $data; $remaining = $len; next unless $magic; ## magic == 0, probably near end of file if ($MAGIC != $magic) { die "got magic ($magic) instead of ($MAGIC) at block $height\n"; } ## read whole block $read = sysread $fd, $data, $len; if ($len != $read) { $read or last; die "sysread: $!"; }
#print_dump $block_data; my $block = parse_block $height, $data, $len; ## orphan detection, untested on orphan chains larger than one single block if ($height and exists $prev_blocks_seen{ $block->{'prev_block'} }) { my $to_downgrade = ($height-1) - $prev_blocks_seen{ $block->{'prev_block'} }; warn "orphan, height ($block->{'height'}) pb ($block->{'prev_block'}) ts ($block->{'timestamp'}) to_downgrade ($to_downgrade)\n"; $height -= ($height-1) - $prev_blocks_seen{ $block->{'prev_block'} }; next; } print "$height,$len,$block->{'tx'}\n"; # if (128352 == $block->{'height'}) { # use bignum; # my $bits = join '', reverse $block->{'bits'} =~ /../g; # my ($b1, $b2) = map { hex $_ } $bits =~ /^(..)(.*)$/; # my $diff = (0xffff << 208) / ($b2 * 2 ** (8 * ($b1-3))); # $block->{'difficulty'} = "$diff"; # # print Data::Dumper->Dump ([$block],['block']); # }
$prev_blocks_seen{ $block->{'prev_block'} } = $height; $height++; } close $fd; No usa RPC, esto parsea los archivos de la blockchain a pelo. La detección de huérfanos está poco probada.
|
|
|
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.
$ 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.
|
|
|
I "use" it too. They attach files to it all the time. There's a while mailing list just for sending nudie girl pictures. They have to Base64 encode them though, but BM has a 180mb file limit.
Really? Well, that just shows how much I need to do more research. That alone would make this greatly more useful for me. There's even a proposal for implementing some kind of light MIME.
|
|
|
dserrano5: sabía que no me fallarías En cuanto pueda le echo un vistazo a ese código y te digo algo. Jejeje . Lo quería poner hace un rato en el hilo inglés pero es que estaba un poco liado en el curro y no podía pararme 10 minutejos para esto .
|
|
|
Por ejemplo se me ocurre partir de Tor, aunque aquí el tema es la dificultad de acceso del player medio.
Bueno, tenemos onion.to y similares…
|
|
|
Me gustaría hacer una pequeña estadística para ver cuántos bloques son de este tipo (especialmente entre los últimos). Sé que "preguntando" a blockexplorer y blockchain (via sus APIs), o incluso bitcoind, se puede hacer, quizá con un poco de programación. Pero no sé muy bien cómo. Soy usuario de linux, no me da miedo el código Formato "bloque,tamaño,transacciones": $ wget https://dl.dropboxusercontent.com/u/24587684/block-sizes-txns $ grep ',1$' block-sizes-txns |less Aquí un pequeño histograma que muestra el número de bloques con una sola transacción (la coinbase) por cada 1000 bloques: 0 984 ################################################################################################### 1 989 ################################################################################################### 2 990 ################################################################################################### 3 994 #################################################################################################### 4 995 #################################################################################################### 5 996 #################################################################################################### 6 994 #################################################################################################### 7 996 #################################################################################################### 8 997 #################################################################################################### 9 997 #################################################################################################### 10 996 #################################################################################################### 11 993 #################################################################################################### 12 997 #################################################################################################### 13 995 #################################################################################################### 14 992 #################################################################################################### 15 999 #################################################################################################### 16 999 #################################################################################################### 17 997 #################################################################################################### 18 994 #################################################################################################### 19 999 #################################################################################################### 20 997 #################################################################################################### 21 997 #################################################################################################### 22 997 #################################################################################################### 23 992 #################################################################################################### 24 997 #################################################################################################### 25 993 #################################################################################################### 26 990 ################################################################################################### 27 998 #################################################################################################### 28 996 #################################################################################################### 29 978 ################################################################################################## 30 995 #################################################################################################### 31 998 #################################################################################################### 32 998 #################################################################################################### 33 998 #################################################################################################### 34 994 #################################################################################################### 35 989 ################################################################################################### 36 987 ################################################################################################### 37 983 ################################################################################################### 38 981 ################################################################################################### 39 980 ################################################################################################## 40 966 ################################################################################################# 41 983 ################################################################################################### 42 982 ################################################################################################### 43 979 ################################################################################################## 44 978 ################################################################################################## 45 970 ################################################################################################# 46 958 ################################################################################################ 47 959 ################################################################################################ 48 964 ################################################################################################# 49 907 ########################################################################################### 50 885 ######################################################################################### 51 856 ###################################################################################### 52 859 ###################################################################################### 53 829 ################################################################################### 54 876 ######################################################################################## 55 857 ###################################################################################### 56 862 ####################################################################################### 57 821 ################################################################################### 58 807 ################################################################################# 59 745 ########################################################################### 60 726 ######################################################################### 61 759 ############################################################################ 62 735 ########################################################################## 63 722 ######################################################################### 64 763 ############################################################################# 65 575 ########################################################## 66 446 ############################################# 67 462 ############################################### 68 471 ################################################ 69 450 ############################################# 70 536 ###################################################### 71 641 ################################################################# 72 568 ######################################################### 73 562 ######################################################### 74 586 ########################################################### 75 556 ######################################################## 76 587 ########################################################### 77 555 ######################################################## 78 557 ######################################################## 79 529 ##################################################### 80 576 ########################################################## 81 387 ####################################### 82 459 ############################################## 83 415 ########################################## 84 492 ################################################## 85 589 ########################################################### 86 363 ##################################### 87 450 ############################################# 88 570 ######################################################### 89 596 ############################################################ 90 548 ####################################################### 91 610 ############################################################# 92 415 ########################################## 93 275 ############################ 94 443 ############################################# 95 523 ##################################################### 96 427 ########################################### 97 288 ############################# 98 337 ################################## 99 326 ################################# 100 335 ################################## 101 220 ###################### 102 229 ####################### 103 241 ######################### 104 194 #################### 105 185 ################### 106 349 ################################### 107 96 ########## 108 115 ############ 109 73 ######## 110 81 ######### 111 56 ###### 112 101 ########### 113 50 ##### 114 57 ###### 115 61 ####### 116 67 ####### 117 50 ##### 118 72 ######## 119 44 ##### 120 51 ###### 121 59 ###### 122 57 ###### 123 58 ###### 124 40 #### 125 33 #### 126 40 #### 127 27 ### 128 18 ## 129 15 ## 130 15 ## 131 18 ## 132 17 ## 133 14 ## 134 14 ## 135 13 ## 136 25 ### 137 22 ### 138 19 ## 139 12 ## 140 20 ## 141 22 ### 142 20 ## 143 20 ## 144 24 ### 145 29 ### 146 17 ## 147 25 ### 148 22 ### 149 19 ## 150 19 ## 151 25 ### 152 32 #### 153 21 ### 154 27 ### 155 22 ### 156 38 #### 157 22 ### 158 30 ### 159 36 #### 160 35 #### 161 29 ### 162 31 #### 163 32 #### 164 26 ### 165 19 ## 166 24 ### 167 33 #### 168 26 ### 169 53 ###### 170 146 ############### 171 144 ############### 172 148 ############### 173 141 ############### 174 28 ### 175 23 ### 176 17 ## 177 18 ## 178 19 ## 179 21 ### 180 19 ## 181 17 ## 182 13 ## 183 15 ## 184 18 ## 185 18 ## 186 17 ## 187 11 ## 188 9 # 189 21 ### 190 26 ### 191 18 ## 192 15 ## 193 20 ## 194 12 ## 195 15 ## 196 26 ### 197 8 # 198 5 # 199 17 ## 200 5 # 201 11 ## 202 13 ## 203 18 ## 204 14 ## 205 23 ### 206 19 ## 207 22 ### 208 12 ## 209 12 ## 210 13 ## 211 5 # 212 8 # 213 13 ## 214 11 ## 215 9 # 216 10 # 217 8 # 218 8 # 219 7 # 220 18 ## 221 10 # 222 7 # 223 4 # 224 6 # 225 15 ## 226 6 # 227 11 ## 228 6 # 229 5 # 230 3 # 231 3 # 232 9 # 233 8 # 234 9 # 235 4 # 236 11 ## 237 9 # 238 8 # Edito: y una media móvil de 10 períodos termina así: 215 12 216 11 217 10 218 9 219 9 220 9 221 10 222 10 223 9 224 8 225 9 226 8 227 9 228 9 229 8 230 7 231 6 232 6 233 7 234 7 235 6 236 6 237 6 238 6 O sea, actualmente sólo unos 6 de cada 1000 bloques vienen sin transacciones.
|
|
|
Not off the top of my head, but look for the discussion around BIP 34.
And BIP 30 too. Thank you!
|
|
|
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.
|
|
|
* Once upon a time, it was possible to create identical chains of transactions.
Wow, got a link to this?
|
|
|
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.
|
|
|
Con respecto a la privacidad, el problema que veo en Bitcoin-qt es la falta de un mecanismo de control de monedas que permita elegir la dirección desde la que se hace un pago. [...] me parece más fácil gestionar estas cosas con una lista de direcciones en papel.
Es cierto que esa es una carencia notable; sin embargo a mí me parece que andar con papeles paquí y pallá es bastante más incómodo que usar alguna clase de parche o utilidad externa de las que hay disponibles. Yo mismo tengo un scriptcillo en perl y hace tiempo que no uso otra cosa. Sobre lo de la seguridad de tener que meter la contraseña, estoy de acuerdo. En linux aún te puedes saltar los keyloggers de X11 si operas en la tty (en ese punto haría falta un keylogger a nivel de núcleo) pero entonces se vuelve más incómodo.
|
|
|
En cualquier caso se puede implementar el sistema de https://bitcoinpaperwallet.com/, donde la clave privada queda escondida, y el billete queda inutilizado cuando es levantado el holograma. Ese paper wallet es chulo, sí, pero no nos quita el problema original: yo te pago tus servicios con uno de estos y al mismo tiempo hago una transfe de esos mismos fondos a otra dirección mía.
|
|
|
Yo doy ostias como panes.
¿Tiene ostias baguettes? Deme dos, gracias. Yo tampoco entiendo eso de la privacidad con los paper wallets...
|
|
|
|