一文带你简单易懂地理解区块链是什么

前言

区块链是对以往中心式记账体系的颠覆,也就是实现了『去中心化』。这个概念最早在”比特币之父“中本聪在2008年发表的论文”Bitcoin: A Peer-to-Peer Electronic Cash System“(比特币:一种对等网络电子现金系统)里提出:bitcoin.pdf

所以想了解区块链,就必须了解比特币。而我久仰比特币的大名,于是拜读过这篇文章,也查过一些背景资料。这个回答就基于我的这些有限了解,谈一谈区块链。同时也推荐有能力的朋友,亲自读一读这篇文章。

为了便于区块链的介绍,我打算讲一个故事。

1:一个公共账本

假如你现在在上大学,你们寝室是标准的四人寝,除了你之外还有小王,小黄和小白三个室友。平时你们内部的活动很多,于是经常会有人垫付饭钱,车费,还有水电费。你们大家发现,如果每次消费后,都要一一计算交结非常麻烦,于是你们决定采用记账的方案。

于是乎,你们买了一个公共的账本,本次产生消费后,就由付钱的人在账本上记清楚,谁应付给自己相应的金额。如此一来,只要每月月末统一结算即可,大大节省了时间精力。

时间一长,你们发现在纸上记账还是麻烦。于是你们决定”升级“这个账本,改成在电脑种建立一个excel表格,比如这个样子:

image-20220103203159707

但问题是,如果你们寝室里有个人不厚道,偷偷修改账本怎么办呢?

例如小王把自己要付钱记在了小白头上。如果这个问题不能得以解决,那这个账本的信用就将会大大折扣。

2:每个人都有账本

区块链采用的解决方案就是,给四个人每人都配备一个账本。需要记录时,就由对应的操作人高喊交易内容,广播给寝室里的所有人。

例如,小王高喊,”小王需要支付给小白30元 “。然后寝室里其他人听到了,就在各自的小本本上记下,”小王需要支付给小白30元 “。

如此一来,就算小王故意使坏,把自己要付的钱记在别人身上,那也只能是篡改自己的账本。这样到月底时,小王的账本和其余三个人对应不上,便能知道小王的账本有问题。

但这个系统仍然存在一个问题,那就是如果小王恶作剧,不负责任的乱喊“小白需要支付给小王100元”。如此一来,很可能会有不明真相的舍友记录下来。

因此,分布式的账本还由一个急需解决的问题,如何确认收到的一笔交易记录是否有效?

3:在交易记录后签名

这个问题在纸质帐本里很好解决,那就是在每一条记录后,由需付款的一方加上自己的手写签名,以示自己认可这笔记录。这个思路换到计算机中就是数字签名,所以我们要求每一笔记录后面,都要由需付款的一方加上自己的数字签名。

image-20220103203415765

数字签名在这里就不具体解释了,大家只需要知道,帐本系统里的任何人都可以验证数字签名是否正确可信。

4:账本的改进,比特币的诞生

上面这个账本还存在一些问题,使得只适合小范围使用,如果扩大到更大的范围,比如整个学校使用,这个时候交易量和用户数剧增,记录就会变得非常麻烦。

比特币正式为了解决这个问题而对前面介绍的账本系统的改进。

4.1:改进一:交易单位为比特币BTC

我们之前用的账本里面的交易单位是人民币,但在比特币系统中,我们的交易单位变为比特币。

4.2:改进二:将账改为事实交易支付

之前的账本我们越好是月底结账,而现在我们把交易单位改成了虚拟的比特币,交易也由月底统一交割改为事实交割。而比特币就像是账本上的数字,随时都可以视大家的意见进行”套现“,即在现实中交割。

如此一来,我们就需要确保每个人的账户里有足够的比特币进行交易。也就是确定任何一笔交易的前提就是付款方的比特币账户中有足够的比特币用于支付。

传统银行系统中,银行会记录储户的账余额,判断储户是否能够进行转载。这个很好理解,我在网银里操错向某账户转账一个亿,但我账户里显然没有这么多钱,因此银行系统会认定交易失败。

