我的问题是,我的超级账本 Java 应用程序在已经创建通道的情况下尝试创建通道,但我不知道为什么。我不知道该怎么做,但希望有人能提供帮助
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
和连接.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
我尝试过更改网络配置,从网络配置中删除通道部分,手动将对等点添加到没有网络配置的通道,以及许多较小的更改。我得到的唯一结果是频道没有配置或频道没有对等点
我认为这里发生的事情是,当您的网关客户端获取有关网络拓扑的服务发现信息时,它正在寻找
assecodschannel
的定义。当它尝试将其添加到您的连接配置文件提供的网络信息时,它会发现重复项,因为您的连接配置文件已经包含 assecodschannel
的定义。
使用服务发现时,您的连接配置文件只需包含足够的信息,以便客户端能够连接到网络对等点。不需要通道定义。作为示例,请参阅 Fabric-gateway-java API 的服务发现测试所使用的连接配置文件:
还有用于为 Fabric 样本使用的测试网络生成连接配置文件的模板:
请注意,两者都不包含通道定义。
另请注意,从 Fabric v2.5 开始,旧版 Java SDK 已被弃用。如果您正在使用(或可以使用)Fabric v2.4 或更高版本,则应使用较新的 Fabric Gateway 客户端 API。这简化了客户端连接体验,并且根本不需要连接配置文件。