最近工作相对轻松,玩了一下区块链,尽管币圈让人很受伤,但依然不改学习区块链的热情,这几天在锯超级账本,按照文档部署了第一个demo.这里做一个记录.
说实话,走了很多弯路,主要原因是版本适配的问题,hyperledger还是属于比较新的技术,这就意味着它本身以及demo的迭代速度快,如果对照着之前的博客或者文章(也许仅仅是几个月前)部署的话很有可能有问题,走了很多弯路后最终回归官方文档,终于部署成功.之所以把这些话放在这里说是希望大家也不要完全对照这这篇博客部署,有可能会因为过时造成的环境以及版本问题,但这篇文章是完全按照官方文档的步骤以及结构写的,因此,大家在看官方文档的时候可以参考.
先高亮一下文档限定的环境(其中打*号的是文档的要求,必须遵守):
文档: https://hyperledger-fabric.readthedocs.io/en/release-1.2/prereqs.html
os:ubuntu 16.4.5
*docker: 17.06.2-ce或更高, 18年版的谨慎使用,不确定会不会有问题,但17年版本经过验证是可以使用,这里用的是docker-ce=17.09.0~ce-0~ubuntu这个版本
*docker-compose: 1.14.0版本或更高,这里用的是1.14.0版本
*go: 1.10.x版本
*node.js 版本:8.9.x or greater 不支持9.x版本, (推荐)npm. 如果node.js是8.9.x的版本默认安装的npm比较旧,文档推荐安装5.6.0
*Python: 2.7 尤其是ubuntu 16.04的版本自带的python是3.5版本,目前fabric的sdk不支持,需要降到2.7版本
目前文档对ubuntu环境的限定就这些,如果部署调试中有遇到奇怪的问题,先检查一下上面的环境是否符合文档要求
下面开始安装环境以及部署babric代码:
1.安装ubuntu 16.04,用virtualbox虚拟机,找一个16.04的镜像,desktop或者server都行,这里用的是desktop版
2.cURL工具安装
apt install curl
3.docker安装
//1.更新apt包
apt-get update
//2.apt仓库
apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
//3.添加GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
//4.stable仓库
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
//5.再次更新aptbao
apt-get update
//6.安装
apt-get install docker-ce
//7.版本
apt-get install docker-ce=docker-ce=17.09.0~ce-0~ubuntu
4.docker-compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.14.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
5.go安装
//下载
wget https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.g
//解压
sudo tar -xvf go1.10.linux-amd64.tar.gz
//环境变量
//进入.profile文件
vi ~/.profile
//添加如下代码并保存退出
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
//重启源
source ~/.profile
//在home目录下建立go文件夹
cd ~
mkdir go
6.nodejs安装
//安装nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
//环境变量
cd ~
vi .bash_profile
//添加如下代码并保存
export NVM_DIR="$HOME/.nvm"
. "$NVM_DIR/nvm.sh"
//重启源
source .bash_profile
//安装node
nvm install 8.9.2
//升级
npm install npm@5.6.0 -g
7.python(并检查版本是否是2.7)
sudo apt-get install python
到此hyperledger的环境安装完成,下面开始安装fabric sample
1.clone代码
mkdir sample
cd sample
git clone https://github.com/hyperledger/fabric-samples.git
2.下载平台的二进制文件(这里时间比较久,请耐心等待)
cd fabric-samples
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0
3//构建项目配置信息
cd first-network
./byfn.sh generate
4.关闭网络以防万一
./byfn.sh down
5.生成初始区块
../bin/cryptogen generate --config=./crypto-config.yaml
export FABRIC_CFG_PATH=$PWD
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
6.生成通道配置信息
export CHANNEL_NAME=mychannel && ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
7.定义两个锚节点
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
8.启动网络
docker-compose -f docker-compose-cli.yaml up -d
9.环境变量(org1)
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
10.进入容器
docker exec -it cli bash
11.安装chaincode
11.1 当前终端
//创建通道
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
//org1加入通道
peer channel join -b mychannel.block
//org2加入通道(以下为一行命令,当然,也可以放在另一个终端中)
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 install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
11.2 再打开一个终端对org2安装chaincode
//环境变量
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
//安装链码并配置channelname变量
export CHANNEL_NAME=mychannel
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
到这里chaincode已经部署完成,下面可以开始调试(随便哪个终端)
1 查询a账户(当前余额100)
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
2.转账(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:7051 --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"]}'
3.查询a账户(当前余额90)
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'