问题描述
我有一个简单的脚本来监听比特币现金钱包上未确认和已确认的交易。我正在连接到 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
协议缓冲区定义。
我的代码中是否缺少导致此行为的任何内容,还是因为连接服务器在消息传递方面不可靠?我还尝试了以下服务器,结果相同:
对此高度赞赏的任何帮助。谢谢。
解决方法
在查看其他示例脚本后,我终于能够找出问题所在。我在 subscribreTransactionsRequest
中遗漏了一个导致问题的选项,以下是解决问题的更改:
subscribreTransactionsRequest.include_in_block = true;
来自协议缓冲区定义:
// 当include_in_block 为true 时,确认交易时包含交易。除了任何请求的内存池通知之外,还会发送此通知。
bool include_in_block = 4;
在此处添加答案以供将来参考。