解决了官方示例指令需要科学上网才能运行的问题(通过手动下载二进制文件和拉取官方fabric-samples)。具体的将bootstrap.sh脚本解读了一遍 具体可以参照我的博客 fabric中bootstrap.sh到底帮助我们干了什么?(curl -sSL https://bit.ly/2ysbOFE | bash -s执行不成功,如何手动执行相相关操作?)_sh bootstrap.sh_小小小小关同学的博客-CSDN博客
前期的准备工作不再记录 也就是安装go docker docker-compose等操作
链码部署与调用等操作基于完成克隆fabric-samples仓库、拉取二进制文件、下载需要的镜像这些操作之后
这个脚本可以快速帮助我们搭建起自己的fabric网络 是一个单机多节点的示例。对于脚本的具体实现在搭建完多级部署后再看会有不一样的体会,将一些指令通过脚本的方式封装执行节省了使用者的操作,类似于一个fabric尝鲜。笔记中还有对basic链码的标注,看懂链码学会调用!
1.查看test-network脚本的使用说明
./network.sh -h
可以看出我们可以通过他给出的这些指令来完成对应的功能,也可以用过一些参数也自定义通道名称。
2.启动测试网络
./network.sh up
启动后创建了四个结点: cli ;两个peer结点 一个排序结点。
3.创建通道
./network.sh createChannel (可以带上 -c 通道名称 来指定)我使用的是默认名称mychannel
执行成功后
4.在通道上安装一个链码
在我们安装链码之前最好去链码所在的目录去查看一下链码所需要的依赖包是否成功导入:
可以先进入到链码所在的目录看一看:../asset-transfer-basic/chaincode-go 就是这个目录下。
cd ../asset-transfer-basic/chaincode-go
这里已经有了vendor 之前遇见过没有的情况 也就是要自己手动拉取一下(go mod vendor)
然后回到test-network执行部署链码命令
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
成功后:
注意:
如果没有vendor的话可与参考下面的方法,有的话直接跳过就可以(有的时候没有的话也先执行一些启动连链码的那条指令 可能会帮助拉取vendor)
执行前注意使用 go env 查看go环境 确认配置好了gomoudle ,然后在chaincode-go目录下输入
go mod vendor 即可 然后再次查看就能看到vendor
回到测试网络.sh文件所在的目录下 重新启动链码即可
5 与网络交互
到现在我们的basic链码已经成功安装了,现在我们可以对basic链码的功能来一个测试了:
- 使用以下命令将这些二进制文件添加到您的CLI路径:
export PATH=${PWD}/../bin:$PATH
- 您还需要将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
- 现在,您可以设置环境变量,以允许您作为Org1操作peer CLI:
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 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":[]}'
这是初始化账本的源码实现,就是讲结构变量通过json.Marshal转换成json 再通过PutState讲资产存入世界状态。
- 现在你可以用你的 CLI 工具来查询账本。运行以下指令来获取添加到通道账本的资产列表(在运行指令之前可以先看看链码中对于这个函数的实现到底是怎样的):
可以看到这个想要调用这这个函数 只需要一个传入一个交易上下文接口就可以了,但是在使用中这个应该是fabric内部自己传入的并不需要我们来传入,所以对于这个函数我们并不需要传入任何参数,直接给出函数名即可。
peer chaincode query -C gdwchannel -n basic -c '{"Args":["GetAllAssets"]}'
- basic中还给出了一些其他函数,我们可以看看具体怎么实现的 然后来调用它
- 添加资产
命令:(下面命令一次性输入)
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":"CreateAsset","Args":["asset7","pink","20","HEUN","888"]}'
- 删除资产
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":"DeleteAsset","Args":["asset1"]}'
- 更新资产(修改资产)
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":"UpdateAsset","Args":["asset7","RED","20","gdw","888"]}'
- 转移资产
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"]}'
- 切换身份
之前都是使用组织1来验证代码的增删改查操作,现在我们可以再开一个终端,用组织2来验证功能,只需要变更环境变量即可!
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
然后就可以在 peer0.org2.example.com上来调用一些智能合约,比如来查询我们自定义的资产7看看是否能在组织二上查询到
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset7"]}'
完成后想要关闭测试网络的话可以执行:
./network.sh down