# 理解比特币

By [ddl1996](https://paragraph.com/@ddl1996) · 2022-03-27

---

2022年3月27日 更新

下面的链接直观展示了区块的hash 计算，链之间的连接

[https://andersbrownworth.com/blockchain/blockchain](https://andersbrownworth.com/blockchain/blockchain)

* * *

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

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

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](https://storage.googleapis.com/papyrus_images/e50adb98473534ffd531fa12f26a3b52df848648187c28383afb7df39e4be6cf.png)

20210125222452-7na7m6o-image

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

**区块建立者**

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

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

**系统交易员**

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

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

这里有个原则即

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

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

![20210125224435-4nit26o-image](https://storage.googleapis.com/papyrus_images/d4ae61bf8ccd7b1821124f87c647f96744448a6e9c0c0fb8f88b5292eb32aade.png)

20210125224435-4nit26o-image

### 其他细节

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

### 参考

[ppt](https://docs.google.com/presentation/d/1Ari-Y1T1in15-RsbYMQ2rohafGMkvPCSUBbq_luZs4c/present?slide=id.g2acf3bb0d7_0_0)

[比特币查询](https://www.blockchain.com/explorer)

[![]({{DOMAIN}}/editor/youtube/play.png)](https://www.youtube.com/watch?v=bBC-nXj3Ng4)

[![]({{DOMAIN}}/editor/youtube/play.png)](https://www.youtube.com/watch?v=-lNgWFbETeI)

---

*Originally published on [ddl1996](https://paragraph.com/@ddl1996/P6X6OXONbVzAlAjbvjuM)*
