一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

区块链数据存储、更新、读取方法及装置、电子设备与流程

2022-07-06 08:07:40 来源:中国专利 TAG:


1.本说明书一个或多个实施例涉及区块链技术领域,尤其涉及一种区块链数据存储、更新、读取方法及装置、电子设备。


背景技术:

2.区块链技术,也被称之为分布式账本技术,是一种由若干台节点设备共同参与“记账”,共同存储和维护一份完整的分布式数据库的新兴技术。
3.对于区块链的节点设备来说,需要存储和维护的区块链数据,通常包括区块数据、区块链中的区块链账户对应的账户状态数据;而区块数据又可以进一步包括区块头数据、区块中的区块交易数据、以及与区块中的区块交易数据对应的交易收据,等等。
4.区块链的节点设备在存储以上示出的各种区块链数据时,通常可以将上述各种区块链数据组织成逻辑的树状结构在数据库中存储。


技术实现要素:

5.本说明书提出一种区块链数据存储方法,所述方法包括:
6.获取待存储的区块链数据的key-value键值对;
7.将所述待存储的区块链数据的key-value键值对转换成逻辑的树形结构上的根节点、中间节点和叶子节点;所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash 值和存储该下一层的节点的数据库的数据库标识;所述根节点、中间节点用于存放所述区块链数据对应的key-value键值对的key中的字符;所述叶子节点用于存放所述区块链数据对应的key-value键值对的value;确定用于存储所述根节点、中间节点和叶子节点的数据库,并将所述根节点、中间节点和叶子节点存储在确定出的数据库中;其中,所述逻辑的树状结构上的节点至少分别存储在多个数据库中。
8.本说明书还提出一种区块链数据更新方法,所述区块链数据的key-value键值对以逻辑的树状结构上的节点的形式在数据库中进行存储;所述逻辑的树状结构包含用于存放区块链数据的根节点、中间节点和叶子节点;其中,所述逻辑的树状结构上的节点至少分别存储在多个数据库中;所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash值和存储该下一层的节点的数据库的数据库标识;所述方法包括:
9.确定所述逻辑的树状结构上用于存放待更新的目标区块链数据的key-value键值对的根节点、中间节点和叶子节点,并确定用于存储更新后的所述根节点、中间节点和叶子节点的数据库;
10.基于所述目标区块链数据的key-value键值对的value更新确定出的所述叶子节点,在所述叶子节点更新完成后,将更新后的所述叶子节点的hash值和确定出的用于存储更新后的所述叶子节点的数据库的数据库标识进一步写入该叶子节点链接的上一层的中
间节点,以对所述中间节点进行更新;
11.在所述中间节点更新完成后,将更新后的所述中间节点的hash值和确定出的用于存储更新后的所述中间节点的数据库的数据库标识进一步写入该中间节点链接的上一层的节点,以对该中间节点链接的上一层的节点继续进行更新,以此类推,直到所述逻辑的树状结构上的根节点更新完成。
12.本说明书还提出一种区块链数据读取方法,所述区块链数据的key-value键值对以逻辑的树状结构上的节点的形式在数据库中进行存储;所述逻辑的树状结构包含用于存放区块链数据的根节点、中间节点和叶子节点;其中,所述逻辑的树状结构上的节点至少分别存储在多个数据库中;所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash值和存储该下一层的节点的数据库的数据库标识;所述方法包括:
13.读取所述逻辑的树状结构的根节点的hash值,并确定用于存储所述逻辑的树状结构的根节点的数据库;将所述根节点的hash值作为查询索引,从所述数据库中查询所述根节点,并将查询到的所述根节点加载在内存中;
14.读取所述根节点中存储的链接至该根节点的下一层的中间节点的hash值以及存储该中间节点的数据库的数据库标识,并将所述中间节点的hash值作为查询索引,从与所述数据库标识对应的数据库中查询所述中间节点,并将查询到的所述中间节点加载在内存中;
15.读取所述中间节点中存储的链接至该中间节点的下一层的节点的hash值以及存储该下一层节点的数据库的数据库标识,并将所述下一层的节点的hash值作为查询索引,从与所述数据库标识对应的数据库中查询所述下一层节点,并将查询到的所述下一层节点加载在内存中,以此类推,直到将所述逻辑的树状结构中的叶子节点均加载到内存中。
16.本说明书还提出一种区块链数据存储装置,所述装置包括:
17.获取模块,获取待存储的区块链数据的key-value键值对,并确定用于存储所述区块链数据的数据库;
18.转换模块,将所述区块链数据的key-value键值对转换成逻辑的树形结构上的根节点、中间节点和叶子节点;其中,所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash值和存储该下一层的节点的数据库的数据库标识;所述根节点、中间节点用于存放所述区块链数据对应的key-value键值对的key中的字符;所述叶子节点用于存放目标区块链数据对应的key-value键值对的value;
19.存储模块,将所述根节点、中间节点和叶子节点分别存储至数据库中;其中,所述逻辑的树状结构上的节点至少分别存储在多个数据库中。
20.本说明书还提出一种区块链数据更新装置,所述区块链数据的key-value键值对以逻辑的树状结构上的节点的形式在数据库中进行存储;所述逻辑的树状结构包含用于存放区块链数据的根节点、中间节点和叶子节点;其中,所述逻辑的树状结构上的节点至少分别存储在多个数据库中;所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash值和存储该下一层的节点的数据库的数据库标识;所述装置包括:
21.确定模块,确定所述逻辑的树状结构上用于存放待更新的目标区块链数据的 key-value键值对的根节点、中间节点和叶子节点,并确定用于存储更新后的所述根节点、中间节点和叶子节点的数据库;
22.更新模块,基于所述目标区块链数据的key-value键值对的value更新确定出的所述叶子节点,在所述叶子节点更新完成后,将更新后的所述叶子节点的hash值和确定出的用于存储更新后的所述叶子节点的数据库的数据库标识进一步写入该叶子节点链接的上一层的中间节点,以对所述中间节点进行更新;在所述中间节点更新完成后,将更新后的所述中间节点的hash值和确定出的用于存储更新后的所述中间节点的数据库的数据库标识进一步写入该中间节点链接的上一层的节点,以对该中间节点链接的上一层的节点继续进行更新,以此类推,直到所述逻辑的树状结构上的根节点更新完成。
23.本说明书还提出一种区块链数据读取装置,所述区块链数据的key-value键值对以逻辑的树状结构上的节点的形式在数据库中进行存储;所述逻辑的树状结构包含用于存放区块链数据的根节点、中间节点和叶子节点;其中,所述逻辑的树状结构上的节点至少分别存储在多个数据库中;所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash值和存储该下一层的节点的数据库的数据库标识;所述装置包括:
24.第一读取模块,读取所述逻辑的树状结构的根节点的hash值,并确定用于存储所述逻辑的树状结构的根节点的数据库;将所述根节点的hash值作为查询索引,从所述数据库中查询所述根节点,并将查询到的所述根节点加载在内存中;
25.第二读取模块,读取所述根节点中存储的链接至该根节点的下一层的中间节点的hash值以及存储该中间节点的数据库的数据库标识,并将所述中间节点的hash值作为查询索引,从与所述数据库标识对应的数据库中查询所述中间节点,并将查询到的所述中间节点加载在内存中;
26.第三读取模块,读取所述中间节点中存储的链接至该中间节点的下一层的节点的 hash值以及存储该下一层节点的数据库的数据库标识,并将所述下一层的节点的hash 值作为查询索引,从与所述数据库标识对应的数据库中查询所述下一层节点,并将查询到的所述下一层节点加载在内存中,以此类推,直到将所述逻辑的树状结构中的叶子节点均加载到内存中。
27.以上技术方案中,一方面,通过将基于区块链数据组的key-value键值对织成的逻辑的树状结构上的节点,分别存储在多个数据库中,可以避免将区块链数据存储在单一的数据库中所面临的性能问题,提高用于存储区块链数据的数据库的可扩展性。
28.另一方面,由于上述逻辑的树状结构上的节点的数据结构中,除了可以包括链接至该节点的下一层的节点的hash值以外,还可以包括存储该下一层的节点的数据库的数据库标识;因此,通过这种方式,即使将上述逻辑的树状结构上的节点分别存储在不同的数据库中,也仍然能够根据节点中存储的下一层的节点的hash值和对应的数据库标识,将分布在不同的数据库中的节点链接起来,使得分布在不同的数据库中的节点在逻辑上仍然是一个整体,从而仍然可以保证上述逻辑的树状结构的完整性。
附图说明
29.图1是一示例性实施例提供的一种mpt树的树形结构图
30.图2是一示例性实施例提供的一种将区块链中的各个区块链账户的账户状态数据以 key-value键值对的形式组织成mpt状态树的示意图;
31.图3是一示例性实施例提供的一种将合约账户对应的存储空间中存储的合约数据组织成mpt storage树的示意图;
32.图4是一示例性实施例提供的一种fdmt树的树形结构图;
33.图5是一示例性实施例提供的一种tree node的结构图;
34.图6是一示例性实施例提供的一种bucket数据桶的结构图;
35.图7是一示例性实施例提供的一种区块链数据存储方法的流程图;
36.图8是一示例性实施例提供的一种在图1的基础之上改进之后的mpt树的树形结构的示意图。
37.图9是一示例性实施例提供的一种在图4的基础之上改进之后的fdmt树的树形结构的示意图。
38.图10是一示例性实施例提供的一种区块链数据更新方法的流程图;
39.图11是一示例性实施例提供的一种区块链数据读取方法的流程图;
40.图12是一示例性实施例提供的一种电子设备的结构示意图;
41.图13是一示例性实施例提供的一种区块链数据存储装置的框图;
42.图14是一示例性实施例提供的一种区块链数据更新装置的框图;
43.图15是一示例性实施例提供的一种区块链数据读取装置的框图。
具体实施方式
44.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
45.需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
46.区块链(blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链系统中按照时间顺序将数据区块以顺序相连的方式组合成链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。由于区块链具有去中心化、信息不可篡改、自治性等特性,区块链也受到人们越来越多的重视和应用。
47.在区块链领域,有一个重要的概念就是账户(account)。对于引入智能合约的各种区块链网络中,区块链账户通常可以分为以下两种类型:
48.合约账户(contract account):存储执行的智能合约代码以及智能合约代码中状
态的值,通常只能通过外部账户调用激活;
49.外部账户(externally owned account):就是由用户直接控制的账户,也称之为用户账户。
50.外部账户和合约账户的设计,实际上是账户地址到账户状态的映射。账户的状态通常会通过一个结构体来表示。当区块中的交易被执行后,区块链中与该交易相关的账户的状态通常也会发生变化。
51.在一个例子中,账户的结构体通常包括balance,nonce,codehash和storageroot等字段。其中:
52.balance字段,用于维护账户目前的账户余额;
53.nonce字段,用于维护该账户的交易次数。它是用于保障每笔交易能且只能被处理一次的计数器,有效避免重放攻击;
54.codehash字段,用于维护该账户的合约代码。在实际应用中,codehash字段中通常仅维护合约代码的hash值。
55.storageroot字段,用于维护该账户的存储内容。对于合约账户而言,通常会分配一个独立的持久化的存储空间,用以存储该合约账户对应的合约数据。该独立的存储空间通常称之为该合约账户的账户存储。
56.合约账户的存储内容通常会以key-value键值对的形式被构建成mpt(merkle patriciatrie)树的数据结构进行存储。mpt树是区块链领域用于存储和维护区块链数据的一种逻辑的树形结构,在这种树形结构中通常包括根节点、中间节点、叶子节点。
57.其中,基于合约账户的存储内容构建成的mpt树,通常也称之为storage树。而 storageroot字段通常仅维护该storage树的根节点的hash值。其中,对于外部账户而言,以上示出的codehash字段和storageroot字段的字段值均为空值。
58.对于大多数区块链模型,通常都会采用merkle树;或者,在merkle树的数据结构的基础上设计的merkle树变种等逻辑的树形结构,来存储和维护数据。
59.例如,mpt树,就是一种用来存储和维护区块链数据的,融合了trie字典树的树形结构的merkle树变种。
60.又如,fdmt(fixed depth merkle tree)树,也是一种用来存储和维护区块链数据的,融合了trie字典树的树形结构的merkle树变种。
61.以下以使用mpt树,来存储区块链数据为例进行说明。
62.在一个例子中,区块链中需要存储和维护的区块链数据,通常包括账户状态(state)数据、交易数据和收据数据。因此,在实际应用中,可以分别将上述账户状态数据、交易数据和收据数据以key-value键值对的形式,组织成mpt状态树(即world state)、mpt交易树和mpt 收据树等三棵mpt树,分别进行存储和维护。
63.其中,除了以上三棵mpt树以外,合约账户对应的存储空间中存储的合约数据,通常也会被构建成为一棵mtp storage树(以下简称为storage树)。该storage树的根节点的hash 值,会被添加到与该storage树对应的合约账户的上述结构体中的storage字段。
64.mpt状态树,是由区块链中所有账户(包括外部账户和合约账户)的账户状态(state)数据,以key-value键值对的形式组织成的mpt树。
65.mpt交易树,是由区块链中的交易(transaction)数据,以key-value键值对的形式
组织成的mpt树。
66.mpt收据树,是区块中的交易在执行完毕后生成的与每笔交易对应的交易(receipt)收据,以key-value键值对的形式组织成的mpt树。
67.以上示出的mpt状态树、mpt交易树和mpt收据树的根节点的hash值,最终都会被添加至对应区块的区块头中。
68.其中,mpt交易树和mpt收据树均与区块相对应,即每一个区块都有自己的mpt交易树和mpt收据树。而mpt状态树是一个全局的mpt树,并不与某一个特定的区块相对应,而是涵盖了区块链中所有账户的账户状态数据。区块链每产生一个最新区块,则在该最新区块中的交易被执行之后,区块链中这些被执行交易的相关账户(可以是外部账户也可以是合约账户)的账户状态,通常也会随之发生变化。
69.例如,当区块中的一笔“转账交易”执行完毕后,与该“转账交易”相关的转出方账户和转入方账户的余额(即这些账户的balance字段的字段值),通常也会随之发生变化。节点设备在区块链产生的最新区块中的交易执行完毕后,由于当前区块链中的账户状态发生了变化,因此节点设备需要根据区块链中所有账户当前的账户状态数据,来构建mpt状态树,用于维护区块链中所有账户的最新状态。
70.每当区块链中产生一个最新区块,并且该最新区块中的交易执行完毕后,导致区块链中的部分账户的账户状态发生了变化,节点设备都需要基于区块链中所有账户最新的账户状态数据,重新构建一棵mpt状态树。换句话说,区块链中每一个区块,都有一个与之对应的mpt 状态树。该mpt状态树,维护了在该区块中的交易在执行完毕后,区块链中所有账户最新的账户状态。
71.请参见图1,图1为本说明书示出的一种mpt树的树形结构图。
72.其中,需要说明的是,图1中各个节点的连接关系仅为示意性的。
73.mpt树,是一种较为传统的经过改良的merkle树变种,其融合了merkle树和trie字典树(也称之为前缀树)两种树形结构的优点。
74.在mpt树中通常包括三种节点,分别为叶子节点(leaf node),扩展节点(extension node) 和分支节点(branch node)。其中,mpt树的根节点通常可以是扩展节点。mpt树的中间节点通常可以是分支节点或者其它的扩展节点。
75.其中,扩展节点和分支节点可以统称为字符节点,用于存储账户状态数据的key(即账户地址)对应的字符串的字符前缀部分。对于mpt树而言,上述字符前缀部分通常是指共享字符前缀(shared nibbles)。所述共享字符前缀,是指所有账户状态数据的key(即区块链账户地址)所具有的相同的一个或者多个字符组成的前缀。而上述叶子节点,用于存储区块链数据的key对应的字符串的字符后缀部分(key-end)和value(即具体的账户状态数据)。
76.扩展节点,用于存储账户地址的共享字符前缀中一个或者多个字符(即图1示出的sharednibble),和该扩展节点链接的下一层的节点的hash值(即图1示出的next node)。
77.分支节点,包含17个槽位,前16个槽位对应着key中的16个可能的十六进制字符,一个字符对应一个nibble(半字节),前16个槽位中的每一个槽位,分别表示一个账户地址的共享字符前缀中的一个字符,这些槽位用于填充该分支节点链接的下一层的节点的hash值。最后一个槽位为value槽位,一般为空值。
78.叶子节点,用于存储账户地址的字符后缀(即图1示出的key-end),和账户状态数据的 value(即以上描述的账户的结构体)。其中,账户地址的字符后缀和账户地址的共享字符前缀共同组成了一个完整的账户地址。所述字符后缀,是指除了账户地址的共享字符前缀以外的最后一个或者多个字符组成的后缀。
79.请参见图2,图2为本说明书示出的一种将区块链中的各个区块链账户的账户状态数据以key-value键值对的形式组织成mpt状态树的示意图。
80.假设需要组织成mtp状态树的账户状态数据的key-value键值对如下表1所示:
[0081][0082]
表1
[0083]
其中,需要说明的是,在表1中,前三行的账户地址对应的区块链账户为外部账户, codehash和storage root字段为空值。第4行的账户地址对应的区块链账户为合约账户,codehash字段维护了该合约账户对应的合约代码的hash值;storage root字段维护了该合约账户的存储内容构成的storage树的根节点的hash值。
[0084]
最终按照表1中的账户状态数据组织成的mpt状态树,如图3所示。
[0085]
该mpt状态树是由4个叶子节点,2个分支节点,和2个扩展节点(其中一个扩展节点作为根节点)构成。
[0086]
在图2中,prefix字段为扩展节点和叶子节点共同具有的前缀字段。该prefix字段的不同字段值可以用于表示不同的节点类型。
[0087]
例如,prefix字段的取值为0,表示包含偶数个nibbles的扩展节点;如前所述,nibble 表示半字节,由4位二进制组成,一个nibble可以对应一个组成账户地址的字符。prefix 字段的取值为1,表示包含奇数个nibble(s)的扩展节点;prefix字段的取值为2,表示包含偶数个nibbles的叶子节点;prefix字段的取值为3,表示包含奇数个nibble(s)的叶子节点。而分支节点,由于其是并列单nibble的字符节点,因此分支节点不具有上述prefix字段。
[0088]
扩展节点中的shared nibble字段,对应该扩展节点所包含的键值对的key值,表示账户地址之间的共同字符前缀;比如,上表中的所有账户地址均具有共同的字符前缀a7。nextnode字段中填充下一个节点的hash值(hash指针)。
[0089]
分支节点中的16进制字符0~f字段,对应该分支节点所包含的键值对的key值;如果该分支节点为账户地址在mpt树上的搜索路径上的中间节点,则该分支节点的value字段可以为空值。0~f字段中用于填充下一层节点的hash值。
[0090]
叶子节点中的key-end,对应该叶子节点所包含的键值对的key值,表示账户地址的最后几个字符(账户地址的字符后缀)。从根节点搜索到叶子节点的搜索路径上的各个节
node时,可以基于node所包含的数据内容的hash值作为key来进行内容寻址。
[0103]
请参见图4,图4为本说明书示出的一种fdmt树的树形结构图。
[0104]
上述fdmt树也是一种融合了trie字典树的树形结构的merkle树变种。
[0105]
在实际应用中,也可以将区块链数据以key-value键值对的形式组织成fdmt树的形式在数据库中进行存储。
[0106]
如图4所示,在fdmt树的树形结构中,可以包含前n层(图4示出的为3层,仅为示意性的)的tree node,和最后一层的leaf node(即叶子节点)。其中,在前n层的tree node 中,第一层的tree node将作为根节点,除了第一层以外的其它层的tree node将作为中间节点。
[0107]
其中,与以上描述的mpt树不同的是,上述fdmt树前n层的各个tree node(即根节点和中间节点),将采用统一的数据结构。
[0108]
如图4所示,上述fdmt树上的前n层的tree node,均可以包括分别代表不同字符的多个block;上述block为用于存放区块链数据的key中的字符的“位置”。而每一个block 可以进一步包括多个分别代表不同字符的槽位。上述槽位也用于存放区块链数据的key中的字符。
[0109]
例如,图4示出的为每一个tree node包括n个block;每个block进一步包括n个slot。其中,上述fdmt树上各层的节点之间,仍然可以采用在上一层的节点中填充下一层的节点的 hash值(hash指针)的方式,来进行节点间的链接。也即,上述fdmt树中的节点,通过其自身的hash值,链接至上一层的节点。相应的,上述槽位具体可以用于填充当前的tree node 所链接的下一层节点的hash值。tree node的下一层节点,具体仍然可以是tree node,也可以是leaf node。
[0110]
需要解释的是,图4中示出的上述fdmt树上各层的节点之间的链接关系仅为示意性的,并不是对上述fdmt树上各层的节点之间的链接关系的一种特殊限定。
[0111]
请继续参见图4,图4示出的上述fdmt树上的各tree node,均可以用于存储上述区块链数据的key中的至少部分字符。
[0112]
上述区块链数据的key对应的字符串仍然可以包括字符前缀和字符后缀。在这种情况下,上述tree node可以用于存储所述区块链数据的key的字符前缀中的字符。上述叶子节点可以用于存储所述区块链数据的key的字符后缀和上述区块链数据的value。
[0113]
对于图4示出的上述fdmt树上的各tree node,实际存储的字符,具体可以是该tree node 中的block(即至少有一个槽位填充了hash值的非空block)所代表的字符,与该block中填充了hash值的槽位(即非空槽位)所代表的字符,进行拼接生成的字符串。
[0114]
其中,需要说明的是,在实际应用中,tree node中的每一个block,可以仅代表一位字符。也即,基于图4示出的tree node的存储格式,每一个tree node实际存储的上述区块链数据的key的字符前缀中的部分字符,为长度是2位字符的字符串。
[0115]
例如,请参见图5,图5为本说明书示出的一种tree node的结构图;
[0116]
如图5所示,该tree node包含16个代表不同的16进制字符的block;每一个block 进一步包括16个分别代表不同的16进制字符的slot(图5中只示出了block6包含的16个槽位)。假设该tree node中的block6(代表了16进制字符6)为非空block,该block中的slot4(代表了16进制字符4)、slot6(代表了16进制字符6)和slot9(代表了16进制字符9)为填充
了该tree node链接的下一层节点的hash值的非空slot;则该tree node 存储的上述区块链数据的key的字符前缀中的部分字符,分别为16进制字符串“64”、“66”和“69”。
[0117]
其中,上述tree node中所包含的block的数量,以及每一个block所包含的槽位的数量,在本说明书中不进行特别限定。在实际应用中,可以基于上述区块链数据的key对应的字符串所包含的字符元素的类型数,来确定上述tree node所包含的子block的数量;以及,子block所包含的槽位的数量。
[0118]
例如,假设上述区块链数据对应的key为16进制字符串,此时上述区块链数据的key对应的字符串所包含的字符元素的类型数为16;则上述tree node中所包含的block的数量,以及每一个block所包含的槽位的数量都可以为16。
[0119]
其中,上述fdmt树包含的tree node的层数,具体可以是一个固定值;在实际应用中,上述n的取值具体可以是一个大于或者等于1的整数。也即,上述fdmt树具体可以是一棵包含至少一层tree node,并且包含的tree node的层数相对固定的merkle树。
[0120]
例如,在一个例子中,以上述区块链数据的key为区块链账户地址为例,假设区块链系统支持的区块链账户地址被设计为,前6位地址字符可以相同。那么,在这种情况下,由于 tree node存储的字符的长度为2位字符;因此,上述fdmt树可以被设计成包含三层tree node 的树状结构。
[0121]
进一步的,对于图4上示出的fdmt树上的tree node和leaf node,也可以以key-value 键值对的形式在数据库中进行持久化存储。其中,上述fdmt树上的tree node或leaf node 对应的key-value键值对中的key,具体可以是tree node或leaf nod所包含的数据内容的 hash值。tree node或leaf node的键值对中的value,具体可以是tree node或leaf node 所包含的数据内容。
[0122]
在将fdmt树上的tree node或leaf node存储至数据库时,也可以计算该tree node或 leaf node所包含的数据内容的hash值(即对node整体进行hash计算),并将计算出的hash 值作为key,将该tree node或leaf node所包含的数据内容作为value,生成key-value键值对。然后,将生成的key-value键值对存储至数据库中。而在需要查询上述fdmt树上的 node时,可以基于node所包含的数据内容的hash值作为key来进行内容寻址。
[0123]
需要说明的是,图4示出的fdmt树的树形结构,可以用于存储区块链中的各个区块链账户的账户状态数据,也可以用于存储某一合约账户对应的存储空间中存储的合约数据。其中,用于存储区块链中的各个区块链账户的账户状态数据的fdmt树,可以称之为 fdmt状态树。用于存储某一合约账户对应的存储空间中存储的合约数据的fdmt树,可以称之为fdmt storage树。上述fdmt storage树上的根节点,具体也可以通过其hash 值链接到上述fdmt状态树中与上述合约账户对应的叶子节点中。该fdmt storage树上的根节点的hash值,也可以被添加到上述fdmt状态树中与该合约账户对应的叶子节点中存储的账户状态中的storage root字段里,不再赘述。
[0124]
其中,需要说明的是,无论是图1示出的mpt树,还是图4示出的fdmt树,其树形结构上的leaf node实际存储的数据,相对于其它类型的节点通常具有更大的数据容量。比如,上述leaf node实际存储的上述区块链数据的value,通常为上述区块链数据的原始内容,上述区块链数据的原始内容相对于上述区块链数据的字符前缀而言,其所占用的存储空间也更大。因此,为了确保上述leaf node能够具有更大的数据容量,无论是图1示出的mpt树,
还是图4示出的fdmt树上的leaf node,通常都被设计成大数据块的形式。
[0125]
其中,上述数据块的具体形式以及存储结构,在本说明书中不进行特别限定。
[0126]
例如,在实际应用中,上述叶子节点具体可以是bucket数据桶的形式。其中,上述bucket 数据桶具体可以是用于存储数据的容器或者存储空间。
[0127]
例如,请参见图6,图6为本说明书示出的一种bucket数据桶的结构图。
[0128]
如图6所示,在上述bucket数据桶(即图6中示出的bucker node)中,可以包括若干条数据记录。其中,每一条数据记录都分别对应一条区块链数据,用于存储上述区块链数据的key的字符后缀(即图6中示出的key-end)和value。也即,一条数据记录,是指一条包括上述区块链数据的key的字符后缀和value的存储记录。
[0129]
需要说明的是,图6示出的bucket数据桶的结构,具体是以作为图4示出的fdmt树上的leaf node为例来进行说明的。实际应用中,图6示出的bucker node的结构具体也可以作为图1示出的mpt树的leaf node,在本说明书不再赘述。
[0130]
在实际应用中,由于区块链中的区块链数据的数据规模通常会持续不断的增长,因此随着区块链数据的数据规模的不断增长,无论是将区块链数据组织成图1示出的mpt树在数据库中存储,还是组织成图4示出的fdmt树在数据库中进行存储,最终都可能会使该数据库面临性能上的问题。
[0131]
例如,当数据库中存储的区块链数据的容量超负荷时,通常会导致该数据库的读写性能的下降。而且,一旦数据库中的某个文件发生损坏,在对该数据库进行恢复时,恢复的时间通常也会非常长。
[0132]
有鉴于此,本说明书提出一种在不牺牲逻辑的树状结构的完整性的基础上,将该逻辑的树状结构中的节点分别存储在多个数据库中的技术方案。
[0133]
在实现时,上述逻辑的树状结构包含的用于存储区块链数据的节点,可以分别存储在多个数据库中。
[0134]
除此之外,还可以对上述逻辑的树状结构上的节点的数据结构进行扩展,在上述逻辑的树状结构上的节点的存储内容中,除了就可以包括链接至该节点的下一层的节点的hash值之外,还可以包括存储该下一层的节点的数据库的数据库标识。
[0135]
通过将基于区块链数据组的key-value键值对织成的逻辑的树状结构上的节点,分别存储在多个数据库中,可以避免将区块链数据存储在单一的数据库中所面临的性能问题,提高用于存储区块链数据的数据库的可扩展性。
[0136]
另一方面,由于上述逻辑的树状结构上的节点的数据结构中,除了可以包括链接至该节点的下一层的节点的hash值以外,还可以包括存储该下一层的节点的数据库的数据库标识;因此,通过这种方式,即时将上述逻辑的树状结构上的节点分别存储在不同的数据库中,也仍然能够根据节点中存储的下一层的节点的hash值和对应的数据库标识,将分布在不同的数据库中的节点链接起来,使得分布在不同的数据库中的节点在逻辑上仍然是一个整体,从而仍然可以保证上述逻辑的树状结构的完整性。
[0137]
请参见图7,图7是一示例性实施例提供的一种区块链数据存储方法的流程图。所述方法应用于区块链中的节点设备;所述方法包括以下步骤:
[0138]
步骤702,获取待存储的区块链数据的key-value键值对;
[0139]
上述待存储的区块链数据,具体可以包括需要在区块链中进行持久化存储的任意
类型的数据。在示出的一种实施方式中,上述待存储的区块链数据,具体可以包括与区块链上的区块链账户对应的账户状态数据。例如,如前所述,在实际应用中,区块链中的区块链账户通常可以包括外部账户和合约账户,因而与区块链上的区块链账户对应的账户状态数据,则具体可以包括与区块链上的用户账户和合约账户对应的账户状态数据(比如可以是账户余额数据),以及区块链上的合约账户中存储的状态变量数据(比如可以是智能合约中存储的存证数据)。当然,在实际应用中,上述待存储的区块链数据也可以包括发布至区块链网络中的交易数据,以及与交易数据在执行完毕后产生的与交易数据对应的收据数据,等等。
[0140]
在一个例子中,区块链中的节点设备,在获取待存储的区块链数据的key-value键值对时,具体可以在获取到待存储的区块链数据之后,在本地将该区块链数据处理成key-value 键值对。
[0141]
在另一个例子中,将待存储的区块链数据处理成key-value键值对的步骤,也可以由第三方来完成,节点设备可以从该第三方直接获取由该第三方处理完成的该待存储的区块链数据的key-value键值对。
[0142]
其中,区块链数据的key-value键值对中的key,可以是指该区块链数据在数据库中的主键。该主键具体可以充当查询索引的作用。区块链数据的key-value键值对中的value,具体是指上述区块链数据的数据内容。
[0143]
需要说明的是,对于不同类型的区块链数据,其key-value键值对中的key,通常也可能会存在一定的差异。例如,如果上述区块链数据具体为区块链中的区块链账户对应的账户状态数据,则该账户状态数据的key-value键值对中的key,具体可以是区块链账户的账户地址。如果上述区块链数据具体为区块链中的交易数据或者与交易数据对应的收据数据时,该交易数据或者与交易数据对应的收据数据的key-value键值对中的key,具体可以是交易标识;比如,在实际应用中,该交易标识具体可以是交易的hash值,或者也可以是在对交易进行共识时为该交易分配的交易id。
[0144]
步骤704,将所述区块链数据的key-value键值对转换成逻辑的树形结构上的根节点、中间节点和叶子节点;其中,所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash值和存储该下一层的节点的数据库的数据库标识;所述根节点、中间节点用于存放所述区块链数据对应的key-value键值对的key中的字符;所述叶子节点用于存放所述区块链数据对应的key-value键值对的value;
[0145]
对于待存储的区块链数据的key-value键值对,具体可以将其组织成逻辑的树状结构,并以该逻辑的树状结构上的节点的形式,在数据库中进行存储。所谓逻辑的树形结构,是指基于数据库中存储的节点,以及节点之间的链接关系,在逻辑层面上构建出的树形结构。
[0146]
例如,在实际应用中,上述逻辑的树形结构中具体可以包括等多层节点,该多层节点具体可以以节点为单位存储在承载数据库的底层物理存储(比如磁盘)中。在需要使用上述逻辑的树形结构上存储的区块链数据时,具体可以将数据库中存储的多层节点加载到内存中,并在内存中按照各个节点之间的链接关系,在逻辑层面还原出具体的树形结构。
[0147]
在实际应用中,上述逻辑的树形结构可以包括根节点、中间节点和叶子节点。区块
链中的节点设备在获取到待存储的区块链数据的key-value键值对之后,可以将该待存储的区块链数据的key-value键值对转换成上述逻辑的树形结构上的根节点、中间节点和叶子节点。
[0148]
例如,在一个例子中,上述节点设备可以搭载一个存储接口或者存储服务,该存储接口或者存储服务具体可以用于将待存储的区块链数据的key-value键值对,转换成为逻辑的树形结构上的节点。该节点设备在获取到待存储的区块链数据的key-value键值对之后,可以通过调用该存储接口或者存储服务,将待存储的区块链数据的key-value键值对,转换成为逻辑的树形结构的根节点、中间节点和叶子节点。
[0149]
其中,上述逻辑的树状结构上的节点,仍然可以通过其自身的hash值与上一层的节点进行链接。上述根节点和中间节点,具体用于存储区块链数据的key-value键值对中的key中的至少一个字符。而上述叶子节点具体用于存储区块链数据的value(即区块链数据的具体内容)。中间节点的层数可以为一层也可以为多层,在本说明书中不进行特别限定。
[0150]
例如,在一个例子中,上述区块链数据的key,仍然可以包括字符前缀部分(sharednibble)和字符后缀部分(key-end);在这种情况下,根节点和中间节点可以用于存储上述字符前缀中的字符。而上述叶子节点则可以用于存储上述字符后缀和区块链数据的 value。
[0151]
一方面,由于上述逻辑的树形结构中的根节点和中间节点,可以存放区块链数据的 key中的字符;因此,上述逻辑的树形结构具有trie字典树的特点。另一方面,上述逻辑的树状结构上的节点,可以通过其自身的hash值与上一层的节点进行链接;因此,上述逻辑的树形结构也具有merkle树的特点。综上,本说明书描述的逻辑的树形结构,实际上是一种类似于mpt树或者fdmt树的融合了trie字典树的树形结构的merkle树变种。
[0152]
与以上实施例描述的传统的mpt树、fdmt树等传统的逻辑的树状结构不同的是,在本说明书中,可以对上述逻辑的树状结构上的节点的数据结构进行扩展。扩展之后的上述逻辑的树状结构上的节点的数据结构中,除了可以包括用于填充链接至该节点的下一层的节点的hash值的字段以外,还可以包括存储该下一层的节点的数据库的数据库标识的字段。
[0153]
通过这种方式,使得上述逻辑的树状结构上的节点中可以填充更加丰富的信息,除了可以填充链接至该节点的下一层的节点的hash值以外,还可以存储该下一层的节点的数据库的数据库标识。
[0154]
在示出的一种实施方式中,上述逻辑的树状结构,仍然可以是一颗融合了字典树的树形结构的merkle树。例如,在一些例子中,上述逻辑的树状结构可以是对节点的数据结构进行了扩展的改进之后mpt树或者fdmt树。
[0155]
请参见图8,图8为本说明书示出的一种在图1的基础之上改进之后的mpt树的树形结构的示意图。
[0156]
当上述逻辑的树状结构为mpt树时,此时上述逻辑的树状结构的根节点具体可以是上述mpt树上的扩展节点extension node。上述逻辑的树状结构的中间节点具体可以是上述mpt树上的扩展节点extension node或者分支节点branch node。
[0157]
如图8所示,在图8示出的改进后的mpt树中,扩展节点中的next node字段,将进一步扩展成两个字段,其中一个字段用于存储链接至该扩展节点的下一层的节点的 hash值,
另一个字段用于存储该下一层的节点对应的数据库的数据库标识(即图8中示出的num)。该下一层的节点对应的数据库,是指存储该下一层的节点的数据库。
[0158]
分支节点中的各个代表不同的字符的分支槽位,也可以进一步扩展成两个字段。其中一个字段用于存储链接至该扩展节点的下一层的节点的hash值,另一个字段用于存储该下一层的节点对应的数据库的数据库标识(即图8中示出的n)。
[0159]
对于mpt树的叶子节点来说,也可以扩展出一个数据库标识字段,用于存储该叶子节点链接的下一层节点的数据库的数据库标识。
[0160]
例如,如前所述,mpt树上的叶子节点具体可以采用如图6示出的bucket数据桶的结构, mpt树上的叶子节点具体可以包括若干条数据记录,在这种情况下,该叶子节点中的每一条数据记录都可以扩展出一个上述数据库标识字段。
[0161]
其中,需要说明的是,当叶子节点并没有与另一mpt树的根节点链接时,该叶子节点中的上述数据库标识字段可以为空值。当该叶子节点与另一mpt树的根节点链接时,该叶子节点中的上述数据库标识字段,可以用于存放与存储该另一mpt树的根节点的数据库对应的数据库标识。例如,图8示出的mpt树,可以是以上描述的mpt状态树,而上述另一mpt树,具体可以是以上描述的该mpt状态树的叶子节点,链接的另一mpt storage树,不再赘述。
[0162]
请参见图9,图9为本说明书示出的一种在图4的基础之上改进之后的fdmt树的树形结构的示意图。
[0163]
当上述逻辑的树状结构为fdmt树时,此时上述逻辑的树状结构的根节点和中间节点具体可以是上述fdmt树上的tree node。
[0164]
如图9所示,在图9示出的改进后的fdmt树中,每一个tree node仍然可以包括分别代表不同字符的多个block。每一个block仍然可以进一步包括多个分别代表不同字符的槽位。该槽位具体可以由一个字段进一步扩展为两个字段,其中一个字段用于存储链接至该tree node的下一层的节点的hash值,另一个字段用于存储该下一层的节点对应的数据库的数据库标识(即图9中示出的n)。该下一层的节点对应的数据库,是指存储该下一层的节点的数据库。
[0165]
对于fdmt树的叶子节点来说,也可以扩展出一个数据库标识字段,用于存储该叶子节点链接的下一层节点的数据库的数据库标识。
[0166]
例如,如前所述,fdmt树上的叶子节点具体也可以采用如图6示出的bucket数据桶的结构,fdmt树上的叶子节点具体也可以包括若干条数据记录,在这种情况下,该叶子节点中的每一条数据记录都可以扩展出一个上述数据库标识字段。
[0167]
其中,需要说明的是,当叶子节点并没有与另一fdmt树的根节点链接时,该叶子节点中的上述数据库标识字段可以为空值。当该叶子节点与另一fdmt树的根节点链接时,该叶子节点中的上述数据库标识字段,可以用于存放与存储该另一fdmt树的根节点的数据库对应的数据库标识。
[0168]
例如,在实际应用中,具体也可以将与区块链上的用户账户和合约账户对应的账户状态数据组织成fdmt状态树,而将fdmt状态树上的各个合约账户中存储的状态变量数据分别组织成fdmt storage树。在这种情况下,图9示出的fdmt树,可以是fdmt状态树,而上述另一mpt树,具体可以是该fdmt状态树的叶子节点,链接的另一fdmt storage树,不再赘述。
[0169]
在本说明书中,为了避免利用单一的数据库来存储区块链数据,区块链中的节点
设备具体可以搭载用于存储区块链数据的多个数据库。区块链中的节点设备在将上述待存储的区块链接数据的key-value键值对,以上述逻辑的树状结构上的节点的形式,在数据库中进行存储时,具体可以将上述逻辑的树状结构上的节点分别存储在多个数据库中。
[0170]
在这种情况下,区块链中的节点设备在将该待存储的区块链数据的key-value键值对转换成上述逻辑的树形结构上的根节点、中间节点和叶子节点的过程中,还需要确定出用于存储上述区块链数据的key-value键值对在上述逻辑的树形结构上对应的根节点、中间节点和叶子节点的数据库。
[0171]
其中,在确定用于存储上述根节点、中间节点和叶子节点的数据库的具体方式,通常取决于区块链中的节点设备利用多个数据库来存储区块链数据时,所采用的数据存储策略,在本说明书中不进行特别限定。
[0172]
在示出的一种实施方式中,上述数据存储策略,具体可以是以区块链数据为最小的存储单元,将区块链数据在逻辑的树状结构上对应的根节点、中间节点和叶子节点,存储至同一个数据库的数据存储策略。
[0173]
在这种情况下,区块链中的节点设备在确定用于存储该区块链数据在逻辑的树状结构上对应的根节点、中间节点和叶子节点的数据库时,可以先确定用于存储该区块链数据的数据库,再将确定出的用于存储该区块链数据的数据库,进一步确定为用于存储上述根节点、中间节点和叶子节点的数据库。
[0174]
其中,确定用于存储该区块链数据的数据库的方式,在本说明书中不进行特别限定。
[0175]
在示出的一种实现方式中,可以基于该区块链数据对应的区块的区块号,来确定用于存储该区块链数据的数据库。
[0176]
例如,可以为上述多个数据库分别设置一个对应的区块号区间,每一个数据库只用于存储隶属于其对应的区块号区间中的各个区块的区块链数据。在这种情况下,区块链中的节点设备可以分别维护一个映射表;其中,该映射表具体可以包括数据库标识和为该数据库标识对应的数据库配置的区块号区间之间的映射关系。
[0177]
而区块链中的节点设备在基于该区块链数据对应的区块的区块号,来确定用于存储该区块链数据的数据库时,可以查询该映射表,确定该区块链数据对应的区块的区块号所在的区块号区间,然后将与该区块号区间存在映射关系的数据库标识对应的数据库,确定为用于存储该区块链数据的数据库。
[0178]
通过这种方式,可有将隶属于不同的区块号区间的区块对应的区块链数据,分别映射到不同的数据库进行存储。
[0179]
需要说明的是,在一个例子中,区块链中的各节点设备本地维护的映射表,具体可以是各节点设备利用区块链的共识机制共识通过后存储在区块链上的映射表。通过这种方式,可以保证区块链中的各节点设备维护的映射表的一致性,可以避免由于各个节点设备维护的映射表存在差异,而造成的区块链分叉的问题。
[0180]
当然,需要强调的是,除了以上描述的可以基于区块链数据的区块号,来确定用于存储区块链数据的数据库以外,也可以通过其它的方式来确定用于存储区块链数据的数据库;例如,也可以基于区块链数据的类型、区块链数据的大小、或者其它因素来确定用于存储区块链数据的数据库,在本说明书中不再进行一一列举。
[0181]
在示出的一种实施方式中,上述数据存储策略,具体可以也可以是以上述逻辑的树状结构上的节点为最小的存储单元,将区块链数据在逻辑的树状结构上对应的根节点、中间节点和叶子节点,分别存储至不同的数据库的数据存储策略。
[0182]
在这种情况下,区块链中的节点设备在确定用于存储该区块链数据在逻辑的树状结构上对应的根节点、中间节点和叶子节点的数据库时,具体可以针对不同类型的节点,来分别确定数据库。例如,可以为上述多个数据库分别设置一个对应的节点类型,每一个数据库只用于存储与该节点类型对应的节点。在这种情况下,可以将该区块链数据在逻辑的树状结构上对应的根节点、中间节点和叶子节点,分别存储在不同的数据库中。比如,可以设置3 个数据库,分别用于存储根节点、中间节点和叶子节点。
[0183]
在本说明书中,当区块链中的节点设备在确定出用于存储上述区块链数据的 key-value键值对在上述逻辑的树形结构上对应的根节点、中间节点和叶子节点的数据库之后,通常还需要将确定出用于存储各节点的数据库的数据库标识,进一步填充至该节点链接的上一层的节点中。
[0184]
其中,对于上述逻辑的树形结构上的叶子节点,其链接的上一层的节点通常为中间节点,因此对于叶子节点来说,用于存储该叶子节点的数据库对应的数据库标识,需要进一步填充至该叶子节点链接的上一层的中间节点。对于上述逻辑的树形结构上的中间节点,其链接的上一层的节点通常也为的中间节点或者根节点,因此对于中间节点来说,用于存储该中间节点的数据库对应的数据库标识,需要进一步填充至该中间节点链接的上一层的中间节点或者上一层的根节点中。
[0185]
而对于上述逻辑的树形结构上的根节点,其链接的上一层的节点通常存在以下的两种情形:
[0186]
在一种情形下,如果上述逻辑的树状结构为另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,此时该逻辑的树状结构上的根节点的上一层节点,为该另一颗逻辑的树状结构的叶子节点,因此在这种情形下,可以将用于存储该逻辑的树状结构的根节点的数据库的数据库标识,填充至该另一颗逻辑的树状结构的叶子节点中。
[0187]
例如,请参见图8,以上述逻辑的树状结构为mpt树为例,在这种情形下,上述逻辑的树状结构可以是mpt状态树,则上述另一颗逻辑的树状结构则可以是mpt storage 树。对于mpt状态树上的根节点而言,用于存储该根节点的数据库的数据库标识,需要进一步填充到mpt storage树上与之链接的叶子节点的数据库标识字段中。
[0188]
在另一种情形下,如果上述逻辑的树状结构并不是另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,此时该逻辑的树状结构上的根节点的上一层节点,通常是与该逻辑的树状结构对应的区块的区块头,因此在这种情形下,可以将用于存储该逻辑的树状结构的根节点的数据库的数据库标识,填充至与该逻辑的树状结构对应的区块的区块头中。
[0189]
需要说明的是,在一些情况下,如果上述逻辑的树状结构并不是另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,此时也可以不将用于存储该逻辑的树状结构的根节点的数据库的数据库标识,填充至与该逻辑的树状结构对应的区块的区块头中。
[0190]
例如,如前所述,如果采用的是基于区块链数据的区块号,来确定用于存储区块链数据的数据库的方式,用于存储该逻辑的树状结构中的根节点的数据库,通常可以基于与该逻辑的树状结构对应的区块的区块号来确定,而在与该逻辑的树状结构对应的区块的区
块头中,通常包含该区块的区块号。因此在这种情况下,可以不将用于存储该逻辑的树状结构的根节点的数据库的数据库标识,填充至与该逻辑的树状结构对应的区块的区块头中,后续可以通过读取该区块头中的区块号,并基于该区块号来确定出用于存储该逻辑的树状结构的根节点的数据库。
[0191]
在本说明书中,区块链中的节点设备将待存储的区块链数据的key-value键值对转换成上述逻辑的树形结构上的根节点、中间节点和叶子节点的过程,通常是指从根节点开始,在现有的逻辑的树状结构中遍历查找与该区块链数据对应的节点,然后在查找到的节点的基础上,在该逻辑的树状结构中新增并且插入新的节点,以将该区块链数据的key-value键值对完整的写入该逻辑的树状结构的过程。
[0192]
例如,在实现时,可以从根节点开始,将逻辑的树状结构中的各节点存放的字符,分别与该区块链数据的key中的字符进行匹配。如果某一节点存放的字符,与该区块链数据的key 中的字符匹配上,则表明该节点为与该区块链数据对应的节点。当查找完成后,查找到的这些与该区块链数据对应的节点,通常可能仅存放了该区块链数据的key中的部分字符,此时可以在查找到的这些节点的基础上,新增并且插入用于存储该该区块链数据的key中的除了该部分字符以外的剩余字符的节点,以将该区块链数据的key-value键值对完整的写入上述逻辑的树状结构。
[0193]
步骤706,将所述根节点、中间节点和叶子节点存储在确定出的所述数据库中;其中,所述逻辑的树状结构上的节点至少分别存储在多个数据库中。
[0194]
在将待存储的区块链数据转换成为上述逻辑的树状结构中的根节点、中间节点和叶子节点之后,可以将上述根节点、中间节点和叶子节点分别存储至对应的数据库,以完成针对该区块链数据的存储过程。
[0195]
例如,如果采用如上所述的以区块链数据为最小的存储单元的存储策略,此时不同的区块链数据在上述逻辑的树状结构中对应的根节点、中间节点和叶子节点,会分别存储在不同的数据库中。与同一区块链数据对应的根节点、中间节点和叶子节点,会存储在同一个数据库中。
[0196]
如果采用如上所述的以上述逻辑的树状结构上的节点为最小的存储单元的存储策略,此时即便与同一区块链数据对应的根节点、中间节点和叶子节点,也会存储在不同的数据库中;比如,可以按照节点类型,将根节点、中间节点和叶子节点分别存储在三个不同的数据库中。
[0197]
在以上技术方案中,通过将基于区块链数据组的key-value键值对织成的逻辑的树状结构上的节点,分别存储在多个数据库中,可以避免将区块链数据存储在单一的数据库中所面临的性能问题,提高用于存储区块链数据的数据库的可扩展性。
[0198]
在本说明书中,除了可以将区块链数据的key-value键值对,组织成逻辑的树状结构,在数据库中进行存储以外,在实际应用中,当该逻辑的树状结构上存储的某一目标区块链数据发生更新,还可以针对该逻辑的树状结构上与该目标区块链数据对应的根节点、中间节点和叶子节点进行更新。
[0199]
以下通过具体的实施例,详细描述对上述逻辑的树状结构上的节点进行更新的具体过程。
[0200]
请参见图10,图10是在图7示出的实施例的基础上提供的一种区块链数据更新方
法的流程图。所述方法应用于区块链中的节点设备;所述方法包括以下步骤:
[0201]
步骤1002,确定所述逻辑的树状结构上用于存放待更新的目标区块链数据的 key-value键值对的根节点、中间节点和叶子节点,并确定用于存储更新后的所述根节点、中间节点和叶子节点的数据库;
[0202]
上述逻辑的树状结构具体也可以是一颗融合了字典树的树形结构的merkle树。例如,上述逻辑的树状结构具体可以是如8所示的改进后的mpt树,也可以是如图9所示的改进后的fdmt树,在本实施例中不进行特别限定。
[0203]
区块链中的节点设备,可以在上述逻辑的树状结构中存储的目标区块链数据发生更新时,对数据库中存储的上述逻辑的树状结构上与该目标区块链数据对应的根节点、中间节点和叶子节点进行同步更新。
[0204]
例如,在一个例子中,以上述目标区块链数据为与区块链上的区块链账户对应的账户状态数据为例,用户可以通过在区块链上发布一笔区块链交易对区块链上的某一区块链账户对应的账户状态进行更新。而区块链中的节点设备在收到该笔交易后,可以在区块链上执行该笔区块链交易,对数据库中存储的上述逻辑的树状结构上与该区块链账户的账户状态数据对应的根节点、中间节点和叶子节点进行同步更新。
[0205]
区块链中的节点设备在对上述逻辑的树状结构上用于存放上述目标区块链数据的 key-value键值对的根节点、中间节点和叶子节点进行更新的过程中:
[0206]
一方面,可以先确定上述逻辑的树状结构上用于存放上述目标区块链数据的 key-value键值对的根节点、中间节点和叶子节点。
[0207]
其中,需要说明的是,区块链中的节点设备在对上述逻辑的树状结构上用于存放上述目标区块链数据的key-value键值对的根节点、中间节点和叶子节点进行更新时,具体可以采用先从数据库中将上述逻辑的树状结构中的节点加载到内存中,然后在内存中对与上述目标区块链数据的key-value键值对对应的节点进行更新,再将更新后的节点写入到数据库中的方式。
[0208]
在示出的一种实施方式中,区块链中的节点设备在对上述逻辑的树状结构上用于存放上述目标区块链数据的key-value键值对的根节点、中间节点和叶子节点进行更新时,具体可以采用先从数据库中将上述逻辑的树状结构中的节点加载到内存中,然后在内存中对与上述目标区块链数据的key-value键值对对应的节点进行更新,再将更新后的节点写入到数据库中的方式。
[0209]
在这种情况下,区块链中的节点设备在确定上述逻辑的树状结构上用于存放上述目标区块链数据的key-value键值对的根节点、中间节点和叶子节点时,则可以先从数据库中读取上述逻辑的树状结构上的节点,并将读取到的节点加载到内存中;然后,再从加载到内存的上述逻辑的树状结构上的节点中,来进一步确定用于存放上述目标区块链数据的根节点、中间节点和叶子节点。其中,从数据库中读取上述逻辑的树状结构中的节点的详细过程,在本实施例中不再赘述,请参见下面的实施例。
[0210]
当然,在实际应用中,区块链中的节点设备在对上述逻辑的树状结构上用于存放上述目标区块链数据的key-value键值对的根节点、中间节点和叶子节点进行更新时,具体也可以采用直接对数据库中存储的相关的节点进行更新的方式,在本说明书中不进行特别限定。
[0211]
另一方面,区块链中的节点设备除了可以确定上述逻辑的树状结构上用于存放上述目标区块链数据的key-value键值对的根节点、中间节点和叶子节点以外,还可以确定用于存储更新后的根节点、中间节点和叶子节点的数据库。
[0212]
其中,确定用于存储更新后的上述根节点、中间节点和叶子节点的数据库的具体方式,也通常取决于区块链中的节点设备利用搭载的多个数据库来存储区块链数据时,所采用的数据存储策略,在本实施例中不再赘述。
[0213]
例如,如前所述,在示出的一种实施方式中,如果上述数据存储策略,具体是以区块链数据为最小的存储单元,将区块链数据在逻辑的树状结构上对应的根节点、中间节点和叶子节点,存储至同一个数据库的策略,则区块链中的节点设备在确定用于存储更新后的上述根节点、中间节点和叶子节点的数据库时,可以先确定用于存储该目标区块链数据的数据库,再将确定出的用于存储该目标区块链数据的数据库,进一步确定为用于存储更新后的上述根节点、中间节点和叶子节点的数据库。
[0214]
其中,在示出的一种实现方式中,在确定用于存储该目标区块链数据的数据库时,仍然可以基于该目标区块链数据对应的区块的区块号,来确定用于存储该目标区块链数据的数据库。
[0215]
例如,可以为上述多个数据库分别设置一个对应的区块号区间,每一个数据库只用于存储隶属于其对应的区块号区间中的各个区块的区块链数据。在这种情况下,区块链中的节点设备可以分别维护一个映射表;其中,该映射表具体可以包括数据库标识和为该数据库标识对应的数据库配置的区块号区间之间的映射关系。
[0216]
区块链中的节点设备在基于该目标区块链数据对应的区块的区块号,来确定用于存储该目标区块链数据的数据库时,可以查询该映射表,确定该目标区块链数据对应的区块的区块号所在的区块号区间,然后将与该区块号区间存在映射关系的数据库标识对应的数据库,确定为用于存储该目标区块链数据的数据库。其中,还需要说明的是,在一个例子中,区块链中的各节点设备本地维护的映射表,具体可以是各节点设备利用区块链的共识机制共识通过后存储在区块链上的映射表。
[0217]
除了可以基于区块链数据的区块号,来确定用于存储区块链数据的数据库以外,也可以通过其它的方式来确定用于存储区块链数据的数据库;例如,也可以基于区块链数据的类型、区块链数据的大小、或者其它因素来确定用于存储区块链数据的数据库,不再进行一一列举。
[0218]
步骤1004,基于所述目标区块链数据的key-value键值对的value更新确定出的所述叶子节点,在所述叶子节点更新完成后,将更新后的所述叶子节点的hash值和确定出的用于存储更新后的所述叶子节点的数据库的数据库标识进一步写入该叶子节点链接的上一层的中间节点,以对所述中间节点进行更新;
[0219]
步骤1006,在所述中间节点更新完成后,将更新后的所述中间节点的hash值和确定出的用于存储更新后的所述中间节点的数据库的数据库标识进一步写入该中间节点链接的上一层的节点,以对该中间节点链接的上一层的节点继续进行更新,以此类推,直到所述逻辑的树状结构上的根节点更新完成。
[0220]
在确定出上述逻辑的树状结构上用于存放上述目标区块链数据的key-value键值对的根节点、中间节点和叶子节点之后,区块链中的节点设备可以从叶子节点开始,按照各
个节点之间的链接关系,对上述逻辑的树状结构上用于存放上述目标区块链数据的 key-value键值对的叶子节点、中间节点和根节点依次进行更新。
[0221]
其中,由于上述逻辑的树状结构上的节点的存储内容,除了包括链接至该节点的下一层的节点的hash值,还包括存储该下一层的节点的数据库的数据库标识。因此,对确定出的根节点、中间节点和叶子节点进行更新的过程,即为向根节点、中间节点和叶子节点中填充其链接的下一层的节点的hash至和用于存储更新后的该下一层的节点的数据库的数据库标识的过程。
[0222]
在示出的一种实现方式中,以区块链的节点设备采用先从数据库中将上述逻辑的树状结构中的节点加载到内存中,然后在内存中对与上述目标区块链数据的key-value键值对对应的节点进行更新,再将更新后的节点写入到数据库中的数据更新方式为例,在这种情况下,区块链中的节点设备从加载到内存的上述逻辑的树状结构上的节点中,确定出用于存放上述目标区块链数据的根节点、中间节点和叶子节点之后,首先可以基于该目标区块链数据的key-value键值对的value对确定出的叶子节点进行更新,在该叶子节点更新完成后,再将该叶子节点的hash值和之前确定出的用于存储更新后的叶子节点的数据库的数据库标识进一步写入该叶子节点链接的上一层的中间节点,以对该中间节点进行更新。
[0223]
当该中间节点更新完成后,可以继续将更新后的该中间节点的hash值和之前确定出的用于存储更新后的中间节点的数据库的数据库标识,进一步写入该中间节点链接的上一层的节点,以对该中间节点链接的上一层的节点继续进行更新,以此类推,直到将上述逻辑的树状结构上的根节点更新完成。
[0224]
在本实施例中,当上述逻辑的树状结构上的根节点被更新完成后:
[0225]
一方面,区块链中的节点设备可以响应于将更新后的上述根节点、中间节点和叶子节点在数据库中进行存储的指令,将更新后的上述根节点、中间节点和叶子节点分别存储至为上述根节点、中间节点和叶子节点确定出的数据库中。例如,在一个例子中,上述指令具体可以是将内存中存储的更新后的上述根节点、中间节点和叶子节点写入数据库的commit指令。
[0226]
另一方面,区块链中的节点设备还可以将上述逻辑的树状结构上的更新后的根节点的hash值,填充至其链接的上一层节点。
[0227]
例如,如果上述逻辑的树状结构为另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,此时上述逻辑的树状结构上的更新后的根节点链接的上一层节点,为上述另一颗逻辑的树状结构的叶子节点。在这种情况下,可以将更新后的上述辑的树状结构上的根节点的hash值,填充至与该逻辑的树状结构的根节点链接的另一个逻辑的树状结构的叶子节点中。
[0228]
而如果上述逻辑的树状结构并不是另一颗逻辑的树状结构的叶子节点延伸出的子树,此时上述逻辑的树状结构上的更新后的根节点链接的上一层节点,为与该逻辑的树状结构对应的区块的区块头。在这种情况下,可以将更新后的上述辑的树状结构上的根节点的hash值,填充至与该逻辑的树状结构对应的区块的区块头中。比如,假设该逻辑的树状结构为与第100区块对应的mpt状态树,则该mpt状态树的根节点的hash值,可以填充到该第100区块的区块头中。
[0229]
在以上实施例中,由于在对上述逻辑的树状结构上的节点进行更新时,除了需要
将该节点的hash值填充至该节点链接的上一层节点以外,还可以将用于存储该节点的数据库的数据库标识也填充至该节点链接的上一层节点。因此,通过这种方式,即时将上述逻辑的树状结构上的节点分别存储在不同的数据库中,也仍然能够根据节点中存储的下一层的节点的hash值和对应的数据库标识,将分布在不同的数据库中的节点链接起来,使得分布在不同的数据库中的节点在逻辑上仍然是一个整体,从而仍然可以保证上述逻辑的树状结构的完整性。
[0230]
在本说明书中,如前所述,当上述逻辑的树状结构上存储的某一目标区块链数据发生更新,在针对该逻辑的树状结构上与该目标区块链数据对应的根节点、中间节点和叶子节点进行更新时,通常可以从数据库中将上述逻辑的树状结构上的节点加载到内存中,然后在内存中对与上述目标区块链数据的key-value键值对对应的节点进行更新,再将更新后的节点写入到数据库。
[0231]
以下通过具体的实施例,详细描述从数据库中读取上述逻辑的树状结构上的节点并加载到区块链中的节点设备搭载的内存中的详细过程。
[0232]
请参见图11,图11是在图7和图10示出的实施例的基础上提供的一种区块链数据读取方法的流程图。所述方法应用于区块链中的节点设备;所述方法包括以下步骤:
[0233]
步骤1102,读取所述逻辑的树状结构的根节点的hash值,并确定用于存储所述逻辑的树状结构的根节点的数据库;将所述根节点的hash值作为查询索引,从所述数据库中查询所述根节点,并将查询到的所述根节点加载在内存中;
[0234]
上述逻辑的树状结构仍然可以是一颗融合了字典树的树形结构的merkle树。例如,上述逻辑的树状结构具体可以是如8所示的改进后的mpt树,也可以是如图9所示的改进后的fdmt树,在本实施例中不进行特别限定。
[0235]
区块链中的节点设备,在从数据库中读取上述逻辑的树状结构中的节点时,具体可以从上述逻辑的树状结构的根节点开始,再按照各个节点之间的链接关系,依次读取上述逻辑的树状结构中的根节点、中间节点和叶子节点。
[0236]
区块链中的节点设备在读取上述逻辑的树状结构中的根节点时,可以先读取该根节点的hash值。
[0237]
在示出的一种实施方式中,如果上述逻辑的树状结构为另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,如前所述,此时该逻辑的树状结构的根节点的hash值通常填充在该根节点链接的另一个逻辑的树状结构的叶子节点中。在这种情况下,区块链中的节点设备可以从该逻辑的树状结构的根节点链接的另一个逻辑的树状结构的叶子节点中来读取该根节点的hash值。
[0238]
在示出的一种实施方式中,如果上述逻辑的树状结构并不是另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,如前所述,此时该逻辑的树状结构的根节点的hash值通常填充在与该逻辑的树状结构对应的区块的区块头中。在这种情况下,区块链中的节点设备可以从该逻辑的树状结构对应的区块的区块头中来读取该根节点的hash值。
[0239]
区块链中的节点设备在读取到上述逻辑的树状结构的根节点的hash值后,可以进一步确定用于存储该根节点的数据库。
[0240]
在示出的一种实施方式中,如果上述逻辑的树状结构为另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,如前所述,此时用于存储逻辑的树状结构的根节点的数据库
的数据库标识通常填充在该根节点链接的另一个逻辑的树状结构的叶子节点中。在这种情况下,区块链中的节点设备可以从该逻辑的树状结构的根节点链接的另一个逻辑的树状结构的叶子节点中读取用于存储该逻辑的树状结构的根节点的数据库的数据库标识,并基于读取到的数据库标识确定用于存储该逻辑的树状结构的根节点的数据库。
[0241]
在示出的一种实施方式中,如果上述逻辑的树状结构并不是另一颗逻辑的树状结构的叶子节点延伸出的一颗子树,此时在确定用于存储该逻辑的树状结构的根节点的数据库时,通常可以包含以下两种情形:
[0242]
在一种情形下,如果用于存储该逻辑的树状结构的根节点的数据库的数据库标识,被预先填充至与该逻辑的树状结构对应的区块的区块头中,则可以从该区块的区块头中读取用于存储该逻辑的树状结构的根节点的数据库的数据库标识,并基于读取到的数据库标识来确定用于存储该逻辑的树状结构的根节点的数据库。
[0243]
在另一种情形下,如果采用的是基于区块链数据的区块号,来确定用于存储区块链数据的数据库的方式,此时用于存储该逻辑的树状结构的根节点的数据库的数据库标识,并没有被预先填充至与该逻辑的树状结构对应的区块的区块头中,则可以从该区块的区块头中读取区块号,并基于读取到的区块号来确定用于存储该逻辑的树状结构的根节点的数据库。
[0244]
例如,可以为上述多个数据库分别设置一个对应的区块号区间,每一个数据库只用于存储隶属于其对应的区块号区间中的各个区块的区块链数据。在这种情况下,区块链中的节点设备可以分别维护一个映射表;其中,该映射表具体可以包括数据库标识和为该数据库标识对应的数据库配置的区块号区间之间的映射关系。
[0245]
区块链中的节点设备在基于区块号,来确定用于存储该逻辑的树状结构中的根节点的数据库时,可以查询该映射表,确定该区块号所在的区块号区间,然后将与该区块号区间存在映射关系的数据库标识对应的数据库,确定为用于存储该逻辑的树状结构中的根节点的数据库。其中,需要补充说明的是,在一个例子中,区块链中的各节点设备本地维护的映射表,具体也可以是各节点设备利用区块链的共识机制共识通过后存储在区块链上的映射表。
[0246]
区块链中的节点设备在读取到上述逻辑的树状结构的根节点的hash值,并进一步确定出用于存储该根节点的数据库之后,可以将该根节点的hash至作为查询索引,从该数据库中查询该根节点,然后将查询到的根节点加载到内存中。
[0247]
步骤1104,读取所述根节点中存储的链接至该根节点的下一层的中间节点的hash 值以及存储该中间节点的数据库的数据库标识,并将所述中间节点的hash值作为查询索引,从与所述数据库标识对应的数据库中查询所述中间节点,并将查询到的所述中间节点加载在内存中;
[0248]
步骤1106,读取所述中间节点中存储的链接至该中间节点的下一层的节点的hash 值以及存储该下一层节点的数据库的数据库标识,并将所述下一层的节点的hash值作为查询索引,从与所述数据库标识对应的数据库中查询所述下一层节点,并将查询到的所述下一层节点加载在内存中,以此类推,直到将所述逻辑的树状结构中的叶子节点均加载到内存中。
[0249]
区块链中的节点设备在将上述逻辑的树状结构的根节点加载到内存中之后,该节
点设备可以继续读取该根节点中存储的,链接至该根节点的下一层的中间节点的hash值,以及存储该中间节点的数据库的数据库标识,然后可以将该中间节点的hash值作为查询索引,从与该数据库标识对应的数据库中查询该中间节点,并将查询到的该中间节点加载在内存中。
[0250]
区块链中的节点设备在将链接至上述根节点的中间节点加载到内存中之后,该节点设备可以继续读取该中间节点中存储的,链接至该中间的下一层的节点的hash值,以及存储该下一层的节点的数据库的数据库标识,然后可以将该下一层的节点的hash值作为查询索引,从与该数据库标识对应的数据库中查询该下一层的节点,并将查询到的该下一层的节点加载在内存中。而针对加载到内存中的该下一层的节点,可以继续执行如之前相同的动作,继续将链接至该下一层的节点更下层的节点加载到内存中,以此类推,直到将上述逻辑的树状结构的叶子节点均加载到内存中时停止。
[0251]
当将上述逻辑的树状结构中的节点均加载到内存之后,区块链中的节点设备可以在内存中对上述逻辑的树状结构中的节点进行操作。其中,在内存中对上述逻辑的树状结构中的节点进行的操作的操作类型,在本实施例中不进行特别限定。例如,在一个例子中,可以在内存中对上述逻辑的树状结构中的节点进行修改更新,再将修改更新后的节点重新写入到数据库。
[0252]
在以上实施例中,由于上述逻辑的树状结构上的节点的数据结构中,除了可以包括链接至该节点的下一层的节点的hash值以外,还可以包括存储该下一层的节点的数据库的数据库标识;因此,通过这种方式,即时将上述逻辑的树状结构上的节点分别存储在不同的数据库中,也仍然能够根据节点中存储的下一层的节点的hash值和对应的数据库标识,将分布在不同的数据库中的节点链接起来,并统一加载到内存中链接起来,使得分布在不同的数据库中的节点在逻辑上仍然是一个整体,从而仍然可以保证上述逻辑的树状结构的完整性。
[0253]
与上述方法实施例相对应,本技术还提供了装置的实施例。
[0254]
本说明书的装置的实施例可以应用在电子设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在电子设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。
[0255]
从硬件层面而言,如图12所示,为本说明书的装置所在电子设备的一种硬件结构图,除了图12所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的电子设备通常根据该电子设备的实际功能,还可以包括其他硬件,对此不再赘述。
[0256]
图13是本说明书一示例性实施例示出的一种区块链数据存储装置的框图。
[0257]
请参考图13,所述区块链数据存储装置1300可以应用在前述图12所示的电子设备中,所述装置130包括:
[0258]
获取模块1301,获取待存储的区块链数据的key-value键值对;
[0259]
转换模块1302,将所述区块链数据的key-value键值对转换成逻辑的树形结构上的根节点、中间节点和叶子节点;其中,所述逻辑的树状结构上的节点通过其hash值链接至其上一层的节点;所述逻辑的树状结构上的节点的存储内容包括链接至该节点的下一层的节点的hash值和存储该下一层的节点的数据库的数据库标识;所述根节点、中间节点用于
值作为查询索引,从与所述数据库标识对应的数据库中查询所述下一层节点,并将查询到的所述下一层节点加载在内存中,以此类推,直到将所述逻辑的树状结构中的叶子节点均加载到内存中。
[0270]
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
[0271]
在一个典型的配置中,计算机包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0272]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0273]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0274]
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0275]
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0276]
在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
[0277]
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区
分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
[0278]
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献