超级账本hyperledger fabric第十集:贷款还款相关链码

  • 编写Trace下的代码,编写好后,拖到对应linux目录

domain.go

package main

//银行、账户、定义交易历史
//定义银行
type Bank struct {
	//名字
	BankName string `json:"BankName"`
	//金额
	Amount int `json:"Amount"`
	//1:贷款   2:还款
	Flag int `json:"Flag"`
	//起始时间
	StartTime string `json:"StartTime"`
	//结束时间
	EndTime string `json:"EndTime"`
}

//定义账户
type Account struct {
	//身份证号
	CardNo string `json:"CardNo"`
	//用户名
	Aname string `json:"Aname"`
	//性别
	Gender string `json:"Gender"`
	//电话
	Mobile string `json:"Mobile"`
	//银行
	Bank Bank `json:"Bank"`
	//交易历史
	Histroys []HistoryItem
}

//定义交易历史
type HistoryItem struct {
	//交易id
	TxID string
	//账户
	Account Account
}

main.go

package main

import (
	"github.com/hyperledger/fabric/core/chaincode/shim"
	"github.com/hyperledger/fabric/protos/peer"
	"encoding/json"
	"fmt"
)

type TraceChaincode struct {
}

//初始化方法
func (t *TraceChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response {
	//初始化测试数据
	initTest(stub)
	return shim.Success(nil)
}

//链码入口invoke
//loan:贷款
//repayment:还款
//initTest:测试初始化
func (t *TraceChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
	//得到方法名和参数
	fun, args := stub.GetFunctionAndParameters()
	//进行判断
	if fun == "loan" {
		//贷款
		return loan(stub, args)
	} else if fun == "repayment" {
		//还款
		return repayment(stub, args)
	} else if fun == "initTest" {
		return initTest(stub)
	} else {
		return shim.Error("方法名错误")
	}
}

//测试方法
func initTest(stub shim.ChaincodeStubInterface) peer.Response {
	bank := Bank{
		BankName: "icbc",
		Amount:   6000,
		//贷款
		Flag:      1,
		StartTime: "2010-01-01",
		EndTime:   "2020-01-01",
	}
	bank1 := Bank{
		BankName: "abc",
		Amount:   1000,
		//还款
		Flag:      2,
		StartTime: "2010-02-01",
		EndTime:   "2020-02-01",
	}
	account := Account{
		CardNo:   "1234",
		Aname:    "jack",
		Gender:   "男",
		Mobile:   "15900000",
		Bank:     bank1,
		Histroys: nil,
	}
	account1 := Account{
		CardNo:   "123444",
		Aname:    "jack2",
		Gender:   "男",
		Mobile:   "1590000000",
		Bank:     bank,
		Histroys: nil,
	}

	//对象序列化,存储
	accBytes, err := json.Marshal(account)
	if err != nil {
		return shim.Error("序列化账户失败")
	}
	accBytes1, err := json.Marshal(account1)
	if err != nil {
		return shim.Error("序列化账户1失败")
	}

	//保存
	err = stub.PutState(account.CardNo, accBytes)
	if err != nil {
		return shim.Error("保存账户失败")
	}
	err = stub.PutState(account.CardNo, accBytes1)
	if err != nil {
		return shim.Error("保存账户1失败")
	}
	return shim.Success(nil)
}

func main() {
	err := shim.Start(new(TraceChaincode))
	if err != nil {
		fmt.Println("启动链码时发生错误")
	}
}

tracecc.go

package main

import (
	"github.com/hyperledger/fabric/core/chaincode/shim"
	"github.com/hyperledger/fabric/protos/peer"
	"strconv"
	"encoding/json"
)

//定义贷款和还款
const (
	Bank_Flag_Loan      = 1
	Bank_Flag_Repayment = 2
)

//贷款
//-c Args:[loan,账户身份证号,银行名字,金额]
func loan(stub shim.ChaincodeStubInterface, args []string) peer.Response {
	//判断参数
	if len(args) != 3 {
		return shim.Error("参数个数错误")
	}
	//判断类型
	v, err := strconv.Atoi(args[2])
	if err != nil {
		return shim.Error("类型错误")
	}

	//组装数据
	bank := Bank{
		BankName:  args[1],
		Amount:    v,
		Flag:      Bank_Flag_Loan,
		StartTime: "2011-01-10",
		EndTime:   "2021-01-09",
	}
	account := Account{
		CardNo: args[0],
		Aname:  "jack",
		Gender: "男",
		Mobile: "159999999",
		Bank:   bank,
	}

	//保存状态
	b := putAccount(stub, account)
	//判断
	if ! b {
		return shim.Error("保存贷款数据失败")
	}
	return shim.Success([]byte("保存贷款数据成功"))
}

//序列化并保存
//参数将要保存的账户传过来,返回布尔
func putAccount(stub shim.ChaincodeStubInterface, account Account) bool {
	//序列化
	accBytes, err := json.Marshal(account)
	if err != nil {
		return false
	}
	//保存数据
	err = stub.PutState(account.CardNo, accBytes)
	if err != nil {
		return false
	}
	return true
}

//还款
//-c Args:[repayment,账户身份证号,银行名字,金额]
func repayment(stub shim.ChaincodeStubInterface, args []string) peer.Response {
	if len(args) != 3 {
		return shim.Error("参数个数错误")
	}
	v, err := strconv.Atoi(args[2])
	if err != nil {
		return shim.Error("指定的还款金额错误")
	}
	//组装数据
	bank := Bank{
		BankName:  args[1],
		Amount:    v,
		Flag:      Bank_Flag_Repayment,
		StartTime: "2011-01-10",
		EndTime:   "2021-01-09",
	}
	account := Account{
		CardNo: args[0],
		Aname:  "jack",
		Gender: "男",
		Mobile: "159999999",
		Bank:   bank,
	}
	b := putAccount(stub, account)
	if !b {
		return shim.Error("存款失败")
	}
	return shim.Success([]byte("存款成功"))
}
  • 保证网络基础OK的情况下,安装链码

peer chaincode install -n trace -v 1.0.0 -l golang -p github.com/chaincode/Trace

  • 实例化链码

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n trace -l golang -v 1.0.0 -c '{"Args":["init"]}'

  • 运行测试

peer chaincode invoke -C mychannel -n trace -c '{"Args":["initTest"]}'

  • 贷款500W

peer chaincode invoke -C mychannel -n trace -c '{"Args":["loan","110229","icbc","5000000"]}'

  • 还款500

peer chaincode invoke -C mychannel -n trace -c '{"Args":["repayment","110229","icbc","500"]}'

扫描二维码关注公众号,回复: 4004569 查看本文章

猜你喜欢

转载自blog.csdn.net/super_lixiang/article/details/83896816