去中心化加密货币钱包系统设计
业务流
客户端:
- 生成账户
- 导入账户
- 构建、签名、发送交易
- 查询余额、交易记录
节点
- 提供查询:余额、gasPrice、account nonce
- 广播交易
服务端
- 提供接口:节点信息、历史交易
- 消息推送
- 解析账本信息(历史交易记录)
钱包后端模块
后端由六个模块组成,分别是对前端 APP 提供接口服务、定时任务更新监听地址交易状态、同步解析账本信息到中心数据库服务、前端接口服务查询区块链信息的 gRPC 服务、最新区块监听服务(用以充值提醒)、区块链节点。
- WalletAPI: 用以给前端提供接口,主要接口有查余额,交易状态及构建交易。
- Ledger: 同步区块数据到 elasticsearch 方便检索,对 gRPC 服务提供查询余额、比特币的 UTXO 等
- Node: 提供 RPC 服务,监听最新区块、查询以太坊账户信息、必要的区块数据同步解析到中心数据库
- MQ: RabbitMQ 作为节点和 RPC 监听最新区块的消息中间件。包含消息生产者和消费者。
- WalletRPC: 微服务通讯服务。作为区块链节点和钱包接口交互的跳板中间件,抽象节点服务区块链层。
- ScheduleJob: 追踪监听地址尚未达到限定确认数的交易;获取第三方行情数据。
模块间事件驱动和数据流
模块之间的事件驱动及数据流,分三大模块:地址登记、充值到账消息推送、钱包操作和信息查询。系统间消息和数据流通过 MQ 和 RPC 链接。
登记地址
我们需要给钱包推送消息(充值消息或系统公告)故钱包所属的设备标识需和钱包地址关联。
- 客户端请求 WalletAPI,存储地址在钱包设备有关信息,比如设备标识
- WalletAPI 通过 gRPC 调用 WalletRPC 服务把需要监听的地址同步到 elasticsearch
RPC 服务端 (MonitorAddressRPC) 调用 SQL2Es 把钱包对外的网关 API 登记的地址同步到 elasticsearch ,方便充值监听检索。
通知
消息推送有两类,分别为系统公告和充值到账消息。系统公告放在运营后台,充值到账依赖节点最新区块的回调。
- 最新区块消息生产者:节点产生新区块的回调,RabbitMQ 消息生产者把区块所有的交易信息推送到 MQ broker 。
- 接受并处理最新区块:取回 MQ broker 中消息体,并把 raw block message 通过调用对应的 RPC 服务处理对应币种的充值。
RPC 服务端 (WalletNotifyRPC) 处理消息体,并在 elasticsearch 中检索是否存在与系统有关的交易,存在则调用第三方消息推送服务商触发推送。
钱包信息查询和操作
钱包信息查询包含余额查询、单条交易状态查询和历史交易记录查询,钱包操作只涉及到提现。
前端网关 API 服务职责不涉及与区块链节点的交易,通过 RPC 服务端 (WalletMiddlewareRPC) 获取区块链相关服务。
不同公链实现有所差异:
- 比特币 (UTXO base) 的公链如果不是通过节点软件集成的钱包不能直接获取余额,而以太坊 (Account base) 可通过节点获取余额及账户交易索引。
- 交易记录:比特币和以太坊都需要把公链的账本解析到中心数据库。
设计到的 RPC 方法如下:
- 余额:Balance 比特币在解析好的 elasticsearch 数据库中获取,以太坊请求节点获取。
- 历史记录:GetTxes 比特币和以太坊都从解析好的 elasticsearch 数据库获取
- 交易状态:GetTx 比特币和以太坊请求节点获取
- 构建交易: ConstructTx 比特币去解析好的数据中查找 UTXO 并去节点校验;以太坊从节点获取余额和账户交易索引构建
区块链账本数据同步
解析区块链账本的所有区块,结构化并同步到中心数据库 elasticsearch 。比特币的余额和 UTXO 、以太坊的历史交易是钱包业务涉及到的数据。
定时任务
- 汇率数据抓取
- 追踪监听地址交易状态
钱包需要第三方交易所汇率数据展示行情和资产估值统计,定时任务抓取第三方 API 刷新缓存数据。另外系统追踪监听地址尚未达到限定确认数的交易。
系统结构体系
写在最后
参考链接