“錢包”一詞在比特幣中有多重含義。 廣義上,錢包是一個應用程序,為用戶提供交互界面。 錢包控制用戶訪問權限,管理密鑰和地址,跟蹤余額以及創(chuàng)建和簽名交易。 狹義上,即從程序員的角度來看,“錢包”是指用于存儲和管理用戶密鑰的數(shù)據(jù)結構。
1. 錢包技術概述
在本節(jié)中,我們總結了各種技術,它們?yōu)橛脩魳嫿ㄆ鹩押茫踩挽`活的比特幣錢包。
一個常見誤解是,比特幣錢包里含有比特幣。 事實上,錢包里只含有鑰匙。 “錢幣”被記錄在比特幣網(wǎng)絡的區(qū)塊鏈中。 用戶通過錢包中的密鑰簽名交易,從而來控制網(wǎng)絡上的錢幣。 在某種意義上,比特幣錢包是密鑰鏈。
提示比特幣錢包只含有密鑰,而不是錢幣。 每個用戶有一個包含多個密鑰的錢包。 錢包只包含私鑰/公鑰對的密鑰鏈(請參閱[私鑰章節(jié)])。 用戶用密鑰簽名交易,從而證明他們擁有交易輸出(他們的錢幣)。 錢幣以交易輸出的形式存儲在區(qū)塊鏈中(通常記為vout或txout)。
有兩種主要類型的錢包,區(qū)別在于它們包含的多個密鑰是否相互關聯(lián)。
第一種類型是非確定性錢包(nondeterministic wallet),其中每個密鑰都是從隨機數(shù)獨立生成的。密鑰彼此無關。這種錢包也被稱為“Just a Bunch Of Keys(一堆密鑰)”,簡稱JBOK錢包。
第二種類型是確定性錢包(deterministic wallet),其中所有的密鑰都是從一個主密鑰派生出來,這個主密鑰即為種子(seed)。該類型錢包中所有密鑰都相互關聯(lián),如果有原始種子,則可以再次生成全部密鑰。確定性錢包中使用了許多不同的密鑰推導方法。最常用的推導方法是使用樹狀結構,稱為分級確定性錢包或HD錢包。
確定性錢包由種子衍生創(chuàng)造。為了便于使用,種子被編碼為英文單詞,也稱為助記詞。
接下來的幾節(jié)將深入介紹這些技術。
1.1 非確定性(隨機)錢包
在最早的一批比特幣客戶端中( Bitcoin Core,現(xiàn)在稱作比特幣核心客戶端),錢包只是隨機生成的私鑰集合。這種類型的錢包被稱作零型非確定錢包。舉個例子,比 特幣核心客戶端預先生成100個隨機私鑰,從最開始就生成足夠多的私鑰并且每個密鑰只使用一次。這種錢包現(xiàn)在正在被確定性錢包替換,因為它們難以管理、 備份以及導入。隨機密鑰的缺點就是如果你生成很多私鑰,你必須保存它們所有的副本。這就意味著這個錢包必須被經(jīng)常性 地備份。每一個密鑰都必須備份,否則一旦錢包不可訪問時,錢包所控制的資金就付之東流。這種情況直接與避免地址重復使用的原則相沖突——每個比特幣地址只能用一次交易。地址重復使用將多個交易和地址關聯(lián)在一起,這會減少隱私。當你想避免重復使用地址時,零型非確定性錢包并不是好的選擇,因為你要創(chuàng)造過多的私鑰并且要保存它們。雖然比特幣核心客戶端包含零型錢包,但比特幣的核心開發(fā)者并不鼓勵大家使用。
圖1展示的是一個非確定性錢包,其含有的隨機密鑰是個松散的集合。
提示除了簡單的測試之外,不要使用非確定性錢包。 它們對于備份和使用來說太麻煩了。 相反,推薦使用基于行業(yè)標準的HD錢包,可以用種子助記詞進行備份。
1.2 確定性(種子)錢包
確定性,或者“種子”錢包包含通過使用單項離散函數(shù)而可從公共的種子生成的私鑰。種子是隨機生成的數(shù)字。這個數(shù)字也含有比如索引號碼或者可生成私鑰的“鏈碼”(參見“ 分層確定性錢包(BIP0032/BIP0044)”一節(jié))。在確定性錢包中,種子足夠恢復所有的已經(jīng)產生的私鑰,所以只用在初始創(chuàng)建時的一個簡單備份就足以搞定。并且種子也足夠讓錢包導入或者導出。這就很容易允許使用者的私鑰在錢包之間輕松轉移。
圖2展示了確定性錢包的邏輯圖。
1.3 分層確定性錢包(HD Wallets (BIP-32/BIP-44))
確定性錢包被開發(fā)成更容易從單個“種子”中生成許多密鑰。確定性錢包的最高級形式是通過BIP0032標準定義的HD錢包。HD錢包包含以樹狀結構衍生的密鑰,使得父密鑰可以衍生一系列子密鑰,每個子密鑰又可以衍生出一系列孫密鑰,以此類推,無限衍生。圖3展示了樹狀結構。
相比較隨機(不確定性)密鑰,HD錢包有兩個主要的優(yōu)勢。第一,樹狀結構可以被用來表達額外的組織含義。比如當一個特定分支的子密鑰被用來接收交易收入并且有另一個分支的子密鑰用來負責支付花費。不同分支的密鑰都可以被用在企業(yè)環(huán)境中,這就可以支配不同的分支部門、子公司、具體功能以及會計類別。
HD錢包的第二個好處就是它可以允許讓使用者去建立一個公共密鑰的序列而不需要訪問相對應的私鑰。這可允許HD錢包在不安全的服務器中使用或者在每筆交易中發(fā)行不同的公共鑰匙。公共鑰匙不需要被預先加載或者提前衍生,而在服務器中不需要可用來支付的私鑰。
1.4種子和助記詞(BIP-39)
HD錢包具有管理多個密鑰和地址的強大機制。由一系列英文單詞生成種子是個標準化的方法,這樣易于在錢包中轉移、導出和導入,如果HD錢包與這種方法相結合,將會更加有用。 這些英文單詞被稱為助記詞,標準由BIP-39定義。 今天,大多數(shù)比特幣錢包(以及其他加密貨幣的錢包)使用此標準,并可以使用可互操作的助記詞導入和導出種子進行備份和恢復。
讓我們從實際的角度來看以下哪種種子更容易抄錄、閱讀、導出以及導入。
16進制表示的種子: 0C1E24E5917779D297E14D45F14E1A1A
助記詞表示的種子:
army van defense carry jealous true garbage claim echo media make crunch
1.5錢包最佳實踐
由于比特幣錢包技術已經(jīng)成熟,出現(xiàn)了一些常見的行業(yè)標準,使得比特幣錢包具備廣泛互操作,易于使用,安全和靈活的特性。這些常用的標準是:
助記碼,基于BIP-39
HD錢包,基于BIP-32
多用途HD錢包結構,基于BIP-43
多幣種和多帳戶錢包,基于BIP-44
這些標準可能會隨著發(fā)展而改變或過時,但是現(xiàn)在它們形成了一套互鎖技術,這些技術已成為比特幣的事實上的錢包標準。
這些標準已被廣泛的軟件和硬件比特幣錢包采用,使所有這些錢包互操作。用戶可以導出在其中一個錢包上生成的助記符,并將其導入另一個錢包,實現(xiàn)恢復所有交易,密鑰和地址。
列舉支持這些標準的軟件錢包,包括(按字母順序排列)Breadwallet,Copay,Multibit HD和Mycelium。列舉支持這些標準的硬件錢包,包括(按字母順序排列)Keepkey,Ledger和Trezor。
以下部分將詳細介紹這些技術。
提示如果您正準備開發(fā)一個比特幣錢包,那么它應該被構建為一個HD錢包,一個種子被編碼為助記詞代碼進行備份,遵循BIP-32,BIP-39,BIP-43和BIP-44標準,下面章節(jié)有所涉獵。
1.6使用比特幣錢包
在[用戶故事]中,我們介紹了Gabriel,里約熱內盧是一個有進取心的少年,他正在經(jīng)營一家簡單的網(wǎng)絡商店,銷售比特幣品牌的T恤,咖啡杯和貼紙。
Gabriel使用Trezor比特幣硬件錢包(Trezor設備:硬件HD錢包)來安全地管理他的比特幣。 Trezor是一個簡單的USB設備,具有兩個按鈕,用于存儲密鑰(以HD錢包的形式)和簽署交易。 Trezor錢包遵循本章討論的所有行業(yè)標準,因此Gabriel不依賴于任何專有技術或單一供應商解決方案。
當Gabriel首次使用Trezor時,設備從內置的硬件隨機數(shù)生成器生成助記詞和種子。 在這個初始化階段,錢包在屏幕上按順序逐個顯示單詞。
通過寫下這個助記符,Gabriel創(chuàng)建了一個備份(參見表1),可以在Trezor設備丟失或損壞的情況下用于恢復。 在新的Trezor錢包,或者任一種兼容的軟件和硬件錢包中,助記詞都可以用于恢復。 請注意,單詞序列很重要,因此,記憶紙備份需要對每個單詞都有空格。Gabriel必須仔細記錄每個單詞的編號,以保持正確的順序。 表1Gabriel的助記器備份
提示為了簡單起見,Gabriel的助記詞記錄中顯示了一個12個詞。 事實上,大多數(shù)硬件錢包生成更安全的24個詞的助記符。 助記詞以完全相同的方式使用,不管長度如何。
作為網(wǎng)店的第一次實踐,Gabriel使用他的Trezor設備生成一個比特幣地址。 所有客戶的訂單都使用此單一地址。 我們將看到,這種方法有一些缺點,不過可以使用HD錢包進行改進。
2. 錢包技術細節(jié)
現(xiàn)在我們來深入了解被眾多比特幣錢包所使用的重要的行業(yè)標準。
2.1助記碼詞匯(BIP-39)
助記碼詞匯是英文單詞序列代表(編碼)用作種子對應所確定性錢包的隨機數(shù)。單詞的序列足以重新創(chuàng)建種子,并且從 種子那里重新創(chuàng)造錢包以及所有私鑰。在首次創(chuàng)建錢包時,帶有助記碼的,運行確定性錢包的錢包的應用程序將會向使用者展示一個12至24個詞的順序。單詞的順序就是錢包的備份。它也可以被用來恢復以及重新創(chuàng)造應用程序相同或者兼容的錢包的密鑰。助記碼詞匯可以讓使用者復制錢包更容易一些,因為相比較隨機數(shù)字順序來說,它們更容易地被閱讀和正確抄寫。
提示助記詞經(jīng)常與“腦錢包”混淆。 他們不一樣。主要區(qū)別在于腦錢包由用戶選擇的單詞組成,而助記符是由錢包隨機創(chuàng)建的,并呈現(xiàn)給用戶。 這個重要的區(qū)別使助記詞更加安全,因為人類猜測隨機數(shù)還是無能為力。
助記碼被定義在比特幣的改進建議39中。需要注意的是,BIP-39是助記碼標準的一個實施方案。還有一個不同的標準,使用一組不同的單詞,是由Electrum錢包使用,并且早于BIP-39。 BIP-39由Trezor硬件錢包背后的公司提出,與Electrum的實施不兼容。 然而,BIP-39現(xiàn)在已經(jīng)在數(shù)十個可互操作的實踐案例中獲得了廣泛的行業(yè)支持,應被視為事實上的行業(yè)標準。
BIP-39定義了助記符碼和種子的創(chuàng)建,我們在這里描述了九個步驟。 為了清楚起見,該過程分為兩部分:
1-6步是創(chuàng)建助記詞,7-9步是從助記詞到種子。
2.2創(chuàng)建助記詞
助記詞是由錢包使用BIP-39中定義的標準化過程自動生成的。 錢包從熵源開始,增加校驗和,然后將熵映射到單詞列表:
1、創(chuàng)建一個128到256位的隨機序列(熵)。
2、提出SHA256哈希前幾位(熵長/ 32),就可以創(chuàng)造一個隨機序列的校驗和。
3、將校驗和添加到隨機序列的末尾。
4、將序列劃分為包含11位的不同部分。
5、將每個包含11位部分的值與一個已經(jīng)預先定義2048個單詞的字典做對應。
6、生成的有順序的單詞組就是助記碼。
圖6展示了熵如何生成助記詞。
表2表示了熵數(shù)據(jù)的大小和助記詞的長度之間的關系。
2.3從助記詞生成種子
助記詞表示長度為128至256位的熵。 通過使用密鑰延伸函數(shù)PBKDF2,熵被用于導出較長的(512位)種子。將所得的種子用于構建確定性錢包并得到其密鑰。
密鑰延伸函數(shù)有兩個參數(shù):助記詞和鹽。其中鹽的目的是增加構建能夠進行暴力攻擊的查找表的困難度。 在BIP-39標準中,鹽具有另一目的,它允許引入密碼短語(passphrase),作為保護種子的附加安全因素,我們將在BIP-39可選密碼短語章節(jié)詳細地描述。
創(chuàng)建助記詞之后的7-9步是:
7、PBKDF2密鑰延伸函數(shù)的第一個參數(shù)是從步驟6生成的助記符。
8、PBKDF2密鑰延伸函數(shù)的第二個參數(shù)是鹽。 由字符串常數(shù)“助記詞”與可選的用戶提供的密碼字符串連接組成。
9、PBKDF2使用HMAC-SHA512算法,使用2048次哈希來延伸助記符和鹽參數(shù),產生一個512位的值作為其最終輸出。 這個512位的值就是種子。
圖5-7顯示了從助記詞如何生成種子
提示 密鑰延伸函數(shù),使用2048次哈希是一種非常有效的保護,可以防止對助記詞或密碼短語的暴力攻擊。 它使得攻擊嘗試非常昂貴(從計算的角度),需要嘗試超過幾千個密碼和助記符組合,而這樣可能產生的種子的數(shù)量是巨大的(2^512)。
表3、4和表5展示了一些助記碼的例子和它所生成的種子。
2.4 BIP-39中的可選密碼短語
BIP-39標準允許在推導種子時使用可選的密碼短語。 如果沒有使用密碼短語,助記詞是用由常量字符串“助記詞”構成的鹽進行延伸,從任何給定的助記詞產生一個特定的512位種子。 如果使用密碼短語,密鑰延伸函數(shù)使用同樣的助記詞也會產生不同的種子。事實上,給予一個單一的助記詞,每一個可能的密碼短語都會導致不同的種子。 基本上沒有“錯誤”的密碼短語, 所有密碼短語都是有效的,它們都會導致不同的種子,形成一大批可能未初始化的錢包。這批錢包非常之大(2^512),使用暴力破解或隨機猜測基本不可能。
提示BIP-39中沒有“錯誤的”密碼短語。 每個密碼都會導致一些錢包,只是未使用的錢包是空的。
可選密碼短語帶來兩個重要功能:
(存儲在大腦中的)密碼短語成為第二個因素,使得助記詞不能單獨使用,避免了助記詞備份盜取后被利用。 起到掩人耳目的效果,把密碼短語指向有小額資金的錢包,分散攻擊者注意力,使其不在關注擁有大額資金的“真實”錢包。
然而,需要注意的是,使用密碼短語也會引起丟失的風險:
如果錢包所有者無行為能力或死亡,沒有人知道密碼,種子是無用的,所有存儲在錢包中的資金都將永遠丟失。相反,如果所有者將密碼短語與種子備份在相同的地方,則違反了上述第二個因素的目的。雖然密碼是非常有用的,但它們只能與仔細計劃的備份和恢復流程結合使用,考慮到所有者個人風險的可能性,應該允許其家人恢復加密資產。
2.5使用助記符代碼
BIP-39被做成函數(shù)庫,支持多種編程語言:python-mnemonic
SatoshiLabs團隊在Python中提出了BIP-39標準的參考實現(xiàn)
bitcoinjs/bip39
作為流行的bitcoinJS框架的一部分,在JavaScript中實現(xiàn)了BIP-39
libbitcoin/mnemonic
作為流行的Libbitcoin框架的一部分,在C ++中實現(xiàn)了BIP-39
還有一個BIP-39生成器在獨立的網(wǎng)頁中實現(xiàn),對于測試和實驗非常有用。圖5-8展示一個獨立的網(wǎng)頁,可以生成助記詞、種子和擴展私鑰。
評論
查看更多