├── Gopkg.lock ├── Gopkg.toml ├── Makefile ├── README.md ├── blockchain ├── .idea │ ├── blockchain.iml │ ├── modules.xml │ └── workspace.xml └── startInit.go ├── chaincode ├── billcc.go ├── endorserCC.go ├── main.go ├── structure.go └── utils.go ├── config.yaml ├── fixtures ├── artifacts │ ├── .gitkeep │ ├── Org1MSPanchors.tx │ ├── Org2MSPanchors.tx │ ├── channel.tx │ └── genesis.block ├── crypto-config │ ├── ordererOrganizations │ │ └── example.com │ │ │ ├── ca │ │ │ ├── 00f3d3f738be05a8dff0b1c76e49e642141165d3cc650596e95ff926a29ac22d_sk │ │ │ └── ca.example.com-cert.pem │ │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.example.com-cert.pem │ │ │ └── tlscacerts │ │ │ │ └── tlsca.example.com-cert.pem │ │ │ ├── orderers │ │ │ └── orderer.example.com │ │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.example.com-cert.pem │ │ │ │ ├── keystore │ │ │ │ │ └── c12bedd969be10bf8297668c470a02602939bb185635f0cebc31d826cb5d31d5_sk │ │ │ │ ├── signcerts │ │ │ │ │ └── orderer.example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.example.com-cert.pem │ │ │ │ └── tls │ │ │ │ ├── ca.crt │ │ │ │ ├── server.crt │ │ │ │ └── server.key │ │ │ ├── tlsca │ │ │ ├── 66e079657a3813fdf9b3ecbd7bd17df7eb0ac23e025fd88cd50db1e091e2d3ec_sk │ │ │ └── tlsca.example.com-cert.pem │ │ │ └── users │ │ │ └── Admin@example.com │ │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── 3e150e050d7ce262ecd63cb55ff498836cd5754cac8378e14be9e9502ae85ec2_sk │ │ │ ├── signcerts │ │ │ │ └── Admin@example.com-cert.pem │ │ │ └── tlscacerts │ │ │ │ └── tlsca.example.com-cert.pem │ │ │ └── tls │ │ │ ├── ca.crt │ │ │ ├── client.crt │ │ │ └── client.key │ └── peerOrganizations │ │ ├── org1.example.com │ │ ├── ca │ │ │ ├── 471ebb31833db2522c026a22cf11f556854dd926880010123990cfabe7eef4e5_sk │ │ │ └── ca.org1.example.com-cert.pem │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ ├── config.yaml │ │ │ └── tlscacerts │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ ├── peers │ │ │ ├── peer0.org1.example.com │ │ │ │ ├── msp │ │ │ │ │ ├── admincerts │ │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ │ ├── cacerts │ │ │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ │ │ ├── config.yaml │ │ │ │ │ ├── keystore │ │ │ │ │ │ └── 52a4a4cec4c8b3cce027018f33a3361e34de6edc143a804609df36def9e80004_sk │ │ │ │ │ ├── signcerts │ │ │ │ │ │ └── peer0.org1.example.com-cert.pem │ │ │ │ │ └── tlscacerts │ │ │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ │ └── tls │ │ │ │ │ ├── ca.crt │ │ │ │ │ ├── server.crt │ │ │ │ │ └── server.key │ │ │ └── peer1.org1.example.com │ │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ │ ├── config.yaml │ │ │ │ ├── keystore │ │ │ │ │ └── 2e4b52fd060cbb1e2d478483c556dbfcb31ba765ef1f1436af6b0a27d758b56c_sk │ │ │ │ ├── signcerts │ │ │ │ │ └── peer1.org1.example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ │ └── tls │ │ │ │ ├── ca.crt │ │ │ │ ├── server.crt │ │ │ │ └── server.key │ │ ├── tlsca │ │ │ ├── 69ff3a2c34802277140cc97e76c3cca7d68e2c67d086f88d9bfced05a6244145_sk │ │ │ └── tlsca.org1.example.com-cert.pem │ │ └── users │ │ │ ├── Admin@org1.example.com │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ │ ├── keystore │ │ │ │ │ └── fca80a3ce2abfd36a5a427ce7bc94d8bf91f505864bb04cf3c402e2272962c40_sk │ │ │ │ ├── signcerts │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ └── tls │ │ │ │ ├── ca.crt │ │ │ │ ├── client.crt │ │ │ │ └── client.key │ │ │ └── User1@org1.example.com │ │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── User1@org1.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── 55e4e407eff74668c0e15d0119ba4af4ef5779d8a01fbbe2eae7760df11d968a_sk │ │ │ ├── signcerts │ │ │ │ └── User1@org1.example.com-cert.pem │ │ │ └── tlscacerts │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ └── tls │ │ │ ├── ca.crt │ │ │ ├── client.crt │ │ │ └── client.key │ │ └── org2.example.com │ │ ├── ca │ │ ├── 351ff344270e862be47d4e0442c96ac67ae466898fccbad8b9eba25d8a604cf2_sk │ │ └── ca.org2.example.com-cert.pem │ │ ├── msp │ │ ├── admincerts │ │ │ └── Admin@org2.example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.org2.example.com-cert.pem │ │ ├── config.yaml │ │ └── tlscacerts │ │ │ └── tlsca.org2.example.com-cert.pem │ │ ├── peers │ │ ├── peer0.org2.example.com │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@org2.example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.org2.example.com-cert.pem │ │ │ │ ├── config.yaml │ │ │ │ ├── keystore │ │ │ │ │ └── 7edf6b8ad4fb7d4c8f93a86441a8301f247db5d9bf2bbae967bc5f36d714e547_sk │ │ │ │ ├── signcerts │ │ │ │ │ └── peer0.org2.example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.org2.example.com-cert.pem │ │ │ └── tls │ │ │ │ ├── ca.crt │ │ │ │ ├── server.crt │ │ │ │ └── server.key │ │ └── peer1.org2.example.com │ │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@org2.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org2.example.com-cert.pem │ │ │ ├── config.yaml │ │ │ ├── keystore │ │ │ │ └── 1ef296b59a24b30ebd722bfa8eac0752929c597be002f77cabf70effbdb72e7e_sk │ │ │ ├── signcerts │ │ │ │ └── peer1.org2.example.com-cert.pem │ │ │ └── tlscacerts │ │ │ │ └── tlsca.org2.example.com-cert.pem │ │ │ └── tls │ │ │ ├── ca.crt │ │ │ ├── server.crt │ │ │ └── server.key │ │ ├── tlsca │ │ ├── 7a3bf9697cd011c552e49a43c13141ba4546533b8a96a15b8eaa3c7cca6ad0e7_sk │ │ └── tlsca.org2.example.com-cert.pem │ │ └── users │ │ ├── Admin@org2.example.com │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@org2.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org2.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── c8f1ee67181f4dbbecc065de8c470444f3f99a5d673f87fc79335bafab9caa1f_sk │ │ │ ├── signcerts │ │ │ │ └── Admin@org2.example.com-cert.pem │ │ │ └── tlscacerts │ │ │ │ └── tlsca.org2.example.com-cert.pem │ │ └── tls │ │ │ ├── ca.crt │ │ │ ├── client.crt │ │ │ └── client.key │ │ └── User1@org2.example.com │ │ ├── msp │ │ ├── admincerts │ │ │ └── User1@org2.example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.org2.example.com-cert.pem │ │ ├── keystore │ │ │ └── 89c83d48f707e3487762ec1f9f297558ee61e31c63f2f8aac4bda3df6662230e_sk │ │ ├── signcerts │ │ │ └── User1@org2.example.com-cert.pem │ │ └── tlscacerts │ │ │ └── tlsca.org2.example.com-cert.pem │ │ └── tls │ │ ├── ca.crt │ │ ├── client.crt │ │ └── client.key └── docker-compose.yml ├── main.go ├── service ├── billService.go ├── endorseService.go └── structure.go └── web ├── app.go ├── controller ├── controllerHandler.go ├── controllerResponse.go └── domain.go ├── static ├── .DS_Store ├── css │ ├── billCommon.css │ ├── login.css │ └── popout.css ├── images │ ├── jt.png │ ├── jt2.png │ └── menu.png └── js │ ├── billCommon.js │ ├── jquery.min.js │ ├── login.js │ └── popout.js └── tpl ├── billInfo.html ├── bills.html ├── issue.html ├── login.html ├── waitBillInfo.html └── waitBills.html /Gopkg.toml: -------------------------------------------------------------------------------- 1 | [[constraint]] 2 | name = "github.com/hyperledger/fabric" 3 | revision = "014d6befcf67f3787bb3d67ff34e1a98dc6aec5f" 4 | 5 | [[constraint]] 6 | name = "github.com/hyperledger/fabric-sdk-go" 7 | revision = "614551a752802488988921a730b172dada7def1d" 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all dev clean build env-up env-down run 2 | 3 | all: clean build env-up run 4 | 5 | dev: build run 6 | 7 | ##### BUILD 8 | build: 9 | @echo "Build ..." 10 | @dep ensure 11 | @go build 12 | @echo "Build done" 13 | 14 | ##### ENV 15 | env-up: 16 | @echo "Start environment ..." 17 | @cd fixtures && docker-compose up --force-recreate -d 18 | @echo "Sleep 15 seconds in order to let the environment setup correctly" 19 | @sleep 15 20 | @echo "Environment up" 21 | 22 | env-down: 23 | @echo "Stop environment ..." 24 | @cd fixtures && docker-compose down 25 | @echo "Environment down" 26 | 27 | ##### RUN 28 | run: 29 | @echo "Start app ..." 30 | @./bill 31 | 32 | ##### CLEAN 33 | clean: env-down 34 | @echo "Clean up ..." 35 | @rm -rf /tmp/bill-* bill 36 | @docker rm -f -v `docker ps -a --no-trunc | grep "bill" | cut -d ' ' -f 1` 2>/dev/null || true 37 | @docker rmi `docker images --no-trunc | grep "bill" | cut -d ' ' -f 1` 2>/dev/null || true 38 | @echo "Clean up done" 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 银行区块链票据项目 2 | 3 | 博客:www.chenjianhui.org 4 | 5 | 备注:如有错误,请指正,不断更新迭代 6 | 7 | 一 票据业务 8 | 9 | 票据业务是指信用机构,按照一定的方式和要求为票据的设立、转移和偿付而进行的日常营业性的业务活动。主要包括票据的承兑、贴现和票据抵押放款业务。 票据业务是银行一项传统的资产业务。银行的票据业务是建立在商业信用基础之上的。是银行信用和商业信用的结合。开办票据业务,可以促进商业信用的票据化,加强对商业信用的管理,为促进商品生产和商品流通、搞活经济创造条件 10 | 11 | 二 办理票据业务的流程 12 | 13 | 1、申请人向银行提出票据融资书面申请,同时提交申请相关的资料; 14 | 15 | 2、银行审核申请人所提交的资料,同时对申请人的个人资产状况、信用状况进行了解调查; 16 | 17 | 3、资料审核通过,银行与申请人商议融资内容,签订借款合同; 18 | 19 | 4、借款人办理相应保险等手续,手续办理完毕,银行发放资金; 20 | 21 | 5、借款人按照合同约定内容还款。 22 | 23 | 三 专业术语 24 | 25 | - 持票人:持票人是除出票人以外的持有票据的人,也就是票据的收款人。 26 | - 签发人:签发人是报送上级机关的公文中,发文机关的负责人签署姓名。 27 | - 承兑人:承兑人是指承诺在汇票到期日向持票人支付汇票金额的法人、其它组织或者个人。 28 | - 出票人:出票人是开立票据并将其交付给他人的法人、其它组织或者个人。 29 | - 付款人:付款人是出票人命令支付票据款项的人,付款人只有在票据上签章,确认付款责任(如承兑)以后,他才成为票据的债务人。 30 | - 保证人:保证人是指具有代为清偿票据债务能力的法人、其他组织或者个人。是非票据债务人对于出票人、背书人、承兑人作成保证行为的人。 31 | - 收款人:收款人是收取票据款项的人。是票据的主债权人。收款人有权要求付款人付款,如果被拒绝付款,有权向出票人以及票据上的其它债务人追索票款。 32 | - 背书人:背书人是指收款人或者持票人在接受票据后,经过背书,再将票据转让给他人的法人、其它组织或者个人。 33 | - 背书行为:背书是票据持有人在票据背面批注签章,将票据转让给他人的行为,背书也包括两个内容,即在票据后面背书,和将已背书的票据交付给被背书人。背书人是被背书人的债务人,被背书人是背书人的债权人。 34 | 35 | 四 为什么要做基于区块链技术的数字票据? 36 | 37 | 票据现有的形式有纸质票据和电子票据。纸质票据是传统的票据形式,需要在票据上字或者加盖有效印章才能生效。电子票据是基于央行牵头开发完成的电子商业汇票系统(ECDS),银行或者企业通过直连或者网银接人,所有的票据承兑、交易等都需要通过ECDS 才能完成,是典型的中心化系统。 38 | 39 | 纸质票据和电子票据都有一些尚未解决的痛点。 40 | 41 | - 票据真实性问题: 票据的贸易背景信息可能并不真实存在或者存在偏差,票据信息也容易被克隆和伪造,市场中存在的假票很难识别。 42 | - 票据安全性问题: 纸质票据在携带过程有遗失或者损坏的风险,也存在打款和背书不同步的情况。 43 | - 票据信用风险问题: 可能存在汇票到期后承兑人未及时将相关款项划入持票人账户的情况。 44 | 45 | - 票据处理效率问题: 在途时间会造成资金结算延后,监管和审计成本也会很高。 46 | - 票据违规交易问题: 票据交易主体或者中介机构可能存在一票多卖、清单交易、出租账户等违法违规行为。 47 | - 48 | 49 | 借助区块链技术,可以在实现原有的票据业务的基础上解决现有的一些痛点。 50 | 51 | a. 在不依赖可信第三方平台的基础上实现票据信息的真实性。 52 | 53 | 纸质票据和电子票据的交易双方都依赖可信的第三方平台或者票据实物验证票据的真伪。但是在实际的操作过程中,票据的真实信息是很难确认的。超级账本的成员管理利用底层的安全机制确保上链信息的真实性,基于记录到分布式共享账本中的票据信息,杜绝假票、克隆票、变造票等伪假票据。 54 | 55 | b. 分布式共享账本避免违规交易 56 | 57 | 纸质票据中的一票多卖和电子票据中打款背书不同步等违规交易存在的原因是信息的不同步。基于区块链技术的数字票据利用分布式共享账本记录的信息具有不可篡改性,一旦交易完成并记录到账本中,就不会存在纸质票据和电子票据中的数据丢失和信息不同步的问题,交易双方都没有机会进行违规交易。 58 | 59 | c. 智能合约实现票据业务自动处理 60 | 61 | 智能合约功能可以实现复杂的业务逻辑,比如业务操作前可以基于不可篡改的账本信息搜集和评估参与者的信用,拒绝信用评级低的交易方提交的请求,业务操作后可以自动实现转账等功能,解决不同操作导致的信息不同步问题。 62 | 63 | d. 数字票据提升票据处理效率 64 | 65 | 分布式共享账本在区块链网络中有多份数据拷贝,交易结束后就完成了对账,利用本地的账本能快速检索信息,做更多的业务处理,提升票据处理的效率。 66 | 67 | e. 区块链技术提高票据安全性 68 | 69 | 票据安全性包括物理安全、数据安全、网络安全等多个方面。纸质票据在携带过程有遗失或者损坏的风险,属于物理安全范畴。纸质票据和电子票据都可能存在数据被篡改的可能性,属于数据安全范畴。传输过程中被中间人攻击等属于网络安全范畴。基于区块链技术的数字票据综合了多种底层技术,分布式账本解决了物理安全和数据安全的问题,数字签名和安全传输解决网络安全的问题。 70 | 71 | 五 票据背书需求分析 72 | 73 | 票据背书的应用开发实例会对票据的应用场最进行简化,我们实现的业务逻辑包括票据发布、票据背书、票据签收,票据拒收、票据查询等操作,实际的票据业务需要根据实际需求做调整。 74 | 75 | 1.票据发布 76 | 77 | 票据发布操作生成一个票据,包括如下5类信息。 78 | 79 | a. 票据基本信息 80 | 81 | - 票据号码 82 | - 票据金额 83 | - 票据种类 84 | - 票据出票日期 85 | - 票据到期日期 86 | 87 | b. 出票人信息 88 | 89 | - 出票人名称 90 | - 出票人证件号码 91 | 92 | c. 承兑人信息口 93 | 94 | - 承兑人名称 95 | - 承兑人证件号码 96 | 97 | d. 收款人信息 98 | 99 | - 收款人名称 100 | - 收款人证件号码 101 | 102 | e. 持票人信息 103 | 104 | - 持票人名称 105 | - 持票人证件号码 106 | 107 | 2. 票据背书 108 | 109 | 票据背书是转让票据权利的重要方式和手段。发票票据需要先获取持票人持有的票据,填写被背书人的信息: 110 | 111 | - 被背书人名称; 112 | - 被背书人的证件号码。 113 | 114 | 发起票据背书的请求后会提交给被背书人。被背书人接收到票据背书的请求后,可以择签收票据或者拒绝背书。 115 | 116 | 3. 票据背书签收 117 | 118 | 票据背书签收实现了票据权利的转让,签收前需要仔细地查阅待签收票据的信息,确保内容的完整性。票据签收的过程需要用被背书人的签名密钥对签收的内容进行数字签名,实现防抵赖的功能。 119 | 120 | 4. 票据背书拒收 121 | 122 | 被背书人可以拒绝对票据背书的请求进行签收,拒绝以后,票据的持有人还是票据背书的发起者。拒绝背书的操作也会记录到票据的历史流转信息中。 123 | 124 | 5. 票据信息查询 125 | 126 | 票据信息查询可以获取自己持有的票据和待签收的票据,也可以根据票据号码查询票据的详细信息,包括票据的历史流转信息。 127 | 128 | 129 | 130 | 六 票据背书架构设计 131 | 132 | 根据票据背书的需求分析,下面设计一个简单的架构,再定义票据背书的数据模型。 133 | 134 | 135 | 136 | 1. 票据背书的分成架构 137 | 138 | 我们将基于区块链的数字票据进行分层设计,包括Hyperledger Fabric底层平台 139 | 140 | 智能合约、业务层和应用层,如下图所示。 141 | 142 | 1.1. 应用层 143 | 144 | 用户登录, 发布票据, 发起背书, 签收背书, 拒绝背书, 我的票据, 待签收票据, 票据详情 145 | 146 | 1.2. 业务层 147 | 148 | 用户管理, 票据管理, 其它... 149 | 150 | 1.3. 智能合约(链码) 151 | 152 | 票据发布, 票据背书, 票据背书签收, 票据背书拒签, 153 | 154 | 查询持票人票据, 查询待签收票据, 根据票据号码查询票据详情 155 | 156 | 1.4. 区块链底层平台 157 | 158 | CA, 区块链, 账本 159 | 160 | 每层的主要功能如下。 161 | 162 | - 区块链底层平台: 提供分布式共享账本的维护、状态数据库维护、智能合约的全生命周期管理等区块链功能,实现数据的不可篡改和智能合约的业务逻辑。根据第11章的内容搭建区块链网络以后,默认就提供了这部分功能。另外,通过fabric-ca提供成员注册和注销等功能。 163 | 164 | - 智能合约: 智能合约通过链码来实现,包括票据发布、票据背书、票据背书签收、票据背书拒绝等链码调用功能,链码查询包括查询持票人票据、查询待签收票据、根据链码号码查询票据信息等。票据系统的其他功能(比如贴现、转贴现、再贴现、回购等一系列业务类型) 都可以在智能合约里实现,这部分功能暂未完善。 165 | 166 | - 业务层: 业务层是应用程序的后端服务,给Web应用提供RESTful的接口,处理前端的业务请求。后端服务的基本功能包括用户管理和票据管理,通过Hyperledger Fabric提供的Go SDK和区块链网络进行通信。业务层也可以和其他的业务系统进行交互。 167 | - 应用层,Web应用采用jQuery+HTML+CSS 的前端架构编写页面,提供用户交互的界面操作,包括用户操作的功能 168 | 业务操作的功能。用户是内置的,只提供用户登录和用户退出操作。业务操作包括发布 169 | 查询持票人持有的票据、发起票据背书、查询待签收票据、签收票据背书、拒绝票据背书等功能。 170 | 各个层之间采用不同的接口,业务层的Go SDK、智能合约和区块链底层平台之间 171 | 用gRPC的接口。 172 | 173 | 2. 票据背书的数据模型 174 | 175 | 下面看一下链码设计的数据模型,包括票据数据结构定义和票据状态定义。 176 | 177 | a. 票据数据结构 178 | 179 | 票据信息包括票据基本信息、出票人信息、承兑人信息、收款人信息、持票人信息、待背书人信息、拒绝背书人信息、票据状态和票据背书历史等,数据结构定义如下: 180 | 181 | //票据数据结构 182 | type Bill struct { 183 | BillInfoID string `json:BillInfoID` //票据号码 184 | BillInfoAmt string `json:BillInfoAmt` //票据金额 185 | BillInfoType string `json:BillInfoType` //票据类型 186 | BillInfoIsseDate string `json:BillInfoIsseDate` //票据出票日期 187 | BillInfoDueDate string `json:BillInfoDueDate` //票据到期日期 188 | DrwrCmID string `json:DrwrCmID` //出票人证件号码 189 | DrwrAcct string `json:DrwrAcct` //出票人名称 190 | AccptrCmID string `json:AccptrCmID` //承兑人证件号码 191 | AccptrAcct string `json:AccptrAcct` //承兑人名称 192 | PyeeCmID string `json:PyeeCmID` //收款人证件号码 193 | PyeeAcct string `json:PyeeAcct` //收款人名称 194 | HoldrCmID string `json:HodrCmID` //持票人证件号码 195 | HoldrAcct string `json:HodrAcct` //持票人名称 196 | WaitEndorserCmID string `json:WaitEndorserCmID` //待背书人证件号码 197 | WaitEndorserAcct string `json:WaitEndorserAcct` //待背书人名称 198 | RejectEndorserCmID string `json:RejectEndorserCmID`//拒绝背书人证件号码 199 | RejectEndorserAcct string `json:RejectEndorserAcct`//拒绝背书人名称 200 | State string `json:State` //票据状态 201 | History []HistoryItem `json:History` //背书历史 202 | } 203 | 204 | 票据历史信息包含了票据的流转信息,比如票据发布、票据签收、票据拒绝等都会记录到历史信息中,数据结构定义如下: 205 | 206 | // 背书历史item结构 207 | type HistoryItem struct { 208 | TxId string `json:"txId"` 209 | Bill Bill `json:"bill"` 210 | } 211 | 212 | 票据历史信息是智能合约自动完成的。 213 | 214 | b. 票据状态模型 215 | 216 | 票据状态定义如下: 217 | 218 | 票据状态 NewPublish EndrWaitSign EndrSigned EndrReject 219 | 状态说明 票据新发布 票据等待签收 票据签收成功 票据被拒绝签收 220 | 221 | 票据发布以后进人票据新发布状态NewPublish,票据持票人可以提交票据背书的操作进行票据权利转移,进入票据等待签收的状态EndrWaitSign 222 | 223 | 票据被背书人接收到票据背书请求后,可以选择签收票据或者拒绝签收,票据签收成功进入状态EndrSigned,持票人转移为被背书人; 224 | 225 | 拒绝签收进人状态EndrReject,持票人保持不变还是原有的持票人。 226 | 227 | 处于Endrsigned 和EndrRejet 状态的持票人都可以再次发起票据背书的请求,进入下一轮的操作。 228 | 229 | 230 | 231 | 搭建应用程序运行的基础环境(fabric实现) 232 | 233 | 链码开发 234 | 235 | 业务处理 236 | 237 | 应用层 238 | 239 | web 240 | -------------------------------------------------------------------------------- /blockchain/.idea/blockchain.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /blockchain/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /blockchain/.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 49 | true 50 | DEFINITION_ORDER 51 | 52 | 53 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 108 |

