本文中展示的钱包仅为 测试网 Demo,切勿用来存放真实资产。
我在 Twitch 和 Twitter 上全程同步直播了 4 个月,从零到一的比特币钱包开发过程。项目极简、有点粗糙,但它确实能正常收发测试网 BTC。与此同时,我也收获了比任何教程都更直接、更苦涩、更爽快的技术与自我认知。以下就是这段旅程的完整复盘。
为什么选择再造一个比特币钱包?
四个字:系统修炼。
最初设想只是把钱包当作下款产品的 MVP:做钱包 → 拉种子用户 → 找投资人。可随着开发深入,我意识到:
- 用户对比特币钱包的需求早已过度饱和;
- 我的商业构想仍偏小众,很容易重蹈当初 BitEscrow 的覆辙;
- 我最热爱的其实是底层基础设施。
于是第 3 个月,我把钱包当作“毕业作品”而非终点:深入比特币协议,从而跳板回基础设施赛道。
极简骨架:只保留两大核心功能
刚起步时,我列出的里程碑和 UI 堆得跟山一样高:
价格仪表盘、USD/sats 自动换算、酷炫转场动画、图表组件……结果两周后 Kanban 已经失控。
一键脱困:断舍离玩法
我把“汇率换算”功能砍掉后,实现复杂度骤减:
- 不再需要在 4 个页面里同步换算状态;
- 不再缓存历史价格数据;
- 状态管理精简 30%。
后续所有非核心需求都被我写在“一个月后”列表里当彩蛋,以免干扰主线:
品牌建设、CI/CD、重构文件结构、完整错误处理、桌面图标、一键签名物理隔离……全都先放一放。
最后一天,钱包 UI 依旧简陋,但它能发、能收、能查记录。那一刻的激动,比任何动画都来得震撼。
技术架构一览:用最小依赖撑起全部功能
| 组件类别 | 选型说明 |
|---|---|
| 跨端移动框架 | React Native + Expo |
| 语言 | TypeScript(强类型带来安全感) |
| 状态机 | Zustand v5 |
| 节点 API | Mempool 主节点 + Esplora 备节点 |
| 数据缓存 | MMKV React |
| 请求 | Axios + 限流中间件 |
| 加解密 | BitcoinJS-lib v6 + @scure/bip39 + secp256k1 |
| 钱包标准 | BIP-32(HD 钱包)、BIP-39(助记词) |
| 健全验证 | Zod Schema |
| 数据拉取 | React Query + 自定义 Refetch 策略 |
→ 重点关键词:BitcoinJS-lib、HD 钱包、Mempool API、跨端开发 都会在后续段落高频出现。
3 个关键实现细节
1. 生成与保护助记词(Mnemonic Seed)
使用 BIP-39 规范 12 字助记词,密钥在本地 MMKV 中以 AES 加密存储。集成 @scure/bip39 库,自带英文词表即可;不需要任何额外配置。
2. UTXO 筛选用两层策略
- Pre-filter 阶段:仅取 >0.00025 tBTC 的 UTXO,降低找零计算量;
- Post-filter 阶段:对剩余 UTXO 做“所需金额 + Fee + 冗余 300 sat” 的快排。
3. 交易签名流程的坑
BitcoinJS-lib 要求手动填入 Sequence、Locktime、输入/输出脚本。我最先是靠手写 PSBT 混测成功,后来封装成 useSendBitcoin hook,加入渐进式状态机:
- 初始化(Start) →
- 解析 UTXO(UTXOFetch) →
- 构建交易(BuildTx) →
- 签名(Sign) →
- 广播(Broadcast) →
- 确认(Confirm)
一步报错的概率极高,但补一个重试逻辑就能显著降低失败率。
全程用到的 AI 工具
三个月起,Claude / Cursor 成了我的“临时联合创始人”。我把系统流程分解为:
- Prompt = 架构描述
- AI = 代码实现杂役
它不会完全正确,但我能快速迭代。构建到最后一周,AI 的提示词工程量甚至超过了代码行数,这倒逼我不断提升“用语言写系统”的抽象表达能力。
👉 这里总结了一套可复制的高效 AI 编程 Prompt 模板,强烈建议你收藏
从失败边缘爬回来:四次差点放弃的瞬间
Moment 1:UI 动画卡顿
一道 Expo RN 的 MatrixAnimation 导致 30 FPS。解决方案:直接删动画。
Moment 2:iOS Testflight 签名失败
Xcode provisioning profile 手工刷新到想哭。解决方案:删掉自动化脚本,全程 Manual。
Moment 3:测试网节点短暂宕机
拉交易历史超时 15 秒。解决方案:本地缓存最近 100 条记录、第一次用户提示手动刷新。
Moment 4:real-time 汇率 API 被限流
前文提到的 CoinGecko 限流。解决方案:不如不要,砍!
每一刀砍的都是“想做得更好”的冲动,却为“尽快可用”让路。
FAQ:把高频率提问一次说清
Q1:代码水平只是初学者,能不能跟着学?
A:完全可以。我会把高水平抽象剥离,注释率保持 25% 以上,连私钥生成哪一步使用了哪种椭圆曲线都写了小白说明。
Q2:开发真的一点 CI/CD 都不用吗?
A:本地用 GitHub Actions 做了基本的 commit lint + Type Check,其余打包仍靠手工脚本,省时间。
Q3:为什么没用 Bitcoin Dev Kit?
A:个人学习目的,直接接触 BitcoinJS 能获得最底层的 UTXO 细节;如果是团队工程,我 100% 会换 BDK + LDK。
Q4:助记词安全级别够高吗?
A:测试网够用。生产环境需要引入 Secure Enclave(iOS)或 Android Keystore,并添加生物识别二次验证。
Q5:未来会支持闪电网络吗?
A:如果钱包进化为正式产品,L2 是必然方向;当前只是学习 Demo,暂无计划。
Q6:如何验证我的交易是否在测试网被确认?
A:打开浏览器访问 mempool.space/testnet,粘交易 ID 即可实时跟踪确认。
下一步:从钱包毕业,奔向更大系统
钱包的使命已经完成。我把它开源在 GitHub,commits、issues、PR 记录都保持原汁原味,方便后来人翻阅。接下来我将整包精气神投入到比特币侧链与原子交换的底层协议——那才是我真正想深耕的荒漠。
最后提醒:不要在这个 Demo 钱包里放真比特币。开源只是让你读代码,不是做钱包供应商。