引介

以太坊 Hex-Prefix Encoding

hpcoder   |     |   2429 次阅读

Hex-Prefix Encoding (16进制前缀编码),是一种将任意长度的nibble(4bit为一个nibble) 编码成byte数组的方法,也就是将最小粒度为4bit的数组编码成最小粒度为8bit数组。
以太坊黄皮书中Hex-Prefix Encode原文介绍:

可以编码方式很简单,重点是理解其中各符合的定义:x是一个nibble数组,t是标志位,用以标志节点类型。
为什么要进行编码?
在以太坊协议中,不管是地址还是hash,都是一个16进制串,如"0x5b3edbcf7d0a97e95e57a4554a29ea66601b71ad",数据最小的表示单位为一位16进制,如1、a等,但在编程实现中,数据的最小表示单位往往是byte(8bit,2位16进制数),这样在用byte来表示一串奇数长度的16进制串时会出现问题,如"5b3"和"5b30",直接转成byte都是5b30。还有一种简单直观的转换方式,"5b3"->"050b03",这种方式虽然简单,但是数据量会翻倍,不利于大量hash的计算,同时也会增加tree的大小,降低同步性能。Hex-Prefix Encoding能解决这些问题。

下面举个具体例子说明编码过程:

  1. 对"0x5b3ed"编码(奇数位)

    "0x5b3ed" = "0005 1011 0003 1110 1101"
    t=0 时, "0001"+"0005 1011 0003 1110 1101"->"00010005 10110003 11101101"->"0x15b3ed"

    t !=0时 "0011"+"0005 1011 0003 1110 1101"->"00110005 10110003 11101101"->"0x35b3ed"

  2. 对"0x5b3e"编码(偶数位)

    "0x5b3e" = "0005 1011 0003 1110"
    t=0 时, "0000"+"0005 1011 0003 1110 1101"->"00000005 10110003 11101101"->"0x005b3e"

    t !=0时 "0010"+"0005 1011 0003 1110 1101"->"00100005 10110003 11101101"->"0x205b3e"

 
0 人喜欢