Hyperledger Fabric Java SDK重复创建已存在通道问题求助
Hyperledger Fabric Java应用通道访问故障排查求助
我开发的Hyperledger Fabric Java应用在访问已存在的assecodschannel通道时出现异常,尝试修改网络配置、移除配置中的通道段、手动为通道添加节点等操作后,仍提示“通道无配置”或“通道无节点”错误,无法定位问题根源,请求技术帮助。
相关代码
private static final String CHANNEL_NAME = System.getenv().getOrDefault("CHANNEL_NAME", "assecodschannel"); private static final String CHAINCODE_NAME = System.getenv().getOrDefault("CHAINCODE_NAME", "ccv1"); static { System.setProperty("org.hyperledger.fabric.sdk.service_discovery.as_localhost", "true"); } // helper function for getting connected to the gateway public static Gateway connect() throws Exception { // Load a file system based wallet for managing identities. Path walletPath = Paths.get("wallet"); Wallet wallet = Wallets.newFileSystemWallet(walletPath); System.out.println("TLS Cert Content: " + new String(Files.readAllBytes(Paths.get("tls-cert.pem")))); System.out.println("CA Cert Content: " + new String(Files.readAllBytes(Paths.get("ca.crt")))); Path networkConfigPath = Paths.get("template","connections.yml"); Gateway.Builder builder = Gateway.createBuilder(); builder.identity(wallet, "User").networkConfig(networkConfigPath).discovery(true); return builder.connect(); } public byte[] getAllAssets() throws ContractException { System.out.println("Before connecting to the network"); try (Gateway gateway = connect()) { System.out.println("After connecting to the network"); // System.out.println(gateway.getNetwork("assecodschannel").getChannel().joinPeer()); gateway.getNetwork("assecodschannel").getChannel(); System.out.println("jj"); Network network = gateway.getNetwork("assecodschannel"); System.out.println("huj"); Contract contract = network.getContract("chaincode"); return contract.evaluateTransaction("GetAllAssets"); } catch(Exception e){ System.err.println(e); System.exit(1); return null; } }
网络配置文件
connections.yml
name: "AssecoDS-network" version: "1.0" x-type: "hlfv1" client: organization: AssecoDS connection: timeout: peer: endorser: '300' orderer: '300' channels: assecodschannel: orderers: - orderer1.assecods.pl peers: peer1.assecods.pl: endorsingPeer: true chaincodeQuery: true ledgerQuery: true eventSource: true discover: true organizations: AssecoDS: mspid: AssecoDSMSP peers: - peer1.assecods.pl certificateAuthorities: - ca.assecods.pl orderers: orderer1.assecods.pl: url: 100.64.192.62:7050 grpcOptions: ssl-target-name-override: orderer1.assecods.pl grpc-max-send-message-length: -1 tlsCACerts: path: ca.crt peers: peer1.assecods.pl: url: 100.64.192.62:7051 eventUrl: 100.64.192.62:7053 grpcOptions: ssl-target-name-override: peer1.assecods.pl grpc.keepalive_time_ms: 120001 tlsCACerts: path: /home/hubert/Desktop/hyperledger-fabric-generic-network-master/application-java/tls-cert.pem certificateAuthorities: ca.assecods.pl: url: https://localhost:7054 httpOptions: verify: false registrar: - enrollId: admin enrollSecret: adminpw caName: ca.assecods.pl
connection.yaml
--- name: AssecoDS-network version: 1.0.0 client: organization: AssecoDS connection: timeout: peer: endorser: '300' orderer: '300' channels: assecodschannel: orderers: - orderer1.assecods.pl peers: peer1.assecods.pl: {} organizations: AssecoDS: mspid: AssecoDSMSP peers: - peer1.assecods.pl certificateAuthorities: - ca.assecods.pl orderers: orderer1.assecods.pl: url: 127.0.0.1:7050 peers: peer1.assecods.pl: url: 127.0.0.1:7051 tlsCACerts: pem: /home/hubert/Desktop/hyperledger-fabric-generic-network-master/application-java/tls-cert.pem certificateAuthorities: ca.assecods.pl: url: 127.0.0.1:7054 caName: ca.assecods.pl httpOptions: verify: false tlsCACerts: pem: /home/hubert/Desktop/hyperledger-fabric-generic-network-master/application-java/tls-cert.pem registrar: - enrollId: admin enrollSecret: adminpw
错误信息
运行时抛出异常,核心提示为通道无配置或通道无节点,关键异常内容如下:
Exception in thread "main" java.lang.RuntimeException: Channel assecodschannel has no peers configured
或
Exception in thread "main" java.lang.RuntimeException: Channel assecodschannel has no configuration
排查建议
- 检查配置文件路径:确认
connections.yml的路径Paths.get("template","connections.yml")是否正确,应用能否读取该文件,可添加文件存在性校验:if (!Files.exists(networkConfigPath)) { throw new FileNotFoundException("Network config file not found: " + networkConfigPath.toString()); } - 核对通道名称一致性:确保代码中
CHANNEL_NAME常量与配置文件中的通道名assecodschannel完全一致(注意大小写、空格等细节) - 验证服务发现功能:启用
discovery(true)后,确认Fabric网络的Peer节点已开启服务发现,且配置中peers的discover属性为true(connections.yml中已设置,但需检查网络端配置) - 检查节点网络可达性:测试应用机器能否连接到配置中的Peer/Orderer节点(
100.64.192.62或127.0.0.1),可使用grpcurl工具验证gRPC连接有效性 - 确认证书有效性:核对配置中
tlsCACerts指向的证书文件是否存在、内容正确,代码中已打印证书内容,可与网络节点的CA证书对比 - 测试静态配置模式:暂时注释
builder.discovery(true),使用静态配置访问通道,排查是否是服务发现导致的问题 - 检查钱包身份权限:确认钱包中的
User身份已正确注册enroll,所属MSPID与配置AssecoDSMSP一致,且拥有该通道的访问权限
内容的提问来源于stack exchange,提问作者Hubert Jaworski
相关产品推荐
相关产品推荐

