跳转到正文
buybitcoinsmart

术语表 /地址与密钥

NUMS 点

NUMS 点是什么?
NUMS 点是一个无人掌握私钥的公钥,在合作支付路径被有意设计为无法使用时,用作 Taproot 的内部密钥。

规定于 BIP-341。

Nothing Up My Sleeve 是其性质:该点来自公开、可重复的生成方法,因此无人能声称持有它的秘密密钥。BIP-341公布了一个这样的点,即 x 坐标0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0,由对 secp256k1 基点 G 的标准未压缩编码做哈希运算得出。对钱包而言,Taproot 输出由此变为仅限脚本:只能通过其条件树支付,别无他途。

运作方式

NUMS 点最初是一个哈希值,而不是密钥。

普通公钥是生成元 G 乘以一个秘密数字,选定该数字的人可以签名。NUMS 点则反向构造:取一个固定的公开字符串,对其做哈希,再把32字节的摘要读作 x 坐标。BIP-341中的示例对 G 自身的标准未压缩编码做哈希,使作者无法操纵输入。把该值提升为曲线上的点,得到的公钥除一点之外在各方面都有效:为它签名需要求解离散对数,BIP-341给出2的128次方分之1作为该设计的安全界限。

Taproot 提供其余部分。Taproot 输出密钥是内部密钥 P 沿曲线按调整值(tweak)平移后的结果,该调整值承诺了脚本树的默克尔根:BIP-341规定 t = hash_TapTweak(p || merkle_root),然后 Q = P + int(t)G。通过密钥路径为 Q 签名需要 P 背后的私钥,因此当 P 是 NUMS 点时,该路径被封闭,脚本路径是唯一的入口。这样的支付会披露一个叶子脚本,外加长度为33 + 32m 字节的控制块,其中 m 是兄弟哈希的数量,BIP-341将其上限定为128。

有一处泄露值得了解。众所周知的 NUMS 点一眼即可识别,因此在控制块中原样公布它,等于宣告密钥路径从一开始就已失效。BIP-341建议不要这样做:从0到 n 减1的范围内均匀随机选取一个新的整数 r,改用 H + rG,它与普通内部密钥无法区分。保留 r,您仍可向共同签名方证明该点是 NUMS 点,方法是交出 r 供其重新计算。

在哪里会遇到它

NUMS 点从不出现在地址中,只出现在脚本路径支付的见证数据里。

在链上,该输出为34字节,即 OP_1后接一个32字节的数据推送,与其他任何 Taproot 输出没有区别。内部密钥是控制块第一个字节之后的32字节,因此在有人首次通过脚本树支付时才会显露。一个已入账、但从未通过脚本支付的输出,永远不会暴露它。

描述符使这一选择变得明确。BIP-386要求 tr() 下的每个密钥表达式都为 x-only,并把内部密钥放在 tr(KEY, TREE) 的第一位,因此其中的 NUMS 点就是描述符声明不存在密钥路径的方式。与之对应的是没有脚本树的 tr(KEY),BIP-386在此引用了 BIP-341的建议:没有脚本路径的输出,仍应承诺一个无法支付的脚本路径。

NUMS 内部密钥使恢复钱包取决于描述符字符串,而不仅仅是助记词:助记词可以还原叶子密钥,但其中没有记录脚本树,也没有记录其上方的那个点。Sparrow 的多签流程会提示您保管好描述符,对这类钱包而言,这一提示比对普通密钥路径钱包更为重要。

NUMS 点 vs 空数据交易

NUMS 点关闭的是一条支付路径,而空数据交易使整个输出彻底无法支付。OP_RETURN 输出在设计上可证明已失效:节点会将其从 UTXO 集中剔除,分配给它的任何金额都会被销毁。NUMS 内部密钥背后的比特币不会被销毁:脚本树中的每个条件仍可正常支付。两者共有的词是“无法支付”,前者指单个分支,后者指整个输出。

请勿混淆

常见问题

发送到带有 NUMS 内部密钥的 Taproot 输出的比特币还能支付吗?

能,通过脚本路径。NUMS 内部密钥只会停用密钥路径支付,因此树中承诺的每个脚本仍可正常支付,没有任何比特币被销毁。

BIP-341为什么建议给 NUMS 点加上一个随机值?

为了隐藏密钥路径无法使用这一事实。BIP-341建议随机选取一个新的整数 r,并把 H 加 r 乘以 G 用作内部密钥,这样控制块中披露的值看起来与其他任何密钥无异,之后还可以公开 r,以证明该点没有已知的私钥。

作为普通的比特币买家,我需要关心 NUMS 点吗?

不需要,除非您构建 Taproot 合约,或根据描述符恢复钱包。单签钱包使用的是您实际掌控的内部密钥,NUMS 技巧只出现在仅限脚本的安排中,例如保险库和共同托管方案。

接着阅读

相关术语

地址与密钥中的更多术语

阅读本页英文版