本申请一般涉及用于数据处理的方法和设备。
背景技术:
区块链通过让节点的网络维护和更新区块的链,以去中心化方式提供数据存储。区块链和其他各种计算操作需要在编译器、虚拟机(vm)和其他设备之间进行数据传输和处理。虚拟机是基于计算机架构的计算机系统的、提供物理计算机的功能的软件仿真,并且在区块链背景中可以理解为被设计用作区块链函数,例如区块链合约(也称为智能合约),的运行时环境的系统。当用户想要对区块链执行操作(例如,部署智能合约、检索区块链的状态)时,用户可以使用高级语言源代码在客户端设备上编程指令,并使用相应的编译器对它们进行编译以产生字节码。指令可以包括接受输入参数并生成输出参数的函数。字节码可以被传递给虚拟机并由虚拟机执行以实现操作。
在当前方案中,多种因素可能会阻止虚拟机正确启动、获取参数或对参数执行操作。例如,一个或多个输入参数可能具有复杂的数据结构,例如指针型变量。每个指针型变量可以存储另一个变量(例如,整数型变量、布尔型变量、字符串型变量)的地址,在该地址处存储另一个变量的值。编译输入参数时,指针型变量中存储的地址可能会移位并成为地址移位。如果参数的数据结构的复杂性增加(例如,如在双指针型参数中、如在具有复杂数据结构的多个嵌套参数中),则移位可能变得过度而不可逆,这妨碍了参数正确地传入和传出函数并且阻碍了系统的正常运行。对于另一个示例,虚拟机和编译器可能具有不同的字长。通常发现虚拟机为32位,而客户端设备的编译器和处理器以64位运行。这种不兼容性可能会进一步导致内存地址分配混乱,并导致虚拟机上的错误操作。
技术实现要素:
本文的各种实施例包括但不限于用于数据处理的系统、方法和非暂时性计算机可读介质。
根据一些实施例,计算机实现的用于数据处理的方法包括:获得从包括一个或多个输入参数的源代码编译的字节码,所述源代码包括编码函数以对所述一个或多个输入参数进行编码、将所述编码的一个或多个输入参数存储在存储段中、并提供所述存储段的存储位置;根据所述字节码执行所述编码函数以对所述一个或多个输入参数进行编码,从而获得存储有所述编码的一个或多个输入参数的存储段的存储位置;以及将所述存储位置提供给用于检索所述编码的一个或多个输入参数并对所述编码的一个或多个输入参数进行解码的函数,从而获得所述一个或多个输入参数。
根据其他实施例,所述函数是用户定义的函数。
根据其他实施例,所述一个或多个输入参数中的至少一个包括指针型变量。
根据其他实施例,所述指针型变量包括多个间接型变量。
根据一些实施例,所述存储段的存储位置包括与所述存储段的起始或结束地址对应的指针以及与所述存储段对应的数据长度。
根据其他实施例,所述存储段的存储位置包括与所述存储段的起始地址对应的第一指针和与所述存储段的结束地址对应的第二指针。
根据其他实施例,所述方法由虚拟机执行;以及获得从包括所述一个或多个输入参数的所述源代码编译的所述字节码包括:从计算设备获得由与所述计算设备关联的编译器从包括所述一个或多个输入参数的所述源代码编译的所述字节码。
根据其他实施例,所述存储位置包括存储有与所述存储段对应的地址的指针;并且所述地址通过在从所述源代码编译的所述字节码中的编译而被移位。
根据一些实施例,所述方法还包括执行所述函数。执行所述函数包括:根据所述虚拟机的存储起始位置和所述虚拟机获得的地址移位,恢复所述移位的地址;根据恢复的地址,检索所述编码的一个或多个输入参数;以及对所述编码的一个或多个输入参数进行解码以检索所述一个或多个输入参数。
根据其他实施例,执行所述函数还包括:基于所述一个或多个输入参数调用另一函数以返回一个或多个输出参数;以及对所述一个或多个输出参数进行编码。
根据一些实施例,基于所述一个或多个输入参数调用所述另一函数以返回所述一个或多个输出参数包括:调用所述另一函数以返回区块链的状态。
根据其他实施例,所述方法还包括对所述函数外的所述一个或多个输出参数进行解码。
根据其他实施例,所述虚拟机和所述编译器具有不同的字长。
根据其他实施例,所述虚拟机是基于webassembly(wasm)格式的。
根据一些实施例,用于数据处理的系统包括:一个或多个处理器;以及耦接到所述一个或多个处理器且其上存储有指令的一个或多个计算机可读存储器,所述指令能由所述一个或多个处理器执行以执行前述任一实施例所述的方法。
根据其他实施例,用于执行区块链合约的装置包括用于执行前述任一实施例中所述的方法的多个模块。
根据其他实施例,非暂时性计算机可读介质中存储有指令,当所述指令由设备的处理器执行时,促使所述设备执行前述任一实施例所述的方法。
根据一些实施例,用于数据处理的系统包括:一个或多个处理器;以及耦接到所述一个或多个处理器且配置有指令的一个或多个非暂时性计算机可读存储器,所述指令能由所述一个或多个处理器执行以促使所述系统执行操作,这些操作包括:获得从包括一个或多个输入参数的源代码编译的字节码,所述源代码包括编码函数以对所述一个或多个输入参数进行编码、将所述编码的一个或多个输入参数存储在存储段中、并提供所述存储段的存储位置;根据所述字节码执行所述编码函数以对所述一个或多个输入参数进行编码,从而获得存储有所述编码的一个或多个输入参数的所述存储段的所述存储位置;以及将所述存储位置提供给用于检索所述编码的一个或多个输入参数并对所述编码的一个或多个输入参数进行解码的函数,从而获得所述一个或多个输入参数。
根据其他实施例,用于数据处理的非暂时性计算机可读存储介质配置有指令,所述指令能够由一个或多个处理器执行,以促使所述一个或多个处理器执行操作,这些操作包括:获得从包括一个或多个输入参数的源代码编译的字节码,所述源代码包括编码函数以对所述一个或多个输入参数进行编码、将所述编码的一个或多个输入参数存储在存储段中、并提供所述存储段的存储位置;根据所述字节码执行所述编码函数以对所述一个或多个输入参数进行编码,从而获得存储有所述编码的一个或多个输入参数的所述存储段的所述存储位置;以及将所述存储位置提供给用于检索所述编码的一个或多个输入参数并对所述编码的一个或多个输入参数进行解码的函数,从而获得所述一个或多个输入参数。
根据其他实施例,用于数据处理的装置包括获得模块,用于获得从包括一个或多个输入参数的源代码编译的字节码,所述源代码包括编码函数以对所述一个或多个输入参数进行编码、将所述编码的一个或多个输入参数存储在存储段中、并提供所述存储段的存储位置;执行模块,用于根据所述字节码执行所述编码函数以对所述一个或多个输入参数进行编码,从而获得存储有所述编码的一个或多个输入参数的所述存储段的所述存储位置;以及提供模块,用于将所述存储位置提供给用于检索所述编码的一个或多个输入参数并对所述编码的一个或多个输入参数进行解码的函数,从而获得所述一个或多个输入参数。
本文公开的实施例具有一个或多个技术效果。在一些实施例中,通过编码处理,用于提供给函数(例如,在虚拟机上执行的用户定义的函数)的一个或多个输入参数可以被正确地传递给所述虚拟机,并且类似地所述函数的一个或多个输出参数可以被正确地返回给所述函数。在一示例中,所述函数是用户定义的,并且因此必须独立地对抗由编译和编译器与虚拟机之间的不同字长导致的移位的影响。在一些实施例中,可以将部分或所有输入和输出参数单独地或统一地编码成数据流以保存到由存储位置表示的存储段,从而减少参数的数据结构的复杂性。在一实施例中,存储位置可以包括存储有存储段的起始或结束地址以及整个存储段的数据长度的指针。在另一实施例中,所述存储位置可以包括存储有所述存储段的起始地址的第一指针和存储有所述存储段的结束地址的第二指针。在一些实施例中,根据由编译器编译的字节码,所述虚拟机可以对输入参数进行编码并且触发所述函数以对用于各种操作(例如,生成一个或多个输出参数)的输入参数进行解码。在一些实施例中,类似地,可以在退出函数之前对所述一个或多个输出参数进行编码,以从所述函数返回编码的输出参数,从而进行解码和其他操作。所述虚拟机可以将所述输出参数编码成另一数据流以保存到由另一存储位置表示的另一存储段,并从函数返回该另一存储位置。在一些实施例中,所述编码步骤使虚拟机能够正确地定位用于检索或存储输入和/或输出参数的存储位置。在一些实施例中,利用所公开的方法,可以平稳地执行基于虚拟机执行的区块链操作,而不会遇到错误的参数。在一实施例中,所述函数可以包括定制的操作,所述定制操作基于与区块链相关联的一个或多个输入参数来调用区块链的状态,并且可选地返回区块链的另一状态。所述函数可以正确执行以实现相应的用户操作。
本文公开的系统、方法和非暂时性计算机可读介质的这些和其他特征,以及相关结构元件的操作方法和功能,以及部件和制造经济的组合,将在参考附图考虑以下描述和所附权利要求时变得更加明显,所有这些形成本说明书的一部分,其中,相同的附图标记表示各附图中的对应部分。然而,应该清楚地理解,附图仅用于说明和描述的目的,而不是限制性的。
附图说明
图1示出了根据一些实施例的用于数据处理的系统。
图2a和图2b示出了根据一些实施例的用于数据处理的框架。
图3示出了根据一些实施例的用于数据处理的方法的流程图。
图4示出了根据一些实施例的用于数据处理的方法的伪代码。
图5示出了根据一些实施例的用于数据处理的方法的流程图。
图6示出了根据一些实施例的用于数据处理的装置的框图。
图7示出了可以实现本文描述的任何实施例的计算机系统的框图。
具体实施方式
本文描述的用于数据处理的各种系统、设备和方法可以应用于例如区块链网络的许多环境中。尽管本文的描述着重于在示例性区块链网络中的应用,但是本领域普通技术人员将理解本文不限于这种应用。所公开的系统、设备和方法也可以适用于涉及用于虚拟机(vm)执行的源代码编译的各种其他实例。如果本文所述的各种节点相应地被其他类型的计算设备替代,则所公开的系统、设备和方法仍可以适用。
图1示出了根据一些实施例的区块链网络100的示例。区块链网络100可以是用于数据处理的示例性系统。在一些实施例中,所公开的方法可以帮助在客户端设备(例如,节点a、节点b)和区块链节点(例如,节点1、节点2)之间正确地传递参数,并确保系统操作(例如,部署或调用区块链合约、处理区块链交易等)适当,而不会遇到错误的参数。
如所示出的,区块链网络100可以包括耦接到区块链系统112的一个或多个客户端设备(例如,节点a、节点b等)。客户端设备可以包括例如计算机、移动电话或其他计算设备。客户端设备可以包括轻节点。轻节点可能无法下载完整的区块链,而可以只下载区块头以验证区块链交易的真实性。轻节点可以通过全节点(例如,区块链系统112中的那些节点)服务并有效地依赖于全节点,以访问区块链中更多函数。通过安装适当的软件,可以在诸如膝上型计算机、移动电话等的电子设备中实现轻节点。
区块链网络112可以包括多个区块链节点(例如,节点1、节点2、节点3、节点4、节点i等),这多个区块链节点可以包括全节点。全节点可以下载每个区块和每个区块链交易,并对照区块链的共识规则进行检查。区块链节点可以形成网络(例如,点对点网络),其中一个区块链节点与另一区块链节点通信。所示的区块链节点的次序和数量仅仅是示例的并且为了简化说明。区块链节点可以在服务器、计算机等中实现。例如,区块链节点可以在服务器集群中实现。服务器集群可以采用负载均衡。每个区块链节点可以对应于一个或多个物理硬件设备或者虚拟设备,这些物理硬件设备或者虚拟设备通过诸如tcp/ip的各种类型的通信方法耦合在一起。根据分类,区块链节点还可以被称为全节点、geth节点、共识节点等。
客户端设备和区块链节点中的每一个可以安装有适当的软件(例如,应用编程接口)和/或硬件(例如,有线、无线连接)以访问区块链网络100的其他设备。通常,客户端设备和区块链节点可以通过一个或多个有线或无线网络(例如,因特网)彼此通信,通过该有线或无线网络可以传递数据。客户端设备和区块链节点中的每一个可以包括一个或多个处理器以及耦接到该一个或多个处理器的一个或多个存储器。存储器可以是非暂时性的且计算机可读的,并且配置有一个或多个处理器可执行以促使所述一个或多个处理器执行本文描述的操作的指令。指令可以存储在存储器中,或者通过通信网络下载,而不必存储在存储器中。尽管客户端设备和区块链节点在该图中被示为单独的组件,但是应当理解,这些系统和设备可以实现为单个设备或耦接在一起的多个设备。即,客户端设备(例如,节点a)可以可选地集成到区块链节点(例如,节点1)中。
诸如节点a和节点b的客户端设备可以安装有适当的区块链软件,以发起、转发或访问区块链交易。节点a可以通过与节点1或一个或多个其他区块链节点的通信来访问区块链,并且节点b可以通过与节点2或一个或多个其他区块链节点的通信来访问区块链。节点a可以通过节点1或类似节点将区块链交易提交到区块链以请求将该区块链交易添加到区块链中。提交的区块链交易可以包括用于在区块链上部署的区块链合约(例如,智能合约)。在一些实施例中,术语“区块链交易”(或简称为“交易”)可以通过区块链系统来实现并记录到区块链中。区块链交易可以包括例如金融交易、用于部署或调用区块链合约的区块链合约交易、用于更新区块链的状态(例如,世界状态)的区块链交易等。区块链交易不一定涉及金融交易。
区块链可以由区块链节点维护,每个区块链节点包括或耦接到存储器。在一些实施例中,存储器可以存储池数据库。池数据库可以以分布式方式被多个区块链节点访问。例如,池数据库可以分别存储在区块链节点的存储器中。池数据库可存储由与节点a类似的一个或多个客户端设备提交的多个区块链交易。
在一些实施例中,在接收到未确认区块链交易的区块链交易请求之后,接收方区块链节点可以执行区块链交易的一些初步验证。例如,节点1可以在接收到来自节点a的区块链交易之后执行初步验证。一旦被验证,区块链交易可以存储在接收方区块链节点(例如,节点1)的池数据库中,该接收方区块链节点也可以将该区块链交易转发到一个或多个其他区块链节点(例如,节点3、节点4)。一个或多个其他区块链节点可以重复由接收方节点完成的过程。
一旦相应池数据库中的交易达到一定水平(例如,阈值量),每个区块链节点就可以根据共识规则或其他规则验证相应池数据库中的一批区块链交易。如果区块链交易涉及区块链合约(例如,智能合约),则区块链节点可以在本地执行区块链合约。区块链合约可以包括用户编写的合约代码。例如,区块链交易可以对用于数据存储(通过合约部署)或检索(通过调用已部署的合约)的合约代码中的数据进行编码。
根据共识规则成功验证一批区块链交易的特定区块链节点可以将这批区块链交易打包至区块链中其本地副本内,并将结果组播到其他区块链节点。特定区块链节点可以是首先成功完成验证、已获得验证特权、或者已经基于另一个共识规则确定等的区块链节点。然后,其他区块链节点可以在本地执行区块链交易,彼此验证执行结果(例如,通过执行哈希计算),并将区块链中它们的副本与特定区块链节点的副本同步。通过更新区块链中它们的本地副本,其他区块链节点可以类似地将区块链交易中这样的信息写入对应的本地存储器。因此,区块链合约可以被部署在区块链上。如果在某些点处验证失败,则拒绝区块链交易。
部署的区块链合约可以具有地址,根据该地址可以访问部署的合约。区块链节点可以通过向区块链合约输入某些参数来调用已部署的区块链合约。在一个实施例中,节点b可以请求调用部署的区块链合约以执行各种操作。例如,可以检索在部署的区块链合约中存储的数据。另一示例,可以将数据添加到部署的区块链合约中。对于又一示例,可以执行在部署的区块链合约中指定的金融交易。尽管有上述描述,其他类型的区块链系统和相关的共识规则可以应用于所公开的区块链系统。下面针对图2a和图2b提供部署和调用区块链合约的示例,其中可以应用所公开的数据处理方法。
图2a和图2b示出了根据一些实施例的在区块链操作的背景中用于数据处理的框架。在一些实施例中,所公开的方法可以帮助在客户端设备(例如,节点a、节点b)和虚拟机(例如,节点1的本地vm1、节点2的本地vm2)之间正确地传递参数,并确保系统操作(例如,部署或调用区块链合约、处理区块链交易等)适当,而不会遇到错误的参数。尽管将区块链用作所公开的方法的应用的示例,但是所公开的方法可以在各种其他应用中使用。
图2a示出了根据一些实施例部署区块链合约。在一些实施例中,区块链合约可以从其源代码构建开始。例如,用户a可以编程源代码中的区块链合约,并将源代码输入到用户端应用211的接口(例如,编程接口)。在该图中,用户端应用211安装在节点a中。源代码可以用高级编程语言来编写。为了部署区块链合同,节点a可以使用相应的编译器212(例如,与高级编程语言兼容的编译器)编译区块链合约源代码,编译器212将源代码转换为字节码。字节码可以是已经从源代码编译为针对软件解释器设计的低级代码的程序代码。在接收到字节码之后,用户端应用可以生成包括字节码的区块链交易a,并将区块链交易提交给一个或多个区块链节点。例如,区块链交易可以包括诸如nonce(例如,区块链交易序列号)、来自(例如,用户a的账户的地址)、至(例如,如果部署区块链合约则为空)、gaslimit(例如,区块链交易所消费的区块链交易费的上限)、gasprice(例如,发送方提供的区块链交易费)、值(例如,金融交易金额)、数据(例如,字节码)等信息。节点a可以使用各种加密方法对区块链交易进行签名,以表示节点a的背书(endorsement)。
节点a可通过远程过程调用(rpc)接口213将区块链交易发送到区块链节点(例如,节点1)。rpc是第一程序(例如,用户端应用)可以使用的协议,第一程序可以使用该协议以从位于网络上的另一计算机(例如,区块链节点)中的第二程序请求服务而不必理解网络的细节。当第一程序促使过程在不同地址空间(例如,在节点1上)中执行时,其像被编码为正常(本地)过程调用进行工作,而无需程序员明确地编码远程交互的细节。
虽然编译器被示出为包括在客户端设备节点a中,但是在一些实施例中,编译器可以可选地包括在客户端设备可访问的另一设备中。客户端设备可以远程耦接到编译器以将源代码编译成字节码。在一些其他实施例中,编译器可以可选地包括在区块链节点(例如,节点1)中或者包括在区块链节点可访问的另一设备中。区块链节点可以从客户端设备获得源代码,并使用编译器将源代码编译成字节码。在其他实施例中,客户端设备(例如,节点a,无论是否包括编译器)可以与区块链节点(例如,节点1)集成。然后,由客户端设备执行的步骤可以由区块链节点执行。
在接收到区块链交易时,如前所述,节点1可以验证该区块链交易是否有效。例如,可以验证节点a的签名和其他格式。如果验证成功,节点1可将该区块链交易广播到包括各种其他区块链节点的区块链网络。一些区块链节点可以参与区块链交易的挖矿过程。由节点a发送的区块链交易可以被特定节点选中以进行共识验证从而打包到新区块中。特定节点可以创建与合约账户地址相关联的区块链合约的合约账户。特定节点可以触发其本地虚拟机执行区块链合约,从而将区块链合约部署到区块链中其本地副本内并更新区块链中的账户状态。如果特定节点成功挖出新区块,则特定节点可以将新区块广播到其他区块链节点。其他区块链节点可以验证由该特定区块链节点挖出的新区块。如果达成共识,则将区块链交易分别打包到由区块链节点维护的区块链中的本地副本内。区块链节点可以类似地触发它们的本地虚拟机(例如,本地vm1、本地vmi、本地vm2)执行区块链合约,从而调用部署在区块链中本地副本(例如,本地区块链副本1、本地区块链副本i、本地区块链副本2)上的区块链合约并进行相应的更新。每个区块链节点的硬件机器可以访问一个或多个虚拟机,这些虚拟机可以是相应的区块链节点的一部分或耦接到相应的区块链节点。每次都可以触发相应的本地虚拟机执行区块链合约。同样,将执行新区块中的所有其他区块链交易。轻节点也可以与更新的区块链同步。
图2b示出了根据一些实施例调用部署的区块链合约。这些步骤类似于上面描述的区块链合约部署,其中对传输的数据进行了特定更改。在一些实施例中,用户b可以编写指令以调用源代码中的区块链合约并将源代码输入到用户端应用221的接口。在该图中,用户端应用221安装在节点b中。源代码可以用编程语言编写。为了调用区块链合约,节点b可以使用相应的编译器222编译指令,该编译器将源代码转换为字节码。在接收到字节码之后,用户端应用可以生成包括字节码的区块链交易b,并将区块链交易提交给区块链节点中的一个或多个。例如,区块链交易可以包括诸如nonce(例如,区块链交易序列号)、来自(例如,用户b的账户的地址)、至(例如,部署的区块链合约的地址)、gaslimit(例如,区块链交易所消费的区块链交易费的上限)、gasprice(例如,发送方提供的区块链交易费)、值(例如,金融交易金额)、数据(例如,字节码)等信息。节点b可以使用各种加密方法对区块链交易进行签名,以表示节点b的背书。节点b可以通过远程过程调用(rpc)接口223将区块链交易发送到区块链节点(例如,节点2)。
与以上描述类似,虽然编译器被示出为包括在客户端设备节点b中,但是在一些实施例中,编译器可以可选地包括在客户端设备可访问的另一设备中、在区块链节点(例如,节点2)中或区块链节点可访问的另一设备中。
在接收到区块链交易时,节点2可以验证区块链交易是否有效。例如,可以验证节点b的签名和其他格式。如果验证成功,节点2就可将该区块链交易广播到包括各种其他区块链节点的区块链网络。一些区块链节点可以参与区块链交易的挖矿过程。由节点b发送的区块链交易可以由特定节点选中以进行共识验证从而打包到新区块中。特定节点可以触发其本地虚拟机执行区块链合约,从而调用部署在区块链中其本地副本上的区块链合约并更新区块链中的账户状态。如果特定节点成功挖出新区块,则特定节点可以将新区块广播到其他区块链节点。其他区块链节点可以验证由该特定区块链节点挖出的新区块。如果达成共识,则将区块链交易分别被打包到由区块链节点维护的区块链中的本地副本内。区块链节点可以类似地触发它们的本地虚拟机(例如,本地vm1、本地vmi、本地vm2)执行区块链合约,从而调用部署在区块链中的本地副本(例如,本地区块链副本1、本地区块链副本i、本地区块链副本2)上的区块链合约并进行相应的更新。每个区块链节点的硬件机器可以访问一个或多个虚拟机,这些虚拟机可以是相应的区块链节点的一部分或耦接到相应的区块链节点。每次都可以触发相应的本地虚拟机来执行区块链合约。同样,将执行新区块中的所有其他区块链交易。轻节点也可以与更新的区块链同步。
图3示出了根据一些实施例的用于数据处理的方法的流程图。图4示出了根据一些实施例的用于数据处理的方法的伪代码。这两个图是相互关联的,下面将一起描述。以“3”开头的数字指图3,以“4”开头的数字指图4。下面列出的操作是说明性的。根据实施方式,示例性步骤可包括以不同的顺序或并行执行的附加步骤、较少步骤或可选步骤。
在一些实施例中,用户可以使用客户端设备310构建虚拟机执行的程序。可选地,该程序可以是机器生成的或从计算设备获得的。例如,用户可以通过客户端设备310上的用户端应用311来构建程序。可以使用编程语言(例如,java、c++、python、solidity等)将程序编写成人类可读源代码。程序可以调用接受一个或多个输入参数和/或生成一个或多个输出参数的函数。源代码411示出用c++编写的源代码示例的一部分。源代码411的程序调用用户定义的函数“transpose()”,该函数接受输入参数“a”并生成输出参数“b”。用户定义的函数可以是程序或环境的用户在通常假设将函数内置到程序或环境中的情况下所定义(例如,构造、配置、提供)的函数。在步骤4111和步骤4112,源代码将“a”和“b”声明为向量内向量(vector-inside-vector)(例如,二乘二矩阵),并为“a”分配值,并且“b”应该是将“a”应用于“transpose()”函数的结果。“transpose()”函数可以包括未在虚拟机中构建的步骤(例如,代码411和412中的步骤)和在虚拟机中构建的步骤(例如,代码414中的步骤)。为了区分,将代码411和代码412中的“transpose(a,b)”函数称为“程序函数”,将在虚拟机中构建的“transpose(uint32_tin_data,uint32_tin_len,uint32_tout_data,uint32_tout_len_ptr)函数称为“虚拟机函数”。
对于用户端应用311,可能已经预先创建并添加了与程序函数对应的库文件(例如,代码412)。通过步骤4113,可以调用库文件且库文件可以包括在程序的源代码中。如代码412所示,库文件可以声明程序函数接受“a”和“b”的地址而不是它们的值:“inttranspose(constvector<vector<int>>&,vector<vector<int>>&)”。对于用户定义的虚拟机函数,直接接受地址“vector<vector<int>>&”和“vector<vector<int>>&”可能会导致错误地将参数传入和/或传出虚拟机函数。因此,包括了用于对输入参数“a”进行编码的步骤4121,使得在虚拟机中执行的虚拟机函数将接收编码的“a”并返回编码的“b”。相应地,包括了用于对输出参数“b”的地址进行解码的步骤4124,以对编码的“b”进行解码。
如代码412中所示的,在步骤4121,将输入参数“a”编码在指针“in_data”和数据长度“in_len”中。即,将存储在“a”中的数据(例如,嵌套地址或其他复杂数据)转换为数据流以保存到存储段的存储位置。存储位置可以由指针“in_data”和数据长度“in_len”表示。可选地,可以由与该存储段的两端相对应的两个指针来表示该存储位置。存储位置中的指针将通过编译器编译移位,但与没有编码步骤相比,在虚拟机中恢复将容易得多。随着“a”的数据结构复杂度的增加,例如“a”变为双指针时,简化变得更加重要。在步骤4122,将返回的变量“out_data”和“out_len_ptr”声明为另一指针和数据长度组合,以表示输出参数“b”。在步骤4123,程序函数调用虚拟机内置的虚拟机函数。虚拟机函数将接受针对输入参数的指针和数据长度组合(“in_data”和“in_len”),并返回针对输出参数的另一指针和数据长度组合(“out_data”和“out_len_ptr”)。在执行虚拟机函数时,虚拟机将输出参数编码成另一数据流以保存到由另一存储位置(由另一数据长度组合(“out_data”和“out_len_ptr”)表示)表示的另一存储段,并将该另一存储位置从虚拟机函数返回到程序函数。在步骤4124,编码后的输出参数(由“out_data”和“out_len_ptr”表示)被返回并被解码以恢复原始格式“vector<vector<int>>&b”。在进一步的操作中,如果“b”未与“transpose()”或其他类似的用户定义的虚拟机函数交互,则可以以其原始格式调用。
在步骤321,用户端应用311可以将源代码发送到编译器312。尽管编译器312被示为客户端设备310的一部分,但是编译器312可以可选地设置在客户端设备310外部并耦接到客户端设备310。在步骤323,可以触发编译器312以编译程序。
在步骤322,可以编译程序(例如,包括代码411和代码412)以产生字节码。413示出了作为示例的字节码的一部分。编译器可以是将用一种编程语言编写的计算机代码转换为另一种编程语言的计算机软件。编译器可以将源代码从高级编程语言转换为低级语言(例如,字节码),以创建可执行程序。字节码,也称为便携式代码、p代码、对象代码或机器代码,是为软件解释器的高效执行而设计的指令集的形式。与人类可读源代码不同,字节码可以包括对编译器解析和对程序对象进行语义分析的结果进行编码的压缩数字代码、常量和引用(references)(例如,数字地址)。字节码可以由相应的虚拟机读取和执行。在一些实施例中,虚拟机(稍后描述)是基于wasm的,因此编译器与wasm兼容。即,编译可以生成wasm字节码。
可以在步骤323将字节码发送到虚拟机313。例如,编译器312可以将字节码发送到用户端应用311从而发送到虚拟机313。对于另一示例,编译器312可以将字节码发送到虚拟机313,无论编译器312是否在客户端设备310内部。相应地,在步骤324,虚拟机313可以执行字节码。例如,如图4所示,虚拟机313可以获得字节码并以字节码格式执行步骤4121-4123。也就是说,虚拟机313可以对虚拟机函数的输入参数进行编码以存储在存储位置处,并获得表示该存储位置的指针和数据长度(对应于步骤4121),声明用于表示虚拟机函数的编码的输出参数的存储位置的另一指针和另一数据长度的地址(对应于步骤4122),调用虚拟机313中内置的虚拟机函数(对应于步骤4123),并对编码的输出参数进行解码(对应于步骤4124)。
在其他步骤中,对应于步骤4123,虚拟机313可以以“i32transpose(i32,32,32,32)”的形式调用虚拟机函数,其中i32是wasm字节码的内部数据结构,表示32位整数。414示出了建立在虚拟机中并在虚拟机内部执行的虚拟机函数。只要字节码调用虚拟机函数,虚拟机函数本身不需要包含在字节码中。在此,虚拟机函数可以已被编程从而接受编码的输入参数并返回编码的输出参数。如上所述,编码的输入参数“a”的数据流的存储位置可以包括存储有与该存储段相对应的地址的指针“in_data”,并且该地址可以通过编译而移位。存储在指针“in_data”中的地址可能已变为地址移位。在步骤4141,虚拟机可以根据虚拟机的存储起始位置“start_ptr”和地址移位“in_data”来恢复移位的地址,获得恢复后的地址为“in_data_ptr”。当启动虚拟机时,虚拟机可以知道起始位置“start_ptr”。起始位置“start_ptr”可以指示在存储器中为各种虚拟机操作分配的位置。地址移位“in_data”可以取决于编译器,并且可以由编译器以字节码形式传递给虚拟机(通过计算设备)。在步骤4142,虚拟机可以根据恢复后的地址“in_data_ptr”和数据长度“in_len”检索编码的输入参数,并对编码的输入参数进行解码以检索输入参数。因此,虚拟机正确地获得了输入参数“a”,并且可以执行随后的计算。在步骤4143,虚拟机可以调用数学库中的转置变换以将“a”转置为“b”。可选地,可以执行其他种类的变换或操作。在步骤4144,虚拟机可以对输出参数“b”进行编码,并获得表示存储有编码的输出参数的另一存储位置的指针“out_data”和数据长度“start_ptr+out_len_ptr”。如上所述,编码的输出参数“b”可以在退出虚拟机函数时被返回给程序函数并且在步骤4124被解码。
图5示出了根据本文一些实施例的用于数据处理的示例性方法510的流程图。方法510可以由图1中的系统100的一个或多个组件(例如,上述节点1、节点2......或节点i,或类似设备,任何节点和一个或多个例如节点a的附加设备的组合)或虚拟机(例如,vm1、vm2、vmi、vm313等)实现。方法510可以由包括各种硬件机器和/或软件的系统或设备(例如,计算机、服务器)实现。例如,系统或设备可以包括一个或多个处理器以及一个或多个非暂时性计算机可读存储介质(例如,一个或多个存储器),所述一个或多个非暂时性计算机可读存储介质耦接到一个或多个处理器并配置有可由一个或多个处理器执行以促使系统或设备(例如,处理器)执行方法510的指令。下面示出的方法510的操作是说明性的。根据实施方式,方法510可以包括以不同次序或并行执行的附加步骤、更少步骤或可选步骤。方法510的进一步细节可以参考图1至图4以及上面的相关描述。
在一些实施例中,虚拟机(例如,vm1,vm313)或与虚拟机关联的计算设备(例如,包括vm1的节点1)可以执行方法510。如上所述,在执行方法510之前,可以用调用函数(例如,上述虚拟机函数,可适用于以下参考图5描述的所有函数)的高级编程语言源代码(例如,由机器、由程序员)构建程序以执行特定操作。该函数可以采用一个或多个输入参数进行计算,并基于一个或多个输入参数返回一个或多个输出参数。为了将输入参数正确地传入到函数中,程序可以指定用于对待提供给函数的一个或多个输入参数进行编码的步骤。因此,该函数可以接收一个或多个编码的输入参数以进行解码和其他操作。为了正确地从函数传出输出参数,函数可以进一步生成一个或多个输出参数并对一个或多个输出参数进行编码,以返回编码的一个或多个输出参数。据此,在退出函数之后,程序可以指定用于对从函数返回的一个或多个输出参数进行解码的步骤。
在将一个或多个输入参数正确地传递到函数中之后,可以在函数的执行中选择性地使用一个或多个输入参数以执行各种操作。在区块链的背景下,该函数可以调用区块链的状态。例如,可以调用该函数以基于诸如账户名和密码的输入参数执行区块链交易,并返回账户的更新的余额作为输出参数。
在一些实施例中,该函数可以是虚拟机中内置的用户定义的函数。由于虚拟机以字节码运行,因此可以将程序编译为字节码以供虚拟机执行。编译器(例如,编译器212、编译器312)或具有编译器的计算设备(例如,包括编译器212的节点a)可以将程序编译成字节码。例如,包括图4中所示的代码412的代码411可以被编译为字节码。代码412可以是添加到高级编程语言以实现所公开方法的库文件。如图4所示的代码412被代码411调用,并因此包括在程序中。字节码可以被传输到虚拟机或与虚拟机相关联的计算设备,以由虚拟机执行。通过编译,程序被转变成虚拟机理解的机器语言。因此,虚拟机可以遵循字节码,在其他步骤中对输入参数进行编码以将编码的输入参数传递给用户定义的函数、调用用户定义的函数以执行各种操作、从用户定义的函数返回编码的输出参数以及对编码的输出参数进行解码。
在一些实施例中,编译器可以以与接收方虚拟机兼容的格式来编译字节码。在一些实施例中,虚拟机是基于webassembly(wasm)格式的。wasm是基于堆栈的虚拟机的二进制指令格式。wasm可以是用于编译诸如c/c++/rust的高级语言的便携式目标,从而能够在web上部署用于客户端和服务器应用。基于wasm的虚拟机可以执行编译器编译的wasm字节码。例如,基于wasm的虚拟机可能会根据用c++编写的wasm的官方发行版本进行修改。通过修改,可以创建用户定义的函数(例如,代码414中的transpose())以用于外部调用(例如,步骤4123)。例如,在wasm字节码中,可以通过“调用”命令触发用户定义的函数。尽管如此,虚拟机和编译器可以基于各种其他格式。
在一些实施例中,输入或输出参数可以包括一个或多个指针型变量(例如,指针),其分别存储其他变量(例如,字符串变量、整数变量、字节变量、短变量、浮动变量等)的地址。编译可能会导致指针中存储的其他变量的地址移位。地址可以改变为移位量。在一些实施例中,该函数是由虚拟机执行的用户定义的函数,并且容易受到由移位引起的问题的影响。即,该函数不是内置函数。结果,虚拟机可能无法找到用于检索的输入参数的正确存储位置,或者可能检索到错误的输入参数。类似地,输出参数可能被错误地计算并且被错误地放置在错误的存储位置。此外,在一些实施例中,虚拟机和编译器具有不同的字长。例如,虚拟机为32位,而编译器为64位。在一些实施例中,32位计算使用数据路径宽度、整数大小和存储器地址宽度为32位的处理器,而64位计算使用数据路径宽度、整数大小和存储器地址宽度为64位的处理器。不同的字长可能会导致指针中存储的地址发生变化,从而导致参数错误地传入或传出函数。方法510可以解决由编译和字长引起的这些问题。方法510可以由虚拟机执行。
框511包括:获得从包括一个或多个输入参数的源代码编译的字节码,源代码包括编码函数以对一个或多个输入参数进行编码、将编码的一个或多个输入参数存储在存储段中、并提供所述存储段的存储位置。在一些实施例中,获得从包括一个或多个输入参数的源代码编译的字节码包括:从计算设备获得由与所述计算设备关联的编译器从包括一个或多个输入参数的源代码编译的字节码。为了与计算设备相关联,编译器可以设置在计算设备内部或设置在计算设备外部并耦接到计算设备。在一示例中,计算设备包括客户端设备,该客户端设备用于指示源代码的编译并向虚拟机传输字节码以供虚拟机执行涉及区块链的操作。
输入参数可以涉及复杂的数据结构。在一些实施例中,一个或多个输入参数可以由包括指针型变量的数据结构来表示。在一些实施例中,一个或多个输入参数中的至少一个包括指针型变量。例如,该函数可以需要一个或多个指针型变量,例如指针、指针阵列等。在一些实施例中,指针型变量包括多个间接型变量。即,一个或多个输入参数可以由包括多个间接型变量的数据结构表示。例如,该函数可能需要双指针(指针指向指针)型变量、三指针型变量、嵌套指针变量等。
在一些实施例中,指针(例如,变量)是编程语言对象,该编程语言对象存储有位于存储器中另一值(例如,另一变量)的存储地址。因此,指针通过引用存储器中的位置来包含另一变量的地址。例如,在c编程语言中,可以通过在另一变量的名称之前放置星号来声明指针。对于诸如双指针的多个间接型变量,第一指针包含第二指针的地址,该地址指向包含另一变量的实际值的位置。可以通过在另一变量的名称之前放置两个星号来声明双指针(例如,int**a)。也即,当双指针间接指向目标值时,访问该目标值需要应用两次星号运算符。
存储位置可以具有各种表示。在一些实施例中,存储段的存储位置包括与存储段的起始或结束地址(例如0x00000000)相对应的指针和与存储段相对应的数据长度(例如4个字节)。数据长度可以与存储在存储段中的数据相对应,该存储段从起始地址开始或终止于结束地址。在一些实施例中,存储段的存储位置包括与存储器段的起始地址(例如,0x00000000)相对应的第一指针和与存储段的结束地址(例如,0x00000003)相对应的第二指针。因此,在编码步骤中,虚拟机可以将输入参数单独地或统一地编码为由指针和数据长度或由第一和第二指针表示的数据流(例如,连续数据流)。包括输入参数的数据流被存储在虚拟机的存储器中。因此,无论输入参数的数据结构多么复杂,都可以通过存储位置容易地引用输入参数以进行检索和存储。类似地,可以在下面描述的步骤中将编码步骤应用于输出参数。
在一些实施例中,部分或全部输入和/或输出参数被编码。即,可以不需要对具有简单数据结构的输入或输出参数进行编码。例如,在c++中,可以选择不对pod(plainolddata)类型的数据进行编码。pod是一种类型(包括类),其中c++编译器保证结构中不会出现“魔术”现象:例如,至v表的隐藏指针、将其转换为其他类型时应用于地址的偏移量(至少如果目标的pod也是如此)、构造函数或析构函数。当类型中的唯一内容是内置类型及其组合时,该类型就是pod。因此,在函数的所有参数中,部分和所有输入和/或输出参数可以被编码。
框512包括:根据字节码,执行编码函数以对一个或多个输入参数进行编码,从而获得存储有编码的一个或多个输入参数的存储段的存储位置。在一些实施例中,虚拟机可以遵循字节码来对一个或多个输入参数进行编码以获得存储位置。
框513包括:将存储位置提供给用于检索编码的一个或多个输入参数并对编码的一个或多个输入参数进行解码的函数,以获得一个或多个输入参数。在一些实施例中,对于提供给该函数的存储位置(例如,上述步骤4123),该存储位置包括存储有与该存储段对应的地址的指针,并且该地址通过从源代码编译成字节码中的编译而被移位。例如,如果存储位置包括与存储器段的起始或结束地址相对应的指针和与存储段相对应的数据长度,则存储在指针中的地址可以被移位并变为地址移位。对于另一示例,如果存储位置包括与存储段的起始地址相对应的第一指针和与存储段的结束地址相对应的第二指针,则存储在第一和第二指针中的地址可能被移位并变为地址移位。通过编码处理,如下所述,移位很容易被恢复。
在一些实施例中,方法510可以进一步包括执行该函数(例如,上述代码414)并退出该函数。执行该函数可以包括:根据虚拟机的存储起始位置和虚拟机获得的地址移位,恢复移位的地址(例如,上述步骤4141);根据恢复的地址检索编码的一个或多个输入参数(例如,上述步骤4142);对编码的一个或多个输入参数进行解码以检索一个或多个输入参数(例如,上述步骤4142);基于一个或多个输入参数调用另一函数以返回一个或多个输出参数(例如,上述步骤4143);并且对一个或多个输出参数进行编码(例如,上述步骤4144)。在一些实施例中,当虚拟机被启动时,虚拟机可以知道存储起始位置。起始位置可以指示在存储器中为各种虚拟机操作分配的位置。由于编译,存储在存储位置的指针中的地址可能会变成地址移位,并以字节码的形式被编译器发送到虚拟机。利用地址移位和起始位置,虚拟机可以恢复移位的地址,并且因此能够根据恢复的地址来检索编码的一个或多个输入参数。例如,如果存储位置包括存储有地址的指针和数据长度,则虚拟机可以根据恢复的地址和数据长度来检索编码的一个或多个输入参数。又例如,如果存储位置包括存储有第一地址的第一指针和存储有第二地址的第二指针,则虚拟机可以根据恢复的第一和第二地址来检索编码的一个或多个输入参数。然后,虚拟机可以对编码的一个或多个输入参数进行解码,以检索用于各种操作的一个或多个输入参数。可选地,各种操作可以生成从函数返回的一个或多个输出参数。
在一些实施例中,编码和解码机制是匹配的机制。可能有各种编码和解码方法,例如unicode编码/解码、base64编码/解码、十六进制编码/解码、url编码/解码、html编码/解码等。
在一些实施例中,方法510可以进一步包括在该函数之外对一个或多个输出参数进行解码。例如,类似于输入参数,虚拟机可以对输出参数进行编码以传出函数,并返回以进行解码以及函数外的进一步操作。虚拟机可以将输出参数编码成另一数据流,保存到由另一存储位置表示的另一存储段,并从函数返回另一存储位置。因此,虚拟机可以遵循字节码来对编码的输出参数进行解码,以恢复原始格式(例如,指针、双指针等)的输出参数。例如,上述步骤4124可以对应于解码步骤。因此,虚拟机使用一个或多个输入参数正确调用该函数以返回一个或多个输出参数。
在一些实施例中,基于一个或多个输入参数调用另一函数以返回一个或多个输出参数包括:调用另一函数以返回区块链的状态。例如,可以执行该函数以获得、返回或更新区块链的状态,或者以其他方式对区块链执行操作。该操作可以与已添加或待添加到区块链的金融交易(例如,执行交易和返回区块链钱包的当前余额)、已添加或待添加到区块链的区块链合约(例如,执行部署的区块链合约和返回执行结果)等相关联。
图6示出了根据一些实施例的用于数据处理的系统610的框图。系统610(例如,计算机系统)可以是由上述节点1、节点2......或节点i或类似设备、任何节点和一个或多个附加设备(例如节点a)的组合或虚拟机(例如,vm1、vm2、vmi、vm313等)实现的示例。例如,方法510可以由系统610实现。系统610可以包括一个或多个处理器以及一个或多个非暂时性计算机可读存储介质(例如,一个或多个存储器),所述非暂时性计算机可读存储介质耦接到一个或多个处理器并配置有可由一个或多个处理器执行以促使系统或设备(例如,处理器)执行上述方法和操作,例如方法510的指令。系统610可以包括与指令(例如,软件指令)相对应的各种单元/模块。
在一些实施例中,系统610可以被称为用于数据处理的装置。装置可以包括获得模块611,用于获得从包括一个或多个输入参数的源代码编译的字节码,源代码包括编码函数以对一个或多个输入参数进行编码、将编码的一个或多个输入参数存储在存储段中、并提供存储段的存储位置;执行模块612,用于根据字节码执行编码函数以对一个或多个输入参数进行编码,从而获得存储有编码的一个或多个输入参数的存储段的存储位置;以及提供模块613,用于将存储位置提供给用于检索编码的一个或多个输入参数并对编码的一个或多个输入参数进行解码的函数,从而获得一个或多个输入参数。
本文描述的技术由一个或多个专用计算设备实现。专用计算设备可以是台式计算机系统、服务器计算机系统、便携式计算机系统、手持设备、网络设备或包含硬连线和/或程序逻辑以实现这些技术的任何其他设备或设备的组合。专用计算设备可以被实现为个人计算机、膝上型计算机、蜂窝电话、照相电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板电脑、可穿戴设备或其组合。计算设备通常由操作系统软件控制和协调。传统的操作系统控制和调度用于执行的计算机进程,执行存储器管理,提供文件系统、网络、i/o服务,以及提供用户界面功能,例如图形用户界面(“gui”)等。本文描述的各种系统、装置、存储介质、模块和单元可以在专用计算设备或者一个或多个专用计算设备的一个或多个计算芯片中实现。在一些实施例中,本文描述的指令可以在专用计算设备上的虚拟机中实现。当被执行时,指令可以促使专用计算设备执行本文描述的各种方法。虚拟机可以包括软件、硬件或其组合。
图7是示出了可以在其上实现本文描述的任何实施例的计算机系统700的框图。系统700可以执行本文描述的任一方法(例如,用于数据处理的方法510)。系统700可以在本文描述的任何系统(例如,用于数据处理的系统610)中实现。系统700可以在本文描述的任何节点中实现,并且被配置为执行用于数据处理的相应步骤。计算机系统700包括总线702或用于传送信息的其它通信机制、与总线702耦接的用于处理信息的一个或多个硬件处理器704。硬件处理器704可以是例如一个或多个通用微处理器。
计算机系统700还包括耦接至总线702的用于存储信息和处理器704可执行指令的主存储器706,诸如随机存取存储器(ram)、高速缓存和/或其他动态存储设备。主存储器706还可以用于存储在执行处理器704可执行指令期间的临时变量或其它中间信息。当这些指令被存储在处理器704可访问的存储介质中时,这些指令使计算机系统700呈现为专用机器,所述专用机器被定制以执行指令中所指定的操作。计算机系统700还包括耦接至总线702的用于存储针对处理器704的静态信息和指令的只读存储器(rom)708或其他静态存储设备。诸如磁盘、光盘或usb拇指驱动器(闪存驱动器)等的存储设备710被提供并耦接至总线702,用于存储信息和指令。
计算机系统700可以使用定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑实现本文描述的技术,程序逻辑与计算机系统相结合使得计算机系统700成为专用机器或将计算机系统700编程为专用机器。根据一个实施例,响应于处理器704执行包含在主存储器706中的一个或多个指令的一个或多个序列,计算机系统700执行本文描述的操作、方法和步骤。这些指令可以从另一存储介质诸如存储设备710读入主存储器706。执行包含在主存储器706中的指令序列使得处理器704执行本文描述的处理步骤。在可选实施例中,可以使用硬连线电路代替软件指令或将硬连线电路与软件指令组合使用。
主存储器706、rom708和/或存储设备710可以包括非暂时性存储介质。本文使用的术语“非暂时性介质”和类似术语是指存储有促使机器以特定方式运行的数据和/或指令的介质,所述介质不包括暂时性信号。这种非暂时性介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘或磁盘,诸如存储设备710。易失性介质包括动态存储器,例如主存储器706。常规形式的非暂时性介质包括,例如,软盘、软磁盘、硬盘、固态驱动器、磁带或任何其他磁数据存储介质、cd-rom、任何其他光学数据存储介质、具有孔图案的任何物理介质、ram、prom和eprom、flash-eprom、nvram、任何其他存储器芯片或盒以及其网络版本。
计算机系统700还包括耦接至总线702的网络接口718。网络接口718提供耦接至一个或多个网络链路的双向数据通信,所述一个或多个网络链路连接至一个或多个本地网络。例如,网络接口718可以是综合业务数字网络(isdn)卡、电缆调制解调器、卫星调制解调器或给相应类型的电话线提供数据通信连接的调制解调器。作为另一示例,网络接口718可以是给兼容局域网(lan)(或与wan通信的wan组件)提供数据通信连接的lan卡。还可以实现为无线链路。在任何这样的实现方式中,网络接口718发送和接收电信号、电磁信号或光信号,电信号、电磁信号或光信号承载着表示各种类型的信息的数字数据流。
计算机系统700可以通过网络、网络链路和网络接口718发送消息并接收包括程序代码的数据。在因特网示例中,服务器可以通过因特网、isp、本地网络和网络接口718传输所请求的用于应用的代码。
所接收的代码可以在被接收时由处理器704执行,和/或存储在存储设备710或其他非易失性存储设备中以供稍后执行。
前面部分中描述的每个步骤、方法和算法可以体现在代码模块中并且由代码模块完全或部分自动化地,代码模块由包括计算机硬件的一个或多个计算机系统或者计算机处理器执行。步骤和算法可以部分或全部地在专用电路中实现。
上述各种特征和步骤可彼此独立地使用,或者可以各种方式组合。所有可能的组合和子组合都旨在落入本文的范围内。另外,在一些实施方式中可以省略某些方法或步骤框。本文描述的方法和步骤也不限于任何特定顺序,与其相关的框或状态可以以适当的其他顺序执行。例如,所描述的框或状态可以以不同于具体公开的顺序执行,或者多个框或状态可以在单个框或状态中组合。框或状态的示例可以串行、并行或以某种其他方式执行。可以将框或状态添加到所公开的实施例中或从所公开的实施例中移除。本文描述的系统和组件的示例可以被配置为与所描述的不同。例如,与所公开的实施例相比,可以添加、移除或重新布置元件。
本文描述的方法的各种操作可以至少部分地由被临时配置(例如,通过软件)或被永久配置为执行相关操作的一个或多个处理器执行。无论是临时配置还是永久配置,这样的处理器可以构成处理器实现的引擎,所述处理器实现的引擎用于执行本文描述的一个或多个操作或功能。
类似地,本文描述的方法可以至少部分地由处理器实现,其中特定处理器是硬件的示例。例如,所述方法的至少一些操作可以由一个或多个处理器或处理器实现的引擎执行。此外,一个或多个处理器还用于支持“云计算”环境中的相关操作的性能,或用作“软件即服务”(saas)操作。例如,至少一些操作可以由一组计算机(作为包括处理器的机器的示例)执行,其中这些操作可以经由网络(例如,因特网)并经由一个或多个适当的接口(例如,应用编程接口(api))来访问。
某些操作的性能可以在处理器之间分配,不仅驻留在单个机器中,而且跨多个机器被部署。在一些实施例中,处理器或处理器实现的引擎可以位于单个地理位置(例如,在家庭环境、办公室环境或服务器群内)。在其他实施例中,处理器或处理器实现的引擎可以分布在多个地理位置。
在本文中,多个实例可以实现被描述为单个实例的组件、操作或结构。尽管一个或多个方法的各个操作被示出并描述为独立的操作,但是可以同时执行一个或多个独立的操作,并且不需要以所示的顺序执行所述操作。在配置中作为独立组件呈现的结构和功能可以实现为组合结构或组件。类似地,作为单个组件呈现的结构和功能可以实现为独立的组件。这些和其他变化、修改、添加和改进都落入本文中的主题的范围内。此外,本文使用的相关术语(诸如“第一”、“第二”、“第三”等)不表示任何顺序、高度或重要性,而是用于将一个元件与另一元件区分开。此外,术语“一”、“一个”和“多个”在本文中并不表示对数量的限制,而是表示存在至少一个所述的物品。
尽管已经参考具体实施例描述了主题的概述,但是在不脱离本文的实施例的较宽范围的情况下,可以对这些实施例进行各种修改和改变。具体实施方式不应被视为具有限制意义,并且各种实施例的范围仅由所附权利要求以及这些权利要求所享有的等同物的全部范围限定。