本文预计阅读时间:15min
一 环境准备
Git
通过命令 apt-get install git安装
参考 https://git-scm.com/download/linux
Go
Go 安装位置在 /usr/loacl/go,并配置 Go 环境:
下载 xxxx.tar.gz 的安装包:
执行
tar -C /usr/local -xzf go1.15.7.linux-amd64.tar.gz
配置 Go 环境,在 $HOME/.profile 或者 /etc/profile 中添加:
export PATH=$PATH:/usr/local/go/bin
输入 go version ,检查是否安装成功。
参考:https://golang.org/dl/
docker和docker-compose
docker 安装后,把源修改为 163 的源。
参考:https://docs.docker.com/engine/install/ubuntu/
二 拉取 Fabric 源码
2.1 本地用户目录下新建 go/src/github.com/hyperledger/ 文件夹:
mkdir -p go/src/github.com/hyperledger
2.2 切换到 hyperledger 目录下,从 GitHub 拉去 Fabric 源码:
git clone "https://github.com/hyperledger/fabric.git"
这个过程可能会比较长,不要断网,不要中断!
2.3 切换到 fabric 目录下,可以看到:
2.4 进入 scripts 文件夹, cd scripts,执行:
sudo ./bootstrap.sh
此时会开始克隆 fabric-sample 仓库、下载 Hyperledge Fabric binaries (二进制文件)和Hyperledger Fabric docker images(docker 镜像)。
下载完成后,自动列出当前已有镜像,如下图:
同时,在控制台可以看到下面相似的代码:
===> Pulling fabric Images
====> hyperledger/fabric-peer:2.3.0
...
====> hyperledger/fabric-orderer:2.3.0
...
====> hyperledger/fabric-ccenv:2.3.0
...
====> hyperledger/fabric-tools:2.3.0
...
====> hyperledger/fabric-baseos:2.3.0
...
===> Pulling fabric ca Image
====> hyperledger/fabric-ca:1.4.9
hyperledger/fabric-tools 2.3 2172e1e8ef5a 5 weeks ago 438MB
hyperledger/fabric-tools 2.3.0 2172e1e8ef5a 5 weeks ago 438MB
hyperledger/fabric-tools latest 2172e1e8ef5a 5 weeks ago 438MB
hyperledger/fabric-peer 2.3 a572d898402a 5 weeks ago 56MB
hyperledger/fabric-peer 2.3.0 a572d898402a 5 weeks ago 56MB
hyperledger/fabric-peer latest a572d898402a 5 weeks ago 56MB
hyperledger/fabric-orderer 2.3 0a77c2792890 5 weeks ago 39.2MB
hyperledger/fabric-orderer 2.3.0 0a77c2792890 5 weeks ago 39.2MB
hyperledger/fabric-orderer latest 0a77c2792890 5 weeks ago 39.2MB
hyperledger/fabric-ccenv 2.3 9432940881da 5 weeks ago 502MB
hyperledger/fabric-ccenv 2.3.0 9432940881da 5 weeks ago 502MB
hyperledger/fabric-ccenv latest 9432940881da 5 weeks ago 502MB
hyperledger/fabric-baseos 2.3 4dbd6846872b 5 weeks ago 6.39MB
hyperledger/fabric-baseos 2.3.0 4dbd6846872b 5 weeks ago 6.39MB
hyperledger/fabric-baseos latest 4dbd6846872b 5 weeks ago 6.39MB
hyperledger/fabric-ca 1.4 dbbc768aec79 2 months ago 158MB
hyperledger/fabric-ca 1.4.9 dbbc768aec79 2 months ago 158MB
hyperledger/fabric-ca latest dbbc768aec79 2 months ago 158MB
此时在 fabric/scripts/ 目录下,多了一个 fabric-samples 文件夹:
三 操作 fabric-samples
保持 fabric-samples 在 scripts 文件夹下,无需移动,经我的测试发现没有问题。(因为有些文章写到把 fabric-samples 文件夹放在和 fabric 文件同级,这个我并没有放在同一级目录)
切换到 fabric-sample/test-network 文件夹,后面所有操作都是在这里进行的。
我们先查看一下当前的镜像和容器,发现刚下载的容器,并没有在运行状态的,是正确的。
3.1 启动测试网络
在 test-network 目录下,执行 sudo ./network.sh up;
会创建 peer 节点、order 节点、 volume 等。
在启动完成,会列出启动的容器。
同样,我们自己可以通过 docker ps 查看容器运行情况,只有看到下面的情况,才表示运行成功。尤其是 STATUS(状态)一栏。
如果不是这样的, 执行 sudo ./network.sh down 关闭测试网络,删除一切重来。
3.2 创建 channel 频道
执行 sudo ./network.sh createChannel 创建一个默认频道,默认的名字为 mychannel。
过程中会提示:
Channel 'mychannel' created
得到上面图片中最后的绿字提示,表示成功。
Anchor peers updated for org 'Org1MSP' on channel 'mychannel'
Anchor peers updated for org 'Org2MSP' on channel 'mychannel'
Channel successfully joined
3.3 部署链码 chaincode
执行 sudo ./network.sh deployCC, 发现不太行,出现下面的提示:
提示:
No chaincode name was provided. Valid call example: ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
Deploying chaincode failed
意思是默认缺省参数的方式不太行,需要指定 -ccn -ccp 参数。
当补全 -ccn 和 -ccp 参数后,继续执行:
sudo ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
得到下面的错误提示:
提示:
Error: failed to normalize chaincode path: failed to determine module root: exec: "go": executable file not found in $PATH
Chaincode packaging has failed
Deploying chaincode failed
这是因为 sudo 管理权限,打乱了之前配置的 go 环境变量,改用普通用户权限即可。
当执行:
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
提示:
Error: failed to normalize chaincode path: 'go list' failed with: go: github.com/golang/protobuf@v1.3.2: Get "https://proxy.golang.org/github.com/golang/protobuf/@v/v1.3.2.mod": dial tcp 172.217.160.81:443: i/o timeout: exit status 1
Chaincode packaging has failed
Deploying chaincode failed
go list 发生失败,这时通过 go env 可以看到,go 的代理默认是:https://proxy.golang.org,direct.
将代理更改为:goproxy.cn,direct。
执行:
go env -w GOPROXY=https://goproxy.cn,direct
再次执行 go env 可以看到代理已经更换了。
好,再去执行:
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
此时会下载很多 go 的资源,如下图:
go: downloading github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212
go: downloading github.com/hyperledger/fabric-contract-api-go v1.1.0
go: downloading github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e
go: downloading github.com/golang/protobuf v1.3.2
go: downloading github.com/stretchr/testify v1.5.1
go: downloading google.golang.org/grpc v1.23.0
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/xeipuuv/gojsonschema v1.2.0
go: downloading github.com/gobuffalo/packr v1.30.1
go: downloading gopkg.in/yaml.v2 v2.2.8
go: downloading golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
go: downloading github.com/gobuffalo/envy v1.7.0
go: downloading github.com/gobuffalo/packd v0.3.0
go: downloading google.golang.org/genproto v0.0.0-20180831171423-11092d34479b
go: downloading github.com/rogpeppe/go-internal v1.3.0
go: downloading github.com/joho/godotenv v1.3.0
go: downloading golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542
go: downloading github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415
go: downloading github.com/go-openapi/spec v0.19.4
go: downloading github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f
go: downloading golang.org/x/text v0.3.2
go: downloading github.com/go-openapi/jsonpointer v0.19.3
go: downloading github.com/go-openapi/jsonreference v0.19.2
go: downloading github.com/go-openapi/swag v0.19.5
go: downloading github.com/PuerkitoBio/purell v1.1.1
go: downloading github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e
go: downloading github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578
最后会看到提示:
Query chaincode definition successful on peer0.org2 on channel 'mychannel'
Chaincode initialization is not required
代表链码部署成功。(Boom
)
3.4 和网络交互
在 fabric-samples/bin 可以看到 peer 运行文件,为了方便使用,配置在环境变量配置文件 /etc/profile 里面:
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
配置完成后,查看 /etc/profile 文件:
再执行 source /etc/profile 刷新一下,执行下面的命令(这是一行命令,不要分开):
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'
如果出现 “peer not found”,再当前路径下再刷新一次 profile 文件。(别问为什么,问就是刷新后就成功了,不刷新就不成功)
再执行上面一长串的一行命令,看到提示:
2020-12-28 15:19:11.003 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
代表成功。
再执行下面的命令:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
得到下面的结果:
这是因为传进去了参数 “GetAllAssets”,得到的对于结果。
[{"ID":"asset1","color":"blue","size":5,"owner":"Tomoko","appraisedValue":300},{"ID":"asset2","color":"red","size":5,"owner":"Brad","appraisedValue":400},{"ID":"asset3","color":"green","size":10,"owner":"Jin Soo","appraisedValue":500},{"ID":"asset4","color":"yellow","size":10,"owner":"Max","appraisedValue":600},{"ID":"asset5","color":"black","size":15,"owner":"Adriana","appraisedValue":700},{"ID":"asset6","color":"white","size":15,"owner":"Michel","appraisedValue":800}]
到这里为止,基本就和官网的教程对应上了。(Yeah
)官网的教程是真简约~ 跟着操作愣是没整明白,这一篇文章希望可以帮到你...
现在再查看运行容器,有 5 个:
遇到的几个问题,以及解决方法:
Q : 为什么要用 163 的源?
A : 因为之前的测试在使用阿里云的源时,在部署链码时总是遇见错误,原因未知。
Q : sudo ./network.sh deployCC 缺省参数为什么不行?总是提示 “No chaincode name was provided.”。
A : 应该是配置文件的原因,不能自动补全缺省参数,自己指定 ccn、ccp 就可以了。
Q : go list 错误:
Error: failed to normalize chaincode path: 'go list'
failed with: go: github.com/golang/protobuf@v1.3.2
A : 切换 go 代理。
Q : 找不到默认的模块路径。提示:
Error: failed to normalize chaincode path: failed to determine module root: exec: "go": executable file not found in $PATH
A : sudo 权限导致找不到具体的配置路径,去掉 sudo。
感谢阅读。如有帮助,感谢四连。