首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅析区块链之技术架构

上一篇文章大体介绍了区块链的基本概念和流程,此文主要介绍区块链的技术架构。不过开篇之前,先解释一下上一篇中提到的UTXO概念。

比特币中使用UTXO(未花费的交易输出,Unspent Transaction Output)实现支付系统的账户模型,并没有余额、钱包的概念,交易列表中的关键信息也是一些UTXO的组成,如此计算账户的余额则需要通过遍历整个交易历史来最终计算出每个账户的余额。UTXO的示例如下图所示:

可见除了coinbase这种交易之外,其他的交易都至少有一个交易的输入且必须引用一个输出,而一笔交易的输入可以引用之前多笔交易的输出。此外,任何一笔交易的交易输入总量必须等于交易输出总量(支出与找零)。其一般结构如下:

使用UTXO的优势如下:

私密性比较强,理论上可以为每一笔输出设置一个地址。

无需维护余额等状态值。

UTXO是独立数据记录,可以通过并行极大的提升区块链交易验证速度。

无需关心事务问题,只需要关心输出脚本即可。

能够清理过期交易,回收存储空间。

而以太坊则使用了传统所理解的账户模型,主要是因为UTXO无法支持图灵完备的智能合约实现。

接着,开始讲述本篇的主题-区块链技术架构

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

其中,区块的链式结构、UTXO以及智能合约是比特币发明人“中本聪”的原创发明。

存储

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

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

通信机制

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

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

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

安全机制

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

哈希算法:⽤来对⼀段数据进行计算,得出⼀个摘要信息,通俗点说就是给一段数据⽣成⼀个固定大小的身份ID, 且其是不可逆的。区块链使用哈希做工作量证明、交易ID生成、区块之间的关联等。此外,区块头中的Merkle Root也是使用哈希算法做完整性证明的(比特币中使用double-SHA256哈希算法)。常用哈希算法包括MD5、SHA1、SHA256等。

数据加密:区块链使用了非对称加密算法。比特币中的钱包地址本质就是一对公钥私钥。此外,区块链利用公钥哈希加锁比特币的输入记录,阻止输出。

数字签名:同样基于非对称加密技术,用签名和公钥解锁自己的比特币输入记录,使用比特币。

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

此外,这里具体介绍一下是如何使用区块中的梅克尔树来做完整型证明的。每当产生一次交易,那么就与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash,作为交易列表的摘要存到区块头中。比特币中使用的称之为二叉梅克尔树,而比如以太坊系统中使用的则是梅克尔-帕特里夏树。以二叉梅克尔树为例,流程可以概括为每相临的两条交易记录向上形成一个Hash值(如果仅有奇数个交易,则最后的交易会被复制一份以构成偶数个叶子节点),再与相邻的节点再往上形成Hash值,一直到树根形成所有交易记录的唯一Hash值,即Merkle根。如下图所示:

如此,一方面可以在数据同步有问题的时候快速定位到出错的交易记录,另一方面在节点只是需要验证支付(不同于交易,如验证是否有人完成了对自己的一笔交易)的时候,仅下载链的区块头即可,实现“简化支付验证”(SPV),能够极大的节省传输数据量。SPV的流程如下:

一个SPV节点会在节点间的通信链接上建立起布隆过滤器,限制只接受含有目标比特币地址的交易。

当节点探测到某交易符合布隆过滤器,它会以Merkle区块消息的形式向相邻节点索要包含区块头和一条连接目标交易与Merkle根的Merkle路径,如图中如果要验证交易1,那么则返回Hash2、Hash34即可。

SPV节点使用该路径找到与该交易相关的区块,验证对应区块中该交易的有无。

共识机制

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

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

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

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

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

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

由最后两点可知,挖到一个区块时,并不能过早的高兴,一般说来后面再跟五个确认过的区块(加上自己的区块,叫做六次确认),才能确认自己创建的区块的确是有效的,记录的交易也才认为是有效的(此时交易接收方可以认为交易已经成功)。

这个思路牺牲了一部分一致性来保证区块链的健壮性,即使只有一个结点,区块链系统依旧可以运行。同时也保证了区块链的安全性,除非51%的结点被控制。但一方面如果想要控制这么多节点,不仅要具有很强的算力,还相当于重构一个区块链网络,另一方面区块链会给予实现工作量证明创建区块成功的节点以奖励(每一个区块的交易清单的第一条交易为“系统给区块创建者支付xx奖励”,被称做coinbase交易,此交易没有输入),在比特币中奖励包括一部分新造比特币(一开始一个区块奖励50个比特币,每隔21万个区块自动减半,4年时间比特币总量最终会稳定在2100万个),一部分是从区块所包含的交易中抽取的挖矿手续费。如此权衡收益和破坏的成本,基本可以杜绝这种51%攻击(博弈学的使用)等。

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

比特币的PoW虽然很好的解决了分布式一致性问题,但其非常的耗费计算力,浪费电,并且这种纯粹靠CPU的计算会受到某些专用硬件的威胁,如ASIC芯片。而以太坊的POW算法叫做Ethash(最新版本为Dagger-Hashimoto),其特点是挖矿的效率基本与CPU无关,却和内存大小和内存带宽正相关,无法设计专用硬件来解答难题。

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

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

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

直到计算出符合难度目标的答案,就挖到一个区块(打包交易记录,其中优先记录手续费高的交易),即可将自己创建的区块广播出去,其他节点验证无误即保存到自己的区块链上。

如果同时有多个节点实现了工作量证明挖到了区块,那么整个网络集群采用少数服从多数原则,集群中大部分采用了哪个区块就选择此区块组成最新的账本,达到最终一致性。少数服从多数原则也是区块链防范攻击、保证数据安全性的一个核心的原则。

如果节点同步到了多个长度不同的区块链账本,那么选择其中最长的作为区块链账本,且在最长链之外挖矿,不会得到任何挖矿报酬。即“最长链规则”。

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

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

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

EOS的底层框架石墨烯-Graphene使用DPoS做为共识机制。

上层应用

可编程合约/可编程资产:交易验证并不基于一个不变的模式,而是通过运行脚本语言来实现可编程资产以太坊。

激励机制:虚拟货币激励,比特币、以太币。

成员管理:为整个区块链网络提供身份管理、隐私、保密和可审计的服务。通过公钥基础设施和去中心化共识机制使得非许可的区块链变成许可制的区块链。多中心组网、私钥公钥生成等。

这里需要提的是区块链中“地址”的含义。以比特币为例,地址本质上是一个私钥公钥对(ECDSA椭圆曲线算法),其存储和区块链和网络是没有关系的,可由用户的钱包软件生成并管理。而通常为了易于人们记忆,地址会在公钥的基础上做一个格式化转换。常用的格式包括:Base58Check(Base58+Checksum)、WIF压缩、130位和66位公钥。以最常用的Base58Check为例,可以概括为:Base58Check(RIPEMD160(SHA256(PubKey))),其流程如下:

而以太坊则是使用SECP256K1椭圆曲线算法生成公钥私钥对,再把公钥去掉04,剩下的进行KECCAK-256的哈希,得到长度64的16进制字串,丢掉前面24个,拿后40个,再加上”0x”,即为以太坊地址。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180405G0GVTA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券