Bitcoinj siempre obtiene 0 saldo

Estoy tratando de usar Bitcoinj para mi aplicación. Estoy usando el modo de registro. Tengo un saldo de 42 BTC en mi cuenta:

bitcoin-cli -regtest getbalance mirko3
-> 42.00000000

Mi código sigue:

public class ProvaBitcoinj {
    public static void main(String ... args) throws Exception {
        final DumpedPrivateKey dumpedPrivateKey = new DumpedPrivateKey(RegTestParams.get(), "cNDSqymhJbqmRJRpx3QPM8KBZuca2WePFkzj2uezp5TZhqHX4q4d");
        final ECKey key = dumpedPrivateKey.getKey();
        System.out.println("BTC address that will be added: " + key.toAddress(RegTestParams.get()));
        System.out.println("Private key that will be added: " + key.getPrivateKeyEncoded(RegTestParams.get()));

        final WalletAppKit kit = new WalletAppKit(RegTestParams.get(), new File("/tmp/bitcoinj"), "test_btc") {
            protected void onSetupCompleted() {
                System.out.println("Key chain size: " + wallet().getKeychainSize());
                for (ECKey k : wallet().getKeys()) {
                    wallet().removeKey(k);
                }

                wallet().addKey(key);
            }
        };
        kit.setAutoSave(true);
        kit.connectToLocalHost();
        System.out.println("Started!: " + kit.startAndWait());


        System.out.println("Keys: " + kit.wallet().getKeychainSize());
        System.out.println("BTC Address: " + kit.wallet().getKeys().get(0).toAddress(RegTestParams.get()));
        System.out.println("Private key: " + kit.wallet().getKeys().get(0).getPrivateKeyEncoded(RegTestParams.get()));

        System.out.println("Balance " + kit.wallet().getBalance());

//      kit.wallet().addEventListener(new AbstractWalletEventListener() {
//          @Override
//          public void onCoinsReceived(Wallet wallet, Transaction tx,
//                  BigInteger prevBalance, BigInteger newBalance) {
//              System.out.println("TX!!!!!!!!!!!!!");
//              System.out.println(tx.getValueSentToMe(wallet));
//              System.out.println(wallet.getBalance());
//          }
//      });
//      
//      Thread.sleep(Long.MAX_VALUE);
        for (Transaction tx : kit.wallet().getTransactions(true)) {
            System.out.println(tx.getValueSentFromMe(kit.wallet()));
        }
        System.out.println("Stopping");
        System.out.println("Stopped!: " + kit.stopAndWait());
    }
}

Este programa arroja el siguiente resultado:

BTC address that will be added: mnJRedAFBzRScnnKp5eS5CgR165uGi75tm
Private key that will be added: cSY1oeXfTADVXg2WnMzR2uMqQWqXNNia424SF2mHRPr54Ruj9Fzs
Key chain size: 1
Started!: RUNNING
Keys: 1
BTC Address: mnJRedAFBzRScnnKp5eS5CgR165uGi75tm
Private key: cSY1oeXfTADVXg2WnMzR2uMqQWqXNNia424SF2mHRPr54Ruj9Fzs
Balance 0
Stopping
Stopped!: TERMINATED

He verificado que el par de claves es correcto:

bitcoin-cli -regtest getaccountaddress mirko3
-> mnJRedAFBzRScnnKp5eS5CgR165uGi75tm
bitcoin-cli -regtest dumpprivkey mnJRedAFBzRScnnKp5eS5CgR165uGi75tm
-> cSY1oeXfTADVXg2WnMzR2uMqQWqXNNia424SF2mHRPr54Ruj9Fzs

También he notado que si ejecuto el código comentado y envío algo de dinero usando bitcoin-cli, recibo eventos correctamente y la billetera se carga con la cantidad que he enviado. En cierto momento, pude ver mi billetera con 2 BTC, pero los otros 40 nunca fueron encontrados y, de todos modos, después de algunas pruebas, también los 2 BTC desaparecieron.

Estoy totalmente confundido, cualquier ayuda sería muy apreciada.

Gracias

Respuestas (1)

De acuerdo, ha pasado un tiempo desde que jugué con BitcoinJ, pero el problema podría ser que necesite reconstruir su archivo BlockStore. Una aplicación BitcoinJ se compone esencialmente de cuatro objetos principales, un objeto BlockChain que es responsable de analizar y validar los bloques reales, un objeto BlockStore que es responsable de guardar estos datos, un objeto PeerGroup responsable de obtener esta información de la red bitcoin (en el caso de su ejemplo de registro, simplemente se conecta a su nodo bitcoind localhost) y un objeto Wallet que en realidad contiene los datos sobre las claves públicas/privadas que le interesan.

Está utilizando WalletAppKit, que es una clase repetitiva que BitcoinJ ofrece para iniciar todo esto por usted. Crea un objeto BlockChain y lo relaciona con un objeto SPVBlockStore que está relacionado con un objeto PeerGroup que a su vez está relacionado con un objeto Wallet. Si observa su ubicación /tmp/bitcoinj, creo que debería haber dos archivos, uno un archivo de billetera para guardar la información sobre sus direcciones y el otro un archivo spv que tiene un montón de información guardada sobre la cadena de bloques. El método SPV que utiliza BitcoinJ en realidad no descarga ni verifica toda la cadena de bloques, sino que utiliza un sistema más optimizado (sobre el que puede leer aquí: https://en.bitcoin.it/wiki/Thin_Client_Security#Simplified_Payment_Verification_.28SPV.29). El archivo SPV no contiene ninguna información sobre las transacciones, y si desea obtener información sobre una dirección de un momento anterior, debe reconstruir este archivo y obligar efectivamente a BitcoinJ a volver a analizar la cadena de bloques.

Debe intentar eliminar este archivo /tmp/bitcoinj.spv (creo que la convención de nomenclatura de BitcoinJ para WalletAppKit es dos archivos con la ruta que especificó con diferentes extensiones de archivo, pero es posible que deba verificar) y permita que se reconstruya sabiendo que debe buscar toda la actividad en esas direcciones vigiladas. Luego, querrá guardar esa billetera en el disco para que no necesite reconstruir el archivo SPV nuevamente.

Muchas gracias por su ayuda. Ha proporcionado una respuesta muy extendida. Estaba bastante seguro de que también había intentado con esa solución. Lo comprobaré dos veces. Gracias.