以太坊地址是怎么來的 以太坊地址生成過程
以太坊地址是怎么來的
以私鑰為原材料
生成私鑰的過程依賴于偽隨機數生成器(PRNG)和足夠大的熵。關于私鑰,最重要的一點是,它是從 1 到 2²⁵⁶-1 的范圍內隨機選出的整數。只要是在這個范圍內的數,都可以用作私鑰。
既然我們已經初步學習了私鑰背后的數學知識,接下來就可以自己生成有效的私鑰了(譯者注:教育目的,可跟隨作者的思路學習,但不推薦自己生成。)。我們不妨將私鑰生成過程想象成一個長達 78 位的水平數字組合鎖(其可能組合數量恰好等于 2²⁵⁶-1),然后我們把這個密碼鎖分成 3 排,每排有 26 位。你可以把 PRNG 函數想象成一個會隨機打亂數字,打亂出一個數字組合的東西:一開始每一位都是 0,然后毫無章法地在每一位上選出一個具體的數字。假設我們使用 PRNG 函數生成亂序的數字組合,得到以下三排數字:
(1) 04406941321102621719184878;
(2) 43014596507006094171646853;
(3) 06780198554267270848908554;
- 瀏覽器使用 Web Cryptography API (提供 Crypto.getRandomValues(32) 之類的密碼學原語,或者等價的 32 字節(jié)緩沖區(qū))作為 PRNG。這個 PRNG 使用你的計算機熵源 作為隨機種子來生成隨機數。在生成隨機數的時候,請一定要使用電子熵源,因為一些研究表明,人類比較不擅長選擇隨機數字(人自己選出來的數字是有模式的,到不到偽隨機的要求) -
恭喜!你現在已經是私鑰
44069413211026217191848784301459650700609417164685306780198554267270848908554 的所有者了。
我們可以使用這個私鑰生成一個比特幣或以太坊地址,或者任何以 1 至 2²⁵⁶-1 為私鑰范圍的區(qū)塊鏈的地址。
要根據這個私鑰生成一個以太坊地址,我們需要使用橢圓曲線點乘算法(需要一篇專門的文章才能講清楚)。因此,簡單起見,我們會把它交給計算機處理。為此,我們需要把這個私鑰“告訴”計算機。麻煩的是,計算機不會處理十進制形式的信息,它只能理解二進制代碼。目前,我們的只有十進制數形式的私鑰。因此,我們先要將這個私鑰從十進制數形式轉換為計算機可以理解的比特(bit,也譯成 “位” 或 “位元”)和字節(jié)(byte,一個字節(jié)等于 8 個比特)。
位和字節(jié)
在進行下一步操作之前,我們需要先了解什么是比特和字節(jié)。任何數字設備都只能理解由 0 和 1 組成的信息,通常被稱為比特。比特就是“二進制數字”,即,僅使用 1 和 0 表示的數字。雖然我們的智能手機和電腦都可以顯示漢字和圖片,還能播放歌曲,它們最終都是比特來表示并處理這些信息的。位越多,表示的信息越大,但說到底無非是一堆 0 和 1 而已。
根據上下文,多個位可以表示字符(如,在使用 ASCII 編碼時,字母 a 的定義就是 01100001)或數字(01100001 也可以用來表示十進制數 97)。在將十進制整數轉換為二進制形式時,就是將其轉換成以 2 為底數的冪之和,其中每個冪的指數遞增。例如,我們通常采用十進制形式記數,十進制數就是以 10 為底數的冪之和。因此,在使用二進制時,在 2 的N 次冪以內的整數,我們就可以用 n 個位來表示和存儲。
- 8 位電子游戲機最高能夠表達的十進制數是 255,因為它們使用的中央處理單元(CPU)最多只能執(zhí)行 8 位操作(譯者注:上圖的左邊解釋了為什么 N 個位就可以表示 2 的 N 次冪以內的數 -- 因為其數字組合有 2 的 N 次冪種可能性;右邊則演示了一個二進 制數意味著多大的整數,即相互轉換的計算規(guī)則 -
雖然我們可以使用二進制形式來表達任何數字,但是二進制形式過于“繁冗”。如果要表示 97,我們需要 8 個二進制數字。二進制數對于計算機來說很容易處理,但是不方便人類閱讀。因此,計算機通常會使用十六進制而非二進制來表示數據:位置數字系統(tǒng)以 16 為底數來表示數字。一位十六進制數可表示四位二進制數。我們可以用十六進制數 61 來表示二進制數 01100001 或十進制數 97,這樣就比二進制少了 6 位數。十六進制數使用 ABCDEF 來表示 10 至 15,通常用來縮小數據。
私鑰有多少個比特?
再說回私鑰,我們知道私鑰的范圍是 1 至 2²⁵⁶-1。我們該如何用位來表示它?需要用到多少位?如上文所述,在將十進制整數轉換為二進制形式時,就是將其轉換成以 2 為底數的冪之和。在使用 8 位二進制數時,我們能表示的最大的數是 2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰,即,整數 255。我們可以看出,要表達 2^n 以內的數,我們就需要 n 個位。由此可推得,我們需要 256 位,或者說 32 字節(jié)(256/8),來表示我們的私鑰。
- 十六進制數據表示旨在減少表示數字所需的位數。但是,計算機依然只能使用二進制來處理數據 -
如果我們一致同意需要使用 32 字節(jié)來表示我們在 [1, 2²⁵⁶-1] 范圍內的私鑰,那么在十六進制形式下,我們需要 64 個數來表示私鑰。現在,我們可以將原始私鑰
44069413211026217191848784301459650700609417164685306780198554267270848908554
轉換成十六進制形式:
616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A
看到十六進制私鑰中多出的字母 A、B、C、D、E 了嗎?看到這些字母,我們就可以輕易辨別出這個數是十六進制的。
從私鑰到公鑰
現在,我們可以把這個十六進制私鑰告訴我們的計算機了。我們可以使用 JavaScript 之類的編程語言輕松導入這個十六進制私鑰,以便用于之后的乘法運算。在以下代碼中,之前得到的十六進制數被導入作為私鑰(“sk”是 secret_key 的縮寫,是密碼學中的標準記法)。這個十六進制數是以 16 為底數的。
- 通過使用 BigNumber 庫,我們可以確保轉換過程中不會丟失任何小數。這些數字通常會被表達成指數(例如,4.406941321102622e+76),而且如果我們直接將其解析成十六進制,就會失去精度。如果不使用 BigNumber 庫,我們得到的十六進制私鑰就會變成
616e6769652e6c00000000000000000000000000000000000000000000000000 -
導入私鑰之后,下一步就是創(chuàng)建公鑰。你可能還記得,我們在第一篇文章中提到過,在獲取以太坊地址之前,我們先要通過私鑰來生成公鑰。根據以太坊黃皮書所述,公鑰生成過程遵循的是標準的 ECDSA 公鑰生成算法,其中,我們將私鑰乘以生成器點得到一個坐標,將該坐標的 x 值和 y 值前后拼在一起就是公鑰。我們的公鑰(在密碼學中記為“pk”)可以用來生成我們的以太坊地址。
- x 和 y 是使用橢圓曲線上的點乘以我們的私鑰(sk)得到的。雖然私鑰可以在任意區(qū)塊鏈中作為一個地址的唯一生成器,以 太坊專門使用橢圓曲線 secp256k1 生成公鑰;因此,私鑰的簽名操作也跟這條曲線有關 -
終于到了最后一步。有了公鑰,我們就執(zhí)行黃皮書中的最后一個操作:
給定某個私鑰,以太坊地址 A 是對應 ECDSA 公鑰的 Keccak 哈希值的最右邊 160 位。
鑒于我們已經有了自己的 ECDSA 公鑰,剩下的唯一一件事是在我們的公鑰上執(zhí)行 Keccak 哈希函數,取結果最右邊的 160 位。當我們將這些操作結果存儲在“緩沖區(qū)”(就好像存儲信息的小盒子)時,我們可以“丟掉”(切片)前 24 個十六進制數,只留下后 40 個十六進制數,或者更準確地說,20 個字節(jié)(這就是以太坊地址的長度)。
- 以太坊地址被設計為 20 個字節(jié)。有人認為刪掉一些字節(jié)(具體來說是 12 個字節(jié))可能會引起碰撞,導致兩個私鑰生成相同的以太坊地址。不過到目前為止,還沒發(fā)生過這種情況 -
你的個人專屬錢包
如你所見,只要一個數(雖然很長)就可以生成一個以太坊地址來存儲各類資產:從代表虛擬貓、磁帶、襪子和門票等物品的 NFT 到具有增值潛力的密碼學資產等等。你的以太坊地址是公開的,而且像你的家庭住址一樣,但是只能通過鑰匙打開。如果你不想自己來處理所有這些流程,你可以在 Portis 上注冊一個賬戶。Portis 會自動為你創(chuàng)建私鑰(這個私鑰只有你知道,因為它采用的是端到端加密架構)以及對應的以太坊地址,供你在 100 多個 dApp 中使用。
以太坊地址生成過程
以太坊地址生成過程如下:
1、生成 256 位隨機數作為私鑰。
2、將私鑰轉化為 secp256k1 非壓縮格式的公鑰,即 512 位的公鑰。
3、使用散列算法 Keccak256 計算公鑰的哈希值,轉化為十六進制字符串。
4、取十六進制字符串的后 40 個字母,開頭加上 0x 作為地址。
以太坊地址生成實例
生成以太坊地址過程實例數據:
私鑰:1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20
公鑰:04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d
地址:0xabcd68033A72978C1084E2d44D1Fa06DdC4A2d57
生成隨機數作為私鑰
生成 256 位隨機數:
>>> import random >>> r = random.randint(0, 2**256) >>> r 14098500174935566811277058424286341448580475958153633347646702637404947635488 >>> r.to_bytes(32, byteorder='big').hex() '1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20'
私鑰生成公鑰
以太坊使用的橢圓曲線算法為 secp256k1,從私鑰生成對應的公鑰有兩種方法:比特幣工具 bx 和 secp256k1-py 包。
使用 bx 工具生成公鑰
Mac 用戶可以使用 brew 安裝 bx 工具:
$ brew install bx
以 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 作為私鑰,然后使用 bx 工具將私鑰轉化為 secp256k1 的非壓縮格式公鑰:
$ bx ec-to-public 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 -u 04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d
使用 secp256k1-py 包生成公鑰
使用 pip 安裝:
$ pip install secp256k1
之后將私鑰轉化為公鑰:
>>> import secp256k1 >>> private_key = '1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20' >>> private_key = bytes.fromhex(private_key) >>> privkey = secp256k1.PrivateKey(private_key) >>> privkey.pubkey.serialize(compressed=False).hex() '04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d'
計算公鑰哈希值
要使用 keccak256 哈希算法,可以使用 PyCryptodome 工具,使用 pip 進行安裝:
$ pip install pycryptodome
公鑰開頭去除 04,將剩余部分轉化為字節(jié)串并使用 keccak256 算法進行哈希:
>>> from Crypto.Hash import keccak >>> keccak_hash = keccak.new(digest_bits=256) >>> public_key = '04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d'[2:] >>> public_key = bytes.fromhex(public_key) >>> keccak_hash.update(public_key) <Crypto.Hash.keccak.Keccak_Hash object at 0x102960588> >>> keccak_hash.hexdigest() '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'
得到地址
取哈希值十六進制字符串后 40 個字母,開頭加上 0x 生成最終的以太坊地址:
>>> '0x' + '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'[-40:] '0xabcd68033a72978c1084e2d44d1fa06ddc4a2d57'
以太坊地址生成 Python3 實現
使用 Python3 實現以太坊地址生成:
import secp256k1 from Crypto.Hash import keccak def get_eth_addr(private_key_str=None): if private_key_str is None: private_key = secp256k1.PrivateKey() private_key_str = private_key.serialize() else: private_key_bytes = bytes.fromhex(private_key_str) private_key = secp256k1.PrivateKey(private_key_bytes) public_key_bytes = private_key.pubkey.serialize(compressed=False) public_key_str = public_key_bytes.hex() keccak_hash = keccak.new(digest_bits=256) keccak_hash.update(public_key_bytes[1:]) h = keccak_hash.hexdigest() address = '0x' + h[-40:] return { "private_key": private_key_str, "public_key": public_key_str, "address": address }
參考資料
以太坊在線地址生成工具:可以作為以太坊靚號地址生成工具,代碼開源:https://github.com/bokub/vanity-eth。
https://pycryptodome.readthedocs.io/en/latest/src/hash/keccak.html:Keccak python 工具。
https://github.com/ctz/keccak:Python2 環(huán)境下使用的 Keccak,此為源代碼,需要自己 clone 在本地使用。
https://github.com/ludbb/secp256k1-py:secp256k1 的 Python 庫。
以上就是以太坊地址是怎么來的 以太坊地址生成過程的詳細內容,更多關于以太坊地址知識分享的資料請關注腳本之家其它相關文章!
你可能感興趣的文章
-
Mynt是什么?如何在Monad測試網上挖礦Mynt?
Mynt是一個去中心化的穩(wěn)定幣協(xié)議,允許用戶通過存入ETH或MON(Monad 的原生代幣)作為抵押品,鑄造與美元掛鉤的穩(wěn)定幣USDm,通過與 Mynt 進行測試網互動,用戶可能有機會獲…
2025-06-06 -
如何在加密貨幣交易中應用Black-Litterman模型?
Black-Litterman模型由Fischer Black和Robert Litterman于1991年在高盛開發(fā),Black-Litterman模型是加密貨幣交易和投資的強大工具,為最優(yōu)投資組合配置提供了穩(wěn)健的框架,那…
2025-06-06 -
加密貨幣交易中的諧波形態(tài):八種常用的諧波形態(tài)指南
諧波形態(tài)是依靠斐波那契比率來預示價格趨勢潛在反轉的高級圖表形態(tài),諧波形態(tài)精確且數學定義明確,使其成為重視市場預測結構化方法的交易者的最愛,在本指南中,我們將探討諧…
2025-06-06 -
區(qū)塊鏈的多層結構都有那些?L1 與 L2 有什么區(qū)別?新手完整指南
區(qū)塊鏈的多層結構都有那些?區(qū)塊鏈層:完整指南區(qū)塊鏈被稱為革命性的,但其潛力的本質在于其多層架構,這些層決定了信息在分布式網絡中的傳遞、驗證、記錄和訪問方式,從硬件…
2025-06-06 -
什么是空投挖礦?如何在2025年進行空投挖礦?
空投挖礦是指積極尋求并參與由各種加密貨幣初創(chuàng)公司或項目的創(chuàng)始人和創(chuàng)始人組織的空投活動,很多新手投資者還不了解什么是空投挖礦?如何在2025年進行空投挖礦?下文將為大…
2025-06-06 -
什么是時空證明PoSt?有什么優(yōu)勢?有哪些值得關注的項目?
Proof-of-Space-Time(PoST)是什么?Proof-of-Space-Time(PoST)有什么優(yōu)勢?時空證明PoSt有哪些值得關注的項目?下面腳本之家小編給大家詳細介紹下時空證明PoSt是什么吧…
2025-06-06 -
Solana是什么?它如何運作?與其他鏈有何不同?
Solana 是一個高性能公鏈,以其速度快、費用低和可擴展性而聞名,它于 2020 年上線,支持智能合約、去中心化應用 (dApp) 和數字資產——與以太坊類似,但速度更快、成本更低…
2025-06-05 -
SUI上排名前五的空投項目有哪些?SUI 上5大最佳空投項目
Sui近期在DEX日交易量上超越了Base,表明盡管發(fā)生了短暫震動網絡的安全事件,但用戶參與度依然強勁,即使在受到協(xié)議層漏洞影響后,生態(tài)系統(tǒng)仍展現出非凡的韌性——用戶并未…
2025-06-05 -
InfoFi與注意力經濟平臺Kaito是什么?Kaito新手使用教學
KAITO是AI驅動的Web3一站式資訊平臺,KAITO是Kaito生態(tài)關鍵代幣,生態(tài)主要交易媒介、能質押、能參與項目Launchpad、能分配獎勵,就像是注意力版本的$BNB代幣之于BNB生態(tài),下…
2025-06-05 -
什么是InfoFi?有哪些InfoFi項目值得關注?如何利用InfoFi賺錢
一個新的金融前沿正在形成——信息、注意力和數字信號成為寶貴的資產,在本文中,我們探討了什么是InfoFi,有哪些InfoFi項目值得關注以及個人在這個新的信息驅動型經濟中如…
2025-06-05