社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  区块链

浅析区块链

运维之美 • 7 年前 • 646 次点击  

从去年开始,区块链突然如火如荼起来,相关的新闻席卷微博、朋友圈、科技论坛、门户网站等各大媒体。业界大佬们更是频频发言,有宣称不做区块链就会被时代淘汰的,也有说坚决不碰区块链的。国家队也是频频出手,管制、定性、做应用,央行更是默默地把区块链专利数量做到了世界前列。面对众多纷杂的信息、众多的技术分析文章,很容易让人脑袋嗡嗡,怕不懂,更怕懂了啥也都做不了。于是决定梳理一下相关的信息,看看这区块链到底是什么东西。

开篇之前,先抛出笔者的一个观点:区块链最合适的应用场景只有虚拟资产,除了虚拟资产的其他场景都是在蹭概念或者不是真正意义上的区块链,而且只要有人参与的业务流程都无法满足区块链设计的初衷。

区块链是什么

说到区块链,需要先了解其产生的背景,这样才能理解为何如此设计区块链。区块链的出现是和一个叫做“暗网”的东西相关的。所谓“暗网”与我们常见的“互联网”相比,只有通过特殊的软件才能够访问,并且在暗网上基本都是些黑市交易,无法见光,参与这些交易的人都不想暴露真实的位置、个人信息。应对这种交易需求,才出现了比特币。所以说,区块链一开始是为了解决匿名交易的问题出现的,也就是比特币。这也是区块链的第一个阶段,即一套账本体系和货币发行机制;后来基于区块链技术,出现了以太坊,在改进比特币区块的基础上加入了智能合约机制,称之为区块链2.0;以太坊之后,类似以太坊的一些扩展应用,能够对于每一个互联网中代表价值的信息和字节进行产权确认、计量和存储,能够扩展到几乎任何领域,这是区块链的第三个阶段,区块链将完成价值的交换。目前我们处在区块链2.0阶段。

其实从本质上看,区块链和Git类似,每个节点都有一份数据的存储,不同的是区块链没有中央服务器这么个概念,就是一个分布式无中心数据库,其有效的通过数学的方式在数据库没有管理员的情况下对内容达成一致,并且不通过正式工资或是分得股权就能奖励那些帮助使数据库变得更有价值的人们,最终能够实现无争议无抵赖的匿名交易。概括来看,其特点如下:

  • 去中心化:互联网本来的意义就是平等开放,所以有一种言论就是区块链是回归互联网本来意义的希望。这一点是区块链天然的优势,所有节点都存有数据的副本即实现了“去中心化”。

  • 无法篡改: 得益于区块之间的链式结构,可以保证数据无法篡改或者篡改的成本远大于收益。

  • 公开透明:每个节点保存的信息相同,能够消除信息不对称,实现信息透明。


与传统的关系型数据库用一张表或者多张独立的表存储数据,“区块链”使用多个“数据表”并且多个“数据表”形成前后衔接的链式结构,以防止数据被篡改(修改任何一个区块就破坏了链式结构)。总体的结构如下所示:



其中每一个“数据表”在区块链中被称为“区块”。格式如下:



这是区块链技术基本都具有的一些头部信息,包括4字节的版本号、32字节的上一个区块的哈希值、32字节的Merkle根、4字节的时间戳(当前时间)、4字节的难度目标以及4字节的随机数。

  • 版本号:用于跟踪软件/协议的更新。如果新版本的软件不兼容旧版本的软件,那么就认为是发生了“分叉”。

  • 上一区块头哈希值:存储的是链上上一个区块的哈希值,也是区块链设计的精髓所在。

  • Merkle根:为了在区块中体现出交易而做的一个计算,主要是解决帐本中交易记录Hash计算的效率问题。每当产生一次交易,那么就与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash,作为交易列表的摘要存到区块头中。流程可以概括为每相临的两条交易记录向上形成一个Hash值,再与相邻的节点再往上形成Hash值,一直到树根形成所有交易记录的唯一Hash值,即Merkle根。

  • 时间戳:该区块产生的近似时间。这个时间虽然是节点生成的但是其是否有效需要其他节点的认可(允许有一定程度的误差)。

  • 难度目标:该区块工作量证明的算法的目标值。

  • Nonce: 用于工作量证明算法的计数器。


