返回履历

Conflux · BIM Wallet · React Native

BIM Wallet

第一次做钱包,从 0 做到双 Space 移动钱包 1.0 上线

BIM Wallet 1.0 已正式上线。这款本地优先的自托管钱包在本地管理账户与资产数据,既支持普通软件账户,也支持中国电信 BSIM 卡硬件签名。

513
在 Venus 仓库中的个人提交
2 Spaces
Conflux Core Space 与 EVM / eSpace
11 次
围绕通用 Gas Station 的关键提交
7 个状态
王哥主导的本地交易生命周期

11 章 · 3 分 18 秒

01

两套链不该变成两套钱包

BIM Wallet 同时面对 Conflux Core Space 与 EVM / eSpace。做法不是在每个页面里堆 if,而是让 Network 保存 networkType、chainId、RPC 与 HD Path;Account 在每个 Network 下拥有独立 Address;Address 根据网络自动返回 Base32 或 Hex;Transaction plugin 再按 NetworkType 选择 EVM 或 Conflux 的估算、签名与广播实现。页面因此可以共享,链本身的 RPC、地址和 finality 语义仍然保留。

  • Core Space:cfx_*、Base32、epochHeight、storageLimit
  • eSpace:eth_*、Hex、legacy / EIP-1559
  • 共用账户选择、Send、Confirm 与 Activity 产品流程

02

助记词体系先被拆成一棵可操作的账户树

Vault 负责保存加密助记词、私钥、BSIM、硬件或观察地址等密钥来源;AccountGroup 表示一个来源下的一组账户;Account 保存 index、昵称、显隐与选中状态;每个 Account 再为所有 Network 创建 Address。创建 Vault 或账户时,这些关联记录一次 batch 写入,避免 UI、内存对象和持久化各自维护一套不一致的关系。

03

HD Manage 每页只计算五个地址

优化从密码学底层开始:2023 年 10 月 10 日的初始提交就引入 react-native-quick-crypto,把 ethers 的 PBKDF2 接到 C/C++ JSI 原生实现,缩短 mnemonic → seed 这段 CPU 密集路径;10 月 19 日再缓存 HD root 与 derivePath。HD 支持最多 255 个索引,每页只派生五个地址,配合 360ms 防抖与固定占位。BSIM 则按卡能力补建到目标索引、读取卡上账户列表。两者共用分页管理,把旧账户显隐合并成一次 database.batch,只为新 index 创建本地记录。

  • 原生加速:QuickCrypto 接管 PBKDF2;杰哥随后补齐 randomBytes、HMAC 与 SHA 注册
  • 少算:HD 每页只派生五个地址,并复用 memoized HD root / derivePath
  • 少写:显隐修改一次 batch 提交,只新增此前不存在的 index
  • 行业对照:MetaMask 2022 年同类 PR 未合并;2024.01.25 首次进入主线,2025.05 迁移核心 Encryptor 时,Android keyFromPassword 约从 5.15 秒降到 1.41 秒

04

资产管理不是一份静态 TokenList

资产页不是把一份 TokenList 原样画出来。AssetTracker 会先问服务端和链:“这个地址现在真的持有什么?”再用本地 AssetRule 补上用户固定展示或主动隐藏的资产。能批量查就用 Multicall 或 JSON-RPC batch,失败了就退回逐项查询。每份结果都明确属于 Core / EVM、某个 chainId 和某个 address;五秒轮询拿到相同结果时继续使用旧对象,只有余额、资产或排序真的变化才更新页面。

  • 不串数据:切链或切账户后,只读取对应的那份资产结果
  • 不断服务:服务端、Multicall、Batch RPC 失败时还能继续降级查询
  • 不白刷新:查询结果相同就保留旧对象,页面保持不动
  • 真变化才更新:余额、资产集合或排序变化后才通知 UI

05

所有外部请求先经过同一个入口

原始地址、相机和相册二维码、系统 Deep Link、ethereum:/conflux: 支付 URI 与 wc: URI 都先交给 ExternalInputHandler。它先检查 Space、chainId、地址、资产与金额,再打开 Send 对应的步骤或进入 WalletConnect。WalletConnect 的初版配对、Proposal 与确认流程由杰哥搭起;后续接手后,加入 RxJS concatMap 队列,并补齐统一外部入口与 CIP-155 / EIP-155 双 Space 转换。

06

Gas Station 不是发送页里的一个弹窗

同一个发送流程,要适配两种计费机制和 DApp 费用参数。1.0 上线后,Gas Station 经 11 次关键提交继续补强。EVM / Core 读取最新 block / epoch,检查 baseFeePerGas:有则输出 estimateOf1559,无则回落 legacy estimate。Gas 与 nonce 通过 Promise.all 并行获取,每 15 秒重估,结果不变则保留旧 state。Send Step 4 与 WalletConnect Transaction 共用 GasSetting、AdvanceSetting 和 EstimateFee。

  • 双费用模型:legacy 使用 suggestedGasPrice;1559 使用 maxFeePerGas + priorityFee
  • 产品策略:Slow / Average / Fast 分别使用基准的 0.9 / 1.0 / 1.2,Customize 可改费用、gasLimit、storageLimit 与 nonce
  • 安全边界:Core 最低 1 Gwei、eSpace 最低 20 Gwei、gasLimit 不低于 21000、priorityFee 不高于 maxFee
  • DApp 参数:显式合并进 Customize;type 0 / 1 强制 legacy;低于钱包估算时由用户选择保留或采用推荐值;Reset 回到 Average 与最新估算

07

王哥负责的不只是 TxTracker

王哥从 2023 年 12 月开始搭建 Tx / TxPayload / TxExtra 数据库和发送后的持久化,随后完成状态追踪与 Activity,再扩展到 BaseTxTrack、Core / EVM TxTracker、发送失败与错误信息、签名记录、交易详情、同 nonce 去重、Speed Up / Cancel 和 pending count。画面中的原始流程图记录了最复杂的追踪部分:3 秒追 executed、5 秒追 confirmed、30 秒追 finalized;hash 暂时查不到时,再结合 nonce、重发次数与同 nonce 新交易决定重发、等待或 replaced。

从 0 到 1

2023.10

先把账户和本地数据搭起来

完成项目初始化、WatermelonDB、HD Vault、账户组与每网络 Address;初始提交就让 ethers 的 PBKDF2 走 C/C++ JSI QuickCrypto,10 月 19 日再缓存 HD root 与 derivePath。

2023.11–12

资产追踪开始真正工作

重做 Asset、AssetRule、Address 与 Network 的关系,接入服务端发现、链上查询、Batch / Multicall 和按地址隔离的展示状态。

2024.02

账户多了,Manage 也不能卡

重写账户管理 UI;每页只计算五个地址,配合 HDKey 缓存、360ms 防抖和数据库 batch,处理大量派生账户的选择与修改。

2024.03

补齐 Core Space 的收发与签名

Transaction plugin 按 NetworkType 选择 EVM 或 Conflux 实现,分别处理 Base32、epoch、storageLimit、估算、签名与广播。

2024.04.24

BIM Wallet 1.0 正式上线

账户、资产、收发、Core / eSpace 与主要产品界面已经进入可发布状态。后续仍继续补强 Gas Station、WalletConnect 和交易追踪,但从 0 到 1 到这里已经完成。

相关代码

本页根据 Venus 源码和提交记录整理。BSIM 原生与硬件能力由杰哥主导,交易数据库、状态追踪、TxTracker 及相关交易体验由王哥主导;下面列出几处与正文直接对应的代码。