员外有一天去串门,突然穿越到了 21 世纪,想着也回不去了,不如在这边做点生意,攒点钱再找一房。再一次交易的过程中,对方给了员外一张20万的支票,员外心想这么大的面额,不能被忽悠了,于是给银行打个电话确认了一下,在得到确认后,员外才放心把货物给了对方。在第二天员外需要用这笔钱的时候,才想起来要去银行提款,结果银行告知,对方账户已经没有存款。员外犹如被五雷轰顶,辛辛苦苦积攒的20万娶三房的钱,就这么打水漂了。。。
存在的问题
这个故事中,员外被 双重支付 了。就是人家一份钱,花了多次,总有一方被骗,没有收到款项。
双重支付:就是一份钱被花了两次。
在传统货币中,这样的情况是不会出现的,一块钱就是一块钱,你花钱的时候,总不能把钱从中间劈开来花吧。除非对方用的是假币,把你给骗过去了,如果数额巨大的话,你还可以报警追回。
但是在电子货币领域就不一样了,因为电子货币它没有实体,只是存在于账户中的一串数字,它不可能像真实的货币一样有复杂的防伪技术,不管使用多严密的算法机制,它都是一串二进制的数字。在电脑上,大家都知道,很多文件只要拥有权限,是可以随意更改、复制、粘贴的。所以在电子货币领域才会有双重支付的问题,因为同样一串二进制的数字,你能验证它是可用的,可是其他人也能啊,那么谁又能证明它没有被花过呢?
如何解决
其实,无论是中心化的系统,还是去中心化的系统,要想解决这个双重支付的问题,就需要对每一笔交易 建立共识。我们以比特币为例。
其实大家熟知的比特币的账本,就是解决这个问题的,因为它做到了真正的公开透明。
- 所有的交易公开且可查
历史交易是全网公开的,每个人都可以去查任何一笔交易。因为每一笔交易都是通过全网确认,且打包进区块的,一旦交易成功就无法更改数据。还可以通过历史交易记录来查看每个账户中的余额,因为账户中的余额是通过历史交易记录推算出来的,而不是实时显示的。
- 为每一笔交易添加时间戳
时间戳:一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。其实就是为一笔交易加上当前的时间。
为每一笔交易加上时间戳后,让这些交易都有了先后顺序,当前一笔交易被确认成功后,后一笔交易才能基于前一笔交易被确认,才能让每一笔交易有据可循,否则就乱套了。
- 如何确认交易
既然交易需要被确认,那么谁来做这个工作呢?所以比特币引入了工作量证明机制(POW),也就是矿工。矿工需要投入大量的算力来做这个事情,通过打包交易来对每一笔交易进行确认,然后全网公开,让每一个节点都听到,从此该区块内的所有交易都无法赖账。
整个比特币网络中的每一个节点都可获知每一笔交易的来龙去脉,因为它们是有先后关系的,所有只有当大部分节点都认同这笔交易是首次出现时,这笔交易才能发生。就像你明明做了一件好事,然后村里人都说不是你做的,最后大家一定相信大多数人。