换回比特币系统,也就是部分电脑可能处于关机或者未联网状态,会错过部分交易。
此外,还可能会有黑客入侵部分电脑,篡改交易记录。
此外,还有一个更严重的问题就是,实际网络拓扑非常复杂,链路质量的随机性很大。
因此,如果用户a(假设账户里有10btc)连续广播两条相互矛盾的消息,比如:
交易信息1:用户a支付10btc给b。
交易信息2:用户a支付10btc给c。
有的读者应该会觉得,那我们就采信先收到的交易信息1,忽略与之矛盾的脚印信息2不就行了。
但问题是,因为网络链路的复杂性,所以很可能存在部分用户先收到交易信息1,又有部分用户先收到交易信息2。如果依靠先后顺序辨别有效性,那么就会存在不同用户记录的交易信息不一致。
所以为了解决这个问题,中本聪才提出了区块链的概念。
每个用户如果愿意,都可以整理自己从网络中接收到的交易信息,然后检查其是否合理,也就是每笔交易是否由足够余,然后数字签名是否正确后,再将交易记录打包成一个区块。
因此每个交易记录都是以区块的形式存储,然后再广播到系统中的其他用户中。
而区块之间相互连接,形成一条由系统内全体用户共同维护的区块链。
因此其他用户收到广播的区块时,就会把这个区块加到自己维护的账本,也就是区块链的尾部。
但如果只是这样,并没有解决任何问题。互联网节点遍布全球,广播过程也需要时间,因此肯定会存在不同节点收到不同区块存储的问题。
所以如此一来这个网络就乱套了。
而为了降低传播时间的影响,一个简单粗暴的方式就是从系统设计中就限制区块生成的速度。
所以比特币系统的核心思想采就是用算力限制区块的生成速度。
比特币系统要求,每个用户在发布新区块前,必须先完成一个任务。
这个任务就是根据前一区块的一些信息加上新区快的一些信息,生成一个字符串s,选择一个字符串b,与s合并成“bc”,且要求“bc”的哈希映射满足某个条件,比如映射结果的前72位为0。
所以上面的第二步,除了一个个试以外是没有捷径的,而且结果是否满足要求可以快速试出。
举个例子就相当于给你一个银行卡,让你挨个试密码。
那你没有任何办法,只能000000到999999挨个试验,最后虽然能试出来,但也会花费大量时间。
而且你把试出来的结果告诉别人后,别人可以很快验证你的结果是否正确。
但是时间恰好是我们宇宙中最稀缺的资源。
因此可以调节这个难度,比如使得系统中所有平均每二十分钟才会有一台设备完成要求的任务,猜出符合要求的字符串b。
如此一来,撞车的概率就会大大降低。补充一句,这个难度是不断调节的,以适应硬件算力的提升。
虽然概率大大降低,但仍然无法排除存在撞车的概率。因此,区块链验证中最核心的思想就是——相信最长的区块链。
也就是在原有的到区块链n的情况后,短时间内出现了两个不同的区块,这个时候,我们需要做的只有一件事情,那就是等待。
因为同时产生区块的小概率事件,总不可能连续发生。
所以如果有人想对区块链造假,那么他就需要一直抢先生成假的新区块,并广播出去。
这就要求造假者生产新区块的速度,要快于系统中的其他所有用户的生成能力之和。
换句话说,造假者需要用户有和其他用户算力之和匹敌的算力。