区块体的信息可以根据应用场景不同而不同,如比特币存储的就是交易,以太坊存储的则是智能合约脚本。

此外,还需要说一下“块高度”的概念。区块链网络的创世块(第一个区块)的块高度为0,如此每增加一个区块高度就+1,如第一个图所示,如果最左侧的快为创世块,那么最后一个区块的块高度就是2。

区块链典型运行流程

以比特币为例,区块链的一个典型交易流程:

  • 新的交易向全网所有节点广播。

  • 每一个节点都将收到的交易信息纳入最新的区块中、

  • 直至最新的区块已经满了,那么每一个节点都尝试根据最新的区块的信息找到一个具有足够难度的工作量证明。

  • 当一个节点找到了一个工作量证明,它就像全网进行广播,并记录一个新的区块。

  • 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性。


区块链技术架构


其实从本质来看,区块链不能算是一个新的技术,更应该看做是一个新的技术框架,是基于很多成熟的技术而成的,而且不仅仅是技术,还有金融学,货币学,博弈学等。其技术架构如下图所示:


存储

区块链在每一个节点会存储数据,并且需要持久化存储,存储方式和传统的应用一样,包括数据库和文件系统。

对于存储方式的选择, 区块链中并没有做相关的规定,而比特币和以太坊都使用LevelDB做为持久化存储方式。

通信机制


区块的通信是基于P2P技术,即不区分客户端和服务端的网络,和P2P下载是类似的原理。在区块链中其功能点包括:

  • 把需要存储的数据广播到所有节点上进行储存。也就是多播。

  • 查询整个网络集群中所有节点的最新数据,如果自己节点的数据与大部分节点的数据不一致,则更新自身的数据与大部分节点存储的数据一致。这个功能也是防止数据被篡改的一个很重要的机制。当然这个也会引起51%攻击的问题。但区块链使用其他的机制极大杜绝了这种风险,下文会提到。


安全机制


区块链同样使用了很多成熟的安全技术来保障其特点。

  • 哈希算法:⽤来对⼀段数据进行计算,得出⼀个摘要信息,通俗点说就是给一段数据⽣成⼀个固定大小的身份ID, 且其是不可逆的。区块链使用哈希做工作量证明、交易ID生成、区块之间的关联等。

  • 数据加密:区块链使用了非对称加密算法,如利用公钥加密比特币的获取、流出记录,使用的时候用私钥解密。

  • 数字签名:同样基于非对称加密技术,用私钥对自己的发起的一次交易、记录等做签名,使用公钥可以验证其身份。

  • 零知识证明:所谓零知识证明即在不知道答案的情况下去验证给出的答案是否正确。这个过程完全靠机器验证,机器根据题目给出随机试验以验证答案是否正确。在某些区块链应用中如Zcash\ZCoin即使用了零知识证明来保证交易双方和交易金额的匿名性, 提供了绝佳的支付隐私。此技术详细可见:零知识证明(Zero-Knowledge Proof)原理详解


共识机制


对于分布式系统来说,一个非常核心的问题就是如何让所有节点达成一致,也就是共识机制。在区块链出现之前,已经有了一些解决方案,这里称之为传统分布式一致性算法:

  • Paxos算法:基于消息传递且具有高度容错特性,类似于议会投票的过程分为三种角色Proposer、Acceptor及Learner,主要就是Proposer发起投票,Acceptor进行投票的一个过程。具体可见:可靠分布式系统基础Paxos的直观解释。这里需要说明的是。Zookeeper使用的是ZAB协议,其类似于Paxos算法,对Paxos做了一些改造。

  • Raft算法:相比起Paxos算法,RAFT更加注重算法的落地性和可理解性,其核心思想是如果数个数据库初始状态一致,只要之后的进行的操作一致,就能保证之后的数据一致。分为Leader、Follower以及Candidate三种角色,基于Log进行数据同步。大体就是选举Leader,然后Leader生成Log,Follower进行同步的一个过程。详细可见:Raft协议详解。


