上一篇文章裏提到怎麼隨機生成助記詞。這篇文章我們來個反向操作。
很多錢包軟件,可以讓用戶導入助記詞來生成新的錢包。下面我們來實現這個過程的其中一部分功能。
- 首先找到每個助記詞在助記詞列表中的下標。
- 然後把所有下標數字只取11bit串聯起來,這時候就得到熵|checksum
- 去掉最末尾的checksum就得到了熵
實現代碼如下:
//傳入助記詞句子,每個單詞用空格符隔開
func Mnemonics2Entropy(words string) (string, error) {
//參數校驗
var wordList = strings.Split(words, " ")
var wordAmount = uint(len(wordList))
if !(wordAmount >= 12 && wordAmount <= 24 && wordAmount%3 ==0) {
return "", errors.New("invalid mnemonic word")
}
var (
mnemonicMap = words2Map()
entropy = big.NewInt(0)
mnemonicIndex uint64
)
for i:=uint(0); i<wordAmount; i++ {
mnemonicIndex = mnemonicMap[wordList[i]]
entropy.Lsh(entropy, mnemonicBitLen)
entropy.Or(entropy, new(big.Int).SetUint64(mnemonicIndex))
}
//此時算出來的是entropy|checksum,需要把checksum截去不用
entropy.Rsh(entropy, wordAmount/3)
return hex.EncodeToString(entropy.Bytes()),nil
}
測試代碼:
func TestMnemonics2Entropy(t *testing.T) {
t.Run("test parse mnemonic words to seed", func(t *testing.T) {
mnemonicWrods := "future mix clown shove caution tooth avoid tower cake couch fault elder"
var (
seed string
err error
)
if seed, err = Mnemonics2Entropy(mnemonicWrods);err != nil {
t.Error(err)
return
}
want := "5e91c0b063824bc984073120461d4fa3"
if seed != want {
t.Error("error seed")
t.Error("want:", want)
t.Error("got:", seed)
}
})
}
(全文完)