美文网首页
以太坊钱包梳理

以太坊钱包梳理

作者: arthur25 | 来源:发表于2019-01-16 10:42 被阅读23次

    钱包是用来管理钱包地址和用户私钥。

    以下是钱包的工作流程:

    • 创建:
      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'))
    }
    

    钱包的安全问题

    • 私钥安全
      存放的私钥一定要是密文;解密的操作要让用户手动输入密码;私钥使用中,不能进行明文传输,如微信,邮件等;私钥的存储应当放与本地,不要存放于百度云之类的云盘。

    • 助记词
      助记词的安全级别同私钥是相等的,助记词的存储应该和私钥隔离开,不要建议用户将私钥截图或下载于本地,尽量用笔抄录进行保存,保证与物理机分离开。

    相关文章

      网友评论

          本文标题:以太坊钱包梳理

          本文链接:https://www.haomeiwen.com/subject/qvipdqtx.html