首页/新闻资讯/正文详情

Monero 与 Trezor 硬件钱包集成:源码结构、编译依赖与冷签名协议解析

发布时间:2026/9/24 7:06:08 来源:云帆数科 栏目:资讯中心
Monero 与 Trezor 硬件钱包集成:源码结构、编译依赖与冷签名协议解析
区块链金融科技【免费下载链接】moneroMonero: the secure, private, untraceable cryptocurrency项目地址https://gitcode.com/gh_mirrors/mo/monero点击查看免费下载本文档基于 src/device_trezor/README.md 展开系统讲解 Monero 仓库中 Trezor 硬件钱包支持模块的定位、工作原理、编译依赖与排错方法并结合仓库内 CMake 脚本、C 实现与 Protobuf 定义深入解读其冷钱包式交易签名协议。读完本文你将掌握如何为本仓库启用/禁用 Trezor 支持、如何在各平台准备 Protobuf 构建环境以及 Trezor 设备在 Monero 中增量构建交易的底层实现脉络。一、模块定位Monero 的 Trezor 硬件钱包支持Trezor 硬件支持模块位于 src/device_trezor它让 Monero 钱包可以借助 Trezor 设备完成密钥管理与交易签名。该集成的核心设计基于一份原始提案proposal其基本思路是使用一种自定义的高层交易签名协议让 Trezor 以类似冷钱包cold wallet的方式工作——私钥永不离开设备交易在设备上增量式构建Transaction is built incrementally on the device。这意味着钱包端Monero 软件负责扫描链上数据、构造交易骨架、选择环成员decoysTrezor 设备端负责派生密钥、验证交易内容并在屏幕上向用户展示关键信息、最终完成密码学签名双方通过 Protobuf 消息交互实现主机负责计算、设备负责信任的安全边界。在 Trezor 固件侧对应的签名协议实现在 trezor-firmware 仓库的 monero 应用中其配套说明文档对协议的 message 流有更详细的描述可作为本模块协议的补充参考。Monero 仓库中的首个集成对应 Pull Request 编号为 #4241。从设备注册的角度看模块通过 device_trezor.cpp 中的register_all把名为Trezor的设备实例注册进统一的设备注册表参见 device.cpp与默认软钱包设备、Ledger 设备并列供钱包层按设备名解析。二、模块目录结构与核心文件src/device_trezor/ ├── CMakeLists.txt # 构建脚本库目标、链接依赖、调试支持 ├── README.md # 本模块的官方说明文档 ├── device_trezor.cpp # 设备主实现注册、生命周期、交易签名入口 ├── device_trezor.hpp # 设备类声明继承 device_cold 冷钱包接口 ├── device_trezor_base.cpp # 基础实现会话管理、消息收发、传输层封装 ├── device_trezor_base.hpp ├── trezor.hpp # 统一入口头文件条件编译宏开关 └── trezor/ ├── protob/ # *.proto 消息定义与 trezor-common 仓库同步 ├── messages/ # 由 protoc 生成的 *.pb.h / *.pb.cc ├── messages_map.cpp # MessageType 与 C 类型的映射 ├── protocol.cpp/hpp # 高层签名协议密钥编解码、交易 Signer 状态机 ├── transport.cpp/hpp # 传输层HIDLibUSB/ UDP / WebUSB ├── debug_link.cpp/hpp # 调试接口测试用编译期可选 ├── exceptions.hpp ├── trezor_defs.hpp # 编译期特性宏WITH_DEVICE_TREZOR 等 └── fetch_protob.sh # 拉取并固定 trezor-common 的 .proto 文件其中 trezor_defs.hpp 是整个模块的编译开关枢纽只有当 CMake 成功生成 Protobuf 消息并满足最小依赖宏DEVICE_TREZOR_READY后USE_DEVICE_TREZOR才会被置为 1 并最终展开为WITH_DEVICE_TREZOR而WITH_DEVICE_TREZOR_WEBUSB还需要 LibUSB 可用宏HAVE_TREZOR_LIBUSB。UDP 传输主要用于 Trezor 模拟器默认在 debug 构建中开启release 构建则受USE_DEVICE_TREZOR_UDP_RELEASE控制。三、编译依赖Protobuf 与 C17 注意事项3.1 核心依赖Trezor 模块使用ProtobufProtocol Buffers库。构建时CMake 会调用protoc编译器把 src/device_trezor/trezor/protob 目录下的.proto文件重新生成 C 代码到 src/device_trezor/trezor/messages因此在完整构建 Trezor 支持时系统必须同时具备 Protobuf 库与protoc可执行程序。仓库通过 fetch_protob.sh 从 trezor-common 仓库拉取messages.proto、messages-common.proto、messages-monero.proto、messages-management.proto、messages-debug.proto、options.proto六个文件并固定到指定提交以保证消息格式与固件侧一致。3.2 C17 与 abseil 的经典坑Monero 现在默认以C17编译。Protobuf 依赖 abseilabsl库如果 abseil 不是用 C17 编译的在编译 Trezor 相关代码时可能出现难以理解的模板/ABI 错误。官方文档给出的解决方案是从源码安装 Protobuf并显式把 C 标准与 abseil 的传播开关打开git clone --recursive gitgithub.com:protocolbuffers/protobuf.git cd protobuf cmake -DABSL_PROPAGATE_CXX_STDTRUE -DCMAKE_CXX_STANDARD17 -Dprotobuf_BUILD_SHARED_LIBSON -Dprotobuf_BUILD_TESTSOFF . cmake --build . sudo make install参数说明ABSL_PROPAGATE_CXX_STDTRUE让 abseil 继承上层指定的 C 标准而不是使用自己的默认值CMAKE_CXX_STANDARD17以 C17 编译整个 Protobuf 及其依赖protobuf_BUILD_SHARED_LIBSON构建共享库便于 Monero 运行时链接protobuf_BUILD_TESTSOFF跳过测试以缩短构建时间。3.3 各平台安装方式平台命令说明macOSbrew update brew bundle --filecontrib/brew/Brewfile通过 contrib/brew/Brewfile 批量安装依赖含 protobuf、libusb 等MSYS2Windows 环境pacman -S mingw-w64-x86_64-protobuf安装 MinGW 64 位 Protobuf 包其他系统安装 Protobuf 后设置CMAKE_PREFIX_PATH把环境变量CMAKE_PREFIX_PATH指向 Protobuf 安装目录供find_package(Protobuf)检索对于 macOS 使用 Homebrew 的场景brew bundle会依据 Brewfile 中声明的依赖一次性完成安装是最省事的方式。四、编译选项详解CheckTrezor.cmake 与构建开关Trezor 的构建探测逻辑集中在 cmake/CheckTrezor.cmakesrc/device_trezor/CMakeLists.txt 则根据探测结果决定是否把 Trezor 代码编入库目标。所有选项既可作为 CMake 变量也可作为环境变量传入。选项默认值作用USE_DEVICE_TREZORONTrezor 支持总开关USE_DEVICE_TREZOR_MANDATORYOFF若为ONTrezor 编译失败直接报FATAL_ERROR终止构建否则仅告警并跳过 TrezorUSE_DEVICE_TREZOR_PROTOBUF_TESTONProtobuf 消息生成/测试开关USE_DEVICE_TREZOR_LIBUSBON启用 LibUSBHID 传输支持USE_DEVICE_TREZOR_UDP_RELEASEOFFrelease 构建中启用 UDP 传输Trezor 模拟器USE_DEVICE_TREZOR_DEBUGOFF编译 debug_link 调试接口含 messages-debug.protoTREZOR_DEBUGOFFTrezor 模块主调试开关开启后强制启用USE_DEVICE_TREZOR_DEBUG并追加 messages-debug.proto4.1 探测流程若USE_DEVICE_TREZORON依次尝试find_package(Protobuf CONFIG)与find_package(Protobuf)并强制查找protoc可执行文件未找到 Protobuf 时依据USE_DEVICE_TREZOR_MANDATORY决定是终止构建还是降级为跳过 Trezor 支持Protobuf 版本 ≥ 22.0 时额外定义PROTOBUF_HAS_ABSEIL宏用protoc重新生成全部messages/*.pb.{h,cc}并对 FreeBSD 等平台的minor宏冲突做补丁处理查找 LibUSB要求 1.0.26 兼容版本找到后定义HAVE_TREZOR_LIBUSB并链接TREZOR_LIBUSB_LIBRARIES全部就绪后置DEVICE_TREZOR_READY1并在 CMakeLists.txt 中看到Trezor: support enabled。4.2 构建产物与链接关系启用时device_trezor库目标链接了device、cncrypto、ringct_basic、cryptonote_core、common、sodium、Boost.Chrono、Protobuf 以及 LibUSBAndroid 构建还会额外链接log。禁用时则退化为一个只链接cncrypto的极简占位库仅编译 device_trezor.cpp保证上层代码无需条件编译即可通过。五、源码级原理冷签名协议与交易增量构建5.1 设备接口遵循 device_cold 冷钱包契约从 device_trezor.hpp 可以看到device_trezor同时继承device_trezor_base与hw::device_cold并向钱包层宣告能力device_protocol()返回PROTOCOL_COLD即冷钱包协议has_ki_cold_sync()与has_tx_cold_sign()均为true支持冷同步密钥镜像key image与冷签名交易提供get_address、get_view_key导出只读视图密钥、display_address、ki_sync密钥镜像同步、live_refresh实时刷新、tx_sign交易签名等核心接口。此外还支持空口令set_use_empty_passphrase、会话重置reset_session以及 tx 密钥get_tx_key的恢复对应钱包侧交易密钥r由设备保管、可事后取回的能力。5.2 签名协议Signer 状态机高层协议实现在 protocol.hpp 的hw::trezor::protocol::tx::Signer类中。它把一笔 Monero 交易的签名过程拆成一串有状态步骤每一步对应一次请求 → 设备应答的往返交易由此被增量地构建出来步骤含义step_init/step_init_ack初始化下发网络类型、版本号、交易元数据MoneroTransactionInitRequeststep_set_input/ ack逐笔设置输入source entry环成员公钥、真实输出索引、金额、掩码等step_set_vini_input/ ack为每个输入生成并验证vini伪输出承诺step_all_inputs_set/ ack全部输入就绪进入输出阶段step_set_output/ ack逐笔设置输出destination entry金额、地址、子地址标志step_rsig/ ack处理范围证明Bulletproof / Bulletproof相关数据step_all_outs_set/ ack全部输出就绪汇总交易前缀哈希step_sign_input/ ack逐输入执行环签名CLSAG/MLSAGstep_final/ ack收尾输出最终签名交易Signer还维护一个TData状态容器记录输入/输出 HMAC、伪输出承诺、签名、交易前缀哈希等中间结果。协议针对 RingCT 类型做了分支判断is_clsag()、is_bulletproof()、is_bulletproof_plus()分别对应 CLSAG 与不同版本的 Bulletproof 范围证明is_offloading()表示是否把范围证明计算下放到设备offload。传输与加解密层面协议使用 ChaCha20-Poly1305RFC 7539IV 12 字节、TAG 16 字节对敏感字段做端到端加密密钥由私密查看密钥与盐值派生compute_enc_key密钥镜像同步namespace ki则通过MoneroKeyImageExportInitRequest携带对传输明细的哈希承诺设备据此校验后再逐条导出密钥镜像并签名。5.3 Protobuf 消息定义消息 schema 定义在 src/device_trezor/trezor/protob/messages-monero.proto其中几个关键结构MoneroNetworkTypeMAINNET0、TESTNET1、STAGENET2、FAKECHAIN3签名前必须显式声明网络类型防止跨网重放MoneroGetAddress包含 BIP-32 路径address_n、show_display是否在设备屏幕展示、account/minor子地址索引、payment_id集成地址等字段MoneroTransactionSourceEntry描述一个 UTXO 输入outputs为环成员集合含诱饵real_output标出真实输出下标另有MoneroRctKeyPublicdest公钥 commitment承诺与多签MoneroMultisigKLRki结构MoneroTransactionDestinationEntry描述输出含金额、MoneroAccountPublicAddressspend/view 公钥、is_subaddress子地址标志。这些.proto文件由 CMake 构建期用protoc编译为messages/*.pb.cc/h后再参与编译因此对消息格式的修改必须同时保证与 trezor-firmware 侧一致。六、钱包端使用monero-wallet-cli 与设备命令Trezor 设备在命令行钱包monero-wallet-cli源码位于 src/simplewallet/simplewallet.cpp中通过以下方式接入从设备生成新钱包--generate-from-devicewallet_name在创建钱包时直接以设备中的种子派生账户查看/派生地址address device [index]请求设备展示或返回对应子地址集成地址integrated_address device [payment_id | address]指定设备set device-name device_name[:device_spec]把钱包绑定到Trezor设备默认名即Trezor配合device-name查询命令可确认当前绑定签名确认发起转账时钱包输出Please confirm the transaction on the device提示交易摘要显示在 Trezor 屏幕上由用户在设备端确认。在设备上执行任何涉及私钥的操作时密钥不会离开设备secret: On device. Not available是钱包对密钥查询的典型应答这正是冷钱包安全模型的体现。七、故障排查与禁用 Trezor7.1 典型编译错误abseil/C17 相关错误按上文 3.2 节从源码重新安装 Protobuf 即可找不到 protobuf / protoc确认已安装 Protobuf并把CMAKE_PREFIX_PATH指向安装目录找不到 LibUSBCheckTrezor.cmake会报 Trezor: LibUSB not found or test failed, please install libusb-1.0.26需安装 1.0.26 或兼容版本。7.2 显式禁用 Trezor 支持如果不需要硬件钱包功能、或当前环境无法满足依赖可以在构建时关闭 Trezor 支持USE_DEVICE_TREZOROFF make release该开关同时支持 CMake 变量与环境变量两种传递方式与 CheckTrezor.cmake 中的提示信息一致。若USE_DEVICE_TREZOR_MANDATORYON且 Trezor 无法编译构建会直接失败并提示使用上述命令禁用否则仅打印告警并跳过 Trezor不影响 Monero 其余部分构建。八、进一步阅读本模块官方说明文档src/device_trezor/README.md构建探测逻辑cmake/CheckTrezor.cmake库目标与链接src/device_trezor/CMakeLists.txt设备类实现device_trezor.hpp、device_trezor.cpp签名协议与状态机trezor/protocol.hpp消息定义trezor/protob/messages-monero.proto统一设备注册表src/device/device.cppmacOS 依赖清单contrib/brew/Brewfile以上内容结合官方 README 与仓库源码交叉印证可作为理解 Monero Trezor 集成、构建排错以及二次开发自定义签名流程的参考起点。赞分享区块链金融科技【免费下载链接】moneroMonero: the secure, private, untraceable cryptocurrency项目地址https://gitcode.com/gh_mirrors/mo/monero点击查看免费下载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