票据金额

109 | 110 |

票据类型

111 | 112 | 113 |
114 |

票据出票日期

115 | 116 |

票据到期日期

117 | 118 |
119 |
120 |

出票人名称

121 | 122 |

出票人证件号码

123 | 124 |

承兑人名称

125 | 126 |

承兑人证件号码

127 | 128 |
129 |
130 |

收款人名称

131 | 132 |

收款人证件号码

133 | 134 |

持票人名称

135 | 136 |

持票人证件号码

137 | 138 |
139 | {{if ne .Bill.State "EndorseWaitSign"}} 140 |

若发起背书请填写被背书人信息

141 |
142 |

143 | 144 | 被背书名称 145 | 146 | 147 |
148 | 149 | 被背书证件号码 150 | 151 | 152 |

153 | 154 |

155 | 156 | 157 |

158 |
159 | {{end}} 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /web/tpl/bills.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | issue 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 |
19 |
20 |
21 | 区块链票据 22 |
23 | 24 | 25 | {{.Cuser.Acct}} 26 | 27 | 退出 28 |
29 |
30 |
31 |
32 |
33 |

34 | 35 | 菜单 36 | 37 | 38 | 39 |

40 |
41 |
    42 |
  • 发布票据
  • 43 |
  • 我的票据
  • 44 |
  • 待签收票据
  • 45 |
