读书笔记:比特币原理

Published

白板记账 #

青红皂白四个人住在一起,她们使用一块白板记账。为了确保不会有人随意添加虚假记录,她们要求付款人需要在每条记账记录后签名表示认可。

白板记账

电子记账 #

随着转账记录越来越多,白板写不下了。于是她们转而使用电子记账软件。但计算机上不能简单使用签名系统。因为计算机上的签名可以复制黏贴,很容易伪造。于是她们想到了一个办法,就是使用数字签名。每个数字签名只能对应一条转账记录。每条转账记录都有唯一的一个数字签名。这样数字签名就无法被简单复制黏贴到伪造记录上了。如果原先的转账记录发生任何变化,原来的数字签名就失效了,需要重新根据新的转账记录生成数字签名。

电子记账

这个数字签名需要使用哈希算法生成。目前常用的哈希算法有SHA-256,SHA-384,SHA-512等。这些哈希算法的特点是,输入数据的任何微小变化都会导致输出数据的巨大变化。而且这些变化毫无规律可循。

以SHA-256为例,这个哈希算法接受一条转账记录,并输出一串长度为256的二进制串。

SHA-256

利用SHA-256制作了数字签名后,电子账本就变成了以下样子。

电子记账2

但是这样的数字签名还不够。因为SHA-256算法是公开的,任何人都可以根据一条转账记录生成对应的SHA-256数字签名。我们还需要能确认某个数字签名是转账人的签名,而不是任意其他人的签名。这里就要用到非对称加密法对SHA-256数字签名进行加密。

非对称加密

这里简单介绍相关的加密和解密概念。加密的过程就是将原始记录和一个加密密钥进行运算,得到加密后的记录。解密的过程就是将加密后的记录和一个解密密钥进行运算,得到原始记录。如果加密密钥和解密密钥是同一个,那么这种加密就称为对称加密法。如果加密密钥和解密密钥是不同的,那么这种加密就称为非对称加密法。非对称加密中,可以通过私钥计算出公钥,但无法从公钥计算出私钥。

对称和非对称加密

有了以上工具,就可以完善电子账本了。具体做法是:对于一条转账记录,首先使用SHA-256对原始记录运算,得到原始记录的哈希值。小红再用自己的私钥对这个哈希值加密,就得到小红的电子签名。如果小白得到了这条转账记录和电子签名,小白可以使用小红的公钥对电子签名进行解密,得到原始记录的哈希值。并且小白可以对原始记录做SHA-256运算,得到原始记录的哈希值。如果两个哈希值一致,就说明:

电子记账3

比特币对等网络工作原理 #

在上述例子的电子记账系统的基础上做一些改动,就可以实现一个类似比特币的对等网络。

首先记账系统中的货币单位都变成BTC,既比特币。

其次,这些转账记录不是月底转账或未来转账,而是立刻转账。

第三个改进是在一条转账记录生成时,需要有一种方式能够确认付款方有足够的比特币进行支付。在中心化的网络中,这个确认方式是通过银行的账户余额进行确认。银行作为网络中心,可以很方便地查询到转账人的账户余额,进而很方便地确认这笔转账是否可行。解决方法就是把当前这条转账信息和之前所有的转账信息打包在一起,生成当前这条转账信息。这样一来,当前这条转账信息里就包含了历史所有转账记录,就可以校验出付款方是否有足够的BTC进行支付。这里一个细节是如果接受的BTC总额大于需要支付的BTC总额,那么记录中会增加一条自己支付给自己的记录,这样就能保证接受的BTC总额和支出的BTC总额是相等的。

电子记账4

第四个改进就是对于比特币网络中的每个实体(例子中的青红皂白),不再使用实体名字而是使用每个实体对应的账号。每个实体在比特币网络中都有一个唯一的账号。这个账号是由实体的公钥输入某个函数计算得到的一个34位的字符串。

第五个改进是现在这些转账记录不能只存在一台电脑上了。这些记录需要同时存在网络中多台电脑中。这个电子账本是所有未来转账的基础,如果只存在一台电脑上,万一这台电脑出现问题,整个账本就丢失了。这个账本不但不能存在单一电脑中,而且也不能由某个人或某个组织管理。比特币网络的解决方法就是这个帐本会由比特币网络中所有运行比特币客户端的电脑共同保存。但如果一份数据由多个电脑共同存放,那么会引起三个一致性问题:

区块链技术 #

比特币通过区块链解决这三个一致性问题。区块链就是一个一个区块链接起来形成的一条链条结构。每个区块中包含了一定数量的转账记录。整个比特币网络仅维护一个区块链。只有当新的区块被保存至区块链上时,这个区块才算是得到了网络的确认。新的区块是由网络上的矿工制作的。一个矿工接收到一批转账记录时,会逐一检查每条记录的合法性。当这些转账记录都确认合法后,矿工就会把这批转账记录添加至自己正在制作的新区快中,并最后将这个新区块广播发送至比特币网络。网络上的计算机接收到这个新区快后检查这个区块是否符合要求,如果符合要求,就将这个新区快保存至自己维护的区块链的末尾。

