Solidity

我可以輕鬆生成沒有私鑰的公共地址嗎?

  • December 17, 2018

我在這裡陳述的一些事實可能是錯誤的,因此請在必要時糾正我。

我的理解:

  • 私鑰 - 256 位
  • 公鑰 - 256 位
  • 公共地址 - 公鑰的最後 160 位
  • 每個私鑰都映射到一個公鑰,因此映射到一個公共地址

以上事實暗示了一些私鑰映射到同一個公共地址,但它們並不意味著一些私鑰映射到同一個公鑰。

我想問以下問題:

  1. 對於某些私鑰是否映射到同一個公鑰,我們是否有任何其他知識,因此,某些公鑰沒有映射到它們的私鑰?
  2. 如果上述問題的答案是肯定的,那麼有可能某些公共地址沒有映射到它們的私鑰。我們是否知道任何這樣的地址,或者它們是否存在?

我提出這個問題的動機是,我有一個 ERC20 合約,有時(取決於目前狀態)會鑄造額外數量的代幣,這些代幣稍後將分配給(即轉移給)一些使用者。

現在,我需要一些地址來保存這些代幣,但我希望避免有人擁有該地址的私鑰的情況(儘管機會很小)。

目前,我正在生成這個地址如下:

address public constant MINTING_ACCOUNT = address(keccak256("MINTING_ACCOUNT"));

理想情況下,我想用一個沒有私鑰的常量地址替換它。

謝謝!

TLDR:使用地址0

  1. 根據您對私鑰的定義,是或否。公鑰是通過標量橢圓曲線乘法從私鑰生成的。
P = k * G

我們知道生成器的順序G

n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141 

所以k範圍內的每一個都[0, n)給出了一個唯一的公鑰。有時人們說私鑰只是一個隨機的 256 位數字,但私鑰是等價的 mod n,略小於2^256. 例如私鑰kn+k將給出相同的公鑰。

如果您將“公鑰”定義為任何 512 位整數,那麼顯然幾乎所有這些都沒有關聯的私鑰。(只有n < 2^256不同​​的私鑰)。

  1. 是否存在沒有私鑰的地址是一個完全獨立的問題。本質上,您想知道是否有一個 20 字節的字元串,使得沒有 keccak256 散列以該後綴結尾。答案是沒有人知道,但可能不知道。密碼散列的設計正是為了避免在其輸出中出現這類非平凡的模式,如果這樣的字元串被發現,這將是一個重大缺陷。

總而言之,沒有。沒有“安全地址”。另一方面,正如許多其他人指出的那樣,猜到與0地址對應的私鑰的機率幾乎是2^-160. 這永遠不會發生。請注意,我並不是說“這可能永遠不會發生”,因為人類往往不擅長推理大數字。我說“2^160 中有 1”的機會,而你說“所以有機會?”

這個機會比網路上每台電腦自燃的機率都低。沒有機會。

所以我們看到唯一的選擇是“隨機”選擇一個地址。您似乎想選擇一個由某個字元串的雜湊生成的地址。我認為您應該改用該0地址。在密碼學中,這有時被稱為“我的袖珍號碼”。您選擇地址的自由度越大,使用者就越不相信您沒有故意搜尋虛假地址和真實地址之間的衝突。如果您選擇0,使用者可以確定您一無所有。

引用自:https://ethereum.stackexchange.com/questions/64138