二维码

附录B 超级账本的实用工具 - 数据结构 - 机器学习

1260 人阅读 | 时间:2021年01月15日 01:20
附录B 超级账本的实用工具 - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

附录B 超级账本的实用工具

1228 人参与  2018年10月10日 12:45  分类 : 区块链精品文章  评论

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 超级账本的实用工具 - 数据结构 - 机器学习

图 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

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

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"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×