Change Address 是钱包付款时用来接收找零的地址。比特币会完整花费选中的资金,扣除付款额和手续费后,钱包通常把剩余金额放进一个属于自己的新输出。钱仍然是你的,只是记录在另一个输出中,而且往往对应一个新地址。
Alice 此前收到了 120 000 sat,也就是比特币的最小单位,现在想支付 100 000 sat。在这个例子中,她的资金是一个 UTXO,即此前交易中尚未花费的一个输出。付款时,这个输出成为输入,并被整体花费。假设手续费为 2 000 sat,收款人得到 100 000 sat,剩余的 18 000 sat 则进入 Alice 钱包的新输出。这类似于用大额纸币付款并收回找零,但两部分金额在同一笔交易中完成分配。Alice 不必等收款人退钱。钱包通常会自行选择找零地址,因此区块浏览器可能显示两个目标地址,尽管她只付钱给一个人。确认后,找零是一个新的 UTXO,有自己的输出标识 outpoint,并不是旧输出中未花完的一小块。outpoint 由交易标识 txid 和输出在该交易中的位置组成。以后 Alice 可以像使用其他自有资金一样使用它。 [1]
scriptPubKey 脚本规定花费某个输出时必须满足的条件,并不说明你为什么转账。区块中包含金额和 scriptPubKey 脚本,不包含付款人、收款人或找零这样的标签。钱包依靠派生记录识别自己的找零输出;区块浏览器或分析人员则是在推测用途。输出顺序,或“第二个输出就是找零”的说法,都不可靠。一笔交易可以没有找零,可以有一个找零输出、多个由发送方控制的输出,也可以包含多个参与者的输出。因此,change 这个称呼表达的是输出与钱包之间的关系,并不是协议中另行记录的属性。 [1]
启发式方法是根据间接线索进行推测。Payjoin 和 CoinJoin 允许多个参与者共同构建一笔交易,因此简单的推测可能出错。BIP 是技术提案或标准文档。常见的启发式方法会把与输入脚本类型相同的输出、带有零头的金额、新地址,或金额符合剩余值计算的输出视为找零。对于普通的双输出付款,这些推测可能有效,也可能把之后的花费关联起来,但每一种方法都有反例。BIP78 Payjoin 有意打破输入属于同一所有者的假设,也干扰根据脚本类型或整齐的付款金额识别找零的方法。CoinJoin、批量付款和自己地址之间的转账会进一步增加歧义。推测应说明不确定程度并提供支持证据;启发式判断本身既不是协议证明,也不是法律上的所有权证明。 [4] [14]
PSBT 是装有交易草案和补充资料的数据包,钱包与签名设备可以交换它。Multisig 则按照涉及多个密钥的规则进行授权。PSBT 输出中的 BIP32 密钥派生信息,使硬件或离线签名设备能够核实拟议的找零。设备必须自行派生相应输出,并检查它是否符合该钱包的同一套规则。BIP174 描述了单密钥和 Multisig 的检查方法;在需要多个签名时,仅仅发现输出包含一个本地密钥是不够的。恶意交易协调者可以把找零替换成自己控制的输出,也可以把剩余金额藏进过高的手续费中。因此,签名前应在可信显示屏上核对收款输出、总手续费,以及每一个被声明为找零的输出。 [5]
计算时,用 I 表示选中资金,R 表示付给收款人的金额,F 表示手续费,C 表示找零:C = I − R − F。RPC 是向节点发送命令的程序接口。Coin Selection,也就是选择 UTXO 的过程,会一并确定输入、手续费以及可能的找零。金额恰好匹配的输入组合不需要找零输出。否则,钱包会比较剩余金额与创建该输出及日后花费它的成本。Bitcoin Core 的 RPC fundrawtransaction 最多可补入一个找零输出,并返回其位置。如果把选中的全部资金发送给收款人,就会有意不创建找零。通过 Coin Control 手动选择会改变所用输入,进而改变找零金额,但每个被选中的输入仍会被完整花费。因此,应检查最终输入、收款金额、手续费和找零,而不只是付款金额。 [9] [10] [13]
HD Wallet 可以从一个初始秘密派生出许多密钥和地址。派生路径指定要计算哪个地址;BIP 是技术提案或标准文档的编号体系。HD Wallet 通常在外部分支上派生收款地址,在内部分支上派生找零地址。BIP44 将 change=0 定义为外部分支,将 change=1 定义为内部分支。原生 SegWit 账户的路径例如 m/84'/0'/0'/0/i 和 m/84'/0'/0'/1/i。这是钱包层面的约定,不是共识规则;基于描述符的钱包可以采用其他规则。使用新的内部地址有助于减少地址重复使用。把剩余金额退回原地址仍然有效,但会把付款历史关联起来,也可能使其更容易被关联到具体个人。 [2] [3]
下文的 xpub 表示扩展公钥,可以派生后代密钥的公开数据,但本身不能签署付款。seed 是派生密钥的秘密初始值。输出描述符说明脚本类型、密钥、密钥来源信息以及后续地址的派生规则。例如,wpkh([fingerprint/84h/0h/0h]xpub…/0/*) 和 …/1/* 这对表达式可描述收款与找零分支;BIP389 允许用统一写法表达多个分支。internal 标记告诉钱包应使用哪个描述符生成找零,但不会改变最终生成的脚本。恢复钱包时,仅有 seed 未必能找到全部资金。如果缺少账户、脚本类型和派生方式的信息,钱包可能漏掉有效的找零输出,即使所需密钥仍然存在。 [6] [7] [8]
Dust 指按照节点交易转发规则评估的极小输出。相关门槛由输出类型、未来花费它所需的估计数据大小,以及可配置的 dust relay feerate 计算得出。它不是一个通用固定的 satoshi 数额,也不是共识层面的禁令。即使找零高于这个门槛,如果创建并在以后花费该输出的成本预计超过找回的金额,钱包仍可能不创建它。这个经济门槛取决于当前费率、未来费率估计和脚本大小。不创建找零会增加当前手续费;创建过小的输出,则可能让日后的花费成本高得难以接受。 [12]
Replace-by-fee (RBF) 会用手续费更高的另一笔交易替换尚未确认的交易。Bitcoin Core 的 RPC bumpfee 可以通过减少找零、增加输入或创建新的找零输出来补足差额。如果找零降至节点规则或经济合理性的门槛以下,它可能消失。花费尚未确认的找零会创建一笔依赖原交易的后续交易;替换原交易可能使这项依赖失效。但如果钱包或节点的 mempool(尚未确认的交易集合)中已经存在花费原付款某个输出的交易,bumpfee 就会拒绝替换。CPFP(Child Pays for Parent)不替换原交易,而是创建一笔后续交易,花费原付款中由钱包控制的输出。后续交易支付更高的手续费,提高两笔交易合计的费率,从而鼓励矿工把它们一起确认。在替换问题解决前,不应把未确认的 txid 或输出引用 outpoint 当作最终结果。 [11] [15]
恢复时,需要找到收款地址和找零地址。对于常规单签钱包,正确的 Seed Phrase(恢复助记词)、此前使用的 passphrase(如果有)以及兼容的钱包设置,通常就能实现这一点。seed 是派生密钥的秘密初始值;passphrase 是用户选择启用的额外口令。因此,并非每位用户都需要手工记录描述符。不过,自定义设置或由多个密钥共同决定授权的 Multisig,可能不能只靠这些单词恢复。还应保存钱包描述,包括网络、账户、脚本类型、派生规则;Multisig 还需要所有参与者的扩展公钥 xpub、密钥顺序和所需签名数。如果缺少 /1/* 分支,恢复时可能漏掉找零,显示的余额就会偏低。应检查两条分支中已知的地址和输出、派生范围以及历史扫描起点。恢复测试也应确认能否准备并正确签署一笔付款。 [2] [6] [7]
要获得更完整的理解,请将本词条与以下词条结合阅读: 比特币地址, UTXO, Coin Control, 钱包, Coin Selection, HD Wallet. 反向关联还来自: 比特币地址, Coin Control, Bitcoin 隐私, 假名性.