區塊鏈研究實驗室 | 如何用比特幣私鑰創建以太坊地址

在區塊鏈的錢包中,私鑰可以產生出公鑰,而反過來要想從公鑰推算出私鑰則是不可能的。用公鑰加密的信息可以用私鑰來解密,而用私鑰簽名的信息則由公鑰來驗證,驗證通過後才能證明該信息確實為私鑰持有人所發佈。以 BTC 為例的話,在這個過程中最重要的角色的就是" 橢圓曲線加密算法"。

有些人會以為 BTC 跟 ETH 是不同的鏈所以用的橢圓曲線並不相同,但事實上兩個鏈使用的都是相同的 secp256k1 曲線,所以獲得公鑰的方式完全一樣,差別在從公鑰生成地址的過程,接下來我們會先介紹如何安全的生成私鑰,然後說明 ETH 如何從地址驗證由私鑰生成的公鑰。

私鑰的規格

私鑰必須為正整數且必須小於 secp256k1 曲線的階 (secp256k1 的階為FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141),每個點可由一組 256位代表,而 256 位正好是 32 個字節,所以我們需要提供這個曲線算法 32 個字節的數據。

換句話說,BTC 及 ETH的私鑰都是一組 32 字節的字符串,但它也可以是二進制字符串、Base64字符串、WIF 密鑰、助記碼( mnemonic phrase )、十六進制字符串。

區塊鏈研究實驗室 | 如何用比特幣私鑰創建以太坊地址

安全的私鑰生成

既然都知道他們使用的是同一條曲線,那我們其實就可以使用 BTC 社群比較信任的 bitaddress.org 來生成我們的私鑰,(用 MEW 或 Metamask 也都是不錯的選擇,至少他可以不是一串裸露在外的私鑰),但如果有良好安全意識的話,我們甚至不應該用瀏覽器來生成我們重要的私鑰 (可以看看 Reddit 上的討論),所以我們將用 python 設計一個更簡單的 bitaddress。

瞭解 Bitaddress原理

Bitaddress 做了三件事情。首先,初始化字節數組,然後嘗試從用戶的計算機獲得儘可能多的熵,根據用戶的輸入填滿數組,最後生成私鑰。

Bitaddress 使用 256 字節的數組來存儲熵。這個數組是被循環覆寫的,所以當數組第一次填滿時,索引變為零,然後覆寫過程再次開始。

程序從 window.crypto 生成一個 256 字節的數組。然後寫入一個時間戳來獲得 4 個字節的熵。在這之後,它獲得一些其他的數據包括屏幕大小,時區,瀏覽器擴充套件,地區等。來獲得另外 6 個字節。

初始化後,使用者持續輸入來覆寫初始字節。當移動光標時,程序會寫入光標的位置。當按下按鈕時,程序會寫入按下的按鈕的字符代碼。

最後,bitaddress 使用累積的熵來生成私鑰。bitaddress 使用名為 ARC4 的 RNG算法。用當前時間以及收集的熵初始化ARC4,然後逐個取得字節,總共取 32 次。

初始化我們自己的種子池

我們從加密 RNG 和時間戳中寫入一些字節。__seed_int 以及__seed_byte是將熵插入池的數組中的兩個函式,而我們使用secrets生成我們的隨機數。

區塊鏈研究實驗室 | 如何用比特幣私鑰創建以太坊地址

由輸入填充種子池

這裡我們先寫入一個時間戳,然後寫入用戶輸入的字符串。

區塊鏈研究實驗室 | 如何用比特幣私鑰創建以太坊地址

生成私鑰

首先使用我們的池生成 32 位的數字,並確保我們的私鑰在範圍內(1, CURVE_ORDER),然後為了方便,我們轉為十六進制並刪除 0x 的部分。

區塊鏈研究實驗室 | 如何用比特幣私鑰創建以太坊地址

生成ETH公鑰

將我們剛剛的私鑰代入橢圓曲線,我們會得到一個 64 字節的整數,它是兩個 32 字節的整數,代表橢圓曲線上連接在一起的 X 點和 Y 點。

區塊鏈研究實驗室 | 如何用比特幣私鑰創建以太坊地址

校驗和 (ERC-55)

比特幣通過將公鑰哈希後並獲得回傳值的前 4 個字節來創建校驗和,如果不添加校驗和則無法獲得有效地址。

但以太坊一開始並沒有校驗和機制來驗證公鑰的完整性。直到 Vitalik Buterin 在 2016 年時引入了校驗和機制,也就是 EIP-55,並且後來被各家錢包和交易所採用。

將校驗和添加到以太坊錢包地址使其區分大小寫

首先,獲得地址的 Keccak-256 哈希值。需要注意的是,將此地址傳遞至哈希函數時不能有0x的部分。

其次,依序迭代初始地址的字節。如果哈希值的第 i 個字節大於或等於 8,則將第 i 個地址的字符轉換為大寫,否則將其保留為小寫。

最後,在回傳的字符串開頭加回0x。如果忽略大小寫,校驗和地址會與初始地址相同。但使用大寫字母的地址讓任何人都能檢驗地址是否有效。

此校驗和有幾個好處:

1. 向後兼容許多接受混合大小寫的十六進制解析器,將來也能輕鬆引入;

2. 保持長度為 40 個字符;

3. 平均每個地址將有 15 個校驗位,如果輸入錯誤,隨機生成的地址意外通過檢查的淨概率將為0.0247%,雖然不如 4 字節的校驗代碼好,但比 ICAP 提高了約 50 倍;

區塊鏈研究實驗室 | 如何用比特幣私鑰創建以太坊地址

總結

為以太坊創建錢包地址相較於比特幣簡單得多。我們需要做的就只是將私鑰丟到橢圓曲線,然後再把得到的公鑰丟到Keccak-256,最後擷取該哈希值的後面 20 個字節。

相關推薦

推薦中...