科普 | 从来没有什么比特币,有的只是UTXO
在很多小白的认知中,比特币的交易逻辑和现实世界中的银行账户交易逻辑是一致的。实际上,作为一个去中心化的现金系统, 比特币采用的并不是传统的账户模型,而是UTXO模型 。甚至有这样一种说法广为流传: 从来没有什么比特币,有的只是UTXO 。
什么是UTXO
UTXO是Unspent Transaction Output的缩写,直译过来就是 未花费的交易输出 。要理解这个概念,先要清楚比特币的交易逻辑。
为了方便大家理解,在这里我们不放那些“非人言”的专业解释,直接上例子。
假设张三有1000元,李四有2000元,王五有3000元
三个人之间有生意往来,因此经常会互相转账,以下是三人最近发生的三笔转账:
转账1:王五向张三转账1000元
转账2:李四向张三转账500元
转账3:张三向王五转账800元
现实世界中,我们的转账收款都基于两个基本概念:账户和余额。 银行 等第三方系统只需要根据我们发出的转账申请 在不同的账户之间划转余额数量,并保证其总量不变即可 。
以转账1为例,如果是在现实世界中,转账发起时银行或者支付宝等第三方系统会校验王五的账户内是否有至少1000元的余额,如果余额不足,则直接拒绝转账请求,交易失败;如果余额足够,就在王五的账户内减去1000元,并在张三的账户内加上1000元。
其他两笔转账也是同样的流程。经过了3次转账之后,张三的账户余额变成了1700元,李四的账户余额为1500元,王五的账户余额为2800元。
而在UTXO模型下,系统会将张三的1000元、李四的2000元、王五的3000元都视为UTXO。
以转账1为例,当转账发起时,系统会将王五的3000元UTXO作为一笔交易输入,然后将这笔输入一分为二,张三的地址下增加一笔1000元UTXO交易输出,王五的地址下增加一笔2000元UTXO输出。 此时张三的地址并不是有一笔2000元的UTXO,而是有两笔1000元的UTXO。
转账2发生时,李四的2000元UTXO作为输入,张三的地址下增加一笔500元UTXO输出,李四的地址下增加一笔1500元UTXO输出。此时,张三的地址有两笔1000元UTXO和一笔500元UTXO。
转账3发生时,张三的一笔1000元UTXO作为输入,王五的地址下增加一笔800元UTXO输出,张三的地址下增加一笔200元UTXO输出。
三笔转账结束后,三个人地址下的UTXO会变成这样:张三有一笔1000元的UTXO,一笔500元的UTXO和一笔200元的UTXO;李四有一笔1500元的UTXO;王五有一笔2000元的UTXO和一笔800元的UTXO。
如果觉得上面的例子还不够通俗易懂,那我们可以将 UTXO类比于现实世界中的现金钞票 。
假设一件商品的价格是90元,张三看上了这件商品,现在他手头有100元、50元、20元、20元四张纸币。
现实世界中是没有90元纸币的,张三也不可能将一张100元纸币撕个90%出来进行支付。这个时候张三可以使用一张50元、两张20元进行支付,也可以使用一张100元进行支付,同时收回商家找零的10元。
无论是50元、20元、100元还是10元,我们都可以将其视为UTXO。由于我们没有90元的UTXO, 因此我们可以使用多笔小的UTXO作为交易输入,也可以输入一笔大的UTXO,一部分输出给对方,一部分输出给自己 。
与现金系统不同的是, UTXO每次使用过后就会销毁并形成新的UTXO 。这个机制其实很好理解,UTXO名称的含义就是未花费的交易输出, 一旦消费过了,就不再是UTXO 。
比如张三使用100元进行支付,那这笔100元的UTXO就变成“已花费”,并形成了90元和10元两笔新的UTXO;若张三使用一张50元和两张20元进行支付,那这三笔UTXO也会变成“已花费”,形成一笔90元的新UTXO。
找零地址
类似于现金系统,UTXO也是有找零概念的 。张三支付100元,90元输出给商家,10元输出给自己,给自己的这部分就相当于是找零。这时候张三需要设置一个找零地址来接收这10元输出, 找零地址可以是原先发出交易的地址,也可以是一个新的地址 。
可能有的朋友会疑惑,为什么要设置一个新的找零地址呢?像银行体系一样只用同一个账户不行吗?
啊,放错图了。答案是 可以,但不安全 。
俗话说,财不露白,大部分人都不愿意将自己的财富暴露在大庭广众之下。
由于 包括比特币在内的UTXO模型币种的交易数据都是公开可查且可溯源的,多次使用同一地址收款会降低用户隐私 。
一旦用户在某次交易中不小心暴露了自己的真实信息,那么这个地址的真实归属也会暴露。坏人可以直接查看到这个地址中的余额总数,严重者有可能带来直接的人身安全问题。
设想一下如果哪天李老师暴露了一个真的有6位数的比特币地址,会有多少法外狂徒盯上他。
如果你设置一个与发起转账地址不同的找零地址,安全性将得到极大的提升。因为 找零地址会混在数个(至少是两个)收款地址之中 ,坏人只能确定发起转账的地址是你的,但不知道你现在还有没有钱,即使知道你有,也没办法确定钱是在哪个地址里,有多少。