Hyperledger Fabric 手动搭建

前面我们学习了区块链是什么、还有自动搭建学习东西我们就要从简单到深入(入门到放弃),现在自动部署已经跑通了接下来就是手动搭建Fabric 网络可以更好的理解为什么要这么做。

使用cryptogen(密码生成器)和configtxgen(配置交易生成器)手动生成证书/密钥和各种配置构件(等同于执行./byfn.sh generate)

  • 密钥生成器 cryptogen

    • cryptogen 工具为我们的网络实体生成各种加密材料( x509 证书和签名秘钥)。这些证书是身份的代表,在实体之间通信和交易的时候,它们允许对身份验证进行签名和验证
    • crypto-config.yaml,为所有组织和属于这些组织的组件生成一组证书和秘钥。每一个组织被分配一个唯一的根证书(ca-cert),它绑定该组织的特定组件(Peer 节点和排序节点)。通过为每个组织分配一个唯一的 CA 证书,我们模拟了一个典型的网络,网络中的成员可以使用它自己的证书授权中心。Fabric 中的事务和通信由一个实体的私钥(keystore)签名,然后通过公钥(signcerts)验证。
# crypto-config.yaml 文件结构
OrdererOrgs: #定义一个Order组织
- Name: Orderer #order节点的名称,当前网络模式为solo类型,所以只定义了一个Order节点
Domain: example.com #order节点的域
Specs: #暂时用不到
- Hostname: orderer
- Hostname: orderer2
- Hostname: orderer3
- Hostname: orderer4
- Hostname: orderer5 PeerOrgs: #定义Peer组织
- Name: Org1 #声明Peer组织名称为Org1
Domain: org1.example.com #Org1组织的域
EnableNodeOUs: true #暂时没搞清楚该字段的意义
Template: #在这里可以定义所生成的Org1组织中的Peer节点证书数量,不包括Admin
Count: 2 #表明需要生成两个Peer节点的证书,如果需要其他数量的Peer节点,只需要更改这里的数量。
Users: #在这里可以定义所生成的Org1组织中类型为User的证书数量,不包括Admin
Count: 1 #生成用户的证书的数量 - Name: Org2 #声明第二个Peer组织名称为Org2,如果需要更多的Peer组织证书,只需要按该模板添加即可。
Domain: org2.example.com #与以上相同
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
  • 配置交易生成器 configtxgen

    • 使用configtxgen工具生成系统通道的创世区块,并将系统的配置操作(创建通道,设置某组织的锚节点等)作为系统事务生成提交到系统通道的事务文件(.tx),配置文件为configtx.yaml,生成的配置组件位于channel-artifacts目录下、分别为:genesis.block,channel.tx,Org1MSPanchors.tx,Org2MSPanchors.tx,genesis.block为系统通道的创世区块,后三者分别为创建通道,设置组织一、组织二的锚节点的事务,这些配置操作作为系统事务提交到系统通道中。
# 会根据crypto-config.yaml文件配置生成两个锚节点交易,一个对应一个Peer组织
cryptogen generate --config=./crypto-config.yaml #生成系统通道创世区块genesis.block生成的配置组件位于channel-artifacts目录下
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block #通过环境变量设定通道名称
export CHANNEL_NAME=mychannel #创建 通道配置 事务
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME #创建 更新组织Org1在该通道上的锚节点(锚节点为某组织对order可见的节点) 的事务
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP #创建 更新组织Org2在该通道上的锚节点 的事务
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

启动网络,创建并加入通道,更新组织锚节点,安装、定义并调用一个链代码(等同于执行./byfn.sh up)

#启动fabric网络 -d用于不显示网络的实时日志,若想查看日志流,则后续命令需要打开另一个终端来执行
#首先将first-network目录下的docker-compose-cli.yaml文件中cli容器配置信息中的FABRIC_LOGGING_SPEC=INFO修改为FABRIC_LOGGING_SPEC=DEBUG以看到更多的执行过程信息
docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml up -d

启动网络之后我们可以看到docker启动的容器



进入容器 创建并加入通道,并指定(更新)组织的锚节点

#进入cli容器内部
docker exec -it cli bash #配置CLI容器作为peer0.org1.example.com节点执行命令的环境变量
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt #以环境变量形式设定通道名称,必须全部小写,长度小于250个字符,并与正则表达式[a-z][a-z0-9.-]*匹配
export CHANNEL_NAME=mychannel #将通道配置事务发送给order节点以创建通道,指定order节点的证书以进行TLS握手,执行结束后该节点将收到来自order节点的对应于所创建通道的创世区块$CHANNEL_NAME.block
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

