一种部署智能合约的方法、区块链节点和存储介质与流程

文档序号:22502194发布日期:2020-10-13 09:36阅读:121来源:国知局
一种部署智能合约的方法、区块链节点和存储介质与流程

本说明书实施例属于区块链技术领域,尤其涉及一种部署智能合约的方法、区块链节点和存储介质。



背景技术:

区块链(blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链2.0时代中出现了智能合约,将区块链的应用范围提升到了一个新高度。有了智能合约,区块链能做的不再是单一的转账交易,而是还可以调用一段代码,而这段代码可以由用户自定义。



技术实现要素:

本说明书在于提供一种部署智能合约的方法、区块链节点和存储介质。

本说明书实施例提供的一种部署智能合约的方法、区块链节点和存储介质,通过以下方式实现:

一种部署智能合约的方法,包括:

客户端将智能合约的字节码发送至编译服务方,并接收所述编译服务方对所述字节码进行aot编译得到的机器码;

区块链节点接收所述客户端提交的创建智能合约的交易,所述交易中包括所述智能合约的机器码;

所述区块链节点在确定所述机器码由可信编译服务方对所述字节码进行编译得到的情况下,完成所述智能合约的部署。

一种部署智能合约的方法,包括:

区块链节点接收创建智能合约的交易,所述交易中包括所述智能合约的机器码,所述机器码由编译服务方对所述智能合约的字节码进行aot编译得到;

所述区块链节点在确定所述机器码由可信编译服务方对所述字节码进行编译得到的情况下,完成所述智能合约的部署。

一种部署智能合约的区块链节点,执行上述的方法。

一种部署智能合约的区块链节点,包括:

处理器,

存储器,存储有程序,其中在所述处理器执行所述程序时,执行上述的方法。

一种存储介质,用于存储程序,其中所述程序在被执行时进行上述方法的操作。

通过上述本说明书的实施例,客户端在将智能合约部署至区块链之前,预先将该智能合约的字节码发送至编译服务方进行aot编译为相应的机器码,使得区块链上直接部署智能合约的机器码,从而在调用智能合约时可以基于所部署的机器码实现高效运行。由于机器码自身的特性,使得机器码可执行的操作远多于字节码,随之也会带来更多的风险,比如造成区块链节点处存储的隐私数据的泄露、影响区块链节点的稳定运行等。因而,对于创建智能合约的交易,可以通过限制该交易所含机器码的编译服务方,由可信编译服务方对机器码的安全性背书,而避免非可信编译服务方编译生成的机器码部署至链上,从而降低或消除前述的风险。

附图说明

图1是一实施例中的编译执行和解释执行的原理示意图;

图2是一实施例中的解释执行和jit的原理示意图;

图3是一实施例的创建智能合约的图示过程;

图4是一实施例的调用智能合约的图示过程;

图5是一实施例中的创建智能合约和调用智能合约的示意图;

图6是一实施例中的部署智能合约的流程图;

图7是一实施例中的区块链节点的模块结构图;

图8是另一实施例中的创建智能合约和调用智能合约的示意图;

图9是一实施例中的创建智能合约和调用智能合约过程中包含虚拟机执行过程的示意图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。

需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。

区块链1.0时代通常是指在2009年到2014年之间,以比特币为代表的区块链应用发展阶段,它们主要致力于解决货币和支付手段的去中心化问题。从2014年开始,开发者们越来越注重于解决比特币在技术和扩展性方面的不足。2013年底,vitalikbuterin发布了以太坊白皮书《以太坊:下一代智能合约和去中心化应用平台》,将智能合约引入区块链,打开了区块链在货币领域以外的应用,从而开启了区块链2.0时代。

智能合约是一种基于规定触发规则的,可自动执行的计算机合约,也可以看作是传统合约的数字版本。智能合约这一概念最早由跨领域法律学者、密码学研究工作者尼克·萨博(nickszabo)在1994年提出。这项技术曾一度因为缺乏可编程数字系统和相关技术而没有被用于实际产业中,直到区块链技术和以太坊的出现为其提供了可靠的执行环境。由于区块链技术采用的块链式账本,产生的数据不可篡改或者删除,且整个账本将不断新增账本数据,从而保证了历史数据的可追溯;同时,去中心化的运行机制避免了中心化因素的影响。基于区块链技术的智能合约不仅可以发挥智能合约在成本、效率方面的优势,而且可以避免恶意行为对合约正常执行的干扰。将智能合约以数字化的形式写入区块链中,由区块链技术的特性保障存储、读取、执行整个过程透明可跟踪、不可篡改。

智能合约本质上是一段可由计算机执行的程序。智能合约与现在广泛使用的计算机程序一样,可以通过高级语言(例如c语言、c++语言等)编写而成。由高级语言编写好的智能合约的程序代码,一般可以通过“编译器”转换为计算机的cpu可以识别和运行的“机器码”,进而可以由cpu执行这样的机器码(或者称为“微处理器指令”)。这种方式一般称为“编译执行”。

编译执行一般不具有跨平台的可扩展性。由于存在不同厂商、不同品牌和不同代的cpu,而这些不同的cpu支持的指令集很多情况下是不同的,如x86指令集,arm指令集等,且同一厂商同一品牌但不同代的cpu(如不同代的intelcpu)支持的指令集也不完全相同,因此,用同样的高级语言编写的同样的程序代码,在不同cpu上被编译器转换出来的机器码可能不同。具体的,编译器在转换高级语言编写的程序代码到机器码的过程中,会结合具体的cpu指令集的特点(如向量指令集等)进行优化以提升程序执行的速度,而此类优化往往与具体的cpu硬件相关。这样,同样的机器码,一个在x86上可以运行,但另一个在arm上就可能无法运行;甚至同样是x86平台,随着时间的推移,指令集也不断丰富和扩展,这就导致不同代的x86平台运行的机器码也有不同。而且,由于执行机器码需要由操作系统内核对cpu进行调度,因此即使是同样的硬件,在不同操作系统下支持运行的机器码也可能不同。

不同于编译执行,还存在一种“解释执行”的程序运行方式。比如java语言,将java源代码通过java的编译器编译成标准的字节码(bytecode),这里编译器不针对任何实际的硬件处理器的指令集,而是定义了一套抽象的标准指令集。编译成的标准字节码一般无法在硬件cpu上直接运行,因此引入了一个虚拟机,即jvm,jvm运行在特定的硬件处理器上,用以解释和执行编译后的标准字节码。

jvm是javavirtualmachine(java虚拟机)的缩写,是一种虚构出来的计算机,往往通过在实际的计算机上仿真模拟各种计算机功能来实现。jvm屏蔽了与具体的硬件平台、操作系统等相关的信息,使java程序只需要是生成的可在java虚拟机上运行的标准字节码,就可以在多种平台上不加修改地运行。

java语言的一个非常重要的特点就是与平台的无关性。而使用java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入java语言虚拟机后,java语言在不同平台上运行时不需要重新编译。java语言使用java虚拟机屏蔽了与具体平台相关的信息,使得java语言编译程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是java能够“一次编译,到处运行”的原因。

jvm运行在特定的硬件处理器上,负责针对所运行的特定处理器而进行字节码的解释和执行,并向上屏蔽这些底层的差异,呈现给开发者以标准的开发规范。jvm在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。具体的,jvm接收到输入的字节码后,逐句解释其中的每一条指令,并翻译成适合当前机器的机器码来运行,这些过程例如由称为interpreter的解释器进行解释和执行。这样一来,编写java程序的开发者不需要考虑编写后的程序代码将运行在哪种硬件平台上。jvm本身的开发是由java组织的专业开发人员完成,以将jvm适配到不同的处理器架构上。迄今为止,主流的处理器架构只有有限的几种,如x86,arm,risc-v,mips。专业的开发人员将jvm分别移植到支持这几种特定硬件的平台后,java程序理论上就可以在所有的机器上运行了。jvm的移植工作通常由java开发组织专业的人员提供的,这就极大减轻了java应用开发者的负担。

解释执行带来了跨平台可移植性,但由于bytecode的执行经历了jvm中间翻译的过程,因此执行效率不如上述编译执行效率高,这种效率的差异有时甚至可达几十倍。

图1示出了编译执行和解释执行的共同点和不同点。不论是解释执行还是编译执行,也不论是物理机还是虚拟机,对于应用程序,机器都不可能如人那样阅读、理解,然后就获得了执行能力。大部分的程序代码到物理机的目标代码或虚拟机能执行的指令集之前,都需要经过图1中的各个步骤。图1中从顶部到左边的那条分支就是传统编译原理中程序代码到目标机器代码的生成过程,从顶部到右边的那条分支是解释执行的过程。如今,基于物理机、java虚拟机,或者非java的其他高级语言虚拟机(high-levellanguagevirtualmachine,hllvm)的语言,大多都会遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法分析和语法分析处理,把源码转化为抽象语法树(abstractsyntaxtree,ast)。对于一门具体语言的实现来说,词法分析、语法分析以至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是c或c++语言。也可以选择把其中一部分步骤(如生成抽象语法树之前的步骤)实现为一个半独立的编译器,这类代表是java语言。又或者把这些步骤和执行引擎全部集中封装在一个封闭的黑匣子之中,如大多数的javascript执行器。

为了尽可能的兼顾跨平台可移植性和高性能,即时编译器(just-in-timecompiler,jit)的概念被提出。jit的核心思想是“如何高效避免解释指令的重复工作”。计算机程序中存在大量重复执行的代码,比如某些计算“函数”在一个程序执行过程中可能被循环调用了很多次。如果是解释执行,则循环过程的每次执行都要对这个函数进行字节码到机器码的翻译。然而实际情况是,这个函数在几十次的翻译中产生的机器码都是完全一样的。很自然的,在第一次翻译后,将翻译好的函数的机器码缓存下来,后续再次执行的过程中,不需要再次翻译,而是直接使用缓存好的代码,这样可以提高执行效率。

相反的,有些函数在程序运行周期过程中只执行了一次(比如启动初始化),那么这类函数就不需要缓存,直接解释执行一次即可。因此jit技术中一个核心的模块就是“热点分析”,即通过程序执行过程中分析出哪些代码执行了多次,从而对其翻译后的机器码进行缓存。对于执行次数较少的操作,不需要进行缓存。这样可以在执行效率和内存开销上达到最佳平衡。

此外,jit技术中的另一个核心的模块是编译优化(或称为优化编译)。直接翻译的机器码,没有结合上下文进行优化,仅仅是将高频的机器码缓存下来,性能提升有限。如果要获得更好的性能,可以对编译器进行进一步的优化。编译优化的方式,一般需要相对更多的时间来实现。

jit的工作原理例如图2中所示。java源代码经过java编译器编译后生成一段java字节码,经过热点分析后被分发到两个执行路径上(jitcompiler和interpreter)。被判断为热点(高频执行)的代码经jitcompiler中进行编译得到机器码,缓存并执行,一般是由cpu在操作系统(operatingsystem,os)的控制下执行。低频的进入解释器(interpreter),翻译成机器码后由cpu在os的控制下执行。

由于程序代码本身的前后关联性,编译过程往往存在较大的优化空间。优化后的机器码,执行效率会远高于直接翻译的机器码。如果要获得更好的性能,编译器的优化是必须的。jitcompiler编译的过程可能比较耗时。特别是jitcompiler在第一次编译字节码的过程可能耗时很长,甚至不如解释执行。那么,对于某些java程序,如果热点不是很突出,即整体的执行频度都不是很高,而整体执行流程又很长的,jit就很难发挥出编译执行的优势。

此外,还有一种想法被提出,就是aot(aheadoftime)。aot相当于一种预编译执行的方法。在程序运行前针对目标执行环境对字节码进行一次编译,得到机器码,再将机器码部署到目标机器上执行。aot的运行效率可以达到编译执行的效果。在aot时需要明确知道目标系统的硬件、指令集架构和系统等,确保编译后代码可以运行。而且,一般来说同样功能的指令,用机器码表达所需的语句量会大于字节码,更大于高级语言编写的代码,这样,同样内容的程序,很可能机器码的大小>字节码的大小>高级语言代码的大小。在明确知道目标系统的硬件、指令集架构和系统等情形的前提下,可以通过aot将字节码编译为机器码。同时,不同类别的目标系统的机器码是不同的,因此,为了各种目标系统上都可以有对应的正确执行的机器码,可能需要将不同版本的机器码都提供。这样,机器码的总大小一般会大于字节码或是高级语言代码。

例如,android在5.0版本以前采用dalvik虚拟机,而在5.0版本以后采用了art虚拟机。dalvik是采用jit编译器去解释字节码,而art则是aot机制。art方式在应用安装时就预编译字节码(androidapp的安装过程实际上是安装程序的字节码)到机器码。在移除解释代码这一过程后,android上的应用程序执行更有效率,启动更快。

区块链中作为一个去中心化的分布式系统,需要保持分布式一致性。具体的,分布式系统中的一组节点,每个节点都内置了状态机。每个状态机需要从相同的初始状态起,按相同的顺序执行相同的指令,保持每一次状态的改变都相同,从而保证最终达到一致的状态。而参与到同一区块链网络的各个节点设备很难都是同样的硬件配置和软件环境。因此,在区块链2.0中的代表以太坊中,为了保证各个节点上执行智能合约的过程和结果是相同的,采用了类似于jvm的虚拟机——以太坊虚拟机(ethereumvirtualmachine,evm)。通过evm可以屏蔽各个节点硬件配置和软件环境的差异性。这样,开发者可以开发一套智能合约的代码,并将该智能合约的代码在开发者本地编译后将编译得到的字节码(bytecode)上传到区块链。各个节点以相同的初始状态通过相同的evm解释执行相同的字节码后,能够得到相同的最终结果和相同的中间结果,并可以屏蔽不同节点底层的硬件和环境差异。这样,去中心化的区块链技术的出现,才使得早在1994年就提出的智能合约得以实现,并且,由于去中心化的实现必然面临不同执行机器的硬件和运行环境差异,进一步以解释执行的方式对智能合约处理,以保证在去中心的多种不同硬件和运行环境的机器上能够得到相同的执行结果。

evm是一个图灵完备的虚拟机,这意味着可以通过它实现各种复杂的逻辑,这也是以太坊作为区块链2.0的代表相对于区块链1.0的最大改进之一。用户在以太坊中发布和调用智能合约可以在evm上运行。如前所述,evm直接运行的是字节码,部署在区块链上的智能合约可以是字节码的形式。

例如图3所示,bob将一个包含创建智能合约信息的交易发送到以太坊网络后,节点1的evm可以执行这个交易并生成对应的合约实例。交易的data字段保存的可以是字节码,交易的to字段可以为一个空的地址。节点间通过共识机制达成一致后,这个合约成功创建,后续用户可以调用这个合约。

合约创建后,区块链上出现一个与该智能合约对应的合约账户,并拥有一个特定的地址,合约代码和账户存储可以保存在该合约账户中。智能合约的行为由合约代码控制,而智能合约的账户存储则保存了合约的状态。换句话说,智能合约使得区块链上产生包含合约代码和账户存储的虚拟账户。

前述提到,包含创建智能合约的交易的data字段保存的可以是该智能合约的字节码。字节码由一连串的字节组成,每一字节可以表明一个操作。基于开发效率、可读性等多方面考虑,开发者可以不直接书写字节码,而是选择一门高级语言编写智能合约代码。高级语言编写的智能合约代码,经过编译器编译,生成字节码,进而该字节码可以部署到区块链上。以太坊支持的高级语言很多,如solidity、serpent、lll语言等。

以solidity语言为例,用其编写的合约与面向对象编程语言中的类(class)很相似,在一个合约中可以声明多种成员,包括状态变量、函数、函数修改器、事件等。状态变量是永久存储在智能合约的账户存储中的值,用于保存合约的状态。

如下是以solidity语言编写的一个简单的智能合约的代码示例1:

contractexample{

intbalance;

functionc(){

balance+=1;

}

functiongetbalance()returns(int){

returnbalance;

}

}

一般的,这个合约部署在区块链后,“balance”这个状态变量可以是在合约中新定义的一种资产类型。functionc()这个函数可以定义balance的变化操作,functiongetbalance()returns(int)这个函数可以定义取当前balance的值并返回的操作。

此外,如图4所示,仍以以太坊为例,bob将一个包含调用智能合约信息的交易发送到以太坊网络后,节点1的evm可以执行这个交易并生成对应的合约实例。图4中交易的from字段是发起调用智能合约的账户的地址,to字段中的“0x692a70d2…”代表了被调用的智能合约的地址,value字段在以太坊中是以太币的值,交易的data字段保存的是调用智能合约的方法和参数。调用智能合约后,balance的值可能改变。后续,某个客户端可以通过某一区块链节点查看balance的当前值。

智能合约可以以规定的方式在区块链网络中每个节点独立的执行,所有执行记录和数据都保存在区块链上,所以当这样的交易完成后后,区块链上就保存了无法篡改、不会丢失的交易凭证。

创建智能合约和调用智能合约的示意图如图5所示。以太坊中要创建一个智能合约,需要经过编写智能合约、变成字节码、部署到区块链等过程。以太坊中调用智能合约,是发起一笔指向智能合约地址的交易(可以通过交易中的to字段指向智能合约的地址),智能合约代码分布式的运行在以太坊网络中每个节点的虚拟机中。

创建智能合约的交易发送到区块链网络上,经过共识之后,各个区块链节点可以执行这个交易。具体的,可以是由区块链节点的evm或wasm来执行这个交易。如前所述,这时区块链上出现一个与该智能合约对应的合约账户(包括例如帐户的标识identity,合约的hash值codehash,合约存储的根storageroot),并拥有一个特定的地址,合约代码和账户存储可以保存在该合约账户的存储(storage)中,如图9所示。智能合约的行为由合约代码控制,而智能合约的账户存储则保存了合约的状态。换句话说,智能合约使得区块链上产生包含合约代码和账户存储的虚拟账户。对于合约部署交易或者合约更新交易,将产生或变更codehash的值。后续,区块链节点可以接收调用部署的智能合约的交易请求,该交易请求可以包括调用的合约的地址、调用的合约中的函数和输入的参数。一般的,该交易请求经过共识后,区块链各个节点可以各自独立执行指定调用的智能合约。具体的,如图9所示,节点可以根据合约的地址将合约的字节码(bytecode)从存储载入虚拟机(evm或wasm)中;进而,由解释器(interpreter)解释执行,例如包括对调用的合约的字节码进行解析,得到操作码(opcode),并将这些opcode存储虚拟机的memory中,同时还得到调用的函数的地址;经过对执行合约所需要消耗的gas进行计算且gas足够后,跳转到memory的对应地址取得所调用函数的opcode并开始执行,将所调用到的函数的opcode所操作的数据进行计算(datacomputation)、推入或推出栈(stack)等的操作,从而完成数据计算。这个过程中,还可能需要一些合约的上下文(context)信息,例如区块号、调用合约的发起者的信息之类,这些信息可以从context中得到(get操作)。最后,将产生的状态通过调用存储接口以存入存储(storage)中。需要说明的是,合约创建的过程中,也可能产生对合约中某些函数的解释执行,例如初始化操作的的函数,这时也会解析代码、产生跳转指令,存入memory,在stack中操作数据等。上述涉及的解释执行过程中,一般来说,对重复执行的函数并不缓存,即使对于多次执行的函数,虚拟机也需要重复进行解析、执行的过程。

如同前面提到的jvm的跨平台可移植性的优点和有提升性能的需求,类似的,区块链中的evm也可以采用jit和aot之类的技术来提升智能合约执行时的性能。例如,智能合约部署到区块链上之前,先进行aot编译,将编译后得到的机器码上链,从而完成合约的部署,例如图8所示的过程。完成部署的合约,在区块链上可以具有一个特定的地址。这样,客户端发起的创建合约的交易中,可以包含合约的机器码。例如,可以由客户端在将高级语言编写的智能合约编译为字节码后,在客户端本地进行aot编译,从而得到机器码。执行链上合约的过程(或称为调用智能合约的过程),例如可以是一个客户端(可以是不同于创建智能合约的客户端)直接调用经过aot编译后的链上的机器码并执行。这里,调用合约的交易中,一般指向的地址(即to字段所指向的地址)可以是被调用的合约的地址。由于本例子中的aot编译是在智能合约上链前完成的,因此可以简称为“链下aot”。链下aot编译过程可以进行大量代码优化,这样,链上执行合约的效率就可以大大提高。但缺点也很明显,即链下aot时需要预先获得所部署的目标节点的处理器架构、运行环境等,否则上链的机器码后续很可能将无法在目标节点上执行。同时,为了适配各种不同的目标节点,可能需要aot编译为多种不同的机器码。这样,经过aot编译后的机器码大小将远大于原来的智能合约字节码的大小,增大了上链数据量,增加存储开销。

本说明书提供一种执行智能合约的方法实施例,如图6所示,包括:

s601:客户端将智能合约的字节码发送至编译服务方,并接收所述编译服务方对所述字节码进行aot编译得到的机器码。

s603:区块链节点接收所述客户端提交的创建智能合约的交易,所述交易中包括所述智能合约的机器码。

用户可以用高级语言编写智能合约。编写好的智能合约可以经过适配高级语言的编译器编译,得到字节码。进而,用户可以通过某一编译服务方将智能合约的字节码编译为机器码,然后通过客户端将该智能合约的机器码打包到交易中,发送至区块链网络。交易的格式例如为图3~5中所示,其中,需要创建的智能合约的机器码可以存放于交易的data字段中。

用户可以指定任意的编译服务方完成由字节码向机器码的编译操作。例如,上述编译服务方可以为客户端自身,该客户端将智能合约的字节码编译为机器码后,将该智能合约的机器码打包到交易中,发送至区块链网络。再例如,上述编译服务方可以为某一区块链节点,譬如可以为上述步骤s603中接收交易的区块链节点,或者区块链网络中的其他任意的区块链节点。当编译服务方为区块链节点时,用户可以通过链下通道将智能合约的字节码发送至该区块链节点,由该区块链节点将智能合约的字节码编译为机器码后,返回至用户;或者,用户可以在客户端上创建调用智能合约的交易,并在交易的data字段包含智能合约的字节码,该交易调用区块链上已部署的用于实现编译功能的智能合约,使得该智能合约的合约代码被运行以将字节码编译为相应的机器码,而客户端可以从区块链节点上获取交易回执,交易回执中可以包含编译生成的机器码。又例如,上述编译服务方可以为区别于所述客户端和区块链节点的第三方服务端,该第三方服务端用于对外提供编译服务,那么用户可以将智能合约的字节码发送至该第三方服务端,使得该第三方服务端可以将智能合约的字节码编译为机器码。第三方服务端可以为向所有或至少一部分用户提供编译服务的共享服务平台,譬如该共享服务平台可以部署在某一云端服务器处或采用其他形式,本说明书并不对此进行限制。

在将智能合约的字节码编译为机器码时,可以将智能合约的字节码通过aot编译为机器码。aot编译技术可以提升智能合约执行时的性能,具体的,可以结合程序代码的前后关联进行编译,并得到优化编译后的机器码。经过编译优化的机器码,执行效率一般会高于直接翻译得到的机器码。一方面,通过将区块链节点的硬件和环境信息提供至aot引擎,使得编译得到的机器码具有硬件+环境的优化,具体可以包括机器代码生成里的优化,包括指令级的优化,寄存器分配和优化等等。另一方面,aot引擎可以分析上下文信息,比如当前函数中执行的分支跳转语句,识别其中哪一句是跳转可能行最大的,从而将这个跳转可能性最大的调整到最前,从而可以在执行时更高概率的首先命中该分支的语句;编译器优化过程还可以通过数据流分析和/或活跃变量分析进行死代码消除,例如消除不会走到的分支,此外还可以包括对循环语句进行优化,公共字表达式替换等。

s605:所述区块链节点在确定所述机器码由可信编译服务方对所述字节码进行编译得到的情况下,完成所述智能合约的部署。

相比于字节码而言,机器码可以执行的操作要多得多,因而对链的威胁也相对更大。譬如,通过对智能合约的机器码进行篡改,使得该智能合约被调用后,机器码可能被运行以读取区块链节点上存储的隐私数据,比如区块链节点上部署的可信执行环境(tee)内的隐私数据等,甚至可能影响到区块链节点的正常运行,破坏区块链网络的安全性和稳定性。因此,当创建智能合约的交易中包含智能合约的字节码时,区块链节点可以不做限制;当创建智能合约的交易中包含智能合约的机器码时,区块链节点可以对该机器码的编译服务方进行限制,确保只有可信编译服务方编译生成的机器码才可能部署至区块链上。

区块链节点可以基于编译服务方的签名来判断编译服务方是否为可信编译服务方。区块链节点可以获取编译服务方对机器码的签名,从而在该签名被预定义的可信编译服务方对应的公钥验证成功的情况下,确定编译服务方属于可信编译服务方,相当于由该可信编译服务方自身的可信度对编译生成的机器码进行背书。区块链节点可以通过运行链代码的方式,采用可信编译服务方的公钥对机器码的签名进行验证,如果机器码的签名被该可信编译服务方对应的公钥验证成功,则区块链节点可以确定该编译服务方属于可信编译服务方。或者,可信编译服务方对应的公钥被记录于系统合约中,而区块链节点可以调用该系统合约,并向该系统合约传入编译服务方对机器码的签名,使得系统合约的合约代码被执行以采用可信编译服务方对应的公钥对该签名进行校验,然后区块链节点接收系统合约返回的识别结果,该识别结果用于表明签名是否被可信编译服务方对应的公钥验证成功。

如果区块链节点通过调用系统合约的方式来识别编译服务方是否为可信编译服务方,区块链节点需要对系统合约发起调用。一种情况下,上述创建智能合约的交易中可以包含该系统合约的合约地址,使得区块链节点在执行该交易的过程中,可以对该合约地址进行调用。另一种情况下,区块链节点的链代码中可以包含上述系统合约的合约地址和针对该系统合约的调用逻辑,该调用逻辑的触发条件可以包括:区块链节点确定交易的类型为合约部署类型,比如合约部署类型的交易的to字段为空。那么,区块链节点在收到合约部署类型的交易时,即可自动触发对上述系统合约的调用。而如果区块链节点仅希望限制机器码类型的智能合约的部署行为,而无需对字节码或其他类型的智能合约的部署行为进行限制,那么上述调用逻辑的触发条件还可以包括:合约部署类型的交易包含智能合约的机器码,使得区块链节点只有在收到包含机器码且合约部署类型的交易时,才会自动触发对上述系统合约的调用。

系统合约是一种特殊的智能合约。例如,系统合约可以被部署于创世块中。或者,虽然系统合约部署在非创世块中,但是该系统合约的管理权限归属于区块链管理员,即该系统合约由区块链管理员部署,并且只有区块链管理员能够针对该系统合约进行版本更新等操作,而不同的区块链账户仅能够调用该系统合约。由于涉及到对于智能合约的机器码的部署操作,通常采用系统合约来确保准确判断出编译服务方是否为可信编译服务方。当然,即便是普通的智能合约也可以用于实现上述系统合约所实现的相关功能,以用于判断编译服务方是否为可信编译服务方,本说明书并不对此进行限制。

以太坊及类似原理的公有链、联盟链或者私有链系统中,区块链节点可以针对一批交易发起共识。所述一批交易中,可以包括上述创建智能合约的交易。通过共识后,一般的,各共识节点本地都存有所述待创建的智能合约的机器码。各共识节点本地可以执行所述创建智能合约的交易,创建对应的合约账户;并按照相同的规则给所述合约账户创建一个地址,各共识节点针对同一合约创建的地址是相同的。这样,就完成了合约的部署。

优选的,所述存储为缓存,通过缓存到内存,后续可以更快速的作出响应。具体的,所述内存可以是在虚拟机中开辟的一块缓存区域。当然,即使存储到磁盘,很多情形下也可以一定程度的提升响应速度。

完成智能合约的部署后,可以提供对该合约的调用。这样,客户端(可能不同于s601中发起创建合约交易的客户端)可以发起对该合约的调用。例如,客户端发起一个交易,其中的to字段中为前述部署的智能合约的地址,data字段可以包括所调用的合约的方法和输入的参数,从而实现对所述部署的智能合约的调用。一般的,包括该调用合约的交易在内的一批交易经过共识后,各共识节点各自分别执行交易。区块链节点调用合约的过程中,在存储有智能合约的机器码的情况下,由于机器码本身即是cpu(在os的控制下)可以直接执行的,因此,所述区块链节点可以大幅提升执行智能合约的速度。并且,所述智能合约的机器码缓存在内存中的情形,可以更进一步的提升智能合约的执行速度。当然,即使存储在磁盘中,也可以一定程度上提升执行速度。所述区块链节点执行所述机器码,具体可以是执行存储的所述合约中对应所调用函数的机器码。

本说明书中的机器码,除了适用evm,还可以适用wasm(webassembly)虚拟机、jsvm(javascriptvirtualmachine)等,在此不做限制。

需要说明的是,上述s603中的区块链节点,可能不同于s605中的区块链节点。这是因为,区块链作为分布式的系统,接收交易的节点和发起共识的节点以及执行交易的节点可以是不同的节点,当然也可以是相同的节点。

以下介绍本说明书另一部署智能合约的方法实施例,包括:

步骤a:区块链节点接收创建智能合约的交易,所述交易中包括所述智能合约的机器码,所述机器码由编译服务方对所述智能合约的字节码进行aot编译得到。

用户可以用高级语言编写智能合约。编写好的智能合约可以经过适配高级语言的编译器编译,得到字节码。进而,用户可以通过某一编译服务方将智能合约的字节码编译为机器码,然后通过客户端将该智能合约的机器码打包到交易中,发送至区块链网络。交易的格式例如为图3~5中所示,其中,需要创建的智能合约的机器码可以存放于交易的data字段中。

用户可以指定任意的编译服务方完成由字节码向机器码的编译操作。例如,上述编译服务方可以为客户端自身,该客户端将智能合约的字节码编译为机器码后,将该智能合约的机器码打包到交易中,发送至区块链网络。再例如,上述编译服务方可以为某一区块链节点,譬如可以为上述步骤a中接收交易的区块链节点,或者区块链网络中的其他任意的区块链节点。当编译服务方为区块链节点时,用户可以通过链下通道将智能合约的字节码发送至该区块链节点,由该区块链节点将智能合约的字节码编译为机器码后,返回至用户;或者,用户可以在客户端上创建调用智能合约的交易,并在交易的data字段包含智能合约的字节码,该交易调用区块链上已部署的用于实现编译功能的智能合约,使得该智能合约的合约代码被运行以将字节码编译为相应的机器码,而客户端可以从区块链节点上获取交易回执,交易回执中可以包含编译生成的机器码。又例如,上述编译服务方可以为区别于所述客户端和区块链节点的第三方服务端,该第三方服务端用于对外提供编译服务,那么用户可以将智能合约的字节码发送至该第三方服务端,使得该第三方服务端可以将智能合约的字节码编译为机器码。第三方服务端可以为向所有或至少一部分用户提供编译服务的共享服务平台,譬如该共享服务平台可以部署在某一云端服务器处或采用其他形式,本说明书并不对此进行限制。

在将智能合约的字节码编译为机器码时,可以将智能合约的字节码通过aot编译为机器码。aot编译技术可以提升智能合约执行时的性能,具体的,可以结合程序代码的前后关联进行编译,并得到优化编译后的机器码。经过编译优化的机器码,执行效率一般会高于直接翻译得到的机器码。一方面,通过将区块链节点的硬件和环境信息提供至aot引擎,使得编译得到的机器码具有硬件+环境的优化,具体可以包括机器代码生成里的优化,包括指令级的优化,寄存器分配和优化等等。另一方面,aot引擎可以分析上下文信息,比如当前函数中执行的分支跳转语句,识别其中哪一句是跳转可能行最大的,从而将这个跳转可能性最大的调整到最前,从而可以在执行时更高概率的首先命中该分支的语句;编译器优化过程还可以通过数据流分析和/或活跃变量分析进行死代码消除,例如消除不会走到的分支,此外还可以包括对循环语句进行优化,公共字表达式替换等。

步骤b:所述区块链节点在确定所述机器码由可信编译服务方对所述字节码进行编译得到的情况下,完成所述智能合约的部署。

相比于字节码而言,机器码可以执行的操作要多得多,因而对链的威胁也相对更大。譬如,通过对智能合约的机器码进行篡改,使得该智能合约被调用后,机器码可能被运行以读取区块链节点上存储的隐私数据,比如区块链节点上部署的可信执行环境(tee)内的隐私数据等,甚至可能影响到区块链节点的正常运行,破坏区块链网络的安全性和稳定性。因此,当创建智能合约的交易中包含智能合约的字节码时,区块链节点可以不做限制;当创建智能合约的交易中包含智能合约的机器码时,区块链节点可以对该机器码的编译服务方进行限制,确保只有可信编译服务方编译生成的机器码才可能部署至区块链上。

区块链节点可以基于编译服务方的签名来判断编译服务方是否为可信编译服务方。区块链节点可以获取编译服务方对机器码的签名,从而在该签名被预定义的可信编译服务方对应的公钥验证成功的情况下,确定编译服务方属于可信编译服务方,相当于由该可信编译服务方自身的可信度对编译生成的机器码进行背书。区块链节点可以通过运行链代码的方式,采用可信编译服务方的公钥对机器码的签名进行验证,如果机器码的签名被该可信编译服务方对应的公钥验证成功,则区块链节点可以确定该编译服务方属于可信编译服务方。或者,可信编译服务方对应的公钥被记录于系统合约中,而区块链节点可以调用该系统合约,并向该系统合约传入编译服务方对机器码的签名,使得系统合约的合约代码被执行以采用可信编译服务方对应的公钥对该签名进行校验,然后区块链节点接收系统合约返回的识别结果,该识别结果用于表明签名是否被可信编译服务方对应的公钥验证成功。

如果区块链节点通过调用系统合约的方式来识别编译服务方是否为可信编译服务方,区块链节点需要对系统合约发起调用。一种情况下,上述创建智能合约的交易中可以包含该系统合约的合约地址,使得区块链节点在执行该交易的过程中,可以对该合约地址进行调用。另一种情况下,区块链节点的链代码中可以包含上述系统合约的合约地址和针对该系统合约的调用逻辑,该调用逻辑的触发条件可以包括:区块链节点确定交易的类型为合约部署类型,比如合约部署类型的交易的to字段为空。那么,区块链节点在收到合约部署类型的交易时,即可自动触发对上述系统合约的调用。而如果区块链节点仅希望限制机器码类型的智能合约的部署行为,而无需对字节码或其他类型的智能合约的部署行为进行限制,那么上述调用逻辑的触发条件还可以包括:合约部署类型的交易包含智能合约的机器码,使得区块链节点只有在收到包含机器码且合约部署类型的交易时,才会自动触发对上述系统合约的调用。

系统合约是一种特殊的智能合约。例如,系统合约可以被部署于创世块中。或者,虽然系统合约部署在非创世块中,但是该系统合约的管理权限归属于区块链管理员,即该系统合约由区块链管理员部署,并且只有区块链管理员能够针对该系统合约进行版本更新等操作,而不同的区块链账户仅能够调用该系统合约。由于涉及到对于智能合约的机器码的部署操作,通常采用系统合约来确保准确判断出编译服务方是否为可信编译服务方。当然,即便是普通的智能合约也可以用于实现上述系统合约所实现的相关功能,以用于判断编译服务方是否为可信编译服务方,本说明书并不对此进行限制。

以太坊及类似原理的公有链、联盟链或者私有链系统中,区块链节点可以针对一批交易发起共识。所述一批交易中,可以包括上述创建智能合约的交易。通过共识后,一般的,各共识节点本地都存有所述待创建的智能合约的机器码。各共识节点本地可以执行所述创建智能合约的交易,创建对应的合约账户;并按照相同的规则给所述合约账户创建一个地址,各共识节点针对同一合约创建的地址是相同的。这样,就完成了合约的部署。

优选的,所述存储为缓存,通过缓存到内存,后续可以更快速的作出响应。具体的,所述内存可以是在虚拟机中开辟的一块缓存区域。当然,即使存储到磁盘,很多情形下也可以一定程度的提升响应速度。

完成智能合约的部署后,可以提供对该合约的调用。这样,客户端(可能不同于步骤a中发起创建合约交易的客户端)可以发起对该合约的调用。例如,客户端发起一个交易,其中的to字段中为前述部署的智能合约的地址,data字段可以包括所调用的合约的方法和输入的参数,从而实现对所述部署的智能合约的调用。一般的,包括该调用合约的交易在内的一批交易经过共识后,各共识节点各自分别执行交易。区块链节点调用合约的过程中,在存储有智能合约的机器码的情况下,由于机器码本身即是cpu(在os的控制下)可以直接执行的,因此,所述区块链节点可以大幅提升执行智能合约的速度。并且,所述智能合约的机器码缓存在内存中的情形,可以更进一步的提升智能合约的执行速度。当然,即使存储在磁盘中,也可以一定程度上提升执行速度。所述区块链节点执行所述机器码,具体可以是执行存储的所述合约中对应所调用函数的机器码。

本说明书中的机器码,除了适用evm,还可以适用wasm(webassembly)虚拟机、jsvm(javascriptvirtualmachine)等,在此不做限制。

需要说明的是,上述步骤a中的区块链节点,可能不同于步骤b中的区块链节点。这是因为,区块链作为分布式的系统,接收交易的节点和发起共识的节点以及执行交易的节点可以是不同的节点,当然也可以是相同的节点。

以下介绍本说明书一种部署智能合约的区块链节点实施例,如图7所示,包括:

接收单元71,用于接收创建智能合约的交易,所述交易中包括所述智能合约的机器码,所述机器码由编译服务方对所述智能合约的字节码进行aot编译得到;

识别单元72,用于所述机器码是否由可信编译服务方对所述字节码进行编译得到;

部署单元73,用于在确定所述机器码由可信编译服务方对所述字节码进行编译得到的情况下,完成所述智能合约的部署。

可选的,将所述智能合约的字节码aot编译为所述机器码,包括:

在对所述智能合约的字节码进行aot编译的过程中进行优化编译。

可选的,所述编译服务方包括下述任一:提交所述交易的客户端、区块链网络中的任一区块链节点、区别于所述客户端和区块链节点的第三方服务端。

可选的,识别单元72具体用于:

从所述交易中获取所述编译服务方对所述机器码的签名;

在所述签名被预定义的可信编译服务方对应的公钥验证成功的情况下,确定所述编译服务方属于可信编译服务方。

可选的,所述可信编译服务方对应的公钥被记录于系统合约中;还包括:

调用单元74,用于调用所述系统合约,并向所述系统合约传入所述签名;以及,接收所述系统合约返回的识别结果,所述识别结果用于表明所述签名是否被所述可信编译服务方对应的公钥验证成功。

可选的,调用单元74具体用于:

从所述交易中读取所述系统合约的合约地址,并基于所述合约地址调用所述系统合约;或者,

在确定所述交易的类型为合约部署类型的情况下,根据链代码中定义的所述系统合约的合约地址调用所述系统合约。

可选的,所述系统合约被部署在创世块中;或者,所述系统合约的管理权限归属于区块链管理员。

本说明书还提供一种区块链节点实施例,包括:

处理器,

存储器,存储有程序,其中在所述处理器执行所述程序时,按照前述的方式执行智能合约。

本说明书还提供一种存储介质实施例,用于存储程序,其中所述程序在被执行时,执行前述方法。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。

在一个典型的配置中,计算机包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。

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