46 |
47 |
48 |
49 |
50 | 51 |
52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | {{range .Bills}} 64 | 65 | 66 | 80 | 81 | 82 | 83 | 84 | {{end}} 85 | 86 |
票据列表
票据号票据状态所属关系操作
{{.BillInfoID}} 67 | {{if eq .State "NewPublish"}} 68 | 票据新发布 69 | {{end}} 70 | {{if eq .State "EndorseWaitSign"}} 71 | 待{{.WaitEndorseAcct}}签收 72 | {{end}} 73 | {{if eq .State "EndorseSigned"}} 74 | 票据签收成功 75 | {{end}} 76 | {{if eq .State "EndorseReject"}} 77 | {{.RejectEndorseAcct}}拒签收 78 | {{end}} 79 | {{.HoldrAcct}}持有详情
87 |
88 |
89 |
90 |
91 |
92 | 93 | 94 | -------------------------------------------------------------------------------- /web/tpl/issue.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | issue 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | {{if .Flag}} 18 |
19 |
20 |
{{.Msg}}
21 |

22 | 23 |

24 |
25 |
26 | {{end}} 27 |
28 |
29 |
30 | 区块链票据 31 |
32 | 33 | 34 | {{.Cuser.Acct}} 35 | 36 | 退出 37 |
38 |
39 |
40 |
41 |
42 |

