找零地址是什么:转出一部分比特币后,剩下的去哪了

找零地址,是钱包在你只转出一部分比特币时,用来收下剩余那部分的地址。它还是你的:在用助记词的钱包里,它和你的收款地址出自同一套助记词,只是通常不是你转出时用的那一个。所以把原来的地址贴进链上查询,看到余额变成 0 或者少了一大截,多半不是币丢了,是剩下的钱搬到了同一个钱包的另一个地址上。真会找不回来的情况也有,都出在备份方式上:只导入了单个私钥就花掉一部分;换钱包恢复时派生路径没对上(这种币其实还在,只是没显示);或者从头到尾没备份过助记词。
找零为什么会发生
链上不给你记一个账户余额,记的是你一笔一笔收到的币,每一笔都是一个整块,技术上叫未花费的交易输出,简称 UTXO。收过三次币,钱包里就躺着三块,哪怕三次都收在同一个地址上。
这种整块花的时候掰不开。Bitcoin Wiki 的 Change 词条说得很直接:一笔交易的输出被拿去当下一笔的输入时,必须整个花掉。花不完的那部分怎么处理,比特币开发者文档的说法是再加一个输出,把多出来的聪转回给付款的人自己,这个输出就叫找零。
拿 50 块的纸币买 30 块的东西,收银员找你 20,是一回事。区别在于这里的收银员就是你自己的钱包,而且它习惯把找回来的钱放进另一个口袋。
| 一笔转账里(举例) | 金额 |
|---|---|
| 输入:你之前收到的那一整块 | 1,000,000 聪(0.01 BTC) |
| 输出 1:转给对方 | 300,000 聪 |
| 输出 2:找零,回到你钱包里的一个新地址 | 698,000 聪 |
| 没写进任何输出的差额,就是手续费 | 2,000 聪 |
手续费不单独占一个输出,它就是输入总额减去全部输出之后剩下的那点,Bitcoin Wiki 的矿工费词条也是这么定义的。表里的 2,000 聪是随手取的整数,只为让账好算,真实费用要看你发出那一刻的费率和这笔交易占多少数据,当下贵不贵可以先在转账费查询里看一眼。钱包是先扣掉手续费再算找零的,所以找零金额往往是个零零碎碎的数。
找零去了哪:还是你的,换了个地址
现在的钱包大多用助记词,地址是从助记词按固定规则一层一层推出来的。BIP-44 在这套规则里专门留了一层叫 change:填 0 是外部链,用来生成给别人看的收款地址;填 1 是内部链,BIP-44 写明它用于退回交易找零,这些地址本来就不打算让钱包外面的人看到。
BIP-84 的测试向量里,同一个账户下,m/84'/0'/0'/0/0 推出第一个收款地址,m/84'/0'/0'/1/0 推出第一个找零地址,两个都以 bc1q 开头,来自同一颗种子。收款地址和找零地址像同一张桌子的两个抽屉,助记词在,两个抽屉就都打得开。
所以钱包的「收款」页一般只把外部链的地址推给你,找零地址平时根本不露面。有的钱包在地址列表里把它们单独标出来,有的藏得深一些。
Bitcoin Wiki 的 Change 词条到现在还留着「每 50 笔交易备份一次 wallet.dat」这句建议,它对应的是助记词钱包普及以前的那一代:密钥大多随机生成、单独存在钱包文件里,不重新备份,新生成的找零地址就可能没进备份。常被转述的「客户端一开始先生成 100 个私钥」「隔几十笔交易就要重新备份钱包文件」,说的也是那一代钱包,放到用助记词的钱包上不适用。
贴原地址一查,余额变成 0 了
你把币提到自己的钱包,后来转了一部分给别人,想核对一下,就把当初那个收款地址贴进链上到账查询,「当前余额」一行是 0 BTC。
这个 0 没错:那个地址上原本只有一块币,转账时整块花掉了,找零去了内部链上的新地址,原地址自然清零。查询工具里的余额只算已确认的部分,是这个地址已确认收到的总额减去已确认花出的总额。刚转出、还没被打包的那段时间,余额不会马上变 0,这笔转账会先显示在「待确认交易」里。它只认你贴进去的这一个地址,不知道你钱包里还有别的地址。
想确认钱还在,可以按这个顺序看:
- 先看钱包里的总余额。钱包会把外部链和内部链上的币加在一起显示,某一个地址的余额说明不了什么。
- 再确认那笔转账已经打包。把交易号贴进同一个查询工具,看它是不是已确认。
- 想看钱具体去了哪,用任意一个区块浏览器打开这笔交易看输出:一个是对方地址和你转的金额,另一个金额接近「原来那块 − 转出的数 − 手续费」,那个就是找零,地址多半是你没见过的。
- 拿这个地址回钱包里对一下。在地址列表里搜,或者看这笔交易的详情,一般能看到有一部分回到了你自己名下。
如果你只是从交易所把币提到自己地址、只收没花,你这边就不存在找零。那笔交易里除了给你的那个输出,其余输出都是发送方的事。
定投的人多想一步:提币越碎,零钱越碎
每提一次,钱包里就多一块 UTXO。哪怕次次都提到同一个地址,它们在链上也是分开的几块,不会自己合并。平时完全看不出差别,钱包总余额照样是加起来的那个数。
差别出在以后要花的时候。假设一年里提了 12 次,某天想一次转走大部分,钱包很可能得把好几块一起塞进同一笔交易当输入。开发者文档写明手续费按签好名的整笔交易大小算(隔离见证之后实际按虚拟大小 vB 计),每多一个输入,交易就多占一截数据,费用跟着上去,跟你转多少钱关系不大。这件事的来龙去脉在转比特币的手续费是怎么回事里讲过。
小额囤币没必要为这个折腾,更用不着专门去学「手动选币」这类功能。能做的就是提币别太碎,攒到你自己觉得值得的量再提一次。已经碎了也不用为了合并专门转一笔,合并本身也要付费,等真要花的那天挑个费率低的时段就行。
哪几种情况,剩下的币才真像是丢了
只导入了一个私钥,然后花掉一部分。纸钱包、别人手抄给你的单个私钥,最容易栽在这里。Bitcoin Wiki 的纸钱包词条专门提过这种事:有人把私钥导入软件钱包,花掉一部分,以为剩下的还在纸钱包上,其实早就在找零地址里了。这时纸上那个私钥对应的地址是空的,找零地址的私钥在那个软件钱包里;如果这个软件钱包本身没有备份(没抄它的助记词,也没留钱包文件),钱包一删,这部分就回不来。同一个词条给的做法是找一个带「扫入」(sweep)功能的钱包,把那个私钥上的币整笔转进有助记词的钱包里,别导入之后零着花。
换了个钱包恢复助记词,余额显示 0 或者少了一截。同一套助记词,按不同的规则会推出完全不同的地址:BIP-44 在路径最前面用 44',BIP-49 用 49',BIP-84 用 84',BIP-86 用 86',各自对应不同类型的地址。新钱包默认扫的那一套,要是和旧钱包当初用的不同,它就看不见你的币。币还在链上,在新钱包里切换地址类型或派生路径的设置,或者把原来那个钱包装回来就行。
还有一种少见些的:BIP-44 定了一个间隔上限,连续碰到 20 个没用过的地址,钱包就认为后面不会再有,停止往下找。要是你以前一口气生成过一长串没用上的收款地址,排在后面的地址上的币就可能没被扫到。这时换派生路径没用,要在钱包设置里调大地址查找数量(gap limit,不是每个钱包都开放这个选项),或者装回原来那个钱包。
只抄了某一个地址的私钥,没备份助记词。找零会落到你没抄过的地址上,那部分私钥根本不在你的备份里,手机一丢就跟着没了。要备就备助记词。
为什么不直接退回原地址
技术上做得到,很早以前也真有钱包这么干。Bitcoin Wiki 的隐私词条提到,有些 2010 到 2011 年、还没有确定性钱包的老软件,会把找零原样发回付款地址,结果外人一眼就能认出哪个输出是找零,等于把「这个人还剩多少」摆在明面上。
换成新地址能让旁观的人少一条现成的线索,但专门做链上分析的人另有办法认出找零,同一个词条里就列了好几种。地址上的余额和交易谁都查得到,所以别把收款地址和自己的真实身份一起发到公开场合。
拿不准的时候,就回到那一笔交易上算账:原来那块币的金额,减去转给对方的,再减去手续费,剩下的数如果能在某个输出上对上,钱就还在你这边。对不上,再回头看上面那几种情况。