从概念到底层技术,⼀⽂看懂区块链架构设计(附知识图谱)前⾔
区块链作为⼀种架构设计的实现,与基础语⾔或平台等差别较⼤。区块链是加密货币背后的技术,是当下与VR虚拟现实等⽐肩的热门技术之⼀,本⾝不是新技术,类似Ajax,可以说它是⼀种技术架构,所以我们从架构设计的⾓度谈谈区块链的技术实现。
⽆论你擅长什么编程语⾔,都能够参考这种设计去实现⼀款区块链产品。与此同时,梳理与之相关的知识图谱和体系,帮助⼤家系统的去学习研究。
基本概念
区块链的概念最近很⽕,它来⾃于⽐特币等加密货币的实现,但是⽬前,这项技术已经逐步运⽤在各个领域。什么是区块链技术?为了感性认识这个问题,我们可以使⽤⾕歌地球的例⼦做类⽐,ajax不是什么新技术,但组合在⼀起就成就了产品⾕歌地球,与之类似,区块链也不是什么新技术,但与加密解密技术、P2P⽹络等组合在⼀起,就诞⽣了⽐特币。技术⼈员,特别是Web开发⼯程师,学习了解ajax技术最早是被⾕歌地球酷炫的效果所吸引。⽽现在,历史再⼀次重演,很多⼈被⽐特币的疯狂发展所吸引,进⽽开始研究其背后的技术——区块链。
区块链原本是⽐特币等加密货币存储数据的⼀种独特⽅式,是⼀种⾃引⽤的数据结构,⽤来存储⼤量交
易信息,每条记录从后向前有序链接起来,具备公开透明、⽆法篡改、⽅便追溯的特点。实际上,这种特性也直接体现了整个⽐特币的特点,因此使⽤区块链来概括加密货币背后的技术实现是⾮常直观和恰当的。区块链是⼀项技术,加密货币是其开发实现的⼀类产品(含有,也有不含的区块链产品),不能等同或混淆。与加密货币相⽐,区块链这个名字抛开了的概念,更加形象化、技术化、去政治化,更适合作为⼀门技术去研究、去推⼴。
所以,⽬前当⼤家单独说到区块链的时候,就是指的区块链技术,是实现了数据公开、透明、可追溯的产品的架构设计⽅法,算作⼴义的区块链。⽽当在具体产品中谈到区块链的时候,可以指类似⽐特币的数据存储⽅式,或许是数据库设计,或许是⽂件形式的设计,这算作狭义的区块链。⼴义的区块链技术,必须包含点对点⽹络设计、加密技术应⽤、分布式算法的实现、数据存储技术的使⽤等4个⽅⾯,其他的可能涉及到分布式存储、机器学习、VR、物联⽹、⼤数据等。狭义的区块链仅仅涉及到数据存储技术,数据库或⽂件操作等。本⽂的区块链,指的是⼴义的区块链。
架构图
从架构设计上来说,区块链可以简单的分为三个层次,协议层、扩展层和应⽤层。其中,协议层⼜可以分为存储层和⽹络层,它们相互独⽴但⼜不可分割。如图:
blockchain_overview
协议层
所谓的协议层,就是指代最底层的技术。这个层次通常是⼀个完整的区块链产品,类似于我们电脑的操作系统,它维护着⽹络节点,仅提供Api供调⽤。通常官⽅会提供简单的客户端(通称为钱包),这个客户端钱包功能也很简单,只能建⽴地址、验证签名、转账⽀付、查看余额等。这个层次是⼀切的基础,构建了⽹络环境、搭建了交易通道、制定了节点奖励规则,⾄于你要交易什么,想⼲什么,它⼀概不过问,也过问不了。典型的例⼦,⾃然是⽐特币,还有各种⼆,⽐如莱特币等,本书介绍的亿书币也是。这个层次,是现阶段开发者聚集的地⽅,这说明加密货币仍在起步当中。
从⽤到的技术来说,协议层主要包括⽹络编程、分布式算法、加密签名、数据存储技术等4个⽅⾯,其中⽹络编程能⼒是⼤家选择编程语⾔的主要考虑因素,因为分布式算法基本上属于业务逻辑上的实现,什么语⾔都可以做到,加密签名技术是直接简单的使⽤(请看书中相关的加密解密⽂章,不建议⾃由发挥,没有过多的编码逻辑),数据库技术也主要在使⽤层⾯,只有点对点⽹络的实现和并发处理才是开发的难点,所以对于那些⽹络编程能⼒强,对并发处理简单的语⾔,⼈们就特别偏爱。也因此,Nodejs开发区块链应⽤,逐渐变得更加流⾏,Go 语⾔也在逐渐兴起。
上⾯的架构设计图⾥,我把这个层⾯进⼀步分成了存储层和⽹络层。数据存储可以相对独⽴,选择⾃由度⼤⼀些,可以单独来讨论。选择的原则⽆⾮是性能和易⽤性。我们知道,系统的整体性能,主要
取决于⽹络或数据存储的I/O性能,⽹络I/O优化空间不⼤,但是本地数据存储的I/O是可以优化的。⽐如,⽐特币选择的是⾕歌的LevelDB,据说这个数据库读写性能很好,但是很多功能需要开发者⾃⼰实现。⽬前,困扰业界的⼀个重⼤问题是,加密货币交易处理量远不如现在中⼼化的⽀付系统(银⾏等),除了I/O,需要全⽅位的突破。
分布式算法、加密签名等都要在实现点对点⽹络的过程中加以使⽤,所以⾃然是⽹络层的事情,也是编码的重点和难点,《Nodejs开发加密货币》全书分享的基本上就是这部分的内容。当然,也有把点对点⽹络的实现单独分开的,把节点查、数据传输和验证等逻辑独⽴出来,⽽把共识算法、加密签名、数据存储等操作放在⼀起组成核⼼层。⽆论怎么组合,这两个部分都是最核⼼、最底层的部分,都是协议层的内容。
扩展层
这个层⾯类似于电脑的驱动程序,是为了让区块链产品更加实⽤。⽬前有两类,⼀是各类交易市场,是法币兑换加密货币的重要渠道,实现简单,来钱快,成本低,但风险也⼤。⼆是针对某个⽅向的扩展实现,⽐如基于亿书侧链,可为第三⽅出版机构、论坛⽹站等内容⽣产商提供定制服务等。特别值得⼀提的就是⼤家听得最多的“智能合约”的概念,这是典型的扩展层⾯的应⽤开发。所谓“智能合约”就是“可编程合约”,或者叫做“合约智能化”,其中的“智能”是执⾏上的智能,也就是说达到某个条件,合
约⾃动执⾏,⽐如⾃动转移证券、⾃动付款等,⽬前还没有⽐较成型的产品,但不可否认,这将是区块链技术重要的发展⽅向。
扩展层使⽤的技术就没有什么限制了,可以包括很多,上⾯提到的分布式存储、机器学习、VR、物联⽹、⼤数据等等,都可以使⽤。编程语⾔的选择上,可以更加⾃由,因为可以与协议层完全分离,编程语⾔也可以与协议层使⽤的开发语⾔不相同。在开发上,除了在交易时与协议层进⾏交互之外,其他时候尽量不要与协议层的开发混在⼀起。这个层⾯与应⽤层更加接近,也可以理解为B/S架构的产品中的服务端(Server)。这样不仅在架构设计上更加科学,让区块链数据更⼩,⽹络更独⽴,同时也可以保证扩展层开发不受约束。
从这个层⾯来看,区块链可以架构开发任何类型的产品,不仅仅是⽤在⾦融⾏业。在未来,随着底层协议的更加完善,任何需要第三⽅⽀付的产品都可以⽅便的使⽤区块链技术;任何需要确权、征信和追溯的信息,都可以借助区块链来实现。我个⼈觉得,这个⽬标应该很快就能实现。
应⽤层
这个层⾯类似于电脑中的各种软件程序,是普通⼈可以真正直接使⽤的产品,也可以理解为B/S架构的产品中的浏览器端(Browser)。这个层⾯的应⽤,⽬前⼏乎是空⽩。市场亟待出现这样的应⽤,引爆市场,形成真正的扩张之势,让区块链技术快速⾛进寻常百姓,服务于⼤众。⼤家使⽤的各类轻钱包
(客户端),应该算作应⽤层最简单、最典型的应⽤。很快,亿书将基于亿书⽹络推出⽂档协作⼯具,这个就是典型的应⽤层的产品。
限于当前区块链技术的发展,亿书只能从协议层出发,把⽬标指向应⽤层,同时为第三⽅开发者提供扩展层的强⼤⽀持。这样做既可以避免贪多,⼜可以避免⽆法落地,是真正理性的开发路线。因为纯粹的开发协议层或扩展层,⽆法真正理解和验证应⽤层,会脱离实际,让第三⽅开发者很难使⽤。如果仅仅考虑应⽤层,市⾯上⼜不到真正牢固、易⽤的协议层或扩展层的产品。所以,我们只好全⾯发⼒,采取完全开源开放的态度,通过社区的⼒量,共同去做⼀件有意义的事情,也算为中国区块链技术发展做点技术积累和微薄贡献。
编程实现
很多⼩伙伴,习惯结合⾃⼰的技术背景,来理解上⾯的架构设计。这⾥,结合具体的编程语⾔,简单介绍⼏款产品,仅供参考。
(1)C/C++
这两个语⾔是⽆法逾越的,任何开发遇到瓶颈,基本上都会到它们,⾃然应该排在第⼀位要介绍的。同时,区块链技术的⿐祖,⽐特币(协议层)就是⽤C++语⾔开发的,⽽且⽬前为⽌,没有⽐⽐
特币更加成功的区块链产品。所以,⽆论你使⽤什么语⾔开发,在正式进⼊这个⾏业的过程中,都应该先研究研究⽐特币。⽐特币官⽅客户端钱包⽤的Qt,第三⽅钱包有Python语⾔开发的,特别是第三⽅整理的开发库(Api包)很多是Nodejs设计的。⽐特币的架构,与上⾯的架构设计基本相同,另外,因为共识算法采⽤的是⼯作量证明机制(PoW:Proof of work),还有⼀些特殊的挖矿的过程。其他竞争币都是直接来⾃⽐特币的分⽀,所以编程语⾔相同,具体的技术选型和技术实现上可能有所改进,⽐如:莱特币,使⽤了其他的加密算法。
官⽅⽹站:
源码库:
(2)Nodejs/Javascript
Nodejs平台强⼤的⽹络编程能⼒,以及js脚本语⾔的简单快捷,在区块链领域⾃然少不了它的⾝影。亿书便是这样⼀个区块链产品,亿书币是它的协议层,使⽤了著名的express开发框架,基于http协议开发⽽成。同时,它采⽤了授权股权证明机制(DPoS),算法上的改进,让它在处理交易时更加轻量,处理能⼒⼤⼤提升。它提供了强⼤的协作机制,为数字出版、版权保护提供了便利;扩展了侧链功能,可以基于它开发任何去中⼼化的应⽤,从⽽为专业作者、博客爱好者和开发者提供很多⽅便。《Nodejs开发加密货币》这本书完整分享了它的源码,从区块链基础概念到代码实现,从基本原理到
开发设计思路,都做了⽐较详细的探索,⽬前为⽌,从协议层⾯深⼊代码讲解区块链技术实现的书籍极少,这算作⼀本。
官⽅⽹站:
源码库:
(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等语⾔的实现。
官⽅⽹站:
源码库:
(4)Go
在多核时代,Go语⾔备受喜爱,它可以让你⽤同步⽅式轻松实现⾼并发,特别是在分布式系统、⽹络编程等领域,应⽤⾮常⼴。所以,在区块链开发领域,也有很多使⽤Go语⾔的项⽬。其中,由linux基⾦会主导的超级账本(HyperLeger),版本库的名字叫Fabric,就是其中⼀个。该项⽬试图为新⼀代的事务应⽤创建⼀种开放的分布式账本标准,⽀持许可式区块链(这种⽅式可能⽆法再现⽐特币那种强⼤的⽹络效应)。Fabric的开发环境建⽴在VirtualBox虚拟机上,部署环境可以⾃建⽹络,也可以直接部署在BlueMix上,部署⽅式可docker化,⽀持⽤Go和JavaScript开发智能合约。它采⽤PBFT分布式算法,⽹络编程⽅⾯⽤gRPC来做P2P通讯,使⽤ Protocol Buffer来序列化要传递的数据结构。在架构设计上,Fabric可能与⽐特币等区块链产品有所不同,但是上述基本组成部分还是不可或缺的。
官⽅⽹站:
源码库:
其他编程语⾔,⽐如:C#等,也有具体实例,这⾥就不再列举。总之,针对不同的编程语⾔,在具体的编码或架构设计上可能有所差别,甚⾄很⼤,但是协议层所使⽤的技术并没有太⼤的变化。其中,
⽹络编程是重点和难点,多数没有现成的框架可⽤,都是使⽤编程语⾔⾃⾝提供的库来设计开发,所以⽐较底层,⾮常考验开发者的编码功底。
知识图谱
循着上⾯的分析,我们已经可以了解区块链是什么,并知道怎么实现了,顺便梳理⼀下其中的编程技术知识,⾃然也就清晰多了。
blockchain-lib
根据个⼈的理解,我把与区块链相关的知识分为下⾯5个⽅⾯:
(1)基础知识
区块链是新技术,与之相关的是其背后⼤量的新概念、新理论。这些知识,虽然不直接体现在编码⾥,但却是理解区块链,掌握区块链技术的基本知识。所以,理当成为区块链技术不可或缺的⼀部分。这部分从基本概念⼊⼿,到⼯作原理的描述,就能够把区块链基础知识全部覆盖。
(2)技术实现
区块链是⼀项技术,但从上⾯的分析可以看出,它应该是⼀种架构应⽤,架构的实现理当是我们知识库的核⼼。正如⼤家看到的,任何⼀款区块链产品,协议层必须包括点对点⽹络、加密签名、数据存储、分布式算法等4个部分,应⽤层也必然要提供钱包、客户端浏览器等基础应⽤。所以,把这部分独⽴出来,也是合情合理。
在扩展层的部分,区块链技术可以对接各种应⽤,⽐如:⾦融、物联⽹、⽹络安全、版权保护、电⼦商务等等,现有的很多技术都可以⽤在这⾥。只不过,如何与区块链结合,如何实现跨⾏业使⽤,⾃然是这部分内容研究的课题。所以,这⾥所罗列或涉及到的技术,理应归为技术实现的⼀个重要部分。
go语言开发环境搭建(3)开发环境
区块链是多项技术的组合,有其⾃⾝的复杂性,个别应⽤对开发环境依赖较⼤,开发⼯具与环境搭建,是让开发者快速上⼿的重要内容。
(4)项⽬实践
据说,短短数年,全球区块链产品已经有⼏千个,其中不乏创新应⽤。有些优秀的开源产品和项⽬实践,是最好的学习研究资料。
(5)开发⽂档
这个⾃然不⽤说了,每⼀种产品也都会有⾃⼰的开发⽂档。另⼀个,就是有⼼的开发者整理汇总的⼀些资源,可以帮助我们节省很多查询的时间。
我在考虑这个知识体系的过程中,主要思考的是,读者循着这些标签去查阅⽂章,能否快速掌握区块链技术,并最终上⼿开发实现⼀个区块链产品。另外,也刻意规避了与具体编程语⾔,以及特定领域相关的词汇,唯⼀可以区分的就是这些节点之下对应的⽂章标签。所以,这些分类就显得⾮常中性。也考虑过使⽤⽐特币、竞争币、智能合约、数字资产、智能资产等具体领域的实现作为分类⽅法,但⼜怕限制了读者的思维,同时随着区块链的发展,这个图谱将不停的修改下去。这⾥,呼吁⼀下,希望读到这篇⽂章的⼩伙伴提供您的宝贵意见,让我们把这个关于区块链的知识分类图谱做得更加科学合理,使⽤更加⽅便。
总结
这篇⽂章,我们把区块链技术基础架构描述了⼀下,需要再次强调的是,这仅仅是⼀种实现⽅式,绝⾮所有的区块链产品都是如此,我们也期待更多创新出现,也相信⼀定会出现。编程实现罗列了⼏种编程语⾔与其实现的典型产品,因为协议层技术较为底层,并没有太多现成的框架需要介绍或讨论,同时,具体的技术细节,也绝⾮⼏⾏字能够罗列清楚,所幸,这些产品都是开源产品,⼤家可以结合
⾃⼰的技术背景,进⼀步查看对应的产品源码,很快就能了解其中的奥妙。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。