Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

二叉状态树的结构

有个胖子他姓杨
163 0 0
    在设计十六进制trie时,一些设计选择在当时听起来很棒,但是经过5年的实践,被证明带来了很多复杂性。鉴于ETH1.x想要转向二进制trie,我们正好可以借此机会研究一下状态的存储方式。9 U" Z; A3 f8 W2 E4 e1 H
& k8 b5 r0 x1 [( ~. y
    问题的根源
$ A( f" h$ D" m, z+ K
5 L! Q$ [- i' s3 Q( S6 b
    在重新设计存储格式时,我们至少可以从5个方面进行改进。
3 J! ^+ e! |  T# P9 a6 P; r0 O8 p$ {. j5 r& v, [
    将账户trie和存储trie合并:维护多个结构会增加复杂性,典型的例子就是节点必须先遍历账户2 |: U2 h$ W7 Y
6 W+ Y. `! K/ i% s# E3 y3 R
    trie,得到存储trie的根,然后再到存储trie上获取数据。) R- T/ M( h  c/ ~) V5 i$ p: @( \6 Q

' x+ t/ t8 o: Z# v    扩展节点(extensionnodes):这是一种特殊的节点,负责给特定子树上的所有key加上前缀。这些节点的作用是能够限制需要被哈希的节点数量,但是也引入了复杂性,因为它们所涉及的key必须以特定方式打包。" l- ^" F. t6 r% O& W% @

4 B+ M  T% y7 N    RLP编码格式旨在高效地对任意结构进行编码。由于其复杂性,它也带来了很多麻烦:必须费尽千辛万苦打包key块(packkeychunk)。另外,由于每个节点的结构相当固定,可以使用更简单的序列化方法来代替RLP。
; U+ H( A/ G# g) G4 T
6 l1 A: b' w/ K. j    与前两个问题相关的是,十六进制的前缀也会带来复杂性和混乱。
& ^& [+ L3 n( D9 n
- o1 g, C) o8 Q7 V1 G  E: R4 D; ~$ ]    十六进制trie的证明【即,“见证数据(witness)”】比二进制trie的证明大4倍左右。(欲知详情,请阅读这篇文章。(中文译本))
  u: j# Q& H8 Y9 J* Q9 D  K* s+ y& `. }
    RLP. I0 u7 i: l& L# `
; L  w- X2 O) v" J- p3 D5 E; P9 L
    ——Ramble,LoseyourselfandPester?
2 S' h; u8 F0 h2 h3 i9 g3 A% K5 K2 t! A2 C
    (译者注:“RLP”是“RecursiveLengthPrefix(递归长度前缀)”的缩写,但作者这里使用了几个R、L、P开头的词“漫无目的、迷失自我、喋喋不休”,就是批评之意。)本文我们会讨论怎么解决RLP问题。如果RLP被取代,绝大多数核心开发者都不会感到伤心。这是因为RLP过于复杂。实际上,我听过的唯一一个支持保留RLP的理由是:“RLP实在太过复杂,不要再冒险选择新的格式了,以免重蹈覆辙。”RLP
* _1 G& z5 C# B1 x
  ~+ C5 T2 Z$ h1 B    的基本原理是采用简单的size+data格式。这就是复杂性的由来。首先,size可以是任何整数(实际上,它不可能超过2字节,但是从原则上来说是可以的,因此你必须确保能够支持超过2
5 l2 N6 `% T5 |. O9 P- L5 |( D  `7 |5 ]8 U
    字节的size)。我们如何知道size部分在哪里结束,data部分在哪里开始?7 M$ H; u  |/ O7 G
7 \! e+ s% B# z! l' }8 R9 P
    在大多数情况下,开头会加上一个header。这个
* r9 g& u/ F* t0 [5 ]. a2 d4 p( A! r* G0 t) a8 H9 s: f4 J
    header是一个值h,然后再加上size值:因此,RLP编码是[length(data)+h][data]1 n, O. q, V  h- c' N
- C+ a5 S# j( V/ h3 C, a, S2 K/ E6 \
    如果length(data)+h/ v  C# i2 L  N+ _& Q4 o
$ W4 _# X0 a! P) T  Y
    如果数据大小为一个字节,你发现自己必须在这个字节前再增加一个字节。有没有可能不这样做?部分情况下可以,但是会另外增加复杂程度!如果data[0]; @' J9 J( W' `
' k) r9 P9 X; F8 M1 F7 v
    还能再酸爽一点吗?当然可以了!RLP涉及两类“对象”:结构列表和字节数组。- ?9 a8 z$ g  v& J& V- U0 u/ h
, j' ~7 ^1 r- H" g% S' u: D
    字节数组:header=128,overflow_header=183
. i  `6 ?: j) y( Z& o  \$ C& H; Z* ]$ ?+ \. K  ]) H* o' {
    结构列表:header=192,overflow_header=247
6 T; T. k6 ^5 F! U) \; o
$ @3 O$ @, U) s0 b    请注意,datasize部分的最大规模是8bytes,也就是一个* N  G- R1 E6 N$ O

  Z8 Y# B8 t4 c$ B* i1 C    64bits(原文为“64-bytes”,应有误)的数字。确实,无论什么数据,18014398509481984KB应该都够用了。虽然还有很多棘手的细节有待深入,但要点看起来很清楚了:RLP难以驯服。我们再来看看它是如何与状态树交织在一起的。; |# T9 d& B/ q( F' S8 d$ B

. x) _$ U# s, |( n, W: `
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10