跳转到正文
buybitcoinsmart

术语表 /地址与密钥

找零地址

又称找零输出。

找零地址是什么?
找零地址用于接收钱包未花费的那部分输入,因为比特币输出必须整笔花掉,剩余部分总得有地方可去。

规定于 BIP-32。

比特币没有部分花费的概念。如果您持有一枚0.05 BTC 的币,支付0.012 BTC,这笔交易会销毁这枚币,并创建两枚新币:一枚是支付款项,另一枚是约0.038 BTC 的找零,锁定在只有您自己控制的地址上。在区块浏览器上,第二个输出看起来像是向陌生人付款,但事实并非如此。

运作方式

每笔比特币支付都是先选取若干完整的币作为输入。一枚币,准确地说是未花费交易输出,无法在原处拆分:交易会将其整枚消耗,并写入新的输出。您的钱包会汇总所选的输入,减去您要支付的金额和矿工将收取的费用,再把余额发送到它为自己生成的目标地址。这个目标地址就是找零地址。

现代钱包把这些目标地址保存在其密钥树的一条独立分支上。BIP-44规定的结构为 m / purpose' / coin_type' / account' / change / address_index,其中倒数第二层在对外提供的地址上为0,在钱包留给自己使用的地址上为1。因此,原生 SegWit 钱包的第一个找零地址是 m/84'/0'/0'/1/0,由与其他所有地址相同的助记词派生,无需额外备份。

过去并非如此,这段历史也解释了为什么会有这条分支。早期的比特币客户端从预先生成的随机密钥池中取用找零地址,默认有100个。花费超出密钥池末尾之后,此前备份的 wallet.dat 就不再包含您找零所在的密钥,有人就是这样恢复备份后发现资金不见了。Bitcoin Core 自0.16.0版本起只创建分层确定性钱包,预生成密钥池现在默认为1,000个密钥。

找零金额是一道算术题:输入减去支付款项再减去手续费。交易中没有任何标记表明某个输出是找零。节点看到的是两个输出,并同等对待,这正是找零成为隐私问题而非记账问题的原因。

购买比特币时为何重要

您的第一个找零输出,通常出现在您第一次花费从交易所提取的币时,并且它会继承该次提币所包含的有关您的一切信息。

核验过您护照的交易所记录了它向其付款的地址。之后您从该地址花费时,找零由同一笔交易创建,因此任何追踪原始输出的人也会追踪到找零,包括交易所付费聘用的任何分析服务商。如果把一次提币拆分到两个钱包,之后又在一笔交易中同时花费这两个钱包的币,这样的拆分毫无意义。把交易所提出的币单独放在一个钱包里,并有意识地从中支付,才能限制身份信息扩散的范围。

硬件钱包防范的是第二种更尖锐的风险。被入侵的计算机可以构造一笔交易,使找零输出流向攻击者而不是您,而总额看起来仍然正确,屏幕上没有任何异常。Trezor 或 Ledger 设备会检查每个找零输出是否由其持有的种子派生,并对任何不是由其派生的输出发出提示。这项检查只有在您于设备自带的显示屏上确认金额、而不是在浏览器中确认时才有效。

还有一项您可以施加影响的成本。两个输出比一个输出成本更高:一个原生 SegWit 找零输出会使交易增加31字节,在15 sat/vB 下约为465聪,并且会产生一枚日后花费时约需68虚拟字节的币。采用分支定界(branch and bound)选币算法的钱包会尝试找到与支付金额足够接近的输入,从而完全省去找零,当您的币面额大小不一时,比全是整数金额的提币更容易成功。

找零也不是处置。把自己那枚币的余额支付给自己并不是出售,但投资组合追踪工具通常会把找零输出导入为收入的购买或支出的出售,从而扭曲成本基础。如果您的追踪工具在您支付发票的当天显示了一笔您不认识的交易,通常就是这个原因。

追踪一笔0.05 BTC 提币中的找零

跟踪一枚币从交易所到商户的全过程,每一个数字在链上都清晰可见。您把0.05 BTC 提到自己钱包中的一个 bech32 地址,它以一个价值5,000,000聪的输出到账。

几周后,您欠一家商户1,200,000聪。您的钱包恰好只有一枚币,因此必须花费全部5,000,000聪。这笔交易有一个输入和两个输出,约141虚拟字节,在15 sat/vB 下手续费为2,115聪。商户收到1,200,000聪。找零输出收到5,000,000减去1,200,000再减去2,115,即3,797,885聪,并落在 m/84'/0'/0'/1/0。

这笔交易中没有任何信息说明哪个输出是哪个。通常有两种启发式方法会暴露答案:找零是金额未取整的那个输出,找零往往也是脚本类型与输入一致的那个输出。对找零金额取整、或复制收款方脚本类型的钱包,正是为了打破这些推测而存在。

找零地址 vs 唯一地址

找零地址和新的收款地址都只使用一次,区别在于预期由谁看到它们。收款地址来自外部分支,链索引为0,用途是复制到他人的钱包中。找零地址来自内部分支,链索引为1,从不向付款方展示;大多数界面不会显示找零地址,除非您打开币控制界面。两者因同样的隐私原因而轮换,也都可以通过同样的十二个或二十四个单词恢复。

找零地址 vs 粉尘

找零是剩下的部分,粉尘则是小到不值得创建的剩余部分。Bitcoin Core 拒绝转发这样的输出:其价值低于其日后花费时每虚拟字节3聪的水平,折算下来,传统输出为546聪,原生 SegWit 为294聪。当钱包算出的找零低于这条线时,它根本不会创建该输出,这部分价值会作为额外手续费归矿工所有。因此,支付略低于全部余额的金额,实际成本可能远高于您得到的报价手续费。

请勿混淆

常见问题

为什么我的钱包把比特币发送到了一个我不认识的地址?

该输出几乎可以肯定是您自己的找零。比特币以整枚币为单位花费,因此剩余部分会发送到您钱包内部分支上的一个新地址。打开币控制或交易详情界面,钱包会标明该输出属于您。

如果我只备份了助记词,我的找零安全吗?

安全。找零地址按 BIP-32由同一助记词派生,位于编号为1的分支上,因此恢复助记词时,找零地址会和其他地址一并恢复。2016年之前的钱包则不是这样,它们的找零来自一个固定的随机密钥池。

我可以让钱包不产生找零吗?

只能间接做到。可以发送全部余额,这样不会产生找零输出;也可以使用币控制,选择与付款金额足够接近的输入,使钱包舍去找零。大多数钱包已经会自动尝试第二种方式。

找零金额很小时,它去了哪里?

低于粉尘阈值时(传统输出为546聪,原生 SegWit 为294聪),钱包会舍去找零输出,并将这部分价值作为额外手续费交给矿工。这些币并非在可找回的意义上丢失,而是已花在这笔交易上。

接着阅读

相关术语

地址与密钥中的更多术语

阅读本页英文版