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())