精华内容
参与话题
问答
  • 区块链架构与应用

    2018-01-24 08:51:40
    区块链的概念最近很火,它来自于比特币等加密货币的实现,但是目前,这项技术已经逐步运用在各个领域。什么是区块链技术?为了感性认识这个问题,我们可以使用谷歌地球的例子做类比,ajax不是什么新技术,但组合在...
  • 10分钟弄懂当前各主流区块链架构

    万次阅读 2018-07-22 13:28:23
    废话不多说,咱们就从技术角度来了解一下当前最主流的区块链诸如比特币、以太坊、HyperLedger等架构的区别以及它们各自的优缺点。为保证客观与公平,本文将只针对开源的区块链进行讨论。     作者 | 张铮文 ...

    最近区块链的概念可谓十分火热,从风投的投资到企业招聘区块链人才,似乎处处暗示着该技术将会给人类带来巨大改变。废话不多说,咱们就从技术角度来了解一下当前最主流的区块链诸如比特币、以太坊、HyperLedger等架构的区别以及它们各自的优缺点。为保证客观与公平,本文将只针对开源的区块链进行讨论。

     

     

    作者 | 张铮文

     

    常听人们谈起区块链,从2009年比特币诞生至今,各式各样的区块链系统或基于区块链的应用不断被开发出来,并被应用到大量的场景中,而区块链技术本身也在不停地变化和改进。

     

    区块链又被称为分布式账本,与之对应的则是中心化账本,比如银行。与中心化账本不同的是,分布式账本依靠的是将账本数据冗余存储在所有参与节点中来保证账本的安全性。简单地说,区块链会用到三种底层技术:点对点网络、密码学和分布式一致性算法。而通常,区块链系统还会“免费附赠”一种被称为智能合约的功能。智能合约虽然不是区块链系统的必要组成部分,但由于区块链天生所具备的去中心化特点,使它可以很好地为智能合约提供可信的计算环境。

     

    为了适应不同场景的需求,区块链系统在实际应用的过程中往往会需要进行各种改造,以满足特定业务的要求,比如身份认证、共识机制、密钥管理、吞吐量、响应时间、隐私保护、监管要求等。而实际应用区块链系统的公司往往没有进行这种改造的能力,于是市场上慢慢出现了一些用于定制专用区块链系统的框架,采用这些框架就可以很方便地定制出适用于企业自身业务需求的区块链系统。本文将对目前市场上几个典型的区块链框架进行横向对比。

     

    比特币

     

    比特币(Bitcoin)源自中本聪(Satoshi Nakamoto)在2008年发表的一篇论文《比特币:一种点对点的电子现金系统》(Bitcoin:A Peer-to-PeerElectronic Cash System),文中描述了一种被他称为“比特币”的电子货币及其算法。在之后的几年里,比特币不断成长和成熟,而它的底层技术也逐渐被人们认识并抽象出来,这就是区块链技术。比特币作为区块链的鼻祖,在区块链的大家族中具有举足轻重的地位,基于比特币技术开发出的山寨币(Altcoins)的数量有如天上繁星,难以计数。

     

    中本聪设计比特币的目的,就是希望能够实现一种完全基于点对点网络的电子现金系统,使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的中介机构。总结来说,他希望比特币能够实现以下这些设计目标:

     

    1. 不需要中央机构就可以发行货币

    2. 不需要中介机构就可以支付

    3. 保持使用者匿名

    4. 交易无法被撤销

     

    从电子现金系统的角度来看,以上这些目标在比特币中基本都得到了实现,但是依然有一些技术问题有待解决,比如延展性攻击、区块容量限制、区块分叉、扩展性等。

     

    在应用场景方面,目前大量的数字货币项目都是基于比特币架构来设计的,此外还有一些比较实际的应用案例,比如彩色币、tØ等。

     

    彩色币(Coloredcoin),通过仔细跟踪一些特定比特币的来龙去脉,可以将它们与其他的比特币区分开来,这些特定的比特币就叫作彩色币。它们具有一些特殊的属性,从而具有与比特币面值无关的价值,利用彩色币的这种特性,开发者可以在比特币网络上创建其他的数字资产。彩色币本身就是比特币,存储和转移不需要第三方,可以利用已经存在的比特币基础网络。

     

    tØ是比特币区块链在金融领域的应用,是美国在线零售商Overstock推出的基于区块链的私有和公有股权交易平台。

     

    以太坊

     

    以太坊(Ethereum)的目标是提供一个带有图灵完备语言的区块链,用这种语言可以创建合约来编写任意状态转换功能。用户只要简单地用几行代码来实现逻辑,就能够创建一个基于区块链的应用程序,并应用于货币以外的场景。以太坊的设计思想是不直接“支持”任何应用,但图灵完备的编程语言意味着理论上任意合约逻辑和任何类型的应用都可以被创建出来。总结来说,以太坊在比特币的功能之外,还有以下几个设计目标:

     

    1. 图灵完备的合约语言

    2. 内置的持久化状态存储

     

    目前基于以太坊的合约项目已达到数百个,比较有名的有Augur、TheDAO、Digix、FirstBlood等

     

    Augur是一个去中心化的预测市场平台,基于以太坊区块链技术。用户可以用数字货币进行预测和下注,依靠群众的智慧来预判事件的发展结果,可以有效地消除对手方风险和服务器的中心化风险。

     

    限于篇幅,基于以太坊智能合约平台的项目就不多介绍了。基于以太坊的代码进行改造的区块链项目也有不少,但几乎都是闭源项目,只能依靠一些公开的特性来推断,所以就不在本文展开讨论了。

     

    Fabric

     

    Fabric是由IBM和DAH主导开发的一个区块链框架,是超级帐本的项目成员之一。它的功能与以太坊类似,也是一个分布式的智能合约平台。但与以太坊和比特币不同的是,它从一开始就是一个框架,而不是一个公有链,也没有内置的代币(Token)

     

    超级账本(Hyperledger)是Linux基金会于2015年发起的推进区块链技术和标准的开源项目,加入成员包括:荷兰银行(ABN AMRO)、埃森哲(Accenture)等十几个不同利益体,目标是让成员共同合作,共建开放平台,满足来自多个不同行业各种用户案例,并简化业务流程。

     

    作为一个区块链框架,Fabric采用了松耦合的设计,将共识机制、身份验证等组件模块化,使之在应用过程中可以方便地根据应用场景来选择相应的模块。除此之外,Fabric还采用了容器技术,将智能合约代码(Chaincode)放在Docker中运行,从而使智能合约可以用几乎任意的高级语言来编写。

     

    以下是Fabric的一些设计目标:

     

    1. 模块化设计,组件可替换

    2. 运行于Docker的智能合约

     

    目前已经有不少采用Fabric架构进行开发的概念验证(POC)项目在实施过程中,其中不乏一些金融机构做出的尝试,不过由于项目刚刚起步,还没有比较成熟的落地应用。

     

    Onchain DNA

     

    Onchain DNA(Onchain Distributed Networks Architecture),是由总部位于上海的区块链创业公司“分布科技”开发的区块链架构,可以同时支持公有链、联盟链、私有链等不同应用类型和场景,并快速与业务系统集成。分布科技同样也是超级账本的成员之一。

     

    与以太坊、Fabric不同的是,Onchain DNA在系统底层实现了对多种数字资产的支持,用户可以直接在链上创建自己的资产类型,并用智能合约来控制它的发行和交易逻辑。对于绝大部分的区块链应用场景,数字资产是必不可少的,而为每一种数字资产都开发一套基于智能合约的业务流程非常浪费且低效。因此,由区块链底层提供直接的数字资产功能十分必要。而对于那些完全不需要数字资产的应用场景,同样可以基于Onchain DNA提供的智能合约功能来编写任意的自定义逻辑来实现。

     

    Onchain DNA的设计目标主要有以下几点:

     

    1. 多种数字资产的底层支持

    2. 图灵完备的智能合约和持久化状态

    3. 跨链互操作性

    4. 交易的最终性

       

     

    目前已有不少金融机构采用Onchain DNA架构来进行区块链概念验证产品的开发,如银行、券商、支付、登记结算机构等。除此之外,还有一些已经落地的区块链项目,如小蚁、法链等。

     

    小蚁(Antshares)是一个定位于资产数字化的公有链,将实体世界的资产和权益进行数字化,通过点对点网络进行登记发行、转让交易、清算交割等金融业务的去中心化网络协议。它采用社区化开发的模式,在架构上与Onchain DNA保持一致,从而可以与任何基于Onchain DNA的区块链系统发生跨链互操作。

     

    法链是全球第一个大规模商用的法律存证区块链,一个底层基于Onchain DNA区块链技术,并由多个机构参与建立和运营的证据记录和保存系统。该系统没有中心控制点,且数据一旦录入,单个机构或节点无法篡改,从而满足司法存证的要求。

     

    Corda

     

    Corda是由一家总部位于纽约的区块链创业公司R3CEV开发的,由其发起的R3区块链联盟,至今已吸引了数十家巨头银行的参与,其中包括富国银行、美国银行、纽约梅隆银行、花旗银行、德国商业银行、德意志银行、汇丰银行、三菱UFJ金融集团、摩根士丹利、澳大利亚国民银行、加拿大皇家银行、瑞典北欧斯安银行(SEB)、法国兴业银行等。从R3成员的组成上也可以看出,Corda是一款专门用于银行与银行间业务的技术架构。尽管R3声称Corda不是区块链,但它具备区块链的一些重要特性。

     

    Corda由Java和Kotlin开发,并在其各项功能中充分依赖于Java,比如智能合约、数据访问接口等。Corda的设计目标主要是:

     

    1. 没有全局账本

    2. 由公证人(Notaries)来解决交易的多重支付问题

    3. 只有交易的参与者和公证人才能看到交易

     

    为此,Corda的所有交易都不会向全网进行广播,而且所有的节点都是直接通信,没有P2P网络。这一点导致了其网络规模会被限制在一个较小的规模内,无法形成大规模的联盟链,适用的业务场景比较狭窄。

     

    接下来,我们将针对前文中所提到的这些区块链框架进行一系列的技术对比,并从多个维度展开讨论它们的区别与相似之处。

     

    数字资产

     

     

    区块链的内置代币通常是一种经济激励模型和防止垃圾交易的手段。比特币天生就有且只有一种内置代币,所以在比特币系统中所有的“交易”本质上都是转账行为,除非通过外部的协议层来给比特币增加额外的数字资产。

     

    以太坊和Onchain DNA具有内置代币,它们的作用除了以上提到的经济激励和防止垃圾交易之外,还为系统内置功能提供了一个收费的渠道。比如以太坊的智能合约运行需要消耗GAS,而Onchain DNA的数字资产创建也需要消耗一定的代币(可选)。

     

    以太坊和Fabric没有内置的多种数字资产支持,而是通过智能合约来实现相应的功能。这种方式的好处在于,系统设计可以做到非常简洁,而且资产的行为可以任意指定,自由度极高。然而这样的设计也会带来一系列的负面影响,比如所有的资产创建者不得不自己编写重复的业务逻辑,而用户也没有办法通过统一的方式去操作自己的资产。

     

    相比之下,Onchain DNA和Corda采用了在底层支持多种数字资产的方式,让资产创建者可以方便地创建自己的资产类型,而用户也可以在同一个客户端中管理所有的资产。对于逻辑更加复杂一点的业务场景来说,他们同样可以利用智能合约来强化资产的功能,或者创建一种与资产无关的业务逻辑。

     

    账户系统

     

     

    UTXO(Unspent Transaction Output)是这样一种机制:每一枚数字货币都会被登记在一个账户的所有权之下,一枚数字货币有两种状态,即要么还没有被花费,要么已经被花费。当需要使用一枚数字货币的时候,就将它的状态标记为已经花费,并创造一枚新的与之等额的数字货币,将它的所有权登记到新的账户之下。在这个过程中,被标记为已花费的数字货币就被称为交易的输入,而创造出来的新的数字货币被称为交易的输出,在一笔交易中,可以包含多个输入和多个输出,但是输入之和与输出之和必须相等。计算一个账户的余额时,只要将所有登记在该账户下的数字货币的面额相加即可。

     

    比特币和Corda就采用了UTXO这样一种账户机制,而以太坊则采用了更加直观的余额机制:每个账户都有一个状态,状态中直接记录了账户当前的余额,转账的逻辑就是从一个账户中减去一部分金额,并在另一个账户中加上相应的金额,减去的部分和加上的部分必须相等。Onchain DNA在账户机制上同时兼容这两种模式。

     

    那么UTXO模式和余额模式,究竟有什么区别呢?UTXO最大的好处就是,基于UTXO的交易可以并行验证且任意排序,因为所有的UTXO之间都是没有关联的,这对区块链未来的扩展性有很大的帮助,而基于余额的设计就没有这个优势了。反过来,余额设计的优点是设计思想非常简洁和直观,便于程序实现,特别是在智能合约中,要处理UTXO的状态是非常困难的。这也是为什么以智能合约为主要功能的以太坊选择余额设计的原因,而比特币、OnchainDNA、Corda这些以数字资产为核心的架构则更倾向于UTXO设计。

     

    关于身份认证,比特币和以太坊基本没有身份认证的设计,原因很简单,因为这两者的设计思想都是强调隐私和匿名,反对监管和中心化,而身份认证就势必要引入一些中心或者弱化的中心机构。

     

    Fabric、Onchain DNA和Corda不约而同地选择了采用数字证书来对用户身份进行认证,原因在于这三者都有应用于现有金融系统的设计目标,而金融系统必然要考虑合规化并接受监管,此外现有的金融系统已经大范围地采用数字证书方案,这样便可以和区块链系统快速集成。

     

    共识机制

     

    共识机制是分布式系统的核心算法,因为分布式系统的数据分散在各个参与节点中,这些分散的数据必须通过一种算法来保持一致性,否则系统将无法正常工作。与传统的分布式系统不同,区块链是一个去中心化的系统,并且可能会承载大量的金融资产,所以它可能会面临大量的拜占庭故障而非一般性故障,而中心化的分布式系统则很少遇到拜占庭故障。因此,区块链的共识机制与传统的分布式系统存在较大的差异。

     

     

    比特币和以太坊采用了工作量证明(Proof-of-Work)机制来保证账本数据的一致性。工作量证明同时也是一种代币分发机制,它通过经济激励的方式来鼓励节点参与区块的构造过程,节点在构造区块的时候需要穷举一个随机数以使得区块符合规定的难度要求,一旦区块链出现分叉,诚实的节点将选择工作量较大的链条,而抛弃工作量较小的。由于假设所有节点都是逐利的,而选择工作量较小的链条就会使自己获得的激励无效,所以最终所有的节点都会是诚实的,从而使每个节点的区块链数据都保持一致。

     

    为了维护这样一个工作量证明机制的区块链,需要全网具备较大规模的算力支撑来保证网络的安全性,否则账本数据就有可能被篡改。此外,即使维持较大的算力来保护网络,工作量证明也无法从根本上保证交易的最终性,比如比特币就经常产生孤立区块(Orphaned Block),而包含在孤立区块中的交易就有可能被撤销。因此比特币通常要求用户等待6个区块的确认,即1小时左右的时间,才能在一个可接受的概率上认为交易已经最终完成,而这个概率也并非是最终性的——你永远也不知道暗中是否有一个远超过全网的庞大算力正在试图撤销以前的交易。而为了维护庞大算力而支出的电力成本也是相当可观,因此,以太坊已经在设计从工作量证明机制切换到其他共识机制上的方案。

     

    Fabric和Onchain DNA都设计了基于拜占庭容错(Byzantine Fault Tolerance)模型的共识机制。节点被分为普通节点和记账节点(Validating Peer),只有记账节点才会参与到区块的构造过程,这种角色的分离使得算法的设计者有机会将运行共识算法的节点数量限定在一个可控的规模内。

     

    拜占庭容错模型对网络中的节点做出了假设和要求:如果共识中有f个节点会出现拜占庭故障,那么至少需要3f+1个节点参与共识才能避免网络出现分叉。在这个模型下,每个区块的构造过程都需要至少2f+1个节点的参与才能够完成,而不像工作量证明机制下每个节点都独立构造区块。一旦区块被构造出来,它就无法被撤销,因为2f+1个诚实的记账节点不会在同一高度对两个不同的区块进行签名认证。

     

    相比较而言,工作量证明机制提供了极高的灵活性和可用性,因为每个节点都独立构造区块而几乎不需要其他节点的参与,节点可以随时加入或者退出网络,即使全网只剩下一个节点,网络还是可以继续工作,但是相应的它也失去了交易的最终性;而拜占庭容错的机制则与之相反,牺牲了一定的灵活性和可用性,记账节点必须在线提供服务而不能退出网络,一旦出现1/3的记账节点停机,那么网络将变得不可用,但它保证了交易的最终性

     

    智能合约

     

    智能合约是1994年由密码学家尼克萨博(Nick Szabo)首次提出的理念,几乎与互联网同龄。智能合约是指能够自动执行合约条款的计算机程序,在比特币出现以前,因为不存在安全可靠的执行环境,智能合约一直不能够应用到现实中。区块链由于其去中心化、公开透明等特性,天生就可以为智能合约提供可信的执行环境。所以,新型的区块链框架几乎都会内置智能合约的功能。

     

     

    比特币内置了一套基于栈的脚本执行引擎,可以运行一种独有的脚本代码,用于对交易进行简单的有效性验证,比如签名验证和多重签名验证等。比特币这套脚本语言被有意设计成非图灵完备的,足够简单却也足以应对货币转账的各种需求

     

    以太坊是首个以图灵完备智能合约为主要功能的区块链,用户可以在以太坊的平台上创建自己的合约,而合约的内容可以包含货币转账在内的任意逻辑。合约使用一种名为Solidity的语言来编写,它是以太坊团队开发的专门用于编写智能合约的一种高级语言,语法类似JavaScript,最终被编译成字节码并运行在EVM(Ethereum Virtual Machine)之中。EVM提供了堆栈、内存、存储器等虚拟硬件,以及一套专用的指令集,所有的代码都在沙盒中运行。它提供了合约间相互调用的能力,甚至可以在运行时动态加载其它合约的代码来执行。这种能力使得以太坊的合约具有非常高的灵活性,但也可能会使合约的功能具有不确定性。

     

    与以太坊自己动手开发语言、虚拟机的思路不同,Fabric选择了使用现有的容器技术来支持智能合约功能。Fabric的智能合约理论上可以用任何语言来编写,这一点对开发者相当友好,他们将无需学习新的语言,并且可以复用现有的业务代码和丰富的开发库,并使用自己熟悉的开发工具。相对的,采用Docker的智能合约架构也有大量的问题:首先,它很难对智能合约的执行流程进行控制,从而无法对其功能进行限制;其次,它无法对合约运行所消耗的计算资源进行精确的评估;此外,运行Docker相对而言是极其耗费资源的操作,这就使得难以在移动设备上运行合约;最后,不同节点的硬件配置、合约引用的开发库等,都有可能会使合约的行为具有很强的不确定性。

     

    Onchain DNA采用了AVM(Antshares Virtual Machine)作为其智能合约功能的底层支持。AVM是一个微核心的、平台无关的智能合约执行环境,它提供了一套包含堆栈操作、流程控制、逻辑运算、算数运算、密码学运算、字符串操作、数组操作的指令集,在硬件方面,它只提供了两个计算堆栈。不过,由于它允许区块链的实现者创建自己的虚拟硬件,并以接口的形式开放给智能合约来使用,使得合约可以在运行时取得平台相关的数据、持久化存储以及访问互联网等。虽然这也有可能会使合约的行为具有不确定性,但区块链的实现者可以通过合理编写虚拟硬件来消除这种不确定性。不过,由于目前尚无与AVM配套的编译器和开发环境,这使得基于AVM进行智能合约开发变得相当困难,开发者不得不使用一种类似汇编的语法来进行合约编写,需要较高的技术能力。

     

    Corda的智能合约功能与其自身一样,都是基于JVM(Java Virtual Machine)的。因此,你可以使用任何与JVM兼容的语言来进行开发,比如Java、Kotlin等。不过,它对JVM进行了一定的改造,使得在其上运行的合约脚本具备确定性。开发的过程大致是这样的:使用Java创建一个实现Contract接口的类(Class),并提供一个名为verify的函数(Function)用于对交易进行验证,该函数接受当前的交易作为参数,如果交易验证失败,则抛出异常(Exception),没有异常就表示验证通过。Corda使用JPA(Java Persistence Architecture)来提供持久化功能,支持SQL语句和常用的数据库,不过需要安装相应的插件,并且由于数据仅存放在合约执行者的节点,因此无法进行全局的持久化存储。

     

    扩展性

     

    区块链的数据结构通常是只能追加记录,而不能修改或删除记录,它真实地记录下完整的历史数据,使得新加入的节点有能力对全网的完整交易历史进行验证,而无需信任其它节点。这种特性带来了去中心化的便利性,但也影响了区块链系统的扩展性,因为区块会无休止地增长,直到塞满整个硬盘。所以有必要提供一种空间回收的机制来应对不断增长的数据。

     

     

    比特币提出了使用默克尔树(Merkle tree)来存放交易散列的方式,当需要回收硬盘空间时,只需将老旧的交易从默克尔树中剔除即可。一个不含交易信息的区块头大小仅有80字节。按照比特币区块生成的速率为每10分钟一个,那么每一年产生的数据约为4.2MB,即使将全部的区块头存储于内存之中都不是问题。

     

    以太坊、Fabric和Onchain DNA在比特币区块压缩的基础上,又采用了状态快照的方式来节约硬盘空间。具体来说,就是在区块头的结构中不但记录了当前区块所有交易的根散列,还记录了当前区块及过去所有区块中的状态根散列。这些状态包括所有的UTXO、账户余额、合约存储等,所以节点只需要保留最新的区块和完整的状态信息即可。

     

    扩展性的另一个重要指标是交易的吞吐量。决定吞吐量的因素有很多种,如网络结构、加密算法、共识机制等,但最重要的还是交易是否可以被并行验证。如果交易可以被并行验证,那么未来就可以通过简单地增加CPU数量来提高吞吐量。

     

    基于UTXO系统的比特币可以很容易地对交易进行并行验证,因为UTXO之间是没有关联的,对任何一个UTXO的状态改变都可以独立进行且与顺序无关;而基于余额的账户系统则不那么容易实现并行,因为可能会同时发生多笔交易对同一个账户进行资产操作,需要进行一些额外的步骤来处理。举个例子,假设账户中的余额为10元,有两笔针对该账户的交易同时发生,第一笔交易在账户中+5元,而第二笔交易在账户中-11元。那么如果先执行第一笔交易,则两笔都能成功,最终余额为4元;如果先执行第二笔交易,那么它会因余额不足而失败,只有第一笔交易会成功,最终余额为15元。

     

    而对交易的并行验证起到决定性作用的,是智能合约是否具备状态持久化的能力。如果一组合约都是无状态的,那么它们就可以按任意的顺序被执行,不会产生任何副作用;相反,如果合约可以对一组状态产生影响,那么按不同的顺序来执行合约产生的结果也会不同。举个例子,一个计算存款利息的合约,它具有两个子功能:存款和利息结算。假设账户中有100元,利率为10%,现在同时发生了两笔交易,第一笔交易的内容是存入100元,第二笔交易的内容是结算利息。假如第一笔交易先执行,那么最终账户的余额是:100+100)*110%=220元;如果第二笔交易先执行,那么账户余额将是:100*110%+100=210元。由此可见,具备状态持久化能力的智能合约是顺序相关的,因此难以并发验证,特别是如果合约之间还可以相互调用的话,情况将会更加复杂。

     

    目前Fabric没有提出什么好的办法来解决这个问题;而Corda则没有这个问题,因为它的交易本身就不会向全网进行广播,所以只要交易参与者和公证人可以验证即可。以太坊和Onchain DNA的方法都是分区,即将各个合约分到不同的逻辑区中,每个区中的合约都顺序执行,而不同的区之间并行执行。以太坊将合约地址的首个字节作为分区依据,由此产生了256个分区,每个合约都在自己的分区中运行,且只能调用与自己相同分区的合约。但这种做法实际上并不能有效地解决问题,因为总有一些通用的底层合约因为被广泛使用,而把大多数的调用者合约聚集在同一个分区中。

     

    Onchain DNA将合约分为功能合约(Function code)和应用合约(Applicationcode)。其中功能合约专门用于提供可复用的功能函数,被其它合约调用,且必须被声明为无状态,这一点消除了绝大部分的合约聚集现象;而只有应用合约可以保存自己的状态,所以在执行应用合约时,对其采用动态分区方案:在合约被执行之前,会先计算出它们的调用树,并将调用树有交集的合约放在同一个分区中执行。

     

    5大项目独有特性

     

    扩展性

     

    幽灵协议是以太坊对现有POW算法的改进,它提出的动机是当前快速确认的区块链因为区块的高作废率而受到的低安全性困扰。因为区块需要花一定时间扩散至全网,如果矿工A挖出了一个区块然后矿工B碰巧在A的区块传播至B之前挖出了另外一个区块,矿工B的区块就会作废并且没有对网络安全作出贡献。如果A是一个拥有全网30%算力的矿池而B拥有10%的算力,A将面临70%的时间都在产生作废区块的风险而B在90%的时间里都在产生作废区块。通过在计算哪条链“最长”的时候把废区块也包含进来,幽灵协议解决了降低网络安全性的第一个问题;这就是说,不仅一个区块的父区块和更早的祖先块,祖先块的作废的后代区块(以太坊术语中称之为“叔区块”)也被加进来以计算哪一个区块拥有最大的工作量证明。以太坊付给以“叔区块”身份为新块确认作出贡献的废区块87.5%的奖励,把它们纳入计算的“侄子区块”将获得奖励的12.5%。计算表明,带有激励的五层幽灵协议即使在出块时间为15s的情况下也实现了95%以上的效率,而拥有25%算力的矿工从中心化得到的益处小于3%。

     

    国密算法

     

    国密算法是由中国国家密码管理局制定的一系列商用密码学算法,其中包括了对称加密算法SM1,椭圆曲线非对称加密算法SM2,杂凑算法SM3等。通常区块链在使用密码学算法时会采用国际标准,如AES、ECDSA、SHA2等。而国内的金融机构在选用密码学方案的时候,通常会考虑国密算法。Onchain DNA提供了可选的密码学模块,针对不同的应用场景可以选择不同密码学标准,解决了安全性和政策性风险。

     

    跨链互操作

     

    目前,区块链技术正处于百花齐放、百家争鸣的时代,各种不同的区块链纷纷涌现出来,区块链之间的互操作性成为了一个非常重要而又迫切的需求。企业用户可能需要在不同的链之间进行业务迁移;普通用户可能需要在不同的链之间进行资产交换;央行的数字法币可能会需要在各个区块链上流通等。Onchain DNA提供了一种跨链互操作协议,通过这种跨链协议,用户可以跨越不同的区块链进行资产交易、合约执行等操作,并保证该操作在各个区块链上的事务一致性。

     

    无链结构

     

    正如Corda在白皮书中所宣称的那样,它没有链式结构,交易也不向全网进行广播,而只在交易的参与者和公证人之间发送。因此,数据只有“需要访问的人”才能访问,避免了隐私泄露的问题。由于没有全局的链式结构,每个节点只存放和自己有关的交易,而无需存放全网的所有交易,大大的节省了空间。

     

    总结

     

    本文从多个维度比较并讨论了当前各个区块链框架的特点和功能,并阐述了它们在各方面的优缺点,以及在应用领域上的适用性和局限性。

     

    比特币虽然是区块链技术的原型,具有非常重要的地位,但由于其技术架构的局限性,如挖矿、非图灵完备等,很难应用到复杂的业务场景中去,但非常适合用于货币发行。

     

    以太坊虽然也采用挖矿的形式,但其幽灵协议提高了挖矿效率,新的共识算法也在开发中。以太坊还开发了较多基于密码学的隐私保护方案,比如环签名混币方案,非常适合于创建去中心化自治组织(Decentralized Autonomous Organization)。

     

    Fabric和Onchain DNA的定位都是企业级区块链解决方案,适合用于定制各种特定业务的联盟链,包括金融领域的应用场景。区别在于Fabric以智能合约为导向,而Onchain DNA则以数字资产为导向;前者更适合开发复杂的自定义业务流程,而后者则更适合于构建以数字资产为核心的金融业务系统或权益登记流转系统,且具有较强的扩展性。

     

    Corda的定位是用于银行间业务的“分布式数据库”,它摒弃了区块和链式结构,更好地把参与者的业务数据区隔开来;但引入了公证人的角色,网络结构较为固定不具灵活性和扩展性,且与现有的银行体系的运作方式差别不大。

     

    注:本文源自张铮文2017年初的一篇技术文章。

     

    作者简介:

    张铮文,分布科技CTO & Founder, 小蚁核心开发者。区块链技术和计算机安全专家,CISA信息系统审计师。具备区块链底层协议架构和开发能力,dBFT共识机制的作者,独立原创实现了小蚁全部的核心代码。创立小蚁前,曾在盛大游戏、火币网等公司任职,从事信息安全和数字货币研发工作。

    展开全文
  • 区块链基础架构模型

    万次阅读 2018-03-16 00:12:34
    一、简单3层架构 Ref:http://www.8btc.com/ebook-blockchain 二、6层架构 Ref: (1)http://blog.csdn.net/qq_35624642/article/details/78138077 (2)...

    一、简单3层架构

    Ref:http://www.8btc.com/ebook-blockchain
    这里写图片描述

    二、6层架构

    Ref:
    (1)http://blog.csdn.net/qq_35624642/article/details/78138077
    (2)http://blog.csdn.net/csolo/article/details/52858236
    这里写图片描述
    区块链技术的模型是由自下而上的数据层、网络层、共识层、激励层、合约层和应用层组成。

    首先是“数据层”,封装了底层数据区块的链式结构,以及相关的非对称公私钥数据加密技术和时间戳等技术,这是整个区块链技术中最底层的数据结构。这些技术是构建全球金融系统的基础,数十年的使用证明了它非常安全的可靠性。而区块链,正式巧妙地把这些技术结合在了一起。

    其次是“网络层”,包括P2P组网机制、数据传播机制和数据验证机制等。P2P组网技术早期应用在BT这类P2P下载软件中,这就意味着区块链具有自动组网功能。

    第三层“共识层”,封装了网络节点的各类共识机制算法。共识机制算法是区块链的核心技术,因为这决定了到底是谁来进行记账,而记账决定方式将会影响整个系统的安全性和可靠性。目前已经出现了十余种共识机制算法,其中比较最为知名的有工作量证明机制(PoW,Proof of Work)、权益证明机制(PoS,Proof ofStake)、股份授权证明机制(DPoS,Delegated ProofofStake)等。数据层、网络层、共识层是构建区块链技术的必要元素,缺少任何一层都将不能称之为真正意义上的区块链技术。

    第四层“激励层”,将经济因素集成到区块链技术体系中来,包括经济激励的发行机制和分配机制等,主要出现在公有链当中。在公有链中必须激励遵守规则参与记账的节点,并且惩罚不遵守规则的节点,才能让整个系统朝着良性循环的方向发展。而在私有链当中,则不一定需要进行激励,因为参与记账的节点往往是在链外完成了博弈,通过强制力或自愿来要求参与记账。

    第五层“合约层”,封装各类脚本、算法和智能合约,是区块链可编程特性的基础。比特币本身就具有简单脚本的编写功能,而以太坊极大的强化了编程语言协议,理论上可以编写实现任何功能的应用。如果把比特币看成是全球账本的话,以太坊可以看作是一台“全球计算机”,任何人都可以上传和执行任意的应用程序,并且程序的有效执行能得到保证。

    第六层“应用层”,封装了区块链的各种应用场景和案例,比如搭建在以太坊上的各类区块链应用即部署在应用层,而未来的可编程金融和可编程社会也将会是搭建在应用层。

    激励层、合约层和应用层不是每个区块链应用的必要因素,一些区块链应用并不完整的包含后三层结构。

    展开全文
  • 数据层是最底层的技术,主要...数据存储主要基于Merkle树,通过区块的方式和链式结构实现,大多以KV数据库的方式实现持久化,比如比特币和以太坊采用的leveldb。...数据层的系统模型有很多,比如比特币的UTXO 模型、...

    数据层是最底层的技术,主要实现了两个功能:数据存储、账户和交易的实现与安全。数据存储主要基于Merkle树,通过区块的方式和链式结构实现,大多以KV数据库的方式实现持久化,比如比特币和以太坊采用的leveldb。账户和交易的实现与安全这个功能基于数字签名、哈希函数和非对称加密技术等多种密码学算法和技术,保证了交易在去中心化的情况下能够安全的进行。

    数据层的系统模型有很多,比如比特币的UTXO 模型、迅雷链的账户模型等。

    (1) 数据存储系统--数据库

    数据层的一大功能是存储,存储系统的选择原则是性能和易用性。一个网络系统的整体性能,主要取决于网络或本地数据存储系统的I/O性能,比如比特币用的是谷歌的LevelDB,据说这个数据库读写性能很好,但是很多功能需要开发者自己实现。

    数据库的历史:在IT界,其实一个特别古老的研究领域。从最初的文件系统,到后来的ER实体关系模型。实体关系模型的提出催生了一系列伟大的数据库公司和软件,例如IBMDB2, SybaseOracle,微软的SQLServerMySQL等等。以及,由此引发了传统数据库的三大成就,关系模型、事务处理、查询优化。再到后来随着互联网的盛行,MangoDB为典型代表的NOSQL数据库崛起。数据库技术本身在不停的演进,且一直是热门的方向,也包括XML为代表的半结构化,基于文本、语音和图像的非结构化数据处理等。伴随着现实的需求不断升级,数据库也在不断发展的,我们通过ER实体关系模型、通过NOSQL,能很好的解决数据存储和数据访问的Scalability问题。我们通过NOSQL数据库、云存储等技术解决了互联网海量数据的处理问题后,下一个问题接踵而至。那就是如何以一种规模化的方式解决数据真实性和有效性的问题。

    区块链的数据库和传统分布式数据库的比较。


     从图中可以看出,区块链的数据库使用技术还是数据库,知识在管理权限、数据节点分布、去中心化等部分有差异。区块链的不可篡改数据,必然伴随着数据存储的膨胀,这个会不会是一个问题呢?

    (2) 区块数据(Block

    区块数据主要是保存交易数据,不同的系统采用的结构不同,下面以比特币的区块结构为例做介绍。

    比特币的交易记录会保存在数据区块之中,比特币系统中大约每10分钟会产生一个区块,每个数据区块一般包含区块头(Header)和区块体(Body)两部分,如图2-1所示。

     

    区块结构:

    数据项

    描述

    长度

    Magic no(魔法数)

    总是0xD9B4BEF9

    4字节

    Blocksize(区块大小)

    到区块结束的字节长度

    4字节

    Blockheader(区块头)

    包含6个数据项

    80字节

    Transaction counter(交易数量)

    正整数VI=VarInt

    1-9字节

    Transactions(交易)

    交易列表(非空)

    <Transaction counter>-许多交易

    区块头的结构说明:

    数据项

    目的

    大小(字节)

    Version(版本)

    区块版本号

    4

    hashPrevBlock(前一区块的Hash)

    前一区块的256位Hash值

    32

    hashMerkleRoot Merkle(根节点Hash值)

    基于一个区块中所有交易的256位Hash值

    32

    Time(时间戳)

    从1970-01-01 00:00 UTC开始到现在,以秒为单位的当前时间戳

    4

    Bits(当前目标的Hash值)

    压缩格式的当前目标Hash值

    4

    Nonce(随机数)

    从0开始的32位随机数

    4

    比特币区块链格式可参考:https://blog.csdn.net/mengzaishenqiu/article/details/80340877

    区块链的数据结构成员分散存储在底层数据库,最终存储形式是[k,v]键值对,使用的[k,v]型底层数据库是LevelDB;与交易操作相关的数据,其呈现的集合形式是Block;如果以Block为单位链接起来,则构成更大粒度的BlockChain

    (3) 链式结构(chain

    从上面的区块结构中可以看到,每一个区块都保存了上一个区块的hash值,这样就将这些区块连接起来。

     

    (4) Merkle

     默克尔树(Merkle treeMT)是一种哈希二叉树,1979年由Ralph Merkle发明。在计算机科学中,二叉树是每个节点最多有两个子树的树结构,每个节点代表一条结构化数据。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现数据快速查询。二叉树如下图所示。

    A、Merkle树结构

    由一个根节点(root)、一组中间节点和一组叶节点(leaf)组成。叶节点(leaf)包含存储数据或其哈希值,中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。所以Merkle树也称哈希树。

    B、哈希树的特点:

    叶节点存储的是数据文件,而非叶节点存储的是其子节点的哈希值(Hash,通过SHA1SHA256等哈希算法计算而来),这些非叶子节点的Hash被称作路径哈希值(可以据其确定某个叶节点到根节点的路径)叶节点的Hash值是真实数据的Hash值。因为使用了树形结构其查询的时间复杂度为 O(logn)n是节点数量。

    默克尔树的另一个特点是,底层数据的任何变动,都会传递到其父节点,一直到树根。

    C、应用模式

    默克尔树的典型应用场景包括:

    l 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同(哈希算法决定的)。

    快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到Hash0-0Hash0 和 Root。因此,沿着 Root --> 0 --> 0-0,可以快速定位到发生改变的 D1

    零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0N1N4RootD0拥有者可以很容易检测 D0 存在,但不知道其它内容。

     相对于 Hash ListMT的明显的一个好处是可以单独拿出一个分支来(作为一个小树)对部分数据进行校验,这个很多使用场合就带来了哈希列表所不能比拟的方便和高效。正是源于这些优点,MT常用于分布式系统或分布式存储中

    D、在分布式存储系统中的应用原理

    为了保持数据一致,分布系统间数据需要同步,如果对机器上所有数据都进行比对的话,数据传输量就会很大,从而造成“网络拥挤”。为了解决这个问题,可以在每台机器上构造一棵Merkle Tree,这样,在两台机器间进行数据比对时,从Merkle Tree的根节点开始进行比对,如果根节点一样,则表示两个副本目前是一致的,不再需要任何处理;如果不一样,则沿着hash值不同的节点路径查询,很快就能定位到数据不一致的叶节点,只用把不一致的数据同步即可,这样大大节省了比对时间以及数据的传输量。

    E、比特币中的Merkle Tree

    比特币区块链系统中的采用的是Merkle二叉树,它的作用主要是快速归纳和校验区块数据的完整性,它会将区块链中的数据分组进行哈希运算,向上不断递归运算产生新的哈希节点,最终只剩下一个Merkle根存入区块头中,每个哈希节点总是包含两个相邻的数据块或其哈希值。在比特币系统中使用Merkle树有诸多优点:首先是极大地提高了区块链的运行效率和可扩展性,使得区块头只需包含根哈希值而不必封装所有底层数据,这使得哈希运算可以高效地运行在智能手机甚至物联网设备上;其次是Merkle树可支持“简化支付验证协议”(SPV),即在不运行完整区块链网络节点的情况下,也能够对交易数据进行检验。所以,在区块链中使用Merkle树这种数据结构是非常具有意义的。

     

    Merkle树的计算可参考:

    https://www.cnblogs.com/fengzhiwu/p/5524324.html

    https://blog.csdn.net/qq_33935254/article/details/55505472

    (5) 哈希函数

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

    哈希能够实现数据从一个维度向另一个维度的映射,通常使用哈希函数实现这种映射。通常业界使用y = hash(x)的方式进行表示,该哈希函数实现对x进行运算计算出一个哈希值y

    A、哈希算法的特点:

    l 哈希算法接受一段明文后,以一种不可逆的方式,将其转化为一段长度较短、位数固定的散列数据,计算高效。

    l collision-free 即冲突概率小,如果两个哈希值是不相同的(根据同一函数),那么这两个哈希值的原始输入也是不相同的;如果两个哈希值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。

    能够隐藏原始信息:例如区块链中各个节点之间对交易的验证只需要验证交易的信息熵,而不需要对原始信息进行比对,节点间不需要传输交易的原始数据只传输交易的哈希即可,常见算法有SHA系列和MD5等算法。

    l 加密过程不可逆,即无法通过输出的散列数据倒推原本的明文是什么。

    l 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化,冲突的概率非常小。

    B、哈希的用法:

    哈希在区块链中用处广泛,其一我们称之为哈希指针(Hash Pointer),哈希指针是指该变量的值是通过实际数据计算出来的且指向实际的数据所在位置,即其既可以表示实际数据内容又可以表示实际数据的存储位置。如下图所示:

    HashPointer在区块链中主要有两处使用,第一个就是构建区块链数据结构,从上面的区块数据结构中就可以知道,每个区块都包含了上一个区块的hash值(即hash pointer),这样的好处在于后面区块可以查找前面所有区块中的信息,而且区块的HashPointer的计算包含了前面区块的信息从而一定程度上保证了区块链的不易篡改的特性。第二个就是用于构建Merkle Tree.Merkle Tree的各个节点使用HashPointer进行构建。

    哈希还在其他技术中有所应用例如:交易验证以及数字签名等等。

    (6) 加密算法

    加密就是通过一种算法将原始信息进行转换,接收者能够通过密钥对密文进行解密还原成原文的过程。加密算法的典型组件有加解密算法、加密密钥和解密密钥。其中加解密算法是固定不变和公开可见的;密钥则不固定而且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。

    加密过程即通过加密算法和加密密钥,对明文进行加密,获得密文。解密过程即通过解密算法和解密密钥,对密文进行解密,获得明文。

    根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。

    并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。

    A、对称加密

    用相同的密钥来加密和解密,对称加密的优点是加解密效率高(速度快,空间占用小),加密强度高。缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏,如何在不安全通道下分发密钥是关键问题。

    加密过程:原文+密钥=》密文;解密过程:密文-密钥=》原文。

     

    对称密码从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为加密单位,应用最为广泛。后者则只对一个字节进行加密,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。

    代表算法包括:

    l DESData Encryption Standard):经典的分组加密算法,1977年由美国联邦信息处理标准(FIPS)所采用FIPS-46-3,将64位明文加密为64位的密文,其密钥长度为56+8位校验。现在已经很容易被暴力破解。

    l 3DES:三重DES操作:加密解密加密,处理过程和加密强度优于DES,但现在也被认为不够安全。

    l AESAdvanced Encryption Standard):美国国家标准研究所(NIST)采用取代DES成为对称加密实现的标准,1997~2000NIST15个候选算法中评选Rijndael算法(由比利时密码学家Joan DaemonVicent Rijmen发明)作为AES,标准为FIPS-197AES也是分组算法,分组长度为128192256位三种。AES的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段

    适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。其中分组加密每次只能处理固定长度的明文,因此过长的内容需要采用一定模式进行加密,《使用密码学》中推荐使用密文分组链接(Cipher Block Chain,CBC)、计数器(Counter,CTR)模式。

    B、非对称加密

    非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。加密密钥和解密密钥是不同的,分别称为公钥和私钥。公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。公钥用于加密,私钥用于解密。公钥由私钥生成,私钥可以推导出公钥,从公钥无法推导出私钥。

     

    它的优点是公私钥分开,不安全通道也可以使用。缺点是加解密速度慢,一般比对称加解密算法慢23个数量级;同时加密强度相比对称加密要差。

    加密过程:原文+接收方公钥=》密文;解密过程:密文+接收方私钥=》原文

     

    非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。

    代表算法包括:

    l RSA:经典的公钥算法,1978年提出。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。

    l Diffie-Hellman密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。

    l ElGamal:利用了模运算下求离散对数困难的特性。被应用在PGP等安全工具中。

    椭圆曲线算法(Elliptic curve cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在1985年提出。ECC系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。

    一般适用于签名场景或密钥协商,不适于大量数据的加解密。 其中RSA算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。

    C、混合加密机制

    这种方式将加密过程分为两个阶段,阶段一使用非对称加密进行秘钥的分发使得对方安全地得到对称加密的秘钥,阶段二使用对称加密对原文进行加解密,如下图所示。

     

    典型的场景是现在大家常用的HTTPS机制。

    建立安全连接具体步骤如下:

    客户端浏览器发送信息到服务器,包括随机数R1,支持的加密算法类型、协议版本、压缩算法等。注意该过程为明文。

    服务端返回信息,包括随机数R2、选定加密算法类型、协议版本,以及服务器证书。注意该过程为明文。

    浏览器检查带有该网站公钥的证书。该证书需要由第三方CA来签发,浏览器和操作系统会预置权威CA的根证书。如果证书被篡改作假(中间人攻击),很容易通过CA的证书验证出来。

    如果证书没问题,则用证书中公钥加密随机数R3,发送给服务器。此时,只有客户端和服务器都拥有R1R2R3信息,基于R1R2R3,生成对称的会话密钥(如AES算法)。后续通信都通过对称加密进行保护。

    D、常见加密算法的对比

    E、比特币中加密算法的使用

    比特币系统中使用的就是一种非常典型的非对称加密算法——椭圆曲线加密算法(ECC)。比特币系统一般从操作系统底层的一个密码学安全的随机源中取出一个256位随机数作为私钥,私钥总数为2256 个,所以很难通过遍历所有可能的私钥得出与公钥的对应的私钥。用户使用的私钥还会通过SHA256Base58转换成易书写和识别的50位长度的私钥,公钥则首先由私钥和Secp256k1椭圆曲线算法生成65字节长度的随机数。

     

    (7) 数字签名

    数字签名又称之为公钥数字签名,是一种类似于写在纸上的物理签名。数字签名主要用于数据更改的签名者身份识别以及抗抵赖。数字签名包含三个重要特性:

    l 只有自己可以签署自己的数字签名,但是他人可以验证签名是否是你签发;

    l 数字签名需要和具体的数字文档绑定,就好比现实中你的签名应该和纸质媒介绑定;

    l 数字签名不可伪造;

    通过非对称加密机制可以较容易实现上述三种特性。首先,需要生成个人的公私钥对:(sk, pk) := generateKeys(keysize)sk私钥用户自己保留,pk公钥可以分发给其他人其次,可以通过sk对一个具体的message进行签名:sig := sign(sk, message) 这样就得到了具体的签名sig最后,拥有该签名公钥的一方能够进行签名的验证:isValid := verify(pk, message, sig)在区块链体系中每一条数据交易都需要签名,在比特币的设计过程中直接将用户的公钥来表征用户的比特币地址。这样在用户发起转账等比特币交易时可以方便的进行用户交易的合法性验证。

    数字签名就是在信息后面加上另一段内容,作为发送者的证明并且证明信息没有被篡改。一般是发送者将信息用哈希算法处理得出一个哈希值,然后用私钥对该哈希值进行加密,得出一个签名。然后发送者再将信息和签名一起发送给接收者。接收者使用发送者的公钥对签名进行解密,还原出哈希值,再通过哈希算法来验证信息的哈希值和解密签名还原出来的哈希值是否一致,从而可以鉴定信息是否来自发送者或验证信息是否被篡,如下图所示。

     

    相关知识:数字证书和认证中心

    数字证书(Digital Certificate)又称“数字身份证”、“网络身份证”是经认证中心授权颁发并经认证中心数字签名的包含公开秘钥拥有者及公开秘钥相关信息的电子文件,可以用来判别数字证书拥有者身份。数字证书包含:公钥、证书名称信息、签发机构对证书的数字签名以及匹配的私钥证书可以存储在网络中的数据库中。用户可以利用网络彼此交换证书。当证书撤销后,签发此证书的CA仍保留此证书的副本,以备日后解 决可能引起的纠纷。

    认证中心(Certificate Authority) 一般简称CA, CA一般是一个公认可信的第三方机构,其作用主要是为每个用户颁发一个独一无二的包含名称和公钥的数字证书。CA解决了电子商务中公钥的可信度问题:负责证明“我确实始我”,CA是受信仟的第三方,公钥的合法性检验,CA证书内容包括:证书持有人的公钥、证书授权中心名称、证书有效期、证书授权中心的数字签名。

    CA证书用例-Https访问网站:

    *客户端通过https向服务器发安全链接请求

    *服务器用私钥加密网页内容,同CA证书一并发给客户端

    *客户端会根据CA证书验证是否合法:

    *如果验证失败,客户端弹出警告信息

    *如果验证通过,客户端使用CA证书中的公钥向服务器发送加密信息


    展开全文
  • 区块链作为一种架构设计的实现,与基础语言或平台等差别较大。区块链是加密货币背后的技术,是当下与VR虚拟现实等比肩的热门技术之一,本身不是新技术,类似Ajax,可以说它是一种技术架构,所以我们从架构设计的角度...


    前言

     

    区块链作为一种架构设计的实现,与基础语言或平台等差别较大。区块链是加密货币背后的技术,是当下与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),还有一些特殊的挖矿的过程。其他竞争币都是直接来自比特币的分支,所以编程语言相同,具体的技术选型和技术实现上可能有所改进,比如:莱特币,使用了其他的加密算法。

    官方网站:https://bitcoin.org/

    源码库:https://github.com/bitcoin
    (2)Nodejs/Javascript

    Nodejs平台强大的网络编程能力,以及js脚本语言的简单快捷,在区块链领域自然少不了它的身影。亿书便是这样一个区块链产品,亿书币是它的协议层,使用了著名的express开发框架,基于http协议开发而成。同时,它采用了授权股权证明机制(DPoS),算法上的改进,让它在处理交易时更加轻量,处理能力大大提升。它提供了强大的协作机制,为数字出版、版权保护提供了便利;扩展了侧链功能,可以基于它开发任何去中心化的应用,从而为专业作者、博客爱好者和开发者提供很多方便。《Nodejs开发加密货币》这本书完整分享了它的源码,从区块链基础概念到代码实现,从基本原理到开发设计思路,都做了比较详细的探索,目前为止,从协议层面深入代码讲解区块链技术实现的书籍极少,这算作一本。

    官方网站:http://ebookchain.org/

    源码库: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://ethereum.org/

    源码库: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
    其他编程语言,比如:C#等,也有具体实例,这里就不再列举。总之,针对不同的编程语言,在具体的编码或架构设计上可能有所差别,甚至很大,但是协议层所使用的技术并没有太大的变化。其中,网络编程是重点和难点,多数没有现成的框架可用,都是使用编程语言自身提供的库来设计开发,所以比较底层,非常考验开发者的编码功底。

     

    知识图谱

     

    循着上面的分析,我们已经可以了解区块链是什么,并知道怎么实现了,顺便梳理一下其中的编程技术知识,自然也就清晰多了。

    blockchain-lib

    根据个人的理解,我把与区块链相关的知识分为下面5个方面:

    (1)基础知识

    区块链是新技术,与之相关的是其背后大量的新概念、新理论。这些知识,虽然不直接体现在编码里,但却是理解区块链,掌握区块链技术的基本知识。所以,理当成为区块链技术不可或缺的一部分。这部分从基本概念入手,到工作原理的描述,就能够把区块链基础知识全部覆盖。

    (2)技术实现

    区块链是一项技术,但从上面的分析可以看出,它应该是一种架构应用,架构的实现理当是我们知识库的核心。正如大家看到的,任何一款区块链产品,协议层必须包括点对点网络、加密签名、数据存储、分布式算法等4个部分,应用层也必然要提供钱包、客户端浏览器等基础应用。所以,把这部分独立出来,也是合情合理。

    在扩展层的部分,区块链技术可以对接各种应用,比如:金融、物联网、网络安全、版权保护、电子商务等等,现有的很多技术都可以用在这里。只不过,如何与区块链结合,如何实现跨行业使用,自然是这部分内容研究的课题。所以,这里所罗列或涉及到的技术,理应归为技术实现的一个重要部分。

    (3)开发环境

    区块链是多项技术的组合,有其自身的复杂性,个别应用对开发环境依赖较大,开发工具与环境搭建,是让开发者快速上手的重要内容。

    (4)项目实践

    据说,短短数年,全球区块链产品已经有几千个,其中不乏创新应用。有些优秀的开源产品和项目实践,是最好的学习研究资料。

    (5)开发文档

    这个自然不用说了,每一种产品也都会有自己的开发文档。另一个,就是有心的开发者整理汇总的一些资源,可以帮助我们节省很多查询的时间。

    我在考虑这个知识体系的过程中,主要思考的是,读者循着这些标签去查阅文章,能否快速掌握区块链技术,并最终上手开发实现一个区块链产品。另外,也刻意规避了与具体编程语言,以及特定领域相关的词汇,唯一可以区分的就是这些节点之下对应的文章标签。所以,这些分类就显得非常中性。也考虑过使用比特币、竞争币、智能合约、数字资产、智能资产等具体领域的实现作为分类方法,但又怕限制了读者的思维,同时随着区块链的发展,这个图谱将不停的修改下去。这里,呼吁一下,希望读到这篇文章的小伙伴提供您的宝贵意见,让我们把这个关于区块链的知识分类图谱做得更加科学合理,使用更加方便。

     

    总结

     

    这篇文章,我们把区块链技术基础架构描述了一下,需要再次强调的是,这仅仅是一种实现方式,绝非所有的区块链产品都是如此,我们也期待更多创新出现,也相信一定会出现。编程实现罗列了几种编程语言与其实现的典型产品,因为协议层技术较为底层,并没有太多现成的框架需要介绍或讨论,同时,具体的技术细节,也绝非几行字能够罗列清楚,所幸,这些产品都是开源产品,大家可以结合自己的技术背景,进一步查看对应的产品源码,很快就能了解其中的奥妙。

     

    作者简介:朱志文,亿书创始人,CSDN区块链知识库特邀编辑。中国区块链俱乐部主创者和发起人,比特币的忠实粉丝,区块链技术的布道者,代表作《Nodejs开发加密货币》。


    文章来源: http://www.8btc.com/ebook-blockchain


    展开全文
  • 区块链是加密货币背后的技术,是当下与VR虚拟现实等比肩的热门技术之一,本身不是新技术,类似Ajax,可以说它是一种技术架构,所以我们从架构设计的角度谈谈区块链的技术实现。无论你擅长什么编程语言,都能够参考...
  • 区块链学习——区块链架构

    万次阅读 多人点赞 2018-04-20 10:17:39
    摘要通过我前几篇区块链知识的介绍,我们知道区块链系统实际上就是一个维护公共数据账本的系统,一切的技术单元的设计都是为了更好地维护好这个公共账本。通过共识算法达成节点的账本的数据一致;通过密码算法确保...
  • 区块链架构详解

    2018-06-03 11:26:33
    问题导读1.区块链去中心化网络采用的是什么通信协议...准备工作区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特币在区块链之上融入了金融学,货币学,博弈...
  • 区块链的本质和架构模型

    千次阅读 2018-04-08 17:36:30
    区块链的本质和架构模型区块链的定义和本质笔者经过对各种区块链异同点的分析和归纳思考,先给出了一个区块链定义。区块链是在符合现实社会法律法规前提下,可治理的,依赖于密码学算法和博弈经济性设计,基于共识...
  • 区块链架构1.0、2.0与3.0梳理

    万次阅读 2018-07-30 18:26:32
    区块链发展的三个阶段:比特币为代表的货币区块链技术为1.0、以太坊为代表的合同区块链技术为2.0、实现完备权限控制和安全保障的Hyperledger项目代表3.0。 一、区块链1.0架构 –数字货币 1、基本架构 2、...
  • 区块链是加密货币背后的技术,是当下与VR虚拟现实等比肩的热门技术之一,本身不是新技术,类似Ajax,可以说它是一种技术架构,所以我们从架构设计的角度谈谈区块链的技术实现。 无论你擅长什么编程语言,都能够...
  • 简述区块链架构设计,通俗易懂

    千次阅读 2017-09-29 09:25:17
    区块链架构设计
  • 区块链架构

    千次阅读 2018-01-22 17:48:13
    架构设计上来说,区块链可以简单的分为三个层次,协议层、扩展层和应用层。其中,协议层又可以分为存储层和网络层,它们相互独立但又不可分割。
  • 前面几章介绍了区块链背景以及相关的基础知识,本章将为读者介绍区块链架构区块链源于支持BitCoin虚拟货币 系统的底层基础架构,在支撑BitCoin平稳运行三四年后,以其独特的去中心化架构逐渐吸引IT业界的关注,...
  • 区块链原理及区块链架构

    千次阅读 2018-04-18 16:49:07
    区块链是什么:1. 区块链是一种不可篡改的分布式数据库。2. 数据库由区块按时间顺序连接而成3. 每个区块保存了一个时间段内的所有记录总结为:去中心化,集体维护,不可篡改,数据透明,用户匿名 区块链2.0智能...
  • 前言 区块链作为一种架构设计的实现,与基础语言或平台等...区块链是加密货币背后的技术,是当下与VR虚拟现实等比肩的热门技术之一,本身不是新技术,类似Ajax,可以说它是一种技术架构,所以我们从架构设...
  • 张铮文 渡鸦区块链专栏作者 ... 时常听人们谈起区块链,从 2009 年比特币诞生至今,各式各样的区块链系统或基于区块链的应用不断被开发出来,并被应用到大量的场景中,而区块链
  • 戳蓝字“区块链大本营”关注我们哦!每周日,「区块链大本营」人才快报与你不见不散!在这里,可以第一时间了解区块链的行业动态、技术风向与人才需求。求职者请将个人简历以Word...
  • 区块链又被称为分布式账本,与之对应的则是中心化账本,比如银行。与中心化账本不同的是,分布式账本依靠的是将账本数据冗余存储在所有参与节点中,来保证账本的安全性。简单地说,区块链会用到三种底层技术:点对点...
  • 区块链开发区块链架构与应用PPT

    千次阅读 2018-03-26 20:46:52
    这篇PPT是我《区块链技术与互联网金融的创新和挑战》的演讲PPT,主要面对初学者和行业应用者,主要汇聚了我在研究应用的中的一些体会。

空空如也

1 2 3 4 5 ... 20
收藏数 31,908
精华内容 12,763
关键字:

区块链架构