区块链钱包分为两类:冷钱包和熱钱包通俗的讲冷钱包就是钱包存在本地,热钱包则是存在服务端本文主要对冷钱包进行分析以及一些相关业务功能的介绍。相关插件:bip39(生成助记词)ethereumjs-wallet(生成钱包,导入导出),ethereumjs-tx(转账签名),ethereumjs-util(ETH功能集成插件),cryptojs(加密)
我们知道区块链钱包有几个概念:助记词、私钥、地址、keyStore
- 助记词(單向=>)私钥
- 私钥(单向=>)地址
- 导入钱包(助记词导入keyStore导入,私钥导入)
- 钱包管理(导出私钥导出keyStore,修改密码)
存在本地钱包加密前的數据格式
创建钱包 创建钱包流程: 生成随机助记词 => 通过助记词创建钱包=>钱包信息和加密明文(私钥和密码加密)AES加密存入localStorage
通过插件提供方法根据助记词|keyStore|私钥,找到钱包信息(地址和私钥)=>钱包信息和加密明文(私钥和密码加密)AES加密存入localStorage
钱包管理需要密码验证由于本地存的是私钥和密码加密后的加密私钥,解密需要私钥和原密码来解密因此不能直接通过解密获取原密码。所以我们需要换一个思路来验證由前文的关系可知私钥可以找到钱包地址,所以可以解密钱包的字符串通过钱包地址获取加密的钱包信息,再通过用户输入的密码囷加密私钥解密获取解密私钥再通过私钥获取地址,判断用户输入的和原密码解密后的私钥获取的地址是否一致
密码验证流程:解密錢包明文 => 得到所有加密钱包[{"wallet address": 加密私钥(钱包和密码)},...] => 地址获取当前加密钱包信息 => 通过用户输入的密码和加密私钥解密获取解密的私钥 => 通过解密私钥去获取地址 =>判断地址和当前地址是否一致