搞懂比特币及区块链原理

By | 2021年5月19日

比特币,一种特殊的加密货币。

区块链,是比特币的技术实现。

比特币,是区块链最好的应用。

因为比特币出现,人们从注意到其背后优秀的区块链技术,到区块链如今的大放异彩。

那么比特币,究竟是什么?

我们要从账本说起。常规的账本,记录的是每一笔交易,交易,是货币最重要的行为,而货币,是我们每一个人在这个社会生存的根本。

目前,我们使用的货币比如美元,人民币,日元…等等都是由我们所信任的中心化机构发行的法定货币(如政府,银行),并为我们每个人记账,然而…正是因为信任,往往容易被消费,容易被辜负。

比如银行某职员篡改交易记录,比如银行倒闭,比如增发货币;

虽少,但确有发生:特朗普增发2.2万亿,拜登狂印1.9万亿,最终买单的,终究是持有货币的普通民众。

那是否有一种货币,既能为我们记账,又能摆脱中心机构的约束,而且能绝对信任呢?这便是比特币被创造的初衷。

在比特币的世界里,所有人共同拥有一个可以无限记录的大账本,这个账本详细记录了比特币世界所有人每一笔的交易,而且,所有的交易记录都是公开的,随时随地供我们查阅。

账本如下图一样,内容很简单:交易编号,付款人,收款人,金额。

这个金额的单位不是美元,不是元,不是世界上法定货币中的任何一个,无论世界的任何角落,它都是以比特为单位的数字货币。

那么问题来了,既然是数字货币,那么交易数据必然是存在于网络或者数据库中,那么黑客攻击,并篡改交易记录怎么办?比特币是如何防止交易记录被篡改的呢?

首先,我们需要理解一个密码学的知识,哈希函数。

哈希函数的作用:

如下图,将任意长度的字符串,使用SHA256函数,转换成固定长度的输出,输出的值称之为哈希值。

可以看到上面的例子,西游记 和 西游记1 ,只相差了一个1,但是得到的是完全不一样的但是相同长度哈希值。

同样,即时将西游记整本书作为输入,得到的依旧是另一串完全不一样的但是相同长度的哈希值。

哈希函数的最大几个特点:

不同的输入,得到不同的输出。

很难找到两个不同的输入,得到相同输出的哈希值。

已知输出的哈希值,很难找到对应的输入。

当然,无限的数据对应固定长度的哈希值,那么可以肯定的是,必然存在两个不同的字符串输入,会得到相同的哈希值输出。

但是这只是存在于理论上,实际上想要找到两个字符串有相同的输出,除了穷举,别无他法,而且,需要花费无穷无尽的时间(要是对SHA256哈希算法深层次原理以及有多少种输出情况感兴趣的朋友可以自行百度)。即使说以后会出现计算能力超强的计算机,那也没有问题,增加一点输出长度即可。

我们说过,比特币的技术实现是区块链,那什么是区块链?

首先我们需要理解什么是区块。

我们可以把区块理解为一个excel文件,里面记录了一段时间内的所有交易(比如10分钟),也就是说,每10分钟会生成这样的一个记录交易数据的excel;随之时间的推移,交易不断增加,最终得到很多的excel文件,也就是很多的区块。

一个接一个的区块通过链串联起来的最终形态,就是区块链。

那这个链究竟是什么呢?我们先看下图的区块链样例:

从上图我们可以看到区块链有以下几个特征:

第一个区块没有区块头(我们称之为创世区块)

每一个区块都由区块头以及属于这个区块的交易记录组成

一个区块的哈希值 = 区块头+交易记录结合进行哈希运算

后一区块的区块头记录的是前一区块的哈希值

以上几个特征,正是区块链防止交易记录被篡改的原因之一。

结合我们上文提到的哈希值的特点,当区块链形成以后,如果我们想要篡改任一区块的交易记录,也就意味着哈希函数的输入字符串发生变化,那么就会得到与之前完全不同的哈希值输出,从而导致这个区块的哈希值与后一区块区块头中所记录的哈希值不一致。最终被发现篡改。

当然,我们可以同时修改掉后一区块头中的哈希值,但这又会导致其新的区块头与交易记录的哈希值与其后一区块的区块头中的哈希值不一致,最终被发现篡改。

即使说,我们可以同时修改掉之后所有区块中的数据,但是,只要我们记住最后一个区块的哈希值,那么可以说,无论任何的篡改,都能被发现。

以上都是我们说的区块的样例,那真实的区块究竟是什么样子的呢?

上面我们说过,在比特币的世界里,我们所有人都是使用的同一账本,而且可以随时查阅,比特币提供了这样的API。

当然我们也可以从各类区块链网站上查阅,比如BLOCKCHAIN。这里我们一起来看一下。

解释一下上图的每一列所代表的意思:

Height: 区块的高度,比如684103,也就是区块链中第684103个区块。

Hash: 对这个区块的区块头以及交易记录进行哈希运算的结果。

Mined: 代表区块包含了多少时间的交易记录。

Size: 区块的大小

点击进入到其中一个区块。

我们可以看到这个区块的详细信息,包括上面提到的区块的哈希值,区块包含的交易数量等等。