作者:一日思考
本文首發於CSDN專欄,原標題:比特幣私鑰、賬戶與錢包
對於比特幣用戶來講,與它們最直接相關的就是比特幣中私鑰、賬戶及錢包了,這裡講述一下這三個概念及相關細節。在這之前,先簡單的敘述一下基本的公鑰密碼學知識。
公鑰密碼體制(Public-key cryptography)
- 公鑰密碼體制分為三部分:公鑰、私鑰、加密解密算法。公鑰密碼體制的公鑰和算法都是公開的(這也是公鑰密碼體制名稱的來源),私鑰是保密的。針對不同的用途,可選擇採用公鑰還是私鑰進行加密,再用對應的私鑰或者公鑰進行解密。公鑰密碼體制主要功能有以下三點:
- - 加解密功能
- - 簽名驗證功能
- - 密鑰協商功能
在比特幣系統中,我們用公鑰加密創建一個密鑰對,用於控制比特幣的獲取。密鑰對包括一個私鑰,和由其衍生出的唯一的公鑰。公鑰用於接收比特幣,而私鑰用於比特幣支付時的交易簽名。公鑰和私鑰之間的數學關係,使得私鑰可用於生成特定消息的簽名。此簽名可以在不洩露私鑰的同時對公鑰進行驗證。支付比特幣時,比特幣的當前所有者需要在交易中提交其公鑰和簽名(每次交易的簽名都不同,但均從同一個私鑰生成)。比特幣網絡中的所有人都可以通過所提交的公鑰和簽名進行驗證,並確認該交易是否有效,即確認支付者在該時刻對所交易的比特幣擁有所有權。
什麼是私鑰
私鑰其實就是一個隨機選出的數字而已。一個比特幣地址中的所有資金的控制取決於相應私鑰的所有權和控制權。在比特幣交易中,私鑰用於生成支付比特幣所必需的簽名以證明對資金的所有權。私鑰必須始終保持機密,因為一旦被洩露給第三方,相當於該私鑰保護之下的比特幣也拱手相讓了。私鑰還必須進行備份,以防意外丟失,因為私鑰一旦丟失就難以復原,其所保護的比特幣也將永遠丟失。
這個隨機數字怎麼選出來的呢?一般是通過隨機函數生成器來實現的,這裡不再細述。
什麼是比特幣賬戶
上圖中,我們已經看到比特幣賬戶(地址)的大致生成過程(私鑰–>公鑰–>比特幣地址),這裡詳細的描述其生成細節。在比特幣賬戶生成過程中應用了兩個密碼學哈希函數,一個是SHA256,另一個是RIPEMD160。下圖為比特幣地址(賬戶)的生成流程:
通過隨機數發生器生成一個256bit的隨機數,並使用該隨機數作為賬戶的私鑰。
比特幣採用橢圓曲線簽名算法(ECDSA)來對數據進行簽名和驗證,具體使用的是secp256k1曲線。通過ECC乘法可以計算出對應的公鑰。
對公鑰進行兩次哈希運算,得到公鑰的哈希值。
對<比特幣地址前綴0x00 |公鑰哈希值>做雙哈希運算,取前4字節作為校驗碼。
對<比特幣地址前綴0x00 |公鑰哈希|校驗碼>進行base58編碼得到地址。
其他前綴的含義如下表:
什麼是比特幣錢包
錢包是一個應用程序,為用戶提供交互界面。錢包控制用戶訪問權限,管理密鑰和地址,跟踪餘額以及創建和簽名交易。其中,最核心的功能是保管私鑰,一旦私鑰洩露或者忘了,就會造成比特幣被盜走或丟失。
錢包裡有比特幣嗎?錢包裡只有密鑰,並沒有比特幣。
那我的比特幣在哪裡?你擁有的比特幣實際上是所有你賬戶地址的未花費交易輸出。錢包會監控到輸出到你的公鑰地址的輸出,比如A轉給你1個比特幣,B轉給你9個比特幣,而你目前沒有將它們轉給其他人,則錢包計算出目前你有10個比特幣。當你需要花費比特幣轉賬給其他人時,你構造一筆交易,用你的未花費交易輸出作為輸入,輸出為接收方賬戶地址,並設置轉賬金額,自己的公鑰信息等,對再交易簽名(私鑰簽名)確認後,發送到比特幣網絡等待確認後,轉賬完成。