链码生命周期
一 . 链码准备
准备文件
. 在测试目录下创建chaincode,拷贝测试链码进 chaincode目录,拷贝 set-env.sh 脚本进 scripts 目录
二. 打包链码
打包测试链码
export FABRIC_CFG_PATH=${PWD}/config
peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/chaincode-basic --lang node --label chaincode_basic_1.0
检查打包结果
ls -al chaincode
三. 安装链码
运行以下进入 fabric-cli 容器:
docker exec -it fabric-cli bash
在org1中安装
. scripts/set-env.sh 1 0 7051
peer lifecycle chaincode install chaincode/chaincode_basic.tar.gz
在org2中安装
. scripts/set-env.sh 2 0 9051
peer lifecycle chaincode install chaincode/chaincode_basic.tar.gz
查看安装情况
peer lifecycle chaincode queryinstalled
四. 批准链码
org1批准链码
设置链码环境变量
export CC_PACKAGE_ID=chaincode_basic_1.0:1acd72b79f2d6f41ee6c55d408e8639ddd1cb90b4a450f571ded881d5d91f439
. 设置 Org1 环境变量
. scripts/set-env.sh 1 0 7051
. 批准链码
peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA
org2批准链码
设置 Org1 环境变量
. scripts/set-env.sh 2 0 9051
. 批准链码
peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA
检查提交准备
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --sequence 1 --tls --cafile $ORDERER_CA --output json
五. 提交链码
提交链码是特殊交易,需要背书节点背书,因此需要指定 2 个背书节点。具体操作如下:
peer lifecycle chaincode commit -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --sequence 1 --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA
查询提交的链码
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name chaincode_basic --tls --cafile $ORDERER_CA
六. 测试验证
调用InitLedger功能
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name chaincode_basic --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"function":"InitLedger", "Args":[]}'
调用ReadAsset功能
peer chaincode query -C $CHANNEL_NAME --name chaincode_basic -c '{"function":"ReadAsset","Args":["asset1"]}'
七.HF链码调用
在服务器创建 goProject 目录
找到 fabric-samples\asset-transfer-basic\application-gateway-go 文件夹
将文件夹拷贝至服务器 goProject 目录
拷贝证书
cd ~/goProject/application-gateway-go
cp ~/test/organizations . -r
安装依赖
go mod tidy
运行项目验证
go run assetTransfer.go
Go-Gateway项目调用
使用 VSCode 打开Go-Gateway,修改app.conf,修改 peer1Org1IP 为你服务器 IP
拷贝organizations目录
拷贝服务器 test 目录下的 organizations 目录到项目中
安装依赖并运行
go mod tidy
bee run
使用Postman验证
验证 evaluate 接口
八.fabric基础案例开发实训
构建案例项目服务端
创建项目
在指定目录下创建 base-back 文件夹
from flask import Flask,request,jsonify
import requests
import json
app = Flask(__name__)invokeURL = "http://192.168.200.101:8080/invoke"
evaluateURL = "http://192.168.200.101:8080/evaluate"
@app.route('/')
def hello_world():return 'Hello World!'@app.route('/initLedger',)
def ledgerInit():pass
@app.route('/createAsset',methods=['POST'])
def assetCreate():json_data = request.jsonpayload = json.dumps({"channelName":"applicationchannel","chaincodeName":"chaincode_basic","funcName":"CreateAsset","paramArray":json_data.get("paramArray")})headers = {"Content-Type":"application/json"}response = requests.request("POST",invokeURL,headers=headers,data=payload)print(response.text)return jsonify({'code':200,'msg':"create success"})@app.route('/readAsset',methods=['POST'])
def assetRead():json_data = request.jsonpayload = json.dumps({"channelName":"applicationchannel","chaincodeName":"chaincode_basic","funcName":"ReadAsset","paramArray":json_data.get("paramArray")})headers = {"Content-Type":"application/json"}response = requests.request("POST",evaluateURL,headers=headers,data=payload)print(response.text)return jsonify({'code':200,'msg':"query success","data":response.text})if __name__ == '__main__':app.run()