现今互联网金融公司创办的P2P贷款,如现金贷等大多属于信用贷,其合作方式往往是联合放贷,由于每天要涉及利息、利率、本金的清算和结算工作,非常繁琐且信息不透明,导致了合作行和机构之间效率低下等问题。基于此,本文通过对信用贷P2P互联网金融模式的分析,提出了一个基于区块链的实现,旨在探索金融场景下后台清结算的区块链实现的可行性。
而清结算则是个较大的话题,涉及到支付清结算,银行体系内清结算,证券的清结算,信用贷公司业务间清结算等,需要较多的会计知识进行支撑。清结算主要有如下两个主要的概念:
清算 – 算清楚什么时间该给谁多少钱。
结算 – 资金在不同账户和机构间的转移。
目前传统方式的主要问题还是信息不透明带来的问题,比如合作行之间无法实时了解备付金账户信息、贷款借还明细与记账差异因素等,只能通过日终对账文件获取信息,增加了合作双方的流动性管理难度;另一方面需要各自开发对账系统,缺乏统一的系统间账务信息,这些都增加了银行和机构间合作的复杂性。一般都需要T+N天的资金到账。
相对于传统的集中式数据库,区块链通过加密验证交易各方身份来确认真实性,通过多个节点保存及同步分布式数据库减少人工对账,保证其安全、透明和高效运行。区块链技术通过构建分布式的结构体系和参与者的共识机制,形成由不同节点共同参与的分布式数据库系统,实现了不同节点之间建立信任、获取权益的数学算法。所有约定的参与者均参与数据的记录和验证,通过分布式传播发送给各个节点,即使部分节点失效,也不会影响整个数据库的完整性和信息更新。
利用区块链技术完成对同一笔贷款的交易变更形成唯一的不可逆的记录。使得多个利益方可以共享同一个账本从而减少中间对账等诸多环节。在后台清结算使用区块链技术进行账本共享,提高清结算效率。
目前相关技术包括分布式账本技术在金融行业的研发仍处于概念验证阶段,市场主体采取不同策略,推动技术在支付、清结算领域的应用和普及。金融机构或者技术企业独立研发,比如以加密技术发行证券并在共享平台进行安全交易等技术解决方案。技术公司和金融机构合作,采取优势互补策略,共同推动技术应用研发。还有区块链即服务(BaaS)模式,由技术公司提供基于云端的底层计算基础设施以及代码库,让其他企业以更低成本和更简单的方式部署和测试分布式账本技术系统,比如Oracle 的BCS(Blockchain Cloud Service)。
与传统应用相比,区块链应用最不一样是它把数据保存在账本中。通过智能合约(智能合约是一段代码,它实现类似传统应用中的业务逻辑层和数据访问层之间的程序控制)对账本进行读写操作。而账本是一个区块文件和一个Key-Value的状态库,区块以追加的方式写入,不可更改。下图为Hyperledger Fabric中的账本逻辑示意图:

部署方式上,传统应用一般都是通过中央数据库进行数据存储,数据统一性,一致性较高;而区块链应用是基于分布式的账本存储数据(部署在每一个节点上),其存储效率目前还没有传统数据高。
当我们申请完成一笔信用贷时,一般贷款的主流程如下:

1. 用户通过第三方平台(渠道)申请贷款,获得一定额度(通过大数据计算)提交相关信息。
一般收集信息包括;银行卡号,银行名称,注册手机号,姓名,身份证号等等。
2. 贷款机构信用评估。
通过第三方渠道过来的相关信息做风险控制,给用户计算还款时间表
3. 通知银行放款。
银行放款涉及资金流,检查贷款方账户余额,满足条件进行自动划拨。
4. 用户银行账户收款。
用户银行收到相关银行的转账请求,记录用户账户的资金余额。
5. 贷款机构银行和用户银行的协议。
根据清结算出的用户还款时间表,进行定期的扣款操作并记录相关结果。
其主要参与方如下所述:
1. 放款银行,和贷款机构银行等对贷款进行清结算完成资金划拨等。
2. 第三方平台前端,作为渠道端,管理和控制贷款入口,以及集成支付等功能,对贷款进行数据流统计。
3. 用户,贷款需求者。
4. 贷款机构,放贷方,现实中,可能是多方组成,比如联合放贷等。
5. 收款银行,用户的指定银行及其账户,同时用户还款操作等,需要和其他机构进行协议资金划拨。
以上可以看出信用贷主要涉及到了贷款申请,贷款审核,贷款查询等各项操作。所以基于以上需求,本文设计实现了一个信用贷的区块链实现方案。
我们利用Oracle Blockchain Cloud Service (基于Hyperledger Fabric) 的应用开发模型来实现清结算的应用场景。我们将基于区块链的清结算进行分层设计,包括底层平台、智能合约、业务层和应用层。如下图所示。