43 | 44 | 菜单 45 | 46 | 47 | 48 |

49 |
50 |
    51 |
  • 发布票据
  • 52 |
  • 我的票据
  • 53 |
  • 待签收票据
  • 54 |
55 |
56 |
57 |
58 |
59 |
60 | 61 |
62 |
63 |
64 |

票据号码

65 | 66 |

票据金额

67 | 68 |

票据类型

69 | 70 |
71 |
72 |

票据出票日期

73 | 74 |

票据到期日期

75 | 76 |
77 |
78 |

出票人名称

79 | 80 |

出票人证件号码

81 | 82 |

承兑人名称

83 | 84 |

承兑人证件号码

85 | 86 |
87 |
88 |

收款人名称

89 | 90 |

收款人证件号码

91 | 92 |

持票人名称

93 | 94 |

持票人证件号码

95 | 96 |
97 |

98 | 99 | 100 |

101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 | 109 | 110 | -------------------------------------------------------------------------------- /web/tpl/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 银行区块链票据项目 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 |
18 | {{if .Flag}} 19 |
20 |
21 |
用户名或密码输入错误!请重新输入
22 |

23 |
24 |
25 | {{end}} 26 |
27 | 34 |
35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /web/tpl/waitBillInfo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | issue 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | {{if .Flag}} 18 |
19 |
20 |
{{.Msg}}
21 |

