区块链技术浅析

零知识证明与一个小故事

零知识证明是一种身份认证技术,是指证明者能够在不向验证者提供任何有用信息的情况下,使验证者相信某个论断是正确的,证明者向验证者证明并使验证者相信自己知道某一消息或拥有某一物品,但证明过程不需要(也不能够)向验证者泄露。

早在16世纪的文艺复兴时期,意大利有两位数学家为竞争一元三次方程求根公式发现者的桂冠,就采用了零知识证明的方法。当时,数学家塔尔塔里雅和菲奥都宣称自己掌握了这个求根公式,为了证明自己没有说谎,又不把公式的具体内容公布出来,他们摆开了擂台:双方各出30个一元三次方程给对方解,谁能全部解出,就说明谁掌握了这个公式。比赛结果显示,塔尔塔里雅解出了菲奥出的全部30个方程,而菲奥一个也解不出。于是人们相信塔尔塔里雅是一元三次方程求根公式的真正发现者,虽然当时除了塔尔塔里雅外,谁也不知道这个公式到底是个什么样子。

区块链概念

  • 一个分布式的链接账本,每个账本就是一个“区块”;
  • 基于分布式的共识算法来决定记账者;
  • 账本内交易由密码学签名和哈希算法保证不可篡改;
  • 账本按产生时间顺序链接,当前账本含有上一个账本的哈希值,账本间的链接保证不可篡改;
  • 所有交易在账本中可追溯。

技术原理以比特币为例

区块链工作原理概要

1.交易的生成 (区块的结构)

2.交易的传播(如何传播)

3.交易验证(交易的合法性,谁来记账,记账原则)

4.验证结果P2P网络传播

5.交易写入账本(如何共识,账本一致性问题)

1.交易的生成

区块链结构

交易信息创建

在传统的金融交易中,交易的身份和合法性由金融机构来认证,A向B发起转账,由金融机构来确保该笔交易的合法性并创建交易流程,而区块链的交易是去中心化的,那么如何确保交易双方身份的合法性呢?

在密码学中使用数字签名保证身份,使用数字签名时,每个人都可以自己生成一个秘钥对,这个秘钥对包含一个私钥和一个公钥:私钥必须严格保密,不能泄漏给其他人;公钥可以公开给任何人。

当私钥持有人A用自己的私钥对消息进行签名,然后,把消息、签名和自己的公钥发送出去,其他任何人都可以通过小明的公钥对这个签名进行验证,如果验证通过,可以肯定,该消息是小明发出的。

将交易信息全网广播,每个节点都将收到的交易信息纳入到一个区块中。

数字签名

发送方将数据Hash,得到摘要(Digest)

用自己的私钥,加密摘要,生成签名(Signature),然后在不可信的公网上进行传播

接收方使用发送方公钥对签名解密,得到摘要[1]

对数据内容Hash,得到摘要[2]。

如果摘要[1] = 摘要[2],则说明纸条由发送方发送,且内容未经改动。

UTXO

UTXO(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易过程中的基本单位。除创世区块以外,所有区块中的交易(Tx)会存在若干个输入(Tx_in,也称资金来源)和若干个输出(Tx_out,也称资金去向),创世区块和后来挖矿产生的区块中给矿工奖励的交易没有输入,除此之外,在比特币系统中,某笔交易的输入必须是另一笔交易未被使用的输出,同时这笔输入也需要上一笔输出地址所对应的私钥进行签名。当前整个区块链网络中的UTXO会被储存在每个节点中,只有满足了来源于UTXO和数字签名条件的交易才是合法的。所以区块链系统中的新交易并不需要追溯整个交易历史,就可以确认当前交易是否合法。

1)001号交易为Coinbase交易,由系统直接奖励发行比特币,Alice得到了12.5个比特币的奖励,放在001号交易的“输出”部分。此时,对于Alice来说,拥有了这12.5个比特币的支配权,这12.5个比特币的输出可以作为下一笔交易的“输入”,这笔“输出”就称之为是Alice的未花费输出,也就是Alice的UTXO的意思。

