peer channel create解析

本文详细解析了`peer channel create`命令的工作原理,包括命令选项、内部逻辑和源码分析。介绍了如何构造common.Envelope消息,以及channel.tx文件的生成和查看过程。此外,还探讨了orderer.example.com域名解析的方法以及channel.tx文件的内容和结构。
摘要由CSDN通过智能技术生成

peer channel create解析

目的

  1. peer channel create命令如何进行操作,以及操作选项
  2. peer channel create命令的内部逻辑流程分析(不涉及到远程orderer执行)

简介

peer channel create 是用于创建通道的命令,该命令首先构造一个common.Evelope的消息包,然后发送给orderer,由orderer完成通道的创建。而create构造消息的过程依赖于通道配置文件channel.tx,channel.tx的生成依赖于configtx.yaml。我们用一张图来展示整个流程的大致步骤:
在这里插入图片描述

那么创建通过命令执行后做了哪些事情?

  1. 创建了基于通道名称对应的通道
  2. 配置了通道上的锚节点?(虽然配置文件当中包含,但是待进一步确认

命令分析

命令选项

查看fabric文档Commands Reference部分,peer channel create的命令行选项如下:

参数名 含义
-o 连接的orderer的地址,hostname:port
-c channel的名称,默认为mychannel
-f 配置的交易信息(暂时还没搞清楚)
–tls 和orderer通信时是否启用tls
–cafile 使用tls时,所使用的orderer的证书

操作样例

我们以fabric/example/e2e_cli为例,在e2e_cli目录下中script/script.sh文件,createChannel函数中,创建channel语句为:

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt

其中的变量含义如下:

变量名 含义
$CHANNEL_NAME 采用的是默认,为mychannel
$CORE_PEER_TLS_ENABLED /e2e_cli/base/peer-base.yaml中定义的环境变量,为true
- CORE_PEER_TLS_ENABLED=true
$ORDERE
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,以下是使用 Fabric Java SDK 发送 `createChannel` 请求的示例代码: ```java import org.hyperledger.fabric.gateway.Contract; import org.hyperledger.fabric.gateway.ContractEvent; import org.hyperledger.fabric.gateway.DefaultContract; import org.hyperledger.fabric.gateway.Network; import org.hyperledger.fabric.gateway.Transaction; import org.hyperledger.fabric.gateway.Wallet; import org.hyperledger.fabric.gateway.Wallet.Identity; import org.hyperledger.fabric.gateway.impl.GatewayImpl; import org.hyperledger.fabric.sdk.Channel; import org.hyperledger.fabric.sdk.ChannelConfiguration; import org.hyperledger.fabric.sdk.ChannelConfiguration.ChannelConfigurationBuilder; import org.hyperledger.fabric.sdk.ChannelConfiguration.SignaturePolicyEnvelope; import org.hyperledger.fabric.sdk.ChannelConfiguration.TransactionBuilder; import org.hyperledger.fabric.sdk.ChannelConfiguration.TransactionRequestType; import org.hyperledger.fabric.sdk.ChannelConfigurationBuilderFactory; import org.hyperledger.fabric.sdk.ChannelConfigurationSignature; import org.hyperledger.fabric.sdk.ChannelConfigurationSignatureReader; import org.hyperledger.fabric.sdk.HFClient; import org.hyperledger.fabric.sdk.NetworkConfig; import org.hyperledger.fabric.sdk.Peer; import org.hyperledger.fabric.sdk.ProposalResponse; import org.hyperledger.fabric.sdk.SDKUtils; import org.hyperledger.fabric.sdk.TransactionInfo; import org.hyperledger.fabric.sdk.User; import org.hyperledger.fabric.sdk.security.CryptoSuite; import org.hyperledger.fabric.sdk.security.CryptoSuiteFactory; import org.hyperledger.fabric.sdk.security.IdentityUser; import org.hyperledger.fabric.sdk.security.keystore.KeyStore; import org.hyperledger.fabric.sdk.security.keystore.KeyStoreFactory; import org.hyperledger.fabric.sdk.security.keystore.KeyStoreReader; import org.hyperledger.fabric.sdk.security.keystore.KeyStoreWriter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.PrivateKey; import java.util.Collection; import java.util.EnumSet; import java.util.Properties; public class CreateChannelSample { private static final String CHANNEL_NAME = "mychannel"; private static final String CHANNEL_TX_PATH = "src/main/resources/channel-artifacts/channel.tx"; private static final String ORDERER_NAME = "orderer.example.com"; private static final String ORDERER_URL = "grpc://localhost:7050"; private static final String ORG_NAME = "Org1"; private static final String ORG_MSP_ID = "Org1MSP"; private static final String ORG_USER_NAME = "admin"; private static final String ORG_USER_PASSWORD = "adminpw"; private static final String ORG_PEER_NAME = "peer0.org1.example.com"; private static final String ORG_PEER_URL = "grpc://localhost:7051"; private static final String ORG_PEER_TLS_CERT_PATH = "src/main/resources/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt"; public static void main(String[] args) throws Exception { // Load network configuration NetworkConfig networkConfig = NetworkConfig.fromYamlFile(new File("src/main/resources/network.yaml")); // Create wallet for user identity Wallet wallet = Wallet.createFileSystemWallet(Paths.get("wallet")); Identity identity = wallet.get("user1"); if (identity == null) { Path certificatePath = Paths.get("src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem"); Path privateKeyPath = Paths.get("src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk"); String certificate = new String(Files.readAllBytes(certificatePath)); PrivateKey privateKey = SDKUtils.getPrivateKeyFromPEM(new String(Files.readAllBytes(privateKeyPath))); identity = IdentityUser.builder() .name("user1") .mspid(ORG_MSP_ID) .certificate(certificate) .privateKey(privateKey) .build(); wallet.put("user1", identity); } // Create client CryptoSuite cryptoSuite = CryptoSuiteFactory.getDefault().getCryptoSuite(); KeyStore keyStore = KeyStoreFactory.getDefault().getKeyStore(); KeyStoreReader keyStoreReader = new KeyStoreReader(keyStore); KeyStoreWriter keyStoreWriter = new KeyStoreWriter(keyStore); keyStoreWriter.addPrivateKey("orderer", cryptoSuite.generatePrivateKey(), keyStoreReader.getCertificate("orderer")); keyStoreWriter.addPrivateKey("peer", cryptoSuite.generatePrivateKey(), keyStoreReader.getCertificate("peer")); keyStoreWriter.addPrivateKey("user", identity.getPrivateKey(), identity.getCertificate()); HFClient client = HFClient.createNewInstance(); client.setCryptoSuite(cryptoSuite); client.setUserContext((User) identity); // Create channel configuration ChannelConfigurationBuilder configBuilder = ChannelConfigurationBuilderFactory.newChannelConfigurationBuilder(); configBuilder.name(CHANNEL_NAME); configBuilder.orderer(ORDERER_NAME, ORDERER_URL); configBuilder.addPeer(ORG_PEER_NAME, ORG_PEER_URL, ORG_PEER_TLS_CERT_PATH); configBuilder.addOrderer("orderer.example.com", "grpc://localhost:7050"); configBuilder.addOrganization(ORG_NAME, ORG_MSP_ID); configBuilder.addAnchorPeer(ORG_NAME, "peer0.org1.example.com", "grpc://localhost:7051"); ChannelConfiguration configuration = configBuilder.build(); // Create channel configuration signature SignaturePolicyEnvelope signaturePolicy = SignaturePolicyEnvelope.fromByteString(ByteString.copyFromUtf8("OR('Org1MSP.member')")); TransactionBuilder transactionBuilder = TransactionBuilder.newBuilder(); transactionBuilder.setType(TransactionRequestType.CHANNEL_CONFIG); transactionBuilder.setPayload(configuration.toByteString()); transactionBuilder.setChannelId(CHANNEL_NAME); transactionBuilder.setSignaturePolicy(signaturePolicy); transactionBuilder.setIdentity(identity); transactionBuilder.setMSPID(ORG_MSP_ID); byte[] transactionBytes = transactionBuilder.build().toByteArray(); byte[] signature = cryptoSuite.sign(identity.getPrivateKey(), transactionBytes); ChannelConfigurationSignature configurationSignature = ChannelConfigurationSignature.newBuilder() .setSignature(ByteString.copyFrom(signature)) .setSignatureHeader(ByteString.copyFrom(transactionBuilder.buildSignatureHeader())) .build(); // Create gateway and connect to network GatewayImpl.Builder gatewayBuilder = (GatewayImpl.Builder) GatewayImpl.builder(); gatewayBuilder.identity(wallet, "user1").networkConfig(networkConfig); GatewayImpl gateway = (GatewayImpl) gatewayBuilder.connect(); Network network = gateway.getNetwork(CHANNEL_NAME); Contract contract = network.getContract("mycc"); // Create channel Transaction createChannelTransaction = network.getChannel().newTransaction("createChannel"); createChannelTransaction.setEndorsingPeers(EnumSet.of(network.getChannel().getPeers().iterator().next())); createChannelTransaction.submit(configuration.toByteString(), configurationSignature.toByteArray()); // Wait for channel creation event ContractEvent contractEvent = contract.getEvent("createChannelEvent"); Collection<ProposalResponse> responses = contractEvent.getTransactionEvent().getContractResponses(); for (ProposalResponse response : responses) { TransactionInfo transactionInfo = network.getChannel().queryTransaction(response.getTransactionID()); if (transactionInfo.isValid()) { System.out.println("Channel created successfully"); } else { System.out.println("Failed to create channel"); } } // Disconnect from network gateway.close(); } } ``` 该示例代码中,我们首先加载了 Fabric 网络配置文件 `network.yaml`,然后创建了一个钱包 `wallet`,并将一个用户身份 `identity` 添加到钱包中。接着,我们使用 `CryptoSuiteFactory` 创建了一个加密套件 `cryptoSuite`,并使用 `KeyStoreFactory` 创建了一个密钥库 `keyStore`。然后,我们创建了一个 HFClient 客户端,并指定了客户端的加密套件和用户身份。接下来,我们创建了一个频道配置 `configuration`,并使用 `TransactionBuilder` 构建了一个包含频道配置的交易。此外,我们还创建了一个频道配置签名 `configurationSignature`。然后,我们使用 GatewayImpl 连接到 Fabric 网络,并获取名为 `mycc` 的智能合约。接下来,我们使用 `network.getChannel().newTransaction("createChannel")` 创建了一个新交易,将 `configuration.toByteString()` 和 `configurationSignature.toByteArray()` 作为参数传递给 `submit()` 方法,以提交创建频道的交易。最后,我们等待 `createChannelEvent` 事件的发生,并检查交易是否成功。最终,我们使用 `gateway.close()` 断开了与 Fabric 网络的连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值