协议演进 / BIP/比特币改进提案 / BIP-353

BIP-353 DNS 支付指令

把 BIP-21 支付 URI 写进带 DNSSEC 签名的 DNS TXT 记录,让 ₿user@domain 这样的人类可读名字能安全、私密地解析为收款指令。本 BIP 目前处于已完成状态。

一、档案卡

档案卡
编号BIP-353
标题DNS Payment Instructions
作者Matt Corallo <[email protected]>, Bastien Teinturier <[email protected]>
指定日期2024-02-10
讨论日期2024-02-13
层级Applications(应用)
类型Specification(规范类)
状态Complete(已完成)
阅读版https://bips.dev/353
官方原文https://github.com/bitcoin/bips/blob/master/bip-0353.mediawiki

二、放在哪一族

人类可读收款名字族。它寄生在两个既有标准之上:

BIP-21:bitcoin: URI 方案,本 BIP 放进 DNS 的就是它

BIP-352:静默支付,是 DNS 记录里最理想的链上收款内容之一——静态公开也不会因地址复用丢隐私

它意在延伸并收编既有的 Lightning Address 方案:后者用同样的 user@domain 式名字、经 HTTPS 服务器解析到闪电网络 BOLT 11 发票。原文说,实现本方案的钱包在 DNS 解析失败时可以暂时回退到 Lightning Address 逻辑,但等本方案足够普及后就不应再回退,以免泄漏发送方 IP。

与基于区块链的命名方案、基于 HTTP 的解析方案相比,原文选择 DNS 的理由是:有简洁的“命名空间到公钥映射”密码学证明(DNSSEC)、查询通常经解析器代理而不直接暴露查询者 IP、不依赖臃肿的 TLS 证书机构体系、且任何人都能注册域名建立映射。

三、它要解决什么

用户想要的是像邮箱地址一样好记、好口述、好印在名片上的收款名字。比特币地址与各类支付 URI 又长又易错,手抄、口述、粘贴都容易出错,更谈不上让对方在付款前核对“这个名字到底指向谁的收款指令”。

DNS 恰好是现成的全球分层命名空间:把标签映射到各类记录。配合 DNSSEC,它能用一套顺着 DNS 层级走的、直截了当的 PKI 提供密码学保证,让记录可以无状态地、甚至离线地从单一可信根验证。再加上 DNS 查询通常经由运营商或其他解析器代理,一般不直接暴露查询者 IP;开放解析器遍地都是,找代理很容易。

于是本 BIP 的做法是:把支付指令存进 DNS TXT 记录,得到人类可读、可在硬件钱包上直接核验、解析过程相对私密的收款目的地。

四、规则本身

4.1 记录放在哪、长什么样

user 与 domain 共同索引一条记录,存放在 user.user._bitcoin-payment.domain 的一条 TXT 记录里。

还有一条总原则:有现成的、带明确公钥或地址的收款方式可用时,钱包不得优先用 DNS 解析——能直接用标准地址或 BIP-21 URI 的场合,必须优先用它们。

4.2 解析方必须自己验签

这是本 BIP 最硬的一节:

带过期时间的支付指令(如 BOLT 12 offer)要特别小心:DNS 记录必须先于指令本身过期,否则发送方缓存里的可能已是过期指令,付款会失败。

4.3 地址复用与轮换

DNS 里的静态记录天然指向同一个目的地,若里面放的是会被复用的链上地址,就必须尽量勤轮换:用较短的 TTL 让轮换快速生效;一旦某地址收到一笔已确认交易,就应轮换。做不到勤轮换时,干脆不要在 URI 里放链上地址(URI 路径留空)。像静默支付这类静态标识本身不构成链上复用的方案,不受此限。

4.4 显示与复制

验证通过的人类可读名字,钱包显示时应加 ₿ 前缀,形如 ₿user@domain;输入时 user@domain 与 ₿user@domain 两种写法都要能解析。用 @ 作分隔是为了兼容既有名字方案,加 ₿ 前缀是为了减少与同域名邮箱地址的混淆。注意:₿ 只是显示符号,不属于要解析的 DNS 标签。

钱包让用户“复制”收款信息时,应复制底层 URI 而不是人类可读名字,避免粘贴方再做一次 DNS 查询;若确实提供复制名字的功能,复制结果必须带 ₿ 前缀。

4.5 给硬件钱包的 PSBT 证明字段

收款信息可能来自外部设备(如硬件钱包),发送方钱包无法当场上网验 DNS。本 BIP 为此定义了按输出的 PSBT 字段 PSBT_OUT_DNSSEC_PROOF = 0x35:值是 1 字节长度前缀的人类可读名字(不带 ₿),后跟 RFC 9102 格式的 DNSSEC AuthenticationChain 证明。接收设备可离线验证整条签名链;验证时必须检查链中所有 RRSig 的生效时间不晚于当前时间、过期时间不早于一小时之前(为构造与签名之间的延迟留的容差)。原文附了多组有效与无效的证明样例,包括“两条 bitcoin: 记录导致整体失效”这类反例。

五、谁必须动

普通持币人:想用名字的收款方,需要有一个开了 DNSSEC 的域名,并按格式维护 TXT 记录(勤轮换其中的链上地址);付款方只需在支持本 BIP 的钱包里输入 ₿user@domain 式名字。

钱包开发者:实现 DNS 查询、完整的本地 DNSSEC 验证、CNAME/DNAME 跟随、TTL 缓存规则、₿ 前缀显示与防同形字处理;可选实现 PSBT 中的 DNSSEC 证明字段。原文反复强调:验签必须自己做,不能把信任交给解析器。

域名与 DNS 服务商:无需为比特币改协议,但记录能否用取决于该域名是否部署 DNSSEC。

全节点与矿工、共识层:完全不涉及。本 BIP 不碰链上规则。

六、现在算不算数,以及一个常见误读

状态为 Complete(已完成):规范已定稿,可供钱包实现。它不是共识规则,不需要激活;是否“算数”取决于域名持有者是否按格式发布记录、钱包是否实现解析与验签。原文没有给出采用统计,本页不臆测。

常见误读:“DNS 解析就是查一下域名,解析器返回什么就信什么——跟打开网页差不多。”不对。本 BIP 的核心恰恰是不能信解析器:钱包必须自己把 DNSSEC 签名从根一路验到底,签名算法太弱(SHA-1、短 RSA)要拒绝,同名出现多条 bitcoin: 记录要整组作废。它借的是 DNS 的命名空间与 DNSSEC 的信任链,而不是“DNS 说什么就是什么”。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。