【钱包】WEB3钱包APP框架的设计
一、前言
前段时间,自己做了一款WEB3钱包
APP,从产品设计到框架搭建都是我一个人搞的,更多的参考了其他公司的钱包APP。
在此,想把自己的钱包经验分享出来,帮助没有做过钱包APP的同学开阔自己的思路。
还有一些需要非常注意的安全方面的经验。
二、整体架构图
三、功能模块详解
这里我会主要讲解重要模块,一个UI和基础配置常量等等,我都不会说了。
状态管理和路由我是通过GetX
进行处理的。
👉🏻 助记词与钱包管理模块 (WalletManager
)
- 创建新助记词
- 导入助记词(校验合法性)
- 给每组助记词一个唯一 ID
- 助记词不明文存储,使用
EncryptedSharedPreferences
(Android)或Keychain
(iOS) - 删除钱包
- 修改钱包的基本信息
- 当前选择的钱包
- 钱包列表更新管理
👉🏻 子账号(子路径账户)管理 (AccountManager
)
- 每个助记词可以生成多个子账号
- 支持标记“主账号”、重命名、删除
- 每个账号维护其地址、公钥、余额等数据
- 删除账号
- 修改账号的基本信息
- 当前选择的账号
- 账号列表更新管理
- 添加一个或者多个账号
👉🏻 存储模块(本地)
- 数据库加密存储封装(
DBManager
) - 关键KEY和秘钥的存储(
LocalDataStore
) - 加密KEY管理(
SecureStorage
)- 单个设备生成不同的KEY
- 使用
EncryptedSharedPreferences
(Android)或Keychain
(iOS)
特别说明:
这里需要存储的是KEY,最好不同的手机生成不同的KEY,然后使用EncryptedSharedPreferences(Android)或
Keychain(iOS)存储,相关的逻辑可以看《【WEB3】钱包助记词在APP中的加密存储》。
至于数据库表,会有wallets钱包表、accounts 表(每个钱包多个账户)、transactions
表(每个账号多条交易记录)、账户余额表、币种列表、汇率表等等。
👉🏻 网络模块(链上与服务器)
- 区块链网络模块(
BlockchainProvider
)- ETH: web3dart
- TRON: grpc/http
- BTC: json-rpc
- 方便后续支持更多链
- 业务网络框架API的封装(
WalletApi
)- 常用请求方式的封装(POST、GET等等)
- 统一错误信息
- 请求加密解密逻辑
- 请求加密解密逻辑
👉🏻 转账与交易模块(TransactionManager
)
- 构造交易
- 签名交易(使用私钥)
- 广播交易
- 查询交易历史(接口聚合服务可选)
特别说明: 这里查询查询交易历史,我采用的是服务端的聚合接口,这样方便管理。
👉🏻 链路工具(BlockChainUtils
)
- 生成支持的网络模型(
ethereum
、binanceSmartChain
、tron
等等) - 生成助记词
- 通过助记词获取种子seed
特别说明: APP支持哪些链路是开发的时候就订好了,这里面要考虑好后续的扩展,比如新增其他的网络了。
👉🏻 APP信息管理(WalletAppInfo
)
- APP的主题模式(night/light)
- 选择的语言lang
- APP的千分位和小数点分隔符
- 计价信息
- 设备信息
- 等等…
👉🏻 UI 层模块
- 创建、导入(分步流程)
- 多钱包管理(创建、添加、删除…)
- 多账号管理(创建、添加、删除…)
- 生物安全
- 其他功能界面
- 等等…
👉🏻 UI组件轮子
- 通用按钮、复选框、开关
- 通用输入框
- 通用弹窗
- 通用toast
- 等等…
👉🏻 常量(Common
)
- 通用枚举类型
- 通用模型
- 通用配置
- 等等…
👉🏻 扩展(Extension
)
- 其他钱包的二维码字符串转换
- 颜色扩展
BuildContext
扩展Decimal
扩展String
扩展- 等等…
👉🏻 路由管理(Routers
)
- 路由注入
- 路由管理
- 特殊页面处理
四、安全策略总结
👉🏻 应用启动锁(App Lock):
- 启动时强制验证 PIN 或生物识别(Touch ID / Face ID)
- 每次进入前台(
AppLifecycleState.resumed
)也强制验证 - 设置自动锁屏时间(如:1分钟、5分钟后未操作自动上锁)
👉🏻 密码派生加密密钥:
- 使用 PBKDF2 + 盐值(salt)从用户 PIN 派生 AES 加密密钥
- 不直接使用密码作为加密 key
- 每台设备用独立 salt 存储,提升抗暴力破解能力
👉🏻 防截图、防录屏:
- 防止敏感数据被截取
👉🏻 助记词/私钥防泄漏机制:
- 永不在内存中长期保存助记词或私钥
- 使用完立即清除(可以重写 Dart 对象、加上 final + secure wipe)
- 不写入日志,不输出到 UI 除非显式“显示助记词”
👉🏻 Clipboard 助记词拦截与清除:
- 如果用户复制助记词或私钥, 可以显示安全提示:“30秒后将自动清除剪贴板”和自动定时清除内容
- 检测剪贴板是否正在暴露敏感数据
👉🏻 交易二次确认与签名验证:
- 所有交易必须通过 PIN 或生物认证后才可签名
- 签名前展示交易摘要(to、amount、gas等)并要求用户确认
👉🏻 安全存储机制:
类型 | 建议存储方式 |
---|---|
助记词 | flutter_secure_storage + AES 二次加密 |
私钥 | AES 加密 + sqlite_sqlcipher |
PIN | 仅存储 PBKDF2 哈希,不存明文 |
Biometric | 不存用户指纹,仅用于验证通过与否 |
👉🏻 用户操作日志审计(本地):
- 不可篡改地记录关键操作(如创建钱包、导出助记词、发送交易)
- 可用于后续“钱包安全中心”功能,提醒异常行为
五、后续拓展
- 支持硬件钱包(Ledger/Trezor)
- 支持
dApp
浏览器与WalletConnect
- 资产价格聚合与行情图
- NFT 展示
Uniswap
六、关于作者(ZFJ_张福杰)
- 官网:https://zfjsafe.com
- 博客:https://zfj1128.blog.csdn.net
- Github:https://github.com/zfjsyqk
- Gitee:https://gitee.com/zfj1128
- 打赏:https://zfjsafe.com/paycode