一、什么是区块链?
说到区块链,就不得不说比特币。
2008年底,比特币之父中本聪发表了一个关于他研究的电子现金系统的九页白皮书,2009年初,中本聪在位于芬兰赫尔辛基的一个小型服务器上挖出了比特币的第一个区块——创世区块,并将当天泰晤士报头版一则关于救助银行的新闻标题写入创世区块,这也代表着比特币诞生了。
区块链是比特币的底层技术,它可以理解为一种公共记账的机制(技术方案),它并不是一款具体的产品。其基本思想是:通过建立一组互联网上的公共账本,由网络中所有的用户共同在账本上记账与核账,来保证信息的真实性和不可篡改性。而之所以名字叫做“区块”链,顾名思义,是因为区块链存储数据的结构是由网络上一个个“存储区块”组成一根链条,每个区块中包含了一定时间内网络中全部的信息交流数据。随着时间推移,这条链会不断增长。
图3:区块链是一种公共记账机制
1、区块链的特点
区块链具有去中心化、去信任化、可扩展、匿名化、安全可靠等特点。去中心化:由于区块链是靠各个节点共同实现系统的维护和保证信息传递的真实性,基于分布式存储数据,而没有某个中心进行集中管理,因此某一个节点受到攻击和篡改不会影响整个网络的健康运作。去信任化:任意两个节点之间建立连接不需要信任彼此的身份,双方之间进行数据交换无需互相信任的基础。由于网络中的所有节点都可以扮演“监督者”的身份,因此不用担心欺诈的问题。可扩展:区块链是一种底层开源技术,在此基础上可以实现各类扩展和去中心化、去信任化的应用。匿名化:数据交换的双方可以是匿名的,网络中的节点无需知道彼此的身份和个人信息即可进行数据交换。安全可靠:由于任意节点之间的活动均受到全网的监督,并且数据库采用分布式存储,对于黑客来说,第一无法伪装和进行欺诈活动,第二无法仅靠攻克某个节点而控制网络。
图4:区块链的特点
2、区块链的作用
下面以传统货币与比特币(数字货币)来介绍一下区块链所扮演的角色。
传统货币的交易模式中,银行管理账户采用的是中心化管理。由银行建立中心数据库,每个人的银行账户信息和以及账户里有多少余额都由银行进行集中管理。
举个例子:如A要转账一笔钱给B,需经过银行O进行验证、对账,再修改A、B的账户,将钱划给B。
图5:传统货币交易模式
而基于区块链技术的比特币交易模式则剔除了银行作为中心数据库的角色,每个比特币用户的电脑都是一个节点,每个节点都能存储数据,节点和节点之间相连形成了巨大的网络。
例如:A向周边节点广播:我要转账给B一个比特币。然后A将比特币的信息发给周边节点进行验证,周边节点确认A持有该比特币的合法性。当一定数量的节点验证通过后,交易成立,周边节点记录下这笔交易并确认比特币的新主人是B。周边的节点再向网络中其它节点进行广播,直至所有节点记录下这笔交易为止。
(图6:基于区块链的比特币交易模式)
比特币交易通过区块链技术提升了数据的真实性与不可篡改性。该系统依靠的是网络上多个参与者的公平约束,所以任意每几个节点的权利和义务都是均等的,而且每一个节点都会储存这个区块链上所有数据。即使该节点被损坏或遭受攻击,仍然不会对账簿造成任何威胁。同样地,当发生一笔交易时,全世界的用户都可以担当监管者的角色,如果大家不认可交易的合法性,则交易无法达成,区块链上的数据由大家集体去维护。
二、区块链的发展和应用
1.技术演进:区块链是怎么来的
》1982年
拜占庭将军问题
Leslie Lamport等人提出拜占庭将军问题(Byzantine Generals Problem),把军中各地军队彼此取得共识、决定是否出兵的过程,延伸至运算领域,设法建立具容错性的分散式系统,即使部分节点失效仍可确保系统正常 运行,可让多个基于零信任基础的节点达成共识,并确保资讯传递的一致性,而2008年出现的比特币区块链便解决了此问题。
David Chaum提出密码学网路支付系统
David Chaum提出注重隐私安全的密码学网路支付系统,具有不可追踪的特性,成为之后比特币区块链在隐私安全面的雏形。
》1985年
椭圆曲线密码学
Neal Koblitz和Victor Miller分别提出椭圆曲线密码学(Elliptic Curve Cryptography,ECC),首次将椭圆曲线用于密码学,建立公开金钥加密的演算法。相较于RSA演算法,采用ECC好处在于可用较短的金钥,达 到相同的安全强度。
》1990年
David Chaum基于先前理论打造出不可追踪的密码学网路支付系统,就是后来的eCash,不过eCash并非去中心化系统。
Leslie Lamport提出具高容错的一致性演算法Paxos。
》1991年
使用时间戳确保数位文件安全
Stuart Haber与W. Scott Stornetta提出用时间戳确保数位文件安全的协议,此概念之后被比特币区块链系统所采用。
》1992年
Scott Vanstone等人提出椭圆曲线数位签章演算法(Elliptic Curve Digital Signature Algorithm,ECDSA)
》1997年
Adam Back发明Hashcash技术
Adam Back发明Hashcash(杂凑现金),为一种工作量证明演算法(Proof of Work,POW),此演算法仰赖成本函数的不可逆特性,达到容易被验证,但很难被破解的特性, 最早被应用于阻挡垃圾邮件。Hashcash之后成为比特币区块链所采用的关键技术之一。
Adam Back于2002年正式发表Hashcash论文。
》1998年
Wei Dai发表匿名的分散式电子现金系统B-money
Wei Dai发表匿名的分散式电子现金系统B-money,引入工作量证明机制,强调点对点交易和不可窜改特性。不过在B-money中,并未采用Adam Back提出的Hashcash演算法。Wei Dai的许多设计之后被比特币区块链所采用。
Nick Szabo发表Bit Gold
Nick Szabo发表去中心化的数位货币系统Bit Gold,参与者可贡献运算能力来解出加密谜题。
》2005年
可重复使用的工作量证明机制(RPOW)
Hal Finney提出可重复使用的工作量证明机制(Reusable Proofs of Work,RPOW),结合B-money与Adam Back提出的Hashcash演算法来创造密码学货币。
》2008年
Blockchain 1.0:加密货币
数位货币与支付系统去中心化
比特币
Satoshi Nakamoto(中本聪)发表一篇关于比特币的论文,描述一个点对点电子现金系统,能在不具信任的基础之上,建立一套去中心化的电子交易体系。
》2012年
Blockchain2.0:智慧资产、智慧契约
市场去中心化,可作货币以外的数位资产转移,如股票、债券。如Colored Coin便是基于比特币区块链的开源协议,可在比特币在区块链上发行多项资产
》2014年
Blockchain 3.0:更复杂的智慧契约
更复杂的智慧合约,将区块链用于政府、医疗、科学、文化与艺术等领域
》2016年
Blockchain 2.5:金融领域应用、资料层
Blockchain2.5:强调代币(货币桥)应用、分散式帐本、资料层区块链,及结合人工智慧等金融应用
Blockchain 3.0:更复杂的智慧契约
更复杂的智慧合约,将区块链用于政府、医疗、科学、文化与艺术等领域。
2.区块链应用——比特币的发展
自2008年底首次提出,区块链技术和以比特币为代表的区块链应用在在短短8年间经历了飞速的发展。
图7:区块链发展大事记
3、万能的区块链
区块链未来应用空间巨大:从理论上说,围绕区块链这套开源体系能够创造非常丰富的服务和产品,比特币只是区块链巨大应用空间的冰山一角。
图8:区块链可能的应用
三、区块链5大关键技术
比特币区块链的关键核心技术,包括用Hashcash演算法来进行工作量证明,且交易过程采用椭圆曲线数位签章演算法来确保交易安全,并在每笔交易与每个区块中使用多次Hash函数以及Merkle Tree,同时也使用时间戳来确保区块序列
比特币区块链的关键核心技术,包括采用Hashcash演算法来进行工作量证明,让区块链中的各节点有机会参与验证,达到公正性,且交易过程采用椭圆曲线数 位签章演算法来确保交易安全,并在每笔交易与每个区块中使用多次Hash函数以及Merkle Tree,不只是为了节省储存空间,更重要的是藉由将前一个区块的Hash值加入新区块中,让每个区块环环相扣,也因此做到所谓的可追踪且不可窜改的特 性,同时也使用时间戳来确保区块序列,以下便依序解释这些关键技术。
关键技术 1
采用工作量证明达到去中心化及公正性
首先,最关键的便其工作量证明机制(Proof of Work,POW),这是一个可以让每个参与的节点可共同参与交易验证的方式,来实现一个能多方共同维护的单一系统,并共享同一份记录交易的帐本,以形成一个基于零信任基础,却能实现去中心化的P2P网路系统。
工作量证明是让任一运算节点,花费时间和运算资源来计算出一组数学公式的结果,且要完成一次有效的工作量证明,需经过一连串地尝试与失败。不过,一旦这个数值被算出来后,其他参与节点也可用相关的数学公式,便能很容易去验证这个值是否有效。
比特币区块链采用Hashcash演算法(杂凑现金演算法)作为工作量证明,让各节点经由POW计算来产生每一个有效的新区块,再经由其他节点验证并接受。
进行POW计算的过程也被称作挖矿,很多人用解一道数学题、或是解一个数独来形容,不过,怎样才是真的算出一个有效的新区块,这些节点到底在算什么?
由于每个区块中Block Header会包含许多固定的值,其中只有Nonce值为一随机值,因此每个节点进行POW计算时要算的就是,藉由不断替换这个Nonce值,来让这个区 块的Block Header Hash值,小于一个被设定好的难度目标值(Difficulty Target),至于为什么要小于这个目标值,则是因为这个难度值意味着每个区块在理论上应该要被产生完成。
这里提到的难度值 (Difficulty)是指,节点要运算出低于困难度目标值的Hash值,平均需花多久时间,也就是平均要完成一次POW的时间。而比特币区块链目前设 定为,大约每10分钟会有节点成功算出新的区块,不过这10分钟只是基于理论值,实际每个新区块产生的时间,有可能只需要17秒(第407062个区块的 实际产生时间),也有可能需要20分钟以上(第407068个区块的实际产生时间)。
Difficulty可动态调整,目前每产生2016个区块会调整一次难度,以每10分钟产生一区块估算,大约是每两周会调整一次Difficulty。 由于POW具有一定的难度,因此无法预期哪个运算节点可以最快算出新区块,藉此来确保交易验证的公正性。
关键技术 2
每笔交易采椭圆曲线数位签章演算法加密
比特币区块链便采用椭圆曲线数位签章演算法(ECDSA),与另一种RSA演算法,都属于公开金钥加密演算法(Public Key Cryptography),公开金钥加密技术在1970年代被发明,也称为双金钥密码安全系统,每个使用者会拥有公开金钥(Public Key)与私密金钥(Private Key)这两把钥匙,公开金钥可让其他人知道,而私密金钥则只有本人知道。当A要传送一笔讯息或交易给B时,需使用B的公开金钥来将这份交易加密,而这这 个加密过的讯息或交易,只有使用B的私密金钥才能解开。
在比特币区块链中,比特币区块链便采用椭圆曲线数位签章演算法,每一个比特币区块 链中的节点使用者,会同时拥有这两把金钥,以及一次性使用的比特币位址(Address),公开金钥可让区块链网络中的其他人知道,而私密金钥则须自行保管,可用来接收货币、进行电子签章或是发送货币,而Address就像电子邮件一样可用来当作存取比特币的地址,使用者可重复取得新的Address,且 可以在离线状态下产生,不过,每个Address只能使用一次。
在比特币区块链中,每一枚电子货币被视为一串数位签章,使用者要进行比特币交易时,必须将前一笔交易以及收款方的公开金钥经由Hash产生数位签章,加到电子货币那串数位签章的后方。
RSA 加密演算法是一种非对称的加密演算法,利用两个质数作为加密与解密用的两把钥匙,金钥长度约在40个位元到1024位元。不过比特币所采用的ECDSA能 算出更短的金钥长度,也就是能够使用相对较少的资源,做到与RSA相同的安全性。在ECDSA演算法中,由私密金钥算出公开金钥很容易,但要从公开金钥推 回私密金钥却很困难。
关键技术 3
Hashcash演算法及多种Hash函数确保资料不被窜改
前面提到比特币区 块链采用Hashcash演算法来进行工作量证明,Hashcash可将任意长度的资料经由Hash函数转换为一组固定长度的代码,原理是基于一种密码学 上的单向杂凑函数 (One Way Hash Function),这种函数很容易被验证,但是却很难破解,还回推出原本的值。先前Hashcash演算法也被用来做阻挡垃圾邮件的机制。
常使用的单向杂凑函数包括MD5、SHA-1、SHA-256、SHA-384及SHA-512等,MD5的Hash值长度为128位元,虽然广为使用,但 因长度不够较容易破解,SHA-1的Hash值长度有160位元,虽比MD5好但仍然不够安全,因此美国国家安全局(NSA)又提出多种更复杂的SHA- 2演算法,包括224、256、384、512位元长度的Hash值算法。
Hashcash最早在1997年由Adam Back提出,并于2002 正式发表一篇描述杂凑现金系统的论文。比特币区块链采用Hashcash来建立一套几乎无法被窜改的电子现金系统,每个区块的Block Header都会被Hash成一串很难被回推的代码后,放进下一个区块中,来确保区块的正确性。
关键技术 4
经由Merkle Tree将大量讯息缩短成一个Hash值
在 比特币区块链中,每笔交易产生后,都已经被Hash成一段代码才广播给各节点,不过这样做还不够,因为在各节点的区块中,可能包含数百笔到数千笔的交易, 因此,为节省储存空间并减少资源耗费,比特币区块链的设计原理采用Merkle Tree机制,让这些数百到数千笔的交易Hash值,经由两两一组形成一个新Hash值的方式,不断重复进行,直到最后产生一组最终的Hash值,也就是 Merkle Tree Root,这个最终的Hash值便会被记录到Block Header中,只有32 Bytes的大小。Merkle Tree机制可大幅减少资料传输量与运算资源消耗,验证时,只需验证这个Merkle Tree的Root值即可。
关键技术 5
用时间戳伺服器(Timestamp Server)确保区块序列
比特币采用时间戳伺服器机制(Timestamp Server),将每个区块Hash后加上一个时间戳(Timestamp)并发布出去,这个时间戳用来证明资料在特定时间的有效性,每一个时间戳章会与 前一个戳章一起进行Hash,这个Hash值会在与下一个时间戳章进行Hash,因此而形成一个用来确保区块序列的链条。
从一笔交易看区块链运作流程
在比特币区块链中,当一笔交易经由某个节点或钱包产生时,这笔交易需要被传送给其它节点来作验证。做法是将交易资料经由数位签章加密并经由Hash函数得出 一串代表此交易的唯一Hash值后,再将这个Hash值广播(Broadcast)给比特币区块链网络中的其它参与节点进行验证。
1)产生一笔新交易
一笔新交易产生时,会先被广播到区块链网络中的其它参与节点
2)各节点将数笔新交易放进区块
每个节点会将数笔未验证的交易Hash值收集到区块中,每个区块可以包含数百笔或上千笔交易。
3)决定由谁来验证这些交易
各节点进行工作量证明的计算来决定谁可以验证交易,由最快算出结果的节点来验证交易,这就是取得共识的做法。
4)取得验证权的节点将区块广播给所有节点
最快完成POW的节点,会将自己的区块广播给其他节点。
5)各节点验证并接上新区块
其他节点会确认这个区块所包含的交易是否有效,确认没被重复花费且具有效数位签章后,接受该区块,此时区块才正式接上区块链,无法再窜改资料。
6)交易验证完成
所有节点一旦接受该区块后,先前没算完POW工作的区块会失效,各节点会重新建立一个区块,继续下一回POW计算工作。
四、相关开源项目
目前当大家单独说到区块链的时候,就是指的区块链技术,是实现了数据公开、透明、可追溯的产品的架构设计方法,算作广义的区块链。而当在具体产品中谈到区块链的时候,可以指类似比特币的数据存储方式,或许是数据库设计,或许是文件形式的设计,这算作狭义的区块链。广义的区块链技术,必须包含点对点网络设计、加密技术应用、分布式算法的实现、数据存储技术的使用等4个方面,其他的可能涉及到分布式存储、机器学习、VR、物联网、大数据等。狭义的区块链仅仅涉及到数据存储技术,数据库或文件操作等。本文的区块链,指的是广义的区块链。
架构图
从架构设计上来说,区块链可以简单的分为三个层次,协议层、扩展层和应用层。其中,协议层又可以分为存储层和网络层,它们相互独立但又不可分割。如图:
(1)C/C++
这两个语言是无法逾越的,任何开发遇到瓶颈,基本上都会找到它们,自然应该排在第一位要介绍的。同时,区块链技术的鼻祖,比特币(协议层)就是用C++语言开发的,而且目前为止,没有比比特币更加成功的区块链产品。所以,无论你使用什么语言开发,在正式进入这个行业的过程中,都应该先研究研究比特币。比特币官方客户端钱包用的Qt,第三方钱包有Python语言开发的,特别是第三方整理的开发库(Api包)很多是Nodejs设计的。比特币的架构,与上面的架构设计基本相同,另外,因为共识算法采用的是工作量证明机制(PoW:Proof of work),还有一些特殊的挖矿的过程。其他竞争币都是直接来自比特币的分支,所以编程语言相同,具体的技术选型和技术实现上可能有所改进,比如:莱特币,使用了其他的加密算法。
官方网站:https://bitcoin.org/
源码库:https://github.com/bitcoin
(2)Nodejs/Javascript
Nodejs平台强大的网络编程能力,以及js脚本语言的简单快捷,在区块链领域自然少不了它的身影。亿书便是这样一个区块链产品,亿书币是它的协议层,使用了著名的express开发框架,基于http协议开发而成。同时,它采用了授权股权证明机制(DPoS),算法上的改进,让它在处理交易时更加轻量,处理能力大大提升。它提供了强大的协作机制,为数字出版、版权保护提供了便利;扩展了侧链功能,可以基于它开发任何去中心化的应用,从而为专业作者、博客爱好者和开发者提供很多方便。《Nodejs开发加密货币》这本书完整分享了它的源码,从区块链基础概念到代码实现,从基本原理到开发设计思路,都做了比较详细的探索,目前为止,从协议层面深入代码讲解区块链技术实现的书籍极少,这算作一本。
源码库:https://github.com/Ebookcoin
(3)Python
如果是Python语言爱好者,我建议研究研究以太坊(Ethereum)的Python实现。尽管因为The Dao事件闹得沸沸扬扬,但从技术实现的角度来说,仍然值得参考学习。以太坊官方定位为一种开发管理分布式应用的平台,主攻方向就是“智能合约”,并为其定制了一种编程语言Solidity。以太坊的核心是以太坊虚拟机(EVM),允许用户按照自己的意愿创建操作。以太坊给出了Go、Java、Python等多语言的实现。其中以python为基础的实现主要包括三个部分:Pyethapp是客户端部分;pyethereum是核心库,实现了区块链、以太坊模拟机和挖矿等功能;pydevp2p是点对点网络库,实现了节点发现、合约代码传输、加密签名等功能,这三者组合在一起就是完整的区块链实现,后面两个核心库共同组成了协议层。另外,go-ethereum是go语言的完整实现;Ethereum(J) 是纯Java实现,它作为可以嵌入任何Java/Scala项目的库提供。客户端方面,还有Rust、Ruby、Javascript等语言的实现。
源码库:https://github.com/ethereum/pyethapp
(4)Go
在多核时代,Go语言备受喜爱,它可以让你用同步方式轻松实现高并发,特别是在分布式系统、网络编程等领域,应用非常广。所以,在区块链开发领域,也有很多使用Go语言的项目。其中,由linux基金会主导的超级账本(HyperLeger),版本库的名字叫Fabric,就是其中一个。该项目试图为新一代的事务应用创建一种开放的分布式账本标准,支持许可式区块链(这种方式可能无法再现比特币那种强大的网络效应)。Fabric的开发环境建立在VirtualBox虚拟机上,部署环境可以自建网络,也可以直接部署在BlueMix上,部署方式可docker化,支持用Go和JavaScript开发智能合约。它采用PBFT分布式算法,网络编程方面用gRPC来做P2P通讯,使用 Protocol Buffer来序列化要传递的数据结构。在架构设计上,Fabric可能与比特币等区块链产品有所不同,但是上述基本组成部分还是不可或缺的。
官方网站:https://www.hyperledger.org/
源码库:https://github.com/hyperledger
(5)C#
众多语言,怎能少了微软的C#,C#是企业级应用的首选,以其最好用的代码编辑器没有之一,以及持续的版本升级优化,成为开发效率最高的编程语言,应对各种新技术毫无压力。