首页 > 解决方案 > 使用 GRPC 接口获取比特币现金钱包地址的交易事件

问题描述

我有一个简单的脚本来收听比特币现金钱包上的未确认和确认交易。我正在连接到 GRPC 接口以获取这些消息。该脚本运行良好,每次转账时我都会收到未经确认的交易。但是,我没有收到任何确认交易的消息。

这是我的代码:

var PROTO_PATH = __dirname + '/bchrpc.proto';
var fs = require('fs');
var bchaddr = require('bchaddrjs');
var axios = require('axios');
var grpc = require('@grpc/grpc-js');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });
var pb = grpc.loadPackageDefinition(packageDefinition).pb;


var client = new pb.bchrpc('bchd.imaginary.cash:8335', grpc.credentials.createSsl());

var addr = '<WALLET_ADDRESS>';
console.log(addr);
// Build TransactionFilter & setup live transaction stream
var transactionFilter = pb.TransactionFilter
transactionFilter.all_transactions = false;
transactionFilter.addresses = [addr];

var subscribreTransactionsRequest = pb.SubscribeTransactionsRequest;
subscribreTransactionsRequest.include_mempool = true;
subscribreTransactionsRequest.subscribe = transactionFilter;

var stream = client.SubscribeTransactions(subscribreTransactionsRequest)

function dataHandler(message) {
    console.log('New Transaction');
    var tx = message
    console.log(tx);
    const { type } = tx;
    // map hashes to strings

    switch(type) {
        case 'UNCONFIRMED':
            console.log('Inputs:');
            console.log(tx.unconfirmed_transaction.transaction.inputs);
            console.log('----------------\nOutputs');
            console.log(tx.unconfirmed_transaction.transaction.outputs);
            console.log('---------------------------');
            const h1 = tx.unconfirmed_transaction.transaction.hash;
            fs.writeFileSync('unconfirmed.txt', `${h1.toString('hex')}\n`, { encoding: 'utf-8', flag: 'a+' });
            break;
        case 'CONFIRMED':
            console.log('Inputs:');
            console.log(tx.confirmed_transaction.transaction.inputs);
            console.log('----------------\nOutputs');
            console.log(tx.confirmed_transaction.transaction.outputs);
            console.log('---------------------------');
            const h2 = tx.confirmed_transaction.transaction.hash;
            fs.writeFileSync('confirmed.txt', `${h2.toString('hex')}\n`, { encoding: 'utf-8', flag: 'a+' });
            break;
    }
    // post
    axios.post(URL, tx).then(res => {
        console.log(res.status);
    }).catch(e => console.error(e));
}

// other functions omitted for brevity
stream.on('data', dataHandler);
stream.on('status', statusHandler);
stream.on('end', endHandler);
stream.on('error', errorHandler);

该脚本侦听此给定地址和事件上的所有事件data,调用dataHandler打印交易信息的函数,将交易哈希写入文件,最后将交易信息发送到远程地址。出错时,脚本会在RST_STREAM1 秒延迟后重新连接到服务器。该脚本在此处bchrpc.proto使用此包中的协议缓冲区定义。

我的代码中是否缺少任何导致此行为的内容,或者是因为连接服务器在消息传递上不可靠?我还尝试了以下服务器,结果相同:

  1. https://bchd.greyh.at:8335

  2. https://bchd.fountainhead.cash:443

对此高度赞赏的任何帮助。谢谢。

标签: node.jsgrpc

解决方案


在查看其他示例脚本后,我终于能够找出问题所在。我错过了subscribreTransactionsRequest导致问题的一个选项,这是解决问题的更改:

subscribreTransactionsRequest.include_in_block = true;

从协议缓冲区定义:

// 当 include_in_block 为真时,交易被确认时被包含。除了任何请求的内存池通知之外,还会发送此通知。

bool include_in_block = 4;

在此处添加答案以供将来参考。


推荐阅读