以太坊黄皮书-附录B.递归前缀长度

以下一种编码任意结构的二进制数据的序列化方法。

假定可能的数据结构\mathbb{T}

\mathbb{T}\equiv \mathbb{L} \cup \mathbb{B}

\mathbb{L} \equiv \left \{ t : t = \left ( t\left \left [ 0 \right ],t[1],... \right )\wedge \forall _{n <\left \| t \right \|} t[n] \epsilon \mathbb{T}\right \}

\mathbb{B} \equiv \left \{ b: b = \left ( b[0],b[1],... \right ) \wedge \forall _{n < \left \| b \right \|} b_{n} \epsilon \mathbb{O}\right \}

其中\mathbb{O}代表字节集合。因而\mathbb{B}是所有字节的序列的集合(或者是字节数组,可以想象成树结构的叶子)。\mathbb{L}是所有类树(子)结构的集合,这里的树结构布置仅一个树叶(可以想象成一个树的分支节点)。\mathbb{T} 是所有字节数组的集合和类似结构的序列。

以分段函数定义RLP,第一段处理当x 是字节序列时的实例;第二段处理当x是其他值时

RLP(x)\equiv \left\{\begin{matrix} R_{b}(x) \quad if \ x \epsilon\ \mathbb{B} & \\ R_{l}(x) \ otherwise & \end{matrix}\right.

如果x是一个字节数组,包含在\mathbb{B}中,那么RLP序列产生方法有三种

  • 如果字节数组仅包含单一字节(并不是说长度8bit的一个字节数据)且字节长度小于128位,RLP输出的序列就是输入
  • 如果字节数组少于56字节,RLP输出的二进制序列就是字节数组的加上前缀,前缀是长度是字节数组长度加上128
  • 否则,输出等于输入加上长度最小字节数组的长度的前缀,当以big-endian编译时,前缀长度等于输入字节数组的长度,它本身的前缀是数字忠实编码的长度值加上183所需的字节数。(这里不知道怎么理解,直译过来的)

R_{b}定位为

R_{b}(x) \equiv \left\{\begin{matrix} x &\ if \left \| x \right \| = 1\ \wedge x[0] < 128 &\\ \ (128 + \left \| x \right \|) \cdot x& \ elseif \left \| x \right \| < 56 \\ (183 + \left \| BE(\left \| x \right \|) \right \|) \cdot \ BE(\left \| x \right \|))\cdot x \ & otherwise& \end{matrix}\right.

BE(x) \equiv (b_{0},b_{1},...):b_{0} \neq 0 \wedge x = \sum_{n=0}^{n<\left \|b \right \| }b_{n}\cdot256^{\left \| b \right \|-1-n}

(a)\cdot(b,c)\cdot(d,e)=(a,b,c,d,e)

BE是一个函数,把正整数扩展成一个最小长度的big-endian 字节数组,点运算符表示拼接序列。

相反的,如果x是其他值,需要被转化成其他符号的序列,则RLP序列输出用以下两种方法:

  • 如果每个包含项的串联序列化长度小于56个字节,则输出等于串联字节数组加上前缀,该前缀长度等于此字节数组的长度加上192。
  • 否则,输出等于以最小长度字节数组为前缀的串联序列化当被解释为big-endian整数时,它等于拼接的serialisations字节的长度数组,其本身以忠实编码此长度值加上247所需的字节数为前缀。

R_{l}定位为

R_{l}(x) \equiv \left\{\begin{matrix} (192 + \left \| s(x) \right \|)\cdot s(x) & if \ \left \| s(x) \right\| < 56\\ (247 + \left\| BE(\left\|s(x)\right\|)||)\cdot BE(||s(x)||)\cdot s(x)& otherwise \end{matrix}\right.

s(x) \equiv RLP(x_{0})\cdot RLP(x_{1})\cdots

如果RLP被用来编码一个标量,仅作为一个正整数(\mathbb{N} \; or\;\mathbb{N}_{x}),它必须被编码为最短字节数组这样用big-endian编码时长度才会相等。因此一些正整数 i的RLP可以被定义为

RLP(i:i \ \epsilon \ \mathbb{N}) \equiv RLP(BE(i))

当译码RLP数据时,如果一段译码后的字节序列是一个标量并且以0开头,客户端会认为它是一个非典型的序列,认为它是无效RLP数据并完全丢弃它。

对于有符号数和浮点数并没有权威的编码格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值