深度学习
Hyperledger Fabric 1.0提供了一些实用工具,方便和系统进行交互。
B.1 协议转换工具configtxlator
基于Hyperledger Fabric的区块链网络都是采用gRPC进行通信的,传输的消息和存储的区块采用的都是Protocol Buffer格式序列化的二进制结构,这不是对人友好的方式,尤其不方便修改。系统提供一个工具configtxlator,它提供了RESTful接口 的服务,其功能如下。
B.1.1 协议转换
可以在Protocol Buffer和JSON格式间直接转换,Protocol Buffer还包含多种格式,有以下几种格式:
·common.Block:区块结构;
·common.Envelope:带有效载荷和数字签名的数字信封,区块的数据部分就是序列化后的数字信封;
·common.ConfigEnvelope:包含链配置的数字信封,内容包含ConfigUpdateEnvelope;
·common.ConfigUpdateEnvelope:提交给排序节点的配置数字信封;
·common.Config:ConfigEnvelope的配置部分;
·common.ConfigUpdate:ConfigUpdateEnvelope的一部分。
工具configtxlator提供的是标准的HTTP服务,与任何可以处理HTTP协议的工具都可以进行交互,下面用CURL工具来说明如何操作。
(1)Protocol Buffer格式转换为JSON格式
curl -X POST --data-binary @config.pb
http://$SERVER:$PORT/protolator/decode/<message.Name> > config.json
其中,config.pb是Protocol Buffer格式的文件,config.json是解码后的JSON格式文件。$SERVER和$PORT是configtxlator的服务和端 口。<message.Name>是消息的格式,可以为common.Block等。
(2)JSON格式转换为Protocol Buffer格式
JSON格式文件是纯文本格式的,可以用任何的文本编辑工具修改,也可以用专门的JSON处理工具jq快速地编辑文件,比如下面的命令把最大区块大小修改为30个交易:
jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count = 30"
config.json > updated_config.json
编辑完成后再提交给configtxlator,转换成对应的Protocol Buffer格式。
curl -X POST --data-binary @config.json http://$SERVER:$PORT/protolator/
encode/<message.Name> > config.pb
说明同上。
B.1.2 配置更新计算
配置修改后,提交差异的部分给排序服务可以减少传输量。提交原始的配置文件和修改后的配置文件给通道,如下所示:
curl -X POST -F channel=desiredchannel -F original=@original_config.pb -F
updated=@updated_config.pb
http://$SERVER:$PORT/configtxlator/compute/update-from-configs > config_update.pb
其中,desiredchannel是通道名称,original_config.pb和 updated_config.pb分别是原始的配置文件和修改后的配置文件,config_update.pb是生成的差异配置文件,它是 Protocol Buffer格式的common.ConfigUpdate结构。
如果调用SDK更新配置,应用程序可以直接对这个差异配置文件签名,然后封装成common.ConfigUpdateEnveloped,然后封装成common.Envelope提交给排序服务,结构的关系图如图B-1所示。
如果是命令行,在封装成common.Envelope之前需要先把config_update.pb解码成JSON格式:
curl -X POST --data-binary @config_update.pb
http://$SERVER:$PORT/protolator/decode/common.ConfigUpdate > config_update.json
构造common.Envelope结构:
echo
'{"payload":{"header":{"channel_header":{"channel_id":"desiredchannel",
"type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' > config_update_
as_envelope.json
图 B-1
再转换成Protocol Buffer格式:
curl -X POST --data-binary @config_update_as_envelope.json
http://$SERVER:$PORT/protolator/encode/common.Envelope > config_update_as_envelope.pb
调用命令行提交给排序节点:
peer channel update -f config_update_as_envelope.pb -c desiredchannel -o
$OSN_IP:$OSN_PORT
其中:$OSN_IP和$OSN_PORT是排序服务节点的地址和端口。
B.2 MSP生成工具cryptogen
cryptogen是Hyperledger Fabric提供的为网络实体生成加密材料(公私钥、证书等)的实用程序。这些证书代表一个身份,并允许在网络实体间通信和交易时进行签名和身份认证。
cryptogen使用一个包含网络拓扑的crypto-config.yaml文件,为文件中定义的组织和属于 这些组织的实体生成一组证书和密钥。每个组织都配置了唯一的根证书(ca-cert),并包含了特定实体(peers和orders),这就形成了一种典 型的网络结构——每个成员都有所属的CA。Hyperledger Fabric网络中的交易和通信都使用实体的私钥签名,使用公钥验证。
B.2.1 编译生成cryptogen工具
cryptogen源码在fabric/common/tools/cryptogen/中,是一个独立的可执行程序。
生成cryptogen可执行程序有两种方式。
1)在fabric/下执行make cryptogen,如果正常执行,则会在fabric/build/bin/下生成可执行文件cryptogen。
2)直接在fabric/common/tools/cryptogen/下执行go build。
B.2.2 cryptogen命令说明
执行cryptogen--help-long命令显示如下信息。
cryptogen [<flags>] <command> [<args> ...]
(1)超级账本密钥证书生成工具选项
·--help——显示帮助文档;
·--help-long——显示详细的帮助文档。
(2)命令
help [<command>...]
1)显示帮助文档。
generate [<flags>]
2)生成密钥证书。
·--config——指定配置文件,如果不指定,则使用默认配置(即cryptogen showtemplate中的内容);
·--output——生成密钥证书的目录,默认为crypto-config。
3)showtemplate——显示配置模版。
4)version——显示版本信息。
最常用的命令语法是:
cryptogen generate --config=./crypto-config.yaml
根据crypto-config.yaml文件的配置,生成组织信息及其密钥证书等,保存在crypto-config目录下。
B.2.3 crypto-config.yaml文件解析
Crypto-config.yaml是cryptogen工具使用的配置文件,cryptogen工具根据该配置文件生成加密材料。但该文件名字并非固定,也可自定义,只需在cryptogen generate命令中指定对应文件即可。
下面我们分析一下该文件的内容:
# ------------------------------------------------------------------------------
# "OrdererOrgs" —— 定义排序服务节点的组织
# ------------------------------------------------------------------------------
OrdererOrgs:
# ---------------------------------------------------------------------------
# 排序服务节点的名称和域名
# --------------------------------------------------------------------------
- Name: Orderer
Domain: example.com
# ---------------------------------------------------------------------------
# "Specs" —— 手动定义节点名称,命名规范是:{{.Hostname}}.{{.Domain}}
# —— 如果没有定义CommonName,自动生成的节点名称是:orderer.example.com
# —— 如果定义了CommonName,就以CommonName为准
# —— Hostname可以定义多个
# ---------------------------------------------------------------------------
Specs:
- Hostname: orderer
# CommonName: order.example.net
# ------------------------------------------------------------------------------
# "PeerOrgs" —— 定义Peer节点的组织
# ------------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# 组织Org1的配置
# ---------------------------------------------------------------------------
- Name: Org1
Domain: org1.example.com
# ---------------------------------------------------------------------------
# "CA" —— 默认会生成的名称:ca.{{.Domain}}
# ---------------------------------------------------------------------------
# CA:
# Hostname: ca
# ---------------------------------------------------------------------------
# "Template" —— 按模版生成Peer节点MSP证书
# —— 默认生成的Peer节点名称:peer{{.Index}}.{{.Domain}}
# —— Index是从Start到Count-1,Start默认是0
# —— Hostname可以自定义节点名称规则
# ---------------------------------------------------------------------------
Template:
Count: 2
# Start: 5
# Hostname: {{.Prefix}}{{.Index}}
# ---------------------------------------------------------------------------
# "Users" —— 默认生成的用户数:User1@{{.Domain}},User2@{{.Domain}}
# —— 默认生成1个管理员:Admin@{{.Domain}}
# ---------------------------------------------------------------------------
Users:
Count: 1
# ---------------------------------------------------------------------------
# 组织Org2的配置
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
Template:
Count: 2
Users:
Count: 1
按照以上文件定义的内容,使用cryptogen generate命令生成的文件目录结构参考第8章的内容。
B.3 配置生成工具configtxgen
configtxgen是Hyperledger Fabric提供的用于通道配置的实用程序,主要生成以下3种文件:
·排序服务节点使用的创世区块;
·创建通道使用的通道配置交易;
·更新通道用的锚节点交易。
目前,该工具主要侧重于生成排序服务节点的创世区块,但是将来预计增加生成新通道的配置以及重新配置已有的通道。
B.3.1 编译生成configtxgen工具
Cryptogen源码在fabric/common/configtx/tool/configtxgen中,是一个独立的可执行程序。v1.0.0之后的版本,源码转到fabric/common/tools/cryptogen/中。
生成cryptogen可执行程序有两种方式。
1)在fabric目录下执行make configtxgen。如果正常执行,则会在fabric/build/bin中生成可执行文件configtxgen。
2)直接在fabric/common/configtx/tool/configtxgen下执行go build。
B.3.2 configtxgen命令说明
执行configtxgen--help命令显示如下信息。
(1)用法
-asOrg string
(2)组织名称
·-channelID string——通道名称,默认是"testchainid";
·-inspectBlock string——检查和输出创世区块的内容;
·-inspectChannelCreateTx string——检查和输出通道创世区块的内容;
·-outputAnchorPeersUpdate string——创建锚节点配置,锚节点在configtix.yaml中的AnchorPeers中指定;
·-outputBlock string——创世区块生成的目录文件的名称,所用的Profile必须包含Consortiums,否则启动排序服务节点会失败;
·-outputCreateChannelTx string——通道创世区块生成的目录文件的名称,所用的Profile必须包含Application,否则创建通道会失败;
·-profile string——configtx.yaml中的Profiles配置项,它描述了如何生成组织信息,默认的名称是"SampleInsecureSolo";
·-version——显示版本信息。
下面我们来看看命令configtxgen的常用用法。
(1)生成创世区块
生成创世区块的命令如下:
configtxgen -profile TwoOrgsOrdererGenesis
-outputBlock ./channel-artifacts/genesis.block
其中:
·TwoOrgsOrdererGenesis为configtx.yaml中的Profiles之一;
·./channel-artifacts/genesis.block为生成的创世区块文件名及保存路径。
生成的创世区块用于指定启动排序服务,还必须指定启动参数环境变量 ORDERER_GENERAL_GENESISMETHOD=file和 ORDERER_GENERAL_GENESISFILE=$PWD/genesis.block,或者修改配置文件orderer.yaml编辑这些属 性值。
(2)生成通道创世区块
生成通道创世区块的命令如下:
configtxgen -profile TwoOrgsChannel
-outputCreateChannelTx ./channel-artifacts/channel.tx -channelID
$CHANNEL_NAME
其中:
·TwoOrgsChannel为configtx.yaml中的Profiles之一;
·./channel-artifacts/channel.tx为生成的交易文件名及保存路径;
·$CHANNEL_NAME为通道名称。
(3)生成组织锚节点
生成通道中的组织锚节点,如下所示:
configtxgen -profile TwoOrgsChannel
-outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx
-channelID CHANNEL_NAME -asOrg Org1MSP
其中:
·TwoOrgsChannel为configtx.yaml中的Profiles之一;
·./channel-artifacts/Org1MSPanchors.tx为生成锚节点的配置文件名及保存路径;
·$CHANNEL_NAME为通道名称;
·Org1MSP为组织名称。
(4)查看区块信息
查看生成的区块信息的示例如下所示:
configtxgen -profile TwoOrgsOrdererGenesis
-inspectBlock ./channel-artifacts/genesis.block
其中:./channel-artifacts/genesis.block为指定的区块文件,该命令会将指定的区块文件解析成可读JSON格式信息展示出来。
(5)查看通道配置信息
检查和查看通道创世区块的内容如下所示:
configtxgen -profile TwoOrgsOrdererGenesis
-inspectBlock ./channel-artifacts/genesis.block
其中:./channel-artifacts/genesis.block为指定的区块文件,该命令会将指定的区块文件解析成可读JSON格式信息展示出来。
B.3.3 configtx.yaml文件解析
configtxgen工具的配置参数主要由configtx.yaml文件提供。在fabric库中,配置文件 在fabric/sampleconfig/configtx.yaml中。这个配置文件可以编辑,或者通过设置环境变量来重写属性值,如 CONFIGTX_ORDERER_ORDERERTYPE=kafka。
此配置文件主要分为3部分。
1)Profiles部分。它是默认的,这部分包含一些用于开发或测试场景的示例配置,这些配置涉及fabric 目录中的加密部分。configtxgen工具允许通过-profile标签来指定配置文件。Profiles部分可以显式声明所有配置,但是通常都是从 默认配置中继承。
2)Organizations部分。它是默认的,这部分包含示例配置MSP定义的单一引用。对于生产部署,应该 删除这部分配置,并以新网络成员的MSP定义来替代它。组织中每一个元素都必须带有锚标签,如&orgName,这些标签可以在Profiles 中部分引用。
3)默认部分。此部分是Orderer和Application的配置,包括一些属性配置,如BatchTimeout和一般用作继承的基础值。
下面我们分析一下该文件的内容:
#######################################################################
# Profiles
#
# 可以编写不同的 profile 配置,作为参数给 configtxgen 工具使用
# 指定了Consortium(组合、集团、联盟)profile用来生成orderer的创世区块
# 带有正确联盟成员定义的orderer创世区块,其通道的创建请求必须带有组织成员名和联盟名
#
################################################################################
Profiles:
TwoOrgsOrdererGenesis:
Orderer:
<<: *OrdererDefaults
OrdererType: kafka
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
TwoOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
#######################################################################
# Section: Organizations
#
# - 该部分定义了在这个配置文件中被引用的不同的组织标识
#
################################################################################
Organizations:
# SampleOrg 使用sampleconfig定义一个MSP。这个MSP不会在生产中使用,但可以临时使用
- &SampleOrg
# DefaultOrg 定义一个在开发环境中sampleconfig使用过的组织
Name: SampleOrg
# load MSP 使用的ID
ID: DEFAULT
# MSPDir 是MSP配置文件路径,由cryptogen工具生成的加密材料路径
MSPDir: msp
# AdminPrincipal 指定用于组织的管理员策略的主体类型
# 目前只能使用 Role.ADMIN 和 Role.MEMBER,分别代表主体类型为ADMIN和MEMBER
AdminPrincipal: Role.ADMIN
AnchorPeers:
# AnchorPeers 定义了可用于跨组织gossip通信的peer的位置
# 注意,这个值只有在Application下使用时才会编码进创世区块(即profile中
Application下引用这个组织)
- Host: 127.0.0.1
Port: 7051
- &OrdererOrg
Name: OrdererMSP
ID: OrdererMSP
MSPDir: crypto-config/ordererOrganizations/example.com/msp
- &Org1
Name: Org1MSP
ID: Org1MSP
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
AnchorPeers:
- Host: peer0.org1.example.com
Port: 7051
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
AnchorPeers:
- Host: peer0.org2.example.com
Port: 7051
################################################################################
#
# SECTION: Orderer
#
# - 该部分定义了编码到配置交易或创世区块中的与orderer相关的参数值
#
################################################################################
Orderer: &OrdererDefaults
# Orderer Type: orderer 的启动方式
# 可选类型是 "solo" 和 "kafka"
OrdererType: solo
Addresses:
#- 127.0.0.1:7050
- orderer.example.com:7050
# Batch Timeout: 创建batch的超时时间
BatchTimeout: 2s
# Batch Size: 控制batch到块中的消息数
BatchSize:
# Max Message Count: batch中允许的最大消息数量
MaxMessageCount: 10
# Absolute Max Bytes: batch中允许的绝对最大序列化消息字节数
# 如果OrdererType 是kafka,则要设置Kafka brokers的'message.max.bytes'和
'replica.fetch.max.bytes'的值大于该值
AbsoluteMaxBytes: 10 MB
# Preferred Max Bytes: batch中允许的首选绝对最大序列化消息字节数
# 如果一个消息大于该值,会导致batch 大于该值
PreferredMaxBytes: 512 KB
# Max Channels 是order网络中所允许的最大通道数
# 设为0表示无最大通道数的限制
MaxChannels: 0
Kafka:
# Brokers: orderer连接的Kafka broker列表
# 注意: 使用 IP:port 格式
Brokers:
- 127.0.0.1:9092
# Organizations 是作为网络中orderer侧参与者的组织列表
Organizations:
################################################################################
#
# SECTION: Application
#
# - 该部分定义了编码到配置交易或创世区块中的与APP相关的参数值
# 注意,在创建channel tx时才会用Application,否则是创建区块
#
################################################################################
Application: &ApplicationDefaults
# Organizations 是作为网络中APP侧参与者的组织列表
Organizations:
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=1040
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试
var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!
评论专区