对于不需要货币体系的联盟链或者私有链而言,所有的节点都是绝对信任的节点,考虑到对性能的要求,一般选择传统的一致性算法即可。但由于这些传统的方案仅仅是考虑到了节点会有网络故障或者宕机的问题,没有考虑到节点会作恶(篡改消息)的情况。因此,在比特币、以太坊这种区块链上并不适用。于是有了以下的分布式一致性算法:

  1. PBFT: 拜占庭容错,针对的是拜占庭将军问题而提出的一种一致性算法。分为三个阶段:预准备(pre-prepare)、准备(prepare)和确认(commit)。大体的流程就是节点之间互相转发消息,以其中相同的大多数作为最终答案。此算法的可靠度受制于结点的数量影响(N ≥ 3F + 1,总的结点数目必须大于有问题节点的数目的三倍),因此使用受限,在IBM的私有链Hyperledger中得到了使用。

  2. PoW: Proof of Work,工作量证明。这个是比特币、莱特币等货币型区块链使用的共识机制。类似于现实中的毕业证、驾照等,来证明你具有某种能力。可以认为PoW彻底解决了分布式一致性的问题。其过程以比特币为例,如下:

  • 矿工在网络中拿到最新一个区块的头部信息,其中的Merkle根包含了交易记录的信息摘要;

  • 将拿到的头部信息作为参数,将nonce值从零开始,去计算其双重SHA256值(SHA256(SHA256(头部信息)));

  • 如果算出的答案不符合要求(前n位为0),则将nonce值增加一个单位,再算;

  • 直到计算出符合难度目标的答案,就挖到一个区块,即可将自己创建的区块广播出去,其他节点验证无误即保存到自己的区块链上。

  • 如果同时有多个节点实现了工作量证明,那么整个网络集群采用少数服从多数原则,集群中大部分采用了哪个区块就选择此区块组成最新的账本,达到最终一致性。

  • 如果节点同步到了多个长度不同的区块链账本,那么选择其中长的作为账本。


这个思路牺牲了一部分一致性来保证区块链的健壮性,即使只有一个结点,区块链系统依旧可以运行。同时也保证了区块链的安全性,除非51%的结点被控制。但一方面如果想要控制这么多节点,不仅要具有很强的算力,还得相当于重构一个区块链网络,另一方面区块链会给予实现工作量证明的节点以奖励。权衡收益和破坏的成本,基本可以杜绝这种51%攻击(博弈学的使用)。

此外,还需要提到区块头中的难度目标这个值,此值与计算耗时是反比的,即此值越大,那么计算越容易。以比特币为例,为了控制每十分钟产生一个区块的速率,需要根据统计数据动态调整难度目标从而可以宝成区块的生产速率。

PoW虽然很好的解决了分布式一致性问题,但其非常的耗费计算力,浪费电。

3. PoS: Proof of Stake,权益证明机制。是一种通过业务规则达成共识的方式。基本概念是产生区块的难度应该与用户在网络里所占的股权成比例。具体来说就是根据钱包里面货币的多少以及货币在钱包里存在的天数来合成一个单位(币天),然后根据币天的关系对计算机进行哈希计算降低(谁的钱包里的币天数越大谁拥有记账权的概率就越大)。如此,能够减少对计算资源的浪费,提高计算性能。但是它也是牺牲了一部分的共识,而且需要等待多个确认。与PoW类比于比力量大小,PoS就是比耐力大小。

PoS目前已经使用在以太坊中。

4. DPoS: Delegate Proof of Stake。是基于POS衍生出的更专业的解决方案,类似于董事会的投票机制,选举出n个记账节点,在节点中提案者提交的提案被这些记账节点投票决定谁是正确的。此机制性能比较高,但是其选出的delegate节点是能够作恶的。

DPoS在EOS中被使用。

性能

目前区块链无法得到大规模应用的一个很大问题就是性能,比特币的每秒交易量只有3/秒,而以太坊也就30/秒。虽然EOS这个项目号称能达到几百万/S,然而分布式系统的本质让这个指标有点难以相信,而且这个数据也仅仅是建立在其几百个结点的基础上。

