确认账簿当某挖矿小组幸运的生成了一张有意义的账簿,为了得到奖励,必须立刻请其它小组确认自己的工作。前面说过,当前村里有7个挖矿组,所以这个小组必须将有效账簿纸誊抄6份快马加鞭送到其他6个小组请求确认。
中本聪规定,当某个小组接到其他小组送来的账簿纸时,必须立即停下手里的挖矿工作进行账簿确认。
需要确认的信息有三个:
首先看第一个,这个确认比较简单。只要将送来的账簿纸放入编码生成器进行验证,如果验证通过,则编号有效。
第二部分需要将账簿页上的“上一页账簿纸编号”和这个小组目前保存的有效账簿最后一页编号比对,如果相同则确认,如果不同,需要顺着已有账簿向前比对,直到找到这个编号的页。如果没有找到指定的“上一页账簿纸编号”对应的页,这个小组会将此页丢掉。不予确认。
注意,由上面的机制可以保证,如果各个小组手里的账簿纸是相同的,那么他们都能按同样的顺序装订成相同的账簿。因为后面一张纸的编号总是依赖前面的纸的编号,编码生成器的机制保证了所有合法账簿纸的相对先后顺序在每个小组那里都是相同的(可能会有分支,但不会出现环,后面细讲)。
最后是如何确认交易清单有效,其实也就是要确认当前每笔交易的付款人有足够的余额支付这笔钱。由于交易信息里包含这笔钱是如何来的,还包含了记录来源交易的账单编号。例如,HIJKLMN要给ABCDEFG10个比特币,并注明了这10个比特币来自之前OPQRST支付给HIJKLMN的一笔交易,确认时首先要确认之前这笔交易是否存在,同时还要检查HIJKLMN在这之前没有将这10个比特币支付给别人。这一切确认后,这笔交易有效性就被确认了。
其中第一笔是系统奖励给生成这页账簿的小组的50个,这笔交易大家都默认承认,后面的只要按照上述方法追溯,就可以确认HIJKLMN是否当前真有10个比特币支付给ABCDEFG。
如果完成了所有了上述验证并全部通过,这个小组就认可了上述账簿纸有效,然后将这张账簿纸并入小组的主账簿,舍弃目前正在进行的工作,后面的挖矿工作会基于这本更新后的主账本进行。
账簿确认反馈对于挖矿小组来说,当账簿纸送出去后,如果后面有收到其他小组送来的账簿纸,其“上一页账簿纸编号”为自己之前送出去的账簿纸,那么就表示他们的工作成功被其他小组认可了,因为已经有小组基于他们的账簿纸继续工作了。此时,可以粗略的说可以认为已经得到了50个比特币。
另外,任何一个小组当新生成有效账簿纸或确认了别的小组的账簿纸时,就将最新被这个小组承认的交易写到公告牌上,那么收款人只要发现相关交易被各个小组认可了,基本就可以认为这笔钱已经到了自己的账上,后面他就可以在付款时将钱的来源指向这笔交易了。
以上就是整个比特币的支付体系。下面我们来分析一下,这个体系为什么可以工作下去,以及这个体系可能面临的风险。
工作机制分析虽然上面阐述了比特币的基本运作规则,但是村民们还是有不少疑问。所以中本聪同学专门开了个答疑会,解答常见问题。下面总结一下村民最集中关心的问题。
核心问题答疑如果同时收到两份合法的账簿页怎么办?注意在上面的运行机制中,各个挖矿小组是并行工作的,因此完全可能出现这样的情况:某小组收到两份不一样的账簿页,它们都基于当前这个小组的主账簿的最后一页,并且内容也都完全合法,怎么办?
关于这个问题,中本聪同学说,小组不应该以线性方式组织账簿,而应该以树状组织账簿,任何时刻,都以当前最长分支作为主账簿,但是保留其它分支。举个例子,某小组同时收到A、B两份账簿页,经核算都是合法的,此时小组应该将两页以分叉的形式组织起来,如下图所示:
黑色表示当前账簿主干。此时,可以随便选择一个页作为当前主分支,例如选择A:
此时如果有一个新的账簿页是基于A的,那么这个主干就延续下去:
如果这个主干一直这么延续下去,表示大家基本都以A为主干,B就会被遗忘。但是也有可能忽然B变成更长了:
那么我们就需要将B分支作为当前主干,基于这个分支进行后续工作。
从局部来看,虽然在某一时刻各个小组的账簿主干可能存在不一致,但大方向是一致的,那些偶尔由于不同步产生的小分支,会很快被淹没在历史中。
如果挖矿小组有人伪造账簿怎么办关于这个问题,中本聪同学说,只要挖矿组织中大多数人是诚实的,这个系统就可靠,具体分几个方面给予答复。
首先,基于保密印章机制,没有人能伪造他人身份进行付款,因为编码生成器在打印编码时会核对所有交易单的保密印章,印章和付款人不一致会拒绝打印。
而且诚实的矿工也不会承认不合法的交易(如某笔交易付款方余额不够)。
所以只有一种可能的攻击行为,即在收款人确认收款后,从另一条分支上建立另外的交易单,取消之前的付款,而将同一笔钱再次付款给另一个人(即所谓的double-spending问题)。下面同样用一个例子说明这个问题。
先假设有一个攻击者拥有10个比特币,他准备将这笔钱同时支付给两名受害者A和B,并都得到承认。
第一步,攻击者准备从受害者A手里买10比特币的黄金,他签署交易单给受害者A,转10个比特币给受害者A。
第二步,这笔交易在最新的账簿页中被确认,并被各个挖矿小组公告出来。受害人A看到公告,确认比特币到账,给了攻击者10个比特币等值的黄金。
第三步,攻击者找到账簿,从包含刚才交易的账簿页的前一页做出一个分支,生成更多的账单页,超过刚才的分支。由于此时刚才攻击者制造的分支变成了主干分支,而包含受害者A得到钱的分支变成了旁支,因此挖矿组织不再承认刚才的转账,受害者A得到的10比特币被取消了。
第四步,攻击者可以再次签署交易单,将同一笔钱支付给受害者B。受害者B确认钱到账后,支付给攻击者等值黄金。
至此,攻击者将10个比特币花了两次,从两名受害者那里各购得等值黄金。攻击者还可以如法炮制,取消与受害者B的转账,将同一笔钱再支付给其他人……