《HyperLedger Fabric 实战》—— 十、项目演练 – 反欺诈系统

注意点

1、用户唯一ID应该是姓名与身份证号组合后的MD5,这样可以防止加盟用户仅通过机器生成的大量身份证号来恶意刷区块链平台;

  2、合约不应以用户为核心,而应以用户及小贷公司的合同作为合约核心,以防止加盟方自身的Bug等问题,向联盟平台写入大量无法溯源的用户数据,而导致错误;

编写贷款合约

finance/bean/compact.go

package beanimport ("github.com/hyperledger/fabric/core/chaincode/shim""fmt""time""encoding/json"
)// 合同全集详情
// 本条记录主键key由成员ID和合同ID联合组成,且备唯一性
type Compact struct {Timestamp        int64  `json:"timestamp"`        // 本条记录创建时间戳Uid              string `json:"uid"`              // 用户唯一ID(32位MD5值)LoanAmount       string `json:"loanAmount"`       // 用户贷款金额ApplyDate        string `json:"applyDate"`        // 申请日期CompactStartDate string `json:"compactStartDate"` // 贷款开始日期CompactEndDate   string `json:"compactEndDate"`   // 贷款计划终止日期RealEndDate      string `json:"realEndDate"`      // 贷款实际终止日期
}// 贷款操作
// args: UID、贷款金额、申请日期、贷款开始日期、贷款计划终止日期、合同ID
// name: 成员名称
func Loan(stub shim.ChaincodeStubInterface, args []string, name string) error {if len(args) != 6 {return fmt.Errorf("Parameter count error while Loan, count must 5")}if len(args[0]) != 32 {return fmt.Errorf("Parameter uid length error while Loan, 32 is right")}if len(args[2]) != 14 {return fmt.Errorf("Parameter ApplyDate length error while Loan, 14 is right")}if len(args[3]) != 14 {return fmt.Errorf("Parameter CompactStartDate lengh error while Loan, 14 is right")}if len(args[4]) != 24 {return fmt.Errorf("Parameter CompactEndDate length error while Loan, 14 is right")}var compact Compactcompact.Uid = args[0]compact.LoanAmount = args[1]compact.ApplyDate = args[2]compact.CompactStartDate = args[3]compact.CompactEndDate = args[4]compact.Timestamp = time.Now().Unix()compactJsonBytes, err := json.Marshal(&compact) // Json序列化if err != nil {return fmt.Errorf("Json serialize Compact fail while Loan, compact id = " + args[5])}// 生成合同联合主键key, err := stub.CreateCompositeKey("Compact", []string{name, args[5]})if err != nil {return fmt.Errorf("Failed to CreateCompositeKey while Loan")}// 保存合同信息err = stub.PutState(key, compactJsonBytes)if err != nil {return fmt.Errorf("Failed to PutState while Loan, compact id = " + args[5])}return nil
}

finance/utils/utils.go

package utilsimport ("github.com/hyperledger/fabric/core/chaincode/shim""strings""bytes""fmt""encoding/pem""crypto/x509"
)// 获取当前操作智能合约成员具体名称,如a1aw28
func GetCreatorName(stub shim.ChaincodeStubInterface) (string, error) {name, err := GetCreator(stub) // 获取当前智能合约操作成员名称if err != nil {return "", err}// 格式化当前智能合约操作成员名称memberName := name[(strings.Index(name, "@") + 1):strings.LastIndex(name, ".example.com")]return memberName, nil;
}// 获取操作成员
func GetCreator(stub shim.ChaincodeStubInterface) (string, error) {creatorByte, _ := stub.GetCreator()certStart := bytes.IndexAny(creatorByte, "-----BEGIN")if certStart == -1 {fmt.Errorf("No certificate found")}certText := creatorByte[certStart:]bl, _ := pem.Decode(certText)if bl == nil {fmt.Errorf("Could not decode the PEM structure")}cert, err := x509.ParseCertificate(bl.Bytes)if err != nil {fmt.Errorf("ParseCertificate failed")}uname := cert.Subject.CommonNamereturn uname, nil
}

finance/finance.go

