couchdb docker(Hyperledger Fabric first-network的初始化启动流程(二))

本文目录
Hyperledger Fabric first-network的初始化启动流程(二)
Build Your First network提供了一个 fabric 的示例网络。该示例网络中由两个组织构成,每个组织维护两个 peer 节点,演示了基于链码查询2个账户余额与转账操作。
first-network 中有一个启动脚本 byfn.sh,利用构建的 Docker 镜像快速启动网络。该脚本会启动一个 orderer 节点和四个归属两个不同组织的 peer 节点,还将启动一个cli运行脚本,它将 peer 节点加入通道(Channel)、部署和实例化链码,并根据已部署的链码驱动交易执行,以下是byfn.sh的帮助文档。
执行./byfn.sh up -o etcdraft启动脚本,指定使用raft共识算法
通过cryptogen工具生成组织成员关系和身份证书、密钥等文件。调用configtxgen工具生成节点与通道配置文件,包括Orderer节点上系统通道的创世区块文件genesis.block,新建应用通道的配置交易文件channel.tx、组织锚节点配置更新交易文件Org1MSPanchors.tx与Org2MSPanchors.tx等。
用户执行network_setup.sh脚本启动Fabric网络,该脚本调用networkUp函数,该命令会检查网络实体的证书是否生成,如果没有则首先生成相关证书目录。
generateCerts主要执行了cryptogen generate --config=./crypto-config.yaml
根据crypto-config.yaml生成网络成员组织结构和对应的身份证书、签名私钥等文件,并保存到默认的crypto-config目录,身份证书等文件在对应的目录msp/ 中,TLS证书与密钥文件保存到tls/ 中。
crypto-config.yaml主要包含的fabric排序节点证书配置以及fabric组织证书配置。
Template 模板定义节点的配置模式
Specs 另外一种配置模式
Count 节点总数
Hostname 全限定域名 命名格式
Domain 域名
Users 添加到管理员的用户帐户数
采用Specs模式配置了5个排序节点
采用Template模式配置了两个组织,每个组织2套公私钥和证书,包含普通User数量为1
ordererOrganizations目录 :包含Orderer组织类型的身份证书.pem文件、签名私钥文件 _sk文件、TLS证书(证书.crt文件和密钥.key文件)
peerOrganizations目录 :包含Peer组织类型的身份证书.pem文件、签名私钥文件 _sk文件、TLS证书(证书.crt文件和密钥.key文件)
这些文件通过docker-compose工具,基于docker-compose-cil.yaml、docker-compose-base.yaml等配置文件,将目录作为挂载卷到容器的指定目录。
调用replacePrivateKey基于docker-compose-e2e-template.yaml文件创建新的配置文件docker-compose-e2e.yaml。进入Org1组织的CA目录,获取私钥文件名作为PRIV_KEY,替换docker-compose-e2e.yaml文件的CA1_PRIVATE_KEY。同理替换CA2_PRIVATE_KEY。
执行generateChannelArtifacts函数,使用configtxgen工具基于configtx.yaml创建节点与通道配置文件,包括Orderer通道的创世区块,应用通道配置配置交易文件channel.tx,锚节点配置更新交易文件Org1MSPanchors.tx和Org2MSPanchors.tx
Orderer系统通道的创世区块
执行configtxgen命令,创建Orderer创世区块文件genesis.block
新建应用通道的配置交易文件
执行configtxgen命令,创建应用通道的配置交易文件channel.tx,后续执行peer channel create读取文件。
锚节点配置更新交易文件
执行configtxgen命令,创建锚节点配置更新交易文件Org1MSPanchors.tx和Org2MSPanchors.tx,后续执行peer channel update进行更新。
返回到network_setup.sh脚本,判断是否启用了CouchDB标志位(默认关闭),使用docker-Compose工具执行docker-Compose-cil.yaml文件,启动Fabric网络。
继续分析network_setup.sh脚本,默认COMPOSE_FILES是docker-compose-cli.yaml文件,当设置了kafka共识或者raft共识,则使用对应的yaml文件。
Orderer节点继承了docker-compose-base.yaml中的orderer.example.com配置属性,Orderer节点容器启动时执行如下命令
docker-compose-cil.yaml文件
继续追踪base/docker-compose-base.yaml,找到orderer.example.com服务,挂载目录和暴露7050端口。
orderer的配置还是引入peer-base.yaml中的orderer-base服务
4个Peer节点继承了docker-compose-base.yaml中对应容器名称的配置属性,Peer节点容器启动时执行如下命令
docker-compose-cil.yaml文件中Peer节点配置。
docker-compose-base.yaml文件中Peer节点的配置。
引入peer-base.yaml中的peer-base服务
docker-compose-cil.yaml文件中CLI客户端配置。启动完 orderer 节点、peer 节点和 CLI 容器之后,实际是调用 script.sh 脚本,该脚本是在 CLI 容器中执行,CLI 容器其实就是用户客户端,只不过是命令行客户端,运行在容器中。默认情况下CLI 的身份是 admin.org1,连接 peer0.org1 节点,执行 script.sh 脚本
script.sh脚本顺序执行默认的测试流程,包括创建新的应用通道、添加节点、更新锚节点、安装链码、实例化链码、调用链码、查询链码等操作。
Fabric要求创建、加入与更新通道的权限必须具有通道组织的管理员身份。调用setGlobals设置全局环境变量,CLI客户端能够灵活切换指定容器的管理员角色,可以直接连接并操作指定的Peer节点,先切换到Peer0/Org1节点。
接着采用Org1管理员身份执行peer指令,将通道配置文件Channel.tx发送给Orderer节点,创建mychananel的应用通道。如果创建成功,则返回一个创世区块block,它会存储在 peer 节点的文件系统中,包含 channel.tx 指定的通道配置信息。
遍历所有节点,调用setGlobals切换指定节点,执行peer指令,将Org1组织包含的Peer0/Org1和Peer1/Org1节点加入mychananel应用通道,将创世区块mychananel.block设置成命令行参数。Org2组织类似。
joinChannelWithRetry 函数中的 setGlobals 是设置 CLI 容器的环境变量的函数。例如:setGlobals 1 2 设置 CLI 的身份为 admin.org2,连接 peer1.org2 节点。
使用 peer channel join 命令让节点加入通道,$CHANNEL_NAME.block 就是前面创建通道成功时返回的区块,该区块在上面 org1.peer0 创建通道时保持在 CLI 容器内,所以能直接使用。节点成功加入通道后会创建 CHANNEL_NAME.block 开头的链。
一个组织只能有一个锚节点,节点加入通道后才能进行更新,连续两次调用updateAnchorPeers,更新两个组织的锚节点配置,用Org1管理身份更新Peer0/Org1的配置,并指定锚节点配置更新文件Org1MSPanchors.tx,Org2组织同理。
连续两次调用installChaincode分别在Peer0/Org1和Peer2/Org2中安装chaincode_example02链码,并将链码命名为“mycc”且版本1.0,如果链码安装成功,在指定安装目录/var/hyperledger/production/chaincodes下存在name.version的链码文件。
实例化链码必须在安装过链码的节点上进行,同一个通道内所有节点上相同的实例化数据在通道账本中是共享的,用户只需要在任意一个Peer节点上成功执行一次实例化链码操作,并通过排序打包后将实例化数据广播到其他节点上,通道内所有合法节点都可以访问该链码的实例化数据。
实例化将链码添加到通道上,启动目标节点的容器,初始化与链码相关的初始值,这里的初始值为 。”实例化“ 过程会产生链码的容器,例如: dev-peer0-org1.example.com-mycc-1.0 。实例化过程需要指定背书策略,通过 -P 参数设置,这里的策略定义为 AND (’Org1MSP.peer’,’Org2MSP.peer’) ,表示任何交易必须要有 org1 和 org2 节点的共同背书。
Peer0/Org1上调用链码查询函数chaincodeQuery和链码调用函数chaincodeQuery。查看A的余额,并从账户A中向账户B中转账10元。
Peer3/Org2上安装链码,执行查询A的余额,检查余额是否为90元,如果是说明转账成功。
Docker和LXC有什么不同
Docker不是lxc的一个替代方案。“lxc”是指linux内核(尤指命名空间以及Cgroup)的一个特性,它允许其他一些沙盒进程运行在一块相对独立的空间,并且能够方便的控制他们的资源调度。
而基于底层的内核特性的基础上,Docker在上层构建了一个更高层次的具备多个强大功能的工具集:
可移植的跨机器部署。Docker定义了一个将应用打包的规范,而它的所有依赖都被封装到了一个简单对象里,它可以被传输到任意一台能运行 Docker的机器,并且在这里启动Docker的实例之后,它能够确保承载应用的执行环境将会与之前所定义的完全一致。Lxc实现了进程级的沙盒封装, 它是可移植部署的一个重要前提,但是要想实现可移植部署,仅仅是这样可还不够。如果你发送给我一份安装到一个自定义LXC配置下的应用副本,那么几乎可以 肯定的是,它在我的机器上运行的结果不会跟你的完全一样,因为它绑定了你机器的一些特殊配置:网络,存储,日志,Linux发行版本等等。Docker为 这些机器的特定配置定义了一个抽象层,所以它使得这些相同的Docker容器能够一成不变的运行在多个不同的主机上,甚至带上各种不同的配置。
以应用为中心。相对于机器而言,Docker被用于优化应用的部署过程。这可以从它的API,UI,设计理念还有文档里得到体现。反之,lxc的辅助脚本专注在把容器作为一个轻量级的 机器 使用 —— 基本上就是一堆启动更快并且内存需求更小的服务器。我们认为容器技术的内容远远不止这些。
自动构建。Docker为开发人员引入了一个可以用来把他们的源代码自动打包到容器里的工具,并且他们能够对于应用的依赖,构建工具,打包服 务等有着完全的自主掌控能力。他们能够自由的使用make,maven,chef,puppet,salt,debian包,rpm包,源码包,或者任意 以上的结合,而无需关心机器本身的配置。
版本化。Docker引入了一个类似git的特性来完成一个容器的连续版本追踪,版本之间的差异diff,新的版本的提交,回滚等。历史记录 信息里也包含了容器的用户信息以及他是如何构建它的,因此生产环境的服务器你都有充足的手段去一步步的定位到最上游的开发人员。Docker也实现了一个 增量上传和下载功能,类似于git pull,所以更换到新版本的容器只需要传输增量部分就行。
组件的重用。任意容器都能用作“基础镜像”来创建更特定的组件。这可以手工完成也可以做成自动构建的一部分。例如,你可以准备一个理想的 python环境,并且把它用作10个不同的应用的基础镜像。你所定义的标准postgresql设置可以被将来你手上的所有项目重用。诸如此类。
***隐藏网址***
工具生态圈。Docker定义了一个API来自动化和个性化的创建和部署容器。也因此催生了众多的工具集成到Docker,为之提供一些扩展 特性。类PaaS的部署(Dokku,Deis,Flynn),多节点编排(maestro, salt, mesos, openstack nova),管理看板(docker-ui, openstack horizon, shipyard),配置管理(chef, puppet),持续集成(jenkins, strider, travis)等等。Docker正在迅速的建立以它本身为标准的基于容器的工具生态圈。

本文相关文章:
coreldraw12简体中文版下载(到哪下载CorelDraw12又快又好)
2026年9月1日 07:10
桌面虚拟化软件(VMware Workstation是什么)
2026年7月9日 15:20
mysql workbench(mysql workbench 怎麽使用)
2026年6月27日 07:00
iem里约major(IEM里约Major战队巡礼 GamerLegion篇)
2026年10月9日 10:40
oppperror怎么处理(c语言库函数中有error函数吗)
2026年9月25日 12:40
更多文章:
跷二郎腿太低好吗?想要通过贴墙站改正二郎腿影响的话,有哪些要点需要注意
2026年10月11日 05:10
易语言点击js按钮(易语言网页填表怎样点击链接为“javascript:void(0)“的按钮)
2026年10月11日 03:00
compare with造句(用compared with和compared to造句)
2026年10月10日 23:30
tensorflow与keras对应版本(为什么tensorflow2.8没有keras)
2026年10月10日 22:10
maven仓库jar网站(如何在maven仓库中添加jar包)
2026年10月10日 19:50



