微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 GRPC 接口获取比特币现金钱包地址的交易事件

如何解决使用 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`,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_STREAM 错误时,脚本会在 1 秒延迟后重新连接到服务器。该脚本使用此包 here 中的 bchrpc.proto 协议缓冲区定义。

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

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

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

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

解决方法

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

subscribreTransactionsRequest.include_in_block = true;

来自协议缓冲区定义:

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

bool include_in_block = 4;

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。