Addresses

乙太坊地址是如何產生的?

  • February 6, 2022

一個有效的乙太坊地址需要滿足哪些標準?它只是十六進制的隨機數嗎?還是需要根據某些密碼算法以特定方式推導出來?使用什麼算法和標準來生成密鑰對?

最近這篇文章引起了我的注意,它比我下面更易於訪問的版本更具深度和技術性。它還引導您完成如何自己生成一個。我強烈推薦它: https ://kobl.one/blog/create-full-ethereum-keypair-and-address/


來自黃皮書

黃紙

從私有 -> 地址獲取主要分為三個步驟:

  1. 創建一個隨機私鑰(64(十六進制)字元/256 位/32 字節)
  2. 從此私鑰派生公鑰(128(十六進制)字元/512 位/64 字節)
  3. 從此公鑰派生地址。(40(十六進制)字元 / 160 位 / 20 字節)

儘管很多人稱地址為公鑰,但在乙太坊中實際上並非如此。有一個單獨的公鑰充當您永遠看不到的中間人,除非您查看預售錢包 JSON 文件。

1.生成私鑰

私鑰是 64 個十六進製字元。假設每個 64 十六進製字元串都是一個乙太坊私鑰*(請參閱頂部的連結了解為什麼這不完全準確)*,它將訪問一個帳戶。如果您計劃生成一個新帳戶,則應確保這些帳戶使用了適當的 RNG。一旦你有了那個字元串..

  1. 私鑰 -> 公鑰

這很難,超出了我的範圍。橢圓曲線數字簽名算法(ECDSA)和其他東西有一些東西。但最終你會得到一個 64 字節的公鑰。

3.公鑰->地址

  1. 以公鑰開頭(128 個字元/64 個字節)
  2. 取公鑰的 Keccak-256 散列。您現在應該有一個 64 個字元/32 個字節的字元串。(注:SHA3-256 最終成為標準,但乙太坊使用 Keccak)
  3. 取此公鑰 (Keccak-256) 的最後 40 個字元/20 個字節。或者,換句話說,刪除前 24 個字元/12 個字節。這 40 個字元/20 個字節就是地址。當以 0x 為前綴時,它變為 42 個字元長。

定義

**地址:**乙太坊地址代表一個帳戶。對於 EOA,地址派生為控制帳戶的公鑰的最後 20 個字節,例如,`cd2a3d9f938e13cd947ec05abc7fe734df8dd826。這是一種十六進制格式(以 16 為基數),通常通過將 0x 附加到地址來明確表示。Web3.js 和控制台函式接受帶有或不帶有此前綴的地址,但為了透明起見,我們鼓勵使用它們。由於地址的每個字節由 2 個十六進製字元表示,因此前綴地址的長度為 42 個字元。從 0.5.0 版開始,一些應用程序和 API 還旨在實現 Mist 乙太坊錢包中引入的新的啟用校驗和的地址方案。-宅基地文件

**私鑰:**範圍內隨機選擇的正整數(以大端形式表示為長度為 32 的字節數組)[1, secp256k1n − 1]。-黃紙

引用自:https://ethereum.stackexchange.com/questions/3542