作者:倪云华
【题外话】有不少朋友问小蛆:比特币交易确实可以杜绝回滚交易,买家付了账之后就不存在把钱再拿回来的可能。卖家看到买家付了款,直接发货就可以了。他是一定可以收到这笔货款的。但是,如果卖方收了钱不发货,那买方的利益怎么保护呢?
其实,区块链虽然是一个去中心化为宗旨的技术,但是它并不是反对所有的第三方。如果一个第三方没有了信息垄断的能力,他就不会过度发展,成为一个中心机构。我们现在使用淘宝+支付宝就构成了这样一个中心机构。因为阿里拥有你的浏览记录、购买信息、支付记录、账户变动……等等所有的相关信息。假设,支付宝现在只有一个功能,那就是买家买了产品,付款给支付宝,支付宝收到买家签收货物的消息,把货款打给卖家。
在支付宝的眼睛里,只有一串加密的签名是买家,另一串加密的签名是卖家,至于买家买了什么,卖家是什么店,他们俩之间有多少恩怨纠葛支付宝都不知道。就算有高人hack掉了支付宝,他也什么也看不到。而且支付宝没有资源来掌握买家的消费习惯,也就不能定向地给买家发放各种各样的广告。这样的第三方,就不可能成为信息巨无霸。
OK,上次我们讲述了比特币区块链是怎样确定每一个节点在任何时刻加入网络都能获得唯一的一条信息链,都能获取自创世区块以来所有的交易记录。在了解区块链防止攻击、防止节点说谎的原理之前,我们要先弄懂“挖矿”是什么意思,有了今天的知识作基础,我们才能明白区块链“工作量证明”的真正含义,才能明白比特币是如何保障每一个节点是诚实守信的。
在解决这个问题之前,我们需要回想起来曾经提到过的“国王选驸马”的过程。当时我们把新区块的生成比喻成为国王出题,考驸马,哪个驸马先做出来了,就可以入主皇宫。大家可能听得一头雾水。结合着我们上一篇有关区块结构的内容,我们就可以把这个过程完整呈现出来了。
这里,我们复习一下区块头的结构:
区块头就是存放区块最重要信息的,有固定大小的空间。这里边有两个参数,一个是“难度”,另一个是“随机数nonce”。这二者有什么关联呢?
我们知道,hash函数可以让各种各样的输入统统转化为某一个统一长度的输出。而且输入稍微变动一个字节,那整个输出会大不一样。所以假设说这个nonce随机数取1的时候,和它取2的时候,整个区块虽然其他所有信息都没有变动,但是它的hash值已经发生了巨大的变化。
假设说我们命名当前区块是“block”当nonce=1的时候,“block1”的hash值可能是421fab00……等等一大堆16进制的数字。当nonce=2的时候,“block2”的hash值可能就是3fc58031efbac……等等。
也就是说,通过改变nonce的值,同一个内容的区块可以产生不同的hash值。如果我们规定,只有当某一个节点在全网范围内率先找到这样的一个nonce,使得这个区块的内容通过hash之后得到的值以0000开头,那这个节点就获得了这个区块的记账权,并且还可以在交易信息里加上一笔:该节点的资产加一,意味着它获得了1个比特币的奖励。
从0开始穷举Nonce以达到匹配目标要求(比如要求hash值以0000开头)的过程就是人们所说的“挖矿”。
另一个参数,就是所谓的难度。难度就是控制达到这个目标的难易程度。它是根据全网的计算能力确定的,当很多的电脑贡献了大量CPU来求解nonce的时候,它就需要制定一个很难的目标值(比如要求这个hash值以000000开头甚至更高)。相反,如果参与计算的节点不多,计算力有限,那目标hash值的计算就会简单一点。比如可能只需要达到以一个0开头即可。
控制难度的目的是什么?是保证不管有多少计算力参与挖矿,始终区块链以10分钟/新区块的速度向上生长。
好,这就是比特币的挖矿机制,至于比特币是通过怎样的设计使得所有的参与节点是诚实守信的,怎样防止比特币用户攻击比特币系统的,且听小蛆下回分解。
网友评论