Solidity
我可以輕鬆生成沒有私鑰的公共地址嗎?
我在這裡陳述的一些事實可能是錯誤的,因此請在必要時糾正我。
我的理解:
- 私鑰 - 256 位
- 公鑰 - 256 位
- 公共地址 - 公鑰的最後 160 位
- 每個私鑰都映射到一個公鑰,因此映射到一個公共地址
以上事實暗示了一些私鑰映射到同一個公共地址,但它們並不意味著一些私鑰映射到同一個公鑰。
我想問以下問題:
- 對於某些私鑰是否映射到同一個公鑰,我們是否有任何其他知識,因此,某些公鑰沒有映射到它們的私鑰?
- 如果上述問題的答案是肯定的,那麼有可能某些公共地址沒有映射到它們的私鑰。我們是否知道任何這樣的地址,或者它們是否存在?
我提出這個問題的動機是,我有一個 ERC20 合約,有時(取決於目前狀態)會鑄造額外數量的代幣,這些代幣稍後將分配給(即轉移給)一些使用者。
現在,我需要一些地址來保存這些代幣,但我希望避免有人擁有該地址的私鑰的情況(儘管機會很小)。
目前,我正在生成這個地址如下:
address public constant MINTING_ACCOUNT = address(keccak256("MINTING_ACCOUNT"));
理想情況下,我想用一個沒有私鑰的常量地址替換它。
謝謝!
TLDR:使用地址
0
。
- 根據您對私鑰的定義,是或否。公鑰是通過標量橢圓曲線乘法從私鑰生成的。
P = k * G
我們知道生成器的順序
G
是n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
所以
k
範圍內的每一個都[0, n)
給出了一個唯一的公鑰。有時人們說私鑰只是一個隨機的 256 位數字,但私鑰是等價的 modn
,略小於2^256
. 例如私鑰k
和n+k
將給出相同的公鑰。如果您將“公鑰”定義為任何 512 位整數,那麼顯然幾乎所有這些都沒有關聯的私鑰。(只有
n < 2^256
不同的私鑰)。
- 是否存在沒有私鑰的地址是一個完全獨立的問題。本質上,您想知道是否有一個 20 字節的字元串,使得沒有 keccak256 散列以該後綴結尾。答案是沒有人知道,但可能不知道。密碼散列的設計正是為了避免在其輸出中出現這類非平凡的模式,如果這樣的字元串被發現,這將是一個重大缺陷。
總而言之,沒有。沒有“安全地址”。另一方面,正如許多其他人指出的那樣,猜到與
0
地址對應的私鑰的機率幾乎是2^-160
. 這永遠不會發生。請注意,我並不是說“這可能永遠不會發生”,因為人類往往不擅長推理大數字。我說“2^160 中有 1”的機會,而你說“所以有機會?”這個機會比網路上每台電腦自燃的機率都低。沒有機會。
所以我們看到唯一的選擇是“隨機”選擇一個地址。您似乎想選擇一個由某個字元串的雜湊生成的地址。我認為您應該改用該
0
地址。在密碼學中,這有時被稱為“我的袖珍號碼”。您選擇地址的自由度越大,使用者就越不相信您沒有故意搜尋虛假地址和真實地址之間的衝突。如果您選擇0
,使用者可以確定您一無所有。