多位址 (multiaddr)
讓我們從最早或按 commit 時間來看最早被歸檔的多位址 (multiaddr[1]) 開始。多位址是 protocol labs 的多格式專案(multiformats project)的一部分。多格式本質上是自描述值的各種規範。由於被廣泛用於libp2p,ipfs 以及其它 protocol labs 的專案,你可能早就聽說過它們。 多位址有兩種表示形式:一種是儲存或傳輸時使用的二進位制表示;另一種是提供給使用者的可讀格式。 /ip4/127.0.0.1/udp/1234 上面展示了乙個以可讀格式表示的多位址。該多位址是一種以鍵值對來表示位址的可遞迴格式。(筆者注,位址可表達為)。二進位制表示也是相同的——有乙個位元組陣列表示鍵,還有乙個用於表示值。鍵可以通過協議表[2]從可讀形式對映為**形式。enode
接下來就是enode[3]。enode並不是真正的網路位址格式而是 url 格式。由於 enode 是 enr 的前身,我們仍會介紹它。乙個 enode url 如下所示: enode: enode體系被用於表示url。enode://後面跟著乙個十六進製制編碼的節點id。接下來,@符號後面表示的是主機,其必須為乙個ip位址。主機後面列出了tcp埠,在我們的例子中為30303。若udp和tcp的埠不同,udp埠可通過在末尾新增discport引數來指定。enr
最後我們來介紹 enr[4](以太坊節點記錄)。enr很有趣,原因在於其皆使用了前兩種型別(多位址和enode url)的特性,使得它變得十分通用。enr的主要動機是允許**過程中攜帶更多的資訊,因而引入了節點記錄。節點記錄是自證的,而且節點可通過簽名來鑑別身份。這些記錄被表示為乙個rlp列表[5]——此處我不會進行詳細介紹,但稍微提及一下,rlp是以太坊使用的一種序列化格式。
節點記錄包含了乙個簽名,序列號與乙個表明用於建立和驗證簽名的身份認證機制所需的字段。最後,記錄的其餘部分包含了任意鍵值對,這些鍵值對可包含諸如連線資訊之類的東西。eip定義了一些具有預定義含義的鍵,如ip,其為4位元組表示的節點ipv4位址。
簽名被用於通過確保傳遞的公鑰為建立簽名所使用的公鑰來驗證記錄。
如果同乙個身份簽發了2個不同的記錄,那麼序列號可用於解決衝突:規定使用序列號較大的記錄。
需要注意的是,節點記錄的rlp編碼版本號不能超過300位元組。
該格式是面向未來的,新鍵即使在部分客戶端不能解析的情況下仍能被新增,以及新的身份認證機制可被新增以檢驗簽名。
eth 2.0
現在,讓我們來看看 eth2.0。在 eth2.0 之前,以太坊中從未使用過多位址,而其現在變得非常重要。為什麼?因為 eth2.0 使用 libp2p,而 libp2p 又使用多位址來識別節點。
那麼,我們該怎麼處理這種情況呢?eth2.0 的 p2p規範[6] 展示了2種方案:
多位址可從enr匯出
由於enr能夠新增任意鍵,多位址能被包含在enr中。
[1][2]
[3][4]
[5][6]
以太坊位址和公鑰 區塊鏈詞典 公鑰與位址
進行數字貨幣交易時,除了私鑰和助記詞,還免不了會用到公鑰與位址,如果你還不了解它們的重要性,貿然去交易,很可能不經意之間就弄丟了自己的資產。那什麼是公鑰與位址?我們今天來重點學習一下。公鑰 公鑰,是對私鑰進行橢圓曲線加密演算法生成,公鑰的基礎是私鑰,是先有了私鑰,之後再生成公鑰,之後在和簽名配合證明...
以太坊中的賬戶 Account
1.什麼是賬戶?乙太坊是乙個p2p網路,任何人只要有一台可以聯網的電腦,都可以參與到這個網路中。普通使用者參與到乙太坊網路中,最常見的目的,就是進行乙太幣交易。比方說a要把100個eth轉給b,這就會生成一比交易。這筆交易會被打包到乙個區塊中,由礦工將其加入區塊鏈中。礦工做這件事的過程就是記賬,或者...
以太坊合約位址是如何生成的
我們在以太坊上建立乙個合約時,新生成的合約的位址是根據傳送者 sender 的位址和其已生成的事務數 nonce 確定的,經過rlp編碼後再hash keccak 256 運算得出的。具體的nodejs 如下 var util require ethereumjs util 根據傳送者位址和nonc...