22 | 23 |

24 |
25 |
26 | {{end}} 27 |
28 |
29 |
30 | 区块链票据 31 |
32 | 33 | 34 | {{.Cuser.Acct}} 35 | 36 | 退出 37 |
38 |
39 |
40 |
41 |
42 |

43 | 44 | 菜单 45 | 46 | 47 | 48 |

49 |
50 |
    51 |
  • 发布票据
  • 52 |
  • 我的票据
  • 53 |
  • 待签收票据
  • 54 |
55 |
56 |
57 |
58 |
59 | 60 |
61 |
62 |
63 | 64 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | {{range .Bill.History}} 78 | 79 | 80 | 91 | 102 | 103 | 104 | {{end}} 105 |
65 | 票据信息 66 |
票据状态:背书待签收 67 |
历史流转记录
票据编号操作业务操作描述当前持票人
{{.Bill.BillInfoID}} 81 | {{if eq .Bill.State "NewPublish"}} 82 | 票据新发布 83 | {{else if eq .Bill.State "EndorseWaitSign"}} 84 | 票据待签收 85 | {{else if eq .Bill.State "EndorseSigned"}} 86 | 票据已签收 87 | {{else if eq .Bill.State "EndorseReject"}} 88 | 票据拒签收 89 | {{end}} 90 | 92 | {{if eq .Bill.State "NewPublish"}} 93 | {{.Bill.HoldrAcct}} 94 | {{else if eq .Bill.State "EndorseWaitSign"}} 95 | {{.Bill.HoldrAcct}}向{{.Bill.WaitEndorseAcct}}发起背书请求 96 | {{else if eq .Bill.State "EndorseSigned"}} 97 | {{.Bill.HoldrAcct}}签收了票据 98 | {{else if eq .Bill.State "EndorseReject"}} 99 | {{.Bill.RejectEndorseAcct}}拒签票据 100 | {{end}} 101 | {{.Bill.HoldrAcct}}
106 |
107 |

