Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

二叉状态树的结构

有个胖子他姓杨
203 0 0
    在设计十六进制trie时,一些设计选择在当时听起来很棒,但是经过5年的实践,被证明带来了很多复杂性。鉴于ETH1.x想要转向二进制trie,我们正好可以借此机会研究一下状态的存储方式。
7 A! f' O2 a5 a. c" a& i) d: h
9 f8 H' @% L( t- S# T    问题的根源" Y2 x6 N1 G; L* u9 D% I( T
  Q" F, K2 D" K( s9 T
    在重新设计存储格式时,我们至少可以从5个方面进行改进。
, y8 E. W+ b9 ]5 x3 ?. \  A/ Y: O) H9 U0 L* v- H* ]
    将账户trie和存储trie合并:维护多个结构会增加复杂性,典型的例子就是节点必须先遍历账户
( B4 E4 j2 w% f6 q0 a' v' `/ ^9 t; F2 x& ?- @  h2 F. u2 G/ {
    trie,得到存储trie的根,然后再到存储trie上获取数据。
  K" s3 V1 m/ W! ]. u3 D* y) u% P. |9 r; E" H
    扩展节点(extensionnodes):这是一种特殊的节点,负责给特定子树上的所有key加上前缀。这些节点的作用是能够限制需要被哈希的节点数量,但是也引入了复杂性,因为它们所涉及的key必须以特定方式打包。" u; c9 S2 y+ G# e

% ]  b. w; S5 D3 R1 o/ @$ f    RLP编码格式旨在高效地对任意结构进行编码。由于其复杂性,它也带来了很多麻烦:必须费尽千辛万苦打包key块(packkeychunk)。另外,由于每个节点的结构相当固定,可以使用更简单的序列化方法来代替RLP。# P0 c+ v6 j/ N5 M

+ J$ F7 p* d0 \) ~8 T: `* D! W) o' g    与前两个问题相关的是,十六进制的前缀也会带来复杂性和混乱。& A8 X0 R, |7 o7 o! f
# w* W2 G3 r3 m  _5 C
    十六进制trie的证明【即,“见证数据(witness)”】比二进制trie的证明大4倍左右。(欲知详情,请阅读这篇文章。(中文译本)). y& y5 p8 t% Z1 x- m
( Z6 c, Q/ M0 Y% \
    RLP
5 N; A# m4 {/ a0 [' Z) g2 p! C  D/ L
    ——Ramble,LoseyourselfandPester?
" j! q# g% k" |* X6 m5 U/ e5 t2 D  C4 ^6 a' m$ p: _- `0 z
    (译者注:“RLP”是“RecursiveLengthPrefix(递归长度前缀)”的缩写,但作者这里使用了几个R、L、P开头的词“漫无目的、迷失自我、喋喋不休”,就是批评之意。)本文我们会讨论怎么解决RLP问题。如果RLP被取代,绝大多数核心开发者都不会感到伤心。这是因为RLP过于复杂。实际上,我听过的唯一一个支持保留RLP的理由是:“RLP实在太过复杂,不要再冒险选择新的格式了,以免重蹈覆辙。”RLP
" l* v1 h  Y7 a& `$ n& G
2 D/ u. Q. z) H9 K1 z    的基本原理是采用简单的size+data格式。这就是复杂性的由来。首先,size可以是任何整数(实际上,它不可能超过2字节,但是从原则上来说是可以的,因此你必须确保能够支持超过2
9 A, B/ W0 E2 i4 @+ K/ M1 C6 l# n- h6 z
    字节的size)。我们如何知道size部分在哪里结束,data部分在哪里开始?
4 s5 R% {9 S1 F' t8 I
. ?/ I+ V8 H3 [: S1 b# h' b* N    在大多数情况下,开头会加上一个header。这个. j0 V8 N( ~, W& a. y: b

) A% K9 S. D" {% J2 U1 b    header是一个值h,然后再加上size值:因此,RLP编码是[length(data)+h][data]
- x. b$ q. r- o
2 S9 B4 d" W% j. o. \) I. d    如果length(data)+h/ x8 }- Y. }: g1 q  i

" S7 X2 N% M3 Z% K- e    如果数据大小为一个字节,你发现自己必须在这个字节前再增加一个字节。有没有可能不这样做?部分情况下可以,但是会另外增加复杂程度!如果data[0]& R0 \, O. h+ H+ b5 g
; o( L5 R: s" ]4 S, S: z8 |. L2 Z+ W
    还能再酸爽一点吗?当然可以了!RLP涉及两类“对象”:结构列表和字节数组。- g+ c& f9 b( {, }0 f
8 k8 ?% U5 S. H  J
    字节数组:header=128,overflow_header=183
8 N6 K0 q& ?% f0 x9 I" K, C# A0 [9 z; _; F( |$ ~
    结构列表:header=192,overflow_header=247
% U/ c" s8 H/ Y5 W' l0 s
- \' a& b  Y1 V/ K    请注意,datasize部分的最大规模是8bytes,也就是一个& T; Q# m' y6 U

/ B- z; e( o# L* M2 H( U. W    64bits(原文为“64-bytes”,应有误)的数字。确实,无论什么数据,18014398509481984KB应该都够用了。虽然还有很多棘手的细节有待深入,但要点看起来很清楚了:RLP难以驯服。我们再来看看它是如何与状态树交织在一起的。2 K$ T3 k9 p& w  ~8 H& h* l
) }1 G9 c6 \; k; K
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10