錢包 - 比特幣開發(fā)指南
原文鏈接: https://bitcoin.org/en/developer-guide#transactions
翻譯: terryc007
版本:1.0
比特幣開發(fā)指南
比特幣錢包涉及到錢包程序或錢包文件。錢包程序創(chuàng)建公鑰來收取satoshis,同時使用相對應的私鑰花掉這些satoshis。錢包文件保存了私鑰,以及為錢包程序保存了一些交易相關的信息(可選)。
錢包程序和錢包文件在下面各個小節(jié)會講到,本文檔嘗試說清楚我們討論的到底是錢包程序了,還是錢包文件。
錢包程序
收取,花掉比特幣是錢包程序最基本的功能 — 但是一個特定的錢包不必包含這兩個功能。兩個錢包程序能一起協(xié)調(diào)工作,一個負責分發(fā)公鑰,用來收取比特幣,另外一個程序負責簽名交易,來花掉這些比特幣。
為從區(qū)塊鏈上獲取信息,廣播交易,錢包程序需要跟比特幣p2p網(wǎng)絡交互。然而,那些分發(fā)公鑰,簽名交易部分的程序是不需要跟跟比特幣P2P網(wǎng)絡交互的。
這樣我們可以把錢包系統(tǒng)分成三個獨立的部分: 一個公鑰分發(fā)程序,一個簽名程序,一個網(wǎng)絡程序。在下面的小節(jié),我們會講述這幾個部分。
注意: 一般的,我談到分發(fā)公鑰時,在很多的情況,分發(fā)的是P2PKH或P2SH哈希,而不是公鑰,實際上當他們控制的輸出被花掉的時,才分發(fā)公鑰。
全服務錢包
最簡單的錢包就是包含三個功能:它生成私鑰,然后基于它生成相應的公鑰,在需要時,分發(fā)這些公鑰,監(jiān)控在這些公鑰的輸出,創(chuàng)建,簽名交易(用于花掉輸出),廣播簽名后的交易。

在撰稿本文時,幾乎所有主流的錢包被當做全服務錢包使用。
全服務錢包的主要優(yōu)勢在于易用。用戶可以用一個程序可以做所有的事情:收發(fā)比特幣。
全服務錢包一個最大的缺點就是它把私鑰保存在聯(lián)網(wǎng)的設備上。這種折中的設備很常見,加上聯(lián)網(wǎng),使得很容易把私鑰從一個折中的設備傳送到攻擊者。
為防止私鑰被盜,很多錢包程序為用戶提供了一個選項:對保存私鑰的錢包文件進行加密。但私鑰不被使用好,可以保護私鑰,避免被盜。但是這無法防止攻擊者有計劃的捕捉到密鑰,或者從內(nèi)存讀到解密后的密鑰。
簽名錢包
為提升安全,在一個更為安全的環(huán)境中,私鑰可以在一個獨立錢包程序里面生成,保存。這些簽名錢包可以跟網(wǎng)絡錢包(可以跟比特幣P2P網(wǎng)絡交互)一起協(xié)同工作。
簽名錢包程序通常使用確定性密鑰構(gòu)建方式來創(chuàng)建父私鑰,父公鑰。這些父鑰可以創(chuàng)建子私鑰,子公鑰。

