同事小张前段时间休假去泰国,满世界都是白牙齿咧嘴笑的美女,小张心情无限好。他走进一家商店买饮料,16元。小张递过去一张20元纸币,想了想,又递过去1块钱,“美女,找零凑个整。”他淳朴的脸上写满了真诚。
收银员妹子拿到小张递过去的1块钱,眉头紧蹙。完蛋了,妹子数学不好,明明给你4块钱就行又给我1块是啥意思?妹子看着计算器上显示的4块,从抽屉取出4个硬币,又把手里还没焐热的那个1块一起还给了小张。整个操作无(尴)缝(尬)衔(至)接(极)哈哈哈。
小张内心OS:说好的凑个整,一把1块啥意思?
妹子内心OS:这人不会是个傻子吧,还给1块干啥?是我太美?
收银员妹子为啥这么纠结?对,因为她要计算余额。把小张的操作分开看可以是这样:
操作一:
小张一共给21元,先给20元,又给1元,
收银员计算:
20-16=4,小张买一瓶水应该找给小张4元。
4+1=5,小张刚刚又递过来1元,现在我有5元,这5元都是要给小张的。
收银员给小张5元。
操作二:
小张有2张钱,1个1块1个20块,买水拿20块就够了,所以1块钱不动,给20元。
收银员计算:
20-16=4
收银员给小张4元,小张手里还有刚刚的1元,共5元
小张手里都是5元,但是操作二收银员明显少算1步,对于数学不好的人来说这可是减轻一个大负担。你设想下,这只是极端的小例子,把这个放大,100个小张“要凑整钱”,1000个小张“要凑整钱”,收银员妹子脑子还够用么能不气么?(替妹子鄙视小张哈哈)
把这个问题放在比特币世界,要引出今天的话题,UTXO(Unspent Transaction Output),即未花费的交易输出。
把上面例子中小张的钱变成比特币,小张手里的5块就是未花费的交易输出,而小张买水的钱花出去了,就是花费的交易输出。
为什么举小张买水的例子呢?因为UTXO的计算方式很像操作二,只确认交易本身,以及比较反直觉。
只确认交易本身,举个例子:UTXO方式care的是小张给收银员多少钱,收银员收到了多少;不去管每一次找零小张钱包里还有多少,收银员抽屉里赚了几万。如果你想知道小张钱包还有多少钱咋办呢?你只需要计算在这个时间点之前,小张钱包进进出出的总数据,加加减减瞬间get小张的存量。
这样做有什么好处呢?
首先,计算上减轻了负荷。计算小意味着数据库轻便,比特币运行8年多,所有交易记录的数据可以拷贝在一台电脑上。同理,想想天猫想想京东,1天的交易记录需要成百上千台服务器支持,为什么呢,因为数据库太大。
其次,这种方式可以避免双重支付。这里对比用“余额”的数据库方式。
用余额需要实时更新每个用户的账户剩余数额。比如小张今天在商店买了8次东西,啤酒饮料瓜子花生矿泉水。系统在小张每一次买东西都会更新一次:钱包余额80个比特币,钱包余额25个比特币,钱包余额16个比特币……看似没有波澜,一番买卖之后,暗黑的小张上线了——
小张买了一个苹果,用比特币钱包支付1比特币,支付出去了但是矿工还没有确认。小张对收银员哈哈一笑,收银员妹子就被迷惑了,只看了账户有小张支付的币,便把红彤彤的苹果给了小张。注意,这里收银员妹子的账户上显示的是小张确实支付了1个币,只是没有矿工给他确认。我们前面讲过分叉的概念,这时候,小张就利用分叉的特性开始做坏事了。
小张出门即进入下一个商店,用刚刚的那个买苹果的比特币又买了1个梨,并且找矿工把这笔交易确认了。而且是利用算力呼哩哗啦找了6个矿工确认。
好了,现在收银员妹子懵逼了。刚刚看余额显示小张的币支付了,只是没确认,现在一看,纳尼?小张支付的币没有了!小张利用算力和分叉把1个比特币当作2个花,啧啧啧~
苹果已经被小张吃下肚,可小张的比特币给了隔壁超市老王。妹子气晕。
这就是双重支付问题。现实生活中,1笔款不可能实时到账,交易越多越容易出现确认延迟的情况。当矿工没有完成确认的时候,小张可以把这笔钱再次付给另一个商家,只要他的算力足够,让新的交易得到多个确认,并把写上这个交易的块变成最长链。
为了避免双重支付问题,现在一般要求收款方这么做:等到币到账,并且6个矿工确认,再发货。一旦6个矿工确认了,想要硬分叉改变刚刚的交易记录需要很大的算力,这时候作案成本太高,发生这种事情的概率就小。
再来说下反直觉。文章开头小张花了16元买水,小张有1个20元,1个1元,这时候系统会从小张的地址上扣20,而不是16。小张输出的是20,还有4块是未花费输出。这时候小张有2个未花费输出,1个4元,1个1元。
这个过程和我们平时花钱的习惯有点不同,但是也很好理解。你只要想到小张手里的比特币就像纸币,不能撕开,必须一次出一整个,这样就好明白一些。你虽然花出去了20,但是系统会给你找零,4块还会回到你的地址上。这里只是让大家对概念更加清晰,实际交易上并没有太多干扰。
OK,让我们再来回顾一下,UTXO是未花费的交易输出,它只对应着地址概念,并非我们熟悉的“账户和余额”。UTXO只确认交易本身,因此交易计算量小数据库也小,运行至今未曾有误。当然,UTXO也有着一些让人不适应的特点,每次的币不能拆开来花,不过不影响交易~好啦,这就是今天要讲的区块链知识,让我们共同进步!
PS,感谢小张亲身演绎~哈哈哈~
注:
反直觉这个概念是引用汤强老师的《李笑来的比特币账户并没有余额》,公众号:汤强(tangqiang0401),不知道为啥我觉得这个用“花钱找零”的类比解释来蛮好理解的哈哈哈~也许是我哪个地方理解还不够深刻,大家可以去看看他的文章,欢迎给我提出建议~