科普 | 以太坊地址

買賣虛擬貨幣

免責宣告:本文中涉及的所有私鑰僅用於教育目的。請勿使用本文中共享的任何程式碼、金鑰或地址來持有任何型別或數量的加密資產。

私鑰作為原材料

正如的第一篇文章“瞭解私鑰”中提到的,生成私鑰的過程依賴於偽隨機數生成器(PRNG)和足夠大的熵。關於私鑰,需要記住的最重要的一點是,它是從 1 到 2²⁵⁶-1 的範圍內隨機選出的整數。只要是在這個範圍內的數,都可以用作私鑰。

既然我們已經瞭解了私鑰背後的一些數學原理,我們就可以繼續生成我們自己的有效私鑰了。我們不妨將私鑰生成過程想象成一個長達 78 位的水平數字組合鎖(其可能組合數量恰好等於 2²⁵⁶-1),然後我們把這個密碼鎖分成 3 排,每排有 26 位。

你可以把 PRNG 函式想象成一個會隨機打亂數字,打亂出一個數字組合的東西:從 0 開始,然後選擇一個沒有任何可區分模式的數字。假設我們使用 PRNG 函式生成亂序的數字組合,得到以下三排數字:

(1)04406941321102621719184878;
(2)43014596507006094171646853;
(3)06780198554267270848908554;

瀏覽器使用 Web Cryptoography API,這是一種現代的API,它為我們提供 Crypto.getRandomValues(32)等加密原語(或相當於建立一個32位元組的緩衝區)作為 PRNG,它與您的計算機熵源一起播種以生成隨機數。正如一些研究表明的那樣,你應該總是使用數字源來生成隨機數,因為人類比較不擅長選擇隨機數字。

恭喜!您現在是私鑰的合法所有者:

44069413211026217191848784301459650700609417164685306780198554267270848908554

我們現在可以使用它來生成比特幣或以太坊地址,或者任何以 1 至 2²⁵⁶-1 為私鑰範圍的區塊鏈的地址。

要從這個私鑰生成一個以太坊地址,我們需要進行橢圓曲線點乘法,這可能是一篇單獨的文章。所以,為了方便起見,我們將使用一臺計算機,並讓它為我們做這件事。

要做到這一點,我們需要“告訴”計算機這個私鑰。但不幸的是,計算機不處理十進位制格式的資訊。計算機只理解二進位制碼,到目前為止,我們只有十進位制數字形式的私鑰。

因此,要使用我們的私鑰,我們需要首先將十進位制數值轉換成計算機可以理解的東西:位和位元組。

位和位元組

在繼續使用私鑰之前,我們需要了解位和位元組。任何數字裝置都只能使用數字 0 和 1(通常稱為位)來理解資訊。位是“二進位制數字”,即表示為 1 或 0 的數字。

雖然我們的智慧手機和計算機可以顯示字元、影象、歌曲等,但計算機最終將所有內容表示和處理為位元。更直截了當地說,位組代表更大的事物,但它們始終只是一堆 0 和 1。

根據使用的上下文,多個位可以表示字元(例如,字母a可以使用ASCII碼定義為01100001)或數字(即,相同的值01100001表示十進位制格式的數字97)。在將十進位制整數轉換為二進位制形式時,就是將其轉換成以 2 為底數的冪之和,其中每個冪的指數遞增。

例如,我們通常以十進位制格式計數,其中數字表示為使用的所有數字的冪的和,使用數字 10 作為基數。然而,使用二進位制時,我們可以將數字表示為 2 的 N 次方,其中“n”是在計算機中表示和儲存該資訊所需的位數。

8 位電子遊戲最高能夠表達的十進位制數是 255,因為其中使用的計算機處理單元(CPU)只能執行最多 8 位的操作。

雖然我們可以用二進位制格式表示任何數字,但二進位制格式相當“繁冗”。僅表示97,我們就需要 8 個二進位制數字。二進位制數對計算機來說很容易處理,但是不方便人類閱讀。

因此,計算機通常不使用二進位制格式來表示資料,而是使用十六進位制格式:位置數字系統以 16 為底數來表示數字。與二進位制格式不同,我們可以用十六進位制格式在單個字母中表示 4 位。

