理解比特币

关于比特币有太多的消息,关于人们赚了多少亏了多少,但是比特币到底是什么呢?想起木遥说

在过去的一年里,我身边的几乎每个朋友都或多或少问过我关于比特币的问题,往往是非常初等的问题。这有点奇怪,因为比特币已经诞生了有将近十年之久,差不多跟智能手机同龄,但今天没有人还会好奇地问智能手机是什么。一个省事的解释是比特币没有像智能手机一样进入千家万户,可是反过来想,拥有一部智能手机并不会让人暴富,人们对比特币的求知欲应该成百上千倍更高才对。我觉得更本质的原因在于,比特币首先是一种知识,而知识在今天的信息网络里的传播速度正在变得越来越慢,越来越低效。

20年暑期实习时候,住在一起的一个大哥就是做比特币的,我们开始每天晚上回去了聊天,聊了几天就觉得他满嘴跑火车,拿着一本社会学书在看,聊来聊去就是一些大而空的词,同样关于比特币我问道具体是啥,他也解释不不清楚。我对于比特币能不能赚钱现在兴趣不大,但是我很好奇比特币究竟是什么,他背后的基础是啥?

现在把我最近学的关于比特币知识梳理下。


稍微查一下wiki的定义,比特币是一个去中心化,互不信任的交易验证体系。其中去中心化trustless,这些词语其实我早就听说了,但是这对于比特币到底意味着什么呢?

在介绍比特币这一种加密货币之前,我们看一下基本概念账本(ledger)和数字签名(digital signature)是啥

账本

账本需要保证下面两点

  1. 记录的唯一性
  2. 记录的有效性

假设四个人之间有频繁的交易往来,每次用现金结算比较麻烦,于是他们约定将所有的交易记录在一个公有的账本上,每个人都可以添加和查看这个公有账本。这个账本其实可以理解为庄家,每过一定时间庄家就去查账本,欠了钱的需要把钱补齐给庄家。

当这里存在一个问题,假设B向账本添加一笔记录 “A欠B100元”(实际上应该由A来作这笔记录),此时A可能并不知情,这该怎么办呢?

这里就引入了数字签名,每一个人都有一对公钥(public key)和私钥(serect key) ,密钥可能是一串256位的01字符串。私钥是必须自己保管好的,用过github的应该都知道。

在现实生活中同一个人签名在不同文档上都是一样的,但是数字签名不是这样的,不同的文件内容+私钥通过加密函数能够产生不一样的签名,这样就能避免在不同文件上用同一个数字签名伪造。用符号表示就是

$$
F(文件,私钥)=数字签名
$$

有了数字签名之后,我们还需要验证签名的正确性

$$
F(文件,数字签名,公钥)=True/False
$$

有了数字签名之后账本上的一条记录可能如下

A欠B100元 数字签名(01110000…..)

解决了记录的有效性,还需要解决同一条交易记录唯一性问题,即给每条记录加上一个唯一的id,此时一条交易记录看起来

1 A欠B100元 数字签名(01110000…..)

简单总结下我们现在这个交易系统的特点

  1. 每个人都可以向账本添加记录
  2. 间隔固定时间做账本结算
  3. 只有数字签名合法的交易记录才有效

上述系统存在一个问题,如果有人到月底欠了钱,但是他又没有出现怎么办?。因此在原有系统更进一步,假设在系统初期我们每个人都向系统交一笔固定的钱,每次交易我们都去查历史记录,一旦发现这笔交易可能导致这个人收入小于支出,就认为这笔交易不合法。这样改进之后的另一个好处就是不需要做账本结算了。其次,数字货币和纸币脱离了关系(不在依赖纸币的结算)

有了上边的知识,到这里我们可以给比特币做一个简单的定义,比特币就是一个共有账本,等价于所有

的历史总和。

去中心化

上述提到的系统设计,实际上有一个“庄家”或者叫一个中心机构,但是如果每一个人都有一份这样的账本,那么我们岂不是就不再需要中间人了么?

但这带来了一个问题,按照设想每一个都有一个账本,这个账本应该是相同的,那么如何保证每笔交易以及交易顺序在每个人的账本中一样呢?

这个问题实际上是整个加密货币最难的一部分,比特币是通过选择相信消耗算力资源最多的那一份账本.

现在看起来比较不知所云,先放下引入一个新概念

哈希函数

以最常见的加密函数SHA256为例,输入任何文本,输出一串256位的0/1字符串,哈希函数的特点有

  • 对文本有任何轻微改动,计算得到哈希值都不一样
  • 哈希函数不可逆

有了哈希函数(这个和数字签名里面的函数有啥区别?) 我们如何来看一个账本消耗的算力多少呢?

在原有账本的基础上

1 A欠B100元 数字签名(01110000…..)

2 B欠C 100元 110000……

….

我们规定在这个账本的末位加上一个魔数, 使得整个账本经过哈希运算之后得到的哈希值,前30位(具体位数可以改变)都为0,我们就认为这个账本暂且是合法的。

从概率的角度找到这样一个魔数,是 $1/(2^{30})$ ,并且只能够通过穷举的方式来找。所以可以认为需要很大算力,平时我们说的挖矿其实就在做这个事情。

20210125222452-7na7m6o-image

区块链( block chain)就是我们的账本,他把账本拆分成了很多小块,每一块除了有交易记录,还有前一个块的工作量证明(挖矿穷举得到的魔数),以及当前块工作量证明。

区块建立者

可以理解为有人在全网监听所有交易记录,然后根据这些交易记录去计算魔数,一旦找到满足要求的魔数,就认为一个新的区块被建立,然后将新区块广播到全网。为了奖励这些找到魔数的人,规定给他们一定数目的比特币回报。这也就是我们说的挖矿的收入。

每找到一个区块,意味整个区块链网络系统总的货币变多了。

系统交易员

对于我们不去挖矿的人,我们不需要监听交易记录,即不需要计算产生新的区块,我们需要做的就是收听被矿工挖到并且广播的新区块,并且更新我们自己拥有的一份区块链(账本)

这里又产生了一个问题,即一个矿工伪造一笔交易记录,计算产生一个新的区块,同时不在全网广播,只发给特定人。在这个系统里面做假账的代价有多大?

这里有个原则即

人们相信他所指向的最长区块链

每次矿工产生了一个新的区块,收到区块的人并不会立马将区块合并到自己的区块链中,而是观望一段时间,比如规定等五个新的区块才合并一个区块。这样即使Alice欺骗了Bob,产生了下图中上方分叉的一条链,网络中的其他矿工此时也在不停挖矿,产生新的区块,并且在向Bob广播,除非Alices的算力达到全网50%y以上,后者他产生的区块链分支就被认为是假的。

20210125224435-4nit26o-image

其他细节

  1. 前面提到计算魔数,使得散列值前30位为0,这个“30位”会根据当前挖矿难度变化,系统保证大约10分钟产生一个新的区块
  2. 比特币系统中的币都来自于生成新区块的奖励,币的总数目被设计为一定的,一开始挖矿生成一个区块能够得到50个比特币,过一段时间减少为25 ->12.5->6.25…
  3. 矿工得到的奖励还可以有每笔交易支付的小费
  4. 比特币中每个区块包含的交易记录大约为2400条

参考

ppt

比特币查询

3blue1blown

google视频