这里的问题是,网络上存在很多矿工,这些矿工都在同时制作新区快。虽然他们手头的新区快中或多或少都包含大致相同的近期新产生的转账记录,但这些区块还是会有一些差异,每个区块可能包含不同的转账记录。这些新区块各不相同,而比特币网络又维护一个区块链,也就是说每个计算机都只能将同一个新区快添加至自己的区块链末尾。那么如何确定哪个新区块可以被添加至区块链末尾呢?比特币网络的方案是采用一个巧妙的方法限制单位时间内生成的新区快的数量。如果特定时间内只有一个新区块可以产生,那就不存在分歧了。

这个巧妙的方法就是,当矿工检查好所有新近的转账记录,并打包到一个新区快后,还需要完成一个额外的工作,只有完成这个额外工作后才能把生成的区块发布到网络上。这个额外工作,整个比特币网络一般只有一个矿工能在10分钟左右时间成功完成一次。这样每隔10分钟,整个网络上只有一个矿工能发布一个新区快。

这个额外工作分为两步:
第一步:将新制作的区块所包含的内容(前一个区块的SHA-256函数值+这个新区快的基本信息+这个新区快所包含的所有交易记录)组合成一个字符串。这里提一下,前一个区块的SHA-256函数值是指前一个区块中的所有内容输入SHA-256函数计算得到的函数值。每一个区块和它自己的SHA-256函数值一一对应。区块的SHA-256函数值就代表着这个区块。每个区块都包含前一个区块的SHA-256函数值。这样就能确定每个区块在区块链中的位置。
第二步:找一个随机数,添加到第一步中得到的字符串的末尾,组成一个新的字符串。这个新字符串的SHA-256函数值必须满足前72位全是0。只有找到这样一个随机数,才算是完成了第二步额外工作。要找到这个随机数的难度非常高,以至于整个网络中每十分钟只有一个矿工能成功完成一次。为什么找到这个随机数的难度非常高呢?这是因为SHA-256函数的特性就是输出结果完全是随机的,因此只能通过不断尝试才能找到这个随机数。因为输出结果中每个位置是0的概率都是1/2,因此前72位都是0的概率是1/2的72次方。也就是说平均需要尝试2的72次方才能找到这样一个随机数。

额外工作

当一个矿工完成了额外工作,马上把这个随机数和这个新区块一起发布到网络中。网络上的节点收到这个信息后,将新区块中的所有内容,既(前一个区块的SHA-256函数值+这个新区快的基本信息+这个新区块所包含的所有交易记录+找到的随机数)组成一个新字符串,并将这个新区块输入SHA-256函数,如果计算结果的前72位都是0,就说明这个新区块是合法的。然后再检查这个新区块内的数据是否符合要求,这个新区块内的转账记录是否符合要求。如果都符合要求,则将这个新区块添加到自己维护的区块链中。

矿工寻找这个随机数的过程,就是挖矿。矿工不惜耗费巨大的计算资源找到这个随机数,努力将自己制作的新区块添加到区块链中的原因是,如果成功将自己的区块添加到区块链中,则矿工可以获得大约12.5个比特币(2017年)的奖励,并且这个区块中所有转账交易的交易费,大约2个比特币(2017年)都归这个矿工所有。因此,每次成功上链,矿工可以获得约14.5个比特币,按照2017年的行情,大约26万美金,按照2025年的行情则大约140万美金。

如果大家都投入到挖矿中,不断强化自己的计算机配置,则挖矿的速度会不断增加。比特币网络为了维持平均每10分钟生成一个区块的速度,每两周会调整一次工作难度,比如从要求前72位全是0调整到要求前73位全是0。

虽然说这个精妙的工作量设计会大大降低多个新区快同时产生的概率,但总还是会发生多个新区快同时产生的情况。如何处理这种情况呢?解决办法就是,如果网络中的节点真的同时收到了两个合法的新区快,在没办法确认网络最终会采用哪个新区快的情况下,这个节点会把两个新区快同时添加到自己的区块链末尾,这时这条区块链就产生了分叉。在下一个十分钟内,一般不会再次接收到多个新区快,这时如果新的区块是在绿色区块后面,则新区快被添加到绿色区块后,绿色区块就成为了新的主链,紫色区块则被抛弃。如果连续接收到多个新区快,则不断分叉,但最终只会有一条支链不断增长,这条最长的支链就变成主链,而其他支链就被抛弃。

分叉

区块链的基本知识介绍完了。各位可以利用新学到知识思考一下区块链如何解决之前提到的三个一致性问题。答案可以在视频末尾找到。

最后是比特币使用的技术和特点:

技术总结