一种基于Scala的区块链合约实现方法及系统与流程

文档序号:16066844发布日期:2018-11-24 12:45阅读:249来源:国知局

本发明涉及区块链技术领域,尤其涉及一种基于scala的区块链合约实现方法及系统。

背景技术

区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。

但是,随着区块链的广泛使用,出现需要适应更多的应用场景以及允许第三方编写、签名部署、签名调用合约的问题。



技术实现要素:

本发明提供的基于scala的区块链合约实现方法及系统,能够采用图灵完备、经过工程化实践检验的scala语言作为合约开发语言,扩展区块链的应用场景,同时由于采用通用、成熟的ide作为合约的开发调试工具,降低了合约开发调试的难度。

第一方面,本发明提供一种基于scala的区块链合约实现方法,包括:

在集成开发环境下静态编译合约,并通过接口抽象结合类反射机制实现合约接口调用;

通过唯一命名机制对合约类进行命名;

通过scalatest工具包对所编译合约进行测试;

将通过测试的合约通过deploy类型的签名交易共识入块、出块之后经类反射机制实现scala合约类的动态编译和加载合约后完成全网部署;

根据部署返回的合约标识对所述合约进行调用。

可选地,所述通过scalatest工具包对所编译合约进行测试包括:

通过scalatest工具包编写自动化测试用例;

遍历所编译合约的所有提供给外部交易请求调用的公开方法,用以测试所编译合约。

可选地,所述将通过测试的合约通过deploy类型的签名交易共识入块、出块之后经类反射机制实现scala合约类的动态编译和加载合约后完成全网部署包括:

将合约内容以文本方式写入区块链;

由交易请求调度类根据deploy类型的签名交易,新建对应的合约容器,并由合约容器经类反射机制实现scala合约类的动态编译和加载到内存并初始化;

由部署交易请求将返回的合约标识作为调用所述合约的指向,以使合约完成全网部署。

可选地,所述由合约容器经类反射机制实现scala合约类的动态编译和加载到内存并初始化包括:

定义抽象接口,并让合约类开放其被调用的时机;

通过唯一命名机制对合约类进行命名;

由动态编译工具类、加载工具类分别对合约类执行动态编译和加载。

可选地,所述定义抽象接口,并让合约类开放其被调用的时机包括:

初始化合约实例,并传入合约执行的上下文;

调用合约方法,传入合约数据并返回执行结果。

第二方面,本发明提供一种基于scala的区块链合约实现系统,包括:

编译单元,用于在集成开发环境下静态编译合约;

接口单元,用于通过接口抽象结合类反射机制实现合约接口调用;

命名单元,用于通过唯一命名机制对合约类进行命名;

测试单元,用于通过scalatest工具包对所编译合约进行测试;

合约部署单元,用于将通过测试的合约通过deploy类型的签名交易共识入块、出块之后经类反射机制实现scala合约类的动态编译和加载合约后完成全网部署;

调用单元,用于根据部署返回的合约标识对所述合约进行调用。

可选地,所述测试单元包括:

用例编写子单元,用于通过scalatest工具包编写自动化测试用例;

测试子单元,用于遍历所编译合约的所有提供给外部交易请求调用的公开方法,用以测试所编译合约。

可选地,所述合约部署单元包括:

入块子单元,用于将合约内容以文本方式写入区块链;

部署子单元,用于由交易请求调度类根据deploy类型的签名交易,新建对应的合约容器,并由合约容器经类反射机制实现scala合约类的动态编译和加载到内存并初始化;

合约标识子单元,用于由部署交易请求将返回的合约标识作为调用所述合约的指向,以使合约完成全网部署。

可选地,所述部署子单元包括:

抽象接口定义模块,用于定义抽象接口,并让合约类开放其被调用的时机;

命名模块,用于通过唯一命名机制对合约类进行命名;

动态编译加载模块,用于由动态编译工具类、加载工具类分别对合约类执行动态编译和加载。

可选地,所述抽象接口定义模块包括:

第一定义子模块,用于初始化合约实例,并传入合约执行的上下文;

第二定义子模块,用于调用合约方法,传入合约数据并返回执行结果。

本发明实施例提供的基于scala的区块链合约实现方法及系统,所述方法主要是通过采用scala语言作为合约脚本语言建立区块链合约,其中,采用scala语言建立区块链合约过程包括首先在集成开发环境下静态编译合约用以实现合约的编写,所述集成开发环境;其次通过类反射机制实现合约接口调用,以便于能够实现合约容器动态加载;然后,通过scalatest工具包对所编译合约进行测试,所述测试是在测试网络testnet下进行,并用以实现合约本地测试;最后,将通过测试的合约经动态编译和加载合约后完成全网部署以及后续合约调用。本实施例所述方法运用成熟的scala类反射机制、动态类编译、类加载技术首先实现采用图灵完备、经过工程化实践检验的scala语言作为合约开发语言;其次实现采用支持scala调试的通用ide作为合约调试ide;最后实现支持合约的动态即时编译和加载;大大扩展了区块链的应用场景,图灵完备的语言加上对key-value对的worldstate持久化支持,使得开发者能够根据应用场景编写对应的合约,提高所述区块链的多样性,扩大区块链的运用范围。

