Fabric 快速开始
本章《Fabric快速开始》的主要内容是按中文文档的流程搭建区块链环境,完成 BYFN(first-network) 的过程。
开发环境搭建(vagrant)
(宿主机:/e/vagrant9/ambari-agrant/fabric/devenv)
fabric官方库提供了一个Vagrantfile,是个ubuntu16的环境,供开发调试用。可参考 Fabri Getting Started。
在宿主机下启动 fabric 开发环境VM:
$ git clone https://github.com/hyperledger/fabric.git
$ cd fabric/devenv && vagrant up && vagrant ssh
虚拟机启动过程中会自动执行一个setup.sh
脚本进行初始化。有时会半途执行失败。可以进入linux后手工执行脚本:
$ cd /hyperledger/devenv && ./setup.sh
这样,你就拥有了一个fabric开发环境。(snap a3)
通过分析 setup.sh
,也可以看到手工安装 docker-compose、golang 的办法:
安装 docker-compose
$ curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
安装 go lang
setup.sh
中提供的是从golang.org
下载安装包,下面描述的是从另一个网站下载安装包。
$ cd /opt && wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
在文件/etc/profile
的最后添加:
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/opt/gopath
使环境变量生效后验证go版本:
$ source /etc/profile
$ go version
go version go1.9.2 linux/amd64
Hyperledger Fabric Samples
$ cd /opt && git clone -b master https://github.com/hyperledger/fabric-samples.git
$ cd fabric-samples && curl -sSL https://goo.gl/6wtTN5 | bash -s 1.1.0-preview
脚本会自动下载了很多docker镜像,如ca、order、peer、ccenv、tools、couchdb、kafka、zookeeper、javaenv等。
脚本还下载了几个工具到/opt/fabric-samples/bin
目录下,它们是cryptogen
、configtxgen
、configtxlator
、orderer
、peer
。
MSP 配置 (cryptogen)
cryptogen工具根据配置文件crypto-config.yaml
中配置,生成整个区块链所有成员的密码材料文件。
$ cd /opt/fabric-samples/first-network
$ cryptogen generate --config=./crypto-config.yaml
执行后,会在当前目录下创建一个crypto-config
文件夹。crypto-config
文件夹的结构如下:
crypto-config
ordererOrganizations
example.com
ca
msp
orderers
tlsca
users
peerOrganizations
org1.example.com
ca
msp
orderers
tlsca
users
org2.example.com
(同上)
上述目录结构是根据crypto-config.yaml
的内容生成的。crypto-config.yaml
的内容如下:
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
- Name: Org2
Domain: org2.example.com
上述crypto-config.yaml
是fabric-sample带的示范配置文件,它将Orderer和Peer两种节点的MSP都定义到了同一个文件中。而在实际的生产环境下,Orderer节点和Peer节点一般部署在不同的虚拟机中,则两种节点的crypto-config.yaml
配置文件将有所不同。
要搭建一个Fabric网络,首先应建立Orderer节点。而Orderer节点存在着一个系统区块链,上面保存了整个Fabric网络的基础信息。要创建一个区块链,先用cryptogen
工具生成MSP密码文件,再用configtxgen
工具生成创世区块。更具体的,应先生成Orderer节点的创世区块。
生成初始区块(configtxgen)
有时把初始区块翻译成创世区块。
configtxgen
运行时需要查找配置文件configtx.yaml
,这个配置文件的位置是靠环境变量来指定的:
$ export FABRIC_CFG_PATH=/opt/fabric-samples/first-network
$ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
执行后生成了一个“创世区块”文件genesis.block
。如果用vi打开这个文件看看,发现里面有9个证书,应该是3个属于orderer,6个属于peer。TwoOrgsOrdererGenesis
来自哪里?这就需要开发配置文件configtx.yaml
来看看了:
Profiles:
TwoOrgsOrdererGenesis:
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
TwoOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
Organizations:
- &OrdererOrg
Name: OrdererOrg
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
(略)
除了profile
的定义TwoOrgsOrdererGenesis
外,配置文件中另一个与configtxgen
的执行有关的属性是一个目录:
MSPDir: crypto-config/ordererOrganizations/example.com/msp
这个目录中密码文件由cryptogen
生成。如果之前没有用cryptogen
生成这些文件,configtxgen
执行时会提示这些上述目录不存在。
用 configtxgen 查看区块信息
$ export FABRIC_CFG_PATH=/opt/bcnet
$ configtxgen -profile TwoOrgsOrdererGenesis -inspectBlock ./channel-artifacts/genesis.block
configtxgen
会到FABRIC_CFG_PATH环境变量定义的目录下找configtx.yaml
这个配置文件,并按配置文件中的定义先找profile
,根据profile
的值所对应的MSPDir
下寻找密钥文件,然后利用密钥文件对创世区块进行解密并转换为json格式输出。
有的创世区块可以不加-profile
参数就能正常显示,原因不明。
生成通道 (configtxgen)
$ export FABRIC_CFG_PATH=/opt/fabric-samples/first-network
$ configtxgen -profile TwoOrgChannel -outputCreateChannelTx ./channel-artifacts/channel1.tx -channelID channel1
peer 加入通道 (peer)
peer直接在宿主机上直接运行会报错,一般进入cli
容器内执行:
$ docker exec -it cli bash
$ peer --help
参考:共识过程(视频截图)
Committing Peer
Maintains Ledger and state. Commits Transactions. May hold smart contract(chaincode).
Endorsing Peer
Specialized committing peer that receives a transaction proposal for endorsement, responds granting or denying endorsement. Must hold smart contract.
Ordering Nodes(service)
Approves the inclusion of transaction blocks into the ledger and communicates with committing and endorsing peer nodes. Does not hold smart contract. Does not hold ledger.
step 1/7 - propose transaction:
step 2/7 - execute transaction:
step 3/7 - propose response:
step 4/7 - order transaction:
step 5/7 - deliver transaction:
step 6/7 - validate transaction:
step 7/7 - notify transaction:
Transactions typically follow a seven-step process to become a block on the chain.
备忘
configtxgen
生成 orderer 创世区块
$ export FABRIC_CFG_PATH=$PWD
$ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
创建通道
$ export CHANNEL_NAME=mychannel
$ configtxgen -profile TwoOrgsChannel \
-outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
创建锚点 peer
$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate \
./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
获取组织配置材料
现在使用configtxgen工具输出JSON格式的Org3相关配置材料。作为开始的命令,告诉工具从当前目录下读取configtx.yaml。
$ export FABRIC_CFG_PATH=$PWD && ../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
peer 命令
创建通道配置交易
$ export CHANNEL_NAME=mychannel
$ export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
$ peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f \
./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA
peer加入通道
$ 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:7051
$ 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 channel join -b mychannel.block
创建链码包
$ peer chaincode package -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out
对链码包签名
$ peer chaincode signpackage ccpack.out signedccpack.out
安装链码
$ peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
实例化链码
$ peer chaincode instantiate -o orderer.example.com:7050 --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 -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
用链码查询
$ peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
用系统链码查询:
An example GetBlockByNumber query with block number 1 on channel mychannel using QSCC is given below:
$ peer chaincode query -C "" -n qscc -c '{"Args":["GetBlockByNumber","mychannel","1"]}'
根据区块高度在通道mychannel上查询系统链码QSCC。返回是的该区块的内容1。
用链码调用
$ peer chaincode invoke -o orderer.example.com:7050 --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 -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'
链码升级
$ peer chaincode upgrade -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","90","b","210"]}' -P "OR ('Org1MSP.member','Org2MSP.member','Org3MSP.member')"
取配置区块
$ export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
$ export CHANNEL_NAME=mychannel
$ peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
$ peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
0
表示获取创世区块。无参数表示获取最新区块。
对交易签名
需要提前配置好4个环境变量,以便知道以哪个Admin的身份签名。
$ peer channel signconfigtx -f org3_update_in_envelope.pb
更新呼叫
管理员签名会附加到这个呼叫上,所以不需要手工再次签署这个proto。
$ peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA
取最新区块到文件
$ peer channel fetch newest 1.block -o localhost:7050 -c composerchannel
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论