哈喽大家好!我是小麦。最近想装一台电脑,然后看了眼显卡价格……嗯,还是很高。想到了导致今天这个局面的“罪魁祸首”——加密货币。今天看了李永乐老师两年前讲解比特币原理的视频,现在来做个笔记。

老规矩,视频链接:

  1. 李永乐老师Youtube:https://www.youtube.com/watch?v=g_fSistU3MQ
  2. 李永乐老师BiliBili:https://www.bilibili.com/video/av45247943
  3. 老高与小茉比特币:https://www.youtube.com/watch?v=7B-1vDFuYRk
  4. 老高与小茉区块链:https://www.youtube.com/watch?v=sjx_rpay9rk

以下文章可能有点深奥,读者可以在文章下方讨论,我会尝试给你们解答。

比特币是什么

比特币也叫电子货币、数字货币,它由一名化名为中本聪的网络极客于2008年11月1日在网络上写的一篇文章《比特币:一种点对点的电子现金系统》所提出。这篇文这里提出一种构思:去中心化的电子记账系统。

去中心化的电子记账系统

我们在和别人进行交易之后,需要检查我还有多少余额,这就是记账。目前我们的记账包括使用电子钱包都是由银行来记账。 银行就是这套记账系统的中心,我们信任银行,因为银行的背后是国家的信用。

而比特币是去中心化的记账系统。

怎么去中心化

去掉银行、微信支付宝这些可信任的第三方之后,最大的问题是我们无法互相信任。中本聪提到的概念是:将所有人的账本都公开给别人看。在区块链的世界,转账就得发广播,目的就是让所有人都知道网络里每个人每一笔钱的来龙去脉。

当 A 和 B 进行交易,A 需要把交易信息和电子签名告诉所有这个系统下的用户(广播)。大家会通过电子签名验证这句话的确是 A 说的,再将这笔帐记载账本上。

那么大家怎么知道 A 有这笔钱呢?A 的账本帮忙确认,而这个账本就叫做区块。

区块链 BlockChain

比特币的底层技术就是区块链。

这些由不同人发出的账单需要打包成一个块,称之为区块。一个区块的大小大概是1Mb,大约能储存4000条交易信息,取决于每条信息长度。

这个区块要和以前的区块(从比特币诞生的第一个区块一直到上一个区块)连在一起,再把新的区块往后接,这就叫做区块链。

区块链记录了比特币从创立到今天每一笔交易记录,所有人的钱从哪来到哪去都记得一清二楚、透明公开。

区块链示意图

遇到几个问题

有了系统之后,我们需要思考几个问题:以谁为准?为什么别人愿意帮你记账?怎么防伪、篡改?怎么防止双重支付?怎么保密?

记账的动力

为什么别人愿意消耗自己的电脑资源去记录和他自己无关的账单?为了让所有人有动力去做题记账,比特币有个奖励系统:

  1. 手续费。每个人在进行交易的时候都需要多付一点比特币,多付的钱就作为记账的手续费。这和平时我们用银行卡、信用卡的手续费是一样的。甚至银行卡的手续费来的更高。
  2. 打包奖励。中本聪提出一个方案:从比特币创建之初,每过 10 分钟需要打包一个区块,每个区块奖励 50 比特币(只有其中一个用户有权利打包),然后每隔四年,奖励减半。

根据打包奖励,我们可以算出总共有多少个比特币:

一个包50比特币,
一个小时6个10分钟,
每天24小时,
每年365天,
奖励减半周期为4年。

50 × 6 × 24 × 365 × 4 × ( 1 + ½ + ½2 + ½3 + …) = 2100万

以谁为准

每个人都想要这笔奖励,所有每个人都抢着去打包。每个区块里的包含的交易和交易顺序都会不同,如果有记假账的那就更混乱了。所以,记账者必须让所有人都能接受,这样大家的账本才能统一,这也被称为共识机制(Consensus mechanism)。中本聪的办法是“工作量证明(Proof of Work)“,它的本质是穷举。每个人都需要去做一个很难的数学题。这个很难的数学题是没人可以用脑子计算出来的,必须一个一个数去尝试,才能试出结果。这个过程称之为:挖矿。

如果有人把这个数学题做出来了,那就可以获得打包奖励。

挖矿

那么这道数学题是怎样的数学题呢?这里提到一个算法——哈希函数。我会另外写一篇文章研究这个。哈希函数主要是把一个字符串(数据)运算之后转换成摘要的形式。而且正向算很容易,反向推导却很难(几乎不可能)。

其中一个很著名的算法叫 SHA256,是美国国家安全局发明的一种算法。具体就是将数据经过算法之后变为一个独一无二的 256 位二进制数。不管你的数据长度多少,最后生成出来的二进制数一定是 256 位,而原输入只要有一点轻微改动,也会导致每一位数值产生变化。

挖矿就是基于 SHA256 的运算。我们需要对一个字符串进行两次 SHA256 计算。

打开一个区块(通常是个JSON文件)可以看到里面包含了:

  1. 头部信息(区块头)
  2. 交易数量 Number of transactions
  3. 交易详情 Transaction details

区块链示意图

区块头是区块的标签,里面包含:

  1. 时间戳
    该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己 2 个小时时间戳的区块
  2. Merkle根
    该区块中,交易的Merkle树根的哈希值(同样采用两次 SHA256 进行计算)
  3. 随机数
    为了找到满足目标所设定的随机数
  4. 上一个区块的哈希值。

在这里,我们把区块头理解为字符串。

记账以及计算难度

想要记账(将我们的区块链接上去),我们需要把字符串执行哈希加密,并且加密结果(也就是 256 位二进制数)的前面几位数必须为零(取决于当前设置难度)。那么字符串是不能改的,因为里面包含了所有的区块信息,唯一能改的是区块头里的随机数。

二进制只有两种可能 0 或 1,所以进行一次哈希加密的成功率等于 2 的 n 次方分之一。而这个 n 就是所需要的(前几位)0,取决于当前参与计算的算力,算力越强,要算的 0 越多 PoW 的证明难度也就越大。

当然,每个人的打包难度都是不一样的,影响因素有:交易信息、时间戳、个人信息。所以照成随机数大小不同(前面说了随机数只能通过穷举的方式进行计算)。有的人运气好,第一个数就算出来了,有的人需要多算很多次。平均来说的话,就是谁的计算能力好,谁就更有希望打包这个块

中本聪在设计的时候,保证每十分钟出一个块,所以需要改变 n 的难度,才能达成这个目标。这里我们做个数学题

  • 假设世界上有 10000 台矿机,每台矿机的计算量大概是 14T Hash/s,每秒计算 14T(T 是 1012) 所以是 1.4 × 1013
  • 十分钟总共能计算: 1.4 × 1013 次 × 104 台 × 600 秒 = 8 × 1019 次。
  • 概率是 1/2n 所以需要出一个块,平均计算的次数是 2n
  • 通过计算,n = 66,所以概率 P = 1/266 。平均计算的次数是 266 大概等于 8 × 1019 次。

那我们这里讲了比特币的底层架构(区块链)以及挖矿是什么东西。下一篇我们来研究比特币的安全性。