¿Cómo hacer una billetera SPV persistente? (bcoin)

Creé una billetera en un nodo SPV. La billetera se inicializa a partir de un mnemotécnico. Después de recibir algunas transacciones, el saldo de la billetera se ve así:

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

Pero cuando reinicio la billetera, se ve así:

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

En cada inicialización, la billetera tiene la misma dirección.

Aquí está mi código:

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

Respuestas (1)

Como se comenta aquí , la causa del problema es que yo

Sorta ha creado dos billeteras. El primero es instanciado por la declaración del complemento en la parte superior, y luego también crea un nuevo walletDB justo después.

Entonces la solución es usar 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);

en lugar walletdb.create()de