當?shù)谝淮芜\行簽名錢包,它會創(chuàng)建一個父私鑰,并把相應的父公鑰傳送到網(wǎng)絡錢包。
網(wǎng)絡錢包使用父公鑰來派生出子公鑰,并按需分發(fā)子公鑰,監(jiān)控在這些公鑰上的輸出,創(chuàng)建花掉這些輸出的非簽名交易,然后發(fā)送非簽名交易到簽名錢包。
在使用簽名錢包時,用戶常常有機會去審核這些非簽名交易的詳情(特別是輸出詳情)。
在審核交易后(這步是可選的),簽名錢包使用父私鑰派生出一個相應的子私鑰,同時簽名這些非簽名交易,并發(fā)送這些簽名交易到網(wǎng)絡錢包。
然后網(wǎng)絡錢包廣播這些簽名交易到P2P網(wǎng)絡。
下面的小節(jié)將會講述最常用的簽名錢包: 離線錢包,硬件錢包。
離線錢包
好幾個全服務錢包程序也可以當做兩個獨立的錢包: 一個程序當做簽名錢包(通常叫做:離線錢包),同時另外一個程序當作網(wǎng)絡錢包(通常叫做:線上錢包 或者 觀察錢包)
離線錢包因它有意運行在一個不聯(lián)網(wǎng)的設備上而得名,這會極大減少攻擊。在這種情況,通過類似USB這樣的媒介來轉(zhuǎn)移數(shù)據(jù),通常取決于用戶自己。 用戶的工作流程如下:
(離線) 關閉設備上的所有網(wǎng)絡連接,裝上錢包軟件。 在離線模式下,啟動錢包軟件,創(chuàng)建一個父私鑰,父公鑰,復制父公鑰到可以插拔的媒介上。
(在線)在另外一個設備上裝上錢包,這錢包要連上互聯(lián)網(wǎng),同時從可插拔媒介,導入父公鑰。跟你使用去錢包一樣,通過分發(fā)公鑰來收款。當準備花比特幣時,準備好輸出,并保存生成好的非簽名交易到可插拔媒介。
(離線)在離線錢包中,打開非簽名交易,審核輸出詳情,確保要支付的數(shù)量,地址是正確無誤的。這可以防止在線錢包中的惡意軟件欺騙用戶在支付給攻擊者上的交易簽名。審核后,簽名交易并保存交易到可插拔媒介。
(在線)在在線錢包中,打開簽名交易?,F(xiàn)在可以把它廣播到P2P網(wǎng)絡中。
離線錢包主要的優(yōu)點是:相比于全服務錢包,他們極大的提升了錢包的安全性。只要離線錢包沒有丟失或者有缺陷,并且在簽名前,用戶審核所有交易,用戶的satoshis是安全的,即使在線錢包泄露了。
離線錢包的主要的缺點在于使用起來太繁瑣。為了最大的安全,要求用戶用一個設備專用于離線任務。每當需要發(fā)送比特幣時,離線設備必須要啟動,同時用戶必須通過手動把數(shù)據(jù)在在線設備,離線設備之間來回復制。
硬件錢包
硬件錢包專門用來運行簽名錢包。它們消除了簽名錢包在目前操作系統(tǒng)上很多缺陷,它們允許錢包可以跟其他硬件安全的通信,因此用戶沒有必要手動的在設備之間傳送數(shù)據(jù)。硬件錢包用戶的使用流程如下:
(硬件錢包) 創(chuàng)建父私鑰,父公鑰。把硬件錢包連接到一個網(wǎng)絡錢包設備,這樣它就可以獲取到公鑰。
(網(wǎng)絡錢包) 同使用全服務錢包一樣,分發(fā)公鑰來收款。當準備花掉satoshis時,填充好交易細節(jié),并連接到硬件錢包,然后點擊支付。網(wǎng)絡錢包會自動把交易細節(jié)發(fā)送給硬件錢包。
(硬件錢包)在硬件錢包屏幕上審核交易細節(jié)。一些硬件錢包可能會彈出一個密碼或PIN輸入框。硬件錢包簽名交易,然后把它發(fā)送給網(wǎng)絡錢包。
(網(wǎng)絡錢包)網(wǎng)絡錢包從硬件錢包收到簽名交易后,把它廣播到P2P網(wǎng)絡。
相對于全服務錢包,硬件錢包的主要優(yōu)點是極大的提升了安全,同時比起離線錢包又簡單很多。
硬件錢包主要的缺點是使用起來繁瑣。即使比起離線錢包來沒那么繁瑣,但是用戶仍然需要購買一個硬件錢包,并且每當需要給交易簽名時,需隨身攜帶。
一個其他的缺點(希望是暫時的),在撰稿本文時,很少有主流的錢包程序支持硬件錢包 — 雖然很多主流的錢包已經(jīng)發(fā)公告說他們有意向支持至少一種硬件錢包。
分發(fā)錢包
那些運行在很難實現(xiàn)安全的環(huán)境,比如web服務器,的錢包的功能可以設計成僅僅分發(fā)公鑰(包括P2PKH, P2SH地址)。有兩個通用的方式來設計這些極簡的錢包。

