一种区块链智能合约生成与管理系统及其实现机制的制作方法

文档序号:23728503发布日期:2021-01-26 18:33阅读:109来源:国知局
[0001]本发明涉及区块链
技术领域
:,特别涉及一种区块链智能合约生成与管理系统及其实现机制。
背景技术
::[0002]区块链是一种全新的去中心化的基础架构,具有公开透明、可追溯、不可篡改等特征。近年来,区块链技术发展迅速,受到学术界和工业界的高度重视,区块链已经延伸到数字金融、物联网等多个领域,是“新基建”的重要组成部分。智能合约(smartcontract)的概念最早由nicholasszabo于1994年提出,是执行合约条款的计算机交易协议。长期以来,智能合约的发展都较为缓慢,应用范围有限。随着区块链的出现,智能合约与区块链形成了天然的联盟。区块链的去中心化、不可篡改、透明共识的特点,加强了智能合约的安全性,大力拓展了智能合约的应用范围。另一方面,智能合约也大大加速了区块链的发展。一般认为,将比特币底层架构称之为区块链1.0,而将具备智能合约特性的区块链称之为区块链2.0,典型的是以太坊系统。区块链与智能合约的结合可解决许多复杂问题,例如逻辑复杂交易可通过智能合约的可编程性进行封装。这一代区块链开始将区块链应用扩展到数字货币之外的更多领域。[0003]但当前的基于区块链的智能合约并不成熟,存在以下三方面的问题:[0004](1)智能合约“开发难”。智能合约形式上是一种计算机程序,以代码的形式加以表现,只是具备更多的契约、法律等社会因素的约束和高安全、高可靠的可信性要求。当前典型的智能合约语言有solidity、golang等。合约的设计者需预先理解业务的实际需求,然后设计代码结构。对于非技术人员,特别智能合约的使用者比如律师来说,具备较高的技术研发门槛。这将严重限制智能合约的应用。另一方面,智能合约的安全可靠需求也在不断加强。由于智能合约问题已导致多项安全事件漏洞,智能合约还没形成软件工程式的通用模式,因此高效的智能合约设计模型以及易用的开发方法是当前迫切需要解决的问题。[0005](2)智能合约“维护难”。部署于区块链上的智能合约也和交易具备同样的特性,那就是无法篡改。这样上链后的智能合约升级维护就很困难。传统中心服务器应用程序的开发人员习惯于频繁更新,以修复错误或引入新的业务功能。部署于区块链上的智能合约若想要迭代更新是一个复杂的过程。例如,逻辑复杂数据众多的智能合约,针对某一特定逻辑进行升级,需要更改合约后重新进行部署,还需要迁移上一版本的数据,费时费力。对于有些无法中断的业务,这种方法不具备可行性。[0006](3)智能合约“管理难”。智能合约的链下开发和链上维护是一个互不关联的过程,相互脱节、彼此分离。这就增加链上链下合约协同管理的复杂性。链下合约编写类似于传统的代码开发,可以迭代优化。而链上的合约维护无法直接替代,不易变换。智能合约生命周期必然伴随着产生、部署、更新等过程,因此,链下代码的开发要考虑适应部署上链之后的代码逻辑维护,新的更新模块要能融入其他链上智能合约模块。链下用户还需要有效途径可查询链上的数据状态并进行维护。这些都是智能合约管理所需要解决的系列问题。fabric的智能合约。该工具具有较强的形式化理论知识,同样给通用性设计提供了一些难度。[0014]综上所述,目前的智能合约设计、管理模式和工具还在初级探索阶段,远不如传统软件工程那么成熟,需要更多的理论方法和工具支撑。智能合约朝着工程化的方向发展,形成一系列可靠可信的设计模型和管理模式,是一种必然趋势,最终形成智能合约工程体系。技术实现要素:[0015]为了克服现有技术的以上缺陷,促进智能合约工程的发展,本发明提出一种区块链智能合约生成及管理系统及实现机制,并基于典型智能合约语言solidity实现了一套可视化原型系统;所提出的设计模型继承传统软件工程模块化的思想,既有助于线下复杂业务功能的设计,又可支持上链后数据和逻辑的管理;所提供的模组化管理机制,提供了类标准sql方法来完成对链上合约数据的查询和更新操作,同时通过索引合约完成合约插拔、重组以及升级操作,形成可视化工具,更加系统灵活的加强了智能合约的链上管理机制。[0016]本发明的目的在于提供一种区块链智能合约生成及管理系统,包括:[0017]链下智能合约设计与开发模块;自动部署模块;以及链上智能合约管理模块;[0018]其中,所述链下智能合约设计与开发模块分为链下智能合约设计子模块以及链下智能合约开发子模块。所述链下智能合约设计子模块支持用户以可视化拖拽的方式依据柔性设计模型创建智能合约,并分别输出两种类型的文件,其中json格式的文档用于记录合约的版本、插件合约之间的调用关系以及合约的状态,以及另一个solidity格式的文件,执行自动部署的环节,通过solc编译生成应用二进制接口和字节码文件,将应用二进制接口和字节码文件转化为.go文件;所述链下智能合约开发子模块使用柔性设计模型,将合约以插件为单位,每一个所述插件作为插件合约,基于数据和逻辑相分离的思想,将合约分为索引、数据和逻辑三个部分,从而形成索引合约、数据合约和逻辑合约,所述逻辑合约可以调用数据合约;[0019]所述自动部署模块使用生成的所述.go文件中部署合约的方法进行合约的自动部署上链;[0020]所述链上智能合约管理模块对链上运行的智能合约进行维护。[0021]优选的,所述柔性设计模型采用数据逻辑分离改变智能合约的结构,将合约分为索引合约、数据合约及逻辑合约三部分,将数据与逻辑交由不同的合约处理,并将逻辑合约按照不同类别拆分为多个子合约,多个所述子合约之间根据合约地址互相进行调用,还包括公共模块以生成模板。其中,所述索引合约以“合约名称--合约地址--合约版本号--合约状态”的形式存储数据合约和逻辑合约的基本信息,在智能合约上链后的模组化管理机制中承担模块合约管理员的角色;所述数据合约存储合约所需要的数据,所述逻辑合约按照功能分为属性合约和动作合约,所述属性合约完成对象属性的判断和管理,所述属性合约分为基本属性合约和基于状态机的属性合约,所述动作合约用于改变智能合约的属性,所述逻辑合约中的所述属性合约和所述动作合约可以互相调用,而所述逻辑合约可以调用所述数据合约。[0022]优选的,所述索引合约的创建及部署是由系统管理员进行的操作,用户无法对其进行自定义修改。[0023]优选的,所述数据合约和动作合约模型由用户自定义创建;其中:[0024]所述数据合约定义为:datacontract:=contractname(dataelement,setdata,getdata,pusharray,setarray,getarray)其中:dataelement={d1,d2,…,dn}表示合约中数据的集合,所述数据合约中结构体的存储有两种方式,分别是通过指针指向一个结构体maptodata和结构体数组array,对所述结构体maptodata形式的结构体数据存储的操作包括:对结构体中某一成员变量的值进行设置操作的集合、结构体中某一成员变量的值进行查询操作的集合;对结构体数组array形式的结构体数据存储的操作包括:将数据插入数组的操作集合、对结构体数组中数据进行设置操作的函数集合,将要进行设置的结构体在结构体数组中的索引值及需要设置的数据作为函数入参,确定结构体位置,并对其中一个成员变量的值进行设置,n由结构体中成员变量的个数决定,通常与getarray函数配合使用,通过查询符合要求的结构体,对其进行数据的设置;getarray={garray1,garray2,…,garrayn}表示对结构体数组进行查询操作的函数集合,n的个数由合约中定义的结构体数组的个数决定,将所查询的结构体在结构体数组中的索引值作为函数入参,确定所查询结构体位置,返回此结构体中存储的数据,在调用此函数时通常采用for循环方式,遍历结构体数组并返回对应结构体存储的数据;所述逻辑合约中的所述基本属性合约包括ownable、time、erc20、nulladdress作为固定的合约模板,不可进行更新;[0025]所述动作合约的定义为:[0026]actioncontract:=contractname(condition,yaction,naction)[0027]其中condition={g0,g1,…,gn}(gi∈g)为条件集合;yaciton表示满足条件执行的动作;naction表示不满足条件所执行的动作。[0028]优选的,所述自动部署模块用于进行智能合约自动编译及部署,所述智能合约自动编译的方法包括:将区块链智能合约通过命令行调取编译工具编译后,生成区块链虚拟机的字节码,最终成为被部署到区块链上的智能合约;所述智能合约自动部署的方法包括:根据智能合约转化的二进制接口文件,生成特定的支持golang语言的语言封装,在区块链中进行标准方式的合约交互,生成合约对应的绑定文件,绑定文件生成与智能合约交互的所有方法,包括部署的方法,最后,将合约部署到区块链上执行。[0029]优选的,所述链上智能合约管理模块采用两种方式对链上运行的智能合约进行维护,其中一种方式为支持使用类sql语句,查看合约数据部分并更新;另一种方式为支持通过索引合约,完成智能合约的维护操作,支持插拔、重组以及升级链上运行合约,形成模组化管理机制。[0030]优选的,当所述链上智能合约管理模块采用支持类sql的动态合约数据管理方法对链上运行的智能合约进行维护,所述支持类sql的动态合约数据管理方法采用基于类sql标准规范的数据接口,实现链上的数据的查询、更新以及插入等操作,增加链上合约的可维护性,所述类sql标准规范的数据接口的逻辑架构提供的类sql接口分为三层,分别是:[0031]1)sql解析层:对类sql语句进行分析,以提取出有用的参数;[0032]2)分析匹配层:将提取出的参数与智能合约中的结构体或数据操作的方法进行匹配;[0033]3)合约调用层:若提取出的参数可以匹配到相应的结构体,则调用对应的方法对此结构体进行插入、更新及查询等操作;[0034]所述类sql接口提供的类sql语句可对数据合约中的数据进行插入、更新及查询三种操作。[0035]本发明的目的还在于提出了一种区块链智能合约生成及管理的实现机制,针对链上部署运行的智能合约,支持智能合约的可插拔、可重组以及可升级,包括如下步骤:[0036]步骤1,建立索引合约、数据合约及逻辑合约,并将索引合约作为链上数据合约和逻辑合约的管理员,所述索引合约处在管理区,与合约区的数据合约和逻辑合约发生关联;[0037]步骤2,通过拖拽插件操作,设计智能合约,编译并部署所述智能合约上链。[0038]其中所述智能合约的可插拔包括:针对部署上链的智能合约可以增加新的模块以及禁用已有的合约模块来适应业务改变;初始化时将索引合约、数据部分、逻辑部分分别部署上链,在索引合约中调用登记模块将已上链合约的地址、调用关系和合约状态以指针的形式存储;[0039]所述智能合约的可重组包括:针对已部署上链的模块合约更改相互调用关系;[0040]所述智能合约的可升级包括:对智能合约进行更新、升级操作,所述升级操作包括插拔以及重组操作。[0041]优选的,所述索引合约的定义如下:[0042]1)合约登记更新信息:“contract_name”=>“contract_version”=>“contract_address”;[0043]2)合约状态信息:[0044]a)可调用状态,禁用状态:state:{available,disavailable};[0045]b)通过合约地址查找当前的合约状态:mapping(address=>state);[0046]c)合约调用关系信息:[0047]合约名称及地址::contract:{name,address}[0048]若合约a调用合约b及合约c,则addressa=>[contractb,contractc]:mapping(address=>contract[])。[0049]优选的,所述步骤2的所述插件选择自行设计的插件模板库,所述插件模板库包括柔性设计模型中基于状态机的逻辑属性合约、动作合作以及数据合约相关插件,所述插件模板库的系统组织方式是一系列插件模板,所述插件模板根据合约类型进一步展开。[0050]本发明的有益效果:[0051](1)提出了一套链下柔性的智能合约设计模型,基于数据与逻辑分离的思想,利用模块化设计思想,研究属性合约、动作合约及数据合约的组合,通过融合多种智能合约的设计模式,提炼出适合不同场景的插件式合约,从设计层面缓解智能合约“开发难”的问题。[0052](2)针对已经部署上链的智能合约,提出一套模组化管理机制,提出一套链上智能合约模组化管理机制,具有可插拔、可重组以及可升级的特性,同时,建立一种类sql语句的链上数据查询更新方法,支持链上智能合约的可插拔、可重组以及可升级,用于解决智能合约“维护难”的问题。[0053](3)提出一套面向链上数据合约的类sql数据操作接口,支持链上数据的查询和维护,可动态完成数据合约的内容更新,支持数据的查询、插入、更新等工作,可有效提高不同版本智能合约的数据迁移效率。研发了一套sc_dms原型系统,以插件模块的方式支持柔性设计模型、类sql数据查询和模组化管理机制,协同管控链上链下智能合约,为智能合约的高效开发和管理提供支持,有助于解决智能合约“管理难”的问题。[0054](4)本发明公开了一套可视化的智能合约组件式设计和管理系统sc_dms(smartcontractdesignandmanagementsystem),用户可根据实际需求。选择不同功能的合约插件进行组合,通过拖拽等操作简单快捷地生成用户自定义的智能合约。[0055]本发明提供柔性设计模型、模组化管理机制以及sc_dms系统,力求完成链下高效设计、链上动态维护以及链上链下协同管理的目标,为高质量智能合约的推广提供一种可行的研究思路和实践。[0056]根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明了本发明的上述以及其他目的、优点和特征。附图说明[0057]后文将参照附图以示例性而非限制性的方式详细描述本发明的一些具体实施例。附图中相同的附图标记标示了相同或类似的部件或部分。本领域技术人员应该理解,这些附图未必是按比例绘制的。本发明的目标及特征考虑到如下结合附图的描述将更加明显,附图中:[0058]图1为根据本发明实施例的sc_dms运行流程图;[0059]图2为根据本发明实施例的柔性设计模型架构图;[0060]图3为根据本发明实施例的类sql操作方式逻辑架构图;[0061]图4为根据本发明实施例的insert语句合约操作映射示意图;[0062]图5为根据本发明实施例的update语句合约操作映射示意图;[0063]图6为根据本发明实施例的select语句合约操作映射示意图。[0064]图7为根据本发明实施例的智能合约可插拔特性示例图。[0065]图8为根据本发明实施例的智能合约可重组特性示例图。[0066]图9为根据本发明实施例的智能合约升级特性示例图。[0067]图10为根据本发明实施例的逻辑基本属性合约插件。[0068]图11为根据本发明实施例的柔性设计模型主要插件示意图。[0069]图12为根据本发明实施例的投票案例数据合约生成示例图。[0070]图13为根据本发明实施例的盲拍案例状态属性合约生成示例图。[0071]图14为根据本发明实施例的盲拍案例完整智能合约插件及部分代码示例图。具体实施方式[0072]为了使得本发明能够针对其发明要点更加明显易懂,下面将结合附图和实例对本发明作进一步的说明。在下面的描述中阐述了很多细节和具体实例,提供这些实例是为了能够更透彻地理解本发明,并且能够将本发明完整形象地传达给本领域的技术人员。虽然本发明能够以很多不同于此描述的其它方式实施,但是本领域技术人员可以在不违背本发明内涵的情况下做相应的推广,因此本发明不受下面公开的具体实例及具体附图所限制。[0073]本发明的目的在于提供一种区块链智能合约生成及管理系统,包括:[0074]从编译运行流程角度概述智能合约设计与管理系统sc_dms系统原理,如图1所示。系统流程上可主要分为三个部分,分别是链下智能合约设计与开发、自动部署、链上智能合约管理。[0075]链下智能合约的开发是使用柔性设计模型,将合约以插件为单位,每一个插件称为插件合约。基于数据和逻辑相分离的思想,将合约分为索引、数据和逻辑三个部分,可统称为索引合约、数据合约和逻辑合约。其中,逻辑部分按照功能划分为属性合约和动作合约。属性合约主要完成对象属性的判断和管理,动作合约则主要负责属性的变化操作。逻辑合约可以调用数据合约,属性合约与动作合约可以相互调用。[0076]sc_dms系统链下设计部分支持用户以可视化拖拽的方式依据柔性设计模型创建智能合约,并分别输出两种类型的文件,json格式的文档主要记录合约的版本、插件合约之间的调用关系以及合约的状态,有利于用户针对已部署在链上的合约进行模组化管理。而另一个solidity格式的文件则执行自动部署的环节,通过solc编译生成abi(应用二进制接口)和bin(字节码)文件,使用abigen工具将abi、bin文件转化为.go文件,使用生成的.go文件中部署合约的方法进行合约的自动部署上链。[0077]另外,系统支持对链上运行的智能合约进行维护。一种方式是支持使用类sql语句,查看合约数据部分并更新。另一种方式则是支持通过索引合约,完成智能合约的维护操作,支持插拔、重组以及升级链上运行合约,形成模组化管理机制。[0078]上述内容为整个系统的基本组成部分,下面分别对各部分详细阐述。[0079]智能合约柔性设计模型是使用数据逻辑分离的思想来改变智能合约的结构,将数据与逻辑交由不同的合约处理,并可将逻辑合约按照不同类别拆分为多个子合约,子合约之间可根据合约地址互相进行调用。基于数据逻辑分离思想的柔性智能合约的设计模型架构如图2所示。这种方式可以实现智能合约的可扩展和可重用特征,模块化和逻辑业务分离使智能合约可根据不同模块特征加强功能、扩展业务。同时公共模块可生成模板,完成代码的可复用,减少开发工作量和维护难度。模型分为索引合约、数据合约及逻辑合约三部分。其中,索引合约以“合约名称--合约地址--合约版本号--合约状态”的形式存储数据合约和逻辑合约的基本信息,在智能合约上链后的模组化管理机制中承担模块合约“管理员”的角色。数据合约存储合约所需要的数据,逻辑部分可分为属性合约和动作合约,属性合约又可进一步分为基本属性合约和基于状态机(finitestatemachine,fsm)的属性合约,动作合约则可以改变智能合约的属性。逻辑合约中的属性合约和动作合约可以互相调用,而逻辑合约又可以调用数据合约。[0080]索引合约的创建及部署是由系统管理员进行的操作,用户无法对其进行自定义修改,具体描述见下文。下面依次描述用户可自定义创建的数据合约和动作合约模型。[0081](1)数据合约[0082]针对数据合约,本发明的定义如下:[0083]datacontract:=contractname(dataelement,setdata,getdata,pusharray,setarray,getarray)其中:dataelement={d1,d2,…,dn}表示合约中数据的集合。合约中结构体的存储有两种方式,分别是通过指针指向一个结构体(maptodata)和结构体数组(array)。[0084]其中对maptodata形式的结构体数据存储有如下操作:setdata={sdata1,sdata2,…,sdatan}表示对结构体中某一成员变量的值进行设置操作的集合;getdata={gdata1,gdata2,…,gdatan}表示对结构体中某一成员变量的值进行查询操作的集合。[0085]对array形式的结构体数据存储有如下操作:pusharray={parray1,parray2,…,parrayn}表示将数据插入数组的操作集合;setarray={sarray1,sarray2,…,sarrayn}表示对结构体数组中数据进行设置操作的函数集合,将要进行设置的结构体在结构体数组中的索引值及需要设置的数据作为函数入参,确定结构体位置,并对其中一个成员变量的值进行设置,n由结构体中成员变量的个数决定,通常与getarray函数配合使用,通过查询符合要求的结构体,对其进行数据的设置;getarray={garray1,garray2,…,garrayn}表示对结构体数组进行查询操作的函数集合,n的个数由合约中定义的结构体数组的个数决定,将所查询的结构体在结构体数组中的索引值作为函数入参,确定所查询结构体位置,返回此结构体中存储的数据,在调用此函数时通常采用for循环方式,遍历结构体数组并返回对应结构体存储的数据。[0086](2)逻辑基本属性合约[0087]针对逻辑合约中的基本属性合约,本发明集成ownable、time、erc20、nulladdress等属性合约作为固定的合约模板,不可进行更新。[0088](3)逻辑动作合约[0089]针对逻辑合约中的动作合约,本发明的定义如下:[0090]actioncontract:=contractname(condition,yaction,naction)[0091]其中condition={g0,g1,…,gn}(gi∈g)为条件集合;yaciton表示满足条件执行的动作;naction表示不满足条件所执行的动作。[0092]智能合约自动编译及部署有以下两类方法:[0093](1)智能合约自动编译方法[0094]solc作为solidity命令行的编译工具,包含在solidity源码库。以太坊智能合约可以通过命令行调取编译工具编译后,生成以太坊虚拟机的字节码,最终才成为被部署到以太坊区块链上的智能合约。solc编译器可以编译输出多种形式,例如最终的二进制合约abi后缀文件,抽象语法树evm.legacyassembly的json格式的汇编代码,还包括预计花费gas值的evm.gasestimates函数等等。sc_dms系统中主要使用编译转化成二进制文件的部分。[0095](2)智能合约自动部署方法[0096]abigen工具可以根据solidity或者abi后缀文件生成特定的语言封装,支持golang语言。abi(applicationbinaryinterface)是应用二进制接口,以太坊中进行合约交互的标准方式。sc_dms系统中主要通过abigen生成合约对应的.go类型的绑定文件,绑定文件可生成与智能合约可以交互的所有方法,包括部署的方法。最后,将合约部署到区块链上执行。[0097]前面提出的柔性设计模型存在数据合约部分,将逻辑与数据相分离,但是一旦智能合约上链,可维护性较弱,对于智能合约的改动通常需要重新部署新的合约。另外,对于智能合约数据更新,也有一定操作复杂性。因此,这里提出一种支持类sql的动态合约数据管理方法,该方法基于类sql标准的数据接口,可实现链上的数据的查询、更新以及插入等操作,增加链上合约的可维护性。[0098](1)类sql标准接口实现原理[0099]本发明提出了一种类sql标准规范,实现对链上数据的操作,该接口的逻辑架构如图3所示。该架构提供的类sql接口主要分为三层,分别是:[0100]1)sql解析层:主要对类sql语句进行分析,以提取出有用的参数,如insert及其所涉及的新增数据;[0101]2)分析匹配层:将提取出的参数与智能合约中的结构体或一些数据操作的方法进行匹配;[0102]3)合约调用层:若提取出的参数可以匹配到相应的结构体,则调用对应的方法对此结构体进行插入、更新及查询等操作。[0103](2)类sql接口操作规范[0104]通过类sql语句可对数据合约中的数据进行插入、更新及查询三种操作,对应为insert语句、update语句和select语句,其规范描述如下:[0105]insert语句(插入操作)[0106]sql语句格式为:[0107]insertintotable_name(column1,column2,column3,...,columni,…,columnn)[0108]values(value1,value2,value3,...,valuei,…,valuen);[0109]该sql语句与智能合约模型的对应关系如图4所示。[0110]其中,表中要插入的数据列column的个数等于智能合约函数function的个数,且顺序一一对应;另外,类sql语句中的columni数据列对应智能合约函数functiondatai(1≤i≤n)中所操作的结构体成员变量;而columni数据列的值valuei为智能合约中的结构体成员变量赋值。图中主键primarykey(columnp)对应智能合约中的mapping类型及函数入参,用来找到需要插入数据的目标结构体。通过insert语句调用智能合约中的对应方法,则完成数据的插入操作。[0111]update语句(更新操作)[0112]sql语句格式为:[0113]updatetable_name[0114]setcolumn1=value1,column2=value2,...[0115]wherecolumnp=valuep;[0116]该sql语句与智能合约模型的对应关系如图5所示。[0117]其中,update语句中需要更新的数据列columni的个数等于智能合约中函数的个数,且顺序一一对应;需要更新的数据列columni对应智能合约函数functionsetdatai(1≤i≤n)中需要更新的结构体成员变量及对应函数入参;更新数据列的值valuei为智能合约对应函数中的结构体成员变量赋值。update中where条件语句对应智能合约中函数的入参类型及mapping的主键columnp,其作用为找到需要更新的目标结构体;通过update语句调用智能合约中的对应方法,完成链上数据的更新操作。[0118]select语句(查询操作)[0119]sql语句格式:[0120]selectcolumn1,column2,…[0121]fromtable_name[0122]wherecolumnp=valuep;[0123]select*fromtable_name[0124]wherecolumnp=valuep;[0125]该sql语句与智能合约模型的对应关系如图6所示。[0126]其中,select语句中查询数据列columni的个数等于智能合约中函数function的个数,且顺序一一对应;需要查询的数据列columni对应智能合约函数functiongetdatai(1≤i≤n)中需要查询的结构体成员变量的值及作为对应函数的输出参数,where条件语句作为智能合约函数的入参及mapping中的主键,其作用为找到需要查询的目标结构体。若需要查询全部数据,即select语句中使用*,表示返回智能合约结构体中全部成员变量的值,只需对应智能合约中的一个函数getdata完成查询操作。[0127]链上合约模组化管理机制的研究[0128]本发明提出了一套智能合约模组化管理机制,针对链上部署运行的智能合约,支持智能合约的可插拔、可重组以及可升级,具体含义描述如下。[0129]首先将索引合约作为链上其他各模块合约的“管理员”,处在管理区,与合约区的合约打交道。对索引合约的定义如下:[0130]合约登记更新信息:[0131]“contract_name”=>“contract_version”=>“contract_address”[0132]由于索引合约中存储的合约名称与地址及版本号是唯一对应关系,则合约的命名是不可重复的,若新建重名合约,则会创建失败。[0133]合约状态信息:[0134]state:{available,disavailable}[0135]【可调用状态,禁用状态】[0136]mapping(address=>state)[0137]【通过合约地址查找当前的合约状态】c)合约调用关系信息:[0138]contract:{name,address}[0139]【合约名称及地址】[0140]mapping(address=>contract[])[0141]【若合约a调用合约b及合约c,则addressa=>[contractb,contractc]】[0142]在索引合约的支撑下,模组化管理机制得以有效运行,下面详细描述该机制的三个基本特性:[0143](1)合约可插拔[0144]合约可插拔是指针对部署上链的智能合约可以增加新的模块以及禁用已有的合约模块来适应业务改变。初始化时将索引合约、数据部分、逻辑部分分别部署上链,在索引合约中调用登记模块将已上链合约的地址、调用关系和合约状态(包括禁用状态、可调用状态)以指针的形式存储。[0145]如图7所示,假设合约区的逻辑合约a的功能不再需要,则禁用该合约,并在管理区的索引合约中删除该合约的地址以及涉及到该合约的调用关系,调用索引合约中更改状态的模块,将索引合约中存储的逻辑合约a的状态改为禁用。如果需要扩展新的功能,则插入新的合约如合约e、合约f并部署上链,重复初始化过程,在索引合约中加入新增合约的地址、调用关系以及合约状态,完成后可检查索引合约中新增合约状态是否为已调用,并和原有的模块合约(如逻辑合约b)建立新的调用关系。[0146](2)合约可重组[0147]合约可重组是指针对已部署上链的模块合约更改相互调用关系。如图8示例说明。合约区左半部分的初始化模块合约中逻辑合约a和逻辑合约b互相调用,逻辑合约b和逻辑合约c互相调用。逻辑合约对数据合约的调用如图中逻辑部分指向数据部分的黑线所示,例如逻辑a调用数据a。在建立如上的调用关系前需要先查看合约的状态是否禁用,如果是已禁用状态,证明合约已被拔除,则不能更改有关的调用关系,再对新建立的调用关系进行记录。[0148]上半部分管理区的索引合约在合约可重组模块用到的功能分别为合约状态的查看和更改,以及针对合约调用关系的记录和修改,灰色箭头指向的方形中分别是这两部分功能的抽象定义。[0149]合约区右半部分是重组后的合约,可以通过索引合约更改数据合约和逻辑合约间的调用关系,将逻辑合约a的数据部分改成数据合约b,而数据合约c的逻辑部分,也可以由逻辑合约c改成逻辑合约b。逻辑合约之间的调用关系也可以改变,例如将逻辑合约a的调用关系由逻辑合约b改成逻辑合约c。在修改调用关系之前需要调用索引合约检测索引合约中存储的即将调用的插件合约的状态是否可用。[0150](3)合约可升级[0151]合约可升级,顾名思义,就是对智能合约进行更新、升级等操作。升级操作可以包括插拔以及重组操作。[0152]见图9,如图左部分是管理区的索引合约,合约升级需要用到索引合约中的功能包括合约更新、合约状态修改、合约调用。[0153]根据用户需求所选择的模块合约进行合约组合,v1是最初版本,部署上链后需要在索引合约中登记合约,并且调用索引合约来获取合约最新的地址。v2和v3分别是插拔和重组后的新的合约。v2相对于v1禁用了属性合约a的功能,同时插入了新的合约e,在增加的同时需要调用索引合约进行合约登记初始化。v3在v2的基础上首先将属性合约b的功能完善,生成新的属性合约b’,升级后的合约会自动建立连接,属性合约b对数据合约1的调用关系改为升级后的属性合约b’调用数据合约1,同时针对属性合约b’与合约e增加了一些其他的调用关系。用户创建的这些不同版本的合约需要调用索引合约中的登记合约模块,进行合约名称地址及版本号的登记。最终按照版本v3作为当前执行合约,也就是通过一系列操作,完成了链上智能合约的升级。模组化管理机制是具有可升级特性的。[0154]本发明的具体实施例将介绍sc_dms智能合约可视化系统实施例的使用,说明其效果。[0155]sc_dms系统实现前面阐述的设计和管理思想,支持柔性设计模型,将逻辑与数据相分离,并支持通过简单的拖拽插件操作,设计智能合约,并可编译并部署上链。如图10所示,是逻辑基本属性合约所需的模板,主要包含ownable,time,erc20,transfer等插件,用户选择不同插件则会对应不同的代码块,组合后可生成右侧的智能合约代码。图11则展示了可自设计的插件模板库,包括柔性设计模型中基于状态机的逻辑属性合约、动作合作以及数据合约相关插件。系统组织方式是一系列插件模板,模板可以根据合约类型进一步展开,例如数据合约(data)展开后,显现有struct(数据结构)、mapping(address)、[](数组)和member(成员变量)。另外,系统还支持特定类型合约的扩展,比如权限管理合约(authority)、加密合约(encryption)等。[0156]下面将以两个具体实施例表示使用sc_dms系统以可视化拖拽插件的方式构建智能合约的方法。[0157](1)投票合约[0158]首先以投票合约作为第一实施例:为每个(投票)表决创建一份智能合约,并为(投票)表决命名。作为合约的生成者—即主席,将给予每个独立的地址以投票权。被给予投票权的地址可以选择自己投票,或委托给信任的人来投票。在投票时间结束时,票数最多的提案获胜。此例将使用柔性设计模型设计数据合约部分,并通过sc_dms系统可视化拖拽的方式生成对应的solidity代码。投票合约中需要存储两类数据,分别是:投票人的信息及提案信息,投票人的信息包括投票的权重(所拥有票数weight)、是否已完成投票(voted)、被委托投票人的地址(delegate)及投票的提案索引值(vote);提案信息包括:提案的简称名字(name)及此提案的得票数(votecount);由此,需要建立一份数据合约用于存储以上信息,用户选择数据合约插件,将两类数据以可视化的方式展示,即可自动完成数据合约solidity代码的生成,代码可部署于以太坊中进行调用。如图12为投票合约数据合约插件的生成过程示例图。[0159](2)盲拍合约[0160]以盲拍合约(参考fsolidm[22]提供的盲拍合约)作为第二实施例:以公开拍卖为基础,但投标人并未发送真实出价,而是发送了一个哈希版本的出价。主要流程为所有参与者均持有一个以太坊账户;发起人创建盲拍合约,创建时指定受益人、竞拍时间及揭晓时间;竞拍者在竞拍时间结束前,可以进行出价;竞拍者可以随时撤回自己的出价,并回收抵押资金;竞拍结束,价高者得。该第二实施例将柔性设计模型中逻辑状态合约的定义实例化,通过系统可视化的拖拽方式生成对应的solidity代码。在盲拍合约中,可以定义为五种状态:[0161]start:初始状态;[0162]acceptingblindedbids(abb):投标者创建投标书并且此投标书已被合约发起人所接受;[0163]revealbids(rb):到达规定时间,投标人公开投标书,合约检查与acceptingblindedbids状态下的投标书哈希值是否一致,是否提供足够的金额;[0164]finished(f):竞拍结束,价高者得;[0165]end:竞拍者可以随时撤回出价并回收抵押资金。[0166]如图13所示,是按照以上状态创建的基本状态属性合约以及对应的solidity智能合约代码部分。[0167]图14所示为基于状态机属性实现的盲拍合约完整拖拽图及对应的部分代码,在图14所生成的基本状态合约基础上进行扩充,使用有限状态机属性模板完成智能合约实例化。合约中所对应的一个函数包括更改前状态、更改后状态及触发状态转移条件和动作,如图14的中间部分多个虚线框所示。例如其中一个虚线框中,start状态通过触发了函数setup,转移为abb状态,函数setup中包含菱形块所代表的条件,其中一个方块action所代表的动作,具体生成的部分代码如图中上方虚线框所示;另一个虚线框中abb状态触发函数bid,执行函数bid结束后状态仍为abb状态,图中显示abb状态与bid函数之间形成闭环,函数bid中同样包括菱形块代表的条件及一个方块action所代表的动作,倒三角形形状setup代表对数据合约中存储的数据进行操作,具体生成的部分代码如图中上方虚线框所示。图14中的上下两部分虚线框为触发状态发生转移的所有函数的部分代码。[0168]从上述两个案例分析可知,sc_dms系统支持柔性设计模型,并可通过便捷的可视化工具高效完成智能合约的设计和代码生成工作。[0169]本发明的实施例:[0170](1)提出了一套链下柔性的智能合约设计模型,基于数据与逻辑分离的思想,利用模块化涉及思想,研究属性合约、动作合约及数据合约的组合,通过融合多种智能合约的设计模式,提炼出适合不同场景的插件式合约,从设计层面缓解智能合约“开发难”的问题。[0171](2)针对已经部署上链的智能合约,提出一套模组化管理机制,提出一套链上智能合约模组化管理机制,具有可插拔、可重组以及可升级的特性,同时,建立一种类sql语句的链上数据查询更新方法,支持链上智能合约的可插拔、可重组以及可升级,用于解决智能合约“维护难”的问题。[0172](3)提出一套面向链上数据合约的类sql数据操作接口,支持链上数据的查询和维护,可动态完成数据合约的内容更新,支持数据的查询、插入、更新等工作,可有效提高不同版本智能合约的数据迁移效率。研发了一套sc_dms原型系统,以插件模块的方式支持柔性设计模型、类sql数据查询和模组化管理机制,协同管控链上链下智能合约,为智能合约的高效开发和管理提供支持,有助于解决智能合约“管理难”的问题。[0173](4)本发明公开了一套可视化的智能合约组件式设计和管理系统sc_dms(smartcontractdesignandmanagementsystem),用户可根据实际需求。选择不同功能的合约插件进行组合,通过拖拽等操作简单快捷地生成用户自定义的智能合约。[0174]本发明提供柔性设计模型、模组化管理机制以及sc_dms系统,力求完成链下高效设计、链上动态维护以及链上链下协同管理的目标,为高质量智能合约的推广提供一种可行的研究思路和实践。[0175]虽然本发明已经参考特定的说明性实施例进行了描述,但是不会受到这些实施例的限定而仅仅受到附加权利要求的限定。本领域技术人员应当理解可以在不偏离本发明的保护范围和精神的情况下对本发明的实施例能够进行改动和修改。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1