在 CI/CD 流水线中使用 Regal 对 Rego 策略进行代码检查
在 CI/CD 流水线中使用 Regal 对 Rego 策略进行代码检查

后端认证鉴权云原生 【免费下载链接】opa Open Policy Agent (OPA) is an open source, general-purpose policy engine. 项目地址: https://gitcode.com/gh_mirrors/op/opa 点击查看 免费下载 Regal 是 Open Policy Agent 生态中专门用于 Rego 策略代码的 linter … · 2026/9/24 7:06:08

嵌入式开发入门路线:从STM32裸机到Linux应用
嵌入式开发入门路线:从STM32裸机到Linux应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:05:31

鸿蒙用户注意!你的PDF文件正在经历一场“编辑荒漠”
鸿蒙用户注意!你的PDF文件正在经历一场“编辑荒漠”

如果你手里拿的是华为手机或平板,正跑在HarmonyOS上,大概率遇到过这样的情况:收到一份PDF合同,想改几个字;翻开一份课件,想加两行批注;拿到一张发票,想提取里面的文字——然后你发现… · 2026/9/24 7:05:31

论文AI率太高怎么降?有效果兜底的AI智能降重工具推荐,降AI率没达标包退全款
论文AI率太高怎么降?有效果兜底的AI智能降重工具推荐,降AI率没达标包退全款

