Development

如何生成一個有效的比特幣地址來銷毀比特幣?

  • April 23, 2018

(跟進這個問題。)

為了使比特幣無法使用,答案是選擇一個虛構的地址。由於這不是對比特幣的正式銷毀,因此存在可能發現私鑰來花費這些“被銷毀”的比特幣的風險。

如果有人建議一個地址,人們可能會懷疑這個地址被選中,因為那個人煞費苦心地尋找一個看起來像是虛構地址的地址。

如何選擇一個銷毀比特幣的地址,讓每個人都可以合理地確定沒有人會知道私鑰來使用被銷毀的比特幣?

從無效的公鑰開始

比特幣地址是 pubkeyhash(不是 pubkey)加上版本和校驗和資訊,以 base 58 編碼。

Bitcoin address = version + RIPEMD-160(SHA-256( Public Key )) + checksum

將公鑰轉換為地址的步驟可以在這裡找到: https ://en.bitcoin.it/wiki/Address

由於地址使用的是 pubkeyhash 而不是實際的 pubkey,我們可以通過對無效的 pubkey(不可能存在的)進行散列來利用這一點,從而從無效的 pubkey 生成有效地址。

因此,首先我們找到一個無效的公鑰。 如果未壓縮,所有有效的公鑰都以 0x04 開頭,如果壓縮,則以 0x02 或 0x03 開頭。 以任何其他值開頭的公鑰是未定義的,因此沒有可能創建的簽名來滿足該密鑰要求。由於花費硬幣需要使用正確的私鑰簽署交易,因此沒有已知私鑰的地址是不可花費的。通過使用已知沒有私鑰的公鑰,其他人可以確認不存在私鑰。

有效的比特幣公鑰(不是地址):

04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f

無效的公鑰

0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

還有其他方法可以生成已知的無效公鑰。如果未壓縮,ECDSA 密鑰必須正好為 65 字節,如果壓縮則為 33 字節,因此具有不同長度的密鑰也將無效。對於未壓縮的鍵,y 值必須從 x 值正確生成。該點也必須位於曲線上。它也不能高於曲線的模數。所以有很多方法可以生成可證明無效的密鑰,但最好選擇一個明顯無效的密鑰。這可能是最簡單的明顯無效的公鑰。

0x00

由於多種原因,此公鑰無效(不是由私鑰乘以生成器產生的,不在曲線上,不是有效點,但更簡單的是它沒有有效的前綴並且不是正確的長度) .

重要的是這不僅僅是一些可能無效的密鑰,它是一個可證明無效的密鑰。

您應該針對參考客戶端測試您的無效公鑰,以確保客戶端也將其報告為無效。密鑰的有效性是一個共識問題,因此除非硬分叉,否則這不會改變。

從您的無效公鑰生成一個有效(但不可使用)的地址

您可能想知道為什麼我們希望地址有效。所有客戶都應驗證使用者提供的地址,以免意外失去資金。因此,無效地址也是不可使用的,但大多數使用者會發現無法將資金發送到該地址。P2PkH 地址是帶有以 base58 編碼的版本和校驗和資訊的 pubkeyhash。

當您向比特幣客戶端提供地址時,它會將地址解碼回“原始”pubkeyhash。所以產生一個有效的地址意味著從一個有效的 pubkeyhash 開始。這不是問題,因為任何東西的散列都是有效的散列。客戶端不知道散列什麼 pubkey 來生成 pubkeyhash,因為沒有提供底層 pubkey,並且散列函式是一種方法。

比特幣網路僅在“驗證”時驗證地址的格式、長度和校驗和是否正確。從 pubkey 生成地址超出了此問題的範圍,但有實用程序,上面的連結提供了步驟。生成的 pubkeyhash 和編碼地址將被網路和客戶端視為有效,但它需要一個可證明不可能的私鑰來花費發送到該地址的資金。

現在,僅使用地址(和解碼的 pubkeyhash),使用者無法驗證底層 pubkey 是否無效,因此您應該將原始 pubkey 與地址一起發布。使用者可以使用任何比特幣客戶端或工具重新創建地址,並將生成您提供的相同地址。使用者現在有一種無需信任的方式來驗證代幣確實是不可消費的。發送到該地址的任何硬幣都永遠不會被花費並被有效地銷毀。

雜湊衝突

從技術上講,多個公鑰擁有相同的比特幣地址是可能的,但不太可能。這稱為雜湊衝突。如果公鑰 p1 和公鑰 p2 都散列到同一個地址 A,那麼這些公鑰中的任何一個的私鑰都可以花費資金。然而,這種情況發生的可能性非常低。除非 RIPEMD 散列算法被破壞,否則找到兩個生成相同散列(比特幣地址)的公鑰的機率是 2^160 分之一,這遠遠超出了我們的計算能力來定位。

關於為什麼你應該使用“Nothing Up My Sleeve”號碼的幾句話:

不需要使用“我袖手旁觀的號碼”(例如單個零、全零、單個重複數字、序列號、pi 的數字等),因為任何無效的公鑰同樣不可使用,但它會提高公眾的信心您還沒有發現碰撞(儘管不太可能)。

如果您只是使用隨機的無效密鑰,例如:

00000fdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f

有些人可能會質疑您為什麼選擇這個特定的密鑰。擔心的是您不是隨機選擇此密鑰,而是因為您偶然發現了此密鑰與有效密鑰之間的衝突。沒有辦法證明密鑰是隨機的,因此恐懼將永遠存在。加密函式(如 RIPEMD 或 SHA-256)通常使用“我的袖珍值”來提供安全性,即未選擇常量來啟用算法中的某些加密缺陷或“後門”。例如,SHA-256 使用常量作為塊段的初始值。從技術上講,這些可以是任何隨機數,但這會導致人們擔心“隨機”數實際上並不是隨機的。因此 SHA-256 使用前 8 個素數的立方根小數部分的前 32 位。這允許在需要偽隨機數時進行驗證。在連續素數的立方根的小數部分之間不太可能存在破壞 SHA-256 的神奇屬性。

<http://en.wikipedia.org/wiki/Nothing_up_my_sleeve_number>

更新(2015 年 3 月 31 日)

現在通過使用 OP_RETURN(空數據)輸出更容易做到這一點,並且它不會使 UTXO 因無法使用但網路不知道它們無法使用的輸出而膨脹。任何發送到包含 OP_RETURN 的輸出的資金都可以證明是不可花費的,並且網路將丟棄來自 UTXO 的輸出。UTXO(未使用的 tx 輸出集)是驗證新交易和區塊所必需的關鍵資源,因此使用 UTXO 銷毀/銷毀硬幣是對這種共享資源的更負責任的使用。

引用自:https://bitcoin.stackexchange.com/questions/1851