You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求提供基于Hyperledger Fabric Java SDK的Peer值查询代码示例

Got it! 针对你已经搭建好的Byfn(Building Your First Network)Fabric 1.0网络,我整理了一段适配的Java Fabric SDK查询代码,直接就能用来查询链码中键'a'的值(预期返回90)。下面是详细的代码和注意事项:

第一步:添加Maven依赖

首先在你的pom.xml中引入Fabric Java SDK的依赖(选择兼容Fabric 1.0的稳定版本):

<dependencies>
    <!-- Hyperledger Fabric Java SDK -->
    <dependency>
        <groupId>org.hyperledger.fabric-sdk-java</groupId>
        <artifactId>fabric-sdk-java</artifactId>
        <version>1.4.18</version> <!-- 向后兼容Fabric 1.0,稳定性更好 -->
    </dependency>
    <!-- 日志依赖,用于调试输出 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.36</version>
    </dependency>
</dependencies>

第二步:查询链码的Java代码片段

这段代码适配Byfn的默认配置:通道名mychannel、链码名mycc、Peer节点peer0.org1.example.com(端口7051),使用Org1的Admin用户身份进行查询:

import org.hyperledger.fabric.sdk.*;
import org.hyperledger.fabric.sdk.exception.CryptoException;
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
import org.hyperledger.fabric.sdk.exception.ProposalException;
import org.hyperledger.fabric.sdk.security.CryptoSuite;
import java.io.File;
import java.util.Collection;
import java.util.Set;

public class ChaincodeQueryExample {
    // Byfn默认配置参数
    private static final String CHANNEL_NAME = "mychannel";
    private static final String CHAINCODE_NAME = "mycc";
    private static final String PEER_ADDRESS = "grpc://localhost:7051"; // peer0.org1的默认gRPC地址
    private static final String ORDERER_ADDRESS = "grpc://localhost:7050";
    // 替换为你本地crypto-config的实际路径,指向Org1 Admin用户的MSP目录
    private static final String ORG1_ADMIN_MSP_PATH = "./crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp";

    public static void main(String[] args) throws Exception {
        // 1. 初始化加密套件
        CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite();

        // 2. 创建Peer和Orderer实例
        Peer peer = Peer.createNewPeer("peer0.org1.example.com", PEER_ADDRESS);
        Orderer orderer = Orderer.createNewOrderer("orderer.example.com", ORDERER_ADDRESS);

        // 3. 初始化Fabric客户端
        HFClient client = HFClient.createNewInstance();
        client.setCryptoSuite(cryptoSuite);

        // 4. 设置客户端身份:使用Org1的Admin用户
        X509Certificate adminCert = Utils.readX509Certificate(
                new File(ORG1_ADMIN_MSP_PATH + "/signcerts/Admin@org1.example.com-cert.pem")
        );
        PrivateKey adminPrivateKey = Utils.readPrivateKey(
                new File(ORG1_ADMIN_MSP_PATH + "/keystore/" + getKeyFileName(ORG1_ADMIN_MSP_PATH + "/keystore"))
        );

        User adminUser = new User() {
            @Override
            public String getName() { return "Admin@org1.example.com"; }
            @Override
            public Set<String> getRoles() { return null; }
            @Override
            public String getAccount() { return null; }
            @Override
            public String getAffiliation() { return "org1.example.com"; }
            @Override
            public Enrollment getEnrollment() {
                return new Enrollment() {
                    @Override
                    public PrivateKey getKey() { return adminPrivateKey; }
                    @Override
                    public String getCert() { return Utils.toPemString(adminCert); }
                };
            }
            @Override
            public String getMspId() { return "Org1MSP"; }
        };
        client.setUserContext(adminUser);

        // 5. 初始化通道
        Channel channel = client.newChannel(CHANNEL_NAME);
        channel.addPeer(peer);
        channel.addOrderer(orderer);
        channel.initialize();

        // 6. 构造查询请求
        QueryByChaincodeRequest queryRequest = client.newQueryProposalRequest();
        ChaincodeID chaincodeID = ChaincodeID.newBuilder().setName(CHAINCODE_NAME).build();
        queryRequest.setChaincodeID(chaincodeID);
        queryRequest.setFcn("query"); // Byfn默认链码的查询方法名
        queryRequest.setArgs(new String[]{"a"}); // 要查询的键

        // 7. 发送查询并处理结果
        Collection<ProposalResponse> responses = channel.queryByChaincode(queryRequest);
        for (ProposalResponse response : responses) {
            if (response.getStatus() == ProposalResponse.Status.SUCCESS) {
                String result = new String(response.getChaincodeActionResponsePayload());
                System.out.println("查询到'a'的值:" + result); // 预期输出90
            } else {
                System.err.println("查询失败,错误信息:" + response.getMessage());
            }
        }
    }

    // 辅助方法:获取keystore目录下的密钥文件(Byfn生成的密钥文件名带_sk后缀)
    private static String getKeyFileName(String keystoreDirPath) {
        File keystoreDir = new File(keystoreDirPath);
        File[] keyFiles = keystoreDir.listFiles((dir, name) -> name.endsWith("_sk"));
        if (keyFiles == null || keyFiles.length == 0) {
            throw new RuntimeException("在keystore目录中未找到密钥文件");
        }
        return keyFiles[0].getName();
    }
}

关键注意事项

  • 路径调整:务必将ORG1_ADMIN_MSP_PATH替换为你本地crypto-config目录的实际路径,确保指向Org1 Admin用户的MSP文件夹
  • 端口验证:确认Docker容器的端口映射正常(7051、7050端口能被本地Java程序访问),Docker Desktop默认会自动映射端口
  • 链码方法名:如果你的链码查询方法不是query,需要修改queryRequest.setFcn("query")中的方法名
  • SDK版本:如果必须使用Fabric 1.0专属的SDK版本,可以将fabric-sdk-java的版本改为1.0.0,但1.4.x版本向后兼容且更稳定

内容的提问来源于stack exchange,提问作者Skadoosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:04:12