但比特币系统并没有一个“银行式”的权威中心,所以不能像银行这种操作方式。比特币的解决方案是,每笔交易不以余额为基础,而是以以前的交易为基础。

比如,“小王支付给小黄50BTC”的前提是自己曾经收到过多余50BTC。因此小王的交易记录需要包含自己之前的交易信息,举个例子:

  • 小白支付给小王40BTC
  • 你支付给小王20BTC
  • 小王支付给小黄50BTC

我们忽略比特币的源头,及它是如何产生的事,先继续往下看。这个时候小王需要广播的交易信息就是:

  • 之前交易:小白支付给小王60BTC,你支付给小王60BTC–>
  • 当前交易:小白支付给小黄20BTC,你支付给小黄10BTC,你支付给小黄10BTC。

这里说一句,“你支付给小王20BTC”中的20BTC是一个整体,无法分割,因此无法只从中拿出10BTC交易。

image-20220103203614307

我从Bitcoin Explorer上找个例子,见上图。这是一个实际交易记录,用户A从自己的62.69个BTC中,转给了用户B和C分别0.048和0.498BTC,然后把剩下的62.15BTC转给了自己。

4.3:改进三:不留证明,改留比特币账号

如上图,用户A并不用留下自己的名字,而是用一个字符串来代表自己进行交易:

  • 1H6ZZpRmMnrw8ytepV3BYwMjYYnEkWDqVP

同理,用户B和C也是如此,只留下了一个字符串。所以你们室友在帐本里都不写名字,而是写下跟各自对应的字符串,即比特币账户。虽然对于你们四个人的寝室这纯属脱裤子放屁,但如果对于规模更大的系统,比如前文提到的整个学校而言,这种操作可以极大提升隐私性。

我们只能知道每个账户,而无法知道谁拥有这个账户,这就保证了隐私性。

5:交易记录的存储:区块链

从这一节开始进入正题。前面我们提到了这个账本是分布式存储的,每个人都有一个自己独立管理的账本。

当这个账本系统变得很大时,一致性问题就必须要考虑。比如,如果你有室友在交易记录发布时不在寝室,那么他就错了这次消息,使得这次消息不会出现在他的帐本里。

换回比特币系统,也就是部分电脑可能处于关机或者未联网状态,会错过部分交易。此外,还可能会有黑客入侵部分电脑,篡改交易记录。

此外,还有一个更严重的问题就是,实际网络拓扑非常复杂,链路质量的随机性很大。因此,如果用户A(假设账户里有10BTC)连续广播两条相互矛盾的消息,比如:

  • 交易信息1:用户A支付10BTC给B;
  • 交易信息2:用户A支付10BTC给C;

有的读者应该会觉得,那我们就采信先收到的交易信息1,忽略与之矛盾的脚印信息2不就行了。

但问题是,因为网络链路的复杂性,所以很可能存在部分用户先收到交易信息1,又有部分用户先收到交易信息2。如果依靠先后顺序辨别有效性,那么就会存在不同用户记录的交易信息不一致。

区块链的概念产生

为了解决上面提出的这个问题,中本聪提出了区块链的概念。

每个用户如果愿意,都可以整理自己从网络中接收到的交易信息,然后检查其是否合理(每笔交易是否由足够余额?数字签名是否正确?)后,再将交易记录打包成一个区块。

因此每个交易记录都是以区块的形式存储,然后再广播到系统中的其他用户中。而区块之间相互连接,形成一条由系统内全体用户共同维护的区块链。

image-20220103203842356

因此其他用户收到广播的区块时,就会把这个区块加到自己维护的账本,也就是区块链的尾部。

但如果只是这样,并没有解决任何问题。互联网节点遍布全球,广播过程也需要时间,因此肯定会存在不同节点收到不同区块存储的问题。

image-20220103203904485

以此图为例,设备A和设备B几乎同时发布了自己的区块,两者的区块并不相同。很好理解:

  • 红色区域中的用户离设备A近,会先收到设备A发的区块甲;
  • 蓝色区域中的用户离设备B近,会先收到设备B发的区块乙;

