Ledger
/'ledʒər/是硬件钱包品牌。最近项目需要验证一条新链上的硬件钱包签名方案,我拿到了 Ledger Nano X 设备进行验证。本文记录整个工作过程和相关技术要点。
概念
通过物理隔离技术和安全元件芯片实现加密资产私钥的安全存储。
做什么
私钥存储(不暴露给电脑或手机)
交易签名(签名动作在设备内完成)

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的安全存储和签名功能。
- 开发一个
Ledger Device App,安装在设备上,提供特定区块链的交易签名功能。 - 开发一个
连接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会安装在设备上,提供特定区块链的交易签名功能。
要求
- 开发语言只能是
C/Rust,因为设备资源有限,比如我手里的Nano X,内存只有MB级别。 - 安装官方的VSCode插件,提供了开发环境和调试工具。
- 构建打包device app的话,需要
Docker环境,官方提供了Docker镜像,里面包含了构建和打包所需的工具链和依赖。 - 模拟器进行测试的话,本地还需安装Speculos模拟器,提供设备的模拟环境.
VSCode插件
如图,可以看到插件提供了完善的开发/构建/调试功能,极大提升了开发效率。
真机 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 创建 | 显式传 signDigest 和 fetchPublicKey(第 1043-1044 行) | 用默认值(构造函数里默认就是 rawApduSignDigest / rawApduFetchPublicKey) |
| 后续流程 | isReady() → fetchPublicKey() → signMessage() → 上链 | 完全一样 |
发布上线流程
你需要提交的是:App 的源码仓库 + 一系列交付物(deliverables),Ledger 会 fork 你的 App 仓库,在他们自己的 Git flow 中管理部署代码。所以不是你自己打包一个二进制文件,而是提交源码让 Ledger 来构建和签名。
具体步骤:
- 先联系 Ledger 团队 — 填写表单介绍你的项目,达成合作意向(分为 Ledger
开发 或 自主开发两条路径),表单提交地址见[这里](https://developers.ledger.com/docs/device-app/submission-process/submission-form)
- 确保代码符合要求 — 满足安全、密码学和开发规范
- 准备交付物(Deliverables):
- App 源码仓库(含 docs/apdu.md 文档,描述 APDU 命令和状态字)
- 用户文档(Google Doc 格式或已发布的文档 URL)
- App 兼容性信息(需支持 Nano S Plus、Nano X、Stax、Flex 所有设备)
- 法律实体信息、邮箱、地址等
- 填写提交表单 — 官方有专门的 device app 提交表单和 plugin 提交表单
- 安全审计 — Ledger 的合作审计方会对你的 App 进行安全审查,审计通过后Ledger 才会发布
说明:提交审核需要很多信息,且审核包含安全审计因此上架的周期很长(几周到几个月,无确定时间周期)。
用户如何用
- 用户需要安装 Ledger Wallet 应用,连接并设置好 Ledger 设备。
- 用户需要在 Ledger Wallet 中安装目标App。
未上线App,需要走官方VSC插件进行侧载安装。

其它问题
硬件钱包为什么那么多型号,那么贵?
- 硬件钱包,比如 Ledger ≠ 只是安全芯片
- 型号不同,安全级别 × 交互体验 × 使用场景 的取舍不同,另外存储空间也不同,价格自然不同。
navigator.hid
navigator.hid(WebHID)是连接物理 USB HID 设备的,而 Speculos
是模拟器,它只暴露 TCP socket(端口 9999) 和 HTTP API(端口 5000),不是真实 USB
设备,所以浏览器扫描不到任何 HID 设备。
相关文档
- https://developers.ledger.com/docs/device-app/integration/how-to/app-boilerplate
- https://developers.ledger.com/docs/device-app/beginner/vscode-extension
- https://developers.ledger.com/docs/device-app/submission-process/submission-form
- https://developers.ledger.com/docs/device-interaction/integration/how_to/transports
- https://www.cashbackisl.com/ledger-cold-wallet-guide-hk/
- https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit

