RLP編碼原理

RLP編碼原理

RLP(Recursive Length Prefix,遞歸長度前綴)編碼算法,是以太坊中數(shù)據(jù)序列化/反序列化的主要方法。以太坊區(qū)塊鏈中的區(qū)塊、交易等數(shù)據(jù)結(jié)構(gòu)在持久化時(shí)會(huì)先經(jīng)過 RLP 編碼后再存儲(chǔ)到數(shù)據(jù)庫中。

RLP 編碼只處理兩類數(shù)據(jù):

  • 字符串 e.g. this is string
  • 列表 e.g. ["cat","horse",[[]],"pig",[""],"sheep"]

其他數(shù)據(jù)類型的數(shù)據(jù)需要轉(zhuǎn)換成以上的兩類,轉(zhuǎn)換的規(guī)則不是 RLP 編碼定義的,可以根據(jù)自己的規(guī)則轉(zhuǎn)換,例如 struct可以轉(zhuǎn)換成列表,int 可以轉(zhuǎn)換成二進(jìn)制(屬于字符串一類),以太坊中整數(shù)都以大端形式存儲(chǔ)。

RLP 編碼規(guī)則:

  1. 對(duì)于單個(gè)字節(jié),如果它的值范圍是[0x00,0x7f](ASCII碼),它的 RLP 編碼就是它本身。
    如: a -> [0x61] (字符) 100 -> [0x64] (數(shù)字)
  2. 字符串長度是0-55字節(jié),它的 RLP 編碼包含一個(gè)單字節(jié)的前綴,后面跟著字符串的長度,再接著字符串本身。這個(gè)前綴的值0x80加上字符串的長度。由于被編碼的字符串最大長度是55=0x37,因此單字節(jié)前綴的最大值是0x80+0x37=0xb7,即編碼的第一個(gè)字節(jié)的取值范圍是[0x80,0xb7]。
    字符串長度小于55字節(jié)的RLP 編碼例子:
    “dog” -> [0x83, 'd', 'o', 'g']
    其中0x83 = 0x80 + 3(“dog”字符串的長度)
  3. 字符串長度大于55個(gè)字節(jié),它的 RLP 編碼包含一個(gè)單字節(jié)的前綴,后面跟著字符串的長度,再接著字符串本身。這個(gè)前綴的值是0xb7加上字符串長度的二進(jìn)制形式的字節(jié)長度。由于被編碼的字符串長度的二進(jìn)制長度最少是1個(gè)字節(jié),最大是8個(gè)字節(jié),前綴的取值范圍是[0xb8,0xbf]。
    字符串長度大于55字節(jié)的 RLP 編碼例子:
    字符串:"Lorem ipsum dolor sit amet, consectetur adipisicing elit"
    字符串長度:56字節(jié),其二進(jìn)制形式為:00111000。其二進(jìn)制形式的長度為8位,也就是1個(gè)字節(jié)長度。
    前綴:0xb7 + 1 = 0xb8
    字符串長度的16進(jìn)制表示: 56 -> 0x38
    該字符串的 RLP 編碼形式為:
    [0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't']
  4. 列表總長度(列表的總長度指的是它包含的項(xiàng)的數(shù)量加它包含的各項(xiàng)的長度之和)是0-55字節(jié),它的 RLP 編碼包含一個(gè)單字節(jié)的前綴,后面跟著列表中各元素項(xiàng)的 RLP 編碼,這個(gè)前綴的值是0xc0加上列表的總長度。由于被編碼的列表最大長度是55=0x37,因此前綴的最大值是0xc0+0x37=0xf7,前綴的取值范圍為[0xc0,0xf7]。
    列表長度小于55字節(jié)的 RLP 編碼例子:
    列表:[ ["dog","cat"], [["mouse"]], [["bird"], [["duck","chicken"]]] ]
    列表總長度:列表含有項(xiàng)13 + 所有項(xiàng)包含的字符總數(shù)26 = 39 -> 0x27
    拆分列表項(xiàng)共計(jì)13項(xiàng): ["dog","cat"]、"dog"、"cat"、[["mouse"]]、["mouse"]、"mouse"、[["bird"], [["duck","chicken"]]]、["bird"]、"bird"、[["duck","chicken"]]、["duck","chicken"]、"duck"、"chicken"
    列表 RLP 編碼前綴 : 0xc0 + 0x27 = 0xe7
    列表中各項(xiàng)對(duì)應(yīng)的 RLP 編碼:套用編碼規(guī)則2、3
    該列表的 RLP 編碼為:
    [0xe7,0xc8,0x83,'d','o','g',0x83,'c','a','t',0xc7,0xc6,0x85,'m','o','u','s','e',0xd5,0xc5,0x84,'b','i','r','d',0xce,0xcd,0x84,'d','u','c','k',0x87,'c','h','i','c','k','e','n']
  5. 列表總長度大于55字節(jié),它的 RLP 編碼包含一個(gè)單字節(jié)的前綴,后面跟著列表的長度,再接著列表中各元素項(xiàng)的 RLP 編碼。這個(gè)前綴的值是0xf7加上列表總長度的二進(jìn)制形式的字節(jié)長度。由于被編碼的列表長度的二進(jìn)制長度最少是1個(gè)字節(jié),最大是8個(gè)字節(jié),前綴的取值范圍是[0xf8,0xff]。
    列表長度大于55字節(jié)的 RLP 編碼例子:
    列表:["Lorem ipsum dolor sit amet, consectetur adipisicing elit"]
    列表總長度:列表含有項(xiàng)1 + 所有項(xiàng)包含的字符總數(shù)56= 57 -> 0x39
    其二進(jìn)制形式為:00111001。其二進(jìn)制形式的長度為8位,也就是1個(gè)
    字節(jié)長度。
    列表 RLP 編碼前綴:0xf7+1=0xf8
    列表中各項(xiàng)對(duì)應(yīng)的 RLP 編碼:套用編碼規(guī)則2、3
    該列表的 RLP 編碼為:
    [0xf8,0x39,0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't']
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • RLP(Recursive Length Prefix,遞歸長度前綴)是一種編碼算法,用于編碼任意的嵌套結(jié)構(gòu)的二進(jìn)...
    Aedan閱讀 634評(píng)論 0 0
  • 文章分為2部分, 第一部分是綜合整理已有資料而生成的參考文檔, 第二部分是python版以太坊代碼中的源碼實(shí)現(xiàn)分析...
    shi_qinfeng閱讀 3,712評(píng)論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • GitHub上介紹(解碼部分為本人編輯): https://github.com/ethereum/wiki/wi...
    AlbertGou閱讀 3,161評(píng)論 1 3
  • title: 【個(gè)人筆記-優(yōu)化格式】soapui總結(jié)資料收集tags: 新建,模板,小書匠grammar_cjkR...
    劇毒術(shù)什閱讀 2,251評(píng)論 0 7

友情鏈接更多精彩內(nèi)容