跳转到正文
buybitcoinsmart

术语表 /协议与升级

临时锚点输出

临时锚点输出是什么?
临时锚点输出是为一笔交易额外添加的零价值输出,其唯一用途是让某人可以附加一笔支付手续费的子交易,从而把父交易带入区块。

规定于 BIP-431。

闪电网络等合约协议必须在无人知道手续费水平之前很早就签署交易,因此需要一种事后补足手续费的办法。Bitcoin Core 28.0正是为此把一种四字节、任何人都可花费的脚本列为标准,29.0则允许这样的输出不含任何金额,前提是其父交易不支付手续费。好处是通道关闭的成本更低,滞留的资金也更少。

运作方式

临时锚点输出解决的是一个时间安排问题:预签名交易带有数月前选定的费率,而到需要广播时,市场已经变化。

较早的变通办法是给交易留一个小额的可花费输出,让需要的人广播一笔同时为两者支付手续费的子交易。闪电网络的锚点通道用的就是这种方式,每方一个,共两个输出,每个330聪。这样可行,但这笔资金被锁定在每一笔承诺交易之内,此后这些输出无论是否有人清扫,都会留在活跃币集合中。

Pay-to-anchor 去除了其中大部分成本。Bitcoin Core 28.0识别出一种新的标准输出,其脚本恰为四字节:OP_1、一次两字节的数据推入,以及字节0x4e 0x73。这是一个长度为2的隔离见证版本1程序,而由于 Taproot 对未知的版本1程序不设花费条件,任何人都可以用空见证花费它。无需密钥,无需披露脚本,输入小到几乎不值什么。

起初,粉尘规则仍然起作用。Bitcoin Core 按花费一个输出所需的成本为其定价,对这个输出而言相当于80虚拟字节,按标准粉尘费率每虚拟字节3聪计算,它至少必须持有240聪。比330聪好,但仍不是零成本。

Bitcoin Core 29.0通过临时粉尘填补了这一缺口:一笔交易可以带有一个低于粉尘阈值的输出,包括价值为零的输出,只要该交易本身支付的手续费恰好为零。零手续费是关键。不支付任何手续费的父交易永远无法单独被挖出,因此可以保证锚点不会滞留在活跃币集合中。它只存在于一个交易包之内,与花费它的子交易同在,名称即由此而来。

Bitcoin Core 28.0的另外两项内容使这一安排可以实际使用。TRUC 交易由 BIP431 规定,以版本3标示,允许一笔未确认的父交易和一笔未确认的子交易,并把交易大小限制在10,000虚拟字节,从而消除了使手续费追加不可靠的钉住攻击。随后,机会性交易包中继让父交易可以与其子交易成对传播,零手续费的父交易这才有可能到达矿工。

在哪里会遇到它

临时锚点输出出现在闪电网络的通道关闭中,以及基于预签名交易构建的较新合约协议中,从不出现在普通支付里。

在区块浏览器上,它们乍看之下不对劲:一个价值为零的输出,在紧随其后的交易中被一个带空见证的输入花费。如果您运行闪电网络节点,效果是强制关闭不再需要在每笔承诺交易中预留粉尘,而且在您需要时,为卡住的关闭交易追加手续费成功的可能性大得多。如果您只在链上持有比特币,则永远不会创建这类输出,好处通过闪电网络使用成本更低而惠及您。

临时锚点输出 vs 粉尘限额

粉尘限额的作用是防止活跃币集合被小到不值得花费的输出填满,而临时锚点输出是唯一一种打破这条规则也可证明安全的情形。普通的粉尘输出可以永远不被花费,让全球每个节点多占一点内存,而该输出的价值不到一美分。临时锚点输出则不能:其父交易不支付手续费,因此除非花费该锚点的子交易随之到达,否则没有矿工会收录这笔父交易。这项豁免并非对原则的放宽,而是表明该原则在此不适用。

请勿混淆

常见问题

我自己会创建临时锚点输出吗?

通过普通钱包不会。锚点由闪电网络等合约协议构建,这类协议需要预签名交易,并在事后调整手续费。链上储蓄和交易所提币从不使用锚点。

粉尘输出会被拒绝,为什么却允许零价值输出?

因为它无法长期存在。该规则只在交易支付零手续费时才允许这种输出,这意味着除非花费该锚点的子交易与之一同提交,否则没有矿工会确认这笔父交易,因此该输出不会滞留在活跃币集合中。

相关术语

协议与升级中的更多术语

阅读本页英文版