Bitcoinj всегда получает 0 баланс

Я пытаюсь использовать Bitcoinj для своего приложения. Я использую режим regtest. У меня на счету 42 BTC:

bitcoin-cli -regtest getbalance mirko3
-> 42.00000000

Мой код следует:

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

Эта программа выводит следующий вывод:

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

Я проверил правильность пары ключей:

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

Я также заметил, что если я запускаю закомментированный код и отправляю деньги с помощью bitcoin-cli, я правильно получаю события, и кошелек списывается с суммы, которую я отправил. В какой-то момент я мог видеть свой кошелек с 2 BTC, но остальные 40 так и не были найдены, и, в любом случае, после некоторых тестов исчезли и 2 BTC.

Я полностью запутался, любая помощь будет принята с благодарностью.

Спасибо

Ответы (1)

Итак, прошло некоторое время с тех пор, как я играл с BitcoinJ, но проблема может заключаться в том, что вам нужно восстановить файл BlockStore. Приложение BitcoinJ по существу состоит из четырех основных объектов: объекта BlockChain, который отвечает за синтаксический анализ и проверку фактических блоков, объекта BlockStore, который отвечает за сохранение этих данных, объекта PeerGroup, отвечающего за фактическое получение этой информации из сети биткойнов. (в случае вашего примера regtest он просто подключается к вашему локальному узлу bitcoind) и объект Wallet, который фактически содержит данные об интересующих вас открытых/закрытых ключах.

Вы используете WalletAppKit, шаблонный класс, который BitcoinJ предлагает для загрузки всего этого за вас. Он создает объект BlockChain и связывает его с объектом SPVBlockStore, который связан с объектом PeerGroup, который сам связан с объектом Wallet. Если вы посмотрите на свое местоположение /tmp/bitcoinj, я полагаю, что там должно быть два файла: один файл кошелька для сохранения информации о ваших адресах, а другой файл spv, в котором хранится куча информации о блокчейне. Метод SPV, который использует BitcoinJ, на самом деле не загружает и не проверяет всю цепочку блоков, он использует более оптимизированную систему (о которой вы можете прочитать здесь: https://en.bitcoin.it/wiki/Thin_Client_Security#Simplified_Payment_Verification_.28SPV.29 ).). Файл SPV не содержит никакой информации о транзакциях, и если вы хотите получить какую-либо информацию об адресе из предыдущего момента времени, вы должны перестроить этот файл и эффективно заставить BitcoinJ повторно анализировать блокчейн.

Вам следует попробовать удалить этот файл /tmp/bitcoinj.spv (я считаю, что соглашение об именах BitcoinJ для WalletAppKit — это два файла с указанным вами путем с разными расширениями файлов, но вам может потребоваться проверка) и разрешить его пересборку, зная, что он должен искать всю активность на этих отслеживаемых адресах. Затем вы захотите сохранить этот кошелек на диск, чтобы вам не нужно было снова восстанавливать файл SPV.

Большое спасибо за Вашу помощь. Вы дали очень развернутый ответ. Я был почти уверен, что пробовал и это решение. Я дважды проверю. Спасибо.