区块链的原理与机制
2008年10月,一篇署名中本聪(Satoshi Nakamoto)的论文《比特币——一种点对点的电子现金系统》出现在了一个小众的密码学网站metzdowd.com的邮件列表中,两个月之后,比特币的开源软件悄然现身互联网。这就是区块链的起点,理解区块链要从理解比特币开始。下文将对比特币的原理和机制进行通俗概要的解释。
密码学基础
比特币是在密码学基础上通过一系列机制设计,实现的一种电子现金系统。在论文中,中本聪对这一系列机制设计进行了完整的解释。但这篇论文的读者是面向密码极客们,其中没有对其密码学基础做任何解释,而要使普通读者理解,就必须首先对比特币所涉及的密码学基础知识进行简要的解释。
区块链的密码学基础,最重要的有两个:哈希函数和非对称加密算法。
1.哈希函数
哈希函数(Hash Function)是一种音译,也可以被译为散列函数、杂凑函数。区块链领域里目前使用的主要为安全哈希算法(Secure Hash Algorithm,缩写SHA),其中以SHA-2系列算法为主,而 SHA-2算法根据输出长度,又被分为SHA-224、SHA-256、SHA-384、SHA-512等,这些算法都是由美国国家安全局(NSA)设计,由美国国家标准与技术研究院(NIST)发布的,其中比特币使用的就是其中的SHA-256算法。
对哈希函数的最简单解释,就是把输入值映射为一个固定长度的数字摘要。它的输入值可以是任意的,一切可以被数字化的东西,电影、图片、音乐、文字、合约、代码都可以,输出值则是一个固定长度的二进制数字。这种映射关系,就像人和他的指纹,人是输入值,指纹就是输出值,是这个人的映射。
哈希函数有两个主要特点:
一是不能倒算。正向运算哈希函数,快速简单,但倒算却不可能实现,也就是说不可能通过输出值算出输入值,如果一定要找出输入值,只能通过穷举法,把可能的输入值依次尝试,直到找出正确的输入值,但由于输入空间无限,事实上,这在现实中是不可能的。延续之前的比喻,不能倒算可以被想象为这样的关系:取一个人的指纹很容易,但靠指纹算出这个人的信息则是不可能的。
二是不可能人为制造哈希碰撞(Hash collision)。碰撞是指两个输入值不相同,但输出值相同的情况。因为输入值的范围无限,但输出值的范围有限,所以碰撞理论上一定存在的。以SHA-256算法为例,它的输出值是一个256位的二进制数字,存在2256种可能,理论上进行2130次输入就会有99%的可能性发生一次碰撞,不过既使用人类制造的所有计算机自宇宙诞生一直运算到现在,发生一次碰撞的几率也可以忽略不计。继续比喻,不可碰撞就是说:虽然只要有无限多数量的人,就有可能出现两个指纹相同的人,毕竟理论上构成指纹的原子数量是有限的,其排列组合方式因而也是有限的,但要以人工方法找到这两个人则是不可能的。
基于这两个特点,哈希算法就能为任何数据提供一个唯一、对应的摘要,比喻的说也可以叫做为任何数据算出一个指纹。这就是哈希算法的主要用途。
2.非对称加密
加密的办法分两种,对称的和非对称的。简单的说,如果加密和解密用相同的密钥,就是对称加密,如果不同,则是非对称加密。
对称加密也可能是安全的,但前提是能够安全传输密钥。比如上级和特工之间共用同一个密码本,只要密码本不泄露,那密文泄露也没事,但密码本一旦被敌人掌握,那就一切皆休。上级和特工之间可以有秘密通道传输密码本,但在现实的、开放的互联网环境中,只要传输密钥,就无法保证安全。
在开放的传输环境中,实现安全的加密,就需要非对称加密算法。非对称加密中,需要公钥和私钥两种密钥,公钥与私钥一一对应,公钥公开,私钥保密。如果使用公钥对内容加密,那么就只有用这个公钥对应的私钥才能解密,只要私钥不泄露,那这个内容就是安全的;同样反过来,如果用私钥加密内容,那么人人都可以用对应的公钥加以解密获得内容,也就可以确知,这个内容必定是由这个公钥的掌握者发出,而不可能来自任何其他人。
如果甲说,他向乙转了一块钱,别人如何验证这确实是甲说的,并且钱确实是转给乙的,而数额也没有被任何人改动过呢?甲就可以把这条转钱的信息取哈希值,发信息时,把这个哈希值用私钥加密后随信息一起发出去,这样,任何人都可以重新计算信息的哈希值,并和用甲的公钥解密出的哈希值对比,对原来信息的任何改动都会使哈希值发生变化,因而发生不一致。如果一致,就说明信息的内容不可能被修改过,而且这个信息也只可能是甲发出的,这个过程就实现了甲对自己发出的信息的签名验证。
区块和链
事实上,不论哈希函数还是非对称加密算法,在2008年中本聪论文发表时都已不是新鲜事物。较早期的哈希函数MD4(MD为Message Digest,信息摘要的缩写)在1990年就被麻省理工的一位教授设计出来了;非对称加密算法则在1978年就被发明了。在当代的网络技术中,这两种算法实际都已经得到了广泛的应用。
比特币的特别之处,就在于它通过一系列的机制设计,通过区块和链的数据结构,首次实现了一种可行的电子货币系统。
比特币的设计,目的在于建立一个电子货币系统,它需要记录每一单位的比特币来自哪里,谁曾经拥有,又花给了谁,从被创造到当下所经历的一切交易的全部信息。这需要记账,而且这个账本需要被全网认可,没有歧义,这就需要共识机制。
比特币怎么记账呢?首先,任何人都可以发起交易,只要他下载了比特币的软件,生成了一个公私钥对,公钥就是他的地址,或者叫钱包,私钥就是钱包的密码。
他可以用私钥签名发起任何交易,并且向全网广播。任何试图记账的人都可以收集这些交易,并将它们打包成块。所谓打包成块,就是把收到的交易数据的哈希值按时间时间顺序两两合并,再取哈希值,然后把第二层的哈希值继续两两合并取哈希值,如此持续,直到算出一个把所有交易都容纳进去的最终的哈希值(Merkle Root,根哈希值),这个过程,从交易内容,到层层的哈希值,到最终的跟哈希值合起来,就组合成了一个二叉的Merkle Tree(译为默克尔树或可信树),这就是一个区块体的内容。
区块体就是记录其所对应的成块时间内的交易的分账本,这个分帐本的根哈希值加上前一个区块的哈希值、区块链的版本号、本区块的时间戳、当前区块链的难度系数和一个随机数,就组成了这个区块的区块头,区块头和区块体合起来就是一个区块,由于每一个区块都含有前一个区块的哈希值(一般称为哈希指针),所以每一区块都和其之前的一个区块唯一地不可更改地连接,这样一个个相连的区块就构成了区块链。
什么样的交易能被收录到块里呢?必须是合法的交易,也就是这个交易所花的钱,确实是花钱者的,并且没有被花过,由于自从整个区块链建立以来所有交易都被记录在链上,所以每一个交易是否合法很容易被验证。任何新的区块所包含的所有交易必须都是合法的,包含了不合法的交易的区块会因被其他节点放弃而无效。
谁来打包成块呢?这是记账权归谁的问题。区块头里有一个随机数,它的用途就在这里。打包者需要算出这个随机数,使本区块的哈希值符合难度系数,也就是这个哈希值的前N位必须是零。哈希函数无法倒算,所以这个满足难度系数的随机数必须通过一个一个的尝试来获得,谁先发现这个随机数,谁就可以打包这个区块,把它接到链上。
如果有两个人同时算出随机数呢?两个人都会把自己打包的区块接到链上,这就会使链产生分叉。那么,接下来两个分叉,哪一个后续接的区块多,形成最长合法链,哪一个就会成为主链被全网认可,这就是比特币的最长链原则。所以,最终还是只有其中一个区块被认可。同理,如果有人想把同一份钱花两次,首先这两个交易在同一个区块里只有其中之一会被接纳,任何一个被接纳后,另一个就成为非法的;第二,如果两个交易分别被不同的打包者接纳,那么两个区块也只有其中之一最终被主链接纳。所以,通常比特币的交易者都会在自己的交易被收录进链之后,再等几个块才算交易完成。
比特币是怎样产生的呢?来自出块奖励。算成块所需的随机数是一个对算力要求很高的工作,为了鼓励参与者,比特币设计了出块奖励。谁打包这个块,全网就认可这个人的钱包多出了一定数量的比特币。这个数量在开始时是50个比特币,之后每21万个区块减半(约合4年),在2012年减为了25个币,在2016年减为了12.5个币,之后,出块奖励还将继续每4年左右减半一次,最终比特币的总数量将会在到2140年10月的某天终结于2100万个。
由于计算随机数是一个极其消耗算力的过程,2009年1月3日,中本聪发布了比特币的第一个区块,之后六天,他才算出了第二个区块。比特币的这个共识机制形成过程又叫做工作量证明(Proof of Work,POW),所有参与者获得出块奖励的概率,实际就是他所掌握的算力在全网算力中的比例。计算随机数,获得出块奖励,这个过程就是俗称的“挖矿”。
参与挖矿的算力是变化的,但出块的时间需要大致保持在10分钟左右,这一点通过调节难度系数来完成,这个难度系数就取决于所要求的前N位为零的目标哈希值,N越大,在规定时间算出随机数所需要的算力就越大,挖矿难度也就越大。
区块链的特点
基于上面的描述,那么关于区块链常见的提法:匿名、点对点传输、公开透明、去中心化、信任机制等等各种说法就不难理解了。
参与区块链,只需要一个公私钥对,谁掌握公钥对应的私钥,谁就是这个公钥地址(钱包)的所有者,任何人都可以拥有任意数量的钱包,记住私钥就行,和参与者是何许人,在哪里毫无关联。
交易是点对点的,或者说是一个地址对另一个地址的,交易信息全网公开,全网可查询,全网一起维护,因而也就不存在一个中心管理者。
在没有中心管理者的条件下,区块链又通过一系列的机制设计确保链上信息可靠、可信任,这一系列的机制设计就构成了区块链的共识机制。
实际上,目前区块链相对于比特币区块链已经有了很多发展。
比如智能合约,哈希函数能把任何数字内容转化为一个数字摘要,一段代码、一个程序当然也可以。把合约程序化,然后把程序的输出上链就成为了智能合约。事实上,作为一种数据结构的区块链,不止可以被设计用来作为一种电子货币系统,也不止是一种智能合约的实现方式,它能为分散的、无需任何组织认证背书、相互完全陌生的使用者,提供一种对任何数字信息,建立可靠的、不可更改的记录和鉴证方式的系统。区块链的演化方向及潜在的应用场景可能还有很多,当前已经有了不少有益探索,但更多可能还需要在未来慢慢探索。
比如POS(Proof of stake,权益证明)。比特币的POW是一种经典的共识机制,但用工作量对记账权进行投票所需的算力竞争,意味着巨大的能源消耗,POS则是用币龄替换了POW中的算力,币龄是指持有的电子货币数量与持有时间的乘积,单个节点的币龄越大,它获得记账权和出块激励的可能性就越大。
比如公链、私链、联盟链。比特币是典型的公链,数据全网公开,所有节点随意加入和退出,因此也称为非许可键;私链则一般非公开,需要授权才能加入节点,链上只有少量节点,只需要单个或部分节点来验证交易;联盟链则是由若干机构或组织共同发起和维护的链,比如Libra的初始设计就是联盟链。后两者因为节点准入设计,所以也被称为许可链。■
(段夕华,阿里本地生活资深架构师/责编 张栋)