Author

Topic: Ayuda con APIs de blockexplorer y blockchain (Read 1105 times)

sr. member
Activity: 462
Merit: 250

Vaya churro de transacción.... un mogollón de direcciones, cada una con unos pocos satoshis. ¿La has hecho tú? ¿Estas repartiendo BTCs entre muchas direcciones propias? Como te han dicho, el nuevo cliente de bitcoin no cotejará, por defecto, transacciones tan pequeñas.

En blockchain.info no dicen lo que ocupa, pero debe ser bastante. Lo mismo los mineros consideran que la tasa ofrecida es demasiado pequeña para el tamaño que tiene.

De todas formas, el hilo no va de esto, sino de los bloques resueltos sin transacciones.
No es mía, la he recibido de una página web.

Ya comenté en otro hilo que lo ideal sería que esas páginas acumularan las transacciones a lo largo de una o varias semanas, pero las transacciones que ya están hechas, lo lógico es que fueran incluidas en bloques.

Lo que venía a comentar es que ningún bloque sin transacciones debería ser válido si hay transacciones válidas con más de unas horas de antigüedad sin incluir. Bitcoin es una moneda, es para intercambiar valor, no para producirlo a partir de la nada con la "minería" y creer que la gente lo aceptará sin más.
legendary
Activity: 1974
Merit: 1029
En blockchain.info no dicen lo que ocupa, pero debe ser bastante. Lo mismo los mineros consideran que la tasa ofrecida es demasiado pequeña para el tamaño que tiene.

Sí lo pone: "Tamaño 53235 (bytes)". A efectos de la comisión necesaria esto cuenta como 54 Kb, que multiplicados por la comisión mínima de 0.0005 resulta en 0.0270 BTC. Claro, ahora con la versión 0.8.2 la comisión mínima pasa a ser 0.0001, lo que multiplicado por 54 da 0.0054, que es precisamente lo que han pagado. O sea, que cuando algún minero se actualice a la 0.8.2 y lo configure para permitir salidas de menos de 5430 satoshis (concretamente 400 en este caso), esta transacción podrá incluirse en un bloque sin demasiados problemas. Lo que sí es un problema es que aparezcan mineros de esos…
sr. member
Activity: 252
Merit: 250

Vaya churro de transacción.... un mogollón de direcciones, cada una con unos pocos satoshis. ¿La has hecho tú? ¿Estas repartiendo BTCs entre muchas direcciones propias? Como te han dicho, el nuevo cliente de bitcoin no cotejará, por defecto, transacciones tan pequeñas.

En blockchain.info no dicen lo que ocupa, pero debe ser bastante. Lo mismo los mineros consideran que la tasa ofrecida es demasiado pequeña para el tamaño que tiene.

De todas formas, el hilo no va de esto, sino de los bloques resueltos sin transacciones.
legendary
Activity: 1974
Merit: 1029
El cambio va en la 0.8.2, que acaba de salir. A medida que la gente empiece a usarla, estas transacciones se considerarán no estándar. El límite es un simple valor por defecto (5430 satoshis, 0.00005430 btc) que cambiará según el precio de bitcoin evolucione al alza o a la baja. Y no sólo eso, los usuarios pueden configurarlo al gusto para ponerlo a cero si quieren, desde hoy mismo.
legendary
Activity: 1820
Merit: 1017
Me imagino que cuando lo implementen se decidirá una fecha determinada a partir de la cual ya no se aceptarán transacciones por debajo de ese mínimo.
sr. member
Activity: 462
Merit: 250
Si, pero lo lógico sería implementarlo de forma gradual, para que las páginas web se adapten y no queden transacciones sin confirmar.
legendary
Activity: 1820
Merit: 1017
En GitHub le leí a Gavin Andresen que iban a implementar un montante mínimo a partir del cual la red bitcoin no ejecutaría la transacción por considerarse antieconómica, es decir, dicha transacción implica mayores costos energéticos para su procesamiento por la red que el valor real de la cantidad que se pretende transferir. Esto impondría un límite inferior (que será móvil, supongo) a todos los micropagos.

En esa transacción la mayoría de los pagos son de unos cientos de satoshis, lo que significa que dichas cantidades representan unas pocas diezmilésimas de euro o unos céntimos de céntimos de euro. Se necesitarían unos 20 pagos de ese tipo para alcanzar el céntimo de euro; estoy seguro que ahora mismo no compensa el tiempo y la energía dedicados a un servicio que te aporta 0,000005 BTC, ni siquiera como experimento. Pienso que este tipo de transacciones son más perjudiciales que beneficiosas para bitcoin.
sr. member
Activity: 462
Merit: 250
Más de una semana y aún sin confirmar:
http://blockchain.info/es/tx/b9bc3cd7981eac11671de0632127a96ce082c32ce5f1fe3599e280ea6a76f160

Es evidente que hay que hacer algo.
legendary
Activity: 1974
Merit: 1029
Y el código es bastante más complejo de lo que me esperaba  Shocked

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í.
sr. member
Activity: 252
Merit: 250
Muy interesante pero... ¿cómo generas el fichero block-sizes-txns?

Ojo que hay par de cochinadas ahí dentro Tongue:

Code:
#!/usr/bin/perl
...

No usa RPC, esto parsea los archivos de la blockchain a pelo. La detección de huérfanos está poco probada.

Joer, qué flipada. No recordaba que lo hicieras a pelo sobre la cadena de bloques descargada. Y el código es bastante más complejo de lo que me esperaba  Shocked