2)002号交易中,Alice转账6比特币到Bob的地址,Alice找到了自己的UTXO(如果Alice不止一笔UTXO,可以根据一定的规则去选用,比如将小金额的先花费掉),由于只是需要转账6比特币,可是UTXO中却有12.5个,因此需要找零6.5个到自己的地址中,由此产生了002号中的交易输出,注意,在002号交易输出中的Alice地址是可以和001号中的Alice地址不一样的,只要都是属于Alice自己的钱包地址就可以。

3)003号交易中,Bob转账了2比特币到Lidy的地址。

多种交易类型

n一般交易

输入0(来自Alice,被Alice私钥签名) ==>输出0(给Bob)

​ ==>输出1(给Alice,找零)

n集合型交易****--明显的增加交易的矿工费

输入0

输入1 ==>输出0

...输入N

n分散性交易

​ ==>输出0

输入0 ==>输出1

​ ==>输出2

余额

UTXO 模型通过链式的方式组织所有交易的输入和输出,每一个交易的输出最终都能追寻到一个 Coinbase,也就是当前 Bitcoin 被挖出时的区块的第一笔交易。

比特币没有余额的概念,账户余额是该账户所有未支付交易输出条目的总和,是区块链中计算出来的结果,如果从创世区块开始计算余额,则开销巨大,所以有些比特币客户端的实现还维护一个UTXO数据库,也称UTXO池,是区块链中所有未支付交易输出的集合。“UTXO池”的名字听上去与交易池相似,但它代表了不同的数据集。UTXO池不同于交易池和孤立交易池的地方在于,它在初始化时不为空,而是包含了数以百万计的未支付交易输出条目,有些条目的历史甚至可以追溯至2009年。UTXO池可能会被安置在本地内存ze'kai'xi,或者作为一个包含索引的数据库表安置在永久性存储设备中。

2.交易的传播

P2P网络

P2P 网络不同于传统的C/S结构,每个节点都可以既是客户端也是服务端,因此也不适合使用 HTTP 协议进行节点之间的通信,一般都是直接使用 Socket 进行网络编程。P2P 主要存在四种不同的网络模型,也代表着 P2P 技术的四个发展阶段:集中式、纯分布式、混合式和结构化模型

混合式。混合式其实就是混合了集中式和分布式结构,网络中存在多个超级节点组成分布式网络,而每个超级节点则有多个普通节点与它组成局部的集中式网络。一个新的普通节点加入,则先选择一个超级节点进行通信,该超级节点再推送其他超级节点列表给新加入节点,加入节点再根据列表中的超级节点状态决定选择哪个具体的超级节点作为父节点。这种结构的泛洪广播就只是发生在超级节点之间,就可以避免大规模泛洪存在的问题。在实际应用中,混合式结构是相对灵活并且比较有效的组网架构,实现难度也相对较小,因此目前较多系统基于混合式结构进行开发实现。比特币网络如今也是这种结构。

3.交易的验证

去中心化记账

分布式系统中,多个主机通过异步通信方式组成网络集群。在这样的一个异步系统中,需要主机之间进行状态复制,以保证每个主机达成一致的状态共识。由于分布式系统中节点的不可靠性。因此需要在默认不可靠的异步网络中定义容错协议,以确保各主机达成安全可靠的状态共识。

从去中心化账本系统的角度看,每个加入这个系 统的节点都要保存一份完整的账本,但每个节点却不能同时记账,因为节点处于不同的环境,接收到不同 的信息,如果同时记账的话,必然会导致账本的不一 致,造成混乱。因此,需要有共识来达成哪个节点有权记账。

拜占庭将军问题

拜占庭将军问题是Leslie Lamport在20世纪80年代提出的一个 假象问题。拜占庭是东罗马帝国的首都,由于当 时拜占庭罗马帝国国土辽阔,每支军队的驻地分隔很 远,将军们只能靠信使传递消息。发生战争时,将军们必须制订统一的行动计划。然而,这些将军中有叛 徒,叛徒希望通过影响统一行动计划的制定与传播, 破坏忠诚的将军们一致的行动计划。因此,将军们必须有一个预定的方法协议,使所有忠诚的将军能够达成一致,而且少数几个叛徒不能使忠诚的将军做出错误的计划。也就是说,拜占庭将军问题的实质就是要寻找一个方法,使得将军们能在一个有叛徒的非信任环境中建立对战斗计划的共识。在分布式系统中,特别是在区块链网络环境中,也和拜占庭将军的环境类似,有运行正常的服务器(类似忠诚的拜占庭将军),有故障的服务器,还有破坏者的服务器(类似叛变的拜占庭将军)。共识算法的核心是在正常的节 点间形成对网络状态的共识。

