Wie erstelle ich eine persistente SPV-Wallet? (Bcoin)

Ich habe eine Brieftasche auf einem SPV-Knoten erstellt. Die Brieftasche wird von einer Mnemonik initialisiert. Nach Erhalt einiger Transaktionen sieht der Kontostand der Brieftasche so aus:

{ account: -1, tx: 3, coin: 3, unconfirmed: 136300, confirmed: 0 }

Aber wenn ich das Wallet neu initialisiere, sieht es so aus:

{ account: -1, tx: 0, coin: 0, unconfirmed: 0, confirmed: 0 }

Bei jeder Initialisierung haben die Wallets die gleiche Adresse.

Hier ist mein Code:

const bcoin = require('bcoin');
bcoin.set('testnet');
const KeyRing = bcoin.keyring;
const Mnemonic = bcoin.hd.Mnemonic;
const HD = bcoin.hd;

const node = new bcoin.node.SPVNode({
    config: true,
    argv: true,
    env: true,
    logFile: true,
    logConsole: true,
    logLevel: 'debug',
    db: 'leveldb',
    memory: false,
    persistent: true,
    workers: true,
    listen: true,
    loader: require,
    network: 'testnet'
});

// Temporary hack
if (!node.has('walletdb')) {
    const plugin = require('./node_modules/bcoin/lib/wallet/plugin');
    node.use(plugin);
}

process.on('unhandledRejection', (err, promise) => {
  throw err;
});

const walletdb = new bcoin.wallet.WalletDB({ memory: false, network: 'testnet', prefix: '/Users/alestsurko/.bcoin/spvchain' });

(async () => {
    await node.ensure();
    await node.open();
    await node.connect();
    await walletdb.open();
    const mnemonic = new Mnemonic('uncover cash coral neglect upon nurse argue deal right song hood tennis');
    const masterKey = HD.fromMnemonic(mnemonic);

    const wallet = await walletdb.create({master: masterKey});

    console.log('Created wallet with address %s', await wallet.receiveAddress());
    const bl = await wallet.getBalance();
    console.log(bl.toJSON());

    // Add our address to the spv filter.
    node.pool.watchAddress(await wallet.receiveAddress());

    node.startSync();

    node.on('error', async (err) => {
        console.log(err);
    });

    node.pool.on('tx', async (tx) => {
        console.log('------ New tx. Adding to walletdb...');
        console.log(tx);
        await walletdb.addTX(tx);
    });

    wallet.on('balance', async (balance) => {
        console.log('Balance updated.');
        console.log(balance.toJSON());
    });
})().catch((err) => {
    console.error(err.stack);
    process.exit(1);
});

Antworten (1)

Wie hier kommentiert , liegt die Ursache des Problems darin, dass ich

Sorta hat zwei Brieftaschen erstellt. Die erste wird durch die Plugin-Anweisung ganz oben instanziiert, und dann erstellen Sie auch gleich danach eine neue walletDB.

Die Lösung verwendet also WalletClient:

const {WalletClient} = require('bclient');
const {Network} = require('bcoin');
const network = Network.get('regtest');

const walletOptions = {
  network: network.type,
  port: network.walletPort,
  apiKey: 'api-key'
}

const walletClient = new WalletClient(walletOptions);
const id = 'primary'; // or whatever your wallet name is
const wallet = walletClient.wallet(id);

Statt walletdb.create().