请求提供基于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
相关产品推荐
相关产品推荐

