当前位置: 首页 > 科技观察

从概念到底层技术,一文读懂区块链架构设计

时间:2023-03-22 15:33:18 科技观察

前言作为架构设计的实现,区块链与基础语言或平台有很大区别。区块链是加密货币背后的技术,是目前可与VR虚拟现实媲美的热门技术之一。它本身并不是什么新技术,类似于Ajax。可以说是一个技术架构,那么我们从架构设计的角度来谈谈区块链技术实现。不管你擅长什么编程语言,都可以参考这个设计来实现一个区块链产品。同时整理相关的知识图谱和系统,帮助大家系统的学习和研究。基本概念区块链的概念最近很火。它源于比特币等加密货币的实现,但目前,该技术已逐渐应用于各个领域。什么是区块链技术?为了从感性上理解这个问题,我们可以用GoogleEarth的例子来类比。Ajax并不是一项新技术,但将它结合起来制作了GoogleEarth产品。同样,区块链也不是什么新技术,但它与加密和解密有关。技术、P2P网络等的结合,催生了比特币。技术人员,尤其是Web开发工程师,在学习了解ajax技术时,首先被GoogleEarth炫酷的效果所吸引。而现在,历史再次重演,很多人被比特币的疯狂发展所吸引,进而开始研究其背后的技术——区块链。区块链最初是一种在比特币等加密货币中存储数据的独特方式。它是一种用于存储大量交易信息的自引用数据结构。每条记录从后向前依次链接。它不能被篡改并且易于追踪。其实这个特性也直接反映了整个比特币的特性,所以用区块链来概括加密货币背后的技术实现是非常直观和贴切的。区块链是一种技术,加密货币是一种被开发和实现的产品(包括代币和没有代币的区块链产品),不能等同或混淆。与加密货币相比,区块链这个名字抛开了代币的概念,更加形象化、科技化、去政治化,更适合作为一种技术来研究和推广。因此,当人们单独谈论区块链时,指的是区块链技术,它是一种实现数据公开、透明、可追溯的产品架构设计方法,被视为广义上的区块链。在具体产品中谈到区块链时,可以指代类似于比特币的数据存储方式,可能是数据库设计,也可能是文件形式的设计,狭义上算是区块链。从广义上讲,区块链技术必须包括四个方面:点对点网络设计、加密技术应用、分布式算法的实现、数据存储技术的使用。其他的可能涉及分布式存储、机器学习、VR、物联网、大数据等。狭义的区块链只涉及数据存储技术、数据库或文件操作等。本文中的区块链是指广义的区块链。架构图在架构设计上,区块链可以简单分为三层,协议层、扩展层和应用层。其中,协议层又可分为存储层和网络层,两者相互独立又密不可分。如图:协议层所谓协议层,就是指***层的技术。这个层次通常是一个完整的区块链产品,类似于我们电脑的操作系统,维护着网络节点,只提供Api供调用。通常,官方会提供一个简单的客户端(俗称钱包)。这个客户端钱包的功能也很简单。它只能创建地址、验证签名、转账支付和查询余额。这个层次是一切的基础。搭建网络环境,搭建交易通道,制定节点奖励规则。至于你想交易什么,你想做什么,它不问也不可能问。典型的例子自然是比特币,还有各种二级代币,比如莱特币等,还有本书介绍的易数币。这个层面是现阶段开发者聚集的地方,这说明加密货币还处于起步阶段。从使用的技术来看,协议层主要包括四个方面:网络编程、分布式算法、加密签名、数据存储技术。其中,网络编程能力是大家选择编程语言的主要考虑因素,因为分布式算法基本上属于业务逻辑的实现,任何语言都可以做到。加密签名技术直接简单易用(请阅读书中相关的加解密文章,不推荐随意玩,没有过多的编码逻辑),数据库技术也主要在使用层面,只有对等网络的实现和并发处理才是开发的难点,所以人们更喜欢那些网络编程能力强、并发处理简单的语言。因此,区块链应用的Nodejs开发逐渐流行起来,Go语言也逐渐兴起。在上面的架构设计图中,我将这一层进一步划分为存储层和网络层。数据存储可以相对独立,选择的自由度更大,可以单独讨论。选择的原则无外乎性能和易用性。我们知道,系统的整体性能主要取决于网络或数据存储的I/O性能。网络I/O优化空间不大,但是本地数据存储的I/O可以优化。比如比特币就选择了谷歌的LevelDB。据说这个数据库的读写性能很好,但是很多功能需要开发者自己实现。目前,困扰行业的一个主要问题是加密货币交易的交易量远不如目前的中心化支付系统(银行等)。除了I/O,还需要全方位的突破。在实现对等网络的过程中,必须要用到分布式算法、加密签名等,自然是网络层的事情,也是编码的重点和难点。本书这部分内容基本由《Nodejs开发加密货币》分享。当然,也有将点对点网络的实现分开,将节点搜索、数据传输和验证的逻辑分开,将共识算法、加密签名、数据存储等操作放在一起,形成核心层。不管怎么组合,这两部分都是最核心和最底层的部分,都是协议层的内容。扩展层类似于电脑的驱动程序,是为了让区块链产品更加实用。目前有两种类型。一是各类交易市场,是法币兑换加密货币的重要渠道。实施简单,来钱快,成本低,但也有风险。二是实现一定方向的扩张。例如,基于易书侧链,可以为第三方发布机构、论坛网站等内容生产者提供定制化服务。尤其值得一提的是大家听到最多的“智能合约”概念,它是一个典型的扩展级应用开发。所谓“智能合约”是一种“可编程合约”,或者说是“合约智能”,其中的“智能”就是执行的智能,也就是说当满足一定条件时,合约自动执行,如证券自动转账、自动支付等,目前还没有相对成型的产品,但不可否认这将是区块链技术的一个重要发展方向。扩展层使用的技术没有限制,可以包括很多,比如上面提到的分布式存储、机器学习、VR、物联网、大数据等,都可以使用。编程语言的选择可以更加自由,因为它可以和协议层完全分离,编程语言也可以和协议层使用的开发语言不同。在开发方面,除了交易时与协议层交互,其他时间尽量不要和协议层的开发混在一起。这一层更接近于应用层,也可以理解为B/S架构产品中的服务器(Server)。这不仅使架构设计更科学,使区块链数据更小,网络更独立,也保证了扩展层的开发不受限制。从这个角度来看,区块链可以用来开发任何类型的产品,而不仅仅是金融行业。未来随着底层协议的完善,任何需要第三方支付的产品都可以很方便的使用区块链技术;任何需要确认、信用报告和可追溯性的信息都可以借助区块链实现。我个人觉得这个目标应该很快就能实现。应用层类似于计算机中的各种软件程序。是普通人可以直接使用的产品。也可以理解为B/S架构产品中的浏览器。该级别的应用目前几乎是空白。市场迫切需要这样的应用来引爆市场,形成真正的扩张趋势,让区块链技术快速走进普通百姓,服务大众。大家使用的各类轻钱包(客户端)应该算是应用层最简单最典型的应用。很快,亦书将推出基于亦书网络的文档协作工具,这是典型的应用层产品。限于目前区块链技术的发展,易数只能从协议层入手,面向应用层,同时为第三方开发者提供强大的扩展层支持。这样做既可以避免过于贪心,也可以避免无法落地。这是一条真正理性的发展路线。因为单纯的开发协议层或扩展层无法真正理解和验证应用层,会脱离实际,第三方开发者难以使用。如果只考虑应用层,市面上还没有真正扎实好用的协议层或扩展层产品。所以,我们只好全力以赴,采取完全开源开放的态度,借助社区的力量,一起做一件有意义的事情,也算是做一些技术积累和微薄的贡献吧。中国区块链技术的发展。很多小伙伴习惯结合自己的技术背景来理解上面的架构设计。这里结合具体的编程语言,简单介绍几款产品,仅供参考。(1)C/C++这两种语言是不可逾越的。任何发展遇到瓶颈,基本上都会找到。自然要排在第一位介绍。同时,作为区块链技术的鼻祖,比特币(协议层)是用C++语言开发的,迄今为止,没有比比特币更成功的区块链产品。所以,不管你用什么语言开发,在正式进入这个行业的时候,都应该先研究一下比特币。比特币官方客户端钱包使用的Qt,第三方钱包都是用Python语言开发的,尤其是第三方编译的开发库(Api包)大多是Nodejs设计的。比特币的架构与上述架构设计基本相同。此外,由于共识算法采用工作量证明机制(PoW:Proofofwork),因此存在一些特殊的挖矿过程。其他山寨币都是直接从比特币衍生出来的分支,所以编程语言是一样的,具体的技术选型和技术实现可能会有所改进。例如,莱特币使用其他加密算法。官网:https://bitcoin.org/源码库:https://github.com/bitcoin(二)Nodejs/JavascriptNodejs平台强大的网络编程能力,以及js的简洁和速度脚本语言,在区块链领域自然少不了它的身影。Yishu就是这样一款区块链产品,Yishucoin是它的协议层,使用著名的express开发框架,基于http协议开发。同时采用授权权益证明机制(DPoS),算法的改进使其在处理交易时更加轻量化,处理能力大幅提升。提供强大的协作机制,有利于数字出版和版权保护;它扩展了侧链功能,任何去中心化应用都可以基于它开发,从而为专业作者、博主和开发者提供了很多便利。《Nodejs开发加密货币》本书完整分享源码。从区块链的基本概念到代码实现,从基本原理到开发设计思路,都做了比较细致的探索。至此,已经从协议层面深入讲解了区块链。链技术实现的书很少,这算一本。官网:http://ebookchain.org/源码库:https://github.com/Ebookcoin(三)Python如果你是Python语言爱好者,建议研究一下以太坊(Ethereum)的Python实现。虽然因为TheDao事件闹得沸沸扬扬,但从技术实现的角度来说还是值得借鉴的。以太坊官方定位为开发和管理分布式应用程序的平台。主要攻击方向是“智能合约”,并为其定制了一种编程语言Solidity。以太坊的核心是以太坊虚拟机(EVM),它允许用户按照自己的意愿创建操作。以太坊提供了Go、Java和Python等多语言实现。基于python的实现主要包括三个部分:Pyethapp是客户端部分;pyethereum为核心库,实现区块链、以太坊模拟器、挖矿等功能;pydevp2p是一个点对点的网络库,实现了节点发现、合约代码传输、加密签名等功能,这三者结合起来就是一个完整的区块链实现,后两个核心库共同构成了协议层。另外,go-ethereum是go语言的完整实现;Ethereum(J)是一个纯Java实现,它作为一个库提供,可以嵌入到任何Java/Scala项目中。在客户端,有Rust、Ruby、Javascript等语言的实现。官网:https://ethereum.org/源码库:https://github.com/ethereum/pyethapp(四)Go在多核时代,Go语言非常流行,它让你轻松实现高并发以同步的方式,特别是在分布式系统、网络编程等领域,被广泛使用。因此,在区块链开发领域,使用Go语言的项目也不在少数。其中,由Linux基金会牵头的HyperLeger,仓库名称为Fabric,就是其中之一。该项目旨在为新一代交易应用程序创建一个开放的分布式账本标准,支持许可区块链(一种可能无法复制比特币强大网络效应的方法)。Fabric的开发环境建立在VirtualBox虚拟机之上。部署环境可以是自建网络,也可以直接部署在BlueMix上。部署方式可docker化,支持使用Go和JavaScript开发智能合约。它使用PBFT分布式算法,在网络编程中使用gRPC进行P2P通信,使用ProtocolBuffer序列化需要传输的数据结构。在架构设计上,Fabric可能与比特币等区块链产品有所不同,但上述基础组件仍然不可或缺。官网:https://www.hyperledger.org/源码库:https://github.com/hyperledger其他编程语言,如:C#等,也有具体的例子,就不一一列举了这里。总之,对于不同的编程语言,在具体的编码或架构设计上可能存在差异,甚至差异很大,但协议层使用的技术并没有太大变化。其中,网络编程是重点和难点。它们大多没有现成的框架可用,都是利用编程语言本身提供的库来设计和开发的。所以比较底层,比较考验开发者的编码能力。知识图谱通过上面的分析,我们已经可以理解区块链是什么以及如何实现了。顺便梳理一下里面的编程技术知识,自然就清楚很多了。根据我个人的理解,我将区块链相关的知识分为以下五个方面:(1)基础知识区块链是一项新技术,与之相关的是其背后的大量新概念、新理论。这些知识虽然没有直接体现在代码中,但是是了解区块链,掌握区块链技术的基础知识。因此,它应该成为区块链技术不可或缺的一部分。这部分从基本概念开始,到工作原理的描述,可以涵盖区块链的所有基础知识。(2)技术实现区块链是一种技术,但是从上面的分析可以看出它应该是一种架构应用,而架构的实现应该是我们知识库的核心。可以看到,对于任何区块链产品,协议层都必须包括四个部分:对等网络、加密签名、数据存储和分布式算法。应用层还必须提供钱包、客户端浏览器等基础应用。.因此,将这部分分开是合理的。在扩展层部分,区块链技术可以接入各种应用,比如:金融、物联网、网络安全、版权保护、电子商务等,很多现有的技术都可以在这里使用。但是,如何与区块链结合,如何实现跨行业使用,自然是这部分研究的课题。因此,这里所列或涉及的技术,应归类为技术实现的重要组成部分。(3)开发环境区块链是多种技术的结合,有其自身的复杂性。单个应用程序严重依赖开发环境。开发工具和环境搭建是开发者快速上手的重要内容。(四)项目实践据说在短短几年时间里,全球已经出现了上千种区块链产品,其中不乏创新应用。一些优秀的开源产品和项目实践是最好的学习和研究资料。(5)开发文档不用多说,每个产品都会有自己的开发文档。另一种是有心的开发者整理的一些资源,可以帮助我们节省大量的查询时间。在考虑这个知识体系的过程中,我主要思考读者是否可以通过跟随这些标签查阅文章,快速掌握区块链技术,最终上手开发和实现一个区块链产品。此外,与特定编程语言和特定领域相关的词汇也有意回避。唯一可以区分的就是这些节点下对应的文章标签。因此,这些分类显得非常中性。我也考虑过用比特币、山寨币、智能合约、数字资产、智能资产等具体领域的实现作为分类方法,但恐怕会限制读者的思路。同时,随着区块链的发展,这张地图还会继续。修改还在继续。在此,恳请阅读本文的朋友多多提出宝贵意见,让我们把这份区块链知识分类图变得更加科学合理,使用起来更加方便。总结这篇文章,我们已经描述了区块链技术基础设施。需要再次强调的是,这只是一种实现方式,并不是所有的区块链产品都是这样,我们也期待更多的创新,相信一定会出现。编程实现列举了几种编程语言及其典型产品。由于协议层技术比较底层,现成的框架介绍或讨论的不多。同时,具体的技术细节也不是几行就能说清楚的。幸运的是,这些产品都是开源产品。大家可以根据自己的技术背景进一步查看相应产品的源代码,很快就会明白其中的奥秘。