先預準備一些公鑰或地址在一個數(shù)據(jù)庫里面,然后使用數(shù)據(jù)庫中的條目,按需分發(fā)公鑰腳本或者地址。為避免重用,web服務器跟蹤密鑰使用情況,永遠不要用完里面的公鑰。可以通過父公鑰很容易做到這點,這會在下面方面提到。
使用父公鑰生成子公鑰。為避免重用,需要使用一個方法保證一個公鑰不能被分發(fā)兩次。這可以是一個數(shù)據(jù)庫的條目對應一個密鑰分發(fā),或通過自增指針指向密鑰的索引號。
這兩個方法沒有增加太多額外的工作量,特別是在使用一個數(shù)據(jù)庫來,通過把每個進來的支付跟獨立的公鑰綁定起來跟蹤時,其工作量就更少。 具體情況支付處理章節(jié)。
錢包文件
比特幣的核心其實就是一堆私鑰集合。這些私鑰以數(shù)字內(nèi)容的形式存在文件里面,或甚至可以存在紙上。
私鑰格式
私鑰用來解鎖在一個比特幣地址上的satoshis。在比特幣中,一個私鑰的標準格式是一個簡單的256-bit 數(shù)字,值的范圍是: 0x01 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140, 所代表的值的范圍在2256 - 1. 這范圍由比特幣中使用的secp256k1 ECDSA加密標準來控制。
錢包導入格式(WIF)
為使復制密鑰少出錯,可以使用錢包導入格式。WIF使用base58Check 來編碼私鑰,可以極大的降低復制引起的錯誤,這看起來很像比特幣地址。
拿到一個私鑰。
用于主網(wǎng)地址時,在私鑰前面加上0x80,用于測試網(wǎng)地址時,在前面加入0xef。
如果跟壓縮公鑰(后續(xù)小節(jié)會講到)使用,需要在后面加入0x01,如果跟非壓縮公鑰使用,就什么都不用加。
對擴展后的私鑰進行SHA-256哈希。
對SHA-256哈希后結(jié)果再做一個SHA-256哈希。
拿掉第二次哈希后的哈希值的前4字節(jié),這4個字節(jié)是校驗和。
把這4字節(jié)校驗和插入到擴展私鑰倒數(shù)第5的位置。[?]
把結(jié)果從字節(jié)字符串,使用Base58Check轉(zhuǎn)化成Base58編碼字符串。
使用Base58解碼功能,很容易逆向操作這個過程,刪掉那些填充。
Mini私鑰格式
Mini私鑰格式通過小于30個字符來編碼私鑰的一種方法,可以把密鑰嵌入到非常小的物理空間上,比如一個物理的比特幣,抗破壞的QR二維碼。
第一個字母是: S
為判斷一個mini私鑰是否格式化良好,在私鑰中加入了一個問題標志。
計算私鑰的哈希值。如果哈希值第一個字節(jié)是00, 那它就是格式化良好的Mini私鑰。這個密鑰的限制起到校驗和的作用。用戶可以通過使用隨機數(shù)字暴力處理,來生成一個格式化良好的mini私鑰。
為了從完整的私鑰派生,用戶可以簡單的獲取一個源mini私鑰的SHA256哈希。這是個單向處理:從派生的密鑰去計算出mini私鑰是很困難的。
在很多的Mini私鑰的實現(xiàn)中,禁止在mini私鑰里使用字符 "1",因為它跟字符 “I” 很像。
資源:Casascius 比特幣地址工具: 一個創(chuàng)建,兌換這些密鑰的工具.
公鑰格式
在secp256k1中,比特幣 ECDSA 公鑰代表一條特定橢圓曲線(EC)上的一個點。在傳統(tǒng)的非壓縮格式,公鑰包含一個標識字節(jié),一個32字節(jié)x坐標,一個32字節(jié)y坐標。下面的一個簡化版插圖顯示了一個在y2 = x3 + 7 橢圓曲線上的一個點。超過了連續(xù)數(shù)字域。[?]