Lamport对拜占庭将军问题的研究表明,叛徒的个数m小于将军总数n的1/3时,通过口头同步通信(假设通信是可靠的),即将军们可以达成一致 的命令。但如果通信是可认证、防篡改伪造的(如采 用PKI认证,消息签名等),则在任意多的叛徒(至少得有两个忠诚将军)的情况下都可以找到解决方案。

POW工作量证明

以谁为准?工作量证明机制(Proof-of-Work),定义如下:一般是要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用,工作量证明机制的原理就是之前提到的零知识证明

比特币区块链通过竞争记账的方式解决去中心化的记账系统的一致性问题。 比特币系统设计了以每个节点的计算能力即“算力”来竞争记账权的机制。在比特币系统中,大约每 10分钟进行一轮算力竞赛,竞赛的胜利者,就获得一次记账的权力,并向其他节点同步新增账本信息。采用工作量证明(PoW)的机制来实现竞争结果判定。

1.生成Coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,并生成默克尔哈希;

2.把默克尔哈希及其他相关字段组装成区块头,将区块头(Block Header)作为工作量证明的输入,区块头中包含了前一区块的哈希,区块头一共80字节数据;

3.不停地变更区块头中的随机数即nonce的数值,也就是暴力搜索,并对每次变更后的的区块头做双重SHA256运算,即SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。

默克尔根

将区块中要包含的交易信息依次排序,每条交易信息进行hash,从第0条交易开始,对每两个交易的哈希(hash)相加结果进行哈希(hash),若交易个数为奇数,最后一个交易复制自己的哈希值进行哈希,然后多次迭代直到最后只有一个哈希值,该哈希值就是默克尔根(Merkle root),整个树状结构数据就是默克尔树。

任意一个叶子节点的交易被修改,叶子节点hash值就会变更,最终根节点的hash值就会改变。所以确定的根节点的hash值可以准确的作为一组交易的唯一摘要。

默克尔树比较典型的应用就是P2P下载在点对点网络中作数据传输的时候用来校验数据的完整性

4.交易的传播

交易池

比特币内存池里面都是还没有被纳入区块链中的交易,也叫交易池。

几乎比特币网络上的每个节点都维护一个名为 memory pool,mempool_或_transaction pool 的未确认交易的临时列表。节点使用该池来跟踪网络已知但尚未包含在区块链中的交易。

当用户使用比特币发起交易之后,会通过P2P网络广播发送到各个节点,每个节点再把这个交易放入交易池中。随后矿工挖矿、也就是生成区块的时候,再从交易池中选择一部分交易进行打包。当区块生成以后,相关的交易就从交易池中移除。

节点需要为内存池中的每笔交易分配一个优先级,并选择较高优先级的交易记录来构建候选区块。交易的优先级是由交易输入所花费的UTXO的交易创建时间决定,交易输入值高且创建时间较早的交易比那些较新且输入值小的交易拥有更高的优先级。区块中用来存储交易的前50K字节是保留给较高优先级交易的,如果区块中有足够的空间,高优先级的交易行为将不需要矿工费。矿工费越高,交易被处理的优先级也越高。

孤儿池

一些节点实现还维护一个单独的孤儿交易池。如果交易的投入引用尚未知晓的交易,好像遗失了父母,那么孤儿交易将临时存储在孤儿池中,直至父交易到达。

将交易添加到交易池时,将检查孤儿交易池是否有任何引用此交易输出的孤儿(后续交易)。然后验证任何匹配的孤儿。如果有效,它们将从孤儿交易池中删除并添加到交易池中,从而完成从父交易开始的链。鉴于不再是孤儿的新增交易,该过程重复递归地寻找更多后代,直到找不到更多的后代。通过这个过程,父交易的到来触发了整个链条相互依赖的交易的级联重建,将孤儿与他们的父母重新整合在一起。

交易池和孤儿交易池都存储在本地内存中,不会保存在持久性存储上;而且,它们是从传入的网络消息动态填充的。当一个节点启动时,这两个池都是空的,并且会逐渐使用网络上收到的新交易填充。

