BIP39錢包助記詞規(guī)范
BIP: 39
層級(jí):應(yīng)用層
鏈接:https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
創(chuàng)建時(shí)間:2013-09-10
1. 摘要
BIP39描述了一個(gè)助記碼或助記句(一組容易記住的單詞)的實(shí)現(xiàn)棕诵,用于生成確定性錢包凿将。目前是業(yè)界通用的助記詞規(guī)范价脾。
它由兩部分組成:生成助記符,并將其轉(zhuǎn)換為二進(jìn)制種子侨把。這個(gè)種子稍后可以使用BIP-0032或類似的方法來(lái)生成確定性錢包。
2. 動(dòng)機(jī)
與處理錢包種子的原始二進(jìn)制或十六進(jìn)制表示相比获枝,助記碼或句子更適合于人類交互骇笔。這個(gè)句子可以寫在紙上,也可以在電話里說(shuō)明笨触。
本規(guī)范旨在用人類可讀的轉(zhuǎn)錄來(lái)傳輸計(jì)算機(jī)生成的隨機(jī)性。它不是一種將用戶創(chuàng)建的句子(也稱為腦錢包)處理成錢包種子的方法芦劣。
3. 生成助記詞
我們將隨機(jī)數(shù)叫做熵。注記詞必須將熵編碼為32位的倍數(shù)虚吟。隨著熵的增加,安全性提高废麻,但助記詞的句子長(zhǎng)度增加模庐。我們將初始熵長(zhǎng)度稱為ENT。允許的ENT大小為128-256位掂碱。
生成步驟為:
- 生成ENT位的初始熵
- 生成校驗(yàn)和,校驗(yàn)和的長(zhǎng)度為
ENT/32
沧卢,取熵hash后的前ENT/32
位作為校驗(yàn)和 - 將這個(gè)校驗(yàn)和附加到初始熵的末尾
- 將步驟3組成的串按每11位進(jìn)行切割醉者,編碼為0-2047的數(shù)字(因?yàn)锽IP39的詞庫(kù)是2048個(gè)披诗,即2的11次方)
- 根據(jù)步驟4得到的每11位的數(shù)字索引匹配詞庫(kù)中的相應(yīng)單詞
- 根據(jù)步驟5得到的單詞連接起來(lái)即得到最終的助記詞串
下表描述了初始熵長(zhǎng)度(ENT)立磁、校驗(yàn)和長(zhǎng)度(CS)和生成的助記詞句子長(zhǎng)度(MS)之間的關(guān)系。
CS = ENT / 32
MS = (ENT + CS) / 11
| ENT | CS | ENT+CS | MS |
+-------+----+--------+------+
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
4. 單詞表
理想的單詞表具有以下特點(diǎn):
a) 巧妙選詞
- 單詞表的創(chuàng)建方式為鍵入前四個(gè)字母足以來(lái)明確地標(biāo)識(shí)單詞
b) 類似的詞避免
- 像"build"和"built"宪摧,"woman"和"women"颅崩,或"quick"和"quick"這樣的詞對(duì)不僅使記憶句子變得困難,而且更容易出錯(cuò)沿后,更難猜測(cè)
c) 分類詞庫(kù)
- wordlist是排序的,這樣可以更有效地查找代碼(即實(shí)現(xiàn)可以使用二進(jìn)制搜索代替線性搜索)
- 也允許使用trie(前綴樹)喉刘,例如為了更好的壓縮
單詞表可以包含本地化字符熔掺,但必須使用規(guī)范化表單兼容性分解(NFKD)以UTF-8編碼。
5. 從助記詞生成種子
用戶可能決定使用密碼保護(hù)其助記符置逻。如果沒(méi)有密碼,則使用空字符串""鬓催。
為了從助記詞中創(chuàng)建二進(jìn)制種子恨锚,我們使用PBKDF2函數(shù),使用助記句(UTF-8 NFKD編碼)作為密碼猴伶,使用字符串"mnemonic"+密碼(UTF-8 NFKD編碼)作為鹽。迭代計(jì)數(shù)設(shè)置為2048筝尾,使用HMAC-SHA512作為偽隨機(jī)函數(shù)办桨。期望得到的密鑰長(zhǎng)度是512位(64 字節(jié))。
這個(gè)種子稍后可以使用BIP-0032或類似的方法來(lái)生成確定性錢包呢撞。將助記句轉(zhuǎn)換為二進(jìn)制種子與生成句子完全無(wú)關(guān)饰剥。這形成了相當(dāng)簡(jiǎn)單的代碼摧阅;句子結(jié)構(gòu)沒(méi)有限制,客戶端可以自由地實(shí)現(xiàn)自己的單詞列表古沥,甚至是整個(gè)句子生成器娇跟,這使得單詞列表在檢測(cè)錯(cuò)別字或其他目的方面具有靈活性太颤。
6. 單詞表規(guī)范
7. 各語(yǔ)言的參考實(shí)現(xiàn)方案
python:
Go:
Elixir:
Objective-C:
Haskell:
.NET C# (PCL):
.NET C# (PCL):
https://github.com/NicolasDorier/NBitcoin
JavaScript:
- https://github.com/bitpay/bitcore-mnemonic
- https://github.com/bitcoinjs/bip39 (used by blockchain.info)
Ruby:
Rust:
Swift:
C++:
C (with Python/Java/Javascript bindings):