9.6.1 通道操作命令
命令行下peer channel命令支持包括create、fetch、join、list、update等子命令。各个命令的功能如下所示:
·create:创建一个新的应用通道;
·join:将本Peer节点加入到某个应用通道中;
·list:列出本Peer已经加入的所有的应用通道;
·fetch:从Ordering服务获取指定应用通道的配置区块;
·update:更新通道的配置信息,如锚节点配置。
可以通过peer channel<subcommand>--help来查看具体的命令使用说明。
9.6.2 命令选项
peer channel命令支持的参数见表9-7。
表9-7 peer channel命令支持的参数
各子命令的参数支持见表9-8。
表9-8 子命令的参数
其中,必需、支持和不支持三种情况的含义为:
·必需:该参数必须被指定,包括通过命令行、环境变量、配置等;
·支持:该参数可以被使用,某些时候如果不指定,可能采取默认值或自动获取;
·不支持:该参数不应该使用。
另外需要注意,默认情况下,客户端执行命令会以本地的Peer为操作对象,如果要操作远端的Peer,需要通过环境配置指定Peer的相关信息,包括地址或MSP配置等。并且执行命令的用户身份需要以组织管理员身份进行。
例如,下面命令指定了对org1的peer1节点执行相关操作命令,身份为组织的管理员Admin@org1:
$ CORE_PEER_ADDRESS=peer1:7051 \
CORE_PEER_LOCALMSPID="org1" \
CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto/org1/users/Admin@org1/
msp \
CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto/org1/peers/
peer1/tls/ca.cert \
peer channel <subcommand>
9.6.3 创建通道
拥有创建通道权限的组织管理员身份才能调用create子命令,在指定的Ordering服务上创建新的应用通道,需要提供Ordering服务地址。
一般情况下,通过提前创建的通道配置交易文件来指定配置信息。如果不指定通道配置文件,则默认采用SampleConsortium配置和本地的MSP组织来构造配置交易结构。
例如,下列命令利用事先创建的配置交易文件channel.tx来创建新的应用通道businesschannel:
$ CHANNEL_NAME="businesschannel"
$ peer channel create \
-o orderer:7050 \
-c ${CHANNEL_NAME} \
-f ./channel.tx
加入成功后,本地会产生该应用通道的初始区块文件businesschannel.block。Ordering服务端 也会输出类似orderer|UTC[orderer/multichain]newChain->INFO 004 Created and starting new chain newchannel的成功消息。
创建应用通道的主要过程如图9-13所示。
图9-13 创建应用通道过程
主要步骤包括:
1)客户端调用sendCreateChainTransaction(),检查指定的配置交易文件,或者利用默认配置,构造一个创建应用通道的配置交易结构,封装为Envelope,指定channel头部类型为CONFIG_UPDATE。
2)客户端发送配置交易到Ordering服务。
3)Orderer收到CONFIG_UPDATE消息后,检查指定的通道还不存在,则开始新建过程(参考orderer/configupdate/configupdate.go文件),构造该应用通道的初始区块。
a)Orderer首先检查通道应用(Application)配置中的组织是否都在创建的联盟(Consortium)配置组织中。
b)之后从系统通道中获取Orderer相关的配置,并创建应用通道配置,对应mod_policy为系统通道配置中的联盟指定信息。
c)接下来根据CONFIG_UPDATE消息的内容更新获取到的配置信息。所有配置发生变更后版本号都要更新。
d)最后,创建签名Proposal消息(头部类型为ORDERER_TRANSACTION),发送到系统通道中,完成应用通道的创建过程。
4)客户端利用gRPC通道从Orderer服务获取到该应用通道的初始区块(具体过程类似fetch命令)。
5)客户端将收到的区块写入到本地的chainID+".block"文件。这个文件后续会被需要加入到通道的节点使用。
其中,最关键的数据结构是配置交易相关的Envelope结构,如图9-14所示。
图9-14 通道配置交易结构
9.6.4 加入通道
join子命令会让指定的Peer节点加入到指定的应用通道。需要提前拥有所加入应用通道的初始区块文件,并且只有属于通道的某个组织的管理员身份可以成功执行该操作。加入通道命令主要通过调用Peer的配置系统链码进行处理。
例如,通过如下命令将本地Peer加入到应用通道businesschannel中:
$ peer channel join \
-b ${CHANNEL_NAME}.block \
-o orderer:7050
Peer joined the channel!
加入应用通道的主要过程如图9-15所示。
图9-15 加入应用通道过程
主要步骤包括:
1)客户端首先创建一个ChaincodeSpec结构,其input中的Args第一个参数是CSCC.JoinChain(指定调用配置链码的操作),第二个参数为所加入通道的初始区块。
2)利用ChaincodeSpec构造一个ChaincodeInvocationSpec结构。
3)利用ChaincodeInvocationSpec,创建Proposal结构并进行签名,channel头部类型为CONFIG。
4)客户端通过gRPC将Proposal签名后发给Endorser(所操作的Peer),调用 ProcessProposal(ctx context.Context,in*SignedProposal,opts...grpc.CallOption) (*ProposalResponse,error)方法进行处理,主要通过配置系统链码进行本地链的初始化工作。
5)初始化完成后,即可收到来自通道内的Gossip消息等。
其中,比较重要的数据结构包括ChaincodeSpec、ChaincodeInvocationSpec、Proposal等,它们的具体结构如图9-16所示。
注意 权限不足的情况下,执行加入通道命令可能不会报错,但实际上并没有加入到通道,也不会获取到通道内的数据。
图9-16 加入通道时的Signed Proposal结构
9.6.5 列出所加入的通道
list子命令会列出指定的Peer节点已经加入的所有应用通道的列表。加入通道的命令也是主要通过调用Peer的配置系统链码进行处理。
例如通过如下命令,可以列出本地Peer已经加入的所有应用通道:
$ peer channel list
Channels peers has joined to:
businesschannel
businesschannel2
列出所加入应用通道的主要过程如图9-17所示。
图9-17 列出所加入应用通道过程
主要步骤包括:
1)客户端首先创建一个ChaincodeSpec结构,其input中的Args第一个参数是CSCC.GetChannels(指定调用配置链码的操作)。
2)利用ChaincodeSpec构造一个ChaincodeInvocationSpec结构。
3)利用ChaincodeInvocationSpec创建Proposal结构并进行签名,channel头部类型为ENDORSER_TRANSACTION。
4)客户端通过gRPC将Proposal发给Endorser(所操作的Peer),调用 ProcessProposal(ctx context.Context,in*SignedProposal,opts...grpc.CallOption) (*ProposalResponse,error)方法进行处理,主要是通过配置系统链码查询本地链信息并返回。
5)命令执行成功后,客户端会受到来自于Peer端的回复消息,从其中提取出应用通道列表信息并输出。
其中,比较重要的数据结构同样也包括ChaincodeSpec、ChaincodeInvocationSpec、Proposal等,注意channel头部类型和ChaincodeSpec结构中数据与加入通道的消息中略有差异。参见图9-18。
图9-18 列出所加入通道时的Signed Proposal结构
9.6.6 获取某区块
fetch子命令会向Ordering服务进行查询,获取到指定通道的指定区块。并将收到的区块写入到本地的文件(默认为chainID_序号.block)。
命令格式为:
peer channel fetch <newest|oldest|config|(number)> [outputfile] [flags]
例如通过如下命令,可以获取到已存在的businesschannel应用通道的初始区块,并保存到本地的businesschannel.block文件:
$ peer channel fetch oldest businesschannel.block \
-c businesschannel \
-o orderer:7050
获取区块的主要过程如图9-19所示。
图9-19 获取区块过程
主要步骤包括:
1)客户端构造SeekInfo结构,该结构可以指定要获取的区块范围。这里Start、Stop指定为目标区块。
2)客户端利用SeekInfo结构,构造Envelope并进行签名,通过deliverClient经gRPC通道发给Ordering服务。
3)从Orderer获取指定通道的区块后,写到本地文件中。
其中,比较重要的数据结构包括SeekInfo、Envelope结构等,它们的具体结构如图9-20所示。
9.6.7 更新通道配置
update子命令的执行过程与create命令类似,会向Ordering服务发起更新配置交易请求。该命令执行也需要提前创建的通道更新配置交易文件来指定配置信息。
例如,通过如下操作来更新通道中的锚节点配置,首先利用configtxgen来创建锚节点配置更新文件,之后使用该更新文件对通道进行配置更新操作:
图9-20 获取区块的相关数据结构
$ configtxgen \
-profile TwoOrgsChannel \
-outputAnchorPeersUpdate ./update_anchors.tx \
-channelID businesschannel \
-asOrg Org1MSP
$ peer channel update \
-c businesschannel \
-o orderer:7050 \
-f ./update_anchors.tx
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=926