区块链原本是一种基于互联网的传输,信息编码,加解密,验证技术。比特币则是区块链理论的一个具体应用。
理解去中心化
去中心化顾名思义,是中心化的一个对立面。一个很常见的例子是,早期我们下载电影,是在一些知名的电影下载网站下载,电影下载网站有一些服务器用于存储电影文件,提供给用户进行下载,电影文件集中存储中固定的服务器上,这就是典型的中心化。
后来,一种去中心化的模式出现了,这就是BT下载,也被称之为P2P(peer to peer)点对点下载。P2P下载的原理和电影网站完全不同,简单来说,电影并不是完整的存储在一个网站服务器上,而是以一个一个小片段的方式存储在各个不同用户的电脑中,下载时你的电脑P2P客户端会从不同其他用户的电脑中下载片段,再拼接成一部完整的电影。电影以片段的方式存储在众多用户的电脑端,没有一个独家的中心节点存储,这就是去中心化。
理解比特币
比特币是去中心化理念的一种实现方式。它的核心规则有两条:
比特币的发行不是由某个固定机构说了算(与之相对的概念就是现在的银行),而是只要安装了BTC客户端的软件都可以生产出BTC。简单来说,BTC公开了一套算法,只要算出符合其算法条件的数字,就可以获得BTC的奖励。这样的根据算法计算结果的过程,就是我们常说的“挖矿”。
BTC的交易记录不是像银行那样记录在单一的固定服务器上,而是所有参与BTC“挖矿”的节点,都会记录,可以理解成每台计算机都记录着从BTC诞生开始到现在完整的全部交易记录,因此不存在篡改的可能性。
从以上的规则中可以看出,BTC是完全去中心化理念的一种实现。但这种技术实现也暴露出两个明显的问题:
- BTC的客户端软件由于需要记录全部的历史交易记录,因此需要巨大的存储空间。
- 为了防止有人恶意生成虚假的转账记录,BTC有一套很复杂的流程来确保交易记录是真实的。这个确认过程可能长达数个小时甚至几天。
实际上,区块链解决的核心问题是信任问题。所有的金融机构,银行、保险、券商等等,让它们赖以生存的根本是信用,我们之所以会放心地买股票、买期货、买纸黄金,都是因为我们信任充当交易中介的机构,而这些交易中介,就是金融活动的中心,我们宁愿为此付出一定的手续费、交易费,金融机构也因此挣得盆满钵满。
比特币的基本原理
当我们收到一条交易记录时,例如“A给B转了5元钱”,我们需要解决两个问题:
- 如何确保这条消息的完整性
- 如何确保这条消息的真实性
对于第一个问题,BTC采用数字指纹的方式解决。BTC规定,任何发出信息的一方,必须同时发出原始信息的指纹(SHA-256计算得出)。那么收到信息的一方只需要用公开的SHA-256算法把原始信息也生成一个指纹,和收到的指纹比对一下,如果一致,就说明收到的信息是完整的;如果不一致,说明收到的原始信息由于某种原因被修改过了,这个原因可能是数据传输过程中的错误,也可能是被人篡改了等等。
但因为SHA算法是公开的,如果有一个黑客拦截了原始信息和指纹,他把原始信息修改掉,比如把“A支付5元钱给B”改为“A支付5元钱给C”,同时生成新的指纹发送给你。这该怎么办呢?这就是我们要解决的第二个问题:如何确保信息的真实性?解决这个问题,等于也解决了信息发送方想抵赖的问题。
解决第二个问题的关键就是给指纹加密。BTC采用非对称加密的方式解决这个问题。它的流程如下:
- 假设需要记账的原始交易信息:A支付5元钱给B(以下简称“原文”)。
- 发送方首先计算出原文的数字指纹,然后使用自己的私钥对数字指纹进行加密,得到一个密文。
- 发送者将原文,密文和公钥传播到比特币网络中,至此,信息发送步骤结束。
- BTC其他节点接收到此信息后,使用公钥将密文解密,再将解密后的信息和原文的SHA256指纹进行比对,如果相同,则认为信息真实,添加到自己的账本中。
一个BTC钱包本质上就是一个公私钥对,首先生成一个私钥(类似于银行卡密码),然后由私钥生成一个公钥,再根据公钥压缩生成一个钱包地址(类似于银行卡号)。转账时,通过私钥进行签名,然后在账单附上公钥,记账节点通过公钥核对签名和指纹,确保信息的正确性。
在比特币网络中,私钥是动用账号中比特币的唯一凭证,如果你的私钥被盗,你就永远失去了它,打官司也要不回来,因为没有任何方式可以证明他的私钥是从你这里偷走的。
比特币的深入理解
至此,我们去中心化账本的理想已经实现了一半,还需要解决两个问题:
- 账本同步问题。不同电脑上的记录不同步,到底以谁的电脑记录为准呢?
- 如何防止同一个比特币被重复使用?如果一个黑客,只有一枚BTC,但在极短的时间内,散播两条信息,一条是支付给A,另一条是支付给B。此时如果有的节点先收到信息A,有的节点先收到信息B,以哪一条为准呢?
中本聪的总体思路是这样的:比特币网络中的所有电脑都只认可唯一的一个账本,任何一台电脑在接入比特币网络时,首先要同步这个唯一的账本,任何一台电脑想要往这个账本上写入新的信息,必须完成一套繁琐的“手续”,这套手续复杂到几乎不太可能被同时完成两次,即便真的发生了巧合,被同时完成了两次甚至多次,也有一个规则可以判定哪条信息是合法的,哪条信息该被抛弃。
为什么要交区块链呢,这是因为账本被设计成一个由“信息包”组成的长链,而这样的的一个信息包,就被称为一个区块。每个区块都有一个唯一的自然数编号,1,2,3,4......递增下去。编号被称为height,不允许跳跃,也不允许中断和重复。
第一个区块是由中本聪创建的,之后开始,每一个区块都必须严格遵守比特币系统的规则来创建,一个区块至少包含以下信息:
- 前一个区块的数字指纹 + 固定信息 + 收到的交易记录 + 一个随机数
区块链的奥妙之处就在于这个随机数。中本聪规定:这个新区块的数字指纹(一个256位的二进制数)的前72位必须全部为0。因此,挖矿的本质就是在获得新区块的记账权,即这个随机数的计算。
回忆一下我们前面介绍过的数字指纹的知识。因为SHA算出来的指纹是毫无规律可循的一组数字,所以,想要满足中本聪的这个变态规定,唯一的办法就只能凭运气凑奥数,从0开始不断地去尝试,直到满足要求为止。
一旦成功的计算出这么一个随机数,就获得了一次记账权力,可以给账本上新增加一个区块。那么,为什么要花时间找奥数,去给账本记账呢?因为好处实在太大了。
比特币系统规定,每成功增加一个区块,这台记账的电脑(实际上是某个账号)就能获得12.5个比特币的奖励(截止到本文写作时的奖金额),以及这个区块中所有交易的手续费,总额取决于交易频繁程度(平均约2比特币)。
正因为奥数太难找,每个区块平均要10分钟才能生成一个,所以就能基本解决本节开头提出的第一个问题“如何同步账本”,只要有个三四分钟的时间,足以让所有在线的电脑同步到这个区块了,那些不在线的电脑或者第一次运行客户端的电脑,上线以后必须先做一件事情,就是从相邻的节点上获取最新的账本。
请注意,我用了“基本解决”这个词,也就意味着,并没有完全解决“账本同步”的问题。这是因为总会有极小的概率两台矿机恰好同时找到奥数,也就意味着同时抢到了记账权。因为矿机实在太多了,这样的小概率事件时不时也会发生一次,同时抢到记账权的矿机都能将自己生成的新区块广播到比特币网络中。
在这种情况下,相当于网络上的其他节点收到了两个合法的新区块,因为网络节点的地域分布不同,所以,不同的节点收到这两个新区块的先后次序就会不同。此时,所有的节点会暂时保留两个新区块,并且把区块链做一个临时的分叉。
接下来,比特币网络中必然又会有其中一个节点(矿机)抢到了记账权,这时该节点就会将生成的最新区块接到其中的一个分支上,那到底是接到新区块1,还是新区块2上呢?系统规则是:这个节点先收到哪个区块,就接到哪个区块上,同时放弃另一个区块,然后全网广播。
比特币网络上的所有节点在收到最新的区块链后,只要发现其中一个分支比另外一个分支多两个区块了,就立即也放弃那个短的分支。总之,比特币网络永远只承认更长的那条分支。
因为有了这个临时分叉的规则,所以,比特币玩家在完成一笔交易后,不能立即认为这笔交易是成功的,有可能会被取消,必须等到一定数量的新区块生成后,如果交易依然没有被取消,这才能放心地认为交易成功了。那到底要等到多少个新区块产生才能放心呢?
按照概率来说的话,小额交易有三个新区块产生就够了,但是大额交易的话,为了更保险,一般认为等到六个新区块产生,就足以放心了。前面说过,每个区块产生的平均时间是10分钟,也就意味着,一笔大额交易需要一个小时左右才能确认交易成功。
中本聪当初设计比特币系统时,规定了每一个区块最大只能是1MB,一条交易记录大概是0.25KB,那么一个区块最多可以储存4000多条交易记录,如果在一个新区块产生的时段中,发生的交易请求超过4000条,那就肯定存不下了。
我们可以算算,这个量大概是一个怎样的交易频率,每个区块的平均产生时间是10分钟,也就意味着,平均每秒钟的交易量如果超过7条,那么就一定会出现排队等待打包的交易记录了。这个交易频率实在很低,要知道支付宝一秒钟大约要处理上万笔交易。这一秒钟七笔交易对于全球来说,实在是太不够用了。
一般来说,大额交易优先打包,小额交易中手续费越高的交易越优先打包,打包规则矿工有一定的自主权。比特币交易手续费的规则比较复杂,不同的矿工收的还不一样,不是三言两语能说清,但有一点可能会让你感到诧异,越是大额的交易反而收费越低,甚至免费。交易额越小反而费率越高。这是因为,交易手续费除了鼓励矿工挖矿,还有一个非常重要的功能,就是防止有人恶意发布大量的小额交易造成信息拥堵。
现在,比特币交易滞留是非常普遍的现象,很多小额交易甚至等上好几天都确认不了,因此,很多人不惜附加很高的交易手续费来让矿工提前替他们打包。
其他问题
比特币的产出速度本质上就是寻找奥数的速度,现在的奥数是要求前72位全部为零,如果把72改为73,那么寻找奥数的难度就立即翻一倍,同理,如果从72减为71,则难度减半。因此,系统只需要根据全网的平均算力来调节奥数的规则就可以很简单地做到。现在的规则是平均每产生2016个新区块后,根据产生这些新区块的平均算力调节一次难度。我们也注意到,这种调节较为粗糙,只能翻倍或者减半。
为何比特币总量上限是2100万枚?
这个总量上限是人为规定的。中本聪设计的规则是这样:每增加21万个区块后,币奖励就减半,奖励的初始值是50比特币,所以北京时间2009年1月4日中本聪自己创建的第一个创世区块,就奖励给了自己50比特币。按照平均10分钟一个区块的产出速度,大约是每隔四年会减半一次。
第一次减半发生在北京时间2012年11月29日7点24分,第21万个区块诞生,比特币奖励减少为25个。北京时间2016年7月10日凌晨0点46分,第42万个区块诞生,这次相隔时间大约是三年零七个月,比特币奖励再次减半,成为现在的12.5个。
知道了这个规则,我们就很容易根据当前的区块高度计算出已经挖出的比特币总量,截止到本文写作时,比特币的总量约1687万枚。按照这样的半衰期,大约到2140年,比特币的产量就趋于零,上限是2100万个,实际上不可能达到2100万。比特币允许交易的最小单位是0.00000001(10^(-8))比特币,这个最小值也被称为“一聪”,这是由脚本语言支持的最小数字精度决定的,因此,比特币的总量上限就是2100万亿聪。
中本聪为什么要人为规定一个总量上限呢?因为他的理想是创造一种不能滥发的货币,从而在理论上彻底阻断通货恶性膨胀。至于这种理想能不能因为规定了上限而实现,是一个经济学问题,我没有能力多谈,只知道在经济学中,通货膨胀和通货紧缩同样都是可怕的。