fwm227 / blog

:books: my personal blog
https://fwm227.github.io/blog
1 stars 0 forks source link

ETH冷钱包实现思路 #22

Open fwm227 opened 4 years ago

fwm227 commented 4 years ago

前言

区块链钱包分为两类:冷钱包和热钱包。通俗的讲冷钱包就是钱包存在本地,热钱包则是存在服务端。本文主要对冷钱包进行分析以及一些相关业务功能的介绍。相关插件:bip39(生成助记词),ethereumjs-wallet(生成钱包,导入,导出),ethereumjs-tx(转账签名),ethereumjs-util(ETH功能集成插件),cryptojs(加密)

正文

我们知道区块链钱包有几个概念:助记词、私钥、地址、keyStore

这几个关系如下:

钱包业务功能

业务功能分析

存在本地钱包加密前的数据格式 [{"wallet address": 加密私钥(私钥和密码进行加密)+其他钱包信息},...] 创建钱包 创建钱包流程: 生成随机助记词 => 通过助记词创建钱包=>钱包信息和加密明文(私钥和密码加密)AES加密存入localStorage

导入钱包 通过插件提供方法,根据助记词|keyStore|私钥,找到钱包信息(地址和私钥)=>钱包信息和加密明文(私钥和密码加密)AES加密存入localStorage

钱包管理 钱包管理需要密码验证,由于本地存的是私钥和密码加密后的加密私钥,解密需要私钥和原密码来解密,因此不能直接通过解密获取原密码。所以我们需要换一个思路来验证,由前文的关系可知私钥可以找到钱包地址,所以可以解密钱包的字符串,通过钱包地址获取加密的钱包信息,再通过用户输入的密码和加密私钥解密获取解密私钥,再通过私钥获取地址,判断用户输入的和原密码解密后的私钥获取的地址是否一致。

密码验证流程:解密钱包明文 => 得到所有加密钱包[{"wallet address": 加密私钥(钱包和密码)},...] => 地址获取当前加密钱包信息 => 通过用户输入的密码和加密私钥解密获取解密的私钥 => 通过解密私钥去获取地址 =>判断地址和当前地址是否一致

转账和收款 转账涉及到交易的签名,而ethereumjs-tx则提供相应的方法。转账还涉及到矿工费用的计算,矿工费用(gas) = gasPrice * gaslimit,gas和eth换算关系: 1eth = 1e9(gwei) 收款生成相应的地址二维码既可

fwm227 commented 4 years ago

钱包能更安全地存储、交易和管理数字货币,不过钱包开发有些麻烦,想要开发一个功能强大、便捷又安全的钱包技术门槛又高,现在很少有个人或者交易所团队自主开发钱包了,大多都选用优盾钱包https://www.uduncloud.com/了

这个是公司项目需求才需要自主研发,文章里只是个人的项目笔记。一般用第三方确实会便捷很多😀