最近毕业季身边不少同学在论文查重上栽了跟头,尤其是AIGC检测部分更是让人头疼。根据教育部2025年发布的《高等学位论文质量监测年报》显示,全国本科毕业论文中疑似存在AI痕迹的比例高达29.7%,而硕士论文更是攀升至34.2%。随着政策不断收紧&a… · 2026/9/24 7:48:13

深入解析 Airbyte Typeform Source Connector 的独特行为:单次使用刷新令牌与增量同步设计
深入解析 Airbyte Typeform Source Connector 的独特行为:单次使用刷新令牌与增量同步设计

数据工程数据集成ETL后端大数据 【免费下载链接】airbyte Open-source data movement for ELT pipelines and AI agents — from APIs, databases & files to warehouses, lakes, and AI applications. Both self-hosted and Cloud. 项目地址: https://gitcode.… · 2026/9/24 7:48:13

S32K3多核MCU开发入门:启动流程、核间通信与EB配置详解
S32K3多核MCU开发入门:启动流程、核间通信与EB配置详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:48:07

批量视频去硬字幕工具怎么选?工具与批处理专业服务商对比
批量视频去硬字幕工具怎么选?工具与批处理专业服务商对比

每天要处理几十条视频时,逐条设置和检查会成为实际工作。比较批量视频去字幕方案,不能只看一条样片能否把字幕去掉,还要把整批素材的提交、区域设置、结果复核、问题修改、费用和最终文件一起看。网页上完成一次处理很方便,但持续… · 2026/9/24 7:48:07

从一件衣服出发,江南布衣如何连接设计、工艺与生活
从一件衣服出发,江南布衣如何连接设计、工艺与生活

2026年9月23日,江南布衣在杭州天目里举办“布衣视界体验日”,围绕2026秋冬系列新品、工艺研究、传统织物研究及会员运营等内容,集中呈现品牌近期的设计实践与业务探索。当天,70余位来自全国各地的媒体、KOL和投资人走进江南布衣天… · 2026/9/24 7:48:01

保安员资格考试教材PDF高效备考指南:四周计划与避坑要点
保安员资格考试教材PDF高效备考指南:四周计划与避坑要点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:48:01

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码