大多数人对区块链的理解还只是一个大概印象,虽然很多人都认为区块链是去中心化的可信基础,但只有少部分人可以理解其中的具体原因。现在谈到的区块链,其实是基于一系列密码学算法构建而成的。对于非密码学专业的人来说,理解起来是很艰涩的。
本文,我们将从密码学的角度对整个区块链结构进行一个整理讲解。针对具体的密码学技术,尽量使用通俗的例子,希望能帮助大家增加对区块链的理解。
账户
深入学习区块链之前,我最好奇的就是每个人的账户在一个分布式系统中都是如何生成的。
毕竟在中心化系统中,账户是由服务方进行生成和验证的。比如我们申请微信号,微信号是腾讯在他们自己的服务器里帮我们创建并管理。但在区块链系统中没有一个中间企业帮我们创建账户,那在区块链里是如何生成账户的呢?
安全随机数
这里就需要引入密码学里的第一个概念,【安全随机数】,即在本地随机生成一个字符串,也就是我们的私钥。由安全随机数算法生成的随机数,我们可以无限假设是安全的。
比如,现在允许你在全宇宙中随机选择一个原子,不做标记,然后让你的朋友在不知情的情况下找出这个原子,你可以想象一下这个难度,而基于不同的足够安全的随机数种子生成相同的随机字符串的概率比找到那个【原子】还低的多得多。因此,虽然我们都是在本地生成区块链私钥,但是完全可以认为是安全的。
公钥算法
通过安全随机数算法生成了私钥,那么如何通过私钥生成公钥以至地址呢?这里就需要引入第二个密码学概念【公钥算法】。
【公钥算法】通俗来讲就是公钥加密,私钥解密,任何拥有你公钥的人都可以用你的公钥来对数据进行加密,但是只有对应的私钥才能对这个数据进行解密。就好比是你造了保险箱,任何人都可以把他的东西放在保险箱里,然后锁上箱子,一旦锁上只有你才能打开。这个公钥算法在区块链里用的是椭圆曲线,原理则是数学上对大数进行因数分解的困难。
比如,大家都知道6可以由2乘上3得到,这个很简单,但如果给你超级大的数呢?比如一千位?两千位?你可能会想着用自己的电脑来计算,毕竟数学已经发展这么多年计算机算力也几何式增长,肯定算得出,但是很遗憾的告诉你这个时间是成千上万年,足够我们每个人回归地球母亲了。
给一个足够长的私钥,我们可以得到一个公钥,基于大数因数分解的困难性,没有人可以通过这个公钥计算出私钥,这样我们就得到了一个区块链账户。这个账户仅仅包含私钥和公钥,那么我们通常使用的地址又是怎么来的呢?
简单来说我们通常使用的地址就是公钥的小名,比如迪丽热巴·迪力木拉提是迪丽热巴的全名,但是这个名字太长了,所以我们通常叫她热巴。公钥也是这样,虽然公钥的长度保证了安全性,但在使用时没这个必要,毕竟数据是要存储起来的,没必要的数据也就没必要存在,因此我们对区块链账户的公钥进行了一系列的【哈希】操作,并添加一些版本信息以及校验信息等等生成我们最终的区块链地址。后文也将提到这个重要的密码学概念【哈希/摘要】。
以上介绍了区块链里的账户,基本逻辑就是随机数→私钥→公钥→地址。随机数是不可重复的,公钥和地址是可以计算的,因此你一定要保护好自己的私钥,有私钥,有一切。没私钥,那你可能也要像英国小哥一样天天在垃圾站扒拉自己的硬盘了。
交易
交易对于大对数用户来说,算是了解区块链最多的地方了,毕竟大家用区块链主要还是为了【交易】。假如最开始中本聪提出的比特币没有币这种激励概念,那恐怕无论区块链还是比特币现在都早就被遗忘了。
国内现在习惯使用支付宝和微信来进行转账发红包,这个过程是由支付宝和腾讯这种中心化机构来帮助我们处理的。
比如我给你转5毛,你给我转500,这个过程都只是数据的流动,支付宝会真的把五毛钱挪来挪去吗?不会,都只是数据库里的数字变化而已。但因为支付宝和腾讯是大企业,具有公信力,因此我们相信他们不会擅自动我们账户里的钱。无论你查看多少次,五毛也不会突然变五个亿。
但是区块链的交易就会出现问题,我们没有一个中心化的企业帮我们管理这几个亿。我说给你转1个亿,但是我账户里只有五毛,怎么办?我说给你转五毛,但是区块链从我的账户里给你转了一个亿,我怎么办?
数字签名
【数字签名】密码学算法,可以解决这样的困扰。【数字签名】顾名思义就是数字化的签名。
在日常生活中,签名代表着自己的授权,具有法律效力。在数字时代,取代古时候签字画押的就是【数字签名】,毕竟你不能对着电脑屏幕按指纹。数字签名也是基于我们提到的【公钥算法】,但是反着来,前面提到公钥加密与私钥解密,这里我们用私钥对输入数据生成一段可验证的字符串称为签名,这个签名可以用公钥来进行验证。数字签名可以保证原数据的完整性和真实性。
比如,你给你女朋友发个I love U,并附带你的签名,你女朋友验证了签名后知道是你发的,又知道数据没有被改过,这就是个浪漫的爱情故事。但如果没有签名,中间被情敌改成了I hate U,你女朋友又没法验证,那你的下一个520可能就要自己过了。
同理,【数字签名】在区块链的交易过程中也扮演着同样的角色,保证交易的完整性和真实性。
完整性即交易的准确数额,真实性即交易的存在与否。具体而言,我生成一笔交易写上给你转五毛,然后用我的私钥对数据进行签名,说明这个交易确实是我授权的,然后把交易广播出去,别的节点就会验证这个交易,一看签名确认数据是正确且真实的,那剩下的事情就交给共识了。但是如果发现数据和签名对不上,那不好意思,你的五毛没有了,一毛都不给了。
区块
查阅区块链图片时,基本通篇都是数字化铁链的图片,虽然看上去很酷炫,也和【链】这个词很契合,但是区块就很委屈了,毕竟铁链子的结构里完全看不到区块原本的样子。这里需要给区块正名下,我区块,今天从这里跳下去,哪怕打包到分叉上,也不当一个铁环。
从数据结构上来说,一个合格的区块应该像一颗二叉树,或者类似于生物谱系图,从爷爷辈到父辈到自己这辈整体看下来就是个分叉树,不过区块是个二叉的。这样的结构是因为区块本身是基于Merkel Tree这种数据结构来进行组织的,最下层是交易的【哈希】,往上是两个交易哈希的哈希,再往上是两个「两个交易哈希」的哈希的哈希。通俗点理解就是你的公司,最下面是干活的你;上面是看你干活的主管;再上面是主管的主管,看下级主管和干活的你,以此类推到CEO。
哈希
这里着重提一下【哈希/摘要】,哈希算法是一种基于哈希函数/散列函数的单项算法,具有定长性和不可逆性。定长是指无论你输入多长的数据,输出都是固定长度的字符串;不可逆性是指你无法通过输出的数据逆推出原本的输入。比如【码】,在加码的过程中,无论原本的数据多么内涵,输出的都是固定大小的色块,原本的数据信息其实是大量混淆并且丢失了的,你无法根据码后的数据恢复出码前的数据。
区块链
区块链本身是容易理解的,网上的许多图片都是一串大链子,由一个个区块串联而成。而且在每个区块生成的同时,它也已经被固定在区块链上,不需要额外生成一条链的过程。
我们在讲区块的时候忽略掉了一部分数据,就是关于当前区块在区块链上的高度,以及前区块的哈希值。有了这两个数据,每一个区块在所有的由区块构成的链式结构里都具有了位置的唯一性和数据的不可篡改性。
比如,小学组织出游,老师为了避免学生走丢,都让每个学生依次记住另一个学生。如果老师想查人,只要让每个学生查看邻边的学生即可。如果你中间想自己跑着玩,你邻边的学生立即就知道你不见了。
你可能会问,如果你偷偷把朋友也叫过来一起玩夹在你之后呢,但是每个学生也有自己的编号,如果你偷偷夹了朋友,那你朋友的编号必然要么跟你或者跟你的后一个人是重复的,这样也很容易发现。基于这样的组织形式,我们就从交易打包成区块,又从区块连接成了完整的区块链。
结语
以上从分布式系统中的账户生成、交易验证、区块结构、哈希算法等密码学角度,大致介绍了区块链技术的概念。
如果你还不能完全理解区块链时,就多品一品那些通俗易懂的例子。当以后有朋友问你区块链概念时,就用例子以说之。