以太坊go语言源码 以太坊源码是什么语言( 三 )


其中前三个字节的计算方式如下:
184 = 183 + 1,因为数组长度86编码后仅占用一个字节 。
86即数组长度86
84是T的编码
例5:编码一个重复1024次"a"的字符串,其结果为:185 4 0 97 97 97 97 97 97 ... 。
1024按 big endian编码为0 0 4 0,省略掉前面的零,长度为2,因此185 = 183 + 2 。
规则1~3定义了byte数组的编码方案,下面介绍列表的编码规则 。在此之前 , 我们先定义列表长度是指子列表编码后的长度之和 。
如果列表长度小于55,编码结果第一位是192加列表长度的编码的长度 , 然后依次连接各子列表的编码 。
注意规则4本身是递归定义的 。
例6:["abc", "def"]的编码结果是200 131 97 98 99 131 100 101 102 。
其中abc的编码为131 97 98 99,def的编码为131 100 101 102 。两个子字符串的编码后总长度是8 , 因此编码结果第一位计算得出:192 + 8 = 200 。
如果列表长度超过55,编码结果第一位是247加列表长度的编码长度,然后是列表长度本身的编码,最后依次连接各子列表的编码 。
规则5本身也是递归定义的,和规则3相似 。
例7:
["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
的编码结果是:
248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
其中前两个字节的计算方式如下:
248 = 247 +1
88 = 86 + 2 , 在规则3的示例中,长度为86,而在此例中,由于有两个子字符串 , 每个子字符串本身的长度的编码各占1字节,因此总共占2字节 。
第3个字节179依据规则2得出179 = 128 + 51
第55个字节163同样依据规则2得出163 = 128 + 35
例8:最后我们再来看个稍复杂点的例子以加深理解递归长度前缀,
["abc",["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]]
编码结果是:
248 94 131 97 98 99 248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
列表第一项字符串abc根据规则2,编码结果为131 97 98 99,长度为4 。
列表第二项也是一个列表项:
["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
根据规则5,结果为
248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
长度为90,因此,整个列表的编码结果第二位是90 + 4 = 94, 占用1个字节,第一位247 + 1 = 248
以上5条就是RPL的全部编码规则 。
各语言在具体实现RLP编码时,首先需要将对像映射成byte数组或列表两种形式 。以go语言编码struct为例,会将其映射为列表,例如Student这个对象处理成列表["icattlecoder","male"]
如果编码map类型,可以采用以下列表形式:
[["",""],["",""],["",""]]
解码时,首先根据编码结果第一个字节f的大?。?执行以下的规则判断:
1. 如果f∈ [0,128), 那么它是一个字节本身 。

推荐阅读