目前,提升区块链的方案主要有以下两种:

  • 链外解决方案:即允许小型和频繁的交易发生在与主链并行并由主链背书的侧链实例上。只将比特币区块链用作大额交易的结算网络——小规模交易由区块链之外的支付中心处理(off-chain scaling,链外扩展)。

  • 链上解决方案:直接修改区块链设计以支持高性能。具体的可见:区块链性能提升:链上设计之道


当然,如果使用私有链或者联盟链,其中的共识机制采取传统的分布式一致性算法或者高效的其他一致性算法也可以解决性能的问题。

应用场景

由于区块链本身的去中心化、不可篡改、安全等特性,需要第三方机构的应用场景都可以使用区块链技术。主流的应用场景如下:

  • 公正防伪

  • 资产交易

  • 信用体系

  • 物品溯源

  • 身份验证

  • 文件存储

  • 银行结算

  • 版权控制


技术平台


区块链的技术平台总体上可以分为公有链、联盟链和私有链,其大体的对比如下:

.公有链联盟链私有链
参与者任何人自由进出联盟成员个体或公司内部
共识机制PoW/PoW/DPoS分布式一致性算法分布式一致性算法
记账人所有参与者联盟成员协商确定自定义
激励机制需要可选不需要
中心化程度去中心化多中心化(多)中心化
特点信用的自建立效率和成本优化透明和可追溯
承载能力3-20万/s1000-1万笔/s1000-10万笔/s
典型场景虚拟货币支付、结算审计、发行
代表项目比特币、以太坊Hyperledger、腾讯TrustSQL


比特币


比特币早于区块链走入人们的视野,并且很长时间内许多人都把比特币和区块链看做同一个东西。其实比特币是基于区块链的一个应用,是区块链技术的副产品,是区块链的第一个应用,其他技术平台基本都是在比特币的基础上开发出来的。区块链可以类比为我们平时使用的JavaEE技术,比特币则是基于JavaEE开发的应用。

以太坊


以太坊的诞生是为了解决比特币只适合加密数字货币场景,不具备图灵完备性,也缺乏保存实时状态的账户概念的问题,同时也是为了解决PoW机制带来的效率和资源浪费的问题。以太坊既是一个数字货币系统,也是一个智能合约的开发平台(类似AppStore这种应用开发平台,一个智能合约即一个应用)。可以把以太坊看做一个完全去中心化的电脑,不过使用此电脑需要用以太币支付费用(Gas)。

智能合约是以太坊最为核心的一个概念:提供了一个功能更强大的合约编程环境。一个合约类似一个合同,一旦写好即无法修改。每个节点都执行软件的一部分。类比于数据库中的触发器和存储过程,智能合约在区块链中是一个沙箱中的脚本(无法调用外部API),用于执行业务逻辑,也可以用于各种检查。开发智能合约使用的是Solidity语言。其是在Javascript语言基础上做的修改。合约代码会编译成字节码发布到以太坊网络,在EVM(Ethereum Virtual Machine)中执行。开发智能合约主要用到两个框架:

  • Truffle Framework:Truffle提供了一整套部署测试的工具,可以方便和web3.js(以太坊提供的NodeJS SDK)结合使用。

  • dapphub: 提供了很多实用的合约,比如数学运算、权限验证等。


其实比特币的交易也可以看做智能合约,只不过在比特币中就是⼀对锁定与解锁脚本,受限只能实现转账交易。

使用以太坊发行货币是非常简单的事情,官网提供了配套的代码和工具:https://www.ethereum.org/token,也可以参照这个指引:一步步教你创建自己的数字货币(代币)进行ICO。

这里还要说明一下ETC和ETH的区别。在以太坊的发展过程中,2016年6月区块链业界最大的众筹项目TheDAO遭到黑客攻击,导致300多万以太币资产被分离出TheDAO 资产池。鉴于区块链的去中心、匿名的特征,资金根本无法追回,于是以太坊的发明人V神决定从块高度1760000开始把任何与The DAO和child DAO相关的交易认做无效交易,硬生生把以太坊做了分叉(区块链软件升级,老版本不能识别某些新的数据)。但有另外一些人并不认同这种做法,而继续使用原来的以太坊软件,于是以太坊便发生了分叉,原来的以太坊被叫做了ETC(以太经典)。

