比特币的钱包是建立在 Hierarchical Deterministic(分级确定性)框架之上的,它具有生成不同地址和管理地址的方法。找零地址也是由助记词加特定路径生成的子地址,它本质上还是子地址。使用子地址能够提供给用户更佳的匿名性和隐私性。
比特币的找零机制详解
比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么链上的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址?
为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失?
这一切都是因为比特币的找零机制。下面详细为大家解释一下比特币的找零机制是怎样运作的。
维基百科上是这样说的:将用户有权使用的若干比特币汇款地址上的之前交易的输出金额作为一次交易的输入,若干比特币收款地址上增加的交易金额作为本次交易的输出。输入金额必须大于等于输出金额,超出部分作为本次交易的手续费。手续费没有输出地址,奖励给将本次交易记账成功的矿工。
这也就是前天给大家说的UTXO,前天说的是在交易时多出来的部分将返回输入方,那么比特币系统具体是操作的呢?
你每转账一次,客户端会自动匹配你钱包里大于等于转账金额的收款地址(一个地址的余额不够时,会匹配两个、三个……直到这几个地址的余额之和满足转账需要金额的最小值)然后把这笔钱一起发送出去,扣除转账所需金额(可能包含少量的手续费,这取决于你的钱包手续费选项的设置和网络情况),然后就会给你把找零的钱发回你钱包里的一个隐藏地址,这就是比特币的找零机制。
举个栗子,比如你想从商店买一块钱的棒棒糖,你打开你的钱包,发现里面只有一张20元面值的人民币。你能支付的最小金额是多少呢?当然不是1块钱,你不能把这张20元钱的纸币撕下二十分之一再交给营业员。你必须把这张20元面值的人民币全部交给收银员,然后因为你只需要支付1元钱,收银员会找给你19元。
在比特币的系统里虽然没有像人民币这样有固定的面额,但比特币在每次交易时的输入地址的比特币总额却是固定的。我们要保证每次交易的输入金额必须大于等于输出金额,想要每次都正好等于是不可能的,所以就必然要经过找零这个过程。
我们可以更形象的看待这个过程,在比特币的系统中,任何一笔交易的输入地址中的比特币都看作被销毁了,并在输出地址中生成总和相等的比特币。这样就等于把输入地址中的固定面额的比特币,转换成了若干个输出地址中的任意面额的比特币(只要总和完全一样就行)。
这就是比特币的运作机制。与法定货币不同,我们习惯把这种方式称之为交易单元的输入和输出。
当你“支付”比特币,并创建一次交易时,你必须将你支付地址上可供支付的金额(来自该地址之前交易的输出)作为新交易的输入。这样的地址可能不止一个,你的比特币钱包会暗自寻找你钱包中所有可供支付的输出金额(可能来自于不同地址),并把它们加在一起显示为钱包可用余额。
所以,当你的比特币钱包说你有130个BTC时,它只是意味着你的所有地址上可供支付的交易输出加在一起共有130个BTC。这和你的普通钱包中放着1张100元和3张10元人民币差不多一个意思。
比特币钱包文件中包含了所有找零地址的私钥,它们可以正常的接收或者发送比特币。但是,比特币官方客户端的界面上并不会把这些找零地址显示在地址簿中,也许是为了匿名性的必要,也许是为了减少客户的困惑,虽然这也造成很多人新的疑惑。
因为比特币客户端一开始只产生100个客户专属地址的私钥(称为私钥池),在创建找零地址时会优先使用这100个地址中的某一个,但当这些地址都被使用之后,100个以外新的找零地址就会被创建。如果你只备份了一开始的100个地址的钱包,那么在上面这种情况下恢复钱包将丢失新的找零地址。
找零机制是匿名性的需要,一笔钱从A地址花费出去后找零的币会计入属于你钱包的另一个地址B,但别人不知道这个找零地址B的主人也是你;也是让比特币无法凭空编造的需要,任何一个从区块里挖出来的币,其每一次转账都会一直记录下去,所以是可追溯的。