Addresses
任何 40 個字元的十六進製字元串都是有效的乙太坊地址嗎?
我知道一個乙太坊地址是通過獲取公鑰的 keccak-256 散列的最後 20 個字節生成的,即 40 個十六進制數字。我也知道,一個地址不需要有與之關聯的交易才有效,它只需要由 keccak-256 生成。這是否意味著任何 40 個字元的十六進製字元串都是有效地址,或者是否有一些 keccak-256 永遠不會生成的安排?
沒有人可以為這個問題的答案提供證據。我將嘗試解釋原因。創建地址的算法如下:
1)生成私鑰k(略小於2^256個密鑰,實際上是曲線secp256k1上的2^256 - 4294968273)
- 使用曲線 secp256k1 上的橢圓曲線標量乘法從 k 導出公鑰 P = (x,y): P = G * k = G * … * G (k 次)
請注意此時您的公鑰是 512 位長,但幾乎沒有使用整個數字範圍,可以生成少於 2^256 個點。
使用 keccak256 從 P 散列連接 x 和 y 座標(將 512 位映射到 256 位)
從雜湊中取出最低有效的 160 位,這是您的地址。
直到第 3 步,答案才能被證明。在這種情況下答案是否定的,證明:由於我們將少於 2^256 個數字映射到 2^256 個數字(非滿射映射),因此並非目標集(共域)中的每個數字都可以被命中。第 4 步使一切都無法證明:我們在 2^512 到 2^160 的數字範圍內映射少於 2^256 個數字。乍一看,這個映射看起來是滿射的,在這種情況下,我們會回答是。我們不知道2^512這個數字範圍內的幾乎2^256個數字是如何分佈的。即使我們知道分佈,我們仍然不知道這些數字映射到哪個 keccak 散列。證明它的唯一方法是暴力破解所有公鑰,一個一個地計算 keccak 雜湊並從中獲取地址,查找我們是否已經儲存了它,
這個答案到目前為止還不是最優的,但我希望它至少可以幫助你理解這個問題的難度。