附图说明

图1为本发明一实施例基于scala的区块链合约实现方法的流程图;

图2为本发明另一实施例基于scala的区块链合约实现方法的流程图;

图3为本发明一实施例基于scala的区块链合约实现系统的结构示意图;

图4为本发明另一实施例基于scala的区块链合约实现系统的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供一种基于scala的区块链合约实现方法,如图1所示,所述方法包括:

s11、在集成开发环境下静态编译合约,并通过接口抽象结合类反射机制实现合约接口调用;

s12、通过唯一命名机制对合约类进行命名;

s13、通过scalatest工具包对所编译合约进行测试;

s14、将通过测试的合约通过deploy类型的签名交易共识入块、出块之后经类反射机制实现scala合约类的动态编译和加载合约后完成全网部署;

s15、根据部署返回的合约标识对所述合约进行调用。

本发明实施例提供的基于scala的区块链合约实现方法主要是通过采用scala语言(scala语言是一种能够执行于jvm和.net平台之上的通用编程语言。既可用于大规模应用程序开发,也可用于脚本编程,它由martinodersk于2001开发,2004年开始程序执行在jvm与.net平台之上。)作为合约脚本语言建立区块链合约,其中,采用scala语言建立区块链合约过程包括首先在集成开发环境下静态编译合约用以实现合约的编写,所述集成开发环境(ide:integrateddevelopmentenvironment,用于辅助开发计算机程序的应用软件);其次通过类反射机制实现合约接口调用,以便于能够实现合约容器动态加载(其中,所述合约接口是抽象出init初始化和onaction合约动作入口);然后,通过scalatest工具包对所编译合约进行测试,所述测试是在测试网络testnet下进行,并用以实现合约本地测试;最后,将通过测试的合约经动态编译和加载合约后完成全网部署以及后续合约调用。本实施例所述方法运用成熟的scala类反射机制、动态类编译、类加载技术首先实现采用图灵完备、经过工程化实践检验的scala语言作为合约开发语言;其次实现采用支持scala调试的通用ide作为合约调试ide;最后实现支持合约的动态即时编译和加载;大大扩展了区块链的应用场景,图灵完备的语言加上对key-value对的worldstate持久化支持,使得开发者能够根据应用场景编写对应的合约,提高所述区块链的多样性,扩大区块链的运用范围。

可选地,如图2所示,所述通过scalatest工具包对所编译合约进行测试包括:

通过scalatest工具包编写自动化测试用例;

遍历所编译合约的所有提供给外部交易请求调用的公开方法,用以测试所编译合约。

可选地,所述将通过测试的合约通过deploy类型的签名交易共识入块、出块之后经类反射机制实现scala合约类的动态编译和加载合约后完成全网部署包括:

将合约内容以文本方式写入区块链;

由交易请求调度类根据deploy类型的签名交易,新建对应的合约容器,并由合约容器经类反射机制实现scala合约类的动态编译和加载到内存并初始化;

由部署交易请求将返回的合约标识作为调用所述合约的指向,以使合约完成全网部署。

具体的,本实施例所述方法在合约编译和本地调试,即合约实现能够正确处理所有方法调用及输入数据后,对合约进行全网部署,首先通过deploy类型的签名交易,将部署请求提交到组网节点,节点预执行验证通过之后,广播到全网,由出块节点打包入块之后,部署完成。具体的,部署过程是将合约内容以文本方式写入区块链,同时交易请求调度类(transactionprocessor:向上接收交易请求并返回交易执行结果,向下管理与合约对应的一系列合约容器(合约容器实例,其中,每个合约容器实例对应一个特定的合约,不同的合约请求之间允许并发执行,相同的合约请求必须串行执行。一方面合约沙箱负责为合约执行准备上下文,另一方面,合约沙箱根据交易请求指定的合约标识找到合约内容,并将其动态编译、加载和执行交易指定的合约方法,传入交易指定的方法数据),调度类根据交易内容,决定将交易请求并行地在多个合约容器实例中执行,还是串行地在同一个合约容器实例中执行,支持对合约容器实例的缓存和复用以提高执行效率)根据部署交易请求(例如:deploy类型)的签名交易,新建一合约容器实例,由合约容器负责完成合约的动态编译、加载到内存并初始化,合约部署完成,最后部署交易请求(例如:deploy交易)将返回合约的唯一标识(即合约标识)作为后续调用合约的指向,进而实现通过签名交易调用合约方法。

可选地,所述由合约容器经类反射机制实现scala合约类的动态编译和加载到内存并初始化包括:

定义抽象接口,并让合约类开放其被调用的时机;

通过唯一命名机制对合约类进行命名;

由动态编译工具类、加载工具类分别对合约类执行动态编译和加载。

可选地,所述定义抽象接口,并让合约类开放其被调用的时机包括:

初始化合约实例,并传入合约执行的上下文;

调用合约方法,传入合约数据并返回执行结果。

具体的,本实施例所述方法首先定义抽象接口,让合约类开放其被调用的时机用以实现类接口,所有合约必须实现合约接口,包括以下两个合约接口方法:

