最近比特币价格持续走高,不断打破记录,引来了众多“投资家”关注的目光,而作为比特币底层的技术——区块链,因为牵扯的专业知识比较多,反而没有多少人真正去深入了解。作为一个有点追求的程序员,我觉得还是有必要用最通俗的话语,让众多技术小白深入了解一下这项技术。
什么是区块链
既然是聊区块链,那首先还是要弄明白什么区块链。先放一个比较学术的定义:
区块链是由包含交易信息的区块从后向前有序链接起来的数据结构
要理解区块链,必须先弄懂什么是区块。区块可以理解为包含了一系列交易信息的数据集合体,所谓的交易信息就是买卖双方在交易时留下的必要信息,例如买卖家是谁、交易额是多少,何时交易的等等。通常一个区块会平均至少包含500个交易,当然区块还会有包含其他的必要信息。
说完了区块,我们就可以来说区块链了。既然有这么多包含交易信息的区块,那么如何组织它们的呢?其实道理也很简单,每一个区块都会包含上一个区块的唯一标识值(其实就是对父区块的哈希计算,关于哈希计算你只需要知道不可逆就行,也就是根据哈希值不能反推原来的信息),也就说每个区块都会有唯一一个父区块,最开始的区块没有父区块,也叫创世区块。如此就可以将所有的区块按照先后顺序,通过父子相认的关系串联起来了。
单向链表.png这种串联方式有点像人类社会的族谱,不过这个族谱只能是每代单传,创世区块你就理解为上帝或者女娲吧。根据这个族谱,我们就可以清晰地看到每一代在整个族谱中的位置,有可能孙子不认识爷爷,但是它只要知道自己的父亲是谁,这条链路就不会出错。当然这是简化过的类比,真实情况要复杂得多。
为什么区块链可以做到防篡改
明白了区块链的含义后,我们再来分析一下为什么人们总是说区块链具有安全防篡改的特性。先回到上文提到的每个区块都会包含父区块的唯一标识值,这个标识值有个很重要的特性就是一旦父区块的信息有任何改变,原来的标识值就立马失效了。也就是说这个父区块标识值,跟父区块的信息强关联。
如果有人想要篡改区块链中的某一条交易信息,那么这条交易信息对应的区块也就随之改变,而它的子区块也必须要改变,因为子区块中的父区块标识值发生了变化,而子区块的改变又会迫使孙区块必须改变,同样也是因为孙区块中的父区块标识值发生了变化。看到这里也许你就明白了,如果一条交易信息在最新的区块中,它是很容易被更改,而越到底部,区块的层级越深,就越不容易被改变。
上面这段描述也许逻辑有点绕,我们还是以族谱为例,如果有人想要篡改某一代人的DNA,那么理论上他的儿子也必须被篡改,因为儿子的DNA有一半是来自父亲,同样的道理,孙子的DNA也要被篡改。如果只是想篡改末代的DNA,那其实很容易,但是越到族谱的上面,就越难被篡改。
你可以把区块链想象成地质构造中的地质层,表层可能会随着季节而变化,甚至在沉积之前就被风吹走了。但是越往深处,地质层就变得越稳定。到了几百英尺深的地方,你看到的将是保存了数百万年但依然保持历史原状的岩层,也就是说越深的地质越难被改变。
地质层.png可能有人会说,即使有10代人,照样也可以篡改,只是难度大一点,但也并非不可实现呀。这么想完全没有错,但是要知道在区块链的世界里,每一个全节点都会保留一份包含从开始到现在的所有交易信息的区块链备份,而全世界目前的全节点数早已超过5000个,每一次的篡改还要伴随着大量的哈希暴力破解计算,因为哈希计算不可逆,所以只能靠不断地试,才有可能破解。将分布在全世界的数千个全节点,都经过难度如此大的暴力破解计算,现在基本上已经不存在这种可能性了。
而且要知道即使真的有人要妄图去篡改,也要掂量篡改后的收益是否能弥补其为此付出的电力成本。前段时间新闻联播播放了在云南、四川、内蒙和新疆深山里,存在大量倚发电厂而建的矿场,它们都是在比特币世界里挖矿,希望以此来迅速获取财富。篡改就要和如此大的算力相抗衡,试问有几个人会傻到去做和全世界相抗衡的事情。
至于什么是挖矿,以及为什么篡改就是和全世界矿场的算力相抗衡,留待下一次分析比特币挖矿时再详细介绍,这里你只需要知道篡改就要在算力上超过全世界的矿场,所以在区块链的世界里,一旦形成规模,人们就很难去篡改交易数据。
区块的结构
上面提到了区块就是包含各种交易信息的数据集合体,那么我们不妨来看看这些数据结构到底是什么样的,看完之后我相信你一定会对区块有更深的理解,为了方便理解,我特意画了一幅简图。
区块的结构.png从这幅图上我们可以看到,每一个区块都会保存父区块标识,最终形成一个依靠父子关系维系的链表。区块的高度就是每一个区块距离创世区块的距离,从这幅图上也可以看得更明白。
针对每一个区块,我们可以看到有四种类型的信息,分别是区块的大小,区块头、交易数量和具体的交易信息。占据区块最多空间的就是具体的交易信息,区块头则包含了当前区块非常重要的信息,下面我们来看区块头的详细数据结构。
从上图可以看到区块头中除了版本号、时间戳,还有三类非常重要的数据。父区块标识,也就是父区块的哈希值,在上文已经说过了,这里就不再过多阐述了。Merkle树是一种非常有用的数据结构,它可以在大量的交易信息中快速找到某一条需要的信息,比传统地从头到尾查找要高效非常多,至于它的工作原理,下一小节再做详细地说明。最后一项是工作量证明相关的数据,数字货币挖矿的时候会用到,留待下一篇文章再做详细的介绍。
快速验证交易信息的秘诀——Merkle 树
Merkle 树虽然是一种专业性比较强的数据结构,但是理解它对于理解区块如何快速校验交易信息机制至关重要,所以我觉得还是很有必要介绍一下。
先看一个比较官方的定义吧:
Merkle树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。
是不是看完后发现,虽然所有的汉字都认识,但是组合到一起却发现依然不知所云。为了方便理解,我还是先放一张图片吧。
Merkle.png该图片来自《精通比特币》,从这张图片我们可以看到整个数据结构每一层都是分两个叉,故得名二叉树。图中每一个节点都代表了一笔交易,节点中保存的都是交易信息的哈希值,父节点是将子节点的哈希值串联后再次哈希计算而得到。总之你只需要知道父节点是包含了所有子节点(包括孙节点、重孙节点等等)的标识,也就说只要问一下父节点,就能知道某一条交易是否属于它的某一个子节点。
二叉树结构有一个特点,比如说我想要找HK这个节点,我不需要从头到尾一个个地找,从根出发,只要检验一侧的信息就可以了,如果一侧没有,那肯定在另一侧。以上图为例,当我发现HK不在HABCDEFGH一侧时,我就不需要在左侧的链路上浪费时间了。这就如同让你猜两个合拢的手掌里哪个有东西,你如果发现左手是空的,那么东西肯定就在右手里。
这样的数据结构查找一项数据,最长需要寻找的次数是2*log2(N),N表示所有的节点数,如果还记得对数曲线的话,你就会发现这个值比N的增长速度要慢得多,在大数据量的情况下,其优势会非常明显。
这也是为什么比特币轻钱包只需要保存区块头就可以校验整个区块的交易信息的原因,Merkel树结构提供了快速查找并验证交易信息的快捷方式。
小结
关于区块链的基本知识和原理应该都已经介绍完了,不知道你有没有完全理解。从整个的分析来看,区块链并非什么高深的新技术,它其实是综合了算法、数据结构、编程、分布式计算等已有技术,它用一个分布式的公开账簿解决了众多交易中经常出现的问题,比如数据被篡改的风险,当然它其实还解决了交易验证的问题,只不过需要用到加密的知识,留待以后介绍比特币的运行机制时会详细解释。
欢迎各位关注我的微信公众号:扬帆沧海
扬帆沧海.jpg如果你想更深入了解区块链知识,也欢迎关注我的区块链知识星球:区块链技术和原理,我会每隔一天更新一篇区块链世界的文章,让你在新技术领域里快速找到自己的定位。
区块链知识星球.JPG
网友评论