(Secp256k1實際通過一個大的素數(shù)對坐標進行取模,這會產(chǎn)生一個非連續(xù)整數(shù)域, 即使是使用同樣的原理,也會導致一個非常不清晰的坐標。)
在不改變?nèi)魏位驹瓌t,通用丟棄Y坐標,可以實現(xiàn)公鑰大小減半效果。這是有可能的,因為兩個在曲線上的點,共用一個X坐標,因此32字節(jié)Y坐標能夠用一個bit微替代,用來表示這個點是在曲線上部分,還是在下部分。
采用這樣方法壓縮,不會導致數(shù)據(jù)丟失 — 這僅需要一點點cpu來重建Y坐標,以及訪問非壓縮公鑰。在secp256k1文檔中,所描述的非壓縮,壓縮密鑰,在廣泛使用的OpenSSL庫中,是默認支持的。
因為他們很容易使用,因為比特幣內(nèi)核,默認會存儲每個輸出,加密公鑰,以及其他所有比特幣軟件也如此,為存儲這些公鑰,這種方式幾乎能為區(qū)塊鏈減少一半空間需求。
然而,比特幣內(nèi)核0.6之前的版本,使用的是非壓縮密鑰。這就帶來一定的復雜,因為非壓縮公鑰的哈希跟壓縮公鑰的哈希的格式是不一樣的,因此同一密鑰會有兩個不同的P2PKH,P2SH地址。這也就意味著密鑰在簽名腳本中,必須以正確的格式提交,這樣它才能跟之前輸出的公鑰腳本匹配上。
因為這個原因,比特幣內(nèi)核使用幾個不斷的標識字節(jié)來幫助程序識別怎么使用密鑰:
使用壓縮公鑰的密鑰,在他們進行Base58編碼前,需在其他后面加上0x01
非壓縮公鑰以0x04開頭,壓縮公鑰以0x03或0x02開頭,至于是0x03,還是0x02,取決于曲線上點在Y軸位置是大于中點,還是小于中點。 這些前綴字節(jié)在官方的secp256k1文檔中都有被用到。
層級確定性密鑰創(chuàng)建
層級確定密鑰創(chuàng)建和傳輸協(xié)議(HD 協(xié)議)極大的簡化了錢包備份,減少在同一錢包中,多個程序重復通信,允許創(chuàng)建可獨立操作的子賬戶,每個父賬戶可以監(jiān)控,控制它的子賬戶,即便子賬戶泄露了,同時可以把賬號分成可完全訪問,限制訪問部分,這樣不可信用戶或程序可以接收或者監(jiān)控支付情況,但沒有不能花里面的錢。
HD協(xié)議利用ECDSA公鑰的創(chuàng)建函數(shù) point(), 它采用一個非常大的整數(shù)(私鑰),把整數(shù)轉(zhuǎn)化成曲線上的一個點(公鑰)。
point(private_key) == public_key
因為point()內(nèi)部工作方式,通過組合一個已有的(父)公鑰,另外一個通過任何 整型(i) 數(shù)值生成的公鑰,可以創(chuàng)建一個子公鑰。 這個子公鑰跟公鑰一樣,可以通過point()函數(shù),在源(父)私鑰上加上一個整型數(shù)i,然后父公鑰跟 i 相加,再除以一個在比特幣軟件中的全局的常量,求余數(shù), 來創(chuàng)建。
point( (parent_private_key + i) % p ) == parent_public_key + point(i)
這就意味著,兩個或多個獨立的程序,在不需要更多的通信的情況下,同意一串數(shù)字能從單個父密鑰對創(chuàng)建一系列獨一無二的子密鑰對。更重要的是,為接受付款而分發(fā)這些公鑰的程序的確在不需要訪問私鑰,就能是的公鑰分發(fā)程序可以運行在可能不安全的平臺上,比如公共的web服務器。
子公鑰也能通過重復子密鑰派生操作,來創(chuàng)建他們自己的子公鑰(孫公鑰):
point( (child_public_key + i ) % p) == child_public_key + point(i)
是否要創(chuàng)建子公鑰或者下一代公鑰,一串可預測的整型數(shù)比起所有交易使用單個公鑰來說更好。因為任何人如果他知道一個子公鑰,他就可以找出所有由其父公鑰生成的其他所有子公鑰。相反,隨機種子能夠用來生成一串確定的整型數(shù)字,這樣在沒有種子的情況下,子公鑰之間的關系是不可見的。
HD協(xié)議使用單個根種子來創(chuàng)建一個層級的子,孫子,其他后代密鑰。他們是一些無相關性的,具有確定性生成的整數(shù)。每個子密鑰也可以從它的父密鑰獲得一個確定性生成的種子。叫做鏈碼,所以一個鏈碼泄露不會導致整個層級里的整數(shù)泄露,這就主鏈碼就可以繼續(xù)使用,即使,比如 一個基于web的公鑰分發(fā)程序被黑掉。

