Java: bitcoinj; ¿Cómo descargar un bloque completo?

Me gustaría descargar un bloque completo usando Java y bitcoinj y luego analizarlo en una matriz para poder trabajar con él. Aquí hay un pseudocódigo (muy básico):

connect to network;  
download latestBlock;  
write/convert block to readable array;  
read blockArray;  
   sout: blockArray[23][55] // this should get me eg. a txid, address, ...  
// or similar. I just want to be able to read values from the block 

¿Hay alguna forma de hacer esto? Encontré la siguiente solución aquí ( usando bitcoinj para descubrir pares y descargar la cadena de bloques ):

public class DumpLastBlock {
public static void main(String args[]) throws Exception {
    WalletAppKit kit = new WalletAppKit(MainNetParams.get(), new java.io.File("."), "test");
    kit.startAndWait();
    BlockChain chain = kit.chain();
    BlockStore bs = chain.getBlockStore();
    Peer peer = kit.peerGroup().getDownloadPeer();
    Block b = peer.getBlock(bs.getChainHead().getHeader().getHash()).get();
    System.out.println(b);
    }
}

Lamentablemente, kit.startAndWait() ya no está disponible.

¿Alguien puede ayudarme a obtener el último bloque y poder leer sus valores?

Muchas gracias :)

Respuestas (1)

El ejemplo en el código fuente de bitcoinj es exactamente lo que está buscando:

BriefLogFormatter.init();
// Parse command line arguments
OptionParser parser = new OptionParser();
OptionSet opts = null;
List<String> nonOpts = null;
try {
    parser.accepts("localhost", "Connect to the localhost node");
    parser.accepts("help", "Displays program options");
    opts = parser.parse(args);
    if (opts.has("help")) {
        System.out.println("usage: org.bitcoinj.examples.FetchBlock [--localhost] <blockHash>");
        parser.printHelpOn(System.out);
        return;
    }
    nonOpts = opts.nonOptionArguments();
    if (nonOpts.size() != 1) {
        throw new IllegalArgumentException("Incorrect number of block hash, please provide only one block hash.");
    }
} catch (OptionException | IllegalArgumentException e) {
    System.err.println(e.getMessage());
    System.err.println("usage: org.bitcoinj.examples.FetchBlock [--localhost] <blockHash>");
    parser.printHelpOn(System.err);
    return;
}

// Connect to testnet and find a peer
System.out.println("Connecting to node");
final NetworkParameters params = TestNet3Params.get();
BlockStore blockStore = new MemoryBlockStore(params);
BlockChain chain = new BlockChain(params, blockStore);
PeerGroup peerGroup = new PeerGroup(params, chain);
if (!opts.has("localhost")) {
    peerGroup.addPeerDiscovery(new DnsDiscovery(params));
} else {
    PeerAddress addr = new PeerAddress(params, InetAddress.getLocalHost());
    peerGroup.addAddress(addr);
}
peerGroup.start();
peerGroup.waitForPeers(1).get();
Peer peer = peerGroup.getConnectedPeers().get(0);

// Retrieve a block through a peer
Sha256Hash blockHash = Sha256Hash.wrap(nonOpts.get(0));
Future<Block> future = peer.getBlock(blockHash);
System.out.println("Waiting for node to send us the requested block: " + blockHash);
Block block = future.get();
System.out.println(block);
peerGroup.stopAsync();
Agregue los detalles del enlace en relación con la pregunta en su respuesta. En la respuesta actual, si el enlace deja de funcionar, los futuros usuarios no podrán obtener ninguna información de él.