BIP

我们知道区块链的钱包存放着加密资产,助记词是开启钱包的钥匙。一旦助记词丢失,钱包就再也打不开了。

其实在早期并没有助记词,钱包就是一堆私钥。由于私钥管理起来太麻烦,于是有了 BIP-32 提议(分层推导私钥)。这时只需要记住一个私钥,其余账户通过分层确定性推导即可得到。

但是私钥对于人类来说还是很难记忆。于是又有了BIP-44。通过助记词的方式记住私钥。助记词本质上是私钥的另一种表现形式。

注: BIP(Bitcoin Improvement Proposals) 比特币改进建议, BIP-44是第44个改进建议。

MetaMask

MetaMask 使用的是 BIP-44 改进建议,派生路径为:m/44'/60'/0'/0

路径等级:

m / purpose' / coin_type' / account' / change / address_index
  • m 和 purpose都是固定的。
  • coin_type 表示币种,比如:0代表比特币,1代表比特币测试链,60为以太坊正式链。
  • change 0用于外部可见地址,1为内部不可见地址。
  • address_index 账户地址索引,从0开始递增。

MetaMask 通过address_index生成多个子账户,并且生成的子账户只和助记词相关,和密码无关。

这里使用 Go 语言进行验证,从 MetaMask 导出助记词,通过 Go 计算出账户1的地址和 MetaMask 一致。

mnemonic := "mail index crime awake foam lab rubber segment dice prepare wage hundred"
wallet, _ := hdwallet.NewFromMnemonic(mnemonic)
path := hdwallet.MustParseDerivationPath("m/44'/60'/0'/0/0")
account, _ := wallet.Derive(path, true)

log.Println("address1", account.Address.Hex())

Reference