首先,我们需要安装好fabric2.X的环境,具体参考我之前的文章:
这里默认已经有了fabric2.X的环境,进入test-network文件夹:
在开始测试之前:先把gopath项目路径全部解锁:
sudo chmod -R 777 $GOPATH
打开测试网络:sudo ./network.sh up
如果想要同时启动CA服务器和couchdb,执行这条指令:./network.sh up createChannel -ca -s couchdb
可以看到启动了fabric2.3的测试网络,包含了一个cli,两个peer结点,和一个orderer结点(用来排序的):
可以用docker ps 查看开启的容器:
接着在测试网络加入通道:
./network.sh createChannel
这里我们设置一下go的环境变量,当然如果有科学上网那最好,但是还是同时设置下:
这是go语言代理的网址:
Goproxy.cnThe most trusted Go module proxy in China.https://goproxy.cn/
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
然后可以看下go env:
看到go的 环境变量改了:
我这里已经设置了,就不操作了:
重要:
这里我们进行自己链码安装:
首先在当前目录下新建一个文件夹mychaincode再在里面新建一个文件夹,把自己编写的链码放进去:
在这里打开终端:
执行:go mod init
再执行:go mod tidy (增加需要的包,去掉不需要的包)
最后执行:go mod vendor
这里是讲链码的所有依赖下载到本文件夹内的vendor内,实现依赖封装:
此时,我们的链码环境才算完成了!
接下来就是链码的安装:
回到test-network目录下:
我们先看示例:sudo ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
我们执行:sudo ./network.sh deployCC -ccn mycc -ccp ../asset-transfer-basic/chaincode-go -ccl go
如果出现这个报错:
是因为我们用了sudo 管理员模式下会有时候找不到go的环境 我们去掉sudo:
运行:./network.sh deployCC -ccn mycc -ccp ../asset-transfer-basic/chaincode-go -ccl go
显示:
说明我们的链码在两个组织的结点上都安装成功了!
这个时候我们就要来实例化链码了:
这里注意,我们使用的官方的脚本,在fabric2.0版本中默认是不需要实例化链码了,所以直接调用invoke即可:
首先配置一下环境变量:
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
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
这里执行初始化链码:
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 mycc --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":"Init","Args":["A","100","B","200"]}'
为什么参数这么写?让我们看一下链码:
这里需要传入四个参数,(注意!fabric2.0中,无论链码需要传入什么参数,我们统一用字符串进行传入即可,就是。
执行结果:
说明已经执行成功了!
此时执行自己写的一个链码方法:
我们看链码源码:
在2.0链码里,方法名就是Saysomething,对应前面的"function":"Saysomething",后面的args后面的参数就是链码中的something string。
在执行查询链码:
从链码可知道,只需要传进去一个A string就行了:
执行:
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 mycc --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":"Query","Args":["A"]}'
可以看到查出来了:100,A的资产是100,也就是最开始初始化链码时存入账本的值。
这里尝试把peer0.org1.example.com和peer0.org2.example.com的路径删除再执行:
发现可以执行的!说明在查询的时候,也就是设计到账本改动的时候是不需要加背书策略的!
这里可以注意一下:就是如果是查询操作,仅仅是查询账本上的数据,那么可以把invoke改成query即可,当然也可以继续使用invoke也可以的!
如:
peer chaincode query -C mychannel -n mycc -c '{"function":"Query","Args":["A"]}'
因为是查询,所以不需要连接orderer结点,也不需要加上两个peer的证书,也就是查询不需要背书策略。