Enhorabuena por tus habilidades y gracias por compartirlo.
legendary
Activity: 1974
Merit: 1029
Muy interesante pero... ¿cómo generas el fichero block-sizes-txns?

Ojo que hay par de cochinadas ahí dentro Tongue:

Code:
#!/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.
sr. member
Activity: 252
Merit: 250

Formato "bloque,tamaño,transacciones":

Code:
$ wget https://dl.dropboxusercontent.com/u/24587684/block-sizes-txns
$ grep ',1$' block-sizes-txns |less


Muy interesante pero... ¿cómo generas el fichero block-sizes-txns? En algún otro hilo recuerdo haber visto programas tuyos para inquirir a la red por datos sobre bloques, y operando con ellos.


O sea, actualmente sólo unos 6 de cada 1000 bloques vienen sin transacciones.

Sí, estoy de acuerdo en el cálculo. Además, parece que hace unos pocos meses el asunto fue un poco más intenso. Y al comienzo... casi todos eran así (lógicamente, por otro lado).

Si los 3 "pools" principales se ponen de acuerdo en rechazar los bloques con menos del 50% de sus propias transacciones con la tasa apropiada, esta plaga se terminaba y a los botnets se les daba una buena patadita en el culo.
legendary
Activity: 1974
Merit: 1029
dserrano5: sabía que no me fallarías  Wink En cuanto pueda le echo un vistazo a ese código y te digo algo.

Jejeje Cheesy. 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 Wink.
sr. member
Activity: 462
Merit: 250
¿Está bautizado el problema? Yo propongo "lazy nodes", porque son cazasubenciones.

Debería existir algún criterio, por ejemplo, si existen transacciones con más de 1 hora de antigüedad, que no se acepten bloques sin transacciones.

EDITO: he visto tu mensaje, y es una buena hipótesis. Pues unos 2500€ que se ganan cada vez que suena la flauta...
sr. member
Activity: 252
Merit: 250
Lo de los bloques vacíos es fácil: que el resto de mineros detecten esos bloques y no minen sobre ese bloque sino sobre el anterior.

Es decir, mientras haya transacciones en el aire (que las había, yo tengo alguna de hace una semana y aún no está confirmada) que no se acepte el bloque. Por mucho que se empeñe ese nodo en seguir minando, si el resto son mayoría, ese bloque quedará huérfano.

Esa es la receta que pienso yo. Me parece mucha cara pasar olímpicamente de las transacciones y dedicarte a minar sólo con la "coinbase". Y en el caso de que algún minero consiga un bloque a partir del bloque vacío, pues qué remedio, a seguir la cadena. Pero si los "pools" más grandes se ponen de acuerdo, frenan en seco ese comportamiento incívico.

Es posible que haya cierta picaresca en torno a estos bloques, quizás se minen más rápido y por eso sean producidos.

No, parece ser que son botnets (redes de ordenadores zombies, infectados con un troyano que se dedica a minar). El ordenador zombie se dedica a minar sobre bloques vacíos porque así no necesita descargarse la cadena completa (que es necesaria para comprobar transacciones) y pasa más desapercibido al usuario verdadero del ordenador.

dserrano5: sabía que no me fallarías  Wink En cuanto pueda le echo un vistazo a ese código y te digo algo.
legendary
Activity: 1974
Merit: 1029
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  Wink

Formato "bloque,tamaño,transacciones":

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

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

Code:
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.
sr. member
Activity: 462
Merit: 250
Lo de los bloques vacíos es fácil: que el resto de mineros detecten esos bloques y no minen sobre ese bloque sino sobre el anterior.

Es decir, mientras haya transacciones en el aire (que las había, yo tengo alguna de hace una semana y aún no está confirmada) que no se acepte el bloque. Por mucho que se empeñe ese nodo en seguir minando, si el resto son mayoría, ese bloque quedará huérfano.


Es posible que haya cierta picaresca en torno a estos bloques, quizás se minen más rápido y por eso sean producidos.
-----------------------------

En cuanto a APIs no podría recomendarte mucho... Sad

Pero si podría proponerte un programa en C que usando wget se descargue los bloques siguiendo este formato:

http://blockexplorer.com/b/238380     ------Podrías convertirlo en------->   http://blockexplorer.com/b/%i

Sólo necesitas un for(i=bloque_inicial;i Finalmente podrías borrarlos para ahorrar disco duro. Si puedes montar una unidad virtual en la memoria, podrás analizar los bloques más rápido.

Puedes analizar los bloques contando las apariciones de "", que te da el número de transacciones contando la de generación. No te preocupes por la columna del título, que se aparece como "" y no la contarías.

Edito, tendrías que localizar esta cadena:
Code:
Transactions?: 5
Y analizar el número que aparece. Incluso puedes ir buscando carácter por carácter hasta contar 34 (asegúrate de que está bien) apariciones de ':' y entonces leer el número que aparezca a continuación y convertirlo a int con aoi(cadena).

Si te parece bien puedo ayudarte con el código un poco, aunque en mi caso al tener MS/Windows no se si podré usar algún comando similar a wget, pero puedo realizar simulaciones en mi disco duro.
sr. member
Activity: 252
Merit: 250
En este hilo (en inglés) he manifestado mi preocupación por el alarmante incremento de bloques que no contienen transacciones (bueno, sólo una: la de generación).

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  Wink

Gracias anticipadas.
Jump to: