以太坊钱包梳理
钱包是用来管理钱包地址和用户私钥。
以下是钱包的工作流程:
-
创建:
1. 生成助记词(后续);
2. 根据助记词调用web3.eth.accounts.create([entropy])来创建新的钱包用户,此时将会得到用户的钱包地址和私钥;
3. 地址和私钥是放置于用户安装的钱包客户端中的本地文件,不存放于数据库;
4. 存放的钱包需要经过过web3.eth.accounts.encrypt(privateKey, password)加密,password需要用户输入,每次使用时都需要用户手动输入密码,
通过web3.eth.accounts.decrypt(keystoreJsonV3, password)解密得到密钥,切记私钥的使用不可通过明文直接传输;
5. 图标,通过预置的图标为用户创建钱包时随机分配钱包头像,目的是为了明显区别多个钱包。 -
准备交易:
1. 通过用户输入的密码解密用户私钥,得到钱包账户,相当于是解锁账户;
2. 整理交易的基本信息,包括from,to,gasPrice,gas等等信息。 -
签名:
1. 通过web3.eth.accounts.signTransaction(tx, privateKey [, callback])为transaction签名,既为此交易授权; -
发送:
1. 通过web3.eth.sendSignedTransaction(signedtx)发送交易;
2. 通过.then()来获取正确的回调信息,通过.catch()来捕获失败信息,并在客户端中展示交易的状态。
语法参考
promise
eg:
async createBlog(user: UserDTO, blog: CreateBlogDTO) {
const account = this.web3.eth.accounts.privateKeyToAccount(privateKey)
//此方法替换为本地获取私钥文件并用decrypt解密
const callData = this.contract.methods.createBlog(blog.title,blog.content).send.request({
from: myAccount.address,
gasPrice: '0',
gas: '4000000',
})
const sign = await account.signTransaction(callData.params[0])
await this.web3.eth.sendSignedTransaction(sign.rawTransaction.toString('hex'))
}
钱包的安全问题
-
私钥安全:
存放的私钥一定要是密文;解密的操作要让用户手动输入密码;私钥使用中,不能进行明文传输,如微信,邮件等;私钥的存储应当放与本地,不要存放于百度云之类的云盘。 -
助记词:
助记词的安全级别同私钥是相等的,助记词的存储应该和私钥隔离开,不要建议用户将私钥截图或下载于本地,尽量用笔抄录进行保存,保证与物理机分离开。