1. 程式人生 > >以太坊MPT樹的HP(Hex-Prefix)編碼

以太坊MPT樹的HP(Hex-Prefix)編碼

coder 編碼 turn min 輸入 eth key bsp byte

源碼如下: func hexToCompact(hex []byte) []byte { terminator := byte(0) if hasTerm(hex) { terminator = 1 hex = hex[:len(hex)-1] } buf := make([]byte, len(hex)/2+1) buf[0] = terminator << 5 // the flag byte if len(hex)&1 == 1 { buf[0] |= 1 << 4 // odd flag
buf[0] |= hex[0] // first nibble is contained in the first byte hex = hex[1:] } decodeNibbles(hex, buf[1:]) return buf } MPT樹存儲的是鍵值對,需要對hex格式的Key轉化成byte類型。 為什麽要進行編碼?(https://ethfans.org/hpcoder/articles/961)
在以太坊協議中,不管是地址還是hash,都是一個16進制串,如"0x5b3edbcf7d0a97e95e57a4554a29ea66601b71ad",數據最小的表示單位為一位16進制,如1、a等,但在編程實現中,數據的最小表示單位往往是byte(8bit,2位16進制數),這樣在用byte來表示一串奇數長度的16進制串時會出現問題,如"5b3"和"5b30",直接轉成byte都是5b30。還有一種簡單直觀的轉換方式,"5b3"->"050b03",這種方式雖然簡單,但是數據量會翻倍,不利於大量hash的計算,同時也會增加tree的大小,降低同步性能。Hex-Prefix Encoding能解決這些問題。
  • 輸入 key 結尾為 0x10,則去掉這個終止符。
  • key 之前補一個二進制flag四元組(Nibble), 這個四元組第 0 位區分奇偶信息,第 1 位區分節點類型。
  • 如果輸入 key 的長度是偶數,則再添加一個四元組 0x0 在 flag 四元組後。
  • 將原來的 key 內容壓縮,將分離的兩個 hex(Nibble) 以高四位低四位進行合並成一個byte。

以太坊MPT樹的HP(Hex-Prefix)編碼