我們可以用十六進位制數 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 位元組(256/8),來表示我們的私鑰。

十六進位制資料表示是為了減少表示數字所需的位數。但是,計算機依然只能使用二進位制來處理資料。

如果我們同意需要 32 個位元組來表示[1,2²⁵⁶-1]私鑰,那麼使用十六進位制格式,我們就可以同意需要 64 個字元來表示私鑰。我們現在可以將原始私鑰:

44069413211026217191848784301459650700609417164685306780198554267270848908554

轉換成十六進位制形式:

616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A

看到十六進位制私鑰中多出的字母 A、B、C、D、E 了嗎?這些字母的存在是識別數字是否以十六進位制格式表示的一種簡單方法。

從私鑰到公鑰

現在,我們可以使用十六進位制格式告訴計算機有關私鑰的資訊。使用 JavaScript 等程式語言,我們可以輕鬆地以可用於進一步乘法的格式匯入私鑰。

在下面的程式碼中,我們定義了我們的私鑰(SECRET_KEY的“SK”,這是密碼學中使用的一種標準表示法),以匯入前面定義的十六進位制值。我們使用 16 的底數來提供十六進位制格式。

使用BigNumber庫,我們可以確保在轉換過程中不會丟失小數。這些數字通常表示為指數(例如,4.406941321102622e+76),當直接解析為十六進位制時,會失去精度。如果不使用BigNumber,我們得到的十六進位制私鑰就會變成

616e6769652e6c00000000000000000000000000000000000000000000000000

匯入私鑰之後,下一步是建立公鑰。您可能還記得我們的第一篇文章,我們需要從在獲取以太坊地址之前,我們先要透過私鑰來生成公鑰。

按照以太坊的黃皮書中的所述,公鑰生成過程遵循的是標準的 ECDSA 公鑰生成演算法,其中,我們將私鑰乘以生成器點得到一個座標,將該座標的 x 值和 y 值前後拼在一起就是公鑰。我們的公鑰(在密碼學中記為“pk”)可以用來生成我們的以太坊地址。

x 和 y 的值由我們的私鑰(sk)乘橢圓曲線點得到。儘管私鑰可以在任何區塊鏈中用作地址的唯一生成器,但以太坊在使用橢圓曲線 secp256k1 生成公鑰;因此,私鑰的簽名操作也跟這條曲線有關。

最後一步。定義了公鑰後,我們可以執行黃皮書中的最後一條指令,定義如下:對於給定的私鑰,以太坊地址 A 被定義為對應的 ECDSA 公鑰的 Keccak 雜湊值的最右 160 位。

鑑於我們已經有了我們的 ECDSA 公鑰,剩下的唯一事情就是對我們的公鑰執行 Keccak 雜湊函式,並從這個操作中獲得最右邊的 160 位。

當我們將這些操作儲存在“緩衝區”中時(想想我們用來儲存位元組資訊的小盒子),我們可以簡單地“刪除”(切片)前 24 個十六進位制數,只留下 40 個十六進位制數,或者更具體地說,20 個位元組,相當於一個以太坊地址的大小。

乙太網地址設計為 20 位元組。透過刪除一些位元組(準確地說是12個位元組),可能會發生衝突,即兩個私鑰最終生成相同的以太坊地址。然而,到今天為止,這還沒有發生。

你的個人專屬錢包

正如您所看到的,從單個數字(儘管很長),您可以獲得一個以太地址,您可以在其中持有各種資產:從代表小貓、磁帶、襪子、門票等的 NFT 到具有增值潛力的密碼學資產等等。

您的以太坊地址是公開的,而且像您的家庭住址一樣,它將您連線到唯一的私鑰。

在本系列下一篇中,我們將介紹如何使用私鑰來建立並廣播交易、簽署訊息,以及這些簽名在以太坊生態中有什麼影響。

End

非常感謝您對 IPFS&Filecoin 專案的持續支援。我們很高興繼續與您一起,為人類資訊建立一個強大的,去中心化和高效的基礎。

FilCloud 幫你迅速瞭解 IPFS 領域的熱點技術和應用公眾號:filcloud

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读