首页 > 解决方案 > 无法使用 Fabric Java SDK 基于事务 id 获取 BlockInfo

问题描述

我正在使用 Fabric Java SDK 来查询我在 Hyperledger Fabric v1.3 上运行的链代码。这是我试图做的步骤:

但我收到错误消息 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 查询区块吗?

非常感谢。

标签: hyperledger-fabric

解决方案


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)
    ));

}

推荐阅读