区块链/等级 II · 运作机制/2.2 交易/课程 4
找零输出
暴露发送方的剩余金额,以及试图隐藏它的算法
材料区块浏览器(例如 mempool.space 或 blockchain.com)一个包含至少两个UTXO的比特币钱包用于记录交易ID、输入金额和输出结构的电子表格
好奇
- 为什么金额恰好匹配的交易看起来往往与需要找零的交易不同?
- 分析师在无法查看钱包内部状态的情况下,如何判断哪个输出是支付金额,哪个是找零?
- 是什么促使币选择(coin selection)算法宁愿选择稍高的手续费,而非较低的手续费?
探索
- 比特币交易的输入就像不可分割的实体纸币。如果爱丽丝打算支付5 BTC,但手里只有一个20 BTC的UTXO,她无法拆分这个输入。她必须花掉全部20 BTC,并在扣除手续费后收回15 BTC作为找零。因此,大多数交易都包含两个输出:一个给收款方,一个用于返还找零。
- 在协议层面,“支付”输出与“找零”输出没有任何区别。二者都是标准的锁定脚本,如 P2PKH 或 P2WPKH,等待满足花费条件。只有交易创建者知道哪个输出是哪个。这种无差别正是一项核心隐私机制:如果找零地址和支付地址看起来完全相同,外部观察者就无法确切地区分它们。
- 钱包使用币选择算法来决定花费哪些输入。如果爱丽丝持有两个各为50,000聪的UTXO,想要支付给鲍勃85,000聪,她会花掉这两个输入(共100,000聪),并创建两个输出:一个给鲍勃(85,000聪),一个给自己(15,000聪减去手续费)。这种“一个或多个输入、恰好两个输出”的结构是链上最常见的形态之一。
- 为保护隐私,标准做法是将找零分配到钱包密钥池中一个从未使用过的新地址。重复使用旧地址接收找零,会让链上分析人员能够把之前的交易活动与新交易联系起来。在最理想的情况下,支付输出和找零输出都分配给全新地址,确保它们在外部观察者看来完全相同。
- 并非每笔付款都需要找零。Mark Erhardt于2016年提出、并被Bitcoin Core采用的分支定界(Branch and Bound)等币选择算法,会寻找一组输入,使其总额与付款金额加手续费足够接近,从而让少量剩余直接计入手续费。无找零交易成本更低,不会产生新的小额输出,也让分析人员少了一条线索。
- 非常小的输出会带来自身的问题。低于粉尘阈值(默认情况下,P2PKH输出约为546聪,P2WPKH输出为294聪)时,花费该输出的成本高于其本身价值,节点也不会转发创建此类输出的交易。分析人员还会寻找能暴露找零的典型模式:金额为整数的输出通常是付款,而地址类型与输入相同的输出往往是找零。
关键事实
- 交易输入不可分割;超出付款金额和手续费的剩余部分会作为找零返还,除非其数额小到可以直接计入手续费。
- 在协议层面,找零输出与支付输出之间没有技术上的区别;只有交易创建者知道哪个是哪个。
- 分支定界(Branch and Bound)币选择算法(Erhardt,2016)会寻找无需找零输出的输入组合。
- 无找零交易没有将资金返还给发送方的输出;任何少量剩余都计入手续费。
- 使用一个从未出现过的新地址接收找零,可防止第三方轻易将其与支付输出区分开来。
- Bitcoin Core默认的粉尘阈值对P2PKH输出约为546聪,对P2WPKH输出为294聪。
练习 九、六、三、一
9收集列出9笔你观察到或创建的最近比特币交易。注明每笔交易的输入数和输出数,以及是否存在找零输出。
6归类根据结构将这9笔交易分为6类:单输入/单输出、多输入/双输出(有找零)、多输入/单输出(无找零)、coinbase、OP_RETURN,或其他复杂结构。
3提炼将这6组归纳为3种不同的隐私影响,涉及分析人员将输出与特定用户身份关联起来的难易程度。
1凝结用1句话解释:为什么支付输出与找零输出之间没有技术区别,这一点既是可替代性方面的优势,又是个人隐私方面的挑战。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。
- M. Erhardt, 'An Evaluation of Coin Selection Strategies' (2016)
- A. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3rd ed. (2023)
- Bitcoin Core documentation on transaction relay policies and dust limits
- Satoshi Nakamoto, Bitcoin: A Peer-to-Peer Electronic Cash System