CLN项目中的Bolt12支付崩溃问题分析
问题背景
在CLN(Core Lightning)项目中,用户在使用Bolt12协议与Phoenix钱包进行交互时遇到了核心崩溃问题。具体表现为当尝试使用fetchinvoice命令获取Phoenix生成的Bolt12报价时,CLN节点会意外崩溃。
问题现象
用户报告了以下关键现象:
- 使用
decode命令解析Phoenix生成的Bolt12报价时工作正常 - 但使用
fetchinvoice命令获取发票时会导致CLN崩溃 - 崩溃日志显示是
SIGNAL 11错误,发生在pubkey_eq函数调用处 - 崩溃点位于
plugins/fetchinvoice.c文件的230行
技术分析
崩溃原因
通过分析崩溃堆栈和代码,发现问题出在fetchinvoice.c文件的以下代码段:
if (!inv->invoice_node_id || !pubkey_eq(inv->offer_issuer_id, sent->issuer_key)) {
badfield = "invoice_node_id";
goto badinv;
}
这里代码错误地检查了offer_issuer_id而不是invoice_node_id。由于Phoenix生成的Bolt12发票不包含offer_issuer_id字段,导致解引用空指针而崩溃。
临时解决方案
用户发现通过修改代码,将inv->offer_issuer_id替换为inv->invoice_node_id可以解决崩溃问题:
if (!inv->invoice_node_id || !pubkey_eq(inv->invoice_node_id, sent->issuer_key)) {
badfield = "invoice_node_id";
goto badinv;
}
这一修改使得CLN能够成功获取发票,尽管后续支付尝试因其他原因失败(这是预期的,因为Bolt12支持仍在开发中)。
深入理解
Bolt12协议是闪电网络的新功能,旨在提供更灵活的发票和报价系统。与传统的BOLT11发票不同,Bolt12允许:
- 可重复使用的报价
- 更丰富的元数据
- 更复杂的支付流程
在CLN的实现中,处理Bolt12发票时需要进行多重验证,包括节点ID匹配检查。原始代码错误地假设所有Bolt12发票都会包含offer_issuer_id字段,而实际上Phoenix生成的发票使用invoice_node_id字段。
影响范围
此问题影响:
- 所有尝试与Phoenix钱包进行Bolt12交互的CLN节点
- 使用CLN master分支(v24.05-213-gbf54913版本)的用户
- 任何不包含
offer_issuer_id的Bolt12发票处理场景
解决方案
项目维护者已经确认这是一个未测试的代码路径问题,并感谢用户及时发现。正确的修复方式是:
- 检查发票结构体中的正确字段(
invoice_node_id) - 添加对字段存在性的验证
- 完善测试用例以覆盖此类场景
开发者建议
对于闪电网络开发者:
- 处理Bolt12协议时要特别注意不同实现间的兼容性
- 对可能为空的字段进行防御性检查
- 在开发新功能时,考虑各种钱包实现的差异
对于用户:
- 关注CLN项目的更新,此问题将在后续版本修复
- 目前阶段Bolt12功能仍处于开发中,生产环境使用需谨慎
- 可以关注项目GitHub上的相关提交以获取修复进度
总结
这次崩溃事件揭示了CLN在Bolt12实现中的一个重要边界条件问题。通过社区用户的积极参与和开发团队的快速响应,问题得到了及时识别和修复。这也体现了开源协作在闪电网络发展中的重要性,以及协议演进过程中实现兼容性的挑战。
随着Bolt12协议的不断完善,开发者应持续关注不同实现间的交互测试,确保协议的跨实现兼容性,为用户提供更稳定、更强大的闪电网络体验。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0153- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112