如上圖所示,HD密鑰派生需要4個輸入:
父私鑰,父公鑰,他們都是非壓縮256位 ECDSA密鑰。
父鏈碼 - 256位看似隨機的數(shù)。
索引號 - 程序指定的32位的整數(shù)
如上圖所示,單向加密哈希算法(HMAC-SHA512)把父鏈碼,父公鑰,索引號進行處理,生成一個確定的但看起來有點隨機的數(shù)據(jù)。 看似隨機的256位值右側(cè)部分算出的哈希值被用來當做一個新的子鏈碼。左側(cè)部分算出的哈希值被當做一個整數(shù),跟父私鑰或父公鑰組合一起,生成相應的子私鑰或子公鑰。
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)
對于同一父密鑰,指定不同的索引數(shù)字會創(chuàng)建不同的,無關聯(lián)的子密鑰。使用子鏈碼對子密鑰重復這個過程會創(chuàng)建無關的孫密鑰。
因為創(chuàng)建子密鑰需要一個秘密,一個鏈碼,他們兩合起來叫做擴展密鑰。一個擴展私鑰跟它相應的擴展公鑰有同一個鏈碼。主私鑰(跟私鑰)和主鏈碼是從隨機數(shù)據(jù)派生而來,如下圖所示:

根種子通過128或256或512位隨機數(shù)創(chuàng)建。為了能讓使用特定設置的特定錢包程序派生每個密鑰,用戶只需要存儲根種子中的128位即可。
警告: 在撰寫本文時,HD錢包程序不能達到完全兼容,因此對于一個特定的根種子,用戶必須使用同一個HD錢包程序,并使用同樣的HD相關設置。
根種子通過哈希之后生成看似隨機的512比特位數(shù)據(jù),主密鑰,主鏈碼通過這512比特為數(shù)據(jù)來生成。主公鑰使用point()從主私鑰派生,主公鑰和主鏈碼一起,通過point()來生成主擴展公鑰。主擴展密鑰在功能上跟其他擴展密鑰是一樣的;它只是因為在在層級的最頂部而已。
強化密鑰
強化擴展密鑰解決了普通擴展密鑰的一個潛在問題。如果一個攻擊者獲取一個普通父鏈碼,一個父公鑰,他可以暴力破解從它生成的所有子鏈碼。如果攻擊者也能獲得一個子/孫子/其他后代的私鑰,他就可以使用鏈碼來生成所有從這私鑰派生來的所有的擴展私鑰。 如下面孫子,曾孫子插圖中所示:

更糟糕情況,攻擊者能逆向普通私鑰派生公式,并從父鏈碼提取出一個字密鑰,從而恢復父私鑰,就如上圖子代跟父代之間所顯示的那樣。 這就意味著攻擊者拿到一個擴展公鑰,以及它的一個后代密鑰后,他就能恢復父私鑰,以及它所以的后代密鑰。
因為這個原因,相比較于標準公鑰而言,擴展公鑰的鏈碼部分需要更好的安全保護措施。并建議用戶不要把非擴展私鑰導出到可能不可信,不安全的環(huán)境。
這可以通過一個折中的方案來解決,通過把普通密鑰派生公式替換成強化密鑰派生公式。
在上節(jié)講到的普通密鑰派生公式,是通過把索引號,父鏈碼,父公鑰組合起來,來創(chuàng)建一個子鏈碼,同時把一個整數(shù)跟父私鑰組合起來,來創(chuàng)建一個子密鑰。

