eth錢包hex與iban
1. 006:MPT與RLP|《ETH原理與智能合約開發》筆記
待字閨中開發了一門區塊鏈方面的課程:《深入淺出ETH原理與智能合約開發》,馬良老師講授。此文集記錄我的學習筆記。
課程共8節課。其中,前四課講ETH原理,後四課講智能合約。
第二課分為三部分:
這篇文章是第二課第二部分的學習筆記:MPT與RLP。
MPT,Merkle Patricia Tree,結合了Merkle Tree(默克爾樹)和 Patricia Tree(帕特里夏樹)的一種數據結構。
RLP,Recursive Length Prefix,一種編碼方法。
這是兩個非常重要的數據結構,在以太坊的區塊和交易中都有用到。
先分別介紹一下Merkle Tree 和 Patricia Tree。
Merkle Tree 和 Patricia Tree Merkle Tree 和 Patricia Tree
默克爾樹的解釋:對每一個交易計算其散列值(Hash),再對兩個散列值求他們的散列值。如果是奇數個,就把最後一個重復一次。最後得到的一個散列值就是默克爾樹根的值。如圖,交易1、1、2、3的散列值分別是HASH0、HASH1、HASH2、HASH3。HASH0和HASH1結合在一起計算散列值得HASH01,HASH2和HASH3結合在一起計算散列值得HASH23,接下來HASH01、HASH23結合在一起,計算散列值得HASH0123。
採用默克爾樹的好處是可以方便的判斷一個交易是否在區塊中。
Patricia Tree,可稱為壓縮前綴樹。如上圖右半部分。相同的前綴在同一分支中,後面一同的部分分叉出來,如test和toast,都有相同的t,est和oast在兩個分支中。
這個結構的好處是節省空間,因為每一級的鍵值可以是多個字元。
了解了Merkle Tree 和 Patricia Tree後,再來看這兩者混合後的產物——MPT。
這里的原理知識單獨來看不易理解,和具體的例子結合起來才更容易理解,此處先放上課件截圖。在後面的例子中再做說明。
Merkle Patricia Tree 規格 Merkle Patricia Tree 規格
在MPT中,還涉及到三個小的編碼標准。主要規則如圖。下面結合兩個例子說明一下。
三個編碼標准 三個編碼標准
HEX編碼的例子:從ASCII碼表中可以查出,b的十六進制編碼為62,o的十六進制編碼為6F,F在十六進制中就是15的意思。因為這是個葉子節點,最後加上0x10表示結束,也就是16。所以最後的編碼為[6 2 6 15 6 2 16]
HEX-Prefix編碼的例子:[6 2 6 15 6 2 16],將其最後的0x10去掉,[6 2 6 15 6 2]。前面補一個四元組,其中(倒數)第0位是區分奇偶信息的,[6 2 6 15 6 2]是偶數位,第0位是0;第1位是區分節點類型的,這是葉子節點,第1位是1。所以這個四元組就是0010是2。「如果輸入key的長度是偶數則再添加一個四元組0x0在flag四元組之後。」,所以,最終的前綴是0x20。本例最終的結果,[32 98 111 98],即[0x20, 0x62, 0x6F, 0x62]
下面是綜合性的例子,通過它可以很方便地理解前面的理論知識。值得多看幾篇,仔細休會。
初始的key-value對為:
其中,<>中的數據為key的16進制編碼。
MPT.jpg MPT.jpg
因為4組數據都有公共的6,所以這個節點的值為6,長度為1,奇數;節點類型:擴展節點;所以前綴就是0001,即1。
這是個擴展節點,它的值是一個Hashvalue,它指向一個分支節點。Hashvalue,具體指的是分支節點RLP編碼的結果的散列值。(RLP見下小節)
分支節點。上面4組數據的第2位是4和8兩種情況。在4的位置上存的是下面的擴展節點的散列值,在8的位置上存的是下面的葉子節點的散列值。
葉子節點。以68開頭的只有一個了。所以這個節點上的四元組就是6f727365了。它是偶數位。前綴是0x20(同前文HEX-Prefix編碼的例子)。這個葉子節點的value值為'stallion'。
擴展節點。在64之後,公共的部分是6f,這個擴展節點的key即為6f,前綴為0000,即00。這個擴展節點的value存放的是一個hashvalue,指向下一個節點,一個分支節點。
分支節點。646f已經表達完,這個節點的value值就是646f對應的值,'verb'。
除此之外,646f之後就是6,所以在這個分支節點的6位置上有一個散列值,指向下一個節點。
擴展節點。在646f6之後,公共的部分是7,其長度為1,奇數。所以前綴為0001。這個節點的value是一個散列值,指向下一個節點。
分支節點。646f67已經表達完,這個節點的value值就是646f67對應的值,'puppy'。
除此之外,646f67之後就是6,所以在這個分支節點的6位置上有一個散列值,指向下一個節點。
葉子節點。key為5,value為'coin'。長度為1,奇數,前綴0011,即3。
整個分析過程結束。可結合上圖和前文的理論多加復習。
這小節也是理論性較強,通過例子可以方便理解。先放上課件,再根據我的理解舉更多的例子。同樣,學習方法也是理論和例子配合學習。其中,list的例子在下篇文章的上機實驗部分再列舉。 RLP的編碼標准 RLP的編碼標准 再舉幾個例子 再舉幾個例子
2. 以太坊中的國際銀行賬號iban
簡單地說,以太坊中的iban賬號是以太坊為了和傳統的銀行系統對接而引入的概念,web3.js中提供了以太坊地址和iban地址之間的轉換方法。
iban這個概念源於傳統的銀行系統,其英文全稱為 International Bank Account Number ,即國際銀行帳號。iban的作用是為全球任意一家銀行中的任意一個賬戶生成一個全球唯一的賬號,以便進行跨行交易。一個iban賬號看起來像這樣:
iban地址最多可以包含34個字母和數字,其中的字母大小寫不敏感。在iban
中包含以下信息:
以太坊引入了一個新的IBAN國別碼:XE,其中E代表Ethereum,X代表非法幣(non-jurisdictional currencies)。同時,以太坊提出了三種BBAN的編碼格式:direct、basic和indirect。
direct編碼方案中的BBAN為30個字母/數字,只有一個欄位:賬戶編號。例如,以太坊地址 轉換為direct方案的BBAN賬號,就得到 。
可以使用web3.js中的 web3.eth.Iban.fromEthereumAddress()
方法來執行這一轉換:
basic編碼方案與direct方案的唯一區別在於,其BBAN長度為31個字母/數字,因此該方案不兼容IBAN。
indrect編碼方案中的BBAN長度為16個字母/數字,包含三個欄位:
例如,一個採用indrect編碼方案的以太坊iban賬號,看起來是這樣:
前面的 XE 表示國別碼, 81 為校驗和,後面的16個字元就是indrect編碼的BBAN,其中:
如前所述,使用 web3.eth.Iban.fromEthereumAddress() 方法,可以將一個以太坊地址轉換為direct編碼方案的iban賬號。與之對應的,可以使用 web3.eth.Iban.toAddress 方法,將一個採用direct編碼方案的iban賬號,轉換回以太坊地址。例如:
iban賬號中的校驗和用來幫助核驗一個給定字元串是否為有效的iban賬號。可以使用web3.js中的 web3.eth.Iban.isValid()
來進行執行校驗。例如:
原文: http://blog.hubwiz.com/2018/06/03/ethereum-iban/