4 个月亲手撸出比特币钱包:一个人、一台电脑、全程直播

·

本文中展示的钱包仅为 测试网 Demo,切勿用来存放真实资产。

我在 Twitch 和 Twitter 上全程同步直播了 4 个月,从零到一的比特币钱包开发过程。项目极简、有点粗糙,但它确实能正常收发测试网 BTC。与此同时,我也收获了比任何教程都更直接、更苦涩、更爽快的技术与自我认知。以下就是这段旅程的完整复盘。

为什么选择再造一个比特币钱包?

四个字:系统修炼

最初设想只是把钱包当作下款产品的 MVP:做钱包 → 拉种子用户 → 找投资人。可随着开发深入,我意识到:

于是第 3 个月,我把钱包当作“毕业作品”而非终点:深入比特币协议,从而跳板回基础设施赛道。

👉 点此查看我踩过的坑和可复制的思路

极简骨架:只保留两大核心功能

刚起步时,我列出的里程碑和 UI 堆得跟山一样高:
价格仪表盘、USD/sats 自动换算、酷炫转场动画、图表组件……结果两周后 Kanban 已经失控。

一键脱困:断舍离玩法

我把“汇率换算”功能砍掉后,实现复杂度骤减:

后续所有非核心需求都被我写在“一个月后”列表里当彩蛋,以免干扰主线:
品牌建设、CI/CD、重构文件结构、完整错误处理、桌面图标、一键签名物理隔离……全都先放一放。

最后一天,钱包 UI 依旧简陋,但它能发、能收、能查记录。那一刻的激动,比任何动画都来得震撼。

技术架构一览:用最小依赖撑起全部功能

组件类别选型说明
跨端移动框架React Native + Expo
语言TypeScript(强类型带来安全感)
状态机Zustand v5
节点 APIMempool 主节点 + Esplora 备节点
数据缓存MMKV React
请求Axios + 限流中间件
加解密BitcoinJS-lib v6 + @scure/bip39 + secp256k1
钱包标准BIP-32(HD 钱包)、BIP-39(助记词)
健全验证Zod Schema
数据拉取React Query + 自定义 Refetch 策略

→ 重点关键词:BitcoinJS-libHD 钱包Mempool API跨端开发 都会在后续段落高频出现。

3 个关键实现细节

1. 生成与保护助记词(Mnemonic Seed)

使用 BIP-39 规范 12 字助记词,密钥在本地 MMKV 中以 AES 加密存储。集成 @scure/bip39 库,自带英文词表即可;不需要任何额外配置。

2. UTXO 筛选用两层策略

3. 交易签名流程的坑

BitcoinJS-lib 要求手动填入 Sequence、Locktime、输入/输出脚本。我最先是靠手写 PSBT 混测成功,后来封装成 useSendBitcoin hook,加入渐进式状态机:

  1. 初始化(Start) →
  2. 解析 UTXO(UTXOFetch) →
  3. 构建交易(BuildTx) →
  4. 签名(Sign) →
  5. 广播(Broadcast) →
  6. 确认(Confirm)

一步报错的概率极高,但补一个重试逻辑就能显著降低失败率。

全程用到的 AI 工具

三个月起,Claude / Cursor 成了我的“临时联合创始人”。我把系统流程分解为:

它不会完全正确,但我能快速迭代。构建到最后一周,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 钱包里放真比特币。开源只是让你读代码,不是做钱包供应商。