票据号码

108 | 109 |

票据金额

110 | 111 |

票据类型

112 | 113 |
114 |
115 |

票据出票日期

116 | 117 |

票据到期日期

118 | 119 |
120 |
121 |

出票人名称

122 | 123 |

出票人证件号码

124 | 125 |

承兑人名称

126 | 127 |

承兑人证件号码

128 | 129 |
130 |
131 |

收款人名称

132 | 133 |

收款人证件号码

134 | 135 |

持票人名称

136 | 137 |

持票人证件号码

138 | 139 |
140 | 141 |

142 | 签收背书 143 | 拒绝背书 144 | 关闭 145 |

146 | 147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 | 155 | -------------------------------------------------------------------------------- /web/tpl/waitBills.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | issue 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 |
19 |
20 |
21 | 区块链票据 22 |
23 | 24 | 25 | {{.Cuser.Acct}} 26 | 27 | 退出 28 |
29 |
30 |
31 |
32 |
33 |

34 | 35 | 菜单 36 | 37 | 38 | 39 |

40 |
41 |
    42 |
  • 发布票据
  • 43 |
  • 我的票据
  • 44 |
  • 待签收票据
  • 45 |
46 |
47 |
48 |
49 |
50 | 51 |
52 |
53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | {{range .Bills}} 64 | 65 | 66 | 80 | 83 | 84 | 85 | {{end}} 86 |
票据列表
票据号票据状态所属关系操作
{{.BillInfoID}} 67 | {{if eq .State "NewPublish"}} 68 | 票据新发布 69 | {{end}} 70 | {{if eq .State "EndorseWaitSign"}} 71 | 待{{.WaitEndorseAcct}}签收 72 | {{end}} 73 | {{if eq .State "EndorseSigned"}} 74 | 票据签收成功 75 | {{end}} 76 | {{if eq .State "EndorseReject"}} 77 | {{.RejectEndorseAcct}}拒签收 78 | {{end}} 79 | 81 | {{.HoldrAcct}}持有 82 | 详情
87 |
88 |
89 |
90 |
91 |
92 |
93 | 94 | 95 | --------------------------------------------------------------------------------