技术领域
[0001] 本发明涉及区块链领域,尤其涉及一种WASM智能合约开发套件及其开发方法。
相关背景技术
[0002] 随着区块链技术的快速发展,智能合约作为一种自动化执行合同条款的协议,已经在金融服务、供应链管理、医疗健康、政务服务等领域得到了广泛应用。智能合约的概念最开始是在1994年,由知名密码学家尼克·萨博(Nick Szabo)提出,直到以太坊(Ethereum)平台的出现,智能合约才真正得到广泛应用。以太坊设计了一种高级编程语言Solidity来编写智能合约,并设计了EVM虚拟机来执行合约字节码。
[0003] 随着WASM(WebAssembly)技术出现,它作为一种可移植、性能优越的虚拟机技术,已经在Web应用领域得到广泛应用。近年来,很多国内外流行的区块链使用WASM技术实现了智能合约,常见的如FISCO BCOS的Liquid、Substrate的!ink等,它们使用rust强大的宏系统,通过元编程技术实现了专用的eDSL来编写智能合约。
[0004] 传统的智能合约开发主要使用如Solidity(以太坊)等特定的智能合约编程语言,这些专用语言往往具有学习曲线陡峭、生态系统相对封闭等问题,使得开发者在使用中面临诸多挑战。WASM作为智能合约的底层技术能提供比EVM更高的安全性与性能,还能支持多种常见开发语言编写智能合约,然而rust语言以其所有权系统、生命周期与复杂的类型系统等,使得学习曲线陡峭,开发成本较高。
[0005] 因此,现在亟需一种简单通用、安全高效的WASM智能合约开发套件来解决上述问题。
具体实施方式
[0033] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0034] 需要说明的是,本发明实施例中所提供的图示仅以示意方式说明本发明的基本构想,因此图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
[0035] 在本发明中,还需要说明的是,如出现术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等,其所指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本申请和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本申请的限制。此外,如出现术语“第一”、“第二”仅用于描述和区分目的,而不能理解为指示或暗示相对重要性。
[0036] 本发明实施例WASM智能合约开发套件的开发方法,主要是构建包括WASM接口、开发语言和开发工具的WASM智能合约开发套件以供开发者编写WASM智能合约,旨在简化智能合约开发过程,提升智能合约的开发效率。
[0037] 其中:
[0038] WASM接口包括合约接口和环境接口;节点与WASM虚拟机之间通过WASM接口进行交互,其中节点通过调用合约接口执行合约代码,WASM虚拟机通过调用环境接口获取节点的环境数据、返回合约执行数据;
[0039] 开发语言为按照智能合约的特定场景进行模块化设计,各个模块均通过封装环境接口中的相应接口实现相应的功能,通过开发工具自动构建或者提供具体的语法给开发者使用;
[0040] 开发工具为可视化的WASM智能合约集成开发环境,用于给开发者提供合约创建、代码编辑、合约编译功能。
[0041] 本发明的WASM智能合约开发套件的合约字节码使用WASM,以简单通用的编程语言(如C++,也可以根据需要选择其他编程语言)为基础,结合智能合约的特定场景,设计了WASM接口,提供简洁易用的开发语言与开发工具,旨在简化智能合约开发过程,提升智能合约的开发效率。
[0042] WASM接口:如图1所示,节点(node)与WASM虚拟机之间通过“WASM接口”进行交互,节点通过调用“合约接口”执行合约代码,WASM虚拟机通过调用“环境接口”获取节点环境数据、返回合约执行数据等。
[0043] 其中,环境接口包括:
[0044] Input API:获取输入数据的接口;
[0045] Output API:返回输出数据的接口;
[0046] Context API:获取合约执行的上下文信息,如区块高度、时间戳、合约调用者、合约地址等信息;
[0047] Storage API:合约状态数据的存储接口;
[0048] Oracle API:预言机数据获取接口;
[0049] Logs API:合约执行过程中的事件日志返回接口;
[0050] Other API:交易回滚、异常信息返回等接口。
[0051] 合约接口中Deploy API是合约部署接口,执行流程如图2所示。Main API是合约调用接口,执行流程如图3所示。Deploy API与Main API没有输入参数与输出参数,输入参数的获取通过调用环境Input API实现,输出参数的返回通过调用环境Output API实现。Deploy API会调用智能合约的构造方法,开发者可以在合约的构造方法中实现合约初始化的相关操作。Main API是调用合约的入口,内部通过函数签名ID判断执行那个合约方法(合约方法是智能合约中对外公开,可以被调用的一系列函数)。
[0052] 函数签名ID是合约方法签名哈希后的前4个字节,例如合约方法set_name(string),通过计算“set_name(string)”的哈希,取前四个字节作为函数签名ID,这里哈希可选keccak256\SM3等。输入输出参数需要进行序列化编码后进行传输,这里使用scale(Simple Concatenated Aggregate Little‑Endian)序列化。
[0053] 开发语言:如图4所示,按照智能合约的特定场景,对开发语言进行模块化设计,主要分为数据类型模块、合约执行模块、合约事件模块、异常处理模块、合约预言机模块与合约上下文模块等。这里合约执行模块由开发工具自动构建,其他模块提供具体的语法给开发者使用。
[0054] 数据类型模块提供基础数据类型、复合数据类型以及状态变量类型等,基础数据类型包括无符号整数类型(u8、u16、u32、u64、u128、u256)、有符号整数类型(i8、i16、i32、i64、i128、i256)、字符串类型(string)、地址类型(address)与布尔类型(bool)等。复合数据类型包括枚举(enmu)、数组、结构体(struct)等。
[0055] 状态变量类型包括单值变量、映射变量、向量变量等。在C++语言基础上去掉了libc,使用C++类模块对数据类型进行重新定义,进行了运算符重载,对环境接口Storage API进行封装,实现了状态变量数据的持久化存储。
[0056] 合约执行模块实现了Deploy API与Main API,通过对环境接口的封装,实现了图2与图3的执行流程,这是智能合约的主要入口,具体通过开发工具自动实现。
[0057] 合约事件模块实现了合约事件的发送功能,通过封装环境接口Logs API提供emit语句发送智能合约的日志信息。
[0058] 合约异常模块实现了合约的交易回滚、异常信息返回等功能,通过封装环境接口Other API提供revert、error等语句来进行处理异常。
[0059] 合约预言机模块实现了合约的访问外部可信数据的功能,通过封装环境接口Oracle API提供预言机相关的接口来实现。
[0060] 合约上下文模块实现了合约执行时访问节点环境数据的功能,包括获取区块高度、时间戳、合约调用者、合约地址等信息,通过封装环境接口Context API来实现getBlockNumber、getTimestamp、getSender、getAddress等接口。
[0061] 以上通过对C++语言以及环境接口的封装,实现了的智能合约开发过程中所需的各种数据类型、入口函数、合约特性相关数据结构及API等语法。
[0062] 开发工具:是一个可视化的WASM智能合约集成开发环境(IDE),给开发者提供合约创建、代码编辑、合约编译等功能。开发者通过IDE进行智能合约的编写,可以使用开发语言提供的各种数据类型、数据结构和API等语法实现业务逻辑的相关合约接口。
[0063] 开发流程如图5所示,开发者使用WASM智能合约IDE,具体通过创建合约项目的功能,选择一个IDE中集成的智能合约场景模板,快速创建智能合约项目,然后通过IDE提供的代码编辑功能进行智能合约的代码编辑,最后通过合约编译功能生成最终的字节码与合约描述文件(合约的名称、生成时间、版本、接口描述等)。
[0064] WASM智能合约IDE中合约编译功能最为重要,集成了合约预处理、编译及优化的核心功能。
[0065] 合约预处理中,结合WASM接口与合约开发语言,对开发者编写的简单合约代码进行解析及底层代码的重构,这样做的好处是开发者不用关心复杂的WASM接口以及底层逻辑代码如何实现,可以大大减少开发工作量,并杜绝了底层代码编写时出错的可能。合约预处理主要分为语法解析、部署接口代码与执行接口代码的生成等。
[0066] 语法解析中,在IDE中集成了libclang库,对开发者开发的C++合约代码进行语法解析,主要获取合约类名称、合约类构造方法(函数名称、输入参数、函数体等)、合约类成员方法(函数名称、输入参数、输出参数、函数体等)与合约类成员变量(类型、名称等)等,并检查合约代码的语法是否正确,下一步通过解析的合约语法信息进行底层代码的重构。
[0067] 部署接口代码生成中,会生成一个Deploy API的WASM接口,并声明为WASM的导出接口(可以被外部调用),并自动生成图2所示Deploy执行流程的相关代码。主要是对语法解析中的构造函数信息进行处理,首先通过Input API获取输入数据,然后对输入数据进行解码获取执行参数,最后生成构造函数中的相关初始化代码。
[0068] 执行接口代码生成中,会生成一个Main API的WASM接口,并声明为WASM的导出接口(可以被外部调用),并自动生成图3所示Main执行流程的相关代码。主要是对语法解析中的成员函数信息进行处理,首先通过Input API获取输入数据,对输入数据解码获取需要执行的函数ID,然后匹配函数ID,执行指定的合约接口代码。执行合约接口代码时需要对输入数据进行进一步解码,获取输入数据,执行完成后,需要对输出数据进行编码,并使用Output API接口返回数据。输入输出数据的获取严格按照语法解析中的成员函数定义生成,最终执行的逻辑就是成员函数中定义的具体代码。
[0069] 另外在部署接口与执行接口的生成中,涉及访问状态变量时会生成调用Storage API的相关代码,涉及发送合约事件时会生成调用Logs API的相关代码,涉及访问上下文数据(区块高度、时间戳、合约调用者、合约地址等信息)时会生成调用Context API的相关代码,涉及异常错误时会生成调用Other API的相关代码,涉及预言机操作时会生成调用Oracle API的相关代码。
[0070] 合约编译结合了WASM技术的多语言支持特性,在IDE中集成了编译器Emscripten,选择wasm32‑unknown‑unknown编译目标,对预处理后的C++智能合约代码进行编译。这样简化了开发者通过配置编译环境,使用命令编译合约的复杂过程,实现了一键可视化的自动编译功能,隐藏了编译细节,进一步简化了开发流程。
[0071] 合约优化通过集成wasm‑opt工具,对编译后的WASM字节码进行‑O3优化,进一步减小了合约字节码的体积,最终得到一个优化的.wasm格式的字节码文件。
[0072] 需要指出,根据实施的需要,可将本申请中描述的各个步骤/部件拆分为更多步骤/部件,也可将两个或多个步骤/部件或者步骤/部件的部分操作组合成新的步骤/部件,以实现本发明的目的。
[0073] 上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
[0074] 应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。