实施不同类型的区块链合约的系统和方法
技术领域
本申请一般涉及用于实施不同类型的区块链合约的方法和设备。
背景技术
区块链通过将数据保存在彼此之间具有先后关系的一系列数据区块中而以去中心化方式提供数据存储。区块链由节点网络维护并更新,所述节点也用于验证数据。最近,区块链已经扩展为提供用于执行区块链合约(例如,智能合约)的框架,所述区块链合约包括以代码行编写的用户之间的合约条款。区块链合约可以是一种计算机协议,其旨在以数字方式促进、验证或施行合约的谈判或履行。为了处理区块链合约,区块链网络的每个节点运行对应的虚拟机(VM)并执行相同的指令。VM是基于提供物理计算机功能的计算机架构的计算机系统的软件仿真。在区块链背景下的VM可以理解为设计为作为区块链合约的运行环境运行的系统。
目前,每个区块链系统通常支持一种VM和相应的编程语言。例如,以太坊(Ethereum)支持需要以solidity(面向合约的编程语言,用于编写由EVM实施的区块链合约)编程的以太坊虚拟机(EVM)。以太坊区块链系统不支持诸如c++、Java、Python等其他编程语言的合约语言。这阻止了以其他编程语言编写的区块链合约的接受,并拒绝了尚未掌握solidity语言的用户。这种缺陷抑制了创新,并限制了区块链系统的应用。
发明内容
本文的不同实施例包括但不限于用于实施不同类型的区块链合约的系统、方法和非暂态计算机可读介质。
根据一些实施例,一种计算机实现的用于实施区块链合约的方法包括:获得区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;至少基于指示符来确定与类型相对应的虚拟机;以及触发所确定的虚拟机以执行区块链合约。
根据一个实施例,获得区块链合约的字节码包括:从客户端设备获得区块链合约的字节码,其中,字节码是从区块链合约的源代码编译的,源代码包括指示符。
根据另一实施例,获得所述区块链合约的字节码包括:从客户端设备获得区块链合约的源代码,源代码包括指示符;以及编译源代码以获得区块链合约的字节码。
根据另一实施例,获得所述区块链合约的字节码包括:从客户端设备获得用于执行区块链合约的原始字节码,其中,原始字节码是从用于执行区块链合约的原始源代码编译的;以及将指示符添加至原始字节码以获得区块链合约的字节码。
根据另一实施例,获得区块链合约的字节码包括:从客户端设备获得用于执行区块链合约的原始源代码;编译原始源代码以获得原始字节码;以及将指示符添加至原始字节码以获得区块链合约的字节码。
根据一些实施例,指示符对应于区块链合约的字节码的第一字节。
根据其他实施例,区块链合约的类型为solidity合约或者原生合约。
根据其他实施例,类型与编程语言相关联。
根据其他实施例,编程序言包括c++、java、solidity或者python;与c++相对应的虚拟机为GNU编译器集合(GCC);与Java相对应的虚拟机是Java虚拟机(JVM);与solidity相对应的虚拟机是以太坊虚拟机(EVM);以及与python相对应的虚拟机是python虚拟机(PVM)。
根据一些实施例,一种用于实施区块链合约的系统包括:一个或多个处理器;以及一个或多个非暂态计算机可读存储器,其耦接至一个或多个处理器并且配置有可由一个或多个处理器执行的指令,以使该系统执行操作,所述操作包括:获得区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;至少基于指示符来确定与类型相对应的虚拟机;以及触发所确定的虚拟机以执行区块链合约。
根据其他实施例,一种用于实施区块链合约的非暂态计算机可读存储介质,所述存储介质配置有可由一个或多个处理器执行的指令,以使一个或多个处理器执行操作,所述操作包括:获得区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;至少基于指示符来确定与类型相对应的虚拟机;以及触发所确定的虚拟机以执行区块链合约。
根据其他实施例,一种用于实施区块链合约的装置包括:获得模块,用于获得区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;确定模块,用于至少基于指示符来确定与类型相对应的虚拟机;以及触发模块,用于触发所确定的虚拟机以执行区块链合约。
根据一些实施例,一种计算机实现的用于实施区块链合约的方法包括:生成区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;以及将区块链合约的字节码传送至区块链节点,以使区块链节点基于指示符触发与类型相对应的虚拟机从而执行区块链合约。
根据其他实施例,生成区块链合约的字节码包括:编译区块链合约的源代码以获得区块链的字节码,源代码包括指示符。
根据其他实施例,生成区块链合约的字节码包括:编译用于执行区块链合约的原始源代码以获得用于执行区块链合约的原始字节码;以及添加指示符至原始字节码以获得区块链合约的字节码。
根据一些实施例,一种用于实施区块链合约的系统包括:一个或多个处理器;以及一个或多个非暂态计算机可读存储器,其耦接至一个或多个处理器并且配置有可由一个或多个处理器执行的指令,以使该系统执行操作,所述操作包括:生成区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;以及将区块链合约的字节码传送至区块链节点,以使区块链节点基于指示符触发与类型相对应的虚拟机从而执行区块链合约。
根据其他实施例,一种用于实施区块链合约的非暂态计算机可读存储介质,所述存储介质配置有可由一个或多个处理器执行的指令以使一个或多个处理器执行操作,所述操作包括:生成区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;以及将区块链合约的字节码传送至区块链节点,以使区块链节点基于指示符触发与类型相对应的虚拟机从而执行区块链合约。
根据其他实施例,一种用于实施区块链合约的装置包括:生成模块,用于生成区块链合约的字节码,其中,字节码包括指示区块链合约的类型的指示符;以及传送模块,用于将区块链合约的字节码传送至区块链节点,以使区块链节点基于指示符触发与类型相对应的虚拟机从而执行区块链合约。
根据一些实施例,一种用于实施区块链合约的系统包括:一个或多个处理器;以及一个或多个计算机可读存储器,其耦接至一个或多个处理器并且其上存储有指令,所述指令可由一个或多个处理器执行以执行前述实施例的任一方法。
根据其他实施例,一种用于实施区块链合约的装置包括多个模块,用于执行前述实施例的任一方法。
本文中公开的实施例具有一种或多种技术效果。在一些实施例中,字节码包含区块链合约(例如,solidity合约、原生合约)的类型的指示符。因此,当区块链节点尝试执行(例如,部署、调用)区块链合约时,可以根据指示符而触发相对应的虚拟机。在其他实施例中,作为字节码格式,指示符采用字节码的第一字节以便于识别。在一些实施例中,通过采用这种格式,区块链系统可以容易地以低成本集成不同类型的虚拟机,同时具有可兼容的数据交换。区块链节点(例如,全节点)可以通过合并不同类型的虚拟机来提高其效率。为了与区块链系统交互,客户端设备(例如,轻节点)可以不再局限于特定类型的编程语言。在其他实施例中,区块链节点的硬件机器可以访问各种虚拟机(例如,从硬件机器或系统配置中的先前安装)。区块链节点可以基于接收到的合约的字节码来确定合约类型并触发相对应的虚拟机以执行合约。在其他实施例中,区块链系统可以支持以不同编程语言编写并对应于不同虚拟机的区块链合约。区块链合约不再需要以专用编程语言编写。在其他实施例中,不同的虚拟机可以集成到区块链节点的硬件机器上并点击以部署、调用或以其他方式操作以任何编程语言编写的区块链合约。在其他实施例中,区块链系统的通信性和兼容性得到了显著扩展。
在参照附图考虑以下描述和所附权利要求时,本文公开的系统、方法和非暂时性计算机可读介质的这些和其他特征,以及结构的相关元件的操作的方法和功能以及部件的组合和制造的经济情况将变得更为明显,本文的所有附图形成本说明书的一部分,在不同的附图中,相同的附图标记指代相应的部件。然而,应该明确理解,附图仅用于示例性和说明性,而不旨在限制。
附图说明
图1示出根据一些实施例的用于实施区块链合约的系统。
图2A和图2B示出根据一些实施例的用于实施区块链合约的框架。
图3示出根据一些实施例的用于实施区块链合约的字节码。
图4A示出根据一些实施例的用于添加指示符的一种方法的流程图。
图4B示出根据一些实施例的用于添加指示符的另一种方法的流程图。
图5A示出根据一些实施例的用于实施区块链合约的一种方法的流程图。
图5B示出根据一些实施例的用于实施区块链合约的另一种方法的流程图。
图6A示出根据一些实施例的用于实施区块链合约的一种装置的框图。
图6B示出根据一些实施例的用于实施区块链合约的另一种装置的框图。
图7示出计算系统的框图,在该计算机系统中可以实现本文描述的任一实施例。
具体实施方式
图1示出根据一些实施例的区块链网络100的示例。如图所示,区块链网络100可以包括耦接至区块链系统112的一个或多个客户端设备(例如,节点A、节点B等)。客户端设备可以包括轻节点。轻节点可以不下载完整的区块链,而是可以只下载区块头以验证区块链交易的真实性。轻节点可以由全节点(例如,区块链系统112中的节点)服务并有效地依赖于全节点以访问区块链的更多功能。轻节点可以通过安装适当的软件在诸如笔记本电脑、移动电话等电子设备中实现。
区块链系统112可以包括多个区块链节点(例如,节点1、节点2、节点3、节点4、节点i等),这些节点可以包括全节点。全节点可以下载每个区块和区块链交易,并根据区块链的共识规则检查他们。区块链节点可以形成网络(例如,点对点网络(peer-to-peernetwork)),一个区块链节点与另一个区块链节点通信。如图所示的区块链节点的顺序和数量只是示例性的并且是为了简单说明。区块链节点可以在服务器、计算机等中实现。例如,区块链节点可以在服务器的集群中实现。服务器的集群可以采用负载平衡。每个区块链节点可以对应经由各种类型的通信方法诸如TCP/IP耦接在一起的一个或多个物理硬件设备或虚拟设备。根据分类,区块链节点也可以称为全节点、Geth节点、共识节点等。
客户端设备和区块链节点中的每一个可以安装有适当的软件(例如,应用编程接口)和/或硬件(例如,有线、无线连接)以访问区块链网络100的其他设备。通常,客户端设备和区块链节点可以通过一个或多个有线或无线网络(例如,互联网)相互通信,数据可以通过所述一个或多个有线或无线网络传输。客户端设备和区块链节点中的每一个可以包括一个或多个处理器和耦接至所述一个或多个处理器的一个或多个存储器。存储器可以是非暂态的且计算机可读的,并且配置有可由一个或多个处理器执行的指令,以使所述一个或多个处理器执行本文所述的操作。指令可以存储在存储器中,或者可以通过通信网络下载,而无需存储在存储器中。尽管客户端设备和区块链节点在此附图中示出为单独的组件,但应认识到,这些系统和设备可以作为单个设备或耦接在一起的多个设备来实现。也就是说,客户端设备(例如,节点A)可以交替集成到区块链节点(例如,节点1)中。
客户端设备诸如节点A和节点B可以安装有适当的区块链软件以启动、转发或访问区块链交易。节点A可以通过与节点1或者一个或多个其他区块链节点的通信来访问区块链,节点B可以通过与节点2或者一个或多个其他区块链节点的通信来访问区块链。节点A可以通过节点1或类似节点向区块链提交区块链交易,以请求将区块链交易添加到区块链中。提交的区块链交易可以包括用于部署在区块链上的区块链合约(例如,智能合约)。在一些实施例中,术语“区块链交易”(或者简称“交易”)可以通过区块链系统实施并记录到区块链。区块链交易可以包括,例如,金融交易、用于部署或调用区块链合约的区块链合约交易、更新区块链的状态(例如,世界状态)的区块链交易等。区块链交易并非必需涉及金融交易。
区块链可由区块链节点维护,区块链节点可各自包括存储器或耦接到存储器。在一些实施例中,存储器可以存储池数据库(pool database)。池数据库可以以分布式被多个区块链节点访问。例如,池数据库可以分别存储在区块链节点的存储器中。池数据库可以存储由类似于节点A的一个或多个客户端设备提交的多个区块链交易。
在一些实施例中,在接收到未确认的区块链交易的区块链交易请求后,接收方区块链节点可以对区块链交易进行一些初步验证。例如,节点1可以在从节点A接收到区块链交易后进行初步验证。一旦验证,区块链交易就可以被存储在接收方区块链节点(例如,节点1)的池数据库中,该接收方区块链节点也可以将该区块链交易转发给一个或多个其他区块链节点(例如,节点3、节点4)。一个或多个其他区块链节点可以重复接收方节点进行的过程。
一旦对应池数据库中的区块链交易达到一定水平(例如,阈值数量),区块链节点就可以各自根据共识规则或其他规则来验证对应池数据库中的一批区块链交易。如果区块链交易涉及区块链合约(例如,智能合约),区块链节点可以在本地执行区块链合约。区块链合约可以包括用户编写的合约代码。例如,区块链交易可以将数据编码为合约代码,用于数据存储(通过合约部署)或检索(通过调用部署的合约)。
根据共识规则成功验证其批次的区块链交易的特定区块链节点可以将区块链交易打包到其区块链的本地副本中,并将结果多播到其他区块链节点。该特定区块链节点可以是首先成功完成验证、获得验证权限、或者基于其他共识规则等确定的区块链节点。然后,其他区块链节点可以在本地执行区块链交易,相互验证执行结果(例如,通过执行哈希计算),以及将其区块链的副本与特定区块链节点的副本同步。通过更新其区块链的本地副本,其他区块链节点可以将区块链交易中的此类信息写入各自的本地存储器中。因此,区块链合约可以部署在区块链上。如果验证在某些点失败,则区块链交易被拒绝。
部署的区块链合约可以具有地址,根据该地址可以访问部署的合约。区块链节点可以通过向区块链合约输入某些参数来调用部署的区块链合约。在一个实施例中,节点B可以请求调用部署的区块链合约来执行各种操作。例如,可以检索存储在部署的区块链合约中的数据。另一示例,数据可以被添加到部署的区块链合约。再一个示例,可以执行在部署的区块链合约中指定的金融交易。尽管上文所述,其他类型的区块链系统和相关的共识规则可应用于所公开的区块链系统。参照图2A和图2B,下面提供部署和调用区块链合约的示例。
图2A和图2B示出根据一些实施例的用于实施区块链合约的框架。图2A示出根据一些实施例部署区块链合约。在一些实施例中,区块链合约可以从其在源代码中的构造开始。例如,用户A可以将区块链合约编程为源代码,并将源代码输入到用户端应用211的接口。在此附图中,用户端应用211被安装在节点A中。源代码可以用Java、c++、python、solidity等编程语言编写。为了部署区块链合约,节点A可以使用相应的编译器212编译区块链合约源代码,编译器212将源代码转换成字节码。字节码可以是从源代码编译成为软件解释器设计的低级代码的程序代码。在接收到字节码后,用户端应用可以生成包括字节码的区块链交易A,并将该区块链交易提交给一个或多个区块链节点。例如,区块链交易可以包括以下信息:nonce(例如,区块链交易序列号)、from(例如,用户A的账号的地址)、to(例如,如果部署区块链合约,则为空)、GasLimit(例如,为区块链交易所消费的区块链交易费用的上限)、GasPrice(例如,由发送方提供的区块链交易费用)、value(例如,金融交易数量)、data(例如,字节码)等。节点A可以用各种加密方式对区块链交易进行签名,以表示节点A的认可。
节点A可以通过远程过程调用(RPC)接口213将区块链交易发送到区块链节点(例如,节点1)。RPC是一种协议,第一程序(例如,用户端应用)可以使用该协议从位于网络上的另一台计算机(例如,区块链节点)的第二程序请求服务,而无需了解网络的细节。当第一程序使得过程在不同的地址空间(例如,在节点1上)执行时,就如同正常(本地)过程调用,而无需程序员明确地编码远程交互的细节。
尽管编译器被示出为包括在客户端设备节点A中,但在一些实施例中,编译器可以备选地包括在客户端设备可访问的另一设备中。客户端设备可以远程耦接到编译器以将源代码编译成字节码。在一些其他实施例中,编译器可以备选地包括在区块链节点(例如,节点1)中或者在区块链节点可访问的另一设备中。区块链节点可以从客户端设备获取源代码,并使用编译器将源代码编译成字节码。在其他实施例中,客户端设备(例如,无论是否包括编译器的节点A)可以与区块链节点(例如,节点1)集成。然后,由客户端设备执行的步骤可以由区块链节点执行。
在一些实施例中,由区块链节点(例如,节点1)获得的字节码可以遵循下文参照图3A描述的格式。例如,字节码可以包括指示区块链合约的类型的指示符等。对于区块链节点,有多种方式来获得包括指示符的字节码。在一个示例中,指示符的源代码版本可以包括在源代码中,然后源代码被编译为字节码,使得字节码包括指示符的字节码版本。用户、客户端设备或区块链节点可以将指示符的源代码版本添加到源代码。在另一示例中,源代码不包括指示符,在源代码被编译成字节码之后,指示符的字节码版本可以被包括在字节码中。用户、客户端设备或区块链节点可以将指示符的字节码版本添加到字节码。
在接收到区块链交易时,如上文所述,节点1可以验证区块链交易是否有效。例如,可以验证节点A的签名和其他格式。如果验证成功,节点1可以将区块链交易广播到包括其他各种区块链节点的区块链网络。一些区块链节点可以参与区块链交易的挖掘过程。由节点A发送的区块链交易可以被特定节点取来进行共识验证,以打包成新区块。该特定节点可以为区块链合约创建与合约账号地址相关的合约账号。该特定节点可以触发其本地虚拟机(VM)执行区块链合约,从而将区块链合约部署到其区块链的本地副本,并更新区块链中的账号状态。如果该特定节点成功挖掘新区块,则该特定节点可以将新区块广播至其他区块链节点。其他区块链节点可以验证由该特定区块链节点挖掘的新区块。如果达成共识,区块链交易被分别打包到由区块链节点维护的区块链的本地副本中。区块链节点可以类似地触发其本地虚拟机(例如,本地VM 1、本地VM i、本地VM 2)执行区块链合约,从而调用部署在区块链的本地副本(例如,本地区块链副本1、本地区块链副本i、本地区块链副本2)上的区块链合约,并进行相应的更新。每个区块链节点的硬件机器可以访问一个或多个虚拟机,所述虚拟机可以是相应区块链节点的一部分或耦接到相应区块链节点。每次,相应的本地VM可以被触发来执行区块链合约。同样,将执行新区块中的所有其他区块链交易。轻节点也可以同步到更新后的区块链。
图2B示出根据一些实施例的调用部署的区块链合约。这些步骤类似于上述区块链合约部署,但对传输的数据进行了某些更改。在一些实施例中,用户B可以编程指令以调用源代码中的区块链合约,并将源代码输入到用户端应用221的接口。在此附图中,用户端应用221被安装在节点B中。源代码可以用java、c++、python、solidity等编程语言编写。为了调用区块链合约,节点B可以使用相应编译器222编译指令,编译器222将源代码转换成字节码。在接收到字节码后,用户端应用可以生成包括字节码的区块链交易B,并将区块链交易提交给一个或多个区块链节点。例如,区块链交易可以包括以下信息:诸如nonce(例如,区块链交易序列号)、from(例如,用户B的账号的地址)、to(例如,部署的区块链合约的地址)、GasLimit(例如,为区块链交易所消费的区块链交易费用的上限)、GasPrice(例如,由发送方提供的区块链交易费用)、value(例如,金融交易数量)、data(例如,字节码)等。节点B可以用各种加密方法对区块链交易进行签名,以表示节点B的认可。节点B可以通过远程过程调用(RPC)接口223将区块链交易发送到区块链节点(例如,节点2)。
类似于上文描述,虽然编译器被示出为包括在客户端设备节点B中,但在一些实施例中,编译器可以备选地包括在客户端设备可访问的另一设备中、区块链节点(例如,节点2)中、或区块链节点可访问的另一设备中。在一些实施例中,由区块链节点(例如,节点2)获得的字节码可遵循下文参照图3B描述的格式。字节码可包括或不包括指示区块链合约的类型的指示符。
在接收到区块链交易时,节点2可以验证区块链交易是否有效。例如,可以验证节点B的签名和其他格式。如果验证成功,节点2可以将区块链交易广播到包括其他各种区块链节点的区块链网络。一些区块链节点可以参与区块链交易的挖掘过程中。由节点B发送的区块链交易可以被特定节点选取来进行共识验证,以打包成新区块。该特定节点可以触发其本地虚拟机以执行区块链合约,从而调用部署在其区块链的本地副本上的区块链合约,并更新区块链中的账号状态。如果该特定节点成功挖掘新区块,则该特定节点可以将新区块广播给其他区块链节点。其他区块链节点可以验证由该特定区块链节点挖掘的新区块。如果达成共识,区块链交易将被分别打包到由区块链节点维护的区块链的本地副本中。区块链节点可以类似地触发其本地虚拟机(例如,本地VM 1、本地VM i、本地VM 2)以执行区块链合约,从而调用部署在区块链的本地副本(例如,本地区块链副本1、本地区块链副本i、本地区块链副本2)上的区块链合约,并进行相应的更新。每个区块链节点的硬件机器可以访问一个或多个虚拟机,所述虚拟机可以是相应区块链节点的一部分或耦接至相应区块链节点。每次,相应的本地VM可以被触发来执行区块链合约。同样,将执行新区块中的所有其他区块链交易。轻节点也可以同步到更新的区块链。
图3示出根据一些实施例的用于实施区块链合约的字节码。下文给出的操作旨在说明性的。取决于实施方式,示例性步骤可以包括以不同顺序执行或并行执行的附加步骤、较少步骤或替代步骤。
在一些实施例中,用户可以用各种编程语言(例如,java、c++、python、solidity等)构造区块链合约。区块链合约可以用各种编程语言编写成人类可读的源代码编写,前端软件加载到客户端设备。然后,编译器可被触发来将源代码编译成字节码。编译器可以是计算机软件,其将用一种编程语言编写的计算机代码转换成另一种编程语言。编译器可以将源代码从高级编程语言转换为低级语言(例如,字节码),以创建可执行程序。字节码,也称为可移植代码、P代码、目标代码或机器代码,是为了软件解释器有效执行而设计的指令集的形式。不同于人类可读的源代码,字节码可以包括压缩数字代码、常量和参数(例如,数字地址),其对编译器解析和执行程序对象的语义分析的结果进行编码。字节码可以由相应的VM读取和执行。
在一些实施例中,客户端设备(例如,安装有区块链平台软件的移动电话)可以提示用户输入、选择或以其他方式识别区块链合约的合约类型(例如,java编写的合约、c++编写的合约、python编写的合约等)。基于用户提供的信息,客户端设备可以应用指示符来表示合约类型。可选地,客户端设备通过分析原始源代码自动检测区块链合约的类型,并添加指示符来表示合约类型。例如,“01”(二进制表示)或“0x01”(十六进制表示)可以表示solidity语言的合约,“02”或“0x02”可以代表java语言的合约,“03”或“0x03”可以代表c++语言的合约,“04”或“0x04”可以表示python语言的合约,等等。指示符可以不限于上述表示的示例。指示符可以被添加到区块链合约的编译字节码的前面或其他位置。在一个示例中,指示符可以占用一个字节的数据。字节码可以作为二进制文件存在,也可以用十六进制表示来表达。本领域的普通技术人员将理解使用各种其他类型的指示符表示、将指示符添加到字节码中的其他可选位置以及使用其他字节空间表示指示符。
在一些实施例中,区块链节点可以访问一个或多个虚拟机。如上所述,当区块链节点获得包括指示区块链合约的类型的指示符的字节码时,区块链节点可以提取该字节码的一部分(例如,第一字节),并激活相应的虚拟机以基于所提取的字节码部分执行区块链合约。指示符可以由用户、客户端设备或区块链节点添加。指示符可以作为源代码被添加到原始源代码,然后带有该指示符的原始源代码被编译到字节码中。备选地,指示符可以作为字节码被添加到从原始源代码编译而不包括指示符的原始字节码中,以获得字节码。单词“原始(raw)”可以表示相应的代码不包括指示符。
在一些实施例中,虚拟机可以将字节码转换为由处理器运行的指令。例如,如果合约代码是c++,则GNU编译器集合(GCC)可被调用来执行区块链合约;如果合约代码是java,则java虚拟机(JVM)可被调用来执行区块链合约;如果合约代码是solidity,则以太坊虚拟机(EVM)可被调用来执行区块链合约;如果合约代码是python,则python虚拟机(PVM)可被调用来执行区块链合约。区块链节点可以解析字节码的一部分(例如,第一字节和第二字节),并触发相应的虚拟机来执行区块链合约。例如,区块链节点可以部署区块链合约。被触发的VM可以将字节码转换为可以由处理器运行的汇编语言或其他指令集。例如,可以调用GCC、JVM、EVM、PVM或其他相应的VM来执行区块链合约。
图4A示出根据一些实施例的用于添加指示符的方法的流程图。下文给出的操作旨在说明性的。取决于实施方式,示例性步骤可以包括以不同顺序执行或并行执行的附加步骤、较少步骤或替代步骤。虽然图4A使用java作为示例性编程语言,但是可以使用各种其他编程语言来编写区块链合约。
在步骤411,用户可以在客户端设备上以java编程区块链合约。示例性原始java源代码的一部分被示出。原始java源代码可以不包括指示符。
在步骤412,用户或用户的客户端设备可以在java源代码中添加区块链合约的类型的指示符。
在步骤413,编译器可以将带有指示符的源代码编译成区块链合约的字节码。例如,编译后的java字节码的前几个字节被示出。编译后的java字节码可以包括在二进制数据文件中,作为JVM执行区块链合约的指令。
图4B示出根据一些实施例的用于添加指示符的方法的流程图。下文给出的操作旨在说明性的。取决于实施方式,示例性步骤可以包括以不同顺序执行或并行执行的附加步骤、较少步骤或替代步骤。虽然图4B使用java作为示例性编程语言,但是可以使用各种其他编程语言来编写区块链合约。
在步骤421,用户可以在客户端设备上以java编程区块链合约。示例性原始java源代码的一部分被示出。原始java源代码可以不包括指示符。
在步骤422,编译器可以将原始源代码编译成区块链合约的原始字节码。作为示例,编译后的原始java字节码的前几个字节被示出。
在步骤423,客户端设备可以在编译后的原始java字节码中插入区块链合约的类型的指示符,以获得区块链合约的java字节码。作为本文所示的示例,指示符可以被添加到字节码的最前面。在此示例中,指示符是02,其表示JVM。
图5A示出根据本文的一些实施例的用于实施区块链合约的示例性方法510的流程图。方法510可由图1的系统100的一个或多个组件(例如,上文所述的节点1、节点2……或节点i或类似设备,或任何节点和一个或多个附加设备诸如节点A的组合)实施。方法510可由包括各种硬件机器和/或软件的系统或设备(例如,计算机、服务器)实施。例如,系统或设备可以包括一个或多个处理器和一个或多个非暂态计算机可读存储介质(例如,一个或多个存储器),所述一个或多个非暂态计算机可读存储介质耦接至所述一个或多个处理器并且配置有可由所述一个或多个处理器执行的指令,以使系统或设备(例如,处理器)执行方法510。下文给出的方法510的操作旨在说明性的。根据实施方式,方法510可以包括以不同顺序执行或并行执行的附加步骤、更少步骤或可选步骤。方法510的进一步细节可参考图1至图4B和上述相关说明。
在一些实施例中,节点1可以执行方法510。块511包括获得区块链合约的字节码,其中,该字节码包括指示区块链合约的类型的指示符。在一些实施例中,指示符对应于区块链合约的字节码的第一个字节。该指示符可以包括二进制数、十六进制数等。在一些实施例中,区块链合约的类型为solidity合约或原生合约。块512包括至少基于指示符确定与类型相对应的虚拟机。块513包括触发确定的虚拟机以执行区块链合约。
在一个实施例中,获取区块链合约的字节码包括:从客户端设备获取区块链合约的字节码,其中,该字节码由区块链合约的源代码编译,源代码包括指示符(源代码中)。例如,源代码可以由客户端设备编译以生成字节码。
在另一实施例中,获取区块链合约的字节码包括:从客户端设备获取区块链合约的源代码,所述源代码包括指示符(在源代码中);编译源代码以获取区块链合约的字节码。例如,区块链节点可以包括编译器或以其他方式访问编译器来编译源代码。
在又一实施例中,获取区块链合约的字节码包括:从客户端设备获取用于执行区块链合约的原始字节码,其中,原始字节码是从用于执行区块链合约的原始源代码编译的;以及添加指示符(在字节码中)到原始字节码以获得区块链合约的字节码。原始源代码和原始字节码可以不包括指示符。源代码可以由客户端设备编译以生成字节码。
在又一实施例中,获取区块链合约的字节码包括:从客户端设备获取用于执行区块链合约的原始源代码;编译原始源代码以获取原始字节码;以及将指示符(在字节码中)添加到原始字节码以获得区块链合约的字节码。原始源代码和原始字节码可以不包括指示符。区块链节点可以包括编译器或以其他方式访问编译器以编译源代码。
在一些实施例中,区块链合约的类型与编程语言相关联。在一些实施例中,编程语言包括c++、java、solidity或python;对应于c++的虚拟机是GNU编译器集合(GCC);对应于java的虚拟机是java虚拟机(JVM);对应于solidity的虚拟机是以太坊虚拟机(EVM);对应于python的虚拟机是python虚拟机(PVM)。
图5B示出根据本文的一些实施例的用于实施区块链合约的示例性方法520的流程图。方法520可由图1的系统100的一个或多个组件(例如,节点A、节点B或类似设备,或任何节点和一个或多个附加设备诸如节点1、节点2的组合)实施。方法520可由包括各种硬件机器和/或软件的系统或设备(例如,计算机、服务器)实施。例如,系统或设备可以包括一个或多个处理器和一个或多个非暂态计算机可读存储介质(例如,一个或多个存储器),所述一个或多个非暂态计算机可读存储介质耦接至所述一个或多个处理器并且配置有可由所述一个或多个处理器执行的指令,以使系统或设备(例如,处理器)执行方法520。下文给出的方法520的操作旨在说明性的。根据实施方式,方法520可以包括以不同顺序执行或并行执行的附加步骤、更少步骤或可选步骤。方法520的进一步细节可参考图1至图4B和上述相关说明。参照图5A描述的各种实施例也可以应用于图5B
在一些实施例中,节点A可以执行方法520。块521包括:生成区块链合约的字节码,其中,该字节码包括指示区块链合约的类型的指示符。块522包括:将区块链合约的字节码传送到区块链节点,以使区块链节点基于指示符触发与类型相对应的虚拟机以执行区块链合约。
节点A可以包括编译器或以其他方式访问编译器以编译源代码。在一个实施例中,生成区块链合约的字节码包括:编译区块链合约的源代码以获得区块链的字节码,该源代码包括指示符。在另一实施例中,生成区块链合约的字节码包括:编译用于执行区块链合约的原始源代码,以获得用于执行区块链合约的原始字节码;以及将指示符添加至原始字节码,以获得区块链合约的字节码。
图6A示出根据一些实施例的用于实施区块链合约的系统610的框图。系统610(例如,计算机系统)可以是上述节点1、节点2、节点3、...、或节点i或者类似设备或者是所述节点中的任一个和附加设备(例如,节点A)的组合的实施的示例。例如,方法510可由系统610实施。系统610可以包括一个或多个处理器和一个或多个非暂态计算机可读存储介质(例如,一个或多个存储器),所述一个或多个非暂态计算机可读存储介质耦接至所述一个或多个处理器并且配置有可由所述一个或多个处理器执行的指令,以使系统或设备(例如,处理器)执行上述方法和操作,例如方法510。系统610可包括与指令(例如,软件指令)相对应的各种单元/模块。
在一些实施例中,系统610可被称为用于实施区块链合约的装置。该装置可以包括:获得模块611,用于获取区块链合约的字节码,其中该字节码包括指示区块链合约的类型的指示符;确定模块612,用于至少基于指示符确定与类型相对应的虚拟机;以及触发模块613,用于触发确定的虚拟机以执行区块链合约。
图6B示出根据一些实施例的用于实施区块链合约的系统620的框图。系统620(例如,计算机系统)可以是节点A、节点B或类似设备或者是所述节点中的任一个和附加设备(例如,节点1、节点2)的组合的实施的示例。例如,方法520可由系统620实施。系统620可以包括一个或多个处理器和一个或多个非暂态计算机可读存储介质(例如,一个或多个存储器),所述一个或多个非暂态计算机可读存储介质耦接至所述一个或多个处理器并且配置有可由所述一个或多个处理器执行的指令,以使系统或设备(例如,处理器)执行上述方法和操作,例如方法520。系统620可包括与指令(例如,软件指令)相对应的各种单元/模块。
在一些实施例中,系统620可被称为用于实施区块链合约的装置。该装置可以包括:生成模块621,用于生成区块链合约的字节码,其中该字节码包括指示区块链合约的类型的指示符;以及传送模块622,用于将区块链合约的字节码传送至区块链节点,以使区块链节点基于指示符触发与类型相对应的虚拟机以执行区块链合约。
本文所述的技术由一台或多台专用计算设备实施。专用计算设备可以是台式计算机系统、服务器计算机系统、便携式计算机系统、手持设备、网络设备、或者结合硬接线和/或程序逻辑以实现所述技术的任何其他设备或设备的组合。专用计算设备可实现为个人计算机、笔记本电脑、移动电话、照相手机、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏机、平板电脑、可穿戴设备或其组合。计算设备一般由操作系统软件控制和协调。常规的操作系统控制和调度计算机处理以执行、进行内存管理、提供文件系统、网络、I/O服务,以及提供用户界面功能,诸如图形用户界面(“GUI”),等等。本文所述的各种系统、装置、存储介质、模块和单元可以在专用计算设备、或者一台或多台专用计算设备的一个或多个计算芯片中实现。在一些实施例中,本文所述的指令可以在专用计算设备上的虚拟机中实现。在执行时,所述指令可以使专用计算装置执行本文所述的各种方法。虚拟机可以包括软件、硬件或其组合。
图7是示出计算机系统700的框图,在计算机系统700上可以实施本文所述的任何实施例。系统700可以执行本文所述的方法中的任一种(例如,用于实施区块链合约的方法510或520)。系统700可以在本文所述的系统中的任一种(例如,用于实施区块链合约的系统610或620)中实现。系统700可以在本文所述的节点中的任一个中实现,并配置为执行用于实施区块链合约的相应步骤。计算机系统700包括用于通信信息的总线702或其他通信机制,与总线702耦接以处理信息的一个或多个硬件处理器704。例如,硬件处理器704可以是一个或多个通用微处理器。
计算机系统700还包括耦接至总线702的用于存储信息和由处理器704可执行的指令的主存储器706,诸如随机存取存储器(RAM)、缓存和/或其他动态存储设备。主存储器706也可被用于在由处理器704可执行的指令的执行期间存储临时变量或其他中间信息。当这些指令存储在处理器704可访问的存储介质中时,将计算机系统700呈现到为了执行指令中指定的操作而定制的专用机器中。计算机系统700还包括只读存储器(ROM)708或耦接至总线702的用于存储静态信息和处理器704的指令的其他静态存储设备。提供存储设备710,诸如磁盘、光盘或USB拇指驱动器(闪存驱动器)等,并耦接至总线702以存储信息和指令。
计算机系统700可以使用定制的硬接线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑,其与计算机系统结合而使计算机系统700成为专用机器或将计算机系统700编程为专用机器,来实施本文所述的技术。根据一个实施例,本文所述的操作、方法和过程由计算机系统700响应处理器704执行主存储器706中包含的一个或多个指令的一个或多个序列来执行。这些指令可以从另一存储介质诸如存储设备710读取到主存储器706中。执行主存储器706中包含的指令序列导致处理器704执行本文所述的处理步骤。在替代的实施例中,可以使用硬接线电路代替软件指令或与软件指令结合使用。
主存储器706、ROM 708和/或存储设备710可包括非暂态存储介质。术语“非暂态介质”和类似术语,在本文中使用时,是指存储使机器以特定方式运行的数据和/或指令的介质,所述介质不包括暂态信号。这种非暂态介质可包括非易失性介质和/或易失性介质。例如,非易失性介质包括光盘或磁盘,例如存储设备710。易失性介质包括动态存储器,诸如主存储器706。非暂态介质的常见形式包括例如软盘、软磁盘、硬盘、固态驱动器、磁带或任何其他磁数据存储介质、CD-ROM、任何其他光学数据存储介质、具有孔图案的任何物理介质、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、任何其他存储芯片或内存盒、以及他们的网络版本。
计算机系统700还包括耦接至总线702的网络接口718。网络接口718为连接到一个或多个本地网络的一个或多个网络链接提供双向数据通信耦合。例如,网络接口718可以是综合业务数字网络(ISDN)卡、电缆调制解调器、卫星调制解调器、或向相应类型的电话线提供数据通信连接的调制解调器。作为另一示例,网络接口718可以是局域网(LAN)卡,以提供数据通信连接至可兼容的LAN(或与WAN通信的WAN组件)。也可以实现无线链接。在任何这样的实现中,网络接口718发送和接收携带代表各种类型信息的数字数据流的电信号、电磁信号或光信号。
计算机系统700可以通过网络、网络链接和网络接口718发送消息和接收包括程序代码的数据。在互联网示例中,服务器可以通过互联网、ISP、本地网络和网络接口718来传输应用程序的请求代码。
接收到的代码可以在接收时由处理器704执行,和/或存储在存储设备710或其他非易失性存储器中,以供以后执行。
上述部分所述的每个过程、方法和算法可以被包含在代码模块中并全部或部分由代码模块自动执行,所述代码模块由包括计算机硬件的一个或多个计算机系统或者计算机处理器执行。这些过程和算法可以部分或全部在专用电路中实施。
上述各种特征和过程可彼此独立使用,或者可以以各种方式组合使用。所有可能的组合和子组合均应落入本文的范围内。此外,在一些实施方式中可以省略某些方法或过程块。本文所述的方法和过程也不限于任何特定的顺序,与其相关的块或状态可以以适当的其他顺序执行。例如,所述块或状态可以以不同于具体公开的顺序执行,或者多个块或状态可以组合成单个块或状态。块或状态的示例可以串行、并行或以一些其他方式执行。块或状态可被添加到所公开实施例或从所公开实施例移除。本文所述的系统和组件的示例可以被配置为不同于所描述的。例如,与所公开的实施例相比,可以将元件添加、移除或重新排列。
本文所述的方法的各种操作可由临时配置(例如,通过软件)或永久配置以执行相关操作的一个或多个处理器至少部分地执行。无论临时配置或永久配置,这些处理器可以构成处理器实现的引擎,其操作以执行本文所述的一个或多个操作或功能。
类似地,本文所述的方法可以至少部分为处理器实施,一个或多个特定处理器是硬件的示例。例如,方法的至少一些操作可以由一个或多个处理器实现的引擎执行。此外,一个或多个处理器还可以操作以支持“云计算”环境中的相关操作的性能或作为“软件即服务”(SaaS)。例如,至少一些操作可以由一组计算机(例如,包括处理器的机器)执行,这些操作通过网络(例如,互联网)和一个或多个适当的接口(例如,应用编程接口(API))可访问。
某些操作的性能可以分布在处理器之间,不仅驻留在单个机器内,而且部署在多台机器上。在一些实施例中,处理器或处理器实现的引擎可以位于单个地理位置(例如,在家庭环境、办公室环境或服务器场中)。在其他实施例中,处理器或处理器实现的引擎可以分布在多个地理位置上。
在本文中,多个实例可以实现描述为单个实例的组件、操作或结构。虽然一种或多种方法的单个操作被示出并描述为单独的操作,但是一个或多个单个操作可以同时执行,而不需要按照所示的顺序执行操作。在配置中作为单独组件呈现的结构和功能可以作为组合结构或组件实现。同样,作为单个组件呈现的结构和功能可以作为单独的组件实现。这些和其他变更、修改、添加和改进落入本文主题的范围内。此外,本文中使用的相关术语(诸如“第一”、“第二”、“第三”等)不表示任何顺序、高度或重要性,而是被用于区分一个元件和另一元件。此外,术语“一个”和“多个”在本文中不表示数量限制,而是表示至少一种所述物品的存在。
尽管参考具体实施例描述了主题的概况,但可以对这些实施例进行各种修改和更改,而不背离本文的实施例的更广泛范围。详细说明不应以限制性的意义来理解,各种实施方案的范围仅由所附的权利要求以及这些权利要求的主题等同的全部范围来限定。