入门参考文档:
https://hyperledger-fabric.readthedocs.io/zh_CN/release-2.2/test_network.html
想要学习一项技术,最好的开始就是官方文档。
下载hyperledger官方的sample
# 只下载项目
git clone https://github.com/hyperledger/fabric-samples.git
# 全面下载
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.2 1.4.9
docker确认
如果你的电脑上没有安装先安装docker
sudo apt install docker.io docker-compose
#或
sudo snap install docker docker-compose
切换到root环境
这里注意,说明一下,在Linux Ubuntu上,后面所有操作都要在root下进行。
所以开始前先su:
sudo su
开始部署第一个sample
进入到fabric-samples/test-network
,执行:
启动fabric在docker上的服务
./network.sh up
创建一个channel
./network.sh createChannel
启动一套智能合约(链码),在hyperledger上智能合约被叫做链码,非常的奇怪,我还是喜欢eth下的智能合约叫法。
用JS或TS版本的链码
#ts
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-typescript -ccl typescript
#js
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript -ccl javascript
测试这sample的合约
因为这里我们要用到peer等一些二进制工具与链码进交互,所以我们添加bin系统环境变量。
如下操作:
# 在root环境下操作
vi ~/.bashrc
# 在root的bashrc中增加:
export PATH=~/fabric/bin:$PATH
export FABRIC_CFG_PATH=~/fabric/config/
另外还需要export一些环境变量,是和sample有关的,我们不要写入bashrc中,直接在test-network
中执行即可:
# 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
为了方便,你可以在test-network
下新建一个envrc1
文件,然后把上面这几个export
复制进去,之后进入到test-network
目录后只需要执行source ./envrc1
即可导入这些环境变量。
那为什么是1呢?因为还有2啊。在上述步骤中,你应该发现了其实这network.sh
创建了2个docker peer节点也就是org1和org2,所以针对这两个org我们是有两套环境变量的,分指向这两个组织。
具体说这两个envrc文件里面的都是组织相关的加密文件,用于鉴权。
以下是envrc2
# Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
开始读写合约的测试
先使用org1来测试:
source ./envrc1
首先我们初始化一下账本,先写入一些数据:
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 chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
我们会看到一堆json数据,这些就是刚刚初始化操作后的账本状态,也就是org1的资产。
接下来我们做一些转账操作:
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":"TransferAsset","Args":["asset6","Christopher"]}'
好了,我们去看下转账后的区账本,我们用org2进行查询,所以source ./envrc2
执行:
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
结果:
{"ID":"asset6","Color":"white","Size":15,"Owner":"Christopher","AppraisedValue":800,"docType":"asset"}
好的,非常完美,资产属于Christopher了,关于转账细节请查看sample项目asset-transfer-basic/chaincode-typescript
关闭服务
测试结束,如果需要关闭sample,执行:
./network.sh down