一、区块链技术概述
区块链技术的核心思想与密码朋克组织的渊源很深,这个组织由一批致力于个人隐私保护的密码学爱好者组成,他们认为在互联网环境下想要保护个人隐私,应该使用基于技术的而非其他组织背书的加密方法,不能够全部依靠大型机构提供的加密工具,以免个人隐私问题受到侵犯。中本聪作为密码朋克组织中一员创造了区块链系统。这个组织中除了中本聪外,还有许多著名的信息自由主义者,例如”维基解密”的创始人朱利安·保罗·阿桑奇(Julian Paul Assange)、Facebook的创始人之一肖恩·帕克(Sean Parker)、BT下载的创始人布拉姆·科恩(Bram Cohen)等。如今,密码朋克们的作品,大多已经成为互联网时代价值传输的底层协议,而前密码朋克时代传承至今的RSA等加密技术,在区块链系统中作为核心技术被应用。
二、区块链技术原理
1. 区块链基础运行原理
区块链技术不同于大数据与云计算等信息技术,它的原理更加复杂且会涉及到密码学原理。为了更清楚地描述区块链技术,我们先从区块链技术最初也是最典型的应用实例讲起,其机制可以帮助大家更好地理解区块链的运行原理。
(1)区块构建
区块链系统用户节点参与维护区块链网络的行为需要被激励,激励的手段就是向其发放数据认证,从而使区块链中的用户节点都会愿意为此做出维护行为,但维护行为的需求是有限的,那么到底挑选谁来进行这次维护呢?共识机制由此产生。其为一种利用计算机硬件进行数学运算的行为,是区块链网络挑选单次网络维护(记账)节点的一种手段,谁在最短的时间内计算出了正确的结果,谁就拥有此次记账的权利,并将在记账完成后获得激励。用户在进行共识计算时需要投入很多的成本,包括硬件成本、时间成本、电力成本等,区块链网络使用的这种挑选网络维护节点的机制,被称为POW(工作量证明)机制。
在理解了网络维护人的挑选机制后,区块链网络维护原理也就容易理解了。区块链网络中的每次数据更新都会带来一条新的数据记录,而同时发生数据变化方会在网络中进行广播,当其他用户收到了广播后基于将把数据记录在信息池中,当信息池中占用的空间达到1M后,数据会被打成一个含有验证签名(数学运算结果)的数据包,即区块。区块中的验证签名是基于POW机制下的计算结果生成的,且包含了对前一区块的验证签名的验证,那么每一个区块都有唯一确定的前一个区块,即所有区块都是有前后顺序的。这些区块按照时间顺序串联记录在每个用户的本地存储空间中,形成链状的数据存储结构,即账本。每段时间新产生的区块由被POW机制选出来的网络维护节点(记账节点)来进行串联操作(记账),并广播给所有用户节点使其验证并添加这个新区块,以保证网络中的所有节点有相同的数据记录。
现在我们互补了解区块链系统的基本机制了,即所有用户都拥有相同的链状数据记录,并且新的数据会由pow机制选择记账节点进行记账并广播进行全网同步。那么在这种以算力强弱来决定谁记录数据的机制下,若恶意节点想要篡改某一个区块的数据,它必须在很短的时间内,把篡改目标区块以及之后所有的区块都重新计算一遍验证签名,再把新生成的账本同步给其他人。又因为区块链网络一般中规定最长链才是正确的链,所以恶意节点还必须在赶上现有区块的高度的同时,让自己篡改后的账本成为最长链,误导其他用户节点认为其新账本是正确的账本。而在恶意节点进行这些计算和操作的同时,其他矿工们已经在原链上继续向后记账了,且就算其达到这些要求,其新账本还需要其他节点验证通过才能成功进行账本同步。这几乎是不可能办到的事情。
(2)区块内容确认
在区块链网络中,只有最终记录在主链上的数据才是有效的内容。每一条数据都需要进行全网的确认,验证失败的异常数据会被直接丢弃,而通过验证的数据则会被节点记录在信息池中,然后形成区块。但由于复杂的网络拓扑结构,每个节点新生成区块中的数据顺序或数据集合可能不同,基于前文关于共识机制的介绍可知,只有记账节点可以进行记账操作,以确定唯一的区块。但有网络延迟的情况下,还有可能出现节点同时收到两个有效区块的情况,这时节点的账本将呈Y字型分叉,同时在这两个分叉上记录后面的数据,直到一条分叉先达到一定的长度的被选为主链,而另一条分叉将自动被舍弃。
在经历了反复的确认与筛选后,区块内容的数据才会最终出现在主链上,完成数据确认的过程。这往往会经历比较长的时间,包括数据传输、数据验证等的较短时间与共识计算与分叉筛选等的较长时间,平均在十分钟左右。因此数据确认时间过长的是区块链的一个缺点,它使区块链难以进行实时支付,而缩短数据确认时间也成为了区块链技术发展的重要方向。
(3)账户管理
纸币不存在账户管理的问题,因为它是有实体的,谁持有纸币实体,纸币就自然归属于谁,但在电子信息时代,账户管理是一个复杂的问题。对于银行来说,每个账户都与客户的身份信息联系在一起,客户通过身份核验后作为该账户唯一对应的所有人,通过银行卡、信用卡、手机银行等媒介发起这个账户的支付指令,而这个账户的余额、数据记录等信息一般被存储在银行的多个数据库中进行备份,以免出现意外的情况。而对于区块链来说,账户与用户的真实身份无关,账户也不包含任何数据信息,只有一对公钥和私钥。公钥与私钥的概念涉及到密码学知识,这里只需知道私钥可以计算出公钥,公钥不能反推私钥,但可以验证私钥是否与自己匹配。
区块链网络在进行登录时,需要验证的就是账户的私钥,私钥是用户对账户所有权的唯一证明。那么一个人可以拥有多个区块链账户,只要记住每个账户的私钥即可。而账户名又称账户地址,是由账户的公钥进行运算推导后,得出的一串数字地址,有了对方的账户地址后就可以对其发起数据更改,或是查询其数据记录等。这么看来,可以将区块链账户的公私钥理解为用户名和密码,只是用户名可以由密码计算推导出来,用户名又可以独立对密码进行验证,而对外公开的账户名又是依据用户名推导出来的。
除了账户验证方式不同之外,区块链并不单独记录账户余额,每次查询账户余额都基于之前的数据记录重新计算得出。因为一个用户可以拥有无数个区块链账户,那么区块链账户的总量可能是无限大的。而如果想要保存每个账户的余额,基于前面所讲的区块链网络运行原理,就需要在每个用户节点的账本中都实时记录所有账户的余额,也就是说每一个区块里都要有当前所有账户余额的数据。这将占用区块的很多空间,且在验证区块的时候需要对每个账户的余额进行追溯验证,这将大大降低区块的验证效率。既然区块链网络中的每一个节点都有相同的全部数据记录,那么只需在本地对此账户的全部数据进行追溯和计算,就可以得到其当前的账户余额信息。
2. 区块链数据结构
区块链在本质上是一种分布式的存储系统,由于其采用了两方数据记账式的存储模型,也可以称其为分布式记账系统。其链式的存储结构如下图所示:
图1 单区块结构
每个区块都包含3个部分,分别是区块头、数据数量和数据列表。数据列表是区块的核心内容,列表承载了上个区块生成后至这个区块生成的这段时间内全部的数据;数据数量是对本区块数据条数的声明ÿ