node.js - 使用 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_STREAM
1 秒延迟后重新连接到服务器。该脚本在此处bchrpc.proto
使用此包中的协议缓冲区定义。
我的代码中是否缺少任何导致此行为的内容,或者是因为连接服务器在消息传递上不可靠?我还尝试了以下服务器,结果相同:
对此高度赞赏的任何帮助。谢谢。
解决方案
在查看其他示例脚本后,我终于能够找出问题所在。我错过了subscribreTransactionsRequest
导致问题的一个选项,这是解决问题的更改:
subscribreTransactionsRequest.include_in_block = true;
从协议缓冲区定义:
// 当 include_in_block 为真时,交易被确认时被包含。除了任何请求的内存池通知之外,还会发送此通知。
bool include_in_block = 4;
在此处添加答案以供将来参考。
推荐阅读
- c++ - C++14:std::thread 中的 this_thread::sleep_for 防止 .so 卸载
- git - Git 轻松变基?
- windows - 批处理:如何使用参数进行 mklink?
- r - 在 R 中,如何在不同的 S4 类中定义具有相同名称的方法以进行正确的方法调度
- json - Spark:如何将 json 对象合并到数组中
- udp - 使用 DJI Windows SDK 显示/解码通过 UDP/RDP 流式传输的视频
- python - 从 uWSGI 实例中的烧瓶请求创建 docker 容器
- python - Pandas,groupby() 函数用“,”分隔但保留数据类型?
- javascript - 有没有办法拦截 Axios 请求并返回自定义响应?
- c# - 为什么这个 c# Palindrome Program 不起作用?