每个层的主要功能如下:
a. 区块链底层平台:提供分布式账本的维护、状态数据库维护、智能合约的全生命周期管理等区块链功能,实现数据的不可篡改和智能合约的业务逻辑。基于Oracle BCS搭建区块链网络以后,默认提供了这部分功能。另外可以通过CA提供成员注册和注销等功能。
b. 智能合约:智能合约通过链码来实现,包括贷款申请、贷款批准、贷款拒绝、贷款额度等链码调用功能,链码查询包括查询贷款人相关贷款、查询待批准贷款、根据批次号查询相应贷款等。其他功能(比如贷款提前还款等)都可以在智能合约里实现,感兴趣的朋友可以继续完善。
c. 业务层:业务层是应用程序的后端服务,给Web应用提供RESTful接口,处理前端的业务请求。后端服务的基本功能包括用户管理和贷款管理等。可以通过Oracle IDCS等进行集成和实现。业务层也可以和其他的业务系统进行交互。
应用层:Web应用可以采用Oracle JET的开源框架开发相应的前端页面和APP应用,提供用户交互的操作界面,包括用户操作的功能和业务操作的功能。
我们来看一下链码设计的数据模型,包括贷款数据结构和贷款状态定义。基于简化的模型来看一下相关的数据结构。
简化的贷款数据结构,贷款信息包括贷款基本信息、收款方信息、付款方信息、贷款公司信息等,数据结构定义如下:
typeloan struct {
ObjectType string`json:"docType"`
Batch_id string `json:"batch_id"`
loan_sku string `json:"loan_sku"`
loan_id string `json:"package_id"`
User_name string `json:"User_name"`
User_address string `json:"User_address"`
User_phone string `json:"User_phone"`
Submit_date string `json:"Submit_date"`
Leading_sum string `json:"Leading_sum"`
BankB_name string `json:"BankB_name"`
BankB_account string`json:"BankB_account"`
BankB_phone string `json:"BankB_phone"`
BankA_name string `json:"BankA_name"`
BankA_account string`json:"BankA_account"`
BankA_phone string `json:"BankA_phone"`
Permit_date string `json:"Permit_date"`
Expire_date string `json:"Expire_date"`
Loan_status string `json:"Loan_status"`
}
其贷款状态模型如下表所示:
贷款状态 | 状态说明 |
已申请 | 用户提交申请 |
还款中 | 批准后贷款进入还款状态 |
被拒绝 | 贷款被拒绝 |
已结束 | 还款完毕 |
逾期 | 款项超期 |
应用程序实现分为前端Web应用和后端。本文主要介绍后端相关的服务实现。前端可以根据需要进行任意调整。
应用程序的前端实现和传统方式没有区别。读者可以自行设计需要的前端应用程序和逻辑,这里采用了Oracle开源框架JET实现了前端页面。JET是一套JS框架,可以快速生成H5页面。

后端服务给Web应用提供的是RESTful接口,全部请求都是POST请求。Content-Type是”application/json”。
所有操作都需要先登录并获取Token,作为下一次操作的凭证。比如用户登陆接口一般为http://ip:port/login,其中,ip和port是Web应用的地址。这些参数都需要根据实际的部署做修改。
新贷款需要通过贷款申请接口进行初始化以及发布到区块链网络上,发布成功后,状态为“已申请”。贷款操作接口的URL都是相同的: http://ip.port/channels/mychannel/chaincodes/mycc/invoke,其中ip和port都是Web应用的地址,mychannel是通道名称,mycc是链码的名称,这些参数需要依照实际的部署做修改。由于我们建立在Oracle BCS上,Oracle对abric进行了封装,我们的接口将会类似为"http://localhost:3001/bcsgw/rest/v1/transaction/invocation。
贷款批准接口输入的参数信息如下:
{
batch_id := args[0]
BankA_name := args[1]
BankA_account := args[2]
Permit_date := args[3]
Expire_date := args[4]
Loan_status := args[5]
}
其中,程序逻辑是对相关批次的贷款进行审核,将结果写入到区块链中。
贷款查询接口可以根据批次号查询,根据用户名查询,根据日期查询等等方式,由于Fabric提供了状态数据库,所以查询效率也是很高的。不用担心遍历区块链的时间消耗。
比如queryByBatchid(), queryByUsername(), queryByDate()等。
最终我们将应用部署到Oracle BCS上,实现的部署架构如下所示:

前端JET中通过REST调用后端部署在Oracle BCS上面的智能合约。智能合约采用Go语言开发,部署在Oracle BCS之上。
以上是对信用贷基于甲骨文区块链云服务的一个实现,包括了贷款申请,贷款审核,贷款查询等各种操作,大家可以在此基础上进行扩展,完成一个实际应用的系统。总之,利用区块链的数据不可篡改和数据实时同步的特点,很适合清结算类的应用,如上面介绍的信用贷,其他的如证券行业清结算,支付清结算等等。
文末也附上甲骨文开发者社区精心制作的区块链方面的干货文章,供大家参考。

作者简介
曹彬峰,甲骨文PaaS专家团队资深咨询顾问,专注于甲骨文PaaS云平台及区块链、人工智能领域,具有15年的IT行业从业经验,擅长互联网电子商务,Fintech方向的系统架构和实现。您可以通过binfeng.cao@oracle.com与他联系。
了解更多,敬请关注甲骨文开发者社区......