然后,不同的用户会将不同的区块加入到自己维护的区块链尾部,生产不同的区块链。

如此一来这个网络就乱套了。为了降低传播时间的影响,一个简单粗暴的方式就是从系统设计中就限制区块生成的速度。比特币系统的核心思想采就是用算力限制区块的生成速度。

比特币系统要求,每个用户在发布新区块前,必须先完成一个任务。这个任务就是:

  • 根据前一区块的一些信息加上新区快的一些信息,生成一个字符串S;
  • 选择一个字符串B,与S合并成“BC”,且要求“BC”的哈希映射满足某个条件,比如映射结果的前72位为0(概率:2^(-72));

上面的第2步,除了一个个试以外是没有捷径的,而且结果是否满足要求可以快速试出。举个例子就相当于给你一个银行卡,让你挨个试密码。那你没有任何办法,只能000000-999999挨个试验,最后虽然能试出来,但也会花费大量时间。而且你把试出来的结果告诉别人后,别人可以很快验证你的结果是否正确。

时间恰好是我们宇宙中最稀缺的资源。因此我们可以调节这个难度,比如使得系统中所有平均每20分钟才会有一台设备完成要求的任务,猜出符合要求的字符串B。如此一来,撞车的概率就会大大降低。补充一句,这个难度是不断调节的,以适应硬件算力的提升。

虽然概率大大降低,但仍然无法排除存在撞车的概率。因此,区块链验证中最核心的思想就是

——相信最长的区块链;

image-20220103204119037

我们拿上图举例,在原有的到区块链N的情况后,短时间内出现了两个不同的区块,分别用蓝色和红色表示。

如此一来,就会有:

  • 部分用户的区块链:原区块链+蓝色区块
  • 部分用户的区块链:原区块链+红色区块

这个时候,我们需要做的只有一件事情,那就是『等待』。因为同时产生区块的小概率事件,总不可能连续发生。这样我们只需要等下一个区块产生,看这个新区块是连在蓝色后还是红色后。

图例里是有个新区块连在了蓝色区块后面,这个时候:

  • 链长度(原区块链+蓝色区块+新区块)>链长度(原区块链+红色区块)

因此,我们选择长度更长的“原区块链+蓝色区块+新区块”作为大家共同维护的主链。

6:记录的安全性:几乎不可能造假

如果有人想对区块链造假,那么他就需要一直抢先生成假的新区块,并广播出去。

这就要求造假者生产新区块的速度,要快于系统中的其他所有用户的生成能力之和。换句话说,造假者需要用户有和其他用户算力之和匹敌的算力。

假设这个造假者拥有系统总算力的80%,而剩下用户拥有20%(注:这个假设显然不可能)。如此一来,在造假者广播了一个假的区块后,就有80%的概率先于其他用户生成新区块,然后连在自己之前生成的假区块后。此时造假才有可能成功。

但实际是,每个用户用的算力相比系统总算力都是微不足道的。这就使得造假变得不可能,也使得造假的成本变得无法接受。

7:挖矿:比特币的发行

系统为了鼓励大家生成新的区块,于是在开始时就定下规则:

  • 每当一个新区块加入主链,这个区块的发行者就会被赠与50个BTC;
  • 每21万个区块后,奖励额度缩水一半;

这也就解释了,为什么BTC的发行上限是:

image-20220103204256684

也就是21000万个。这个机制牢牢限制死了比特币的总量,使得比特币不可能超发,滥发。

截至到我下笔时,比特币区块链的长度为504011,所以现在每个区块的奖励时12.5BTC,已发行的比特币数量为16800137.5。

image-20220103204318897

而目前区块链的生成速度是15分钟左右一个,算下来一天就是100个左右。

以上就是我个人对比特币和区块链的理解,希望对大家有所帮助。当然,我个人不是专业学者,理解或许有偏差,力求严谨,但如有错误烦请告知我。