RLP編碼原理

RLP編碼原理

RLP(Recursive Length Prefix康震,遞歸長度前綴)編碼算法纱烘,是以太坊中數(shù)據(jù)序列化/反序列化的主要方法曲楚。以太坊區(qū)塊鏈中的區(qū)塊幢痘、交易等數(shù)據(jù)結(jié)構(gòu)在持久化時會先經(jīng)過 RLP 編碼后再存儲到數(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ù)都以大端形式存儲徙瓶。

RLP 編碼規(guī)則:

  1. 對于單個字節(jié)毛雇,如果它的值范圍是[0x00,0x7f](ASCII碼),它的 RLP 編碼就是它本身侦镇。
    如: a -> [0x61] (字符) 100 -> [0x64] (數(shù)字)
  2. 字符串長度是0-55字節(jié)灵疮,它的 RLP 編碼包含一個單字節(jié)的前綴,后面跟著字符串的長度壳繁,再接著字符串本身震捣。這個前綴的值0x80加上字符串的長度荔棉。由于被編碼的字符串最大長度是55=0x37,因此單字節(jié)前綴的最大值是0x80+0x37=0xb7蒿赢,即編碼的第一個字節(jié)的取值范圍是[0x80,0xb7]润樱。
    字符串長度小于55字節(jié)的RLP 編碼例子:
    “dog” -> [0x83, 'd', 'o', 'g']
    其中0x83 = 0x80 + 3(“dog”字符串的長度)
  3. 字符串長度大于55個字節(jié),它的 RLP 編碼包含一個單字節(jié)的前綴羡棵,后面跟著字符串的長度壹若,再接著字符串本身。這個前綴的值是0xb7加上字符串長度的二進(jìn)制形式的字節(jié)長度晾腔。由于被編碼的字符串長度的二進(jìn)制長度最少是1個字節(jié)舌稀,最大是8個字節(jié),前綴的取值范圍是[0xb8,0xbf]灼擂。
    字符串長度大于55字節(jié)的 RLP 編碼例子:
    字符串:"Lorem ipsum dolor sit amet, consectetur adipisicing elit"
    字符串長度:56字節(jié)壁查,其二進(jìn)制形式為:00111000。其二進(jìn)制形式的長度為8位剔应,也就是1個字節(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 編碼包含一個單字節(jié)的前綴峻贮,后面跟著列表中各元素項(xiàng)的 RLP 編碼席怪,這個前綴的值是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)對應(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 編碼包含一個單字節(jié)的前綴,后面跟著列表的長度雅采,再接著列表中各元素項(xiàng)的 RLP 編碼爵憎。這個前綴的值是0xf7加上列表總長度的二進(jìn)制形式的字節(jié)長度。由于被編碼的列表長度的二進(jìn)制長度最少是1個字節(jié)婚瓜,最大是8個字節(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個
    字節(jié)長度。
    列表 RLP 編碼前綴:0xf7+1=0xf8
    列表中各項(xiàng)對應(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)容合作請聯(lián)系作者
  • 序言:七十年代末沥寥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柠座,更是在濱河造成了極大的恐慌邑雅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妈经,死亡現(xiàn)場離奇詭異淮野,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吹泡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門骤星,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爆哑,你說我怎么就攤上這事洞难。” “怎么了揭朝?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵队贱,是天一觀的道長。 經(jīng)常有香客問我萝勤,道長露筒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任敌卓,我火速辦了婚禮慎式,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟径。我一直安慰自己瘪吏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布蜗巧。 她就那樣靜靜地躺著掌眠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幕屹。 梳的紋絲不亂的頭發(fā)上蓝丙,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天级遭,我揣著相機(jī)與錄音,去河邊找鬼渺尘。 笑死挫鸽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸥跟。 我是一名探鬼主播丢郊,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼医咨!你這毒婦竟也來了枫匾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拟淮,失蹤者是張志新(化名)和其女友劉穎干茉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惩歉,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡等脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撑蚌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片上遥。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖争涌,靈堂內(nèi)的尸體忽然破棺而出粉楚,到底是詐尸還是另有隱情,我是刑警寧澤亮垫,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布模软,位于F島的核電站,受9級特大地震影響饮潦,放射性物質(zhì)發(fā)生泄漏燃异。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一继蜡、第九天 我趴在偏房一處隱蔽的房頂上張望回俐。 院中可真熱鬧,春花似錦稀并、人聲如沸仅颇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忘瓦。三九已至,卻和暖如春引颈,著一層夾襖步出監(jiān)牢的瞬間耕皮,已是汗流浹背境蜕。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凌停,地道東北人汽摹。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像苦锨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子趴泌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

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