#将peer0.org1.example.com加入通道,注意命令中的$CHANNEL_NAME.block,根据通道名称而变化
peer channel join -b mychannel.block #指定peer0.org1.example.com作为组织Org1的锚节点
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem #配置CLI容器作为peer0.org2.example.com节点执行命令的环境变量
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt #将peer0.org2.example.com加入通道,注意命令中的$CHANNEL_NAME.block,根据通道名称而变化
peer channel join -b mychannel.block #指定peer0.org2.example.com作为组织Org2的锚节点
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem #下载安装并定义一个链代码
peer lifecycle chaincode package mycc.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label mycc_1

#安装链码
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt #安装链码
peer lifecycle chaincode install mycc.tar.gz #查询已安装的链码
peer lifecycle chaincode queryinstalled #后续命令将需要链码包的ID,因此我们将它保存为一个环境变量,这个ID是动态的(上面查询出来的)
CC_PACKAGE_ID=mycc_1:3a8c52d70c36313cfebbaf09d8616e7a6318ababa01c7cbe40603c373bcfe173 #制定链码初始化链码TLS后面的命令是要权限才能初始化
#通道中的组织需要就链码的定义达成一致,以下命令用于批准一个chaincode定义,--init-required用于初始化chaincode时使init函数被调用,--package-id指定链码包的ID,我们还可以提供--signature-policy或--channel-config-policy参数来设置chaincode背书策略,若未提供将使用默认设置-大多数通道成员背书,这种情况下若在该渠道中添加或删除新组织,背书策略将自动更新,以要求更多或更少的背书。在本例中,默认策略将需要来自属于Org1和Org2的peer的背书(即两个背书)
peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --package-id $CC_PACKAGE_ID --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem #更改CLI容器的环境变量后,在其它节点上安装链码
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt #安装链码
peer lifecycle chaincode install mycc.tar.gz #制定链码初始化链码TLS后面的命令是要权限才能初始化
#通道中的组织需要就链码的定义达成一致,以下命令用于批准一个chaincode定义,--init-required用于初始化chaincode时使init函数被调用,--package-id指定链码包的ID,我们还可以提供--signature-policy或--channel-config-policy参数来设置chaincode背书策略,若未提供将使用默认设置-大多数通道成员背书,这种情况下若在该渠道中添加或删除新组织,背书策略将自动更新,以要求更多或更少的背书。在本例中,默认策略将需要来自属于Org1和Org2的peer的背书(即两个背书)
peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --package-id $CC_PACKAGE_ID --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem #一旦足够多的通道成员组织批准了chaincode定义,一个成员组织就可以将定义提交给通道。可以通过发出以下查询来检查chaincode定义是否已准备好提交,并查看当前组织的批准情况
#查看各组织对chaincode定义的批准状况
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --sequence 1 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json #一旦就链码定义达成一致,把两个组织中的链码提交到order组织--通知给其他节点我加入了
peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID $CHANNEL_NAME --name mycc --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt #调用chaincode 将--isInit标志传递给链码的第一次调用,并将参数提供给Init函数。第一个调用将启动chaincode容器。我们可能需要等待容器启动。(确保通道名称和链码名称正确)
peer chaincode invoke -o orderer.example.com:7050 --isInit --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["Init","a","100","b","100"]}' --waitForEvent #查询chaincode
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' #调用链码的invoke函数,a向b转账十元
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}' --waitForEvent #注:若通道成员组织的其它节点想和区块链网络进行交互,只需要加入通道并安装链码包即可,而不需要提交链码定义(每个组织批准一次链码定义即可)。