EOS

Enterprise Operation System,是由和V神齐名的BM大神发起的区块链项目,从名字上看其目的就是构建一个商业操作系统。由于其是一个ICO项目,且被某比特币大V进行了投资,因此受到的议论比较多。EOS的设计针对的是区块链性能太低满足不了很多应用场景以及在以太坊上进行操作需要支付费用等问题。

EOS号称自己能够达到每秒百万级的处理量,且具有高度自治,并能够为开发dApp的开发者提供底层模块,降低开发门槛。EOS也不收取任何费用,并能够通过并行链和DPOS的方式解决延迟和数据吞吐量的难题。

联盟链和私有链

市面上有一些联盟链和私有链技术平台,可以基于此做一些区块链应用开发。如下:

  • 腾讯TrustSQL:腾讯主导的可信数据库区块链平台,https://trustsql.qq.com/。

  • 百度区块链开放平台:百度主导的区块链平台,https://chain.baidu.com/。

  • IBM的HyperLedger/EEA私有链,也被称作超级账本。


ICO

提到区块链,ICO是不得不提的一个概念,类比于IPO,ICO是首次发币代售,提供了一种平等、低门槛的方式让普通民众参与到经济活动中,目前能够进行ICO的平台(能够方便发代币)主要是以太坊和比特股(Bitshares)。这种东西本意是好的,可以降低公司融资的成本,好的项目不会再看风投脸色,好的Idea也不会再胎死腹中,用户ICO获得的Token还可以带来实际的经济效益。但是由于缺乏IPO一样的管制,已经彻底沦为了收割智商的工具。

如上文所说,其实基于以太坊发行虚拟货币是非常简单的,如果你文采够好随便写个白皮书,洋洋洒洒描绘一个去中心化的蓝图,再找几个所谓业界大神站个台,好了,剩下的就等着数钱吧。当然,不排除有真心想做出一个项目的,但绝大多数都是些空气项目,发起人不过是发了个空气币,然后卷钱跑路。

说到ICO,虚拟货币交易所也是关键的角色,在这里可以流通法币和各种虚拟货币。有点令人不解的是,去中心化的区块链虚拟货币竟然需要一个中心化的“交易所”。黑客们攻击不了区块链,攻击一个中心化的交易所还是有许多路可寻的。最近频频发生的虚拟货币交易所被攻击的事情也算是对这种模式的一种讽刺。

开发参考


如果想实现自己的区块链平台或者了解区块链的实现,可以通过比特币、以太坊的代码学习,也可以参考以下资料:


小结

区块链技术的出现以一种全新的思路解决了分布式一致性的问题,技术+博弈学(激励)+金融学的使用巧妙的构建了一个安全健壮的系统。这些思路给开发者在平时的学习工作中会有很多的思考和提示。而随着比特币价格的水涨船高,区块链目前是被过度炒作的,大部分应用都是联盟量和私有链,已经违背了区块链设计的初衷。虽然是有应用场景,但笔者认为这和共享分布式数据库没有本质上的区别。此外,虽然区块链上的数据是无法篡改的,但是如果数据上链有人工参与的环节,那么这一步如何防止篡改呢?这也是我开篇观点产生的原因。

至于能用区块链做什么?在笔者看来,去研究区块链技术平台只有大公司、政府能做和推广起来,不过最后也只不过是“联盟链”、“私有链”。而对于创业公司或者个人来说,基于公有链、联盟链做之上的应用则更为合适,比如在以太坊/EOS上做一个养宠物的游戏^_^。

参考资料


  • 来源:后端技术杂谈

  • 原文:http://t.cn/Rn4FkTr

  • 题图:来自谷歌图片搜索

  • 版权:本文版权归原作者所有




今日思想


时间并不存在,存在的只有此刻。


——魔女猎人




更多精彩热文:




今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/IDpUSLpxO9
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/8872
 
646 次点击