Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

二叉状态树的结构

有个胖子他姓杨
182 0 0
    在设计十六进制trie时,一些设计选择在当时听起来很棒,但是经过5年的实践,被证明带来了很多复杂性。鉴于ETH1.x想要转向二进制trie,我们正好可以借此机会研究一下状态的存储方式。
* @' g. B& v, w! Y$ f& H- E3 E+ ^/ Y, M9 ]& I" f
    问题的根源1 z9 e: U2 `" s% w5 @" `
; ]" h) Z. F( f
    在重新设计存储格式时,我们至少可以从5个方面进行改进。4 z6 z" Q8 k) c7 M% v
$ z' J4 r: y* H1 H4 w3 N7 V/ _- v
    将账户trie和存储trie合并:维护多个结构会增加复杂性,典型的例子就是节点必须先遍历账户
" p) g" t8 n+ U/ o3 l* M4 U" h
! p& A1 I4 k% n1 i( f    trie,得到存储trie的根,然后再到存储trie上获取数据。
5 V/ c: g5 ~9 z8 N7 P6 a& \2 R. n3 Q* q, z
    扩展节点(extensionnodes):这是一种特殊的节点,负责给特定子树上的所有key加上前缀。这些节点的作用是能够限制需要被哈希的节点数量,但是也引入了复杂性,因为它们所涉及的key必须以特定方式打包。2 ?8 p, o- O  N2 x/ v3 k) P

  x8 S" u6 k0 V  {2 u0 J$ r- Y( y    RLP编码格式旨在高效地对任意结构进行编码。由于其复杂性,它也带来了很多麻烦:必须费尽千辛万苦打包key块(packkeychunk)。另外,由于每个节点的结构相当固定,可以使用更简单的序列化方法来代替RLP。) |, G" e/ ?2 f5 h3 o& G' a

1 c8 _( V5 B2 m! m    与前两个问题相关的是,十六进制的前缀也会带来复杂性和混乱。+ [- z2 }, I7 v2 u9 x
# @) ?" Y3 R. O
    十六进制trie的证明【即,“见证数据(witness)”】比二进制trie的证明大4倍左右。(欲知详情,请阅读这篇文章。(中文译本))
! L0 H. n" I  b( f$ i+ i7 W6 D" N8 v! R& r
    RLP
) C& ?2 |! E$ k" N' a' U) V3 m% k/ b" f1 T2 Z; \' K( `/ Z+ p
    ——Ramble,LoseyourselfandPester?" Z; L& M0 e! v$ q5 ^0 L
1 a5 E$ O0 K" x, u  S  {1 M
    (译者注:“RLP”是“RecursiveLengthPrefix(递归长度前缀)”的缩写,但作者这里使用了几个R、L、P开头的词“漫无目的、迷失自我、喋喋不休”,就是批评之意。)本文我们会讨论怎么解决RLP问题。如果RLP被取代,绝大多数核心开发者都不会感到伤心。这是因为RLP过于复杂。实际上,我听过的唯一一个支持保留RLP的理由是:“RLP实在太过复杂,不要再冒险选择新的格式了,以免重蹈覆辙。”RLP
- h  v' k0 K/ @& i! q
, y" C# J* w, v1 ~    的基本原理是采用简单的size+data格式。这就是复杂性的由来。首先,size可以是任何整数(实际上,它不可能超过2字节,但是从原则上来说是可以的,因此你必须确保能够支持超过2, c2 A# g3 e4 \) R! n/ `

! ~' C" s% H: l$ H0 n    字节的size)。我们如何知道size部分在哪里结束,data部分在哪里开始?
' p4 m: G1 k2 Z
8 Z& N. L! Z, l    在大多数情况下,开头会加上一个header。这个
) Y0 C/ D5 Q- t8 v3 \1 ?
1 u! X9 C# r" P9 u' m6 I( s! G    header是一个值h,然后再加上size值:因此,RLP编码是[length(data)+h][data]
' E5 V- b' W4 c" ~
' F% L- q$ P2 g; |5 l( z    如果length(data)+h
/ ?. L) v3 N5 Z1 {
) W9 y! b' x9 c: `2 h$ V# y" U/ c9 l    如果数据大小为一个字节,你发现自己必须在这个字节前再增加一个字节。有没有可能不这样做?部分情况下可以,但是会另外增加复杂程度!如果data[0]
( K7 C; J; o; t8 ~" |; x' |" I# z- j* ?" Q4 ?
    还能再酸爽一点吗?当然可以了!RLP涉及两类“对象”:结构列表和字节数组。+ u* j. z% }' U2 s0 {* ?
; S0 J. s% M) A' [
    字节数组:header=128,overflow_header=1839 O9 ?: G; _. k( L3 r3 u0 E( z4 b

; y1 N; O, U' ~2 C    结构列表:header=192,overflow_header=247% o  s5 h7 r  j0 J
# ~& t- A: f* K  g! m/ p
    请注意,datasize部分的最大规模是8bytes,也就是一个
$ G8 w6 f$ W1 s5 L3 P' E) ^7 N, E% N+ S# |
    64bits(原文为“64-bytes”,应有误)的数字。确实,无论什么数据,18014398509481984KB应该都够用了。虽然还有很多棘手的细节有待深入,但要点看起来很清楚了:RLP难以驯服。我们再来看看它是如何与状态树交织在一起的。
; f& B. V6 s6 h8 Q
6 n6 A1 i" v7 _* R
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10