如上圖所示,強化公式把索引號,父鏈碼,父私鑰組合起來創(chuàng)建一個用于生成子鏈碼,子私鑰的數(shù)據(jù)。這個公式使得在無需知道父密鑰的情況下,創(chuàng)建子公鑰成為可能。 換句話說,父擴展公鑰不能創(chuàng)建強化子公鑰。
因為這原因,強化擴展私鑰比起普通的擴展私鑰用處更少 — 然而,強化擴展公鑰創(chuàng)建了一個防火前,使得多層級派密鑰泄露不會發(fā)生。因為強化子擴展公鑰不能自己生成孫子鏈碼,那么使用泄露的父擴展公鑰,泄露的孫子私鑰是不能創(chuàng)建曾孫子擴展私鑰的。
HD協(xié)議使用一個索引號來指示是生成普通的,還是強化的密鑰。范圍在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協(xié)議的錢包僅能創(chuàng)建主私鑰的強化后代密鑰,以防止子密鑰泄露導致主密鑰泄露。 因為主密鑰沒有普通的子密鑰,在HD錢包中也沒有用到主公鑰。其他所有的密鑰可以普通的子密鑰,因此也可以使用相應的擴展公鑰來替代普通的子公鑰。
HD協(xié)議中介紹了擴展公鑰,擴展私鑰序列化格式。更多詳情,請看開發(fā)者參考中錢包章節(jié)或者 在BIP32了解HD協(xié)議詳情。
存儲根種子
在HD協(xié)議中,根種子是一些128位,258位,512位比特隨機數(shù)據(jù)。必須要精確的保存好他們。為了更方便使用非數(shù)字方式保存他們,比如記憶,手寫,BIP39 定義了一個方法。該方法可以通過由普通單詞偽造出的句子(幫組記憶的)來生成512位根種子。 這句子通過128或256位的熵生成的,并且可以使用密碼來保護這些組記詞。
單詞個數(shù)跟消耗熵數(shù)量之間的關系如下:
| 比特熵 | 單詞數(shù)量 |
|---|---|
| 128 | 12 |
| 160 | 15 |
| 192 | 18 |
| 224 | 21 |
| 256 | 24 |
密碼長度沒有限制。它只是簡單的加到組記詞的后面,然后使用HMAC-SHA512對他們進行2048次哈希計算,獲得一個看似隨機的512比特未種子。因為任何輸入到這個哈希函數(shù)的數(shù)據(jù),都會生成一個看似隨機的512比特位的種子,因為沒有一個基本的方法證明用戶輸入了正確的密碼,這樣即使用戶在強迫下,也有可能保護好種子。
想要了解更多詳情,請查看BIP39.
松散密鑰錢包
松散密鑰錢包也叫密鑰串(JBOK), 這種形式的錢包源自于比特幣內(nèi)核客戶端,目前已被遺棄不用。比特幣內(nèi)核客戶端錢包會通過偽隨機數(shù)生成器(PRNG)創(chuàng)建100個私鑰/公鑰對,以備后用。
這些私鑰儲存在一個虛擬的“密鑰池”,當之前的密鑰被使用后,它會生成新的密鑰對,這樣確保密鑰池維持有100個未被使用的密鑰。(如果錢包被加密,新的密鑰只有在被解鎖后才可以生成新的密鑰)
考慮到不得不手動備份新生成的私鑰,這會對保存密鑰帶來相對大的困難。如果新的密鑰生成后,被用掉,但在備份前丟失了,那么里面的比特幣就永遠丟失了。很多老式的移動錢包則使用一個簡單的格式,它們僅當用戶需要的時候,才生成一個新的私鑰。
因為備份太繁瑣,這類錢包正逐步被淘汰,也不鼓勵大家使用。
聲明:
文中帶有[?]的地方,表示我對此翻譯明顯感覺不太對的,后續(xù)會不斷修正。
有些地方可能會翻譯的不好,不地道,甚至錯誤,如果有發(fā)現(xiàn),還請留言,指出,以便我好修正,謝謝!