用于初始化合约实例,并传入合约执行的上下文;

调用合约方法,传入合约数据,返回执行结果。

其次,采用唯一命名机制对合约命名用以实现合约类命名,由于,每一个具体的合约实现类,必须具有唯一的类命名,以避免类加载到缓存之后的命名冲突。对合约类代码提取主体部分执行sha256hash,作为类的唯一命名,再加上提取的代码主体,形成重新包装合约类,确保了相同代码逻辑映射到相同类名。

然后,由动态加载编译的工具类(即工具类complier)采用reflect.toolbox对合约类执行动态编译;

最后,由动态加载编译的工具类维护一个合约类的内存池,已加载的类直接复用,内存池中未加载的类,先尝试从scala的类加载器中加载(class.forname),如果类加载器加载失败(该类不存在于系统的类加载路径下),调用reflect.toolbox执行类的动态编译,并加载编译生成的结果。经过上述步骤实现scala合约类的动态编译和加载,进而完成合约的部署。

综上所述,一方面,在本实施例所述方法中合约的部署依赖合约的动态编译和加载,主要是由于合约在本地完成调试之后,通过deploy请求以文本形式存放到区块链数据中,需要解决合约在运行期的动态加载和执行的问题。

另一方面,本实施例所述方法采用scala合约类的动态编译和加载,利用scala是运行在jvm之上的同时支持面向对象编程和函数式编程的多范式编程语言,并且scala内置的repl模式具备对字符串表达式的运行期编译和执行的能力;同时scala还可提供reflect.toolbox工具类,用以在运行期动态编译类。

最后,本实施例所述方法在合约部署完成之后,可以根据部署返回的合约标识对其进行调用,调用由invoke类型的签名交易发起,签名交易中指定要调用的合约标识,以及要调用的方法名action,符合该方法的输入数据格式的输入数据。交易请求调度类(transactionprocessor)对于invoke类型的交易,将根据合约标识找到对应的合约容器实例,向其发送交易请求,合约容器收到请求之后,准备合约上下文,然后向已经完成动态编译和加载的合约实现实例,调用其onaction方法,传入输入数据。

本发明实施例还提供一种基于scala的区块链合约实现系统,如图3所示,所述系统包括:

编译单元10,用于在集成开发环境下静态编译合约;

接口单元11,用于通过接口抽象结合类反射机制实现合约接口调用;

命名单元12,用于通过唯一命名机制对合约类进行命名;

测试单元13,用于通过scalatest工具包对所编译合约进行测试;

合约部署单元14,用于将通过测试的合约通过deploy类型的签名交易共识入块、出块之后经类反射机制实现scala合约类的动态编译和加载合约后完成全网部署;

调用单元15,用于根据部署返回的合约标识对所述合约进行调用。

本发明实施例提供的基于scala的区块链合约实现系统主要是通过采用scala语言作为合约脚本语言建立区块链合约,其中,采用scala语言建立区块链合约过程包括首先在集成开发环境下静态编译合约用以实现合约的编写,所述集成开发环境;其次通过类反射机制实现合约接口调用,以便于能够实现合约容器动态加载;然后,通过scalatest工具包对所编译合约进行测试,所述测试是在测试网络testnet下进行,并用以实现合约本地测试;最后,将通过测试的合约经动态编译和加载合约后完成全网部署以及后续合约调用。本实施例所述系统运用成熟的scala类反射机制、动态类编译、类加载技术首先实现采用图灵完备、经过工程化实践检验的scala语言作为合约开发语言;其次实现采用支持scala调试的通用ide作为合约调试ide;最后实现支持合约的动态即时编译和加载;大大扩展了区块链的应用场景,图灵完备的语言加上对key-value对的worldstate持久化支持,使得开发者能够根据应用场景编写对应的合约,提高所述区块链的多样性,扩大区块链的运用范围。

可选地,如图4所示,所述测试单元13包括:

用例编写子单元131,用于通过scalatest工具包编写自动化测试用例;

测试子单元132,用于遍历所编译合约的所有提供给外部交易请求调用的公开方法,用以测试所编译合约。

可选地,所述合约部署单元14包括:

入块子单元141,用于将合约内容以文本方式写入区块链;

部署子单元142,用于由交易请求调度类根据deploy类型的签名交易,新建对应的合约容器,并由合约容器经类反射机制实现scala合约类的动态编译和加载到内存并初始化;

合约标识子单元143,用于由部署交易请求将返回的合约标识作为调用所述合约的指向,以使合约完成全网部署。

可选地,所述部署子单元142包括:

抽象接口定义模块,用于定义抽象接口,并让合约类开放其被调用的时机;

命名模块,用于通过唯一命名机制对合约类进行命名;

动态编译加载模块,用于由动态编译工具类、加载工具类分别对合约类执行动态编译和加载。

可选地,所述抽象接口定义模块包括:

第一定义子模块,用于初始化合约实例,并传入合约执行的上下文;

第二定义子模块,用于调用合约方法,传入合约数据并返回执行结果。

本实施例的系统,可以用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1