了解Ledger硬件钱包

3月 20, 2026 · 4 分钟阅读时长 · 1863 字 · -阅读 -评论 · 编程开发

Ledger/'ledʒər/ 是硬件钱包品牌。最近项目需要验证一条新链上的硬件钱包签名方案,我拿到了 Ledger Nano X 设备进行验证。

本文记录整个工作过程和相关技术要点。

概念

通过物理隔离技术和安全元件芯片实现加密资产私钥的安全存储。

做什么

  1. 私钥存储(不暴露给电脑或手机)

  2. 交易签名(签名动作在设备内完成)

ledger 硬件钱包

eth交易签名流程(例子)

sequenceDiagram box 客户端 participant U as 用户 participant D as dApp participant M as MetaMask end box 外部签名设备 participant L as Ledger Device (Ethereum App) end box 区块链基础设施 participant R as RPC / Ethereum Network end U->>D: 发起转账 / Approve / Swap D->>M: 请求钱包发起交易 M->>R: 获取 nonce / gas / fee / chainId R-->>M: 返回链上参数 M->>U: 展示交易确认信息 U->>M: 在 MetaMask 点击确认 M->>L: 发送未签名交易数据 L->>U: 设备屏幕展示关键信息 U->>L: 按键确认/拒绝 alt 用户确认 L-->>M: 返回签名结果 M->>R: 广播已签名交易 R-->>M: 返回 tx hash / pending / confirmed M-->>U: 展示交易状态 else 用户拒绝 L-->>M: 拒绝签名 M-->>U: 交易取消/失败 end

自定义区块链网络/新链的支持

对于一个自定义的区块链网络/新链,想要利用ledger的安全存储和签名功能。

  1. 开发一个Ledger Device App,安装在设备上,提供特定区块链的交易签名功能。
  2. 开发一个连接Ledger Device App的插件,安装在MetaMask等钱包中,提供与新链交互的功能.
    • 如果是使用web3js等库,就需要修改库,从而支持通过Ledger Device App进行交易签名。

调用链 / 数据流图

你的代码
Ledger SDK(封装 APDU)
WebHID(传输)
Ledger 设备
你的 ChainMaker App(解析 APDU)

说明:HID即 human interface device,APDU即 application protocol data unit

Ledger Device App

Ledger Device App会安装在设备上,提供特定区块链的交易签名功能。

要求

  1. 开发语言只能是C/Rust,因为设备资源有限,比如我手里的Nano X,内存只有MB级别。
    • 官方提供了Rust脚手架模版
    • 官方提供了C语言脚手架模版
    • 推荐走官方脚手架,避免无法被插件正常识别。我个人目前选的走Rust,更好维护些。
  2. 安装官方的VSCode插件,提供了开发环境和调试工具。
  3. 构建打包device app的话,需要Docker环境,官方提供了Docker镜像,里面包含了构建和打包所需的工具链和依赖。
  4. 模拟器进行测试的话,本地还需安装Speculos模拟器,提供设备的模拟环境.

VSCode插件

如图,可以看到插件提供了完善的开发/构建/调试功能,极大提升了开发效率。

https://static.1991421.cn/2026/03/2026-03-24-144706.jpeg

真机 vs 模拟器

对比项真机 (WebHID)模拟器 (Speculos)
连接方式TransportWebHID.create() — 浏览器弹出 HID 设备选择器,用户手动选择 USB 设备SpeculosHttpTransport.open(url) — 直接 HTTP 连到 localhost:5001
通信协议USB HID 帧协议(浏览器 WebHID API → USB → 设备固件)HTTP POST JSON { data: "hex..." } → Speculos HTTP API → 模拟固件
用户确认签名时需要在真机物理按键确认Speculos 手动确认
LedgerSigner 创建显式传 signDigestfetchPublicKey(第 1043-1044 行)用默认值(构造函数里默认就是 rawApduSignDigest / rawApduFetchPublicKey
后续流程isReady()fetchPublicKey()signMessage() → 上链完全一样

发布上线流程

你需要提交的是:App 的源码仓库 + 一系列交付物(deliverables),Ledger 会 fork 你的 App 仓库,在他们自己的 Git flow 中管理部署代码。所以不是你自己打包一个二进制文件,而是提交源码让 Ledger 来构建和签名。

具体步骤:

  1. 先联系 Ledger 团队 — 填写表单介绍你的项目,达成合作意向(分为 Ledger
开发 或 自主开发两条路径),表单提交地址见[这里](https://developers.ledger.com/docs/device-app/submission-process/submission-form)
  1. 确保代码符合要求 — 满足安全、密码学和开发规范
  2. 准备交付物(Deliverables):
- App 源码仓库(含 docs/apdu.md 文档,描述 APDU 命令和状态字)
- 用户文档(Google Doc 格式或已发布的文档 URL)                          
- App 兼容性信息(需支持 Nano S Plus、Nano X、Stax、Flex 所有设备)
- 法律实体信息、邮箱、地址等                                             
  1. 填写提交表单 — 官方有专门的 device app 提交表单和 plugin 提交表单
  2. 安全审计 — Ledger 的合作审计方会对你的 App 进行安全审查,审计通过后Ledger 才会发布

说明:提交审核需要很多信息,且审核包含安全审计因此上架的周期很长(几周到几个月,无确定时间周期)。

用户如何用

  1. 用户需要安装 Ledger Wallet 应用,连接并设置好 Ledger 设备。
  2. 用户需要在 Ledger Wallet 中安装目标App。
    • 未上线App,需要走官方VSC插件进行侧载安装

https://static.1991421.cn/2026/03/2026-03-24-171254.jpeg

其它问题

硬件钱包为什么那么多型号,那么贵?

  1. 硬件钱包,比如 Ledger ≠ 只是安全芯片
  2. 型号不同,安全级别 × 交互体验 × 使用场景 的取舍不同,另外存储空间也不同,价格自然不同。

navigator.hid(WebHID)是连接物理 USB HID 设备的,而 Speculos
是模拟器,它只暴露 TCP socket(端口 9999) 和 HTTP API(端口 5000),不是真实 USB 设备,所以浏览器扫描不到任何 HID 设备。

相关文档

Alan H
Authors
开发者,数码产品爱好者,喜欢折腾,喜欢分享,喜欢开源