hyperledger-fabric - 无法使用 Fabric Java SDK 基于事务 id 获取 BlockInfo
问题描述
我正在使用 Fabric Java SDK 来查询我在 Hyperledger Fabric v1.3 上运行的链代码。这是我试图做的步骤:
创建ChannelCLient并使用方法queryByChainCode(),我得到了 ProposalResponse 的集合。
在每个 ProposalResponse 上,我都可以从方法 getTransactionID() 获取有效负载和 transactionID。
之后,使用我从上面步骤中获得的事务 ID 通过方法queryBlockByTransactionID()查询 BlockInfo 。因为我想获得包含我的交易的正确块哈希。
但我收到错误消息 500 Failed to get block for txID ... error Entry not found in index
我的代码如下所示:
FabricClient fabClient = new FabricClient(adminUserContext);
ChannelClient channelClient = fabClient.createChannelClient(Config.CHANNEL_NAME);
Channel channel = channelClient.getChannel();
Peer peer = fabClient.getInstance().newPeer(Config.ORG1_PEER_0, Config.ORG1_PEER_0_URL);
EventHub eventHub = fabClient.getInstance().newEventHub("eventhub01", "grpc://localhost:7053");
Orderer orderer = fabClient.getInstance().newOrderer(Config.ORDERER_NAME, Config.ORDERER_URL);
channel.addPeer(peer);
channel.addEventHub(eventHub);
channel.addOrderer(orderer);
channel.initialize();
String transactionId = "";
Logger.getLogger(QueryChaincode.class.getName()).log(Level.INFO, "Query ");
Collection<ProposalResponse> responsesQuery = channelClient.queryByChainCode(chaincode, "query", args);
for (ProposalResponse pres : responsesQuery) {
transactionId = pres.getTransactionID();
String stringResponse = new String(pres.getChaincodeActionResponsePayload());
Logger.getLogger(QueryChaincode.class.getName()).log(Level.INFO, stringResponse);
System.out.println("transactionID is:" + transactionId + " chaincode id is: " + pres.getChaincodeID()
+ " peer name is: " + pres.getPeer().getName());
result += stringResponse;
}
BlockInfo blockInfo = channel.queryBlockByTransactionID(transactionId);
任何人都可以帮助我如何根据交易 ID 查询区块吗?
非常感谢。
解决方案
BlockchainInfo blockchainInfo = channel.queryBlockchainInfo();
Long countBlock = blockchainInfo.getHeight();
blockInfoModel.setSize(countBlock.intValue());
for (int blockNumber = 0; blockNumber < countBlock; blockNumber++) {
BlockInfo blockInfo = channel.queryBlockByNumber(blockNumber);
blockInfoModel.getBlocks().add(new BlockInfoModel(
String.valueOf(blockInfo.getBlockNumber()),
blockInfo.getChannelId(),
Hex.encodeHexString(blockInfo.getDataHash()),
Hex.encodeHexString(blockInfo.getPreviousHash()),
blockInfo.getTransactionCount(),
queryDateTransactions(channel, blockInfo)
));
}
推荐阅读
- javascript - 使用 jquery 选择不在特定父级下的所有 DOM 元素
- mysql - 为什么 MySQL 硬编码 JSON 文档的最大深度?
- swift - 如何在解雇后停止播放 AVPlayerViewController 作为 UIViewRepresentable?
- excel - 在概率列表中生成随机数,如果该行标记为“false”,则滚动失败
- php - 无法使用 PDO 从 PHP 将表情符号/表情符号保存在 MySQL 中,但可以从 cmd/phpmyadmin 插入它们
- c# - 对类型“IAuthorizeData”的引用声称它在“Microsoft.AspNetCore.Authorization”中定义,但找不到
- python - 如何找到小时数的日期?
- r - R - 从其他行中提取值
- sas - 如何将 SAS 代码转换为 SAS 宏?
- c# - 从客户端自动设置属性