CN112287032B - 一种区块链数据存储方法、装置及区块链节点 - Google Patents

一种区块链数据存储方法、装置及区块链节点 Download PDF

Info

Publication number
CN112287032B
CN112287032B CN202011516854.7A CN202011516854A CN112287032B CN 112287032 B CN112287032 B CN 112287032B CN 202011516854 A CN202011516854 A CN 202011516854A CN 112287032 B CN112287032 B CN 112287032B
Authority
CN
China
Prior art keywords
contract
account
state
blockchain
key
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202011516854.7A
Other languages
English (en)
Other versions
CN112287032A (zh
Inventor
邓福喜
周知远
谢桂鲁
徐泉清
李康
杨达一
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alipay Hangzhou Information Technology Co Ltd
Original Assignee
Alipay Hangzhou Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Alipay Hangzhou Information Technology Co Ltd filed Critical Alipay Hangzhou Information Technology Co Ltd
Priority to CN202011516854.7A priority Critical patent/CN112287032B/zh
Publication of CN112287032A publication Critical patent/CN112287032A/zh
Application granted granted Critical
Publication of CN112287032B publication Critical patent/CN112287032B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/27Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/64Protecting data integrity, e.g. using checksums, certificates or signatures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q40/00Finance; Insurance; Tax strategies; Processing of corporate or income taxes
    • G06Q40/04Trading; Exchange, e.g. stocks, commodities, derivatives or currency exchange

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Business, Economics & Management (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Computer Security & Cryptography (AREA)
  • Finance (AREA)
  • Accounting & Taxation (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • General Health & Medical Sciences (AREA)
  • Bioethics (AREA)
  • Health & Medical Sciences (AREA)
  • Development Economics (AREA)
  • Economics (AREA)
  • Marketing (AREA)
  • Strategic Management (AREA)
  • Technology Law (AREA)
  • General Business, Economics & Management (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本说明书提供一种区块链数据存储方法及区块链节点。所述方法的一个实施例包括:区块链节点执行创建/调用合约的交易,产生待存储的与所述区块链外部账户相关的状态;将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。通过本说明书实施例,可以使区块链系统对外部账户的访问分散到各个外部账户的状态存储中,从而可以避免单账户热点的问题。同时,每个外部账户存储的负载压力比较小,可以提升整个区块链系统的性能。

Description

一种区块链数据存储方法、装置及区块链节点
技术领域
本说明书实施例属于区块链技术领域,尤其涉及一种区块链数据存储方法、装置及区块链节点。
背景技术
区块链(Blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。由于区块链具有去中心化、信息不可篡改、自治性等特性,区块链也受到人们越来越多的重视和应用。
一般的,业务使用的区块链是一种分布式数据存储结构,全量节点保存相同且全量的区块信息。在一些区块链网络中通常有外部账户和合约账户。合约账户下通常会存储有全量的合约有关的状态。
发明内容
本说明书提供一种区块链数据存储方法、装置及区块链系统。
本说明书实施例提供的一种区块链数据存储方法、装置及区块链系统通过包括以下方式实现的:
一种区块链状态的存储方法,包括:
区块链节点执行创建/调用合约的交易,产生待存储的与所述区块链外部账户相关的状态;
将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
一种区块链节点,包括:
执行单元,用于执行创建/调用合约的交易,并产生待存储的与所述区块链外部账户相关的状态;
存储单元,用于将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
一种区块链节点,包括:
处理器;
存储器,其中存储有程序,其中在所述处理器执行所述程序时,进行以下操作:
执行创建/调用合约的交易,产生待存储的与所述区块链外部账户相关的状态;
将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
本说明书实施例提供的区块链数据存储方法、装置及区块链系统,重新创新设计了区块链数据存储结构,改变了原有合约账户存储所有合约涉及的账户以及智能合约的数据的存储结构,将原有合约数据的集中存储进行打散,采用账户存储与该账户相关联的合约数据,极大的提高了数据查找和处理效率。
附图说明
为了更清楚地说明本说明书实施例或一些技术中的技术方案,下面将对实施例或一些技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是一个区块链数据存储系统的结构示意图;
图2是一个简化版的状态树示意图;
图3是本说明书实施例提供的一种区块链状态树的存储结构;
图4是本说明书实施例提供的一种区块链状态树的存储结构;
图5是本说明书实施例提供的一种区块链状态树的存储结构;
图6是本说明书实施例提供的一种区块链状态树的存储结构;
图7是本说明书实施例提供的一种区块链状态树的存储结构;
图8是本说明书实施例提供的一种区块链状态的存储方法;
图9是本说明书实施例提供的一种区块链节点的模块结构示意图;
图10是本说明书个实施例提供的一种区块链节点的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述。所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
区块链发展及应用多样化,一些业务领域以早期的比特币区块链网络为雏形发展起来的新型区块链网络,建立自己商业化的区块链系统,包括私有链、联盟链等。例如以太坊(Ethereum),其是一个开源的有智能合约功能的公共区块链平台。以太坊相比于比特币网络进行了拓展,采用账户系统和世界状态,可以直接用账户来显示的记录账户的余额和状态。
引入智能合约的各种区块链网络中,以太坊为例,通常账户可以分为两种类型:
合约账户(contract account):存储执行的智能合约代码以及智能合约代码中状态的值,通常只能通过外部账户调用激活;
外部账户(Externally owned account):用户的账户,例如以太币拥有者账户。
外部账户和合约账户的设计,实际上是账户地址到账户状态的映射。账户的状态通常包括 nonce、balance、storage_root、codeHash 等字段。nonce、balance在外部账户和合约账户中都存在。codeHash和storage_root属性一般仅在合约账户上有效。
nonce:计数器。对于外部账户,这个数字代表从账户地址发送的交易数量;对于合约账户,是账户创建的合约数量。
balance:这个地址拥有的以太币的数量。
storage_root :一个MPT树根节点的哈希,这个MPT树对合约账户的状态变量的存储进行组织。
codeHash:智能合约代码的哈希值。对于合约账户,这是智能合约被哈希计算并存储的代码;对于外部账户,由于不包括智能合约,因此codeHash字段一般可以是空字符串/全0字符串。
MPT全称为Merkle Patricia Tree,是结合了Merkle Tree(默克尔树)和PatriciaTree(压缩前缀树,一种更节省空间的Trie树,字典树)的一种树形结构。Merkle Tree,默克尔树算法对每个交易都计算一个Hash(哈希)值,然后两两连接再次计算Hash,一直到最顶层的Merkle根。以太坊中采用改进的MPT树,例如是16叉树的结构,通常也简称为MPT树。
以太坊MPT树的数据结构包括状态树(state trie)。状态树中包含以太坊网络中每个账户所对应的存储内容的键值对(key and value pair)。状态树中的“键”可以是一个的160bits的标识符(以太坊账户的地址),这个账户地址分布于从状态树的根节点开始到叶子节点的存储中。状态树中的“值”是通过对以太坊账户的信息进行编码(使用递归长度字典编码(Recursive-Length Prefix encoding,RLP)方法)生成的。如前所述,对于外部账户来说,值包括nonce和balance;对于合约账户来说,值包括nonce、balance、codehash和storage_root。
合约账户用于存储智能合约相关的状态。智能合约在区块链上完成部署后,会产生一个对应的合约账户。这个合约账户一般会具有一些状态,这些状态由智能合约中状态变量所定义并在智能合约创建、执行时产生新的值。所述的智能合约通常是指在区块链环境中以数字形式定义的能够自动执行条款的合约。一旦某个事件触发合约中的条款(满足执行条件),代码即可以自动执行。在区块链中,合约的相关状态保存在存储树(storagetrie)中,存储树根节点的hash值即存储于上述storage_root中,从而将该合约的所有状态通过hash锁定到该合约账户下。存储树也是一个MPT树形结构,存储了状态地址到状态值的key-value映射。从存储树的根节点到叶子节点存储有一个状态的地址,一个叶子节点中存储一个状态的值。
图1是一个区块链数据存储的结构示意图。由图1所示的一些的区块链数据存储中,每一区块的区块头包括若干字段,例如上一区块哈希previous_Hash(图中的PrevHash),随机数Nonce(在一些区块链系统中这个Nonce不是随机数,或者在一些区块链系统中不启用区块头中的Nonce),时间戳Timestamp,上一区块号Block Num,状态根哈希State_Root,交易根哈希Transaction_Root,收据根哈希Receipt_Root等。其中,下一区块(如区块N+1)的区块头中的Prev Hash指向上一区块(如区块N),即为上一区块的hash值。通过这种方式,区块链上通过区块头实现了下一区块对上一区块的锁定。特别的,如前所述,state_root是当前区块中所有账户的状态组成的MPT树的根的哈希值,即指向state_root的为一棵MPT形式的状态树。这个MPT树的根节点一般为一个扩展节点(Extension Node)或一个分支节点(Branch Node),state_root中存储的一般为这个根节点的hash值。从这个MPT的根节点到叶子节点中每个节点的一部分值按照顺序串联起来可以构成账户地址并作为key,叶子节点中存储的账户信息为这个账户地址对应的value,这样,构成了key-value键值对。具体的,这个key可以是sha3(Address), 即账户地址的hash值(hash算法例如采用sha3算法),其存储的值value可以为rlp(Account),即账户信息的rlp编码。其中账户信息是[nonce,balance,storage_root,codeHash]构成的四元组。如前所述,对于外部账户来说,一般只有nonce和balance两项,而storage_root、codeHash字段默认存储空字符串/全0字符串。也就是说,外部账户不存储合约,也不存储合约执行后的产生的状态变量。合约账户一般包括nonce, balance, storage_root, codeHash。其中nonce是该合约账户的交易计数器;balance是账户余额;storage_root对应另外一个MPT,通过storage_root能链接到合约相关的状态的信息;codeHash是合约代码的hash值。不论是外部账户还是合约账户,其账户信息一般都位于一个单独的叶子节点(Leaf Node)中。从根节点的扩展节点/分支节点到每个账户的叶子节点,可能中间会经过若干个分支节点以及扩展节点。
状态树可以是MPT形式的树,一般是16叉树,每一层最多可以有16个孩子节点,而最多可以有64层的深度。对于扩展节点,用于存储共同前缀,其一般有1个孩子节点,这个孩子节点可以是分支节点。对于分支节点,其最多可以有16个孩子节点,其中可能包括扩展节点和/或叶子节点。这样的MPT树最多可以有64层的深度。当区块链中的账户数量达到一定数量时,这棵MPT树可能接近或达到64层的深度。
其中,对于状态树中的一个合约账户来说,其storage_Root指向另一棵同为MPT形式的树,其中存储了合约执行涉及的状态变量(state variable)的数据。这个storage_Root指向的MPT形式的树为存储树,即存储树的根节点的hash值。一般的,这个存储树存储的也是key-value键值对。从根节点到叶子节点的路径上存储的一部分数据连起来构成key,叶子节点中存储value。前面提到,这个存储树也可以是MPT形式的树,一般也是16叉树,即对于分支节点,其最多可以有16个孩子节点,其中可能包括扩展节点和/或叶子节点。而对于扩展节点,其一般可以有1个孩子节点,其可以是分支节点。这棵存储树最多可以有64层的深度。
智能合约中,例如通过以太坊提供的solidity高级开发语言中,可以定义的状态变量包括两种类型,一种是基本数据类型的状态变量,另一种是映射(map或mapping)类型的状态变量。以下是一个用solidity编写的智能合约的代码的片段:
contract Demo {
int a;
int x;
mapping(address => int) public balanceA;
function myfunc() public {
a = 8;
x = 9;
balanceA [123] = 100;
}
}
其中,整形变量a、x都属于基本数据类型,在myfunc函数中,a赋值为8,x赋值为9。映射类型数据结构中,上面代码中定义了外部账户地址到一种资产类型的余额(balanceA,不同于外部账户中的balance和合约账户中的balance)的映射,即地址address→balanceA的映射。在myfunc函数中,例如为外部账户的地址123初始化对应的balanceA为100。
以太坊和其它区块链系统中,例如可以在智能合约中按照ERC20标准创建新的数字资产,当然也可以是按照其他方式自定义的数字资产。例如上述的balanceA即可以为按照ERC20标准创建的一种数字资产。当然,在一个智能合约中,可以定义多个资产类型,例如balanceA、balanceB、balanceC、…。这个合约中的映射可以为每个外部账户赋予持有和交易这种新创建的数字资产的能力。如上述代码的例子,一般的,每个外部账户都可以对应一个balanceA类型的资产。那么,如果区块链的状态树中存在10000个外部账户,则通过智能合约,每个外部账户可以对应持有/交易balanceA类型的资产,即存在10000个“外部账户→balanceA”的映射。
需要说明的是,这里的资产是广义的,还可以是余额外的其它内容。例如在区块链电子发票的场景中,资产可以定义为发票的代码集合,这个集合例如为balanceP。这样,在“外部账户→balanceP”的映射中,balanceP中可以包括一组发票的代码集合。这个发票代码集合中可能会增加新的发票代码。
上述的基本数据类型和映射类型的状态变量,在存储树中都可以是以key-value键值对的形式存储。对于基本数据类型,key可以是合约中的状态变量声明的位置(例如从0开始计数)。对于映射类型,key = SHA3(映射中的关键字,变量声明位置),也就是把映射中的关键字和状态变量声明位置拼在一起成为一定长度(例如64字节)的字符串后计算hash值。value可以存储状态变量的实际值。
前面提到,如果区块链的状态树中存在10000个外部账户,则通过智能合约,每个外部账户可以对应持有/交易balanceA类型的资产,即存在10000个外部账户→balanceA的映射。具体的,该合约账户下,存储树中可以存储这些映射的值。如上所述,具体是通过key-value的方式存储在存储树中。类似的,这个存储树也可以是MPT形式的树,一般也是16叉树,每一层最多可以有16个孩子节点,最多可以有64层的深度。从这个MPT的根节点到叶子节点中存储的一部分数据连起来可以作为key,叶子节点中存储的信息为这个key对应的value。这样,就构成了key-value键值对。
当区块链中的外部账户的数量达到一定量时,状态树的深度可能接近或达到64层的深度。类似的,合约中映射类型的状态变量的数量也可能达到相同的量,这时存储树也接近或达到64层的深度。此外,对于一个智能合约来说,合约中基本数据类型的变量不会太多,一般不会超过32个。这样,当外部账户的数量较大时,加上合约中基本数据类型的变量,合约中的状态变量的总数与外部账户基本是差不多的。
图2是一个简化版的状态树示意图。区块链系统中存在若干外部账户,例如图2中分别编号的外部账户 1、外部账户 2,…。此外,区块链系统中存在若干合约账户,例如图2中的分别编号的合约账户 1,合约账户 2,…。这些外部账户和合约账户及其信息内容例如通过MPT树的形式组织,构成状态树。区块头中的state_root存储这个MPT树的根节点的hash值。图2中以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。
外部账户可以通过创建合约的交易在区块链上部署智能合约。此外,智能合约也可以是原生合约,即融合在区块链平台的代码中,与区块链平台代码一同编译后完成部署。不论是哪种形式部署的智能合约,在合约创建后,区块链上出现一个与该智能合约对应的合约账户,并拥有一个特定的地址,合约代码和账户存储将保存在该合约账户中。智能合约的账户存储保存了这个合约的状态。合约创建之后,外部账户可以调用创建的智能合约,也可以是外部账户通过智能合约来调用智能合约(也可以通过1个或多个智能合约来调用智能合约)。被调用的智能合约,将产生的状态变量以key-value的形式写入该智能合约的账户存储中,如图2所示。这些key-value,可以组织成MPT树的形式,构成存储树。存储树中,key-value除了包括基本数据类型的状态变量外,还可以包括映射类型的状态变量。一般的,一个合约中不超过32个基本类型的状态变量,即一般一个存储树中包括不超过32个key-value来对应基本类型的状态变量的存储。一个合约中,映射类型的状态变量一般与外部账户对应。存在N个外部账户的情况下,一个合约中一般存在对应的N个key-value来对应映射类型的状态变量的存储。
合约账户中的映射类型的状态变量的数量一般与外部账户对应,此外,合约账户中还包括基本类型的状态变量。当外部账户的数量比较多时,合约账户中的映射类型的状态变量的数量也很多。状态树实际上包括了两层MPT结构,每一层最大深度是64层。对于区块链系统中大量的合约操作,都要涉及合约的状态变量。这样,在现有的账户体系结构中,虽然建立了外部账户和合约账户,但是操作的热点将集中于合约账户中的状态变量,而关于外部账户的操作却很少。这就形成了单账户热点。单账户热点导致合约账户存储的负载压力比较大,将限制和影响区块链系统的性能。
本说明书实施例提供一种区块链状态树的存储结构。如图3所示。
区块头中的state_root存储整个状态树的根节点的hash值。树形结构例如可以采用图1中的MPT,当然也可以采用其他组织形式,这一点以下类似,以MPT为例进行说明。整体上,状态树可以采用三层树形结构。例如对于MPT来说,图3中每一层以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。第一层树形结构的叶子节点可以用来存储外部账户存储的根hash值,此外还可以存储合约账户的一些基本信息。外部账户和合约账户可以分别有若干个。一般的区块链应用场景中,外部账户的数量可能明显多于合约账户的数量。第一层叶子节点中每个外部账户的账户信息的根hash,可以基于包括该外部账户的nonce、balance以及该外部账户涉及的智能合约存储的hash值计算得到。其中,图3中外部账户的nonce、balance可以与图1、2中相同。第二层为合约存储树(schematic storage trie)。具体的,第二层树形结构的根节点为外部账户涉及的智能合约的存储的hash值。类似的,第二层可以通过一个以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。第二层的存储可以包括一个或多个智能合约,即可以有多个叶子节点。第二层的每个叶子节点可以用来存储该外部账户下涉及的一个智能合约的存储的根hash值,可以基于包括该外部账户涉及的合约ID(contract ID)、storage_root计算得到。第三层为存储树。具体的,第三层树形结构的根节点为外部账户涉及的智能合约中的状态变量的根hash值。类似的,第三层可以通过一个以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。第三层的每个叶子节点可以用来存储合约中的一个状态变量的value值。上述的三层树的结构,每棵树的根节点到叶子节点的路径上存储的一部分数据连起来可以构成key,叶子节点中可以存储value。这样,通过这样的存储模型,可以在每个外部账户下存储该外部账户涉及的每个智能合约中的状态变量的key-value。
本说明书实施例提供一种区块链状态树的存储结构。如图4所示。
实际的区块链商业系统中,很多情况下一个区块链专注于提供一种服务。一种服务一般可以采用一个智能合约来实现。这种情况下,该区块链系统中只有一个智能合约。在只有一个智能合约时,图3中的第二层可以得到简化,不需要图3中的第二层结构,如图4所示。第一层树形结构的叶子节点中每个外部账户的根hash,可以基于包括该外部账户的nonce、balance以及该外部账户涉及的智能合约存储的hash值计算得到。其中,图4中外部账户的nonce、balance可以与图1、2中相同。第二层为存储树。具体的,第二层树形结构的根节点为外部账户涉及的智能合约中的状态变量的根hash值。类似的,第二层可以通过一个以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。第二层的每个叶子节点可以用来存储合约中的一个状态变量的value值。上述的两层树的结构,每棵树的根节点到叶子节点的路径上存储的一部分数据连起来可以构成key,叶子节点中可以存储value。这样,通过这样的存储模型,可以在每个外部账户下存储该外部账户涉及的每个智能合约中的状态变量的key-value。
图1、2的合约账户存储中包括了该合约涉及的所有状态变量。通过本申请上述图3、图4实施例提供区块链状态树的存储结构,实际上将原有的合约账户存储中涉及的该合约中所有状态变量按照关联的外部账户,分解到了对应的外部账户的存储中。例如,原有的合约账户存储中包括了该合约涉及的所有映射类型的状态变量1、2、3、…10000,其中1-1000与外部账户1相关,1001-2000与外部账户2相关,以此类推。这样,将与外部账户1相关的映射类型的状态变量1-1000,分解到了外部账户1的存储中;将与外部账户2相关的映射类型的状态变量1001-2000,分解到了外部账户2的存储中,以此类推。
除了映射数据结构,还可以通过其它数据结构定义外部账户地址到一种资产类型的映射,这里并不限制。
基于上述图3、4中的区块链状态树的存储结构,本说明书实施例还提供一种区块链状态的存储方法。如图8所示,该方法包括:
S801:区块链节点执行调用合约的交易,产生待存储的与所述区块链外部账户相关的状态。
区块链中的交易可以支持创建和调用智能合约。对于创建合约的交易来说,区块链节点例如可以接收客户端发送的包含创建智能合约的交易,完成智能合约的部署。通过P2P网络,该创建智能合约的交易可以传播到其它区块链节点上(或是传播到其它大多数的区块链节点上)。每个接收到这个交易的区块链节点一般会对该交易进行验证和共识。例如对于有主共识算法,例如实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT),区块链共识网络中的主节点可以发起共识。共识达成后,区块链网络中的区块链节点可以在本地执行这个交易。具体的,区块链节点可以通过本地的虚拟机(例如以太坊虚拟机EVM)执行这个创建合约的交易,并生成对应的合约实例。合约创建后,区块链上出现一个与该智能合约对应的合约账户。该合约账户在区块链上的存储可以包括codehash和部署的合约代码(通常是合约代码的字节码)。codehash的值为部署的合约代码的hash值。这个合约账户一般拥有一个特定的地址。
此外,所述合约也可以是与区块链代码一同编译的原生合约,从而通过编译即完成智能合约的部署。
智能合约中可以定义新的资产类型,例如前述程序代码片段中的balanceA。当然,在一个智能合约中,可以定义多个资产类型,例如balanceA、balanceB、balanceC、…。如前所述,智能合约中还可以定义状态变量。例如通过以太坊提供的solidity高级开发语言中,可以定义的状态变量包括两种类型,一种是基本数据类型的状态变量,另一种是映射(map或mapping)类型的状态变量。通过映射类型的状态变量,可以为每个外部账户赋予持有和交易这种新创建的数字资产的能力。如上述代码的例子,一般的,每个外部账户都可以对应一个balanceA类型的资产。那么,如果区块链的状态树中存在10000个外部账户,则通过智能合约,每个外部账户可以对应持有/交易balanceA类型的资产,即存在10000个“外部账户→balanceA”的映射。类似的,对于包括balanceB类型的资产,可以存在10000个“外部账户→balanceB”的映射。以此类推。如前所述,除了映射数据结构,还可以通过其它数据结构定义外部账户地址到一种资产类型的映射,这里并不限制。以下以映射形式的数据结构举例说明。
这个合约成功创建之后,后续外部账户可以调用这个合约。智能合约可以以合约代码中规定的方式在区块链网络中每个节点独立的执行,执行的交易、产生的状态和交易的回执可以保存在区块链上。调用合约一般可以通过发起交易的形式。交易的from字段是发起调用智能合约的账户的地址,to字段中可以表示被调用的智能合约的地址,交易的data字段可以包括调用智能合约的方法和传入的参数。通过调用智能合约,映射中外部账户对应的合约状态可能发生变化,例如外部账户对应的某一资产类型的余额可能会发生改变。这样,映射中的value值会发生变化。变化后的value值需要存储在区块链上。这样,所述合约状态包括对应区块链外部账号的状态。
如前所述,所述待存储的合约状态包括合约中定义的外部账户与资产的映射关系。具体的,所述合约中可以通过映射数据结构或其它数据结构定义这种映射关系。以映射这种数据结构定义为例,该映射中定义的一般是外部账号与资产的映射关系。如果在智能合约中定义了一种新的资产,如定义了一种balanceA的资产,则通过映射可以定义外部账号与这个balanceA类型资产的映射关系。此外,可以通过对编译器、虚拟机中的适配,设置一种定义类似数据结构的方式,如:
schema {
uint256 balanceP;
bool owner_flag;
};
上述代码示例也可以定义外部账户与资产的映射关系。具体的,uint256表示定义了一种名为balanceP的资产类型,为无符号整数,256bit长度。bool表示布尔类型变量,对应外部账户的标识owner_flag。这样,通过这种方式也实现了定义外部账户与资产的映射关系。当然,需要编译器和虚拟机的适配以支持合约中这样的定义方式。
此外,部署合约的过程中,创建的智能合约可以包括初始化的过程,例如包括状态变量的赋值之类(如前述通过映射方式给对应外部账户赋值初始的资产类型和数量)。这样,创建的智能合约在区块链网络的节点上执行时,也可以产生待存储的与所述区块链外部账户相关的状态。
S803:将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
如图3、4、5、6中所示,storage中的映射类型状态变量可以以key-value形式存储。具体的一个例子中,对于映射类型,key = SHA3(映射中的关键字,变量声明位置),也就是把映射中的关键字和变量声明位置拼在一起成为一定长度(例如64字节)的字符串后计算hash值。value可以存储变量的实际值。
最简单的情形例如图5所示,一个区块链系统中创建了一个智能合约,而且该智能合约中定义了一种新类型的资产。而且,创建的合约中,可以仅定义一种新类型的资产,或者是定义多种新类型资产的情况下仅启用其中的一种(而另外的新类型资产未启用或未初始化)。这种情况下,由于每个外部账户对应一种类型的资产的余额,所以该类型的资产的余额可以不需要组织成树的形式,通过一个key-value即可以存储。其中,这个映射类型中,key = SHA3(映射中的关键字,变量声明位置),也就是把映射中的关键字和变量声明位置拼在一起成为一定长度(例如64字节)的字符串后计算hash值。value可以存储变量的实际值,即balanceA类型的资产的余额。这样,外部账户的storage_root可以是这个key-value的hash值。每个外部账户都可以有一个这样的映射数据。例如,外部账户1的storage_root指向其映射类型中一个key-value;外部账户2指向其映射类型中一个key-value;以此类推。综上,对于区块链系统中仅有一个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中的状态树的存储包括两层;第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所述新类型资产的key-value的hash值;第二层存储所述映射定义的包括所述外部账号与所述新类型资产的key-value形式的映射关系。
前面提到,在一个智能合约中,可以定义多个资产类型,例如balanceA、balanceB、balanceC、balanceD、…。这样,每个外部账户可以有分别对应balanceA、balanceB、balanceC、balanceD、…类型的资产的余额。这种情况下,由于每个外部账户对应多种类型的资产的余额,该多种类型的资产的余额可以组织成树的形式。如图4中所示,在第二层的存储树中,通过节点1、节点2、节点3共三个节点来示意性的表示一种树的形式。这个树例如是MPT树,则节点1、节点2、节点3可以示意性的表示MPT树中的扩展节点、分支节点。其中,这个映射类型中,key = SHA3(映射中的关键字,变量声明位置),也就是把映射中的关键字和变量声明位置拼在一起成为一定长度(例如64字节)的字符串后计算hash值。value可以存储变量的实际值,即balanceA、balanceB、balanceC、balanceD、…类型的资产的余额。如图4中,外部账户1的存储树的叶子节点分别具有balanceA、balanceB、balanceC、balanceD、…类型的资产的余额。这样,外部账户的storage_root可以是balanceA、balanceB、balanceC、balanceD、…类型的资产的key-value组成树的形式后的根hash值。每个外部账户都可以有一个这样的映射数据。例如,外部账户1的storage_root指向其映射类型中一组key-value的树形结构;外部账户2的storage_root指向其映射类型中一组key-value的树形结构。以此类推。这样,对于区块链系统中仅有一个智能合约的情况,且该智能合约中定义且启用了至少两种新类型的资产,则区块链中状态树的存储包括两层;第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所有所述新类型资产的key-value的根hash值;第二层通过树形结构在每个叶子节点中存储所述映射定义的包括所述外部账号与一种所述新类型资产的key-value形式的映射关系。
在一个区块链系统中,可以创建多个智能合约。例如一个区块链系统中创建了多个智能合约,这些智能合约可以通过树形结构组织起来,如图6所示,即如图中的第二层为合约存储树。大多数智能合约中的每个,可以定义一种或多种新类型的资产。每个智能合约中,有不同的状态。例如图6中,通过树形结构连接外部账户1的,示出了两个合约。每个合约基于其ID、storage_root可以计算得到一个hash值,该hash值可以存储于第二层树形结构的一个叶子节点中,如图中的schematic_storage_root中。对于这两个创建的合约中的每个仅定义一种新类型的资产的情况,或者是定义多种新类型资产的情况下仅启用其中的一种(而另外的新类型资产未启用或未初始化)的情况,每个合约对应一种类型的资产的余额,所以该类型的资产的余额可以不需要组织成树的形式,通过一个key-value即可以存储,类似图5中的第二层结构。这样,一个智能合约的storage_root可以是这个key-value的hash值。以此类推。综上,对于区块链系统中有至少两个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储包括三层;第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所述新类型资产的key-value的hash值;第三层存储所述映射定义的包括所述外部账号与所述资产的key-value形式的映射关系。
在一个区块链系统中,可以创建多个智能合约,并且每个合约中可以定义多个资产类型,例如balanceA、balanceB、balanceC、balanceD、…。该情况可以如图3所示。通过树形结构连接外部账户1的,示出了两个合约。即为第二层合约存储树。实际上,第二层的存储可以包括多个智能合约,即可以有多个叶子节点。每个合约基于其ID、storage_root可以计算得到一个hash值,该hash值可以存储于第二层树形结构的一个叶子节点中,如图中的schematic_storage_root中。第二层的每个叶子节点可以用来存储该外部账户下涉及的一个智能合约的存储的根hash值,可以基于包括该外部账户涉及的合约ID(contract ID)、storage的hash值计算得到。第三层为存储树。具体的,第三层树形结构的根节点为外部账户涉及的智能合约中的状态变量的根hash值。类似的,第三层可以通过以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。第三层的每个叶子节点可以用来存储合约中的一个状态变量的value值。上述的三层树的结构,每棵树的根节点到叶子节点的路径上存储的一部分数据连起来可以构成key,叶子节点中可以存储value。这样,通过这样的存储模型,可以在每个外部账户下存储该外部账户涉及的每个智能合约中的状态变量的key-value。综上,对于区块链系统中有至少两个智能合约的情况,且该智能合约中仅定义或启用了至少两种新类型的资产,则区块链中状态树的存储包括三层;第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所有所述新类型资产的key-value的根hash值;第三层通过树形结构在每个叶子节点存储所述映射定义的包括所述外部账号与一种所述新类型资产的key-value形式的映射关系。
上述图3-6的示例中,所述第一层通过树形结构在每个叶子节点中还可以存储该外部账户的交易计数。
上述图3、图6的示例中,显示出所述第二层通过树形结构在每个叶子节点中还存储关联的智能合约的编号的情形。此外,所述第二层还可以不在每个叶子节点中存储关联的智能合约的编号,而是第二层的根节点通过第二层的树形结构到第二层每个叶子节点的路径中存储涉及的智能合约的地址或基于所述涉及的智能合约的地址的映射值。
前述提到,智能合约中可以定义的状态变量包括两种类型,一种是基本数据类型的状态变量,另一种是映射(map或mapping)类型的状态变量。上述映射类型的状态变量,与每个外部账户有关。这样,对于每个外部账户来说,这个映射类型的状态变量是局部类型的状态变量。此外,智能合约中定义的基本数据类型,可能与每个外部账户都相关,而不仅仅是与一个外部账户相关。这样,基本数据类型的状态变量,属于全局类型的状态变量。
此外,如前所述,创建智能合约后,会出现合约账户。该合约账户也可能与每个外部账户相关,而不仅仅是与一个外部账户相关。例如,一个关于打赌的智能合约中,约定了外部账户A和外部账户B在第二天天气条件下的转账情况。如第二天是晴天,则外部账户A将转账一笔资产(如50元)至外部账户B,如第二天不是晴天,则外部账户B将转账一笔资产(如50元)至外部账户A。而在外部账户A和外部账户B调用这个智能合约时,需要各自将一笔资产(如50元)转入合约账户。这样,合约账户中的状态变量也属于全局类型的状态变量。
前述通过图3-6示例出了局部类型状态变量的存储。以下说明全局类型状态变量的存储。
第一种方式是,在合约账户中,设置智能合约中基本数据类型的状态变量以及合约账户的状态变量的存储。例如,在合约账户的storage中存储基本数据类型的状态变量以及合约账户的状态变量。在图3的基础上,以图7为例加以说明。区块头中的state_root存储整个状态树的根节点的hash值。第一层树形结构的叶子节点可以用来存储外部账户存储和合约账户存储的根hash值。外部账户和合约账户可以分别有若干个。第一层叶子节点中每个合约账户的账户信息的根hash,可以基于包括该合约账户的nonce、balance、codehash以及该合约账户涉及的智能合约的存储的根hash值计算得到。所述智能合约的存储的根hash值如图7中合约账户 2的storage_root。类似的,第二层可以通过一个以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式。第二层的每个叶子节点可以用来存储该合约账户下涉及的一个全局类型的状态变量。如前所述,这个合约账户涉及的状态变量,可以是基本数据类型,也可以是合约账户中的状态变量。具体的,该层树形结构的根节点为所述合约账户涉及的智能合约中全局类型的状态变量的根hash值。类似的,该层可以通过一个以节点1、节点2、节点3共三个节点来示意性的表示MPT树的形式,具体的,可以表示MPT树中的扩展节点、分支节点。第三层的每个叶子节点可以用来存储合约中的一个状态变量的value值。上述树的结构,每棵树的根节点到叶子节点的路径上存储的一部分数据连起来可以构成key,叶子节点中可以存储value。这样,通过这样的存储模型,可以存储该合约账户涉及的全局类型的状态变量的key-value。
这样,对于区块链节点执行调用合约的交易,产生待存储的与所述区块链合约账户相关的状态,例如产生所述合约中基本数据类型的状态变量以及合约账户的状态变量的情况,可以将所述待存储的与所述区块链合约账户相关的状态存储到对应的区块链合约账户的状态存储中,即将所述待存储的合约中基本数据类型的状态变量以及合约账户的状态变量存储到对应的区块链合约账户的状态存储中。区块链合约账户的状态存储中通过树形结构存储所述区块链合约账户涉及的全局类型的状态变量的key-value的映射关系,具体与前述类似,不再赘述。
第二种方式是,在合约账户中,可以不再设置合约状态相关的存储storage,而是设置一个独立于所述外部账户存储以及所述合约账户存储的全局状态存储。这样,可以将所述待存储的与所述区块链合约账户相关的状态存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中,即将所述待存储的合约中基本数据类型的状态变量以及合约账户的状态变量存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中。具体的,所述全局状态存储中,可以通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系,即将所述待存储的合约中基本数据类型的状态变量以及合约账户的状态变量通过树形结构存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中。
此外,还可以有第三种方式,即将所述待存储的合约账户的状态变量存储到对应的区块链合约账户的状态存储中,而将所述基本数据类型的状态变量存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中。具体的,可以是在所述合约账户的状态存储中通过树形结构存储所述区块链合约账户的状态变量的key-value的映射关系,在所述全局状态存储中通过树形结构存储所述基本数据类型的状态变量的key-value的映射关系。
上述的树形结构,可以采用16叉树。一般的,一个智能合约中的全局状态不超过32个状态变量。采用16叉树,可以采用两层树结构。则第二层树结构中,可以包括16*16=256个叶子节点,远大于32,因此可以满足一般的一个智能合约中可能包括的全局状态的数量。
通过上述本申请的实施例,将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中,每个外部账户的状态存储对应的外部账户相关的状态,使区块链系统对外部账户的访问分散到各个外部账户的状态存储中,可以避免单账户热点的问题。同时,每个外部账户存储的负载压力比较小,可以提升整个区块链系统的性能。而且,分散到各个外部账户的状态存储后,由于一个外部账户的状态数量相对比较少,并不会像图1中的方式将所有外部账户的状态集中于合约账户的状态存储中,从而可以大大降低每个外部账户的树形结构的深度,进而缩短了查找、更新外部账户的时间,提升了区块链存储的读写效率。
对于全局状态,即使采用上述第一种的方式全部存储于合约账户的状态存储中,一般也可以满足32个全局状态数量的要求,即采用两层深度的属性结构可以满足存储的需求,从而也可以大大降低树的深度。采用上述第二种或第三种方式,同样可以大大降低树的深度。
以下介绍本申请一种区块链节点的实施例,如图9所示,该区块链节点可以包括:
执行单元91,用于执行创建/调用合约的交易,并产生待存储的与所述区块链外部账户相关的状态;
存储单元92,用于将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
所述与所述区块链外部账户相关的状态可以包括:所述合约中定义的外部账户与资产的映射关系。
所述合约中定义的外部账户与资产的映射关系可以包括:通过映射数据结构定义的外部账户与资产的映射关系。
所述通过映射数据结构定义的外部账户与资产的映射关系,可以通过key-value来存储。
对于区块链系统中仅有一个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储可以包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所述新类型资产的key-value的hash值;
第二层存储所述映射定义的包括所述外部账户与所述新类型资产的key-value的映射关系。
对于区块链系统中仅有一个智能合约的情况,且该智能合约中定义且启用了至少两种新类型的资产,则区块链中状态树的存储可以包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所有所述新类型资产的key-value的根hash值;
第二层通过树形结构在每个叶子节点中存储定义的包括所述外部账户与一种所述新类型资产的key-value的映射关系。
对于区块链系统中有至少两个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储可以包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所述新类型资产的key-value的hash值;
第三层存储定义的包括所述外部账户与所述资产的key-value的映射关系。
对于区块链系统中有至少两个智能合约的情况,且该智能合约中定义或启用了至少两种新类型的资产,则区块链中状态树的存储可以包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所有所述新类型资产的key-value的根hash值;
第三层通过树形结构在每个叶子节点存储定义的包括所述外部账户与一种所述新类型资产的key-value的映射关系。
所述第一层通过树形结构在每个叶子节点中还可以存储该外部账户的交易计数。
所述第二层通过树形结构在每个叶子节点中还可以存储关联的智能合约的编号。
所述执行单元执行调用合约的交易,还可以产生待存储的与所述区块链合约账户相关的状态;所述与区块链合约账户相关的状态可以包括所述合约中基本数据类型的状态变量以及合约账户的状态变量。
所述的区块链节点,还可以包括:
所述存储单元将所述待存储的与所述区块链合约账户相关的状态存储到对应的区块链合约账户的状态存储中;
所述合约账户的状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
所述的区块链节点,还可以包括:
所述存储单元92可以将所述待存储的与所述区块链合约账户相关的状态存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;
所述全局状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
所述的区块链节点,还可以包括:
所述存储单元将所述待存储的合约账户的状态变量存储到对应的区块链合约账户的状态存储中;所述合约账户的状态存储中通过树形结构存储所述区块链合约账户的状态变量的key-value的映射关系;
所述存储单元将所述基本数据类型的状态变量存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;所述全局状态存储中通过树形结构存储所述基本数据类型的状态变量的key-value的映射关系。
所述的区块链节点,所述树形结构可以包括16叉树。
以下介绍本申请一种区块链节点的实施例,如图10所示,该区块链节点可以包括:
处理器101;
存储器102,其中存储有程序,其中在所述处理器101执行所述程序时,进行以下操作:
执行创建/调用合约的交易,产生待存储的与所述区块链外部账户相关的状态;
将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
所述与所述区块链外部账户相关的状态可以包括:所述合约中定义的外部账户与资产的映射关系。
所述合约中定义的外部账户与资产的映射关系可以包括:通过映射数据结构定义的外部账户与资产的映射关系。
所述通过映射数据结构定义的外部账户与资产的映射关系通过key-value来存储。
对于区块链系统中仅有一个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储可以包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所述新类型资产的key-value的hash值;
第二层存储定义的包括所述外部账户与所述新类型资产的key-value的映射关系。
对于区块链系统中仅有一个智能合约的情况,且该智能合约中定义且启用了至少两种新类型的资产,则区块链中状态树的存储可以包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所有所述新类型资产的key-value的根hash值;
第二层通过树形结构在每个叶子节点中存储定义的包括所述外部账户与一种所述新类型资产的key-value的映射关系。
对于区块链系统中有至少两个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储可以包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所述新类型资产的key-value的hash值;
第三层存储定义的包括所述外部账户与所述资产的key-value的映射关系。
对于区块链系统中有至少两个智能合约的情况,且该智能合约中定义或启用了至少两种新类型的资产,则区块链中状态树的存储可以包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所有所述新类型资产的key-value的根hash值;
第三层通过树形结构在每个叶子节点存储定义的包括所述外部账户与一种所述新类型资产的key-value的映射关系。
所述第一层通过树形结构在每个叶子节点中还可以存储该外部账户的交易计数。
所述第二层通过树形结构在每个叶子节点中还可以存储关联的智能合约的编号。
所述区块链节点执行调用合约的交易,还可以产生待存储的与所述区块链合约账户相关的状态;所述与区块链合约账户相关的状态可以包括所述合约中基本数据类型的状态变量以及合约账户的状态变量。
所述的区块链节点,还可以包括:
将所述待存储的与所述区块链合约账户相关的状态存储到对应的区块链合约账户的状态存储中;
所述合约账户的状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
所述的区块链节点,还可以包括:
将所述待存储的与所述区块链合约账户相关的状态存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;
所述全局状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
所述的区块链节点,还可以包括:
将所述待存储的合约账户的状态变量存储到对应的区块链合约账户的状态存储中;所述合约账户的状态存储中通过树形结构存储所述区块链合约账户的状态变量的key-value的映射关系;
将所述基本数据类型的状态变量存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;所述全局状态存储中通过树形结构存储所述基本数据类型的状态变量的key-value的映射关系。
所述树形结构可以包括16叉树。
本说明书提供的上述实施例所述的方法或装置或系统可以通过计算机程序实现业务逻辑并记录在存储介质上,所述的存储介质可以计算机读取并执行,实现本说明书实施例所描述方案的效果。
上述中所述存储器的存储介质可以包括用于存储信息的物理装置,通常是将信息数字化后再以利用电、磁或者光学等方式的媒体加以存储。所述存储介质有可以包括:利用电能方式存储信息的装置如,各式存储器,如RAM、ROM等;利用磁能方式存储信息的装置如,硬盘、软盘、磁带、磁芯存储器、磁泡存储器、U盘;利用光学方式存储信息的装置如,CD或DVD。当然,还有其他方式的可读存储介质,例如量子存储器、石墨烯存储器等等。
上述对本说明书特定实施例进行了描述。基于上述实施例描述的可扩展的实施例仍在本说明书提供的实施范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
如前所述,系统实施例根据相关方法实施例的描述还可以包括其他的实施方式,具体的实现方式可以参照对应方法实施例的描述,在此不作一一赘述。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于硬件+程序类实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书实施例并不局限于必须是区块链网络结构、符合行业通信标准、标准程序语言和数据存储规则或本说明书一个或多个实施例所描述的情况。某些行业标准或者使用自定义方式或实施例描述的实施基础上略加修改后的实施方案也可以实现上述实施例相同、等同或相近、或变形后可预料的实施效果。应用这些修改或变形后的数据获取、存储、判断、处理方式等获取的实施例,仍然可以属于本说明书实施例的可选实施方案范围之内。
本说明书实施例提供的区块链数据存储方法、装置,重新创新设计了区块链数据存储结构,改变了合约账户下存储有全量的合约数据的数据存储结构,将原有合约数据的集中存储进行打散,采用账户存储与该账户相关联的合约数据,极大的提高了数据查找和处理效率。同时合约数据跟随着用户账户进行存储,还有效的降低了单账户热点问题,并且账户之间的交易处理可以在交易所涉及的账户存储的数据下进行,有效提高整个区块链系统的吞吐量,提高了系统的处理效率。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device, PLD)(例如现场可编程门阵列(Field ProgrammableGate Array,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,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为服务器系统。当然,本申请不排除随着未来计算机技术的发展,实现上述实施例功能的计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
虽然本说明书一个或多个实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。例如若使用到第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储、石墨烯存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在权利要求范围之内。

Claims (45)

1.一种区块链状态的存储方法,包括:
区块链节点执行创建/调用合约的交易,产生待存储的与区块链外部账户相关的状态;
将所述待存储的与区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
2.如权利要求1所述的方法,所述与区块链外部账户相关的状态包括:
所述合约中定义的外部账户与资产的映射关系。
3.如权利要求2所述的方法,所述合约中定义的外部账户与资产的映射关系包括:
通过映射数据结构定义的外部账户与资产的映射关系。
4.如权利要求3所述的方法,所述通过映射数据结构定义的外部账户与资产的映射关系通过key-value来存储。
5.如权利要求2所述的方法,对于区块链系统中仅有一个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所述新类型的资产的key-value的hash值;
第二层存储定义的包括所述外部账户与所述新类型的资产的key-value的映射关系。
6.如权利要求2所述的方法,对于区块链系统中仅有一个智能合约的情况,且该智能合约中定义且启用了至少两种新类型的资产,则区块链中状态树的存储包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所有所述新类型的资产的key-value的根hash值;
第二层通过树形结构在每个叶子节点中存储定义的包括所述外部账户与一种所述新类型的资产的key-value的映射关系。
7.如权利要求2所述的方法,对于区块链系统中有至少两个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所述新类型的资产的key-value的hash值;
第三层存储定义的包括所述外部账户与所述资产的key-value的映射关系。
8.如权利要求2所述的方法,对于区块链系统中有至少两个智能合约的情况,且该智能合约中定义或启用了至少两种新类型的资产,则区块链中状态树的存储包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所有所述新类型的资产的key-value的根hash值;
第三层通过树形结构在每个叶子节点存储定义的包括所述外部账户与一种所述新类型的资产的key-value的映射关系。
9.如权利要求5-8中任一项所述的方法,所述第一层通过树形结构在每个叶子节点中还存储该外部账户的交易计数。
10.如权利要求7或8所述的方法,所述第二层通过树形结构在每个叶子节点中还存储关联的智能合约的编号。
11.如权利要求1所述的方法,所述区块链节点执行调用合约的交易,还产生待存储的与所述合约对应的合约账户相关的状态;所述与合约对应的合约账户相关的状态包括所述合约中基本数据类型的状态变量以及合约账户的状态变量。
12.如权利要求11所述的方法,还包括:
将所述待存储的与所述合约对应的合约账户相关的状态存储到对应的区块链合约账户的状态存储中;
所述合约账户的状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
13.如权利要求11所述的方法,还包括:
将所述待存储的与所述合约对应的合约账户相关的状态存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;
所述全局状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
14.如权利要求11所述的方法,还包括:
将所述待存储的合约账户的状态变量存储到对应的区块链合约账户的状态存储中;所述合约账户的状态存储中通过树形结构存储所述区块链合约账户的状态变量的key-value的映射关系;
将所述基本数据类型的状态变量存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;所述全局状态存储中通过树形结构存储所述基本数据类型的状态变量的key-value的映射关系。
15.如权利要求5-8、12-14中任一项所述的方法,所述树形结构包括16叉树。
16.一种区块链节点,包括:
执行单元,用于执行创建/调用合约的交易,并产生待存储的与区块链外部账户相关的状态;
存储单元,用于将所述待存储的与区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
17.如权利要求16所述的区块链节点,所述与区块链外部账户相关的状态包括:
所述合约中定义的外部账户与资产的映射关系。
18.如权利要求16所述的区块链节点,所述合约中定义的外部账户与资产的映射关系包括:
通过映射数据结构定义的外部账户与资产的映射关系。
19.如权利要求18所述的区块链节点,所述通过映射数据结构定义的外部账户与资产的映射关系,通过key-value来存储。
20.如权利要求17所述的区块链节点,对于区块链系统中仅有一个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所述新类型的资产的key-value的hash值;
第二层存储定义的包括所述外部账户与所述新类型的资产的key-value的映射关系。
21.如权利要求17所述的区块链节点,对于区块链系统中仅有一个智能合约的情况,且该智能合约中定义且启用了至少两种新类型的资产,则区块链中状态树的存储包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所有所述新类型的资产的key-value的根hash值;
第二层通过树形结构在每个叶子节点中存储定义的包括所述外部账户与一种所述新类型的资产的key-value的映射关系。
22.如权利要求17所述的区块链节点,对于区块链系统中有至少两个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所述新类型的资产的key-value的hash值;
第三层存储定义的包括所述外部账户与所述资产的key-value的映射关系。
23.如权利要求17所述的区块链节点,对于区块链系统中有至少两个智能合约的情况,且该智能合约中定义或启用了至少两种新类型的资产,则区块链中状态树的存储包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所有所述新类型的资产的key-value的根hash值;
第三层通过树形结构在每个叶子节点存储定义的包括所述外部账户与一种所述新类型的资产的key-value的映射关系。
24.如权利要求20-23中任一项所述的区块链节点,所述第一层通过树形结构在每个叶子节点中还存储该外部账户的交易计数。
25.如权利要求23所述的区块链节点,所述第二层通过树形结构在每个叶子节点中还存储关联的智能合约的编号。
26.如权利要求16所述的区块链节点,所述执行单元执行调用合约的交易,还产生待存储的与所述合约对应的合约账户相关的状态;所述与所述合约对应的合约账户相关的状态包括所述合约中基本数据类型的状态变量以及合约账户的状态变量。
27.如权利要求26所述的区块链节点,还包括:
所述存储单元将所述待存储的与所述合约对应的合约账户相关的状态存储到对应的区块链合约账户的状态存储中;
所述合约账户的状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
28.如权利要求26所述的区块链节点,还包括:
所述存储单元将所述待存储的与所述合约对应的合约账户相关的状态存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;
所述全局状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
29.如权利要求26所述的区块链节点,还包括:
所述存储单元将所述待存储的合约账户的状态变量存储到对应的区块链合约账户的状态存储中;所述合约账户的状态存储中通过树形结构存储所述区块链合约账户的状态变量的key-value的映射关系;
所述存储单元将所述基本数据类型的状态变量存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;所述全局状态存储中通过树形结构存储所述基本数据类型的状态变量的key-value的映射关系。
30.如权利要求20-23、27-29中任一项所述的区块链节点,所述树形结构包括16叉树。
31.一种区块链节点,包括:
处理器;
存储器,其中存储有程序,其中在所述处理器执行所述程序时,进行以下操作:
执行创建/调用合约的交易,产生待存储的与区块链外部账户相关的状态;
将所述待存储的与所述区块链外部账户相关的状态存储到对应的区块链外部账户的状态存储中。
32.如权利要求31所述的区块链节点,所述与所述区块链外部账户相关的状态包括:
所述合约中定义的外部账户与资产的映射关系。
33.如权利要求32所述的区块链节点,所述合约中定义的外部账户与资产的映射关系包括:
通过映射数据结构定义的外部账户与资产的映射关系。
34.如权利要求33所述的区块链节点,所述通过映射数据结构定义的外部账户与资产的映射关系通过key-value来存储。
35.如权利要求32所述的区块链节点,对于区块链系统中仅有一个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所述新类型的资产的key-value的hash值;
第二层存储定义的包括所述外部账户与所述新类型的资产的key-value的映射关系。
36.如权利要求32所述的区块链节点,对于区块链系统中仅有一个智能合约的情况,且该智能合约中定义且启用了至少两种新类型的资产,则区块链中状态树的存储包括两层;
第一层通过树形结构在每个叶子节点中存储一个外部账户相关的包括所有所述新类型的资产的key-value的根hash值;
第二层通过树形结构在每个叶子节点中存储定义的包括所述外部账户与一种所述新类型的资产的key-value的映射关系。
37.如权利要求32所述的区块链节点,对于区块链系统中有至少两个智能合约的情况,且该智能合约中仅定义或启用了一种新类型的资产,则区块链中状态树的存储包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所述新类型的资产的key-value的hash值;
第三层存储定义的包括所述外部账户与所述资产的key-value的映射关系。
38.如权利要求32所述的区块链节点,对于区块链系统中有至少两个智能合约的情况,且该智能合约中定义或启用了至少两种新类型的资产,则区块链中状态树的存储包括三层;
第一层通过树形结构在每个叶子节点中存储与一个外部账户相关的包括所有智能合约涉及信息的根hash值;
第二层通过树形结构在每个叶子节点中存储一个外部账户相关的包括一个智能合约涉及的所有所述新类型的资产的key-value的根hash值;
第三层通过树形结构在每个叶子节点存储定义的包括所述外部账户与一种所述新类型的资产的key-value的映射关系。
39.如权利要求35-38中任一项所述的区块链节点,所述第一层通过树形结构在每个叶子节点中还存储该外部账户的交易计数。
40.如权利要求37或38所述的区块链节点,所述第二层通过树形结构在每个叶子节点中还存储关联的智能合约的编号。
41.如权利要求31所述的区块链节点,所述区块链节点执行调用合约的交易,还产生待存储的与所述合约对应的合约账户相关的状态;所述与合约对应的合约账户相关的状态包括所述合约中基本数据类型的状态变量以及合约账户的状态变量。
42.如权利要求41所述的区块链节点,还包括:
将所述待存储的与所述合约对应的合约账户相关的状态存储到对应的区块链合约账户的状态存储中;
所述合约账户的状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
43.如权利要求41所述的区块链节点,还包括:
将所述待存储的与所述合约对应的合约账户相关的状态存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;
所述全局状态存储中通过树形结构存储所述区块链合约账户相关的状态的key-value的映射关系。
44.如权利要求41所述的区块链节点,还包括:
将所述待存储的合约账户的状态变量存储到对应的区块链合约账户的状态存储中;所述合约账户的状态存储中通过树形结构存储所述区块链合约账户的状态变量的key-value的映射关系;
将所述基本数据类型的状态变量存储到独立于所述外部账户存储以及所述合约账户存储的全局状态存储中;所述全局状态存储中通过树形结构存储所述基本数据类型的状态变量的key-value的映射关系。
45.如权利要求35-38、42-44中任一项所述的区块链节点,所述树形结构包括16叉树。
CN202011516854.7A 2020-12-21 2020-12-21 一种区块链数据存储方法、装置及区块链节点 Active CN112287032B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011516854.7A CN112287032B (zh) 2020-12-21 2020-12-21 一种区块链数据存储方法、装置及区块链节点

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011516854.7A CN112287032B (zh) 2020-12-21 2020-12-21 一种区块链数据存储方法、装置及区块链节点

Publications (2)

Publication Number Publication Date
CN112287032A CN112287032A (zh) 2021-01-29
CN112287032B true CN112287032B (zh) 2021-04-20

Family

ID=74426855

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011516854.7A Active CN112287032B (zh) 2020-12-21 2020-12-21 一种区块链数据存储方法、装置及区块链节点

Country Status (1)

Country Link
CN (1) CN112287032B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113254537A (zh) * 2021-06-17 2021-08-13 支付宝(杭州)信息技术有限公司 区块链状态的存储、读取方法和区块链节点

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110347684A (zh) * 2019-06-28 2019-10-18 阿里巴巴集团控股有限公司 基于区块链的分级存储方法及装置、电子设备
CN111144866A (zh) * 2019-12-25 2020-05-12 腾讯科技(深圳)有限公司 数据转移方法、装置、节点设备及存储介质
CN111630507A (zh) * 2020-04-20 2020-09-04 支付宝(杭州)信息技术有限公司 账户模型下的分布式区块链数据存储

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110347684A (zh) * 2019-06-28 2019-10-18 阿里巴巴集团控股有限公司 基于区块链的分级存储方法及装置、电子设备
CN111144866A (zh) * 2019-12-25 2020-05-12 腾讯科技(深圳)有限公司 数据转移方法、装置、节点设备及存储介质
CN111630507A (zh) * 2020-04-20 2020-09-04 支付宝(杭州)信息技术有限公司 账户模型下的分布式区块链数据存储

Also Published As

Publication number Publication date
CN112287032A (zh) 2021-01-29

Similar Documents

Publication Publication Date Title
CN112261159B (zh) 执行跨片事务的方法及系统、主链节点和目标分片节点
CN112257118B (zh) 一种锁定包含分片的区块链系统中跨片事务的方法及系统
CN112261163B (zh) 一种区块链系统中的状态存储方法及区块链系统、节点
CN110473030B (zh) 基于区块链的电子票据号码申领方法及装置、电子设备
CN110275884A (zh) 数据存储方法及节点
WO2024045382A1 (zh) 区块链中实现反射机制
CN106095698A (zh) 面向对象的缓存写入、读取方法及装置
CN112261157B (zh) 提交跨片事务的方法及系统、主链节点和源分片节点
CN113259478B (zh) 在区块链系统中执行交易的方法、装置及区块链系统
CN110032568A (zh) 数据结构的读取及更新方法、装置、电子设备
CN112287032B (zh) 一种区块链数据存储方法、装置及区块链节点
CN112527781A (zh) 一种智能合约数据迁移方法及系统
CN112261160B (zh) 包含分片的区块链系统中退出跨片事务的方法及系统
CN112269423B (zh) 一种锁定区块链系统中全局时钟的方法及区块链系统
CN112261161B (zh) 一种锁定区块链系统中分片区块的方法及区块链系统
CN112261156B (zh) 一种提交跨片事务的方法及系统、主链节点和源分片节点
CN112396422B (zh) 提交跨片事务的方法及系统、主链节点和目标分片节点
CN115640356A (zh) 区块链系统中的交易执行方法、共识节点和区块链系统
CN108399068A (zh) 函数程序持久化的方法、电子设备及存储介质
CN110096550B (zh) 一种基于区块链的存储结构的设计与实现方法
CN109101277B (zh) 一种基于语义一致性的信息处理系统
WO2024055437A1 (zh) 一种检测合约升级的兼容性的方法和装置
CN116361337A (zh) 区块链交易读写集生成方法和区块链节点
CN116862486A (zh) 区块链系统中跨分片交易的处理方法和分片节点
CN112261158B (zh) 返回跨片事务响应的方法及系统、主链节点和源分片节点

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40045822

Country of ref document: HK