【錢包】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