比特幣分層確定性錢包實現探究——02用助記詞生成熵

上一篇文章裏提到怎麼隨機生成助記詞。這篇文章我們來個反向操作。

很多錢包軟件,可以讓用戶導入助記詞來生成新的錢包。下面我們來實現這個過程的其中一部分功能。

  1. 首先找到每個助記詞在助記詞列表中的下標。
  2. 然後把所有下標數字只取11bit串聯起來,這時候就得到熵|checksum
  3. 去掉最末尾的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)
		}
	})
}

(全文完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章