区块链中实现隐私保护的方法及节点、存储介质
技术领域
本说明书一个或多个实施例涉及区块链技术领域,尤其涉及一种区块链中实现隐私保护的方法及节点、存储介质。
背景技术
区块链技术构建在传输网络(例如点对点网络)之上。传输网络中的网络节点利用链式数据结构来验证与存储数据,并采用分布式节点共识算法来生成和更新数据。这些区块链网络中的节点有时需要增加。
目前企业级的区块链平台技术上最大的两个挑战就是隐私和性能,往往这两个挑战很难同时解决。大多解决方案都是通过损失性能换取隐私,或者不大考虑隐私去追求性能。常见的解决隐私问题的加密技术,如同态加密(Homomorphic encryption)和零知识证明(Zero-knowledge proof)等复杂度高,通用性差,而且还可能带来严重的性能损失。
在解决隐私方面,可信执行环境(Trusted Execution Environment,TEE)是另一种解决方式。TEE可以起到硬件中的黑箱作用,在TEE中执行的代码和数据操作系统层都无法偷窥,只有代码中预先定义的接口才能对其进行操作。在效率方面,由于TEE的黑箱性质,在TEE中进行运算的是明文数据,而不是同态加密中的复杂密码学运算,计算过程效率没有损失,因此与TEE相结合可以在性能损失较小的前提下很大程度上提升区块链的安全性和隐私性。目前工业界十分关注TEE的方案,几乎所有主流的芯片和软件联盟都有自己的TEE解决方案,包括软件方面的TPM(Trusted Platform Module,可信赖平台模块)以及硬件方面的Intel SGX(Software Guard Extensions,软件保护扩展)、ARMTrustzone(信任区)和AMD PSP(Platform Security Processor,平台安全处理器)。
发明内容
有鉴于此,本说明书一个或多个实施例提供一种区块链中实现隐私保护的方法及节点、存储介质。
为实现上述目的,本说明书一个或多个实施例提供技术方案如下:
根据本说明书一个或多个实施例的第一方面,提出了一种区块链中实现隐私保护的方法,包括:
区块链节点确定接收到的交易对应的智能合约;
所述区块链节点在可信执行环境中执行所述智能合约;
所述区块链节点采用键值对结构存储所述智能合约涉及的合约状态时,分别对合约状态和对应的键进行加密。
根据本说明书一个或多个实施例的第二方面,提出了一种区块链中实现隐私保护的节点,包括:
确定单元,用于确定接收到的交易对应的智能合约;
执行单元,用于在可信执行环境中执行所述智能合约;
加密单元,用于所述区块链节点采用键值对结构存储所述智能合约涉及的合约状态时,分别对合约状态和对应的键进行加密。
根据本说明书一个或多个实施例的第三方面,提出了一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如第一方面所述方法的步骤。
附图说明
图1是一示例性实施例提供的一种创建智能合约的示意图。
图2是一示例性实施例提供的一种调用智能合约的示意图。
图3是一示例性实施例提供的一种创建和调用智能合约的示意图。
图4是一示例性实施例提供的一种区块链中实现隐私保护的方法的流程图。
图5是一示例性实施例提供的一种处理区块链交易的示意图。
图6是一示例性实施例提供的一种密钥版本演进的示意图。
图7是一示例性实施例提供的一种合约状态的数据结构的示意图。
图8是一示例性实施例提供的一种区块链中实现隐私保护的节点的组成图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
区块链一般被划分为三种类型:公有链(Public Blockchain),私有链(PrivateBlockchain)和联盟链(Consortium Blockchain)。此外,还有多种类型的结合,比如私有链+联盟链、联盟链+公有链等不同组合形式。其中去中心化程度最高的是公有链。公有链以比特币、以太坊为代表,加入公有链的参与者可以读取链上的数据记录、参与交易以及竞争新区块的记账权等。而且,各参与者(即节点)可自由加入以及退出网络,并进行相关操作。私有链则相反,该网络的写入权限由某个组织或者机构控制,数据读取权限受组织规定。简单来说,私有链可以为一个弱中心化系统,参与节点具有严格限制且少。这种类型的区块链更适合于特定机构内部使用。联盟链则是介于公有链以及私有链之间的区块链,可实现“部分去中心化”。联盟链中各个节点通常有与之相对应的实体机构或者组织;参与者通过授权加入网络并组成利益相关联盟,共同维护区块链运行。
不论是公有链、私有链还是联盟链,都可能提供智能合约的功能。区块链上的智能合约是在区块链系统上可以被交易触发执行的合约。智能合约可以通过代码的形式定义。
以以太坊为例,支持用户在以太坊网络中创建并调用一些复杂的逻辑,这是以太坊区别于比特币区块链技术的最大挑战。以太坊作为一个可编程区块链的核心是以太坊虚拟机(EVM),每个以太坊节点都可以运行EVM。EVM是一个图灵完备的虚拟机,这意味着可以通过它实现各种复杂的逻辑。用户在以太坊中发布和调用智能合约就是在EVM上运行的。实际上,虚拟机直接运行的是虚拟机代码(虚拟机字节码,下简称“字节码”)。部署在区块链上的智能合约可以是字节码的形式。
例如图1所示,Bob将一个包含创建智能合约信息的交易发送到以太坊网络后,节点1的EVM可以执行这个交易并生成对应的合约实例。交易的data字段保存的可以是字节码,交易的to字段为一个空的账户。节点间通过共识机制达成一致后,这个合约成功创建,后续用户可以调用这个合约。
合约创建后,区块链上出现一个与该智能合约对应的合约账户,并拥有一个特定的地址,合约代码和账户存储将保存在该合约账户中。智能合约的行为由合约代码控制,而智能合约的账户存储则保存了合约的状态。换句话说,智能合约使得区块链上产生包含合约代码和账户存储(Storage)的虚拟账户。
此外,如图2所示,仍以以太坊为例,Bob将一个包含调用智能合约信息的交易发送到以太坊网络后,节点1的EVM可以执行这个交易并生成对应的合约实例。图中2中交易的from字段是发起调用智能合约的账户的地址,to字段中的“0x692a70d2…”代表了被调用的智能合约的地址,value字段在以太坊中是以太币的值,交易的data字段保存的调用智能合约的方法和参数。调用智能合约后,balance的值可能改变。后续,某个客户端可以通过某一区块链节点查看balance的当前值。
智能合约可以通过规定的方式在区块链网络中的每个节点独立地执行,所有执行记录和数据都保存在区块链上,所以当这样的交易完成后,区块链上就保存了无法篡改、不会丢失的交易凭证。
创建智能合约和调用智能合约的示意图如图3所示。以太坊中要创建一个智能合约,需要经过编写智能合约、变成字节码、部署到区块链等过程。以太坊中调用智能合约,是发起一笔指向智能合约地址的交易,智能合约代码分布式地运行在以太坊网络中每个节点的虚拟机中。
以下结合图4所示说明本说明书一区块链中实现合约调用的方法实施例的实现过程:
步骤402,第一区块链节点确定接收到的交易对应的智能合约。
在一实施例中,交易可以由客户端提交至第一区块链节点。例如,用户在客户端生成该交易后,通过该客户端将交易提交至第一区块链节点。以图5为例,第一区块链节点中包含交易/查询接口,该接口可与客户端对接,使得客户端可以向第一区块链节点提交交易。
所述交易也可由第二区块链节点转发至第一区块链节点。例如,用户在客户端生成该交易后,通过该客户端将该交易提交至第二区块链节点;然后,第二区块链节点进一步将该交易转发至第一区块链节点。以图5为例,上述接口可与其他区块链节点对接,比如该其他区块链节点可以包含上述的第二区块链节点,使得第二区块链节点可以向第一区块链节点转发交易。类似地,第二区块链节点也可通过自身的交易/查询接口与客户端对接,以接收客户端提交的交易。
比如在采用工作量证明(Proof of Work,POW)以及股权证明(Proof of Stake,POS)、委任权益证明(Delegated Proof of Stake,DPOS)等共识算法的区块链网络中,第二区块链节点在收到客户端提交的该交易后,立即扩散(如广播)至以太坊网络中的其他区块链节点。
再比如在采用实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)等机制的区块链网络中,记账节点在本轮记账前已经商定好,使得第二区块链节点在收到客户端提交的该交易后,若自身并非记账节点,则将该交易发送至已确定的记账节点,使得该记账节点在进一步的共识阶段将交易(包括该交易)打包发送至各个验证节点。而当第二区块链节点自身为已确定的记账节点时,其他区块链节点收到客户端提交的交易后,可以将交易转发至该第二区块链节点;然后,第二区块链节点可以在共识阶段将上述交易(或还包括其他交易)打包发送至各个验证节点,包括第一区块链节点。
在一实施例中,可以通过交易级别的标注,将所述交易标注为隐私交易,使得第一区块链节点确定所述智能合约对应的执行结果(如该智能合约涉及的合约状态)需要加密后存储。例如,可以在交易中添加类型字段,使得第一区块链可以据此识别交易类型为明文交易或隐私交易。在相关技术中,例如在以太坊网络中,交易通常包含to、value、data等字段。而本实施例在相关技术的基础上,在交易中增加一类型字段,比如表征为type字段,并基于该类型字段的取值,表明相关交易的类型;例如,当类型字段为第一取值时,表明相关交易为明文交易,当类型字段为第二取值时,表明相关交易为隐私交易。
在一实施例中,可以通过合约级别的标注,将所述智能合约标注为隐私处理类型,使得第一区块链节点确定所述智能合约对应的执行结果(如该智能合约涉及的合约状态)需要加密后存储。例如,交易中可以存在对所需调用的智能合约标注的处理类型,使得第一区块链节点可以针对该交易中标注的处理类型,对该交易调用的的智能合约采用对应的处理操作。比如,智能合约的代码中可以包括一类型字段,第一区块链节点可以基于每一智能合约的代码中所含类型字段的取值,确定该智能合约为隐私处理类型或是明文处理类型;再比如,隐私处理类型的智能合约中可以包含隐私标识符、明文处理类型的智能合约可以不包含该隐私标识符;又比如,明文处理类型的智能合约可以包含明文标识符、隐私处理类型的智能合约可以不包含该明文标识符;相应地,第一区块链节点可以基于上述差异,区分不同处理类型的智能合约。
在一实施例中,当所述交易处于加密状态时,第一区块链节点可以在可信执行环境(Trusted Execution Environment,TEE)中解密所述交易。TEE是基于CPU硬件的安全扩展,且与外部完全隔离的可信执行环境。TEE最早是由GlobalPlatform提出的概念,用于解决移动设备上资源的安全隔离,平行于操作系统为应用程序提供可信安全的执行环境。ARM的Trust Zone技术最早实现了真正商用的TEE技术。
伴随着互联网的高速发展,安全的需求越来越高,不仅限于移动设备,云端设备,数据中心都对TEE提出了更多的需求。TEE的概念也得到了高速的发展和扩充。现在所说的TEE相比与最初提出的概念已经是更加广义的TEE。例如,服务器芯片厂商Intel,AMD等都先后推出了硬件辅助的TEE并丰富了TEE的概念和特性,在工业界得到了广泛的认可。现在提起的TEE通常更多指这类硬件辅助的TEE技术。不同于移动端,云端访问需要远程访问,终端用户对硬件平台不可见,因此使用TEE的第一步就是要确认TEE的真实可信。因此现在的TEE技术都引入了远程证明机制,由硬件厂商(主要是CPU厂商)背书并通过数字签名技术确保用户对TEE状态可验证。同时仅仅是安全的资源隔离也无法满足的安全需求,进一步的数据隐私保护也被提出。包括Intel SGX,AMDSEV在内的商用TEE也都提供了内存加密技术,将可信硬件限定在CPU内部,总线和内存的数据均是密文防止恶意用户进行窥探。例如,英特尔的软件保护扩展(SGX)等TEE技术隔离了代码执行、远程证明、安全配置、数据的安全存储以及用于执行代码的可信路径。在TEE中运行的应用程序受到安全保护,几乎不可能被第三方访问。
以Intel SGX技术为例,SGX提供了围圈(enclave,也称为飞地),即内存中一个加密的可信执行区域,由CPU保护数据不被窃取。以第一区块链节点采用支持SGX的CPU为例,利用新增的处理器指令,在内存中可以分配一部分区域EPC(Enclave Page Cache,围圈页面缓存或飞地页面缓存),通过CPU内的加密引擎MEE(Memory Encryption Engine)对其中的数据进行加密。EPC中加密的内容只有进入CPU后才会被解密成明文。因此,在SGX中,用户可以不信任操作系统、VMM(Virtual Machine Monitor,虚拟机监控器)、甚至BIOS(BasicInput Output System,基本输入输出系统),只需要信任CPU便能确保隐私数据不会泄漏。实际应用中,可以将隐私数据加密后以密文形式传递至围圈中,并通过远程证明将对应的秘钥也传入围圈。然后,在CPU的加密保护下利用数据进行运算,结果会以密文形式返回。这种模式下,既可以利用强大的计算力,又不用担心数据泄漏。
假定上述的交易由用户在某一客户端处生成,该客户端可以首先生成明文交易内容,然后将该明文交易内容用密钥加密。所述加密,可以采用对称加密,也可以采用非对称加密。相应地,第一区块链节点可以用对应的密钥解密所述交易,以获得明文交易内容。如果客户端用对称加密方式,即用对称加密算法的私钥对明文交易内容加密,则相应地,第一区块链节点可以用所述对称加密算法的私钥解密所述交易。对称加密采用的加密算法,例如是DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法等。对称加密算法的密钥,例如可以是由客户端和第一区块链节点协商确定。
如果用非对称加密方式,即用非对称加密算法的公钥对明文交易内容加密,则相应地,第一区块链节点可以用所述非对称加密算法的私钥解密所述交易。非对称加密算法,例如是RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。非对称加密算法的密钥,例如可以是由第一区块链节点生成一对公钥和私钥,并将公钥在步骤402之前发送至所述客户端,从而步骤402中所述客户端可以将明文交易内容用密钥加密。
非对称加密算法的密钥,也可以由一个密钥管理服务器生成。通过远程证明的方式,密钥管理服务器将私钥发送至第一区块链节点,具体的,可以是传入第一区块链节点的围圈中。第一区块链节点可以包含多个围圈,而上述私钥可以被传入这些围圈中的安全围圈;例如,该安全围圈可以为QE(Quoting Enclave)围圈,而非AE(Application Enclave)围圈。对于非对称加密的公钥,可以由密钥管理服务器发送至所述客户端。因而在步骤402中,所述客户端可以用该公钥加密明文交易内容,相应地,第一区块链节点可以用所述私钥解密所述交易,以得到该交易包含的明文交易内容。
客户端也可以采用对称加密结合非对称加密相结合的方式。例如,客户端采用对称加密算法加密明文交易内容,即采用对称加密算法的私钥加密明文交易内容,并用非对称加密算法加密对称加密算法中采用的私钥。一般的,采用非对称加密算法的公钥加密对称加密算法中采用的私钥。这样,第一区块链节点接收到加密的交易后,可以先采用非对称加密算法的私钥进行解密,得到对称加密算法的私钥,进而用对称加密算法的私钥解密得到明文交易内容。
例如,密钥管理服务器通过远程证明可以将非对称加密算法的私钥发送至第一区块链节点的围圈,并将非对称加密算法的公钥发送至所述客户端。因而,所述客户端可以采用对称加密方式加密明文交易内容,即采用对称加密算法的私钥加密明文交易内容,并用非对称加密算法的公钥加密对称加密算法中采用的私钥。进而,所述客户端可以将所述交易和加密私钥(由非对称加密算法的公钥对所述对称加密算法中采用的私钥进行加密后得到)发送至第一区块链节点。第一区块链节点接收到所述交易和加密私钥后,可以先用非对称加密算法的私钥对该加密私钥进行解密得到对称加密算法的私钥,进而用该对称加密算法的私钥解密所述交易,得到明文交易内容。这里的加密方式一般称为数字信封加密。
步骤404,第一区块链节点在可信执行环境中执行所述智能合约。
在一实施例中,所述交易用于创建智能合约,该交易可以包含智能合约的代码。第一区块链节点通过在可信执行环境中执行交易所含的智能合约的代码,完成对智能合约的创建。
在一实施例中,所述交易用于调用智能合约,该交易可以包含被调用的智能合约的合约地址。第一区块链节点根据交易所含智能合约的合约地址,对相应的智能合约的代码进行调用。如果被调用的智能合约为明文合约,即该智能合约的代码以明文形式存储于外部存储空间,第一区块链节点可以将该明文代码直接读入可信执行环境中予以执行;如果被调用的智能合约为隐私合约,即该智能合约的代码以密文形式存储于外部存储空间,第一区块链节点可以根据可信执行环境中保存的密钥对该密文代码进行解密,并在可信执行环境中为解密得到的明文代码予以执行。
步骤406,第一区块链节点采用键值对结构存储所述智能合约涉及的合约状态时,分别对合约状态和对应的键进行加密。
第一区块链节点可以利用CPU中新增的处理器指令,在内存中可以分配一部分区域EPC,通过CPU内的加密引擎MEE对上述的明文代码进行加密存入所述EPC中。EPC中加密的内容进入CPU后被解密成明文。在CPU中,对所述明文的代码进行运算,完成执行过程。
SGX技术中,执行所述智能合约的代码,可以将EVM加载进所述围圈中。在远程证明过程中,所述密钥管理服务器可以计算本地EVM代码的hash值,并与第一区块链节点中加载的EVM代码的hash值比对,比对结果正确作为通过远程证明的一个必要条件,从而完成对第一区块链节点SGX围圈加载的代码的度量。经过度量,正确的EVM可以在SGX中执行所述智能合约代码。
EVM对智能合约的代码执行完毕后,可以输出合约状态的取值,而第一区块链节点可以采用键值对(key-value)结构对合约状态进行存储,比如value对应于合约状态的取值、key用于对value进行索引。在相关技术中,往往仅对value进行加密处理,而并不对key进行加密,而EVM对key的输出过于简单,比如key值等于对应的合约状态在智能合约中的出现次序,即首个输出的合约状态对应的key值为0、第二个输出的合约状态的key值为1,以此类推。因此,当采用明文的key值进行存储时,容易被不法分子根据key值的取值规律而推测出各个key值对应的value所代表的合约状态,并进而通过比对密文等方式推断或猜测合约状态的取值(如合约状态的数值、多个合约状态之间的取值是否相同、多个合约状态之间的取值大小关系等),容易造成隐私泄露。
因此,本说明书中在通过键值对结构存储合约状态时,不仅针对合约状态对应的value进行加密,还针对相应的key进行加密,使得不法分子无法通过加密后的key值推断出相应的value所代表的合约状态,有助于保证数据安全。
在一实施例中,第一区块链节点可以获取可信执行环境中维护的安全密钥,并通过对称加密方式或非对称加密方式对合约状态对应的key进行加密。例如,当安全密钥为对称加密算法的私钥时,可以通过该对称加密算法的私钥对合约状态对应的key进行加密,而后续同样通过该对称加密算法的私钥进行解密。再例如,当安全密钥为非对称加密算法的公钥时,可以通过该非对称加密算法的公钥对合约状态对应的key进行加密,而后续通过该非对称加密算法的私钥进行解密。
在一实施例中,第一述区块链节点可以将合约状态对应的key与所述安全密钥进行拼接后,对拼接数据进行哈希计算,将计算得到的哈希值作为加密后的key。比如可以通过诸如SHA256等其他哈希算法实施上述的哈希计算。
在一实施例中,可信执行环境中可以仅维护有一个安全密钥,则第一区块链节点针对key进行加密时可以使用该安全密钥。例如,该安全密钥可以是对称加密的密钥,例如是seal(Simple Encrypted Arithmetic Library)密钥。所述seal密钥,例如可以是通过远程证明后由密钥管理服务器发送给第一区块链节点,再例如可以是区块链中的各个节点(如第一区块链节点与其他区块链节点)之间协商得到。所述安全密钥可以被存储于第一区块链节点的围圈中。第一区块链节点可以包含多个围圈,而上述安全密钥可以被传入这些围圈中的安全围圈;例如,该安全围圈可以为QE围圈,而非AE围圈。
在一实施例中,可信执行环境中可以维护有若干版本的安全密钥,且低版本的安全密钥由高版本的安全密钥不可逆地计算得到。例如图6所示,可以将上述的seal密钥作为最高版本的根密钥,并基于该seal密钥依次生成其他低版本的密钥,比如版本号分别为0~255的256个版本的密钥。其中,通过将seal密钥与版本因子0xFF(十进制的取值为255,即需要生成的密钥的版本号;当然,也可以采用其他取值)进行哈希计算,得到版本号为255的密钥key-255;通过将密钥key-255与版本因子0xFE进行哈希计算,得到版本号为254的密钥key-254;……通过将密钥key-1与版本因子0x00进行哈希计算,得到版本号为0的密钥key-0。由于哈希算法的特性,使得高版本密钥与低版本密钥之间的计算不可逆,比如可以由密钥key-1与版本因子0x00计算得到密钥key-0,但是不能够通过密钥key-0与版本因子0x00反推出密钥key-1。
那么,第一区块链节点可以通过最低版本的安全密钥对合约状态对应的key进行加密。比如对于图6所示的密钥key-0~密钥key-255,可以采用密钥key-0对合约状态对应的key进行加密,这样即便第一区块链节点丢失了密钥key-0,但只需要掌握其他任意版本的密钥,均可以推导计算出密钥key-0。当然,第一区块链节点也可以通过其他版本的密钥对合约状态对应的key进行加密,本说明书并不对此进行限制。
在一实施例中,对合约状态、合约状态对应的key进行加密时,可以采用相同的密钥。比如当可信执行环境中仅包含上述的seal密钥时,可以分别采用该seal密钥进行加密。再比如当可信执行环境中包含上述若干版本的密钥时,可以分别采用相同版本的密钥进行加密。
在一实施例中,当可信执行环境中包含上述若干版本的密钥时,可以分别采用不同的密钥对合约状态、合约状态对应的key进行加密。实际上,由于合约状态的数据安全需求相对更高,因此可以采用安全等级相对更高的密钥对合约状态进行加密,而采用安全等级相对更低的密钥对合约状态对应的key进行加密;例如,对合约状态进行加密时采用的密钥版本可以高于对合约状态对应的key进行加密的密钥版本,这样即便合约状态对应的key被攻破,也无法反推出更高版本的密钥,确保合约状态处于安全状态。
第一区块链节点收到的交易调用智能合约时,该智能合约可以涉及很多合约状态。对于各个合约状态分别对应的键值对结构:出于较低的安全防护需求,可以采用统一的密钥对各个键值对结构中的“键”进行加密,比如统一采用上述的密钥key-0;而对于各个合约状态、即键值对结构中的“值”,虽然可以采用相同的密钥进行加密,但是可能会由于加密后数据之间的联动变化,暴露合约状态的数值变化情况、数值关联等信息。
因此,对于智能合约所涉及的各个合约状态,可以分别采用不同的密钥进行加密。
在一实施例中,可以分别对不同的合约状态采用不同版本的密钥进行加密。当智能合约所涉及的合约状态较少、密钥版本充足的情况下,可以采用这种方式;但是,如果智能合约所涉及的合约状态较多、超出了密钥版本的数量,可能导致部分合约状态之间需要共用同一版本的密钥,或者需要临时生成更多版本的密钥。
在一实施例中,不同的合约状态可以采用同一版本的密钥,但可以添加其他的影响因子,使得每一合约状态实际采用的密钥由某一版本的密钥与影响因子共同生成,确保各个合约状态使用不同的密钥进行加密,且对密钥版本的数量没有额外要求。
假定智能合约涉及合约状态X1~Xn,共n个合约状态,分别对应于密钥K1~Kn。那么,合约状态Xi对应的密钥Ki可由第一区块链节点根据保存于所述可信执行环境的安全密钥(如seal密钥或者某一版本的密钥;为了便于理解,下文均以“安全密钥”进行描述)和至少一个对应于合约状态Xi的影响因子而生成,1≤i≤n。
在一实施例中,用于生成的密钥的影响因子包括两类:私有影响因子和公共影响因子。私有影响因子仅适用于对应的合约状态、不适用于其他合约状态,比如合约状态X1的私有影响因子,不适用于合约状态X2~Xn。公共影响因子同时适用于所有合约状态。
在一实施例中,合约状态Xi对应的密钥Ki可由安全密钥和至少一个对应于合约状态Xi的私有影响因子而生成。例如,第一区块链节点可以对安全密钥和至少一个对应于合约状态Xi的私有影响因子进行拼接后,对拼接信息进行哈希计算,并将计算得到的哈希值或该哈希值的一部分(比如前128位或其他部分)作为所述密钥Ki,以针对合约状态Xi进行加密。由于各个合约状态的私有影响因子各不相同,可以保证据此生成对应的密钥K1~Kn时,各个密钥必然各不相同,使得各个合约状态X1~Xn可以分别使用不同的密钥进行加密。
对应于合约状态Xi的私有影响因子可以包括:合约状态Xi在所述智能合约中的出现顺序Pi。在第一区块链节点执行所述智能合约的代码时,会依次读取该智能合约代码中包含的各个合约状态,可以将各个合约状态对应的出现顺序P1~Pn,作为合约状态X1~Xn分别对应的私有影响因子之一。例如,当合约状态X3第一个出现时,该合约状态X3的私有影响因子可以包括出现顺序P3=1,而当合约状态X100第88个出现时,该合约状态X100的私有影响因子可以包括出现顺序P100=88。由于不同的合约状态总会以不同的顺序出现,因而可以确保各个合约状态对应的出现顺序P1~Pn必然不同。
对应于合约状态Xi的私有影响因子可以包括:对应于所述出现顺序的计数值Qi。针对合约状态的出现顺序,第一区块链节点可以不直接使用出现顺序,而是使用对应于出现顺序的计数值Qi,作为私有影响因子。如果每次都从1开始计数、计数间隔为1,那么计数值Qi与出现顺序Pi的取值可以相同;而如果并不从1开始计数或者计数间隔不是1,那么计数值Qi与出现顺序Pi的取值并不相同,但维持一预设的数值关系,比如当从a开始计数、计数间隔为b时,该数值关系为Qi=a+b×(Pi-1)。由于不同的合约状态总会以不同的顺序出现,因而基于上述的数值关系,可以确保各个合约状态对应的计数值Q1~Qn必然不同。
对应于合约状态Xi的私有影响因子可以包括:分配至合约状态Xi的随机数Si。第一区块链节点可以直接向各个合约状态X1~Xn分配随机数S1~Sn,只要确保各个合约状态对应的随机数不重复即可。同时,通过采用随机数Si,使得即便不同的交易对同一智能合约进行调用时,针对该智能合约中的同一合约状态可能会分配不同的随机数,从而对不同交易所产生的合约状态采用差异化的密钥,可以进一步增强数据安全性。
当然,对应于合约状态Xi的私有影响因子可以存在多个,比如上述的出现顺序Pi、计数值Qi、随机数Si之间的任意两个或更多私有影响因子之间的组合。基于更多数量的私有影响因子,可以在部分私有影响因子由于某种原因而泄露时,通过其他私有影响因子确保对应的私钥不会被算出或推测出。
在一实施例中在上述私有影响因子的基础上,密钥的生成还可以与公共影响因子相关。例如,第一区块链节点可以对安全密钥、至少一个对应于合约状态Xi的私有影响因子和至少一个公共影响因子进行拼接后,对拼接信息进行哈希计算,并将计算得到的哈希值或该哈希值的一部分(比如前128位或其他部分)作为所述密钥Ki,以针对合约状态Xi进行加密。
其中,由于各个合约状态的私有影响因子各不相同,可以保证据此生成对应的密钥K1~Kn时,各个密钥必然各不相同,使得各个合约状态X1~Xn可以分别使用不同的密钥进行加密。而通过添加公共影响因子,可以实现其他粒度或层级的隐私保护。
合约状态Xi对应的密钥Ki还可以与历史区块高度相关。例如,该历史区块高度可以为:第一区块链节点在收到上述交易时,区块链账本中的区块高度。由于该历史区块高度与上述交易相关,因而可以在交易粒度上对密钥进行区分。比如,当分别发起与智能合约S1相关的交易R1、R2时,由于调用了同一个智能合约S1,使得相同的合约状态对应的私有影响因子可能相同(如果采用随机数则通常不同),譬如交易R1、R2均涉及到合约状态Y1~Yn。如果仅根据安全密钥和私有影响因子来生成密钥,可使R1对应的合约状态Y1~Yn之间采用不同的密钥K1_1~K1_n,R2对应的合约状态之间采用不同的密钥K2_1~K2_n,但是相同合约状态可能在不同交易中对应于相同的密钥,比如K1_i=K2_i。但是,由于不同交易R1、R2在不同时刻被递交,可能对应于不同的历史区块高度,因而通过将历史区块高度纳入对密钥的计算过程,即根据安全密钥、私有影响因子和公共影响因子(如历史区块高度)来生成密钥,可以可使相同合约状态在不同交易中对应于不同的密钥,即K1_i≠K2_i。
与历史区块高度相类似的,公共影响因子还可以包括:所述交易所处区块的区块高度、所述交易在所处区块中的位置偏移量等。这些公共影响因子可以在“交易”粒度上产生影响,使得不同交易在调用同一智能合约(同一合约地址,或者合约地址不同、代码哈希值相同)时,该智能合约的合约状态在不同交易中对应于不同的密钥。
而其他的公共影响因子,还可以产生其他粒度的影响。
比如公共影响因子可以包括:所述智能合约的合约地址,使得不同交易(同一发起方或不同发起方)对同一合约地址的智能合约进行调用时,同一合约状态对应于相同的密钥,而不同交易对不同合约地址的智能合约进行调用时,同一合约状态(不同合约地址通常存在至少一部分合约状态不同)对应于不同的密钥。
再比如公共影响因子可以包括:所述智能合约的代码哈希值,使得不同交易(同一发起方或不同发起方)对代码哈希值相同的智能合约进行调用时,同一合约状态对应于相同的密钥,而不同交易对代码哈希值不同的智能合约进行调用时,同一合约状态(代码哈希值不同时,通常存在至少一部分合约状态不同)对应于不同的密钥。
又比如公共影响因子可以包括:所述智能合约的合约创建者的账户地址,使得不同交易(同一发起方或不同发起方)分别对代码相同、但创建者不同的多个智能合约进行调用时,可以确保同一合约状态对应于不同的密钥。
又比如公共影响因子可以包括:所述交易的发起方的账户地址,使得同一用户针对同一智能合约发起调用时,同一合约状态对应于相同的密钥,而不同用户分别针对同一智能合约发起调用时,同一合约状态对应于不同的密钥。
当然,公共影响因子可以存在多个,比如上述的历史区块高度、所述交易所处区块的区块高度、所述交易在所处区块中的位置偏移量、所述智能合约的合约地址、所述智能合约的代码哈希值、所述智能合约的合约创建者的账户地址、所述交易的发起方的账户地址之间的任意两个或更多公共影响因子之间的组合。基于更多数量的公共影响因子,可以在部分公共影响因子由于某种原因而泄露时,通过其他公共影响因子确保对应的私钥不会被算出或推测出,还可以实现对应粒度的隐私保护。
而为了表明每一合约状态在加密时采用的密钥,第一区块链节点可以将加密后的合约状态与相应密钥的生成方式描述信息进行关联存储。密钥Ki的生成方式描述信息可以包括:所述安全密钥的版本信息和对应于合约状态Xi的影响因子的取值。例如图7所示,第一区块链节点可以在Info字段中写入安全密钥的版本信息、在Nounce字段中写入影响因子的取值、在Cipher字段中写入加密后的合约状态,而Tag字段用于验证Cipher字段的完整性。
Info字段的长度可以为4Bytes,其中2Bytes用于写入密钥版本号,剩余的2Bytes为保留字节。Nounce字段的长度可以为12Bytes,其中4Bytes用于写入历史区块高度、4Bytes用于写入交易在区块中的位置偏移量、4Bytes用于写入计数值。Cipher字段的长度可以为32Bytes。Tag字段的长度可以为16Bytes。当然,还可以采用其他的字段长度、字段组合方式等,本说明书并不对此进行限制。其中,第一区块链节点还可以对密钥Ki的生成方式描述信息进行加密。例如,可以采用上述版本最低的key-0进行加密,避免不法分子通过诸如计数值推测出对应的合约状态。
那么,当第一区块链节点需要使用诸如图7所示结构的合约状态时,采用的处理操作包括:按照key索引到value,该value的结构如图7所示;采用密钥key-0对Info和Nounce字段进行解密,确定出密钥版本号、历史区块高度、偏移量、计数值等信息,生成相应的密钥,并通过该密钥对Cipher字段的内容进行解密,还可以通过Tag字段来验证数据完整性(如果Tag是基于明文生成,则对解密后的数据进行验证;如果Tag是基于密文生成,则对解密前的数据进行验证)。
此外,对于上述若干版本的密钥,区块链网络中的各个区块链节点之间可以按照预先制定的规则或者临时约定,确定当前使用的密钥版本。由于高版本的密钥可以计算得出低版本的密钥,而低版本的密钥无法反推高版本的密钥,因此各个区块链节点可以从低版本的密钥开始,逐步升级至高版本的密钥,这样在使用高版本的密钥时,可以兼容先前使用低版本密钥进行加密的数据。
一般的,CPU执行所述明文代码后,所述合约状态会发生变化。将合约状态存入区块链,从区块链节点的角度,是将该合约状态写入数据库,例如本地的数据库。所述数据库,一般存储于存储介质之中,更多见的是持久性存储介质。所述持久性存储介质,可以是磁盘、软盘,也可以是通电后可恢复数据从而可以持久存储的内存之类。
写入数据库的操作,用代码表示的话,如setstorage(key,ENC(value,secret_key))。setstorage(key,ENC(value,secret_key))中,键(key)可以与传统的键写入方式相同。至于value的写入,可以采用Intel SGX技术,ENC表示enclave,secret_key表示采用SGX技术中写入数据库时采用的密钥,在本说明书中不同合约状态对应的私钥也不同。
在一实施例中,所述第一区块链节点从所述可信执行环境中输出所述合约状态对应的加密后的键值对数据,并通过在所述可信执行环境之外执行存储功能代码,以将所述加密后的键值对数据存储至所述可信执行环境之外的外部存储空间。
第一区块链节点通过运行用于实现某一功能的代码,以实现该功能。因此,对于需要在可信执行环境中实现的功能,同样需要执行相关代码。而对于在可信执行环境中执行的代码,需要符合可信执行环境的相关规范和要求;相应地,对于相关技术中用于实现某一功能的代码,需要结合可信执行环境的规范和要求重新进行代码编写,不仅存在相对更大的开发量,而且容易在重新编写过程中产生漏洞(bug),影响功能实现的可靠性和稳定性。
因此,第一区块链节点通过将合约状态生成为加密后的键值对数据,且该加密后的键值对数据只有通过可信执行环境进行解密,可以确保该加密后的键值对数据本身足够安全。在此基础上,第一区块链节点通过在所述可信执行环境之外执行存储功能代码,将加密后的键值对数据存储至所述可信执行环境之外的外部存储空间,使得该存储功能代码可以为相关技术中用于实现存储功能的代码、不需要结合可信执行环境的规范和要求重新进行代码编写,即可针对该加密后的键值对数据实现安全可靠的存储,不仅可以在不影响安全、可靠程度的基础上,减少相关代码的开发量,而且可以通过减少可信执行环境的相关代码而降低TCB(Trusted Computing Base,可信计算基),使得TEE技术与区块链技术进行结合的过程中,额外造成的安全风险处于可控范围。
在一实施例中,第一区块链节点可以在可信执行环境内执行写缓存功能代码,以将合约状态对应的明文的键值对数据存入所述可信执行环境内的写缓存中,比如该写缓存可以对应于如图5所示的“缓存”。进一步的,第一区块链节点将所述写缓存中的数据加密后从所述可信执行环境输出,以存储至所述外部存储空间。其中,所述写缓存功能代码可以以明文形式存储于所述可信执行环境中,可以直接在可信执行环境中执行该明文形式的缓存功能代码;或,所述写缓存功能代码可以以密文形式存储于所述可信执行环境之外,比如存储于上述的外部存储空间(比如图5所示的“存储空间”),可以将该密文形式的写缓存功能代码读入可信执行环境、在可信执行环境中进行解密为明文代码,并执行该明文代码。
写缓存是指在将数据写入外部存储空间时,为了避免造成对外部存储空间的“冲击”而提供的“缓冲”机制。例如,可以采用buffer实现上述的写缓存;当然,写缓存也可以采用cache来实现,本说明书并不对此进行限制。实际上,由于可信执行环境为隔离的安全环境,而外部存储空间位于可信执行环境之外,使得通过采用写缓存机制,可以对缓存内的数据进行批量写入外部存储空间,从而减少可信执行环境与外部存储空间之间的交互次数,提升数据存储效率。同时,可信执行环境在不断执行各个智能合约的过程中,可能需要调取已生成的数据(如合约状态的取值),如果需调用的数据恰好位于写缓存中,可以直接从写缓存中读取该数据,这样一方面可以减少与外部存储空间之间的交互,另一方面免去了对从外部存储空间所读取数据的解密过程,从而提升在可信执行环境中的数据处理效率。
当然,也可以将写缓存建立于可信执行环境之外,比如第一区块链节点可以在可信执行环境之外执行写缓存功能代码,从而将密文合约状态存入所述可信执行环境外的写缓存中,并进一步将所述写缓存中的数据存储至所述外部存储空间。
在一实施例中,第一区块链节点可以根据客户端发起的查询请求,对明文的键值对数据加密后从可信执行环境输出,以返回至所述客户端。
例如,第一区块链节点可以从所述外部存储空间中读取所述密文合约状态,将所述密文合约状态解密为所述明文合约状态后,读入所述可信执行环境,然后对所述明文合约状态加密后从可信执行环境输出,比如通过图5所示的交易/查询接口向客户端返回加密后的明文合约状态。
再例如,第一区块链节点可以从可信执行环境内的读缓存中读取所述明文合约状态,并对所述明文合约状态加密后从可信执行环境输出;其中,所述明文合约状态由第一区块链节点预先在可信执行环境内执行读缓存功能代码,从所述外部存储空间中读取所述密文合约状态,将所述密文合约状态解密为所述明文合约状态后,读入所述可信执行环境并存入所述读缓存中。换言之,第一区块链节点从所述外部存储空间中读取所述密文合约状态,将所述密文合约状态解密为所述明文合约状态后,可以通过在可信执行环境内执行读缓存功能代码,将该明文合约状态存入可信执行环境内的读缓存中,比如该读缓存可以对应于图5所示的“缓存”;进一步地,针对客户端发起的查询请求,或者对于可信执行环境在执行智能合约时所需的数据,可以优先从该读缓存中进行数据读取,若能读取相关数据则无需从外部存储空间中读取,从而减少与外部存储空间的交互次数、免除数据解密过程。
读缓存是指在将数据从外部存储空间读入可信执行环境后,为了减少与外部存储空间的交互次数,可以将已读取的数据以明文形式存储于可信执行环境中的读缓存空间内。例如,可以采用cache实现上述的读缓存;当然,读缓存也可以采用buffer来实现,本说明书并不对此进行限制。
第一区块链节点可以同时支持上述的读缓存机制和写缓存机制。而随着缓存技术的不断发展,同一缓存可以不仅用于实现数据读取或数据写入,甚至可以同时支持数据的读写操作,使得读缓存与写缓存之间的界线有时并不十分清晰,因而图5中仅以“缓存”进行示意,而并未具体区分其具体类型,可以根据实际需求进行配置和调整。
以下结合图8介绍本说明书一种区块链中实现隐私保护的节点实施例,包括:
确定单元801,用于确定接收到的交易对应的智能合约;
执行单元802,用于在可信执行环境中执行所述智能合约;
加密单元803,用于所述区块链节点采用键值对结构存储所述智能合约涉及的合约状态时,分别对合约状态和对应的键进行加密。
可选的,加密单元803具体用于:
所述区块链节点获取可信执行环境中维护的安全密钥,并通过对称加密方式或非对称加密方式对合约状态对应的键进行加密;或,
所述区块链节点将合约状态对应的键与所述安全密钥进行拼接后,对拼接数据进行哈希计算,将计算得到的哈希值作为加密后的键。
可选的,所述可信执行环境中维护有若干版本的安全密钥,所述区块链节点通过最低版本的安全密钥对合约状态对应的键进行加密;其中,低版本的安全密钥由高版本的安全密钥不可逆地计算得到。
可选的,不同合约状态由不同的密钥进行加密。
可选的,所述智能合约涉及合约状态X1~Xn,分别对应于密钥K1~Kn;其中,合约状态Xi对应的密钥Ki由所述区块链节点根据保存于所述可信执行环境的安全密钥和至少一个对应于合约状态Xi的影响因子而生成,1≤i≤n。
可选的,所述影响因子包括至少一项下述的私有影响因子:合约状态Xi在所述智能合约中的出现顺序Pi、对应于所述出现顺序的计数值Qi、分配至合约状态Xi的随机数Si。
可选的,所述影响因子包括至少一项下述的公共影响因子:历史区块高度、所述交易所处区块的区块高度、所述交易在所处区块中的位置偏移量、所述智能合约的合约地址、所述智能合约的代码哈希值、所述智能合约的合约创建者的账户地址、所述交易的发起方的账户地址。
可选的,所述区块链节点将加密后的合约状态与相应密钥的生成方式描述信息进行关联存储。
可选的,密钥Ki的生成方式描述信息包括:所述安全密钥的版本信息和对应于合约状态Xi的影响因子的取值;其中,所述可信执行环境中维护有若干版本的安全密钥。
可选的,低版本的安全密钥由高版本的安全密钥不可逆地计算得到。
可选的,最高版本的安全密钥包括seal密钥,其他版本的安全密钥直接或间接由所述seal密钥不可逆地计算得到。
可选的,
所述seal密钥在第一区块链节点的SGX通过远程证明后由密钥管理服务器发送;或,
所述seal密钥由第一区块链节点与其他区块链节点之间协商得到。
可选的,所述安全密钥存储于所述第一区块链节点的围圈中。
可选的,所述第一区块链节点存在若干围圈,所述安全密钥存储于安全围圈中。
可选的,所述安全围圈包括QE围圈。
可选的,加密单元803具体用于:
所述第一区块链节点从所述可信执行环境中输出所述合约状态对应的加密后的键值对数据;
所述第一区块链节点通过在所述可信执行环境之外执行存储功能代码,以将所述加密后的键值对数据存储至所述可信执行环境之外的外部存储空间。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。在一个典型的配置中,计算机包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。