Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

二叉状态树的结构

有个胖子他姓杨
134 0 0
    在设计十六进制trie时,一些设计选择在当时听起来很棒,但是经过5年的实践,被证明带来了很多复杂性。鉴于ETH1.x想要转向二进制trie,我们正好可以借此机会研究一下状态的存储方式。; m# V+ l( _8 S* s: T/ ]# F' Y% l4 ~/ j
) \. o3 T  ]# |
    问题的根源
. ^7 n8 f. g& ]( Q
- u0 Z0 |# E5 G/ m
    在重新设计存储格式时,我们至少可以从5个方面进行改进。" G& N$ U, T) [" \; I

2 I2 Z+ Y' H  K9 H4 a- ?2 C    将账户trie和存储trie合并:维护多个结构会增加复杂性,典型的例子就是节点必须先遍历账户2 z) f! ]5 V8 y/ L
1 h# ^. ^9 p5 k
    trie,得到存储trie的根,然后再到存储trie上获取数据。4 I  J; w$ Y5 N+ [7 R; S7 d

$ z: h6 l) H# X, v1 U, y    扩展节点(extensionnodes):这是一种特殊的节点,负责给特定子树上的所有key加上前缀。这些节点的作用是能够限制需要被哈希的节点数量,但是也引入了复杂性,因为它们所涉及的key必须以特定方式打包。
, b- C% E( x4 @) [* [5 Z) y5 _3 |; c4 j6 g
    RLP编码格式旨在高效地对任意结构进行编码。由于其复杂性,它也带来了很多麻烦:必须费尽千辛万苦打包key块(packkeychunk)。另外,由于每个节点的结构相当固定,可以使用更简单的序列化方法来代替RLP。
* ^! M/ p4 W' H) a& e" {8 c5 R8 h) w9 j9 Z$ a# u
    与前两个问题相关的是,十六进制的前缀也会带来复杂性和混乱。* _5 J# P& [7 R  h" }
. Y& W- I3 x# |1 i/ I5 o# W4 @; @
    十六进制trie的证明【即,“见证数据(witness)”】比二进制trie的证明大4倍左右。(欲知详情,请阅读这篇文章。(中文译本))1 i5 K( M+ W) L  o' Z# o0 f4 d0 `" k! F- y
* _+ Q7 G% w& C/ r
    RLP
  o9 j1 ~- R+ `9 Q, {' E  b7 k8 L7 S, Z( {- H
    ——Ramble,LoseyourselfandPester?
6 l/ O( G; B; B# Q9 ?; \0 {1 b0 J+ j5 A( a
    (译者注:“RLP”是“RecursiveLengthPrefix(递归长度前缀)”的缩写,但作者这里使用了几个R、L、P开头的词“漫无目的、迷失自我、喋喋不休”,就是批评之意。)本文我们会讨论怎么解决RLP问题。如果RLP被取代,绝大多数核心开发者都不会感到伤心。这是因为RLP过于复杂。实际上,我听过的唯一一个支持保留RLP的理由是:“RLP实在太过复杂,不要再冒险选择新的格式了,以免重蹈覆辙。”RLP
' h: F7 y5 D$ w/ J* p
  g1 o# A2 H1 w. |# G4 H) Z    的基本原理是采用简单的size+data格式。这就是复杂性的由来。首先,size可以是任何整数(实际上,它不可能超过2字节,但是从原则上来说是可以的,因此你必须确保能够支持超过2! J2 D/ q& r* _9 m$ V

* F: ?- s* }) n; E& v8 @, r1 a    字节的size)。我们如何知道size部分在哪里结束,data部分在哪里开始?
2 U% L; ]/ E0 @4 T
0 R* o3 m& q6 M- g; x: S    在大多数情况下,开头会加上一个header。这个) A( p, m7 [5 w% V% q$ B$ P
3 Z% q: A- H' `) x0 m7 R" u9 D& T
    header是一个值h,然后再加上size值:因此,RLP编码是[length(data)+h][data]. M" c/ g; @" a# F1 w
& m! y4 R  I& G7 K- _
    如果length(data)+h
6 i. c  ?* [$ w* @4 A  G% j' s" F5 N" T* I: A0 y; J- _) i1 q
    如果数据大小为一个字节,你发现自己必须在这个字节前再增加一个字节。有没有可能不这样做?部分情况下可以,但是会另外增加复杂程度!如果data[0]. {, c* x+ ?5 J. {! t  F) C! I
9 V1 o& j9 t6 h' w4 ?4 H+ j4 b
    还能再酸爽一点吗?当然可以了!RLP涉及两类“对象”:结构列表和字节数组。
9 T- C! d6 c2 S6 R% s3 E) n. l  e) i  n
    字节数组:header=128,overflow_header=183
  w* Z+ ]+ W/ ]: Z9 @8 W0 S5 f% u
$ k. G% _# c( s" M) w# a    结构列表:header=192,overflow_header=247
0 T* h3 C7 N% s0 l- W: k9 |: z% z# S5 T5 h; n
    请注意,datasize部分的最大规模是8bytes,也就是一个+ I; \; B8 @& H

8 z+ Q6 {8 Y& U& D2 A    64bits(原文为“64-bytes”,应有误)的数字。确实,无论什么数据,18014398509481984KB应该都够用了。虽然还有很多棘手的细节有待深入,但要点看起来很清楚了:RLP难以驯服。我们再来看看它是如何与状态树交织在一起的。- q; _/ _  q) r$ g8 p

. n5 \$ x$ K( m4 X8 g* a* s! g3 i
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

有个胖子他姓杨 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10