提示:由于步骤较为复杂,容易出错,不建议逐步跟着操作,读一遍大致了解一下过程就好了
超级账本的官方实力中使用了自动化脚本的方式,并且使用了docker技术, 使得很多的操作细节被屏蔽,很多人在环境搭建完成以后还时一脸茫然,完全不知道发生了什么,经过我的多年研究,总结出超级账本逐步启动的方式,并且在每一步上会加上注释,让学习的朋友可以了解超级账本的启动,并且知道内部究竟发生了什么,对超级账本有一个更加直观的理解。在你看这篇文章前,请确保你已经能够成功启动搭建一套区块链网络。如果你还不会启动请参考https://blog.csdn.net/qq_27348837/article/details/86974035
超级账本:v1.4.0
系统:ubuntu16,
你可能已经启动了一套正在运行的fabric网络,如果你不确定可以通过 docker ps 命令进行查看
在进行本教程之前我们需要先停掉这个网络。
移动到first-network文件夹下面有如下一些文件
执行命令
./byfn.sh down
在选项提示中输入y,
cryptogen generate --config=./crypto-config.yaml
如果得到如下的提示结果说明执行成功了
如果提示无此命令之类的,可能你需要将fabric提供的bin文件配置到系统环境变量中。具体配置流程就不说了。在我的另一篇环境搭建博客中有说明。
执行如下命令,方便fabric的configtxgen
工具找到配置文件的路径
export FABRIC_CFG_PATH=$PWD
创世块生成命令
configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
执行成功返回结果
设置环境变量
export CHANNEL_NAME=mychannel
生成channel.tx配置文件,
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
执行成功返回如下结果
执行锚节点,并生成配置文件
org1执行
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
返回如下结果说明执行成功
启动节点
docker-compose -f docker-compose-cli.yaml up -d
成功结果如下:
创建并加入通道,通过如下命令,可以让我们进入到cli容器里面,cli容器为我们提供了操作节点的命令工具和环境
docker exec -it cli bash
执行后你会发先你所处的目录发生如下变化:
root@4bbc68c16171:/opt/gopath/src/github.com/hyperledger/fabric/peer
说明我们现在正在处于docker容器当中
在cli容器中,我们通过一下四个环境变量来操作节点
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/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
peer0.org1是默认配置。如果需要操控其他节点, 我们需要修改这四个配置信息,到对应节点
我们先重新在设置一下环境变量
export CHANNEL_NAME=mychannel
创建通道
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
成功后返回如下信息
2019-11-21 10:42:53.224 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-11-21 10:42:53.296 UTC [cli.common] readBlock -> INFO 002 Received block: 0
然后我们将节点加入到通道中, 执行命令
peer channel join -b mychannel.block
返回
2019-11-21 10:44:27.794 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-11-21 10:44:27.903 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
通过如上命令,我们让peer0.org1加入到了同道中,我们还需要将其与三个节点加入,
修改环境变,将其指到peer1.org1.example.com
在修改之前,你需要通过docker ps 命令列出你所启动的容器,查看其端口号信息,
我这里peer1.org1对应的是8051,根据版本的不同,你的可能对应7051, 要根据你自己的情况修改CORE_PEER_ADDRES变量
export CORE_PEER_ADDRESS=peer1.org1.example.com:8051
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
然后我们将org2的两个节点也加入到同道中,,我们也可以通过直接在命令中制定环境变量的方式来启动,这样我们就不用再一个个修改环境量,在执行此命令之前,你需要确定你的端口号是9051还是7051,确定方法同上。
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/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 channel join -b mychannel.block
通过上面的命名我们将peer0.org2加入到了同道中,修改变量,在执行一次,将peer1.org2也加进去
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.example.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt peer channel join -b mychannel.block
修改四个环境变量,使其指定到peer0.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
执行此命令,
再次修改环境变量值,指向peer0.org2后,重复执行此命令,
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
你可能会觉得很繁琐,没错,我也是这样认为
我们来安装一个系统内置的智能合约,由于刚刚环境变量指向的是peer0.org2,我们将在peer0.org2节点上安装智能合约
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
修改为如下环境变量后
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/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
再一次执行,即可在peer0.org1上面安装智能合约
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 "AND ('Org1MSP.peer','Org2MSP.peer')"
OK,恭喜你,环境搭建的工作到此为止已经全部成功了, 下面我们引用智能合约作为测试
超级账本对智能合约的调用分为两种, 分别是invoke和query,query只能调用查询类的智能合约,invoke可以用来调用修改累的智能合约。
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
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"]}'