钱包基础
钱包是最基础的入口,做 DApp 开发首先也是需要有个钱包才能进行合约部署和交互,因此,我们先来了解下钱包方面的一些基础知识。前面章节介绍过一些钱包,包括 MetaMask、WalletConnect、TokenPocket 等,这些都是些具体的钱包应用。用户使用这些钱包应用创建和管理每个人自己的钱包账户,用于管理自己的数字资产,每个用户还可以根据不同需求创建多个钱包账户。
首先,我们使用 MetaMask、TokenPocket 等钱包应用第一次生成钱包账户的时候,最重要的一步是生成助记词。如果把您的钱包比喻成保险箱,那助记词就相当于您的保险箱钥匙。助记词通常是由 12 个有序的英文单词所组成,硬件钱包则会生成 24 个英文单词的助记词,需要用户自己线下保存好这些助记词,绝对不能泄露也不能丢失,否则的话,您钱包里的资产也可能会丢失。
助记词其实是由 Bitcoin 的一个标准 BIP39 所定义的,12/24 个有序单词是从该标准中所定义的词库中(2048 个单词)由随机算法选出来的。BIP39 标准中,也有定义了多种其它语言的词库,包括中文简体、中文繁体、法文、日文、韩文等,但目前市场上的主流钱包都统一只使用英文词库。
根据 BIP39 标准,生成助记词之后,下一步则是使用 PBKDF2 算法推导生成 512 位的钱包密钥种子。使用 PBKDF2 算法需要两个输入,密码和盐值,助记词作为密码,而盐值则是由固定单词 “mnemonic” 加上用户自己提供的密码短语字符串拼接而成,用户提供的密码可以为空。大部分用户也是会选择空密码,不然的话,那用户除了需要保存助记词之后还得记下这个可选密码才行。需要恢复钱包的时候,不记得密码的话,只有助记词是无法成功恢复钱包的。PBKDF2 使用 2048 轮 HMAC-SHA512 哈希算法来扩展助记词和盐值参数,产生 512 位值作为其最终输出,而这个 512 位的值就是种子。使用助记词来生成种子的步骤如下图:
生成种子之后,下一步则是根据 BIP32 和 BIP44 生成标准的分层确定性钱包,简称 HD 钱包。HD 钱包的基本原理是根据标准算法可以生成树状结构的多个钱包密钥,如下图所示:
简单来说,BIP32 定义了 HD 钱包的结构,而 BIP44 则规定了支持多链 HD 钱包子私钥派生路径的标准格式,比如以太坊第一个钱包子私钥派生路径为 m/44'/60'/0'/0/0。有了 BIP32 和 BIP44 标准下的 HD 钱包,再结合 BIP39 规范的助记词,用户只需要记下一套助记词,就可以生成和管理不同链的多个不同钱包。
接着,再来介绍下钱包地址是怎么生成的。简单来说,地址是由这样一条单向路径推导出来的:私钥 -> 公钥 -> 地址。不管是比特币还是以太坊,私钥 -> 公钥的这一步是一样的,都是使用 ECDSA(椭圆曲线加密)算法生成的,但从公钥 -> 地址的这一步的算法就不同了。比特币从公钥生成地址的算法主要是结合使用 SHA256 和 RIPEMD160 双哈希算法先计算出公钥哈希,再将公钥哈希用 Base58 编码转换一下就得到了比特币地址。而以太坊的算法主要是先将 64 字节的公钥用 keccak256 算法计算得到 32 字节的压缩公钥,再从压缩公钥中取最后 20 字节作为钱包账户地址,最终的地址大致为这样:0xd2020857fC3334590E85b048b99f837178d7512a。
另外,同一个以太坊地址还可以在不同的 EVM 链中通用,包括 BNB Chain、Polygon、Arbitrum、Optimism,以及 Goerli、Sepolia 等测试网,因为这些 EVM 网络所使用的加密算法和协议是相同的,因此它们生成的地址也是相同的。这种地址的通用性使得用户可以更轻松地在不同的 EVM 链之间转移资产和交易,并且不必为每个不同的 EVM 链创建一个新的地址。
简而言之,钱包地址生成的整个推导流程大致为:助记词 -> 种子 -> 私钥 -> 公钥 -> 地址。这也是现在标准的钱包地址生成方案。而对于新方向的 MPC 钱包和智能合约钱包则是无助记词的技术方案,技术上比较复杂且还未形成成熟的行业标准,所以就不展开介绍其技术原理了。