账单验证

每个节点接收到用户广播的账单后,要对账单的合法性和真实性进行验证,这里的合法性指节点会根据支付方的地址来验证支付方的比特币是否充足。比特币是去中心化的,所以需要一个机制去推动每个节点主动去记账。比特币前四年每个区块的奖励是50个BTC,此后每四年减半,总量是2100万个

5.交易的记录

打包

n交易经过验证后,每个节点通过pow工作量证明进行寻找满足难度条件的随机数的工作。当某个节点找到了随机数,向全网广播

n哈希验证随机数是否有效,有效则认可,只有区块中仅含有之前区块不存在的交易信息,区块才会被认可。

n接受该区块,方法是在该区块的末尾制造新的区块。(最长链原则,比特币的分叉)

n6个区块确认后(比特币默认值),交易就被确认并永久写于区块链中。一个区块获得 6 次以上的“确认”时就被认为是不可撤销的,因为要撤销和重建6个区块需要巨量的计算,交易被打包在一起放进区块中时需要极大的计算量来证明,但只需少量计算就能验证它们已被证明。

以上行为在比特币交易中又被称为“挖矿”。矿场的出现违背了去中心的初衷。

最长链原则

如果两个矿工在同一时间各自找到了有效区块,这两个区块是不同的,因为coinbase交易不同,所以Merkle Hash不同,区块哈希也不同。但它们只要符合难度值,就都是有效的。这个时候,网络上的其他矿工应该接收哪个区块并添加到区块链的末尾呢?答案是,都有可能。

通常,矿工接收先收到的有效区块,由于P2P网络广播的顺序是不确定的,不同的矿工先收到的区块是有可能的不同的。这个时候,我们说区块发生了分叉,在分叉的情况下,有的矿工在绿色的分叉上继续挖矿,有的矿工在蓝色的分叉上继续挖矿。

但是最终,总有一个分叉首先挖到后续区块,这个时候,由于比特币网络采用最长分叉的共识算法,绿色分叉胜出,蓝色分叉被废弃,整个网络上的所有矿工又会继续在最长的链上继续挖矿。

由于区块链虽然最终会保持数据一致,但是,一个交易可能被打包到一个后续被孤立的区块中。所以,要确认一个交易被永久记录到区块链中,需要对交易进行确认。如果后续的区块被追加到区块链上,实际上就会对原有的交易进行确认,因为链越长,修改的难度越大。一般来说,经过6个区块确认的交易几乎是不可能被修改的。

区块打包难度

比特币的区块平均每10分钟生成一个。这就是比特币货币发行速率和交易达成速度的基础,必须始终保持恒定。随着技术发展,计算机性能将飞速提升。此外,参与挖矿的人和计算机也会不断变化。为了能让新区块的保持10分钟一个的产生速率,挖矿的难度必须根据这些变化进行调整。

2009年12月30日,比特币挖矿难度首次增长。寻找一个比特币区块需要整个网络花费10分钟来处理,每发现2,016个区块时会根据前2,016个区块完成的时间对难度进行调整。

New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)

区块链安全问题

n双花问题(双重支付):假设Fred给了Alice 2个BTC,Ted给了Alice 3个BTC,我们把这两笔寄给Alice:现在Alice拥有了两笔UTXO,可以当作他未来转钱给别人的input。如果现在Alice想要转5 BTC给Bob,他要将前面两笔总和刚好为5的UTXO当作这笔交易的输入。而矿工要验证的就是并没有其他交易在先前的区块当中,已经使用过这笔Unspent Output。如果同一笔输出已经被发送过,那它就不是Unspent了,这就是比特币预防双花支付的方法。

n51%攻击:POW算法下,节点挖块的概率与算力成正比,一旦有矿池联合使得总算力超过全网的51%,将导致区块链系统安全问题。如果存在这样一个攻击者,它刻意把第一笔交易向一半网络进行广播,把第二笔交易向另一半网络广播,然后两边正好有两个矿工几乎同时取得记账权,把各自记账的block广播给大家,此时选择任意一个账本都可以,这时候原来统一的账本出现了分叉。

posted @ 2021-08-17 14:16  LoopNZ  阅读(368)  评论(0编辑  收藏  举报