以太坊钱包项目EthWallet

项目背景

  • 本项目为自发组织的DApp开发者为了学习区块链而创建
  • 项目源代码开源 github地址

项目描述

  • 项目是一个以太坊钱包
  • 目标是用各种语言实现服务器端,而后实现多种平台的客户端
  • 本次介绍为本人负责的java版本服务器端和微信小程序客户端的实现
  • 服务器端维护用户的keystore,并让用户自己保存密码,相当于支付密码由用户自己保存

功能描述

  • 多账户管理
  • 基于ERC20的token 管理
  • 实现以太坊交易,token转账
  • 实现以太币,token的余额刷新
  • 支持助记词,私钥导入账户及随机新建账户

模块示意图

模块示意图

模块介绍

服务器端

网关

负责api总入口,权限管理

账户/权限服务

不重要略过

钱包核心服务

钱包创建
  • 支持BIP32,BIP39,BIP44
  • 当然BIP32 只用到第一组,master key ,方便后期扩展
  • BIP39 支持 助记词的功能
  • BIP44 支持路径的方式定义钱包结构树,可以从一组助记词派生不同虚拟币的地址,也是方便后期扩展
多网络支持
  • 项目并没有搭建自己的节点而是通过 infura节点
  • 支持 MAINNET,ROPSTEN,KOVAN,RINKEBY
  • 因为项目没有节点的功能,不是一个节点,只是实现了交易签名和广播,因此以上4个节点支持应该没问题(不完全测试^_^)
查询余额/交易
  • 项目使用了web3j这个项目作为辅助实现
  • 实现以太币余额查询,erc20 Token 接口的余额查询
  • 实现交易的离线签名,这里智能合约的调用(token交易)也属于交易只要涉及到gas 消耗都属于交易,所以都需要签名
离线签名
  • 服务器端保存用户私钥的方案:keystore 和geth一样
  • keystore 是 存储在数据库表的一个字段中的json字符串
  • geth 中有unlockAccount的感念,其实就是解密keystore而后缓存
  • 而本项目 是每次签名的时候临时unlock,用完当场销毁
  • unlock密码通过api传递,而api用https协议,也相对提高了安全性

服务器结构说明

钱包数据服务(核心服务)
  • 负责数据维护,并不负责交易的直接实现
  • 对于和节点通讯过程中非常耗费CPU时间以及内存占用
  • 和节点通讯很容易导致客户端长时间等待以及超时的可能性
  • 所以把通讯任务直接交由 通讯模块来异步完成
  • 弊端是客户端在提交交易后,需要多次刷新或者等待比较长的时间交易状态/余额状态才会发生改变
节点通讯模块
  • 因为基于消息队列模式(消息中间件RabbitMQ)
  • 相当于多个相同功能的模块排队等待处理业务,因此在业务提升的时候很方便扩容
  • 在业务返回结果后,也通过消息队列 通知 核心服务更新数据

对于web3j的坑点说明

  • 在交易发送完成后查询交易结果,99% 是获取不到结果的,并且判断是否有错误,提示没错误… 坑了我1天半
  • 这个不算是web3j的坑,是网上资料的坑,所有的介绍都是直接查询,从来不提及没结果的可能性
  • 解决方案是发送完成后直接查询,如果没有直接返回,核心模块发现没有交易结果,再发送一个查询任务到通讯模块,通讯模块循环查询判断是否有 result数据,没有间隔多少时间继续查
  • web3j对于以太币离线交易提供了一个专用的对象,这个对象内应该是实现了死循环查询,知道有结果了返回的

客户端说明

控制台

  • 用来后台管理的用的,管理员专用

小程序客户端

  • 基于微信小程序实现的客户端(因为内容原因,不让上线…)
  • 主界面介绍 

其他客户端

  • web端目前由其他组员在实现
  • android