Hyperledger Fabric 手动搭建【区块链学习三】的更多相关文章

  1. HyperLedger Fabric 1.4 区块链开发平台(4.1)

    目前区块链开发平台分“公有链平台”和“联盟链系统”两类,“公有链平台”主要以以太坊为主的平台,可以在该类平台上进行代币的发行和根据各种模块搭建应用:“联盟链系统”主要以超级账本为主的开源系统,该类开源 ...

  2. HyperLedger Fabric 1.4 区块链工作过程(2.3)

    区块链的工作过程分交易产生.交易广播.节点计算.获取记账权.记账权广播.接收区块.验证区块和完成记账七个过程. 1) 交易产生:用户向区块链发了一笔交易信息,将产生交易:2) 交易广播:当一笔新交易产 ...

  3. HyperLedger Fabric 1.4 区块链技术原理(2.2)

    区块链从字面上理解:数据记录在区块中,通过一定的算法把区块连成一个链.       区块链通过哈希(Hash)算法,生成一串字符串,保存在区块的头部中,一个的区块通过指向上一个Hash值,加入到区块链 ...

  4. HyperLedger Fabric 1.4 区块链应用场景(3.1)

    比特币是区块链应用最早的场景,随着比特币安全稳定运行多年以后,数字货币的场景应用遍地开花,各种山寨币泛滥,通过ICO(Initial Coin Offering 首次币发行)就能融到大量资金,上市后的 ...

  5. HyperLedger Fabric 1.4 区块链技术定义(2.1)

    区块链技术指使用点对点传输.共识机制.加密算法等技术,保证分布式数据库区块写入链中数据的一致性,达到去中心化和不可篡改的目的.       区块链就是一种特殊的分布式数据库,使用现有的各种成熟的技术, ...

  6. HyperLedger Fabric 1.4 区块链技术发展(1.3)

    区块链技术发展经历区块链1.0(数字货币).区块链2.0(数字资产与智能合约)和区块链3.0(各种行业分布式应用落地)三个阶段.区块链在应用上分为公有链(PublicBlockChains).联盟链( ...

  7. HyperLedger Fabric 1.4 区块链技术形成(1.2)

    在比特币诞生之时,没有区块链技术概念,当人们看到比特币在无中心干预的前提下,还能安全.可靠的运行,比特币网络打开了人们的想象空间:技术专家们开始研究比特币的底层技术,并抽象提取出来,形成区块链技术,或 ...

  8. Hyperledger Fabric【区块链学习一】

    Hyperledger Fabric 学习 什么是区块链 什么是区块链在我们没有接触的时候,只知道它是一个去中心化的存储方式.当我们发生交易,或者动作的时候我们会将记录通知给所有参与者共同维护,达到去 ...

  9. hyperledger explorer 结合 fabric1.4 搭建 区块链浏览器 踩坑记录

    博主通过这篇博客的步骤搭建区块链浏览器:https://blog.csdn.net/qq_32675427/article/details/99946945 进行到下面这一步时出现各种异常,浪费了博主 ...

随机推荐

  1. Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码

    功能介绍 客户端给所有在线用户发送消息 客户端给指定在线用户发送消息 服务器给客户端发送消息(轮询方式) 项目搭建 项目结构图 pom.xml <?xml version="1.0&q ...

  2. js控制语句练习(回顾)

    1.一个小球从100米空中落下,每次反弹一半高度,小球总共经过多少米,请问第10次反弹的高度是多少? //定义初始下落过程高度 var sum1= 0; //定义初始上升高度 var sum2= 0; ...

  3. 一款功能简约到可怜的SQL 客户端

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  4. PHP mysqli_stat() 函数

    创建 SSL 连接: <?php 高佣联盟 www.cgewang.com // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect(& ...

  5. 原生JS 实现点击按钮创建元素

    要求: 点击按钮,随机生成一个20px-100px宽度正方形,随机颜色,随机位置,不能出可视区域外 思路:(1)创建按钮,为按钮添加事件侦听 (2)触发事件,创建一个元素 (3)设置元素样式,包括大小 ...

  6. mit-6.828 Lab Tools

    Lab Tools 目录 Lab Tools 写在前面 GDB GNU GPL (通用公共许可证) QEMU ELF 可执行文件的格式 Verbose mode Makefile 写在前面 操作系统小 ...

  7. 承诺会计/预留款会计(commitment accounting/Encumbrance Accounting) in AX 2012

    作者:umfish  博文 http://blog.csdn.net/umfish/article/details/7751397 如果要使用Encmubrance Accounting, 需要先在G ...

  8. Windows环境编译Spark源码

    一.下载源码包 1. 下载地址有官网和github: http://spark.apache.org/downloads.html https://github.com/apache/spark Li ...

  9. stl_heap

    学习一下stl_heap 下面的算法是根据stl源码重新整合一下,是为了方便理解 因为使用的迭代器,为了在给定的迭代器之间使用heap的一些方法, 内部通常用disHole来确定某个节点 dishol ...

  10. node根据excel批量更名

    程序预览 index.js var xlsx = require('node-xlsx'); var fs = require('fs'); process.stdin.setEncoding('ut ...