一 . 链码准备
需要删除上面后面标记的文件,之后拖入
二. 打包链码
注意需要先启动链
打包测试链码
export FABRIC_CFG_PATH=${PWD}/config
peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/credit_chaincode --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/credit_chaincode.tar.gz
在org2中安装
. scripts/set-env.sh 2 0 9051
peer lifecycle chaincode install chaincode/credit_chaincode.tar.gz
查看安装情况
peer lifecycle chaincode queryinstalled
四. 批准链码
org1批准链码
设置链码环境变量
export CC_PACKAGE_ID=credit_chaincode_1.0:07b393b647b1ab0f20584987a23bbb27abade58be04670e9bca576b045182776
设置 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 credit_chaincode --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 credit_chaincode --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA
检查提交准备
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name credit_chaincode --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 credit_chaincode --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 credit_chaincode --tls --cafile $ORDERER_CA
六. 测试验证
docker logs -f 容器名称
调用功能creatCreditSubject功能
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name credit_chaincode --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"function":"createCreditSubject", "Args":["A001","My Company","Company"]}'
调用 queryCreditSubject功能
peer chaincode query -C $CHANNEL_NAME --name credit_chaincode -c '{"function":"queryCreditSubject","Args":["A001"]}'
七.征信后端开发
注意:需要启动链码,查看
docker-compose -f fabfic-compose.yaml up -d
docker ps
项目配置
使用vscode打开credit-back-init/app.py
app.py
加入query端口和create端口,启动app.py
修改成你自己的ip
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('/createCreditSubject',methods=['POST'])
def creditCreate():
json_data = request.json
payload = json.dumps({
"channelName":"applicationchannel",
"chaincodeName":"credit_chaincode",
"funcName":"createCreditSubject",
"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('/queryCreditSubject',methods=['POST'])
def creditCredit():
json_data = request.json
payload = json.dumps({
"channelName":"applicationchannel",
"chaincodeName":"credit_chaincode",
"funcName":"queryCreditSubject",
"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
})
# @app.route('/createC')
if __name__ == '__main__':
app.run()
启动go-gateway项目
nohup bee run &
tail -f nohup.out
出现端口占用问题
sudo lsof -i :8080
kill 4794
postman接口验证
八.征信功能用户管理功能开发
MySQL配置
使用容器启动
mysql
(对外挂载
3307
端口)
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7
Mysql
配置
使用
navicat
连接
mysql
创建credit数据库并创建user表
Redis安装
以容器方式运行,对外映射
6379
端口
docker run -itd -p 6379:6379 redis
注意:需要开启链码
使用requirements.txt安装依赖,在credit-back-init中
pip install -r requirements.txt
在项目添加config.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_cors import *
import redis
from urllib.parse import quote_plus as urlquote
app = Flask(__name__)
userName = 'root'
password = '123456'
dbHost = '192.168.200.101'
dbPort = 3307
dbName = 'credit'
app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql://{userName}:{urlquote(password)}@{dbHost}:{dbPort}/{dbName}?charset=utf8'
db = SQLAlchemy(app)
CORS(app,resources=r'/*')
redis_service = redis.StrictRedis(host="192.168.200.101",port=6379,db=0)
user.py
from config import db
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String)
password = db.Column(db.String)
def __init__(self,username,password):
self.username = username
self.password = password
app.py
from flask import request, jsonify
import requests
import json
from config import app,db,redis_service
from user import User
import hashlib
import random
invokeURL = "http://192.168.200.101:8080/invoke"
evaluateURL = "http://192.168.200.101:8080/evaluate"
def get_token():
"""
随机生成token
"""
src = ''.join(random.sample('abcdefghijklmnopqrtuvwxyz!@#$%^&*()', 20))
m2 = hashlib.md5()
m2.update(src.encode("utf8"))
return m2.hexdigest()
@app.before_request
def before():
url = request.path
if url == '/login' or url == '/register':
pass
else:
token = request.headers.get('token')
if token is None:
return jsonify({'code': 500, 'data': '用户未登录'})
username = redis_service.get(token)
if username:
pass
else:
return jsonify({'code': 500, 'data': '用户未登录'})
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/createCreditSubject',methods=['POST'])
def creditCreate():
json_data = request.json
payload = json.dumps({
"channelName":"applicationchannel",
"chaincodeName":"credit_chaincode",
"funcName":"createCreditSubject",
"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('/queryCreditSubject',methods=['POST'])
def creditCredit():
json_data = request.json
payload = json.dumps({
"channelName":"applicationchannel",
"chaincodeName":"credit_chaincode",
"funcName":"queryCreditSubject",
"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
})
# @app.route('/createC')
@app.route('/register',methods=['POST'])
def register():
get_json = request.json
username = get_json['username']
password = get_json['password']
get_user = User.query.filter_by(username=username).first()
if get_user is not None:
return jsonify({
'code':500,
'msg':"User exists!"
})
save_user = User(username,password)
db.session.add(save_user)
db.session.commit()
return jsonify({
'code':200,
'msg':"Register Success!"
})
@app.route('/login',methods=['POST'])
def login():
get_json = request.json
username = get_json['username']
password = get_json['password']
get_user = User.query.filter_by(username=username).first()
if get_user is None:
return jsonify({
'code':404,
'msg':"User not exist"
})
if get_user.password == password:
token = get_token()
redis_service.set(token, username)
data = {
'token': token,
'username': username,
}
return jsonify({
'code':200,
'msg': data
})
else:
return jsonify({
'code':500,
'msg': "Password error!"
})
if __name__ == '__main__':
app.run()
register登录测试
login登录测试
过滤器验证
九.前端设置
注意:前端/后端都要开启,需要开启mysql,redis
启动项目,在导航内,点击“征信主体”,点击“创建征信主体”,输入指定内容,有如下显示说明创建成功: