Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

二叉状态树的结构

有个胖子他姓杨
190 0 0
    在设计十六进制trie时,一些设计选择在当时听起来很棒,但是经过5年的实践,被证明带来了很多复杂性。鉴于ETH1.x想要转向二进制trie,我们正好可以借此机会研究一下状态的存储方式。$ L  E  k) X# Z) \0 Z3 W9 q( P

/ H$ x# w8 @  l9 ~    问题的根源
+ O( g, M% {  Y5 U

8 [4 M6 A* j) ~; _+ |7 t    在重新设计存储格式时,我们至少可以从5个方面进行改进。
4 Q; h: q  ]0 r! P' o) A& B( n: K2 _, `% f+ L$ l
    将账户trie和存储trie合并:维护多个结构会增加复杂性,典型的例子就是节点必须先遍历账户/ |# N* q; ]( T2 O" ^8 |" k: |
+ s! ]& L7 Q9 Q3 I# p; K
    trie,得到存储trie的根,然后再到存储trie上获取数据。
2 ~+ g+ _) T' x: J) D, S" r* b: g1 ?- W
    扩展节点(extensionnodes):这是一种特殊的节点,负责给特定子树上的所有key加上前缀。这些节点的作用是能够限制需要被哈希的节点数量,但是也引入了复杂性,因为它们所涉及的key必须以特定方式打包。  V1 n; H1 B! t* ?  y) T- v9 q; m

5 ^! w* d1 L( U4 V9 b    RLP编码格式旨在高效地对任意结构进行编码。由于其复杂性,它也带来了很多麻烦:必须费尽千辛万苦打包key块(packkeychunk)。另外,由于每个节点的结构相当固定,可以使用更简单的序列化方法来代替RLP。
: \; _( z' k2 }- ]1 M+ C# r
7 s7 ~* w9 B# \6 w' h* a0 i    与前两个问题相关的是,十六进制的前缀也会带来复杂性和混乱。  B' V* Q( y: c

# s# k( \' L) R, [3 |. N    十六进制trie的证明【即,“见证数据(witness)”】比二进制trie的证明大4倍左右。(欲知详情,请阅读这篇文章。(中文译本))
5 k8 ~, V! F, h3 r3 y/ X; W4 t: {; v2 j, F4 M" G& |
    RLP7 m8 j0 H  x0 @6 }

+ y8 A& O) D5 n    ——Ramble,LoseyourselfandPester?4 A" ~9 M" N1 y& U/ H
8 n& o9 N  J0 ~0 E( t
    (译者注:“RLP”是“RecursiveLengthPrefix(递归长度前缀)”的缩写,但作者这里使用了几个R、L、P开头的词“漫无目的、迷失自我、喋喋不休”,就是批评之意。)本文我们会讨论怎么解决RLP问题。如果RLP被取代,绝大多数核心开发者都不会感到伤心。这是因为RLP过于复杂。实际上,我听过的唯一一个支持保留RLP的理由是:“RLP实在太过复杂,不要再冒险选择新的格式了,以免重蹈覆辙。”RLP: I# ~1 Z( K# j0 ]8 o  \8 E

) I. G' z- j( c    的基本原理是采用简单的size+data格式。这就是复杂性的由来。首先,size可以是任何整数(实际上,它不可能超过2字节,但是从原则上来说是可以的,因此你必须确保能够支持超过2
. a8 J2 L6 H! x# O. K& G: Y/ j6 ~
; h3 \3 p7 {/ X5 O. w: \    字节的size)。我们如何知道size部分在哪里结束,data部分在哪里开始?
# _1 |. @! m. A, |1 I2 x
  j) t* k; ?0 _& A( V! E2 V    在大多数情况下,开头会加上一个header。这个. j- q* o! y/ T7 O4 ]

" w! C; m, U' q2 N    header是一个值h,然后再加上size值:因此,RLP编码是[length(data)+h][data]8 `. {3 B+ s' P

3 P8 T: `- E* X3 s! z' ~3 \3 f    如果length(data)+h
. k. j  O! a1 ?9 ^6 j0 z' f/ L2 u2 W! e6 [
    如果数据大小为一个字节,你发现自己必须在这个字节前再增加一个字节。有没有可能不这样做?部分情况下可以,但是会另外增加复杂程度!如果data[0]
6 J: y4 Y# }9 f% x- x& O' {7 p( ^2 o8 g
    还能再酸爽一点吗?当然可以了!RLP涉及两类“对象”:结构列表和字节数组。
/ g4 D3 b+ P8 m$ s  W5 n4 Z  ?" x: r, X$ O) Y0 G! y
    字节数组:header=128,overflow_header=1832 f/ N6 E% ?8 P2 A# d

; ?7 p7 G! x, {) [2 T! u. R+ ^5 m    结构列表:header=192,overflow_header=247
! S  y9 O* t, F  [! p, K5 D8 `: S8 t( D  a& _' \
    请注意,datasize部分的最大规模是8bytes,也就是一个, v2 y# l6 U/ d2 b: s5 F. S
$ i. G" k; Q* W2 R6 D2 A2 ~
    64bits(原文为“64-bytes”,应有误)的数字。确实,无论什么数据,18014398509481984KB应该都够用了。虽然还有很多棘手的细节有待深入,但要点看起来很清楚了:RLP难以驯服。我们再来看看它是如何与状态树交织在一起的。% q5 x$ O* w. y+ j* |" {9 ?3 F
7 r/ q& T' V$ z3 v, R
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10