以太坊地址是怎么來(lái)的 以太坊地址生成過(guò)程
以太坊地址是怎么來(lái)的
以私鑰為原材料
生成私鑰的過(guò)程依賴(lài)于偽隨機(jī)數(shù)生成器(PRNG)和足夠大的熵。關(guān)于私鑰,最重要的一點(diǎn)是,它是從 1 到 2²⁵⁶-1 的范圍內(nèi)隨機(jī)選出的整數(shù)。只要是在這個(gè)范圍內(nèi)的數(shù),都可以用作私鑰。
既然我們已經(jīng)初步學(xué)習(xí)了私鑰背后的數(shù)學(xué)知識(shí),接下來(lái)就可以自己生成有效的私鑰了(譯者注:教育目的,可跟隨作者的思路學(xué)習(xí),但不推薦自己生成。)。我們不妨將私鑰生成過(guò)程想象成一個(gè)長(zhǎng)達(dá) 78 位的水平數(shù)字組合鎖(其可能組合數(shù)量恰好等于 2²⁵⁶-1),然后我們把這個(gè)密碼鎖分成 3 排,每排有 26 位。你可以把 PRNG 函數(shù)想象成一個(gè)會(huì)隨機(jī)打亂數(shù)字,打亂出一個(gè)數(shù)字組合的東西:一開(kāi)始每一位都是 0,然后毫無(wú)章法地在每一位上選出一個(gè)具體的數(shù)字。假設(shè)我們使用 PRNG 函數(shù)生成亂序的數(shù)字組合,得到以下三排數(shù)字:
(1) 04406941321102621719184878;
(2) 43014596507006094171646853;
(3) 06780198554267270848908554;
- 瀏覽器使用 Web Cryptography API (提供 Crypto.getRandomValues(32) 之類(lèi)的密碼學(xué)原語(yǔ),或者等價(jià)的 32 字節(jié)緩沖區(qū))作為 PRNG。這個(gè) PRNG 使用你的計(jì)算機(jī)熵源 作為隨機(jī)種子來(lái)生成隨機(jī)數(shù)。在生成隨機(jī)數(shù)的時(shí)候,請(qǐng)一定要使用電子熵源,因?yàn)橐恍┭芯勘砻鳎祟?lèi)比較不擅長(zhǎng)選擇隨機(jī)數(shù)字(人自己選出來(lái)的數(shù)字是有模式的,到不到偽隨機(jī)的要求) -
恭喜!你現(xiàn)在已經(jīng)是私鑰
44069413211026217191848784301459650700609417164685306780198554267270848908554 的所有者了。
我們可以使用這個(gè)私鑰生成一個(gè)比特幣或以太坊地址,或者任何以 1 至 2²⁵⁶-1 為私鑰范圍的區(qū)塊鏈的地址。
要根據(jù)這個(gè)私鑰生成一個(gè)以太坊地址,我們需要使用橢圓曲線(xiàn)點(diǎn)乘算法(需要一篇專(zhuān)門(mén)的文章才能講清楚)。因此,簡(jiǎn)單起見(jiàn),我們會(huì)把它交給計(jì)算機(jī)處理。為此,我們需要把這個(gè)私鑰“告訴”計(jì)算機(jī)。麻煩的是,計(jì)算機(jī)不會(huì)處理十進(jìn)制形式的信息,它只能理解二進(jìn)制代碼。目前,我們的只有十進(jìn)制數(shù)形式的私鑰。因此,我們先要將這個(gè)私鑰從十進(jìn)制數(shù)形式轉(zhuǎn)換為計(jì)算機(jī)可以理解的比特(bit,也譯成 “位” 或 “位元”)和字節(jié)(byte,一個(gè)字節(jié)等于 8 個(gè)比特)。
位和字節(jié)
在進(jìn)行下一步操作之前,我們需要先了解什么是比特和字節(jié)。任何數(shù)字設(shè)備都只能理解由 0 和 1 組成的信息,通常被稱(chēng)為比特。比特就是“二進(jìn)制數(shù)字”,即,僅使用 1 和 0 表示的數(shù)字。雖然我們的智能手機(jī)和電腦都可以顯示漢字和圖片,還能播放歌曲,它們最終都是比特來(lái)表示并處理這些信息的。位越多,表示的信息越大,但說(shuō)到底無(wú)非是一堆 0 和 1 而已。
根據(jù)上下文,多個(gè)位可以表示字符(如,在使用 ASCII 編碼時(shí),字母 a 的定義就是 01100001)或數(shù)字(01100001 也可以用來(lái)表示十進(jìn)制數(shù) 97)。在將十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制形式時(shí),就是將其轉(zhuǎn)換成以 2 為底數(shù)的冪之和,其中每個(gè)冪的指數(shù)遞增。例如,我們通常采用十進(jìn)制形式記數(shù),十進(jìn)制數(shù)就是以 10 為底數(shù)的冪之和。因此,在使用二進(jìn)制時(shí),在 2 的N 次冪以?xún)?nèi)的整數(shù),我們就可以用 n 個(gè)位來(lái)表示和存儲(chǔ)。
- 8 位電子游戲機(jī)最高能夠表達(dá)的十進(jìn)制數(shù)是 255,因?yàn)樗鼈兪褂玫闹醒胩幚韱卧–PU)最多只能執(zhí)行 8 位操作(譯者注:上圖的左邊解釋了為什么 N 個(gè)位就可以表示 2 的 N 次冪以?xún)?nèi)的數(shù) -- 因?yàn)槠鋽?shù)字組合有 2 的 N 次冪種可能性;右邊則演示了一個(gè)二進(jìn) 制數(shù)意味著多大的整數(shù),即相互轉(zhuǎn)換的計(jì)算規(guī)則 -
雖然我們可以使用二進(jìn)制形式來(lái)表達(dá)任何數(shù)字,但是二進(jìn)制形式過(guò)于“繁冗”。如果要表示 97,我們需要 8 個(gè)二進(jìn)制數(shù)字。二進(jìn)制數(shù)對(duì)于計(jì)算機(jī)來(lái)說(shuō)很容易處理,但是不方便人類(lèi)閱讀。因此,計(jì)算機(jī)通常會(huì)使用十六進(jìn)制而非二進(jìn)制來(lái)表示數(shù)據(jù):位置數(shù)字系統(tǒng)以 16 為底數(shù)來(lái)表示數(shù)字。一位十六進(jìn)制數(shù)可表示四位二進(jìn)制數(shù)。我們可以用十六進(jìn)制數(shù) 61 來(lái)表示二進(jìn)制數(shù) 01100001 或十進(jìn)制數(shù) 97,這樣就比二進(jìn)制少了 6 位數(shù)。十六進(jìn)制數(shù)使用 ABCDEF 來(lái)表示 10 至 15,通常用來(lái)縮小數(shù)據(jù)。
私鑰有多少個(gè)比特?
再說(shuō)回私鑰,我們知道私鑰的范圍是 1 至 2²⁵⁶-1。我們?cè)撊绾斡梦粊?lái)表示它?需要用到多少位?如上文所述,在將十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制形式時(shí),就是將其轉(zhuǎn)換成以 2 為底數(shù)的冪之和。在使用 8 位二進(jìn)制數(shù)時(shí),我們能表示的最大的數(shù)是 2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰,即,整數(shù) 255。我們可以看出,要表達(dá) 2^n 以?xún)?nèi)的數(shù),我們就需要 n 個(gè)位。由此可推得,我們需要 256 位,或者說(shuō) 32 字節(jié)(256/8),來(lái)表示我們的私鑰。
- 十六進(jìn)制數(shù)據(jù)表示旨在減少表示數(shù)字所需的位數(shù)。但是,計(jì)算機(jī)依然只能使用二進(jìn)制來(lái)處理數(shù)據(jù) -
如果我們一致同意需要使用 32 字節(jié)來(lái)表示我們?cè)?[1, 2²⁵⁶-1] 范圍內(nèi)的私鑰,那么在十六進(jìn)制形式下,我們需要 64 個(gè)數(shù)來(lái)表示私鑰?,F(xiàn)在,我們可以將原始私鑰
44069413211026217191848784301459650700609417164685306780198554267270848908554
轉(zhuǎn)換成十六進(jìn)制形式:
616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A
看到十六進(jìn)制私鑰中多出的字母 A、B、C、D、E 了嗎?看到這些字母,我們就可以輕易辨別出這個(gè)數(shù)是十六進(jìn)制的。
從私鑰到公鑰
現(xiàn)在,我們可以把這個(gè)十六進(jìn)制私鑰告訴我們的計(jì)算機(jī)了。我們可以使用 JavaScript 之類(lèi)的編程語(yǔ)言輕松導(dǎo)入這個(gè)十六進(jìn)制私鑰,以便用于之后的乘法運(yùn)算。在以下代碼中,之前得到的十六進(jìn)制數(shù)被導(dǎo)入作為私鑰(“sk”是 secret_key 的縮寫(xiě),是密碼學(xué)中的標(biāo)準(zhǔn)記法)。這個(gè)十六進(jìn)制數(shù)是以 16 為底數(shù)的。
- 通過(guò)使用 BigNumber 庫(kù),我們可以確保轉(zhuǎn)換過(guò)程中不會(huì)丟失任何小數(shù)。這些數(shù)字通常會(huì)被表達(dá)成指數(shù)(例如,4.406941321102622e+76),而且如果我們直接將其解析成十六進(jìn)制,就會(huì)失去精度。如果不使用 BigNumber 庫(kù),我們得到的十六進(jìn)制私鑰就會(huì)變成
616e6769652e6c00000000000000000000000000000000000000000000000000 -
導(dǎo)入私鑰之后,下一步就是創(chuàng)建公鑰。你可能還記得,我們?cè)诘谝黄恼轮刑岬竭^(guò),在獲取以太坊地址之前,我們先要通過(guò)私鑰來(lái)生成公鑰。根據(jù)以太坊黃皮書(shū)所述,公鑰生成過(guò)程遵循的是標(biāo)準(zhǔn)的 ECDSA 公鑰生成算法,其中,我們將私鑰乘以生成器點(diǎn)得到一個(gè)坐標(biāo),將該坐標(biāo)的 x 值和 y 值前后拼在一起就是公鑰。我們的公鑰(在密碼學(xué)中記為“pk”)可以用來(lái)生成我們的以太坊地址。
- x 和 y 是使用橢圓曲線(xiàn)上的點(diǎn)乘以我們的私鑰(sk)得到的。雖然私鑰可以在任意區(qū)塊鏈中作為一個(gè)地址的唯一生成器,以 太坊專(zhuān)門(mén)使用橢圓曲線(xiàn) secp256k1 生成公鑰;因此,私鑰的簽名操作也跟這條曲線(xiàn)有關(guān) -
終于到了最后一步。有了公鑰,我們就執(zhí)行黃皮書(shū)中的最后一個(gè)操作:
給定某個(gè)私鑰,以太坊地址 A 是對(duì)應(yīng) ECDSA 公鑰的 Keccak 哈希值的最右邊 160 位。
鑒于我們已經(jīng)有了自己的 ECDSA 公鑰,剩下的唯一一件事是在我們的公鑰上執(zhí)行 Keccak 哈希函數(shù),取結(jié)果最右邊的 160 位。當(dāng)我們將這些操作結(jié)果存儲(chǔ)在“緩沖區(qū)”(就好像存儲(chǔ)信息的小盒子)時(shí),我們可以“丟掉”(切片)前 24 個(gè)十六進(jìn)制數(shù),只留下后 40 個(gè)十六進(jìn)制數(shù),或者更準(zhǔn)確地說(shuō),20 個(gè)字節(jié)(這就是以太坊地址的長(zhǎng)度)。
- 以太坊地址被設(shè)計(jì)為 20 個(gè)字節(jié)。有人認(rèn)為刪掉一些字節(jié)(具體來(lái)說(shuō)是 12 個(gè)字節(jié))可能會(huì)引起碰撞,導(dǎo)致兩個(gè)私鑰生成相同的以太坊地址。不過(guò)到目前為止,還沒(méi)發(fā)生過(guò)這種情況 -
你的個(gè)人專(zhuān)屬錢(qián)包
如你所見(jiàn),只要一個(gè)數(shù)(雖然很長(zhǎng))就可以生成一個(gè)以太坊地址來(lái)存儲(chǔ)各類(lèi)資產(chǎn):從代表虛擬貓、磁帶、襪子和門(mén)票等物品的 NFT 到具有增值潛力的密碼學(xué)資產(chǎn)等等。你的以太坊地址是公開(kāi)的,而且像你的家庭住址一樣,但是只能通過(guò)鑰匙打開(kāi)。如果你不想自己來(lái)處理所有這些流程,你可以在 Portis 上注冊(cè)一個(gè)賬戶(hù)。Portis 會(huì)自動(dòng)為你創(chuàng)建私鑰(這個(gè)私鑰只有你知道,因?yàn)樗捎玫氖嵌说蕉思用芗軜?gòu))以及對(duì)應(yīng)的以太坊地址,供你在 100 多個(gè) dApp 中使用。
以太坊地址生成過(guò)程
以太坊地址生成過(guò)程如下:
1、生成 256 位隨機(jī)數(shù)作為私鑰。
2、將私鑰轉(zhuǎn)化為 secp256k1 非壓縮格式的公鑰,即 512 位的公鑰。
3、使用散列算法 Keccak256 計(jì)算公鑰的哈希值,轉(zhuǎn)化為十六進(jìn)制字符串。
4、取十六進(jìn)制字符串的后 40 個(gè)字母,開(kāi)頭加上 0x 作為地址。
以太坊地址生成實(shí)例
生成以太坊地址過(guò)程實(shí)例數(shù)據(jù):
私鑰:1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20
公鑰:04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d
地址:0xabcd68033A72978C1084E2d44D1Fa06DdC4A2d57
生成隨機(jī)數(shù)作為私鑰
生成 256 位隨機(jī)數(shù):
>>> import random >>> r = random.randint(0, 2**256) >>> r 14098500174935566811277058424286341448580475958153633347646702637404947635488 >>> r.to_bytes(32, byteorder='big').hex() '1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20'
私鑰生成公鑰
以太坊使用的橢圓曲線(xiàn)算法為 secp256k1,從私鑰生成對(duì)應(yīng)的公鑰有兩種方法:比特幣工具 bx 和 secp256k1-py 包。
使用 bx 工具生成公鑰
Mac 用戶(hù)可以使用 brew 安裝 bx 工具:
$ brew install bx
以 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 作為私鑰,然后使用 bx 工具將私鑰轉(zhuǎn)化為 secp256k1 的非壓縮格式公鑰:
$ bx ec-to-public 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 -u 04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d
使用 secp256k1-py 包生成公鑰
使用 pip 安裝:
$ pip install secp256k1
之后將私鑰轉(zhuǎn)化為公鑰:
>>> import secp256k1 >>> private_key = '1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20' >>> private_key = bytes.fromhex(private_key) >>> privkey = secp256k1.PrivateKey(private_key) >>> privkey.pubkey.serialize(compressed=False).hex() '04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d'
計(jì)算公鑰哈希值
要使用 keccak256 哈希算法,可以使用 PyCryptodome 工具,使用 pip 進(jìn)行安裝:
$ pip install pycryptodome
公鑰開(kāi)頭去除 04,將剩余部分轉(zhuǎn)化為字節(jié)串并使用 keccak256 算法進(jìn)行哈希:
>>> 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'
得到地址
取哈希值十六進(jìn)制字符串后 40 個(gè)字母,開(kāi)頭加上 0x 生成最終的以太坊地址:
>>> '0x' + '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'[-40:] '0xabcd68033a72978c1084e2d44d1fa06ddc4a2d57'
以太坊地址生成 Python3 實(shí)現(xiàn)
使用 Python3 實(shí)現(xiàn)以太坊地址生成:
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 }
參考資料
以太坊在線(xiàn)地址生成工具:可以作為以太坊靚號(hào)地址生成工具,代碼開(kāi)源: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 庫(kù)。
以上就是以太坊地址是怎么來(lái)的 以太坊地址生成過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于以太坊地址知識(shí)分享的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
你可能感興趣的文章
-
虛擬貨幣怎么玩?虛擬貨幣賺錢(qián)的15種方法詳解
虛擬貨幣作為一個(gè)新興市場(chǎng),存在許多機(jī)會(huì),這是眾所周知的,然而,許多人把虛擬貨幣投資等同于交易,其實(shí)并不是,交易只是虛擬貨幣玩法的一種,還有許多其他的虛擬貨幣投資方…
2025-07-24 -
虛擬貨幣排名,值得推薦的虛擬貨幣有哪些?虛擬貨幣如何選擇?
在目前各類(lèi)金融資產(chǎn)異常波動(dòng)的情況下,除黃金外,虛擬貨幣也成了越來(lái)越多人投資避險(xiǎn)的選擇,畢竟它的保密性、流動(dòng)性都是更方便的,是資產(chǎn)配置中不可忽視的標(biāo)的,但虛擬貨幣…
2025-07-24 -
GameFi是什么?有哪些項(xiàng)目類(lèi)型?2025熱門(mén)GameFi項(xiàng)目盤(pán)點(diǎn)
GameFi意思是用區(qū)塊鏈技術(shù)把游戲中的虛擬寶物、游戲貨幣轉(zhuǎn)成NFT和加密貨幣,讓人可以在加密貨幣交易所自由交易,本文將介紹GameFi是什么,有哪些項(xiàng)目類(lèi)型、優(yōu)點(diǎn)、缺點(diǎn)以及目…
2025-07-24 -
如何使用ChatGPT 和Grok AI 分析鏈上數(shù)據(jù)、鯨魚(yú)動(dòng)向?一文解析
在加密貨幣領(lǐng)域,速度不僅是優(yōu)勢(shì),它是生存的關(guān)鍵, 有個(gè)問(wèn)題:當(dāng)技術(shù)指標(biāo)如相對(duì)強(qiáng)弱指數(shù)(RSI)或移動(dòng)平均匯聚擴(kuò)散(MACD)反應(yīng)過(guò)來(lái)時(shí),鯨魚(yú)已經(jīng)撤退了,那么,如何使用ChatGPT …
2025-07-24 -
一文速覽加密牛市周期:本輪牛市何時(shí)結(jié)束?
加密市場(chǎng)似乎正進(jìn)入活躍增長(zhǎng)階段,比特幣價(jià)格上揚(yáng),帶動(dòng)了整個(gè)加密市場(chǎng)的上漲,但每位投資者都會(huì)問(wèn)一個(gè)問(wèn)題:牛市何時(shí)結(jié)束,何時(shí)鎖定利潤(rùn)?或許市場(chǎng)周期和流動(dòng)性層級(jí)可以提供…
2025-07-24 -
什么是流動(dòng)性質(zhì)押代幣?如何運(yùn)作?新手指南
隨著加密貨幣生態(tài)系統(tǒng)的不斷發(fā)展,新的金融工具正在改變交易者賺取收益和參與區(qū)塊鏈安全的方式,流動(dòng)性質(zhì)押代幣 (LST) 就是其中一項(xiàng)創(chuàng)新,它為那些希望在不鎖定資產(chǎn)的情況下…
2025-07-24 -
2025年最適合使用的Memecoin Launchpad有哪些?最佳Memecoin Launchpad
最佳的 memecoin 發(fā)行平臺(tái)正在改變 2025 年 meme 代幣的上線(xiàn)方式,使創(chuàng)作者無(wú)需任何編程技能即可發(fā)行代幣,并最大限度地提升社區(qū)影響力,在本指南中,我們將探索 2025 年最…
2025-07-23 -
流動(dòng)性挖礦和質(zhì)押挖礦有什么不同?之間的區(qū)別和聯(lián)系介紹
流動(dòng)性挖礦和質(zhì)押挖礦是兩種常見(jiàn)的加密貨幣挖礦方式,它們雖然都涉及通過(guò)鎖定加密資產(chǎn)來(lái)獲得獎(jiǎng)勵(lì),但其操作機(jī)制、目的和收益方式有所不同,下文將為大家詳細(xì)介紹流動(dòng)性挖礦…
2025-07-23 -
2025年中心化交易所的加密貨幣流動(dòng)性五大亮點(diǎn)
流動(dòng)性已成為衡量加密資產(chǎn)的關(guān)鍵指標(biāo),它不僅影響著交易的便捷性,還影響著波動(dòng)性、滑點(diǎn)以及機(jī)構(gòu)吸引力,本報(bào)告探討了領(lǐng)先的中心化交易所的交易深度,重點(diǎn)關(guān)注窄幅價(jià)格區(qū)間,以…
2025-07-22 -
什么是鏈?鏈?zhǔn)窃趺催\(yùn)作的?區(qū)塊鏈網(wǎng)絡(luò)的全面介紹
在快速發(fā)展的加密貨幣和去中心化金融世界中,理解什么是鏈——通常簡(jiǎn)單地稱(chēng)為“鏈”或區(qū)塊鏈網(wǎng)絡(luò)——是基礎(chǔ),無(wú)論你是在跟蹤下一個(gè)空投、探索加密市場(chǎng),還是深入了解區(qū)塊鏈…
2025-07-22