區塊鏈入門系列 | 比特幣地址的原理和意義
當我們接收別人的比特幣轉賬的時候,需要給對方的那一串看似雜亂無章的字串就是比特幣地址了。那麼,它的底層基本原理是什麼呢?為什麼不直接用公鑰接收比特幣而是使用地址呢?為什麼使用地址的最佳實踐是每次轉賬都換一個新地址呢?
基本原理
先來聊聊地址的基本原理,聊聊地址是如何生成的,為何用私鑰就能轉走地址中的幣。
地址是從私鑰經過多步運算得出的。比特幣採用的是橢圓曲線密碼學,私鑰是隨機選出的,私鑰通過橢圓曲線密碼學可以運算出公鑰,公鑰經過兩次雜湊運算就得了地址,所有的運算步驟的演算法都是公開的,同時也是單向的。根據地址反推公鑰是很難的,根據公鑰反推私鑰也是很難的。注意,密碼學語境中的“很難”,指的是理論上可以實現,但是實際中不可能實現。當然,比特幣地址也分成不同型別,常見有兩種:一種是 Pay-to-PubKeyHash (P2PKH) ,也就是公鑰雜湊地址。另一種是 Pay-to-ScriptHash (P2SH),也就是指令碼地址。後續討論,我們都以第一種情況為主。
比特幣的基本轉賬原理是用私鑰簽署交易來授權轉賬。如果,我想把和我地址相關的比特幣轉給你,只需要我向全網證明我是地址對應的私鑰的持有者即可。每次轉賬,我公佈給全網的是公鑰以及這次轉賬的數字簽名。公鑰和數字簽名可以在不暴露私鑰的情況下,讓全網相信我的確持有私鑰。私鑰可以算出公鑰,而地址是公鑰的雜湊,所以私鑰和地址的聯絡也是明顯的。
這就是比特幣地址的基本原理了。
為何用地址收款而不用公鑰?
現在,我們思考這樣一個問題,為何比特幣系統要發明地址這個東西,而不是直接用公鑰來進行收款呢?
地址會讓我們的幣更安全。當我們接收比特幣的時候,唯一需要暴露給網路的就是我們的地址。注意,根據地址是不能反推公鑰的,所以如果我的地址只是收了一次款,那麼就不會有任何其他人知道我的公鑰。雖然當代密碼學能夠執行的基礎是相信根據公鑰是很難運算出私鑰的,但是畢竟公鑰跟私鑰是有明確的數學聯絡的,所以有了公鑰再去獲得私鑰需要的運算能力也會大幅度的降低。所以使用地址而非公鑰來收款會讓系統更安全。假設未來計算機有了跨越式發展,比特幣使用的橢圓曲線密碼學被破解,地址中的幣也很難被偷走。
以上就是我個人對地址存在意義的思考,很可能不全面甚至也有可能理解有偏差的,我保留隨時糾正自己的權利。
地址為何只用一次
比特幣地址的設計初衷就是讓大家每次使用後就換一個,這就是為什麼很多錢包軟體每次都會生成不同的地址給我們。
首先,如果我用地址對外轉賬,那麼就需要簽署交易並公佈公鑰。根據前面的討論,公鑰暴露會降低比特幣地址的安全度。同時,更重要的是如果數字簽名不是在離線情況下進行的,那麼很有可能私鑰本身也不是完全安全可信的。
其次,即使多次使用同一地址收款也是不好的,因為會降低隱私。比特幣的所有交易資料都是公開可追溯的,一旦某一次交易的時候,我們暴露了自己的肉身資訊,那麼壞人就能確認這個地址是屬於誰。壞人可以直接檢視到這個地址中的餘額總數,有可能帶來人身安全問題。關於這個方面,Bitcoin Wiki 上有專門的一篇文章 https://en.bitcoin.it/wiki/Address_reuse 進行了深入的討論。
總之,最佳實踐是每個地址只用一次。如果涉及到找零的話,可以設定一個專門的找零地址。
總結
關於比特幣地址的原理和使用注意事項,我們就聊到這裡。需要記住的重點資訊是:第一,根據私鑰可以推算出地址,所以可用私鑰來轉出地址中的幣。第二,地址不會暴露公鑰,公鑰一旦暴露,這個地址的安全度就降低了。第三,反覆使用同一地址會降低安全和隱私,所以地址每使用一次就要更換。
參考:
https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc https://www.mycryptopedia.com/p2sh-pay-to-script-hash-explained/