錢包 - 比特幣開發(fā)指南
原文鏈接: https://bitcoin.org/en/developer-guide#transactions
翻譯: terryc007
版本:1.0
比特幣開發(fā)指南
比特幣錢包涉及到錢包程序或錢包文件对人。錢包程序創(chuàng)建公鑰來收取satoshis,同時使用相對應的私鑰花掉這些satoshis。錢包文件保存了私鑰爆价,以及為錢包程序保存了一些交易相關的信息(可選)祈坠。
錢包程序和錢包文件在下面各個小節(jié)會講到鬼癣,本文檔嘗試說清楚我們討論的到底是錢包程序了旬迹,還是錢包文件弄贿。
錢包程序
收取沟蔑,花掉比特幣是錢包程序最基本的功能 — 但是一個特定的錢包不必包含這兩個功能湿诊。兩個錢包程序能一起協調工作,一個負責分發(fā)公鑰瘦材,用來收取比特幣厅须,另外一個程序負責簽名交易,來花掉這些比特幣食棕。
為從區(qū)塊鏈上獲取信息朗和,廣播交易,錢包程序需要跟比特幣p2p網絡交互簿晓。然而眶拉,那些分發(fā)公鑰,簽名交易部分的程序是不需要跟跟比特幣P2P網絡交互的抢蚀。
這樣我們可以把錢包系統分成三個獨立的部分: 一個公鑰分發(fā)程序镀层,一個簽名程序,一個網絡程序皿曲。在下面的小節(jié)唱逢,我們會講述這幾個部分。
注意: 一般的屋休,我談到分發(fā)公鑰時坞古,在很多的情況,分發(fā)的是P2PKH或P2SH哈希劫樟,而不是公鑰痪枫,實際上當他們控制的輸出被花掉的時织堂,才分發(fā)公鑰。
全服務錢包
最簡單的錢包就是包含三個功能:它生成私鑰奶陈,然后基于它生成相應的公鑰易阳,在需要時,分發(fā)這些公鑰吃粒,監(jiān)控在這些公鑰的輸出潦俺,創(chuàng)建,簽名交易(用于花掉輸出)徐勃,廣播簽名后的交易事示。
在撰稿本文時,幾乎所有主流的錢包被當做全服務錢包使用僻肖。
全服務錢包的主要優(yōu)勢在于易用肖爵。用戶可以用一個程序可以做所有的事情:收發(fā)比特幣。
全服務錢包一個最大的缺點就是它把私鑰保存在聯網的設備上臀脏。這種折中的設備很常見劝堪,加上聯網,使得很容易把私鑰從一個折中的設備傳送到攻擊者谁榜。
為防止私鑰被盜幅聘,很多錢包程序為用戶提供了一個選項:對保存私鑰的錢包文件進行加密。但私鑰不被使用好窃植,可以保護私鑰帝蒿,避免被盜。但是這無法防止攻擊者有計劃的捕捉到密鑰巷怜,或者從內存讀到解密后的密鑰葛超。
簽名錢包
為提升安全,在一個更為安全的環(huán)境中延塑,私鑰可以在一個獨立錢包程序里面生成绣张,保存。這些簽名錢包可以跟網絡錢包(可以跟比特幣P2P網絡交互)一起協同工作关带。
簽名錢包程序通常使用確定性密鑰構建方式來創(chuàng)建父私鑰侥涵,父公鑰。這些父鑰可以創(chuàng)建子私鑰宋雏,子公鑰芜飘。
當第一次運行簽名錢包,它會創(chuàng)建一個父私鑰磨总,并把相應的父公鑰傳送到網絡錢包嗦明。
網絡錢包使用父公鑰來派生出子公鑰,并按需分發(fā)子公鑰蚪燕,監(jiān)控在這些公鑰上的輸出娶牌,創(chuàng)建花掉這些輸出的非簽名交易奔浅,然后發(fā)送非簽名交易到簽名錢包。
在使用簽名錢包時诗良,用戶常常有機會去審核這些非簽名交易的詳情(特別是輸出詳情)汹桦。
在審核交易后(這步是可選的),簽名錢包使用父私鑰派生出一個相應的子私鑰鉴裹,同時簽名這些非簽名交易营勤,并發(fā)送這些簽名交易到網絡錢包。
然后網絡錢包廣播這些簽名交易到P2P網絡壹罚。
下面的小節(jié)將會講述最常用的簽名錢包: 離線錢包,硬件錢包寿羞。
離線錢包
好幾個全服務錢包程序也可以當做兩個獨立的錢包: 一個程序當做簽名錢包(通常叫做:離線錢包)猖凛,同時另外一個程序當作網絡錢包(通常叫做:線上錢包 或者 觀察錢包)
離線錢包因它有意運行在一個不聯網的設備上而得名,這會極大減少攻擊绪穆。在這種情況辨泳,通過類似USB這樣的媒介來轉移數據,通常取決于用戶自己玖院。 用戶的工作流程如下:
(離線) 關閉設備上的所有網絡連接菠红,裝上錢包軟件。 在離線模式下难菌,啟動錢包軟件试溯,創(chuàng)建一個父私鑰,父公鑰郊酒,復制父公鑰到可以插拔的媒介上遇绞。
(在線)在另外一個設備上裝上錢包,這錢包要連上互聯網燎窘,同時從可插拔媒介摹闽,導入父公鑰。跟你使用去錢包一樣褐健,通過分發(fā)公鑰來收款付鹿。當準備花比特幣時,準備好輸出蚜迅,并保存生成好的非簽名交易到可插拔媒介舵匾。
(離線)在離線錢包中,打開非簽名交易慢叨,審核輸出詳情纽匙,確保要支付的數量,地址是正確無誤的拍谐。這可以防止在線錢包中的惡意軟件欺騙用戶在支付給攻擊者上的交易簽名烛缔。審核后馏段,簽名交易并保存交易到可插拔媒介。
(在線)在在線錢包中践瓷,打開簽名交易≡合玻現在可以把它廣播到P2P網絡中。
離線錢包主要的優(yōu)點是:相比于全服務錢包晕翠,他們極大的提升了錢包的安全性喷舀。只要離線錢包沒有丟失或者有缺陷,并且在簽名前淋肾,用戶審核所有交易硫麻,用戶的satoshis是安全的,即使在線錢包泄露了樊卓。
離線錢包的主要的缺點在于使用起來太繁瑣拿愧。為了最大的安全,要求用戶用一個設備專用于離線任務碌尔。每當需要發(fā)送比特幣時浇辜,離線設備必須要啟動,同時用戶必須通過手動把數據在在線設備唾戚,離線設備之間來回復制柳洋。
硬件錢包
硬件錢包專門用來運行簽名錢包。它們消除了簽名錢包在目前操作系統上很多缺陷叹坦,它們允許錢包可以跟其他硬件安全的通信熊镣,因此用戶沒有必要手動的在設備之間傳送數據。硬件錢包用戶的使用流程如下:
(硬件錢包) 創(chuàng)建父私鑰立由,父公鑰轧钓。把硬件錢包連接到一個網絡錢包設備,這樣它就可以獲取到公鑰锐膜。
(網絡錢包) 同使用全服務錢包一樣毕箍,分發(fā)公鑰來收款。當準備花掉satoshis時道盏,填充好交易細節(jié)而柑,并連接到硬件錢包,然后點擊支付荷逞。網絡錢包會自動把交易細節(jié)發(fā)送給硬件錢包媒咳。
(硬件錢包)在硬件錢包屏幕上審核交易細節(jié)。一些硬件錢包可能會彈出一個密碼或PIN輸入框种远。硬件錢包簽名交易涩澡,然后把它發(fā)送給網絡錢包。
(網絡錢包)網絡錢包從硬件錢包收到簽名交易后坠敷,把它廣播到P2P網絡妙同。
相對于全服務錢包射富,硬件錢包的主要優(yōu)點是極大的提升了安全,同時比起離線錢包又簡單很多粥帚。
硬件錢包主要的缺點是使用起來繁瑣胰耗。即使比起離線錢包來沒那么繁瑣,但是用戶仍然需要購買一個硬件錢包芒涡,并且每當需要給交易簽名時柴灯,需隨身攜帶。
一個其他的缺點(希望是暫時的)费尽,在撰稿本文時赠群,很少有主流的錢包程序支持硬件錢包 — 雖然很多主流的錢包已經發(fā)公告說他們有意向支持至少一種硬件錢包。
分發(fā)錢包
那些運行在很難實現安全的環(huán)境旱幼,比如web服務器乎串,的錢包的功能可以設計成僅僅分發(fā)公鑰(包括P2PKH, P2SH地址)。有兩個通用的方式來設計這些極簡的錢包速警。
先預準備一些公鑰或地址在一個數據庫里面,然后使用數據庫中的條目鸯两,按需分發(fā)公鑰腳本或者地址闷旧。為避免重用,web服務器跟蹤密鑰使用情況钧唐,永遠不要用完里面的公鑰忙灼。可以通過父公鑰很容易做到這點钝侠,這會在下面方面提到该园。
使用父公鑰生成子公鑰。為避免重用帅韧,需要使用一個方法保證一個公鑰不能被分發(fā)兩次里初。這可以是一個數據庫的條目對應一個密鑰分發(fā),或通過自增指針指向密鑰的索引號忽舟。
這兩個方法沒有增加太多額外的工作量双妨,特別是在使用一個數據庫來,通過把每個進來的支付跟獨立的公鑰綁定起來跟蹤時叮阅,其工作量就更少刁品。 具體情況支付處理章節(jié)。
錢包文件
比特幣的核心其實就是一堆私鑰集合浩姥。這些私鑰以數字內容的形式存在文件里面挑随,或甚至可以存在紙上。
私鑰格式
私鑰用來解鎖在一個比特幣地址上的satoshis勒叠。在比特幣中兜挨,一個私鑰的標準格式是一個簡單的256-bit 數字锌云,值的范圍是: 0x01 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140, 所代表的值的范圍在2256 - 1. 這范圍由比特幣中使用的secp256k1 ECDSA加密標準來控制。
錢包導入格式(WIF)
為使復制密鑰少出錯制跟,可以使用錢包導入格式萨蚕。WIF使用base58Check 來編碼私鑰,可以極大的降低復制引起的錯誤担猛,這看起來很像比特幣地址幕垦。
拿到一個私鑰。
用于主網地址時傅联,在私鑰前面加上0x80先改,用于測試網地址時,在前面加入0xef蒸走。
如果跟壓縮公鑰(后續(xù)小節(jié)會講到)使用仇奶,需要在后面加入0x01,如果跟非壓縮公鑰使用比驻,就什么都不用加该溯。
對擴展后的私鑰進行SHA-256哈希。
對SHA-256哈希后結果再做一個SHA-256哈希别惦。
拿掉第二次哈希后的哈希值的前4字節(jié)狈茉,這4個字節(jié)是校驗和。
把這4字節(jié)校驗和插入到擴展私鑰倒數第5的位置掸掸。[?]
把結果從字節(jié)字符串氯庆,使用Base58Check轉化成Base58編碼字符串。
使用Base58解碼功能扰付,很容易逆向操作這個過程堤撵,刪掉那些填充。
Mini私鑰格式
Mini私鑰格式通過小于30個字符來編碼私鑰的一種方法羽莺,可以把密鑰嵌入到非常小的物理空間上实昨,比如一個物理的比特幣,抗破壞的QR二維碼盐固。
第一個字母是: S
為判斷一個mini私鑰是否格式化良好屠橄,在私鑰中加入了一個問題標志。
計算私鑰的哈希值闰挡。如果哈希值第一個字節(jié)是00锐墙, 那它就是格式化良好的Mini私鑰。這個密鑰的限制起到校驗和的作用长酗。用戶可以通過使用隨機數字暴力處理溪北,來生成一個格式化良好的mini私鑰。
為了從完整的私鑰派生,用戶可以簡單的獲取一個源mini私鑰的SHA256哈希之拨。這是個單向處理:從派生的密鑰去計算出mini私鑰是很困難的茉继。
在很多的Mini私鑰的實現中,禁止在mini私鑰里使用字符 "1"蚀乔,因為它跟字符 “I” 很像烁竭。
資源:Casascius 比特幣地址工具: 一個創(chuàng)建,兌換這些密鑰的工具.
公鑰格式
在secp256k1中吉挣,比特幣 ECDSA 公鑰代表一條特定橢圓曲線(EC)上的一個點派撕。在傳統的非壓縮格式,公鑰包含一個標識字節(jié)睬魂,一個32字節(jié)x坐標终吼,一個32字節(jié)y坐標。下面的一個簡化版插圖顯示了一個在y2 = x3 + 7 橢圓曲線上的一個點氯哮。超過了連續(xù)數字域际跪。[?]
(Secp256k1實際通過一個大的素數對坐標進行取模,這會產生一個非連續(xù)整數域, 即使是使用同樣的原理喉钢,也會導致一個非常不清晰的坐標姆打。)
在不改變任何基本原則,通用丟棄Y坐標肠虽,可以實現公鑰大小減半效果穴肘。這是有可能的,因為兩個在曲線上的點舔痕,共用一個X坐標,因此32字節(jié)Y坐標能夠用一個bit微替代豹缀,用來表示這個點是在曲線上部分伯复,還是在下部分。
采用這樣方法壓縮邢笙,不會導致數據丟失 — 這僅需要一點點cpu來重建Y坐標啸如,以及訪問非壓縮公鑰。在secp256k1文檔中氮惯,所描述的非壓縮叮雳,壓縮密鑰,在廣泛使用的OpenSSL庫中妇汗,是默認支持的帘不。
因為他們很容易使用,因為比特幣內核杨箭,默認會存儲每個輸出寞焙,加密公鑰,以及其他所有比特幣軟件也如此,為存儲這些公鑰捣郊,這種方式幾乎能為區(qū)塊鏈減少一半空間需求辽狈。
然而,比特幣內核0.6之前的版本呛牲,使用的是非壓縮密鑰刮萌。這就帶來一定的復雜,因為非壓縮公鑰的哈希跟壓縮公鑰的哈希的格式是不一樣的娘扩,因此同一密鑰會有兩個不同的P2PKH着茸,P2SH地址。這也就意味著密鑰在簽名腳本中畜侦,必須以正確的格式提交元扔,這樣它才能跟之前輸出的公鑰腳本匹配上。
因為這個原因旋膳,比特幣內核使用幾個不斷的標識字節(jié)來幫助程序識別怎么使用密鑰:
使用壓縮公鑰的密鑰澎语,在他們進行Base58編碼前,需在其他后面加上0x01
非壓縮公鑰以0x04開頭验懊,壓縮公鑰以0x03或0x02開頭擅羞,至于是0x03,還是0x02义图,取決于曲線上點在Y軸位置是大于中點减俏,還是小于中點。 這些前綴字節(jié)在官方的secp256k1文檔中都有被用到碱工。
層級確定性密鑰創(chuàng)建
層級確定密鑰創(chuàng)建和傳輸協議(HD 協議)極大的簡化了錢包備份娃承,減少在同一錢包中,多個程序重復通信怕篷,允許創(chuàng)建可獨立操作的子賬戶历筝,每個父賬戶可以監(jiān)控,控制它的子賬戶廊谓,即便子賬戶泄露了梳猪,同時可以把賬號分成可完全訪問,限制訪問部分蒸痹,這樣不可信用戶或程序可以接收或者監(jiān)控支付情況春弥,但沒有不能花里面的錢。
HD協議利用ECDSA公鑰的創(chuàng)建函數 point()
, 它采用一個非常大的整數(私鑰)叠荠,把整數轉化成曲線上的一個點(公鑰)匿沛。
point(private_key) == public_key
因為point()
內部工作方式,通過組合一個已有的(父)公鑰榛鼎,另外一個通過任何 整型(i) 數值生成的公鑰俺祠,可以創(chuàng)建一個子公鑰公给。 這個子公鑰跟公鑰一樣,可以通過point()
函數蜘渣,在源(父)私鑰上加上一個整型數i淌铐,然后父公鑰跟 i 相加,再除以一個在比特幣軟件中的全局的常量蔫缸,求余數腿准, 來創(chuàng)建。
point( (parent_private_key + i) % p ) == parent_public_key + point(i)
這就意味著拾碌,兩個或多個獨立的程序吐葱,在不需要更多的通信的情況下,同意一串數字能從單個父密鑰對創(chuàng)建一系列獨一無二的子密鑰對校翔。更重要的是弟跑,為接受付款而分發(fā)這些公鑰的程序的確在不需要訪問私鑰,就能是的公鑰分發(fā)程序可以運行在可能不安全的平臺上防症,比如公共的web服務器孟辑。
子公鑰也能通過重復子密鑰派生操作,來創(chuàng)建他們自己的子公鑰(孫公鑰):
point( (child_public_key + i ) % p) == child_public_key + point(i)
是否要創(chuàng)建子公鑰或者下一代公鑰蔫敲,一串可預測的整型數比起所有交易使用單個公鑰來說更好饲嗽。因為任何人如果他知道一個子公鑰,他就可以找出所有由其父公鑰生成的其他所有子公鑰奈嘿。相反貌虾,隨機種子能夠用來生成一串確定的整型數字,這樣在沒有種子的情況下裙犹,子公鑰之間的關系是不可見的尽狠。
HD協議使用單個根種子來創(chuàng)建一個層級的子,孫子叶圃,其他后代密鑰袄膏。他們是一些無相關性的,具有確定性生成的整數盗似。每個子密鑰也可以從它的父密鑰獲得一個確定性生成的種子。叫做鏈碼平项,所以一個鏈碼泄露不會導致整個層級里的整數泄露赫舒,這就主鏈碼就可以繼續(xù)使用,即使闽瓢,比如 一個基于web的公鑰分發(fā)程序被黑掉接癌。
如上圖所示,HD密鑰派生需要4個輸入:
父私鑰扣讼,父公鑰缺猛,他們都是非壓縮256位 ECDSA密鑰。
父鏈碼 - 256位看似隨機的數。
索引號 - 程序指定的32位的整數
如上圖所示荔燎,單向加密哈希算法(HMAC-SHA512)把父鏈碼耻姥,父公鑰,索引號進行處理有咨,生成一個確定的但看起來有點隨機的數據琐簇。 看似隨機的256位值右側部分算出的哈希值被用來當做一個新的子鏈碼。左側部分算出的哈希值被當做一個整數座享,跟父私鑰或父公鑰組合一起婉商,生成相應的子私鑰或子公鑰。
child_private_key == (parent_private_key + lefthand_hash_output) % G
child_public_key == point( (parent_private_key + lefthand_hash_output) % G )
child_public_key == point(child_private_key) == parent_public_key + point(lefthand_hahs_output)
對于同一父密鑰渣叛,指定不同的索引數字會創(chuàng)建不同的丈秩,無關聯的子密鑰。使用子鏈碼對子密鑰重復這個過程會創(chuàng)建無關的孫密鑰淳衙。
因為創(chuàng)建子密鑰需要一個秘密蘑秽,一個鏈碼,他們兩合起來叫做擴展密鑰滤祖。一個擴展私鑰跟它相應的擴展公鑰有同一個鏈碼筷狼。主私鑰(跟私鑰)和主鏈碼是從隨機數據派生而來,如下圖所示:
根種子通過128或256或512位隨機數創(chuàng)建匠童。為了能讓使用特定設置的特定錢包程序派生每個密鑰埂材,用戶只需要存儲根種子中的128位即可。
警告: 在撰寫本文時汤求,HD錢包程序不能達到完全兼容俏险,因此對于一個特定的根種子,用戶必須使用同一個HD錢包程序扬绪,并使用同樣的HD相關設置竖独。
根種子通過哈希之后生成看似隨機的512比特位數據,主密鑰挤牛,主鏈碼通過這512比特為數據來生成莹痢。主公鑰使用point()
從主私鑰派生,主公鑰和主鏈碼一起墓赴,通過point()
來生成主擴展公鑰竞膳。主擴展密鑰在功能上跟其他擴展密鑰是一樣的;它只是因為在在層級的最頂部而已诫硕。
強化密鑰
強化擴展密鑰解決了普通擴展密鑰的一個潛在問題坦辟。如果一個攻擊者獲取一個普通父鏈碼,一個父公鑰章办,他可以暴力破解從它生成的所有子鏈碼锉走。如果攻擊者也能獲得一個子/孫子/其他后代的私鑰滨彻,他就可以使用鏈碼來生成所有從這私鑰派生來的所有的擴展私鑰。 如下面孫子挪蹭,曾孫子插圖中所示:
更糟糕情況亭饵,攻擊者能逆向普通私鑰派生公式,并從父鏈碼提取出一個字密鑰嚣潜,從而恢復父私鑰冬骚,就如上圖子代跟父代之間所顯示的那樣。 這就意味著攻擊者拿到一個擴展公鑰懂算,以及它的一個后代密鑰后只冻,他就能恢復父私鑰,以及它所以的后代密鑰计技。
因為這個原因喜德,相比較于標準公鑰而言,擴展公鑰的鏈碼部分需要更好的安全保護措施垮媒。并建議用戶不要把非擴展私鑰導出到可能不可信舍悯,不安全的環(huán)境。
這可以通過一個折中的方案來解決睡雇,通過把普通密鑰派生公式替換成強化密鑰派生公式萌衬。
在上節(jié)講到的普通密鑰派生公式,是通過把索引號它抱,父鏈碼秕豫,父公鑰組合起來,來創(chuàng)建一個子鏈碼观蓄,同時把一個整數跟父私鑰組合起來混移,來創(chuàng)建一個子密鑰。
如上圖所示侮穿,強化公式把索引號歌径,父鏈碼,父私鑰組合起來創(chuàng)建一個用于生成子鏈碼亲茅,子私鑰的數據回铛。這個公式使得在無需知道父密鑰的情況下,創(chuàng)建子公鑰成為可能克锣。 換句話說茵肃,父擴展公鑰不能創(chuàng)建強化子公鑰。
因為這原因娶耍,強化擴展私鑰比起普通的擴展私鑰用處更少 — 然而免姿,強化擴展公鑰創(chuàng)建了一個防火前饼酿,使得多層級派密鑰泄露不會發(fā)生榕酒。因為強化子擴展公鑰不能自己生成孫子鏈碼胚膊,那么使用泄露的父擴展公鑰,泄露的孫子私鑰是不能創(chuàng)建曾孫子擴展私鑰的想鹰。
HD協議使用一個索引號來指示是生成普通的紊婉,還是強化的密鑰。范圍在0x00 ~ 0x7fffffff(0 到 231 - 1)的索引號生成一個普通的密鑰辑舷,范圍在0x80000000 ~ 0xffffffff(0 到 231 - 1)的索引號生成一個強化的密鑰喻犁。為方便描述,很多開發(fā)者使用撇符來區(qū)分強化密鑰何缓,因此第一個普通密鑰(0x00)是 0肢础, 第一個強化密鑰(0x80000000)是 0'.
(比特幣開發(fā)者通常使用ASCII編碼的撇號而不是UNICODE編碼的撇號,因此我們也這樣使用)碌廓。
更為簡潔的描述方式: 在/符號前面传轰,加一個m 或者M前綴,來表示層級谷婆,以及密鑰類型慨蛙。 m表示私鑰,M表示公鑰纪挎。比如期贫, m/0‘/0/122' 表示主私鑰第一個強化子私鑰的第一個普通私鑰的第123個子私鑰。下面的層級展示了撇會注釋跟強化密鑰防火墻:
遵循BIP32 HD協議的錢包僅能創(chuàng)建主私鑰的強化后代密鑰异袄,以防止子密鑰泄露導致主密鑰泄露通砍。 因為主密鑰沒有普通的子密鑰,在HD錢包中也沒有用到主公鑰隙轻。其他所有的密鑰可以普通的子密鑰埠帕,因此也可以使用相應的擴展公鑰來替代普通的子公鑰。
HD協議中介紹了擴展公鑰玖绿,擴展私鑰序列化格式敛瓷。更多詳情,請看開發(fā)者參考中錢包章節(jié)或者 在BIP32了解HD協議詳情斑匪。
存儲根種子
在HD協議中呐籽,根種子是一些128位,258位蚀瘸,512位比特隨機數據狡蝶。必須要精確的保存好他們。為了更方便使用非數字方式保存他們贮勃,比如記憶贪惹,手寫,BIP39 定義了一個方法寂嘉。該方法可以通過由普通單詞偽造出的句子(幫組記憶的)來生成512位根種子奏瞬。 這句子通過128或256位的熵生成的枫绅,并且可以使用密碼來保護這些組記詞。
單詞個數跟消耗熵數量之間的關系如下:
比特熵 | 單詞數量 |
---|---|
128 | 12 |
160 | 15 |
192 | 18 |
224 | 21 |
256 | 24 |
密碼長度沒有限制硼端。它只是簡單的加到組記詞的后面并淋,然后使用HMAC-SHA512對他們進行2048次哈希計算,獲得一個看似隨機的512比特未種子珍昨。因為任何輸入到這個哈希函數的數據县耽,都會生成一個看似隨機的512比特位的種子,因為沒有一個基本的方法證明用戶輸入了正確的密碼镣典,這樣即使用戶在強迫下兔毙,也有可能保護好種子。
想要了解更多詳情兄春,請查看BIP39.
松散密鑰錢包
松散密鑰錢包也叫密鑰串(JBOK), 這種形式的錢包源自于比特幣內核客戶端瞒御,目前已被遺棄不用。比特幣內核客戶端錢包會通過偽隨機數生成器(PRNG)創(chuàng)建100個私鑰/公鑰對神郊,以備后用肴裙。
這些私鑰儲存在一個虛擬的“密鑰池”,當之前的密鑰被使用后涌乳,它會生成新的密鑰對蜻懦,這樣確保密鑰池維持有100個未被使用的密鑰。(如果錢包被加密夕晓,新的密鑰只有在被解鎖后才可以生成新的密鑰)
考慮到不得不手動備份新生成的私鑰宛乃,這會對保存密鑰帶來相對大的困難。如果新的密鑰生成后蒸辆,被用掉征炼,但在備份前丟失了,那么里面的比特幣就永遠丟失了躬贡。很多老式的移動錢包則使用一個簡單的格式谆奥,它們僅當用戶需要的時候,才生成一個新的私鑰拂玻。
因為備份太繁瑣酸些,這類錢包正逐步被淘汰,也不鼓勵大家使用檐蚜。
聲明:
文中帶有[?]的地方魄懂,表示我對此翻譯明顯感覺不太對的,后續(xù)會不斷修正闯第。
有些地方可能會翻譯的不好市栗,不地道,甚至錯誤,如果有發(fā)現填帽,還請留言智厌,指出,以便我好修正盲赊,謝謝!