package mainimport ("github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperledger/fabric/protos/peer""fmt""github.com/hyperledger/fabric/examples/chaincode/go/finance/bean""github.com/hyperledger/fabric/examples/chaincode/go/finance/utils"
)type Finance struct {
}func (t *Finance) Init(stub shim.ChaincodeStubInterface) peer.Response {args := stub.GetStringArgs()if len(args) != 0 {return shim.Error("Parameter error while Init")}return shim.Success(nil)
}func (t *Finance) Invoke(stub shim.ChaincodeStubInterface) peer.Response {fn, args := stub.GetFunctionAndParameters()switch fn {case "loan": // 记录贷款数据return loan(stub, args)default:return shim.Error("Unknown func type while Invoke, please check")}
}// 记录贷款数据
func loan(stub shim.ChaincodeStubInterface, args []string) peer.Response {name, err := utils.GetCreatorName(stub)if err != nil {return shim.Error(err.Error())}err = bean.Loan(stub, args, name)if err != nil {return shim.Error(err.Error())}return shim.Success([]byte("记录贷款数据成功"))
}func main() {if err := shim.Start(new(Finance)); err != nil {fmt.Printf("Chaincode startup error: %s", err)}
}

上传合约

上传整个 finance 包到 peer 节点服务器的 aberic/chaincode/go 目录下。

安装 & 实例化

peer chaincode install -n finance -p github.com/hyperledger/fabric/aberic/chaincode/go/finance -v 1.0
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n finance -c '{"Args":[]}' -P "OR ('Org1MSP.member', 'Org2MSP.member')" -v 1.0

升级合约

这一步非必须,笔者是因为第一版合约开发有问题,因此需要升级。

升级需先安装

peer chaincode install -n finance -p github.com/hyperledger/fabric/aberic/chaincode/go/finance -v 1.1
peer chaincode upgrade -C mychannel -n finance -p github.com/hyperledger/fabric/aberic/chaincode/go/finance -v 1.1 -c '{"Args":[]}'

执行贷款操作

peer chaincode invoke -C mychannel -n finance -v 1.0 -c '{"Args":["loan", "4e4d6c332b6fe62a63afe56171fd3725", "200000", "20180420080812", "20180421080812", "20190421080812", "000001"]}'
peer chaincode invoke -C mychannel -n finance -v 1.0 -c '{"Args":["loan", "4e4d6c332b6fe62a63afe56171fd3725", "200000", "20180420080812", "20180421080812", "20190421080812", "000002"]}'
peer chaincode invoke -C mychannel -n finance -v 1.0 -c '{"Args":["loan", "4e4d6c332b6fe62a63afe56171fd3725", "200000", "20180420080812", "20180421080812", "20190421080812", "000003"]}'

CouchDB 索引 & 查询

浏览器打开地址:http://192.168.24.251:5984/_utils/#/database/mychannel_finance/_index

{"index": {"fields": ["uid"]},"name": "indexUid","ddoc": "indexUidDoc","type": "json"
}

CouchDB -> Run A Query with Mango ->

{"selector": {"uid": "4e4d6c332b6fe62a63afe56171fd3725"}
}

Post 方式查询

Postman 发送上面查询 json 到 http://192.168.24.251:5984/mychannel_finance/_find

案例强调

本案例只是演练需求落地,但检索方面不能以这样的方式上生产环境,必须为所有加盟方提供开源可见的查询方法,并在智能合约中体现。

《HyperLedger Fabric 实战》—— 十、项目演练 -- 反欺诈系统相关推荐

  1. Hyperledger Fabric 实战(十二): Fabric 源码本地调试

    借助开发网络调试 fabric 源码本地调试 准备工作 IDE Goland Go 1.9.7 fabric-samples 模块 chaincode-docker-devmode fabric 源码 ...

  2. hyperledger fabric 实战开发——水产品溯源交易平台(二)

    文章目录 前言 一.技术学习 1.Hyperledger fabric 1.1 流程 1.2 配置 1.3 范例解析并自写 1.3 算法实现 二.Web编写 前言 hyperledger fabric ...

  3. 网易双11“超级工程”:反欺诈系统应用实践

    每年双十一,不仅是剁手族的狂欢节,更是各大电商技术团队技术水平与技术创新实践检验的舞台,不断创新高的销售额.交易峰值.支付峰值,这些惊人数字的背后都离不开强力的技术支撑.IT168希望通过技术报道的形 ...

  4. 基于 Flink 的超大规模在线实时反欺诈系统的建设与实践

    在大数据时代,金融科技公司通常借助消费数据来综合评估用户的信用和还款能力.这个过程中,某些中介机构会搜集大量的号并进行"养号"工作,即在一年周期里让这些号形成正常的消费.通讯记录, ...

  5. 基于Flink的超大规模在线实时反欺诈系统的建设与实践

    作者:关贺宇 在大数据时代,金融科技公司通常借助消费数据来综合评估用户的信用和还款能力.这个过程中,某些中介机构会搜集大量的号并进行"养号"工作,即在一年周期里让这些号形成正常的消 ...

  6. 兴业银行与第四范式开启AI平台加速模式 毫秒级信用卡反欺诈系统上线

    近日,基于第四范式为兴业银行打造的低门槛.自动化的人工智能平台,兴业银行信用卡中心推出了毫秒级智能交易反欺诈系统,实现了对信用卡欺诈风险自动化.智能化.精确化的甄别与管控,为信用卡用户提供最安全.可信 ...

  7. 谷歌将反欺诈系统绕过纳入漏洞奖励计划

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 近日,谷歌宣布称其漏洞奖励计划 (VRP) 将绕过该公司的滥用.欺诈和垃圾信息系统的方法也纳入其中. 谷歌表示,"有效报告包 ...

  8. hyperledger fabric 实战开发——水产品溯源交易平台(一)

    文章目录 前言 环境准备 水产品溯源交易平台设计 实现步骤 1. 模板获取 2. 模板修改 虚拟机优化(根据个人喜好选择) 前言 在万字解析--区块链hyperledger fabric2.2部署实战 ...

  9. 浅试Hyperledger Fabric go 小项目

    浅试Hyperledger Fabric ,go 小项目 本文简述 第一次,go项目中的小tips Linux中使用Hyperledger Fabric官方test-network运行自己CC 1.创 ...

最新文章

  1. c实现面向对象编程(3)
  2. NBT:线虫的工程细菌共生体提高对西方玉米根虫的生防潜力
  3. 判断objcet是否是map类型_57、递归+树的深度+map-二叉搜索树的平衡性
  4. python 线程池
  5. ffmpeg命令行map参数的使用
  6. 成功解决Windows无法启动服务NVIDIA Dispaly Container LS服务(位于本地计算机上),错误2:系统找不到指定的文件
  7. linux的基本命令--常用
  8. 简单易用的库存管理软件、进销存软件
  9. github image标签转markdown工具源代码
  10. 批处理ping指定ip列表
  11. 清除nginx服务器网站缓存数据
  12. windows快速清理垃圾文件bat
  13. SQL的LEN函数用法及实例
  14. 友情检测北京某大学网站
  15. 纬湃科技助力打造气候中和汽车;铁姆肯收购美国滚子轴承公司 | 美通企业日报...
  16. 基于PaddleOCR银行卡识别实现(一)
  17. 搞个服务器安装黑群晖系统,牛人闲置电脑大改造!超低成本组建家用黑群晖NAS...
  18. fusion 360调整字体大小
  19. Spring Data JPA 之 @Entity 的常用注解
  20. 阿里云专有网络VPC学习笔记

热门文章

  1. qgis 将县区的数据转成市区的边界数据
  2. HIT计算机系统大作业2022
  3. Flink电商实时数仓项目03-DWM层
  4. 表情包壁纸独立后台美化二开版本新增加神器功能微信小程序源码下载+教程自动采集
  5. 设备、设备节点和设备驱动详解
  6. 2016:iOS开发趋势思考--写的有趣~
  7. AODV协议的NS2仿真
  8. JAVA之微信支付渠道枚举WechatPayChannelEnum
  9. layuit 框架_layui前端框架
  10. 采购系统平台在选型中需要考虑那几点?