基于Hyperledger Fabric构建一种著作权应用管理的研究与模拟实验
2022-12-03夏浩飞陈界誉
夏浩飞 陈界誉
1(嘉兴职业技术学院开放教育学院 浙江 嘉兴 314000)2(嘉兴职业技术学院科研处 浙江 嘉兴 314000)
0 引 言
确权、用权、维权是著作权管理的主要内容,互联网+时代,数字资源规模迅速膨胀,复制速度快,抄袭方便,由此造成的侵权问题层出不穷,中心化的著作权登记、交易、认证管理模式成本高、效率低,已很难应对数量如此庞大的著作权管理需求,利用分布式存储框架及计算技术来实现著作权数据的管理,简化登记、交易等流程,提高管理效率,具有研究价值。
公有链和联盟链是两种重要的分布式存储技术,文献[1-3]借助公有链的多点共识机制、交易不可篡改、可追溯等特性,提出基于分布式框架技术的著作权管控模型及监督机制,降低数字著作权登记的门槛,增强著作权认证的权威。文献[4-6]进行了基于公有链的数字著作权登记、交互与存储模型研究,阐述了分布式存储技术在著作权确权、用权和维权方面的应用构思。基于公有链技术架构的著作权管理系统可以较好地解决中心化管理存在的问题,但对系统交易的监管难以实现,而联盟链可以在保留交易不可篡改、可追溯、多点共识机制等特性的基础上,通过加入用户认证体系来有效地实现分布式系统的监管难问题。文献[7]以联盟链形式构建了一种具备安全认证和访问控制功能的分布式医疗数据存储和管理系统,既保证患者的数据隐私,又满足联盟成员之间医疗数据的共享需求。文献[8]利用联盟链的分布式存储、共识机制、智能合约、加密算法等功能,搭建智能电网数据处理平台,旨在打造一个智能电网数据优化的新型生态模式。另外,联盟链框架技术在教育数据存证、农产品数据分布式存储体系建设等领域也有应用[9-10]。
本文依托Hyperledger Fabric技术框架,构建了一种具有分布式存储和计算特征的著作权管理系统,并基于fabric镜像文件、docker容器、node sdk等技术模拟实现了该系统,实验结果表明,基于Hyperledger Fabric的分布式著作权管理系统能够有效地管理著作权数据,记录数据的流转过程,在保障著作权人权益同时,简化著作权的登记确认、交易变更、举证维权等重要环节。
1 技术框架
超级账本(Hyperledger)项目以联盟链形式构建一个分布式的数据存储与处理系统,系统数据由联盟成员通过背书、排序等机制共建共管,是一种全新的数据架构与处理技术[11],其成员管理服务和证书系统[12],在保证交易匿名的同时,实现了交易的可监管性,大幅拓展该技术的应用领域。
Fabric是Hyperledger最重要的子项目之一,以相互隔离的通道方式运行,由此保证联盟成员数据的安全和隐私,用户通过应用程序向CA注册并登记身份,凭借身份证书登录Fabric网络,发起交易提案,交易在经过Fabric网络的模拟执行、背书签名、排序处理后,打包生成区块并在网络节点完成区块记账,同时更新状态账本[13]。图1为Fabric运行流程。
图1 Fabric运行流程
1.1 应用程序
应用程序是用户访问Fabric网络的接口,用户把交易提案及相关参数输入至应用程序,应用程序在收到交易提案及相关参数后,根据链码实例化过程中指定的背书策略,将其发送至Fabric网络的相关背书节点,背书节点模拟执行交易,执行结果发回给应用程序。应用程序检验各背书节点的背书结果是否一致,背书签名是否符合背书策略,若符合条件,则打包执行结果,包括读写集、签名、通道号等信息,形成正式交易,发送至排序节点,否则标记交易为无效交易。
1.2 Fabric网络
Fabric网络的主体为背书节点、记账节点和排序节点,主要任务是完成交易的模拟执行、背书签名、排序和数据存储。
背书节点在接收到应用程序发送的交易提案后,检查交易是否完好,是否已提交过,验证交易签名和用户权限。交易提案通过,则根据提案调用的链码名称、链码方法及传入的参数模拟执行提案并签名,把读写集等执行结果和背书签名数据一起发回给应用程序;若交易提案未通过检验,则标记交易不合法,拒绝背书。
排序模块接收某一时间段内应用程序发送过来的所有交易,采用设定的排序算法对交易进行排序,并依据区块生成规则,把这一时间段内生成并排序完成的交易打包成区块,交付给记账节点。
记账节点负责账本数据的存储,网络中的节点一般都是记账节点。区块数据由排序节点交付给记账节点,记账节点校验每笔交易的合法性,包括背书签名是否正确、背书策略是否满足、读写集是否有效等。记账节点校验通过,更新区块文件和状态账本,并将记账结果告知应用程序;否则,标记交易无效,不更新状态账本。
1.3 身份管理模块
身份管理模块由Fabric-CA负责,应用程序用enroll命令登记CA配置文件中的admin身份,其他用户身份经由admin进行注册、登记,CA向登记成功的用户颁发身份证书、签名密钥。身份证书是用户登录Fabric网络的凭证,私钥用于交易签名,以此确保交易的可追溯和可监管。
1.4 链 码
链码是组成交易的一组功能代码,Fabric提供go和node两种链码设计语言,链码在Fabric网络完成安装和实例化之后,由应用程序根据用户需求调用链码功能函数,调用接口有query()和invoke(),query方法仅仅是对状态数据的一次读取,不产生交易和区块,invoke方法根据交易流程实现功能。
链码调用除在应用程序端以命令行方式实现外,更多是采用sdk方式,fabric-node-sdk是Hyperledger项目较为成熟的生态之一,用于提供客户端与Fabric网络交互的功能模块框架。
链码经过安装和实例化两个环节,部署在指定的peer节点上,在链码实例化过程中指定Fabric网络的背书策略,背书策略用于确定有效的链码执行必须得到的背书签名组合,由Fabric系统链码VSCC(Validation System Chaincode)进行验证[14],参与背书策略的角色可以是组织内的admin、client用户或者peer节点。
1.5 账 本
账本是Fabric网络的数据存储媒介,主要由区块账本和状态账本组成,前者用于存储交易区块,后者负责记录交易数据的最终状态。
区块账本采用aufs文件系统,文件格式为pb(Protocol Buffer),区块文件由header、data和metadata三部分组成,header由当前区块交易的hash值data_hash、当前区块编号number和前一区块hash值previous_hash组成,data包含当前区块的交易内容,metadata为一组加密的数据,主要记录交易的签名、合法性、有效性等标签。
状态账本存储着系统业务数据的最新状态,数据的读取与更新依托读写集完成,读写集主要数据结构为Reads[]*KVRead和Writes[]*KVWrite,Reads[]字段包括键值和版本号[Key:string,Version:*Version],Writes[]字段包括键值、数据值和删除标记[Key:string,Value:string,IsDelete:bool]。在fabric1.0中,取当前区块的高度作为版本号version的值。除此之外,状态账本还存储着通道、链码及其生命周期管理方法LSCC(Lifecycle System Chaincode)创建及更新的数据信息。
2 系统设计
2.1 Fabric网络设计
著作权管理系统设两个组织org1和org2,其下各设两个peer节点,分配ubuntu虚拟机的7051、8051、9051、10051端口,节点名称为:peer0.org1、peer1.org1、peer0.org2和peer1.org2,其中peer0.org1和peer0.org2为各自组织的主节点和锚节点,主节点负责与排序服务通信,锚节点负责组织之间的通信与同步信息,通信使用的TLS证书利用Fabric的cryptogen工具生成,4个peer节点均为记账节点。
org1、org2模拟两个著作权管理机构,其下的两个peer节点模拟著作权管理机构的成员,各成员通过自己维护的peer节点连入著作权管理Fabric网络,实现客户端与Fabric网络的交互。
排序模块选择Fabric的主流排序算法kafka,设置两个排序节点orderer0和orderer1,每个排序节点设置4个kafka服务,kafka0-kafka3,每个kafka设置3个zookeeper服务,zookeeper0-zookeeper2。图2为著作权管理系统Fabric网络架构。
图2 著作权管理系统Fabric网络
系统利用fabric-tools镜像创建cli服务模拟应用程序,通过cli结合shell脚本方式实现系统通道的创建,节点的加入,链码的安装、实例化及背书策略配置。系统的背书策略设置为“AND(Org1MSP.member,Org2MSP.member)”,即有效的链码执行必须同时得到两个组织中至少一名成员的签名。
2.2 链码设计
链码实现著作权的登记、交易和查询功能。著作权数据结构采用.json格式,简要设计如表1所示。
表1 著作权数据结构表
记录格式为[{“Key”:“*”,“value”:{“registerNum”:“*”,“Author”:“*”,“copyrightOwner”:“*”,…}}],以couchDb作为数据记录存储媒介。
链码命名cc_copyRight,设计register_copyRight()、transaction_copyRight()和query_copyRight()三个功能函数,分别实现著作权的登记、交易和查询,算法1为链码主要流程。
算法1cc_copyRight链码主要流程
2. if Function=register_copyRight() 跳转至3
else If Function=transaction_copyRight() 跳转至4
else If Function=query_copyRight() 跳转至5
else 返回错误提示“链码方法不合法”
3. if Parameters is invalid 返回错误提示“参数不合法”
else 著作权记录record=json.Marshal (Parameters)
where τ is the scattering time, e is the electron charge, μ is the electron mobility, ε0 is the vacuum permittivity, m* is the effective electron mass, and N is the carrier (electron/hole) concentration. The real and imaginary parts of the permittivity are given by:
APIstub.PutState方法生成record的key-value读写集
返回成功执行提示
4. if Parameters is invalid 返回错误提示“参数不合法”
else APIstub.GetState(key:Parameters.registerNum)读取交易的著作权记录record
重写record.copyrightOwner=Parameters. copyrightOwner
APIstub.PutState方法生成修改后著作权记录record的key-value写集
返回成功执行提示
5. if Parameters is invalid 返回错误提示“参数不合法”
else record=APIstub.GetState(key:Parameters.registerNum)读取符合条件的著作权记录
返回record
2.3 用户注册及交易流程设计
身份注册登记功能主要依赖CA服务端的fabric-ca-server和客户端的fabric-ca-client模块,在CA服务配置文件中设置引导身份admin,利用sdk登记CA配置文件中设定的admin用户,其他普通用户通过激活的admin用户实现注册和登记,图3为普通用户注册登记过程。
图3 普通用户注册登记过程
系统同样以sdk方式实现交易流程,用户登录系统提交著作权数据凭证,包括处理方法和著作权数据,客户端sdk根据凭证创建交易提案并用提交交易用户的私钥完成交易提案签名后,发送至背书策略指定的背书节点处理,背书节点的处理过程不仅是对著作权凭证的处理和签名过程,也是链上著作权管理联盟各组织成员对著作权凭证的认可,sdk对著作权凭证处理结果返回值进行一致性检验和背书策略验证,是著作权管理组织成员对著作权凭证处理的意见是否一致,是否符合预先设定的著作权处理规则的确认过程。通过验证的著作权处理结果由sdk形成正式交易并提交给排序节点orderer,同时,在peer节点注册交易监听事件,监听交易完成情况,交易经过排序处理和记账节点的再次检验无误后,被写入到联盟组织成员各自的账本中,sdk在接收到排序服务所提交的交易成功返回值和监听事件链码调用成功的回调函数后,确认交易成功。排序机制和交易监听事件确保了各组织成员账本的同步。图4为著作权管理交易流程。
图4 著作权管理交易流程
3 系统实现
著作权管理系统选择ubuntu平台,基于docker容器和docker-compose工具部署Fabric网络,使用shell脚本管理Fabric网络,安装、实例化cc_copyRight链码,系统使用Fabric1.0版本镜像文件。
3.1 实验步骤
1) Fabric网络部署。应用Fabric包提供的通道配置程序configtxgen和通道配置文件configtx.yaml生成创世区块genesis.block和创建通道依赖的文件channel.tx,生成组织的锚节点更新依赖的文件Org1MSPanchors.tx和Org2MSPanchors.tx。
编写docker-compose-copyRight.yaml配置Fabric网络,编写shell脚本start_copyRight_fabric.sh启动Fabric网络和安装链码。
(1) 启动Fabric网络。使用docker-compose up命令执行Fabric网络配置文件docker-compose-copyRight.yaml,生成对应的docker容器,启动Fabric网络的各项服务和4个节点。Fabric网络启动后,使用channel create命令在peer0.org1节点创建通道mychannel,其他三个peer节点依次加入mychannel通道,并更新组织的锚节点。
(2) 安装链码。使用peer chaincode install命令把著作权管理链码cc_copyRight安装至peer0.org1和peer0.org2节点,使用peer chaincode instantiate命令实例化链码,链码实例化成功后,安装链码的节点会生成相应的链码镜像文件,如图5所示,在链码实例化过程中指定系统的背书策略。完成链码实例化的各peer节点处于消息侦听状态,等待应用程序的交易提案。
图5 链码镜像截图
2) 身份注册登记。利用npm install下载fabric-ca-client 的node sdk包,编写并运行admin.js文件,完成CA服务上配置的admin用户的登记(enroll),编写并运行User.js完成普通用户xiahaofei的注册和登记,图6为用户注册登记成功截图。
图6 用户注册登记成功截图
3) 链码设计与调用。编写register_copyRight.js实现著作权登记功能,算法2为其主要流程。
算法2register_copyRight.js主要流程
1. getRegisteredUsers获取xiahaofei的证书和密钥
2. 创建xiahaofei签名的交易提案request={
chaincodeId:‘cc_copyRight’,
fcn:‘register_copyRight()’,
args:[‘registerNum’,‘Author’,‘copyrightOwner’,…],
ChainId:‘channelID’,
txId:‘transactionID’}
3. 选择背书节点request.targets=peer0.org1&peer0.org2
4. 发送交易提案request给peer0.org1&peer0.org2
5. 获取背书返回值proposalResponses[i]
6. 逐个验证背书返回值proposalResponses[i]的有效性
7. if (proposalResponses[i] is all good)封装正式交易请求
request={proposalResponses: proposalResponses,
proposal: proposal}
8. eventhub.registerTxEvent (txId) 注册交易监听事件
9. 发送正式交易request to orderer
10. 获取orderer返回值txPromise
获取监听事件返回值eventPromise
11. if (txPromise&eventPromise) 提示客户端交易成功
编写transaction_copyRight.js实现著作权交易功能,执行流程与register_copyRight.js基本一致,区别为交易提案request中的fcn、args不同。
request={
fcn: transaction_copyRight(),
args:[ ‘registerNum’, ‘copyrightOwner’],
…
}
registerNum识别交易著作权记录,copyrightOwner用于重写著作权人。
编写query_copyRight.js实现著作权记录的查询,返回符合条件的著作权记录给客户端,交易提案为:
request={…,
fcn: query_copyRight(),
args:[ ‘registerNum’],
…
}
查询sdk和注册、登记sdk一样,统一使用fabric的invoke()接口,由于是查询交易,不需要更新状态账本,所以sdk在收到模拟执行的交易提案返回值后,仅向客户端反馈查询结果,同时标记交易为无效交易,不提交给排序节点,但写入区块文件。
链码在ubuntu命令行下使用node调用,如调用著作权登记sdk命令为:node register_copyRight.js。
3.2 实验结果
1) 链码执行结果。docker-compose-copyRight.yaml配置文件中cli连接的默认节点为peer0.org1,以上著作权登记、交易和查询操作均在peer0.org1节点上执行,图7为register_copyRight.js执行结果。
图7 著作权登记执行结果截图
分析执行过程:
(1) 客户端sdk(register_copyRight.js)获取著作权登记用户的私钥和签名证书,成功,显示信息“Load privateKey and signedCert”。
(2) sdk给创建的交易提案(proposal)签名,为其分配交易编号transaction_id,然后根据设定的背书策略,向背书节点提交著作权登记交易提案。
(3) sdk逐个检验背书节点处理交易的返回值ProposalResponse,通过,显示信息“Transaciton proposal was good”。
(4) 全部背书结果有效性、一致性检验和背书策略验证通过,显示信息“Successfully send Proposal and received ProposalResponse:state-200,message-“””。
(5) 交易监听器确认交易提交完成,显示信息“The transaction has been committed on peer localhost:7053”,7053为监听器所使用的端口。
(6) sdk收到交易提交成功和监听事件成功反馈,显示信息“Send transaction promise and event listner promise have completed”。
(7) sdk通知客户端交易成功,记账完成。
query_copyRight.js的执行,不改变账本状态,仅调用链码的query_copyRight()方法获取状态账本中符合查询条件的著作权记录,把其value值返回给客户端,图8为query_copyRight.js执行结果(参数registerNum: “copyRight-2020-0001”)。
图8 著作权查询结果截图
transaction_copyRight_js参数设置[registerNum:“copyRight-2020-0001”,copyrightOwner:“lingdanyin”],链码方法transaction_copyRight(),依据registerNum和copyrightOwner实现著作权变更。
切换至peer0.org2节点,以query_copyRight()和[registerNum:“copyRight-2020-0001”]参数执行查询操作,返回著作权记录的copyrightOwner为“lingdanyin”,由此可以看到账本在每个peer节点是同步的。
2) 账本分析。(1) 状态账本。图9为fabric网络状态账本的主要数据文档,mychannel_文档记录了通道的配置信息、区块高度等数据,mychannel_cc_copyRight文档记录所有著作权记录数据的最新json值,是状态账本的核心内容,mychannel_lscc存储通道链码生命周期管理模块的相关数据文档,在后续链码的调用过程中,根据链码执行对状态账本的影响更新各文档的value值。
图9 状态账本主要文档截图
(2) 区块账本。通过peer channel fetch命令获取交易区块,使用configtxlator工具把区块文件转换为可读的.json文件,可以看到区块文件详细记录了著作权交易的内容,以transaction_copyRight.js执行结果的区块文件为例,主要内容如下:
data:{
……
“header”:{
“creator”:{“id_bytes”:交易创建者加密数据,
mspid:“Org1msp”}
“nonce”:“加密随机数”}
“payload”:{
……
“chaincode_proposal_payload”:{
…,“chaincode_id”:“cc_copyRight”,
“args”:调用方法及参数加密数据,…}
“action”:{
“endorsements”:{“endorser”:背书加密数据,
“signature”:签名加密数据}
“proposal_response_payload”:{
…,“chaincode_id”:“cc_copyRight”,
“results”:加密数据,“response”:返回值,…}}}
……
header:{
“data_hash”:“区块加密交易数据”,
“number”:“3”,
“previous_hash”:“上一区块hash值加密数据”}
metadata:{签名信息、交易合法性标识等内容加密数据}
3) 确权、用权、维权过程分析。确权数据流转:著作权登记sdk把带有著作权登记凭证的交易提案交付给背书节点,背书节点把凭证传入cc_copyRight链码的shim.ChaincodeStubInterface参数接口,链码处理著作权登记凭证后,通过PutState方法生成登记凭证记账写集Writes[],背书节点在ProposalResponse中向sdk返回写集,sdk校验后,经排序节点排序,著作权登记交易作为区块的一部分由记账节点写入区块账本,状态账本增加著作权记录,著作权登记写集增加的世界状态内容为[“key”:“copyRight-2020-0001”,“~version”:“2”,value:{…,“copyrightOwner”:“xiahaofei”,…}] 。
用权数据流转:著作权交易sdk在交易提案的凭证中携带交易方法transaction_copyRight()和交易著作权编号registerNum与交易相对人copyrightOwner信息,背书过程利用GetState方法生成读集,读取状态账本符合交易条件的记录,修改记录的所有权人copyrightOwner,生成写集更新状态账本,著作权利人变更完成,读写集内容为:
Reads[]:[“key”:“copyRight-2020-0001”,“~version”:“2”]
Writes[]:[“key”:“copyRight-2020-0001”, IsDelete:false, value: {…, “copyrightOwner”: “lingdanyin”,…} ]
状态账本更新此条著作权记录的version=3。
维权:交易追溯通过区块账本实现,每个交易提案都带有交易创建者的签名,在一个实际的著作权管理生产系统中,每个网络用户的私钥应在监管机构备案,当出现某个交易异常时,监管机构检查区块账本获取相关交易的签名信息,结合用户备案私钥,实现对交易提案用户的追溯。
3.3 Fabric的局限性
通过实验了解到Fabric技术方案在应用中存在局限性。一个实际的分布式著作权管理生产系统需要备案不同类型的著作权作品内容,目前Fabric技术提供的分布式账本存储系统只能够支持以文本为主要内容的作品存储,如文字作品、部分以代码为主的计算机软件作品等,对于美术、影视等作品内容的存储有待通过进一步的探索来完善。后续研究将利用Fabric技术框架的周边生态来改进用户接口的友好性,如:利用Hyperledger explorer的可视化环境来查看系统的网络拓扑结构、链码、交易等信息,实现网络的配置与管理,知悉交易状况;利用composer框架来定义网络上的资产、参与者和交易过程,创建具体的应用程序,提供便捷的用户接口。另外,研究将使用实体服务器来代替虚拟机,以提升分布式网络硬件性能,推进系统生产部署。
4 结 语
本文依托Hyperledger Fabric技术框架,设计一种基于分布式存储技术的著作权管理系统。著作权证书主要包括登记编号、权利人、作品类别、作品名称、登记时间等信息,数据结构相对简单且相似度高。模拟系统很好地实现了分布式系统中著作权证书的登记、交易及访问应用等管理功能。在系统中,用户能够方便地拥有和支配自己的著作权。同时,系统支持著作权的登记和交易经相关机构认可,支持监管机构对交易过程和交易数据的追溯与监管。模拟实验为解决中心化著作权管理存在的成本高、交易过程和著作权制品使用追溯效率低等问题提供了一种技术思路和解决方案。