链码生命周期
一 . 链码准备
准备文件
.
在测试目录下创建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.json
payload = 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.json
payload = 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()