比特币的各个节点的地位平等,每个节点都保存了一份相同的完整的总账记录。由于攻击者不可能同时攻击多数的比特币节点,这种分布式的存储方式可以确保总账记录不会被轻易更改,保证了交易信息的安全性。交易信息的验证、录入和确认由所有节点共同完成。总账记录由许许多多大小不等的区块组成,按照时间顺序记录所有的比特币交易,每个区块都会自动产生一个编号,并记录了上个区块的编号,从而形成了上下相连的区块的链条,称为区块链。
比特币的每个节点都有用数字表示的公钥和私钥。公钥是用来标识个人的身份代码,相当于现实生活中个人的姓名,是可以向整个网络公开的信息。私钥是个人的私有信息,相当于个人的指纹信息。公钥和私钥用于个人身份的确认和信息的验证。A用自己的私钥加密信息,广播给其他节点,其他节点可以用A的公钥来解密信息。如果其他节点能够用A的公钥解密信息,由于私钥是A的私有信息,则其他节点可以推断信息确实来源于A。
在比特币交易过程中,各个参与方主要有付款人、收款人和记账人。付款人和收款人是参与交易的当事人,付款人通常也是将交易信息广播出去的人。记账人是将经济交易记入新区块并加入总账记录的人,记账人也称为矿工。为了激励各个节点积极参与记账,每个将经济交易记入新区块的矿工都可以获得特定数量的比特币奖励。在两个节点之间发生经济交易之后,付款人节点将消息广播出去,其他矿工节点验证交易信息的真实性和正确性,并将验证合格的交易信息记入新区块,加在已有区块的后面。
比特币的总账记录按照时间顺序记录交易。记录比特币交易的过程实际上是交易函数的调用过程。交易函数的输入变量是付款人的账户地址和该账户地址的余额。输出变量是收款人的账户地址和收款金额、找零的账户地址和找零的金额。在矿工验证比特币交易记录的时候,需要追溯与付款人账户地址相关的所有交易,以确定付款人账户地址是否有足够的余额。
背景知识:矿工和挖矿
比特币的每个节点都可以参加记账权的竞争,竞争的获胜者可以获得比特币奖励,并产生新的记录比特币交易的区块。参与比特币记账权竞争并产生新区块的节点称为“矿工”。矿工节点通过求解数学难题参与记账权竞争的行为称为 “挖矿”。矿工在求解数学难题的时候,获胜的概率与计算算力呈正相关关系,但是存在一定的随机性。挖矿成功的概率服从伽玛分布,伽玛分布的概率与计算算力呈正比,类似于宝石的采矿行为。
挖矿过程就是大家求解数学题目的过程。如果矿工A最快求解出答案,会将结果在第一时间告诉其他人,其他人便会验证矿工A的结果是否正确。验证的过程比求解的过程要容易得多。在检验新区块的内容正确之后将新区块加在已有区块的后面并向其他人传播这个新区块,从而通过网络同步区块链。挖矿的过程就是去中心化的过程,每个矿工都有可能成为记账人,关键是计算算力的大小。挖矿过程调动了矿工参与新区块的产生、验证和传播的积极性,保护了比特币系统的安全,可以防止虚假交易,并在彼此之间建立信任。
在交易信息的记录过程中需要解决两个问题:一是如何验证交易信息的真实性和正确性;二是怎样确定谁才有最终的记账的权利,或者说谁产生的新区块才是有效的。为了验证交易信息的真实性和正确性,矿工先要验证信息来源是真实的,再确认付款人的余额足够偿付。为了验证信息来源的真实性,付款人先用自己的私钥加密交易信息并广播出去,矿工节点收到交易信息之后,可以用付款人的公钥来验证交易信息是否确实由付款人发出。为了验证交易信息的正确性,矿工要追溯付款人以往的所有交易记录,以确认付款人的余额大于付款金额。由于以往的比特币交易信息都记录在上下相连的区块链上,矿工可以检索所有的交易记录,计算得到付款人的交易余额。
为了确定哪个矿工才有记账的权利,比特币设计了较为复杂的数学问题,最早解出数学问题的矿工才可以获得记账权,将新产生的区块加在上个区块的后面,并获得相应的比特币奖励。数学问题的输入变量是本区块的交易信息、上个区块的编号和矿工自己任选的数字,数学问题的计算结果不可预料,只有满足特定要求的计算结果才会得到承认。为了获得满足特定要求的计算结果,矿工们需要不断尝试不同的任选数字,直到得到满足特定要求的计算结果。在最先解出数学问题之后,这个矿工会将新区块产生的消息广播出去,其他的矿工收到之后会停止数学计算,并对这个区块的计算结果进行验证。如果验证合格,则其他矿工将这个区块加入区块链末尾,更新本地保存的总账记录,并开始基于该区块的下一轮数学求解竞争。
尽管如此,还是会有两个矿工同时解出数学问题的情况。为了降低这种可能性,比特币对数学问题设定了较大的难度系数,使得解出数学问题的时间大约为10分钟。由于解出数学问题的时间服从期望值为10分钟的伽玛分布,这样可以大大降低两个矿工同时解出数学问题的概率。在两个矿工同时解出数学问题的极端情况下,上个区块的后面会同时出现两个新的不同区块,从而出现分叉。在这种情况下,比特币设定后面链条最长的区块为有效的区块。设A和B两个区块同时产生,最先接收到A区块产生的消息的矿工会在A区块的基础上继续工作,并在A区块的后面产生新的区块。最先接收到B区块产生的消息的矿工会在B区块的基础上继续工作,并在B的后面产生新的区块。假设在1小时之后,A区块的后面产生了6个前后相连的新区块,而在B区块的后面只产生了1个新区块,则其他的矿工会自觉选择在A区块的后面工作,B区块被抛弃。
背景知识:双花问题
双花是指持有人两次支付同一笔比特币的现象。在记录当前比特币交易时,比特币客户端会自动检查当前区块和以前区块的两笔比特币的来源是否相同,以避免同一笔比特币被支付两次。(www.xing528.com)
在比特币系统中,由于共识机制是工作量证明机制(Proof of Work,POW),为了实现双花,攻击者需要控制全网51%及以上的算力,即 “51%攻击”。如果攻击者控制了51%的算力,那么攻击者就可以通过故意制造区块链分叉来实现 “双花”。区块链分叉指的是攻击者不承认最近的某个交易A,在包含A交易的新区块产生的时候,攻击者求出另一个不包含A交易的新区块,所以会在上个区块的后面形成两个新区块,从而出现分叉。由于攻击者拥有51%的算力,攻击者可以产生大多数新区块,因此,不包含A交易的区块链会成为最长的链条,其他矿工会自动选择跟随这个链条,并进行下一步的挖矿,而原本含有A交易的区块便会成为无效区块而被遗弃。然后,攻击者在不包含A交易的区块链上重新生成一个与A交易的金额相同的交易,这个过程便实现了双花。为了避免双花问题,比特币的收款人需要在交易被确认六次之后才可以交付实物。因为交易被确认六次之后,攻击者就很难对该笔交易进行篡改了。
为了保证交易信息不被篡改,比特币要求每个有效区块都会通过数学计算自动生成区块编号。数学计算的输入变量是本区块的交易信息、上个区块的编号和矿工自己任选的数字,数学计算的结果作为本区块的编号,而这个过程需要消耗大量算力。由于本区块的交易信息和上个区块的编号是确定的,矿工只能尝试不同的任选数字,直到得到满足特定要求的计算结果,并将计算结果作为本区块的编号。攻击者为了修改某个区块的交易信息,就必须相应的调整随机数,并得到另外一个符合特定要求的计算结果,否则这个被修改过的区块会被其他节点立刻检验出是无效的。由于下个区块的编号取决于这个区块的编号,攻击者还要相应地修改下个区块及其后续区块的编号。因此,一个区块后面的链条越长,这个区块被修改的工作量越大,这个区块被修改的概率越低。因此,每个新区块的产生也是对旧区块的交易信息的一次确认,通常认为在经过六次确认之后,区块的交易信息已经是不可逆的。
其次,为了防止交易信息被篡改,比特币为每个区块的交易信息设置了额外的编号,称为梅克尔(Merkle)编号。梅克尔编号具有二叉树的结构特征,二叉树的最下层是交易信息,每两个交易信息可以计算得到一个上一层的编号,每两个下一层的编号可以计算得到一个上一层的编号,从下至上依次类推,直到最后剩下一个编号。这个最后剩下的编号称为梅克尔编号。梅克尔编号可以用来验证信息是否被篡改,当底层的交易信息发生任何细微变动的时候,梅克尔编号就会发生显著变动。
比特币系统向最先成功生成新区块的矿工提供比特币奖励,并通过这种方法发行新的比特币,奖励额度大约每四年减半。在2009年,每个产生有效新区块的矿工可以获得50个比特币的奖励,从2012年开始减少为25个比特币,2016年减少为12.5个比特币。当未来比特币的发行总量达到2 100万的时候,比特币系统将不提供任何奖励,矿工主要通过付款人支付小费的方式获得补偿,小费的金额等于付款人的付款金额减去收款人的收款金额。
为了将新区块的产生时间控制为10分钟,比特币每隔2016个区块调整一次数学问题的难度系数。当以往的2016个区块的产生速度较快的时候,提高数学问题的难度系数,否则降低数学问题的难度系数。比特币的每个区块的大小为1MB,大约记载4 000笔比特币交易,因此,考虑每10分钟产生一个新区块,比特币的交易速度的大约为每秒7笔。
总之,比特币在毫不相识的人之间建立分布式的密码协议,整个网络共同维护可靠的总账记录,成功地实现了去中心化的价值转移。比特币协议以每个节点保存每笔交易信息的存储方式保证总账记录的安全性,同时,应用记账权竞争机制解决拜占庭将军问题。这种方法显得比较简单和笨拙,但是也被证明是有效的和安全的。
背景知识:比特币中的拜占庭将军问题
拜占庭将军问题首先由莱斯利·兰伯特在1982年提出。核心描述是军中可能有叛徒,却要保证进攻一致,决策正确的问题。关于拜占庭将军问题,一个简易的非正式描述如下:拜占庭帝国想要进攻一个强大的敌人,为此派出了十支军队去剿灭这个敌人。这十支军队分散驻扎在这个敌人的周围,敌人的力量足以抵御五支拜占庭军队的同时袭击。也就是说任何一支军队单独进攻都毫无胜算,除非有至少六支军队同时袭击才能攻下敌国。他们依靠通信兵相互通信来协商进攻意向和进攻时间。这里有个问题就是,将军们不确定队友中是否有叛徒,叛徒可能擅自改变进攻意向和进攻时间。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让各支军队能够远程协商,从而赢取战斗?这就是著名的拜占庭将军问题。
在比特币系统出现之前,共识问题在去中心化的情况下是很难被完美解决的。比特币系统通过工作量证明机制达成共识,巧妙地解决了这个问题。每个矿工节点都计算相同的数学题目并产生新区块。比特币系统会根据各个节点的算力自动调整数学题目的难度,从而控制新区块的产生速度。在记入新区块之前,每笔比特币交易都由付款人的私钥签名。其他节点通过付款人的公钥来验证该交易消息是否确实来源于付款人。在通过验证之后,该节点会保存该笔比特币交易记录,并向其他节点继续广播该笔交易消息。下个节点收到这个消息之后也会验证消息来源,并在验证之后保存该笔记录,再向其他节点广播该笔交易消息,依次类推直到整个网络都保存了该笔比特币交易。比特币通过这种机制在各个节点之间达成共识,确保每个节点都保存了相同的交易记录。
比特币通过控制消息广播的速度、公私钥加密解密和同步交易记录在多个不信任的节点之间达成共识,这也为拜占庭将军问题的解决提供了思路。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。