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