Bitcoinj erhält immer 0 Guthaben

Ich versuche, Bitcoinj für meine App zu verwenden. Ich verwende den Regtest-Modus. Ich habe ein Guthaben von 42 BTC auf meinem Konto:

bitcoin-cli -regtest getbalance mirko3
-> 42.00000000

Mein Code folgt:

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());
    }
}

Dieses Programm gibt die folgende Ausgabe aus:

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

Ich habe überprüft, ob das Schlüsselpaar korrekt ist:

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

Ich habe auch bemerkt, dass wenn ich den auskommentierten Code ausführe und etwas Geld mit bitcoin-cli sende, ich korrekte Ereignisse erhalte und die Brieftasche mit dem Betrag belastet wird, den ich gesendet habe. Irgendwann konnte ich meine Brieftasche mit 2 BTC sehen, aber die anderen 40 wurden nie gefunden und nach einigen Tests sind sowieso auch die 2 BTC verschwunden.

Ich bin total verwirrt, wäre für jede Hilfe sehr dankbar.

Danke

Antworten (1)

Okay, es ist schon eine Weile her, seit ich mit BitcoinJ herumgespielt habe, aber das Problem könnte sein, dass Sie Ihre BlockStore-Datei neu erstellen müssen. Eine BitcoinJ-Anwendung besteht im Wesentlichen aus vier Hauptobjekten, einem BlockChain-Objekt, das für das Parsen und Validieren der tatsächlichen Blöcke verantwortlich ist, einem BlockStore-Objekt, das für das Speichern dieser Daten verantwortlich ist, einem PeerGroup-Objekt, das dafür verantwortlich ist, diese Informationen tatsächlich aus dem Bitcoin-Netzwerk zu erhalten (im Fall Ihres Regtest-Beispiels stellt es einfach eine Verbindung zu Ihrem Localhost-Bitcoind-Knoten her) und ein Wallet-Objekt, das tatsächlich diese Daten über die öffentlichen/privaten Schlüssel enthält, an denen Sie interessiert sind.

Sie verwenden WalletAppKit, eine Boilerplate-Klasse, die BitcoinJ anbietet, um all dies für Sie zu booten. Es erstellt ein BlockChain-Objekt und verknüpft es mit einem SPVBlockStore-Objekt, das mit einem PeerGroup-Objekt verknüpft ist, das selbst mit einem Wallet-Objekt verknüpft ist. Wenn Sie sich Ihren /tmp/bitcoinj-Speicherort ansehen, sollte es meiner Meinung nach zwei Dateien geben, eine eine Wallet-Datei zum Speichern der Informationen über Ihre Adressen und die andere eine SPV-Datei, in der eine Reihe von Informationen über die Blockchain gespeichert sind. Die SPV-Methode, die BitcoinJ verwendet, lädt nicht wirklich die gesamte Blockchain herunter und verifiziert sie, sie verwendet ein optimierteres System (über das Sie hier nachlesen können: https://en.bitcoin.it/wiki/Thin_Client_Security#Simplified_Payment_Verification_.28SPV.29). Die SPV-Datei enthält keine Informationen über Transaktionen, und wenn Sie Informationen über eine Adresse von einem früheren Zeitpunkt erhalten möchten, müssen Sie diese Datei neu erstellen und BitcoinJ effektiv dazu zwingen, die Blockchain neu zu analysieren.

Sie sollten versuchen, diese /tmp/bitcoinj.spv-Datei zu löschen (ich glaube, dass die Namenskonvention von BitcoinJ für WalletAppKit zwei Dateien mit dem von Ihnen angegebenen Pfad mit unterschiedlichen Dateierweiterungen sind, aber Sie müssen dies möglicherweise überprüfen) und sie in diesem Wissen neu erstellen lassen Es sollte nach allen Aktivitäten auf diesen überwachten Adressen suchen. Dann sollten Sie diese Brieftasche auf der Festplatte speichern, damit Sie die SPV-Datei nicht erneut rekonstruieren müssen.

Vielen Dank für Ihre Hilfe. Sie haben eine stark erweiterte Antwort gegeben. Ich war mir ziemlich sicher, dass ich es auch mit dieser Lösung versucht hatte. Ich werde es noch einmal überprüfen. Danke schön.