版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
联盟链共识协议联盟链与公有链公有链(无许可链)以比特币为代表,只要遵循所采用的共识协议就能参与新区块的生成,这个过程
具有完全的开放性,参与者无需注册或者申请不能满足监管需求,同时性能较差,吞吐率较低、交易确认延迟较大联盟链(许可链)经过注册认证的节点才能参与共识过程、生成区块,一般用于特定行业或者领域联盟链支持更好的监管需求,一般可提供高的性能,包括更好的吞吐率和更低的确认延迟共识协议大多基于分布式领域的研究成果状态机复制协议(SMR)在分布式计算领域,通常将每个节点抽象为状态机,共识协议用于保证这些状态机的状态是一致的,因此也称为状态机复制协议状态机有一个唯一的初始状态,当状态机接收到一个输入后将依据状态转移函数从当前的状态转移到下一个状态状态机复制协议保证所有状态机所得到输入相同并且顺序一致安全性:所有状态机按照相同顺序执行请求,并得到相同的输出和新的状态活性:所有请求最终都会被所有正确的状态机执行
状态机复制协议与区块链状态机复制协议保证所有状态机的输入数据具有相同的序列,通常抽象为日志记录。如果将输入数据构建为哈希链式结构,则可转化为区块链系统。req1req2req3state1state2state3state4rep1rep2rep3req1req2req3state1state2state3state4rep1rep2rep3req1req2rep2rep1replica0replica1replica2clientclientreq1req2req3state1state2state3state4rep1rep2rep3req3rep3在状态机复制协议的执行角色客户端:普通的用户,产生原始的数据请求,将数据请求输入到所有的状态机共识节点:所有状态机副本都是共识节点,通过状态机复制协议获得相同的输入主节点:特殊的状态机副本,客户端产生的数据请求首先发送给主节点,主节点
将请求排序、打包后发送给其他所有的状态机副本执行过程通常将状态机复制协议的执行过程划分为相连的视图,在大多数协议的设计中,一个视图对应于一个主节点,视图的切换也意味着主节点的更换通常使用投票机制实现输入数据的共识,协议的执行过程遵循提案-投票的模式
法定多数证明(QC)法定多数证明是由一组节点的合法签名所组成的证明,表明该消息或区块已经获得了超过系统设定门槛的认可。QC要求的签名数量一般要求大于(N+f)/2,其中N是参与者总数量,f为拜占庭节点数量QC1QC2两个矛盾的提案不可能都拿到QCQC数量讨论为了保证安全性要求冲突的提案不能都获得QC,因此为了保证活性要求正确的节点就能够完成投票,因此联合上述两个条件,得到如果采用投票多数的模式设计共识协议并且同时保证协议的安全性和活性,则拜占庭节点的数量要少于节点总数的1/3
仅考虑失效节点的共识协议为了保证安全性要求冲突的提案不能都获得QC,因此为了保证活性要求正确的节点就能够完成投票,因此联合上述两个条件,得到如果采用投票多数的模式设计共识协议并且同时保证协议的安全性和活性,则失效节点的数量要少于节点总数的1/2
失效-停止敌手共识协议(Paxos)选出一个临时的主节点主节点负责提议请求,并发送到其他结点在收到#{QC}个确认后,可确定共识的结果(Quorum机制)Paxos更新主节点当主节点错误时选出新的主结点新的主节点需要确定系统当前的状态(是否有正在进行的共识)主结点从新的状态开始处理请求
Paxos协议的活性与安全性活性当主节点没有失效时,主节点总是提出正确的提案,主节点发出的消息总能收到超过一半的accept消息从而完成共识。当主节点失效时系统将会暂时失去活性,超过时间后将会更换新的主节点,新主节点将会读取尚未完成的提案并将其继续完成,此时系统将会恢复活性。安全性Paxos协议中没有恶意节点,因此同一个主节点对某个编号不会发出不同的提案。某个编号提案在执行过程中发生了主节点切换,如果这个提案能够被某个诚实节点完成共识,意味着超过一半的节点发出了accept消息,新主节点收到超过一半节点发出的gather消息,一定能够从某个节点收到包含这个编号的提案继续完成该编号已有提案的执行
Paxos协议分析执行过程需要主节点发出提案并经过所有共识节点1轮的投票过程,是常数轮次复杂度的共识协议一次共识中所有节点发出一个投票消息给主节点,消息数量的复杂度是O(n)。正常执行过程中,协议执行的推进依赖于主节点收到超过半数的投票信息而无需等待一个固定的最大网络延迟∆当主节点失效时,需要通过超时机制更新主节点而恢复活性,因此Paxos协议是一种半同步网络假设的共识协议
将Paxos协议用于拜占庭节点?Paxos协议不能容忍拜占庭节点,不能简单通过提高投票法定多数的数量而弥补。可构造攻击场景:主节点针对同一个编号可以构造两个不同的提案A、B,将A发送给f个诚实共识节点,将B发送给另外f+1个诚实共识节点主节点收到共识节点分别针对A和B的accept消息后停止发送消息等待超时更新的主节点通过read消息视图获取前一个提案的内容新主节点通过gather消息获得A与B两个不同的提案,此时新主节点无法决定是继续完成A还是B
实用拜占庭容错协议(PBFT)系统中一共有n个参与节点,最多有不超过f个恶意节点,并且满足n≥3f+1
协议执行分割为连续的视图(View),每个视图有唯一的编号v
每个提案有唯一的编号,视图编号v和提案编号k可以唯一确定一个位于视图v中的第k个提案普通用户的请求称为消息m,d为使用哈希函数H()生成的消息摘要,即d=H(m)系统每个参与共识过程的节点需要提前完成注册并拥有唯一的编号,使用Pi表示第i个节点,使用σi
表示第i个节点的数字签名
PBFT算法概述共识协议:在正常执行协议中主节点生成一个提案,其他节点执行该协议,如果协议能够在预期时间内正确结束,则在诚实节点之间完成对主节点所生成提案的共识。
视图更新协议:如果协议不能在预期时间内正确结束,则可能是主节点是恶意节点或者主
节点发生故障,则诚实节点发起视图更新协议以完成主节点的更新
PBFT共识过程通过增加一轮投票解决更新主节点时的提案选择问题Pre-Prepare阶段消息格式v是视图编号,k是主节点分配给该请求的序号,m是客户端发送的请求消息,d是请求消息m的哈希值主节点将PRE-PREPARE消息广播给所有共识节点,共识节点检查消息的有效性
C0123<<PRE-PREPARE,v,k,d>,m>Prepare阶段消息格式v是视图编号,k是主节点分配给该请求的序号,d是请求消息哈希值,i是共识节点编号共识节点如果收到的PRE-PREPARE消息有效,则其构造相应的PREPARE消息并广播给其他节点(主节点默认支持PREPARE消息)C0123<PREPARE,v,k,d,i>Commit阶段消息格式v是视图编号,k是主节点分配给该请求的序号,d是请求消息哈希值,i是共识节点编号共识节点如果收到2f+1个有效的PREPARE消息,则其构造相应的COMMIT消息并广播给其他节点主节点也需要显式构造并广播C0123<COMMIT,v,n,k,i>Decide阶段共识节点如果收到2f+1个有效的COMMIT消息,则该节点认为对应的消息以及完成共识,向客户端发送REPLY消息客户端收到f+1个REPLY消息后认为共识完成检查点更新为了减少后续视图更新过程中消息传输数量,PBFT协议对于以及完成共识的请求设置周期性的检查点当请求序号到达某一个检查点,且该检查点及之前的请求都以及完成共识,则发起检查点更新过程共识节点将检查点消息广播给其他所有节点,当节点收到2f+1个检查点消息后,则认为该检查点为稳定的检查点消息格式:k是检查点对于的序号,d是对应消息的摘要,i是生成该消息的副本节点序号<CHECKPOINT,n,d,i>视图更新过程—ViewChange如果共识节点发现系统长时间不产生新的共识,则认为可能是由于主节点失效或者恶意行为造成的,将会发起视图更新过程。当共识节点超时后进入到视图更新阶段,构造VIEW-CAHNGE消息,发送给视图v+1的主节点,不再接收共识协议流程的其他消息。k是最近的完成稳定检查点的序号,C是对应的2f+1个检查点消息P为在消息k之后并且已经进入prepared状态的消息以及证据集合,集合中的每个元素为Pm
<VIEW-CHANGE,v+1,k,C,P,i>视图更新过程—NewView当v+1视图的主节点P从其他的共识节点接收到2f个有效的VIEW-CHANGE消息后,进入到New-View阶段。视图v+1的主节点P构造NEW-VIEW消息,并广播给所有的节点消息格式:V包括2f+1个有效的VIEW-CHANGE消息O为一系列PRE-PREPARE消息的集合,这些消息是前一主节点发起已经完成prepared的消息,未完成的则用空消息取代所有共识节点首先完成O中携带的提案共识
<NEW-VIEW,v+1,V,O>PBFT协议的安全性与活性安全性:因为诚实节点不会为同一编号冲突的提案投票,因此不可能有冲突的提案同时获得2f+1的投票,因此不可能有冲突的提案完成共识活性:如果主节点是诚实节点,则其不会产生冲突的提案,其提案都是有效的,共识节点将会完成共识过程如果主节点是拜占庭节点,则提案可能共识失败从而引发视图切换如果一个提案可能完成共识,则至少2f+1个节点认为其完成了Prepare阶段的投票,这些节点至少包括f+1个诚实节点,因此至少有一个诚实节点将该提案包含在VIEW-CHANGE消息中。视图切换的主节点如果是诚实节点,将会继续完成该提案的共识。PBFT协议性能分析在正常共识过程中,每个共识节点对所有其他节点发起广播消息,因此总的消息数量为O(n2)在视图更新过程中每个节点需要将本身的状态证据发送给新的主节点,每个状态的证据需要包含达到该状态所需的2f+1个消息,状态证据的复杂度为O(n)新的主节点在NEW-VIEW消息中,包含了2f+1个有效的VIEW-CHANGE消息,因此NEW-VIEW消息的复杂度为O(n2)新主节点将该消息广播至所有n个节点,因此视图更新阶段整体通信复杂度为
O(n3)。
基于门限签名的拜占庭共识协议(SBFT)共识节点将投票发送给聚合节点,聚合节点将投票聚合后发送给其他节点,将n->n的广播转换为n->1->n,消息复杂度从O(n2)降低为O(n)SBFT协议分析SBFT协议的投票过程与PBFT类似,其活性和安全性继承自PBFT协议SBFT将投票过程的消息传播数量从O(n2)下降为O(n),因此可以容纳更多节点参与共识,其代价是增加了消息交互轮次,可能带来共识时延的增加SBFT协议的ViewChange过程与PBFT类似,但是每个证据的数量从2f+1个投票签名变为一个门限签名,因此视图更新的消息数量复杂度降低为O(n2)能不能进一步降低视图更新的消息复杂度?线性消息复杂度共识协议HotStuffHotStuff的设计目标对某个提案达成共识的通信复杂度为𝑂(𝑛),在更换视图时,其通信复杂度依然是𝑂(𝑛)HotStuff实现方法将PBFT的Prepare,Commit的两轮投票过程扩展到了Prepare,Pre-Commit,Commit三轮投票在达成共识的同时更换视图HotStuff共识协议HotStuff共识协议Prepare阶段:Leader选择最优的一个区块作为基础,并生成新的区块发给所有节点,所有节点如果支持该区块则发出PREPARE投票Pre-Commit阶段:Leader搜集(n-f)个PREPARE投票生成聚合签名(prepareQC),
将聚合签名发送给所有节点,节点如果支持该签名则发出PRE-COMMIT投票Commit阶段:Leader收到个(n-f)PRE-COMMIT
投票后,生成聚合签名(lockedQC),将聚合签名发送给所有节点,节点如果支持该签名则发出COMMIT投票HotStuff共识协议Decide阶段:主节点搜集共识节点发出的n-f个有效的COMMIT投票消息,将其聚合为有效的门限签名commitQC,发送给所有共识节点,共识节点收到当前视图的有效的DECIDE消息则可执行区块共识节点构造NEW-VIEW消息将本地的prepareQC发送给下一个视图的主节点下一视图主节点从2f+1个NEW-VIEW消息中选出最高序号的prepareQC对应的区块作为最优区块开始共识过程有效区块的条件新的区块扩展自lockedQC对应的区块(保证安全性)或者新的区块扩展自一个更高的有效的prepareQC(保证活性)HotStuff协议的安全性与活性安全性:因为诚实节点不会为同一编号冲突的提案投票,因此不可能有冲突的提案同时获得2f+1的投票,因此不可能有冲突的提案完成共识活性:如果主节点是诚实节点,则其不会产生冲突的提案,其提案都是有效的,共识节点将会完成共识过程如果主节点是拜占庭节点,则提案可能共识失败从而引发视图切换如果一个提案可能完成共识,则至少2f+1个节点认为其完成了Prepare阶段的投票,这些节点至少包括f+1个诚实节点,因此至少有一个诚实节点将该提案包含在VIEW-CHANGE消息中。视图切换的主节点如果是诚实节点,将会继续完成该提案的共识。谢谢权益证明共识协议联盟链与公有链公有链以比特币为代表,良好的开放性与去中心化性能较差,工作量证明消耗大量计算资源联盟链较高的性能,无需消耗能源和计算资源需要预先注册,较差的开放性与去中心化能否构建同时具有良好开放性、去中心化高性能且无需消耗物理资源的区块链系统?区块链不可能三角(BlockchainTrilemma)可扩展性Scalability去中心化Decentralization安全性Security工作量证明协议联盟链共识协议分布式存储、DAG权益证明共识协议通过某种虚拟资源(Stake)的使用实现对于随意注册用户的限制,基于这种虚拟资源的共识协议也称为权益证明共识协议(ProofofStake,PoS)。PoS共识协议的参与者需要完成身份注册,并以某种形式获得权益后参与共识协议身份注册:PoS系统应该允许用户自由注册,完成注册的用户并不直接具有参与共识协议执行的权力权益分发:初始阶段权益分发、基于交易的权益转移、权益激励
PoS共识协议的安全威胁无利害攻击(NothingatStakeAttack):参与者利用其拥有的权益同时尝试扩展不同的区块,对于权益份额重复使用的攻击称为无利害攻击
PoS共识协议的安全威胁研磨攻击(GrindingAttack):攻击者可能通过尝试构造不同的区块链而产生对其最有利的随机数,从而获得额外的收益
PoS共识协议的安全威胁远程攻击(LongRangeAttack):攻击者从远离当前区块的位置重新生成一条不同的区块链
PoS共识协议执行PoS协议的执行流程通常包含三个循环执行的子算法
出块共识、随机选择、提出新块PoS协议需要满足安全性、活性以及有效性的要求随机出块算法通常使用可验证随机函数(VRF函数)Keygen(r)→(VK,SK):Keygen产生一对非对称密钥对,验证密钥VK(公钥)和私钥SKEvaluate(SK,X)→(Y,⍴):求值函数Evaluate输入私钥SK、消息X,输出伪随机字符串Y和证明⍴。Verify(VK,X,Y,⍴)→0/1:验证函数Verify输入验证密钥VK、消息X以及求值函数中输出的伪随机字符串Y和证明⍴。只有该函数验证了证明⍴是根据X生成的,且根据证明⍴可以推导出Y,输出1。VRF函数特性Uniqueness:给定输入,有且仅有一组<Y,⍴>满足Verify(VK,X,Y,⍴)→0/1Provability:如果是Y,⍴是合法生成的,Verify(VK,X,Y,⍴)=1Pseudo-randomness:如果没有计算过Evaluate(SK,X)→(Y,⍴),任何多项式时间算法无法预测Y的信息VRF函数构造唯一性签名算法(UniqueSignature)满足数字签名的基本特性可验证性:不可伪造性:额外满足唯一性:VRF构造VRF输入来源前面若干区块的状态保证前后状态连接,形成链式结构生成者的身份信息确定块的生成者,实现对出块者的奖励生成者的数字签名确认块是由token的拥有者生成的某种随机性确保能够出块,避免陷入到死结状态降低输入的信息量去除nonce、Transaction部分节点直接参与的PoS共识协议委托权益证明协议(DPoS)设置固定数量的超级节点,仅有超级节点可以产生新的区块以及参与区块的共识协议不需要消耗大量的计算资源完成共识协议超级节点数量较少,因此其通常可以达到更好的性能开放性比PBFT协议要好通常不能快速实现超级节点的更替DPoS系统中心化趋势明显
部分节点直接参与的PoS共识协议动态委员会共识协议(DFINITY)共识协议是由部分节点组成的委员会完成的,委员会中的成员是随着协议的执行动态变化的某一时刻参与共识协议的节点数量是比较少的,因此可以满足协议的高效执行的要求参与共识协议执行的节点是动态变化的,也可以提供更好的去中心特性
Difinity基本架构Difinity采用层次化的抽象模型设计其核心思想来源于存在随机灯塔随机灯塔之后被分布式算法代替Difinity共识流程随机灯塔选择完成共识的委员会以及出块节点出块节点生成区块共识节点完成区块的共识,新生成的区块链作为随机灯塔的随机种子输入Difinity区块与随机灯塔的伴生利用VRF函数替代外部随机灯塔产生随机数随机数的产生与区块共识交替伴生完成随机数产生采用基于门限签名的VRF函数完成Difinity如何落地基于门限签名实现随机数生成将用户分割为若干组每组执行DistributedKeyGeneration(DKG)协议每个时间片由所生成的随机数选择相应的组组内用户分布式生成新的随机数,从而选择下一个委员为新用户的加入新用户注册为系统用户新注册用户加入组需要组成员投票,并更新DKG过程Difinity协议分析共识协议的安全性与活性采用PBFT类协议,基于(半)同步网络假设保证活性安全性假设假设每一个委员会都满足诚实用户比例假设,每组用户数量不能太少执行效率DKG效率较低,委员会更新困难需要额外的门限签名算法全部节点参与的PoS共识协议基于选举投票的PoS共识协议(Algorand)全部节点均可参与共识协议,共识协议的执行仍然由部分节点通过投票机制完成,参与共识的节点不是预先确定的委员会,而是随时动态生成的成员组基于概率分布的PoS协议(OuroborosPraos)全部节点均可参与共识协议,共识协议不依赖于共识节点的投票,而是依赖于类似PoW协议概率竞争保证安全性
Algorand基本构造所有节点通过VRF函数生成候选的出块节点集合,并分别产生候选区块所有节点通过VRF函数生成共识节点集合,并执行共识协议输出唯一区块Algorand所用VRF函数随机种子迭代:出块节点选择:共识节点选择:出块节点竞争规则:Algorand区块构造r
:轮次编号PAYr:交易集合SIG:确定性签名算法lr:主节点编号Qr:第r轮随机数种子H:理想哈希函数Algorand区块共识过程区块缩减对多个可能的提案区块,经过两轮投票能够保证最多一个候选区块得到超过#QC的投票,从而保证安全性区块缩减过程不保证活性,也可能输出为空区块二值共识对区块缩减过程输出的唯一可能的候选区块以及空区块做二值共识,共识通过投票完成投票过程为概率算法,如果一轮投票不能完成输出则通过产生的公共随机数进入下一轮共识经过多轮迭代,以极大概率完成共识过程
Algorand协议讨论运行环境假设在Algorand所协议中,参与投票的验证节点是通过概率算法筛选的,并不知道每个轮次具体的验证节点数量,每轮投票的结束依赖于超时机制。安全性与活性安全性依赖于诚实节点数量超过2/3的假设,因此每轮参与投票的节点数量不能太少。活性依赖于概率算法,需要较多轮次执行。
OuroborosPraos基本假设OuroborosPraos协议通过概率筛选候选出块节点,同时不需要基于投票的共识过程网络假设Semi-synchronous假设,节点之间时间同步的偏差对于一个slot的长度而言是可忽略的Slot的编号是单调递增的,而且参与的节点均可知。敌手的能力敌手可以重排消息的发送顺序,给某些人发送某些消息,拒绝某些消息,可以将诚实节点发送的消息延迟最多ΔOuroborosPraos基本构造将执行过程切割成纪元,每个纪元包含多个时隙前一个纪元执行完成后,用VRF函数筛选出下一个纪元每个时隙的候选出块节点出块节点在自己对应的时隙中按照最长链原则产生区块OuroborosPraos出块条件Pi
成为纪元j时隙slk的leader的条件是纪元随机数种子迭代公式为新区块生成:当节点Pi
在纪元j
的时间片slk
竞争成功,则Pi
有资格在生成一个新的区块
OuroborosPraos区块链输出OuroborosPraos协议采用了与PoW协议类似的最长链原则,每个参与共识的节点选择收到的最长有效的区块链。共识节点从中选择最长的一条作为本节点的共识输出,在后续的时间片中将尝试在最长链的头部区块之后扩展新的区块。OuroborosPraos的安全性在一个纪元中,诚实用户被选中的数量符合二项式分布如果纪元足够长,攻击者无法通过操控随机数种子占据更高比例OuroborosPraos协议牺牲了出块节点的不可预测性
短Epoch间隔PoS协议-PoSAT使用VDF函数实现随机数生成介于PoW与PoS之间的构造(
FC2021
)BestUnpredictablePoS设计原则避免交互式协议设计避免引入可信第三方避免使用工作量证明的竞争机制避免使用其他损耗性物理资源具有最优的不可预测性(
EuroSP2025
)基本构造关键点:将PoW中的Nonce随机数去掉,并去除其他随机输入,使用round代替。使用数字签名σ确定数据来源,绑定用户token采用最长链原则,最长链即为最优链NothingatStake攻击攻击者从所有可能的位置尝试区块,得到一个树状结构NothingatStake带来的收益定义一个函数f(t,ℓ)表示在时间t高度为ℓ的区块的数量,f(t,0)=1即高度为0的区块只有一个,f(0,ℓ)=0在初始时刻仅有一个根节点,其他区块还没有生成。β
:
一个区块在一个round内被扩展的概率f(t,ℓ)=f(t-1,ℓ)+f(t-1,ℓ-1)β
NothingatStake带来的收益假设t=kℓ
基于贪心策略的改进协议诚实节点采用贪心策略尝试扩展的区块,贪心参数d=3
贪心策略能够容忍的恶意节点数量诚实节点采用greedy=5可以得到大约2.0的增长增益在这个条件下需要57%的诚实权益将核心区块链扩展为通用区块链使用数字签名生成包含交易的区块以太坊权益证明共识协议Casper以太坊采用过度的机制实现了从PoW向PoS的转变PoW-Casper实现了PoW区块链上的终局确认以太币质押实现了Stake的原始分配在PoW-Casper协议中,区块的生成由PoW协议实现,叠加的Casper协议完成区块的二次确认信标链Casper是一种PoS共识协议,区块的生成由VRF函数决定,Casper协议完成对产生区块链(树)的投票PoW-Casper-流水线投票Casper投票原则在同一高度不为冲突的区块投票不环绕投票出现连续的投票完成的区块则前一个区块完成确认信标链Casper节点注册在Casper中用户也是通过锁定一定数量的代币而成为验证者,在当前的设置中成为验证者需要抵押32个以太坊,大约相当于50000美元动态委员会机制委员会的生成是以纪元为周期的,在一个纪元内所有的验证者被平均分配到每一个时间片,每一个时间片大约包含1/32的全体验证者。进入一个新的纪元后,每个时间片委员会的划分将重新完成以免固定的验证者组成一个委员会从而威胁系统的安全。委员会的动态划分依赖于不断变化的随机数种子,这个随机数种子是由区块链已完成的状态以及当前的纪元编号等信息通过哈希计算得到的输出。
信标链Casper出块过程信标链Casper采用LMD-GHOST算法来选择当前最优的区块链,这个选择用来帮助验证者为最优的区块链产生投票也用来帮助出块者选择最优的区块链作为当前出块的位置,生成一个备选的区块链(树)
信标链Casper共识过程协议执行Casper协议依赖时钟推进执行,将时间划分为等长的时间片(slot),当前版本的时间片长度为12秒钟。每个时间片有一个验证者负责提出一个新的区块,出块的验证者依据其观察到的最优结果将新区块连接在已有区块上。固定数量时间片组成一个Epoch,当前一个纪元包含时间片的数量是32,一个纪元的时间约为6.4分钟。每一个纪元有一个区块称为这个纪元的边界,同时这个边界也作为验证者投票的检查点(checkpoint)。因此在理想情况下每6.4分钟完成一次检查点投票,也就完成了一段区块链的终局确认。谢谢智能合约与去中心化计算什么是智能合约智能合约是一种使计算机自动执行合约条款的交易协议将通用程序代码取代固定交易脚本部署于区块链,就得到了基于区块链的智能合约系统
boolregister(intid,stringname){ …}intsearch_user(stringname){ …}register(123,“张三”);register(124,“李四”);智能合约的特点图灵完备的执行逻辑具备分支、跳转能力,并能支持如数组这样的数据结构,可用于实现通用逻辑全局一致的执行结果智能合约的最终执行也是由分布式系统的参与者共同完成的,智能合约的执行结果应该保证全局的一致性交易驱动的状态转移接受外部的数据输入,通过输入交易数据驱动智能合约的执行也就是状态转移基于激励机制的资源分配智能合约的拥有者应该采用某种付费方式向执行者支付计算资源的费用,否则区块链上的智能合约将不能有效执行
智能合约工作原理合约代码经过共识后部署与区块链上,共识节点通过虚拟机加载并执行代码以太坊账户地址与合约地址在以太坊中所有的数据都是基于账户系统存储与管理的,智能合约账户对应于一个智能合约的地址,因此用户账户和合约账户的地址在形式上是一致的。
以太坊合约账户智能合约地址使用部署合约的用户地址以及合约部署的交易编号作为输入,通过哈希算法得到哈希值并使用低位的160个比特作为合约地址。每个账户都由以下字段构成nonce字段用于记录该账户发出的交易数量balance用于记录账户的余额,货币的最小单位是10-18
个以太币codeHash是用哈希值表示的智能合约执行代码的地址,用户账户没有执行代码,因此账户账户的codeHash字段是空storageRoot:这个字段用于保存账户所需存储空间的地址
以太坊交易结构在比特币系统中交易是指在不同账户之间的转账行为,以太坊引入了智能合约技术,账户之间传递的内容不再仅仅是数字货币,也包括智能合约相关的所有数据交易包括如下字段from:发出本交易的账户地址。这个交易要使用这个地址对应的私钥签名,因为合约地址不能签发交易,因此这个账户地址一定用户地址。recipient:接收本交易的账户地址。如果这个地址是用户账户地址,则本交易用于向其转账,转账数值在下面的value字段中。如果这个地址是合约账户地址,则本交易用于执行这个合约的代码。如果这个地址为空,则这是一个合约部署交易。
以太坊交易结构交易包括如下字段(续)signature:合约发送者用私钥生成的针对本合约的数字签名。nonce:合约发送者账户发出的交易计数数值,与用户账户中的nonce数值相同。value:从发送者向接收者转移的货币数量,是以Wei为单位的数值。data:可以包含任意数据的可选字段。gasLimit:这个交易可以消耗的最大燃料数量。maxPriorityFeePerGas:为共识节点提供的小费部分的燃料价格。maxFeePerGas:发送者支付的最高燃料价格(包括小费部分的燃料价格以及基础燃料价格)以太坊合约部署在部署智能合约时,合约的部署者将发起一个合约创建交易。在该交易中,recipient字段为0,表示该交易是一个合约创建交易。合约创建交易的data字段将是一段字节码。当这个交易发布在分布式环境中,会有矿工捕获这个交易,然后将其
记录在某一个区块中。当某一个矿工挖矿成功,将包含该交易的区块打包发布,并且在分布式环境中共识成功。共识节点的智能合约虚拟机会执行这个交易data中的字节码,这个过程称为智能合约的部署。
以太坊虚拟机EVMEVM是一种图灵完备的虚拟计算机,其基本结构如下图
EVM核心组件只读存储器用于存储智能合约代码,一旦完成部署不能修改,执行智能合约时EVM将智能合约代码从只读存储器中加载到计算组件中存储组件用于持久化存储智能合约执行结果,可以将其理解为EVM的磁盘,存储组件中的数据是以键值对的形式组织的,存储组件中的数据是按照智能合约账户隔离的计算组件EVM的计算组件是一种栈式计算机,由程序计数器和栈构成,程序计数器用于定位当前所需要执行的指令,栈用于保存指令所需要使用的操作数。燃料管理单元用于计算合约执行过程中的燃料消耗
EVM组件执行合约的流程EVM的程序计数器指向当前需要执行的指令,在栈的辅助下完成指令。根据指令栈顶的数据可以转存到内存或者持久存储器中,反之也可以从内存或者持久存储器中加载相应的数据。执行器执行所有的指
令都需要燃料单元的参与,以确定有足够的燃料完成执行,同时修改剩余燃料的数值。
以太坊智能合约计费方法合约用户需要为智能合约的执行支付费用。用户不仅需要在合约部署阶段支付费用,也需要在后续合约的执行过程中为每一条指令的执行支付费用。每个指令均有一个固定消耗的燃料值(Gas),燃料价格(gasPrice)是执行时系统所决定的基础价格以及用户自愿支付的小费价格之和。某次交易引发的智能合约调用消耗的燃料记为Tg,单位燃料的价格记为Tp,调用合约的交易同时发起转账金额为Tv,则调用所需总费用为:
以太坊智能合约计费策略燃料单价是当前系统决定的基础费用及交易中maxPriorityFeePerGas字段所指定的小费之和,也可通过maxFeePerGas字段直接指定单价执行对应的合约创建或者合约调用流程,将对执行过程进行燃料统计,交易所包含的gasLimit字段限定了这次交易所消耗的燃料数量的上限如果当前执行过程还未完毕已经达到gasLimit,执行过程将被停止,合约的状态回滚到执行之前,不返还这个交易所消耗的手续费合约调用正常执行完毕,多余的gas将退回给调用者
智能合约安全面向区块链与共识协议的攻击典型的攻击手段是拒绝服务攻击,由于以太坊等区块链系统仅能提供十几笔每秒的吞吐率,如果发送高手续费的垃圾交易能够消耗区块链的全部吞吐率,从而造成正常交易的拥塞,通过阻塞特定时段的交易可能获得高额利益面向智能合约虚拟机的攻击面向智能合约虚拟机的攻击主要分为两类,其中一类是利用智能合约虚拟机设计中缺陷发起攻击,另一类是利用虚拟机不同的软件实现中的漏洞发起攻击。第一类攻击可能会造成虚拟机加载执行不符合预期的代码从而产生攻击效果,第二类攻击则可能造成不同的共识节点产生了不一致的执行结果,破坏区块链的全局一致性导致共识失败。
智能合约安全面向智能合约编程语言的攻击智能合约是由高级语言写成的逻辑代码,因此在其他编程语言存在的漏洞以及攻击方法在智能合约中也可能存在。例如数据存储区溢出是程序设计中经常遇到的一种异常,智能合约中持不同长度的整数的使用,整数的加法或者乘法都可能造成数据存储的溢出。面向区块链应用的攻击区块链是上承载的应用大多与数字货币以及激励机制相关,攻击者可以针对这类特殊的应用构造攻击方法。例如针对去中心化交易智能合约的三明治攻击,攻击者发现在区块链系统中有一个针对某种数字货币的大额购买交易,在这个交易之前插入一个购买交易低价购入,同时在这个交易完成导致价格上涨后插入一个反向的卖出交易,通过这两个交易的价格差可以获得收益。
智能合约的重入攻击以下代码存在重入攻击漏洞智能合约的重入攻击攻击合约谢谢以太坊智能合约开发以太坊节点架构以太坊的客户端软件分为共识客户端和执行客户端两部分,共识客户端完成交易数据的共识,执行客户端则负责交易数据及智能合约的执行
以太坊客户端的部署方式接入主网参与以太坊的区块链共识协议需要质押真正的以太币,如果要部署或者运行智能合约则需要使用以太币支付燃料费用接入测试网可以通过申请获得免费的测试网代币,以方便智能合约的开发测试本地私有部署省去了申请测试网代币的麻烦,同时测试也不需要依赖外部的网络连接
基于Remix环境的智能合约开发通过Remix平台可以实现Solidty智能合约的开发、编译与部署等全
部功能https:///
Remix在线IDERemix有完整的代码浏览与编辑IDERemix代码编译与合约部署Remix可以完成代码编译、合约执行与合约调用功能合约执行支持本地虚拟机、在线部署等多种方式Solidity智能合约开发语言Solidity是专门用于以太坊智能合约开发的一种高级语言。Solidity语言开发的智能合约代码编译后所得到的字节码通过交易部署到以太坊区块链中,以太坊虚拟机(EVM)可以加载执行编译后的字节码。Solidity是一种面向对象的程序设计语言,在Solidity中与类对应的概念称为合约(Contract)。一个合约内可以包含若干变量以及若干函数,用于实现一个具有特定功能的对象,同时合约也支持继承等特性。Solidity语言支持区块链访问、账户地址访问、转账操作等专用操作。
Solidity基本语法Solidity代码文件通常以.sol作为扩展名,一个完整的智能合约项目可能包含一个或者多个.sol文件。
Solidity中的变量类型Solidity使用变量存储数据,Solidity针对智能合约的特点,对于变量的类型以及变量的存储方式做了特有的定义Solidity支持多种简单变量类型,如布尔型、整数、合约与地址等,需要注意Solidity不支持浮点数类型Solidity也支持多种复杂变量类型,如枚举类型、结构体、固定长度数组与动态数组、映射等,Solidity还支持使用区块类型访问链上信息Solidity支持常量与常数,包括数值常量以及字符串常量等
Solidity变量存储变量作用范围全局变量:不支持传统意义全局变量,但是可以定义整个文件都可使用的结构体类型、枚举类型以及常量合约变量:整个合约范围可用的变量局部变量:某个函数内部可用的变量变量可见模式共有变量:用public修饰的合约变量,这种合约变量可以从合约外部直接访问内部变量:内部变量是以internal修饰的合约变量,只能通过接口函数访问私有变量:私有变量的使用与内部变量是类似的,唯一的不同是在继承于当前合约的子合约中也不能访问当前合约的私有变量Solidity变量存储变量存储空间持久存储变量:持久存储变量是指保存在外部存储区,其存储空间与内容是持久有效的变量。持久变量是用关键字storage修饰的,对于默认情况下是持久存储类型的变量无需使用storage关键字。持久存储的变量经常也被称为状态变量。内存变量:内存变量是指保存在内存中,其存储空间与内容在使用完后马上释放的变量。内存变量是用关键字memory修饰的。调用变量:调用变量是用关键字calldata所修饰的一类特殊的内存变量,调用变量限定内存的数据是不能修改的。
Solidity中的函数函数的参数与返回值函数可以使用各种变量作为输入的参数,参数的定义与函数的局部变量定义是相同的即变量类型加变量名的形式。Solidity支持多返回值的函数定义。通过returns关键字可以定义函数的返回变量,如果有多个返回变量则使用逗号分割。函数的可见模式外部函数:用关键字external修饰,是合约对外部访问开放的接口函数,不能
直接被本合约的其他函数调用公开函数:用关键字public修饰,可以被外部使用者调用内部函数:用关键字internal修饰,仅能合约内部或者子合约调用私有函数:用关键字private修饰,仅能合约内部调用
Solidity中的函数函数状态变化修饰符视图函数:使用view关键字定义,不修改合约的状态变量纯函数:使用关键字pure定义,不修改合约的状态,也不访问合约的状态数据可支付函数:使用关键字payable来修饰,这个函数可以接受调用时转入的以太币函数的高级特性函数重载:使用不同的参数类型实现对函数的重载函数修饰器:通过声明的方式对于函数的语法进行修正,从而实现对于函数执行条件的检查等功能
合约的构造构造函数:
用于合约初始化的函数,构造函数仅在合约部署时执行一次,在当前版本中构造函数由关键字constructor定义。析构函数:析构函数在Solidity中一般也称为自毁函数,用于中止合约的运行和部署,当一个合约调用析构函数后将从以太坊区块链的部署中释放掉。析构函数使用关键字selfdestruct命名。接收函数:接收函数是合约中用来接收转账的专用函数,每个合约最多有一个接收函数,接收函数应该定义为外部函数且可接收支付。备用函数:每个合约也可以有一个备用函数,也称为回退函数。用关键字fallback做函数名,用于最终处理没有明确接口的函数调用。
智能合约开发案例基于区块链的简单拍卖Remix官方例子:https:///谢谢区块链技术简介区块链面临的两项核心挑战性能瓶颈Bitcoin:约7笔交易/秒Ethereum:约十几笔交易/秒公有链性能远低于传统中心化系统隐私保护交易需要由共识节点公开验证数据通常全网可见交易分析可能导致用户去匿名化面对应用的业务需求,如何解决这两个问题?性能瓶颈及优化层次核心性能指标:吞吐率吞吐率表示区块链每秒能够处理的交易数量。层次主要瓶颈优化方向网络层Gossip延迟大、传播消息冗余高优化扩散算法与拓扑共识层出块间隔大、区块容量有限DAG、分片、并行共识计算层存储数据量大与计算复杂度高侧链、链下计算、Rollup网络层性能扩展P2P网络的局限消息通过Gossip机制传播,消息传播顺序不可控重复传播浪费网络带宽随机拓扑可能导致转发跳数过多,网络延迟将延长共识时间优化方法优先向消息获取较慢的“冷节点”传播减少重复消息转发优化P2P网络拓扑降低传播层级和传输延迟共识层与计算层扩展共识层Bitcoin-NG:缓解出块间隔限制DAG:允许多个区块并行产生和确认分片:不同节点组并行处理不同交易计算层闪电网络:在链下完成大量普通交易Rollup:链下执行,链上验证结果侧链:将不同应用分散到不同链区块链分片技术将交易和共识节点划分为多个分片,每个分片并行处理部分交易。分片内共识:处理单个分片中的交易跨分片共识:协调涉及多个分片的交易挑战节点分配的随机性与公平性跨分片交易的一致性和原子性分片动态更新及状态迁移优势并行处理交易降低单节点存储和计算压力吞吐率可随分片数量提升区块链分片技术将交易和共识节点划分为多个分片,每个分片并行处理部分交易。分片内共识:处理单个分片中的交易跨分片共识:协调涉及多个分片的交易组内共识组内共识组间共识分片1分片2ELASTICO协议Luu等人首次提出面向公有链的分片方案,结合PoW与拜占庭共识,吞吐率接近随节点数量线性增长。五个主要步骤共识节点分组分组结构生成组内共识最终共识随机数迭代ELASTICO——节点分组节点通过工作量证明进行注册:O=H(epochRandomness∥IP∥PK∥nonce)≤T哈希值最后
s
位决定节点所属分组系统一共产生
2s
个分组平均委员会规模:c=n⋅2−s
epochRandomness定期更新随机分组降低恶意节点控制单个分片的概率ELASTICO——共识流程分组结构生成最早完成计算的
cc个节点组成目录委员会后续节点仅向目录委员会发送分组信息通信复杂度由
O(n2)
降至
O(cn)组内共识每个分片运行BFT协议PBFT复杂度为
O(c2)HotStuff可降低至
O(c)最终共识最终委员会汇总各分片结果对有效分片结果再次执行共识ELASTICO的局限优点分片并行处理交易支持无许可环境通过随机分组提高安全性局限所有分片结果最终汇聚至最终委员会最终委员会需要处理全部交易数据容易形成新的性能瓶颈并非完全意义上的数据分片SharPer协议基本特征面向联盟链的许可式分片协议基于PBFT构造节点分组预先确定且不动态更新每个分组满足:n=3f+1,f
为可容忍的恶意节点数量。两类交易组内交易:由单一分片执行PBFT组间交易:由唯一主节点协调多个分片SharPer跨分片共识目标:保证交易原子性跨分片交易必须满足所有相关分片均确认交易;或所有相关分片均不确认交易执行过程主节点向相关分片广播交易每个分片执行第一轮投票主节点收集每组超过
2/3
的投票发起第二轮投票所有分片完成确认局限跨分片交易比例过高时,协议效率明显下降。RapidChain协议节点分组PoW完成身份注册参考委员会生成随机数节点随机分配至不同分片组内共识使用同步BFT协议容忍更高比例的恶意节点RapidChain协议组间共识将跨分片交易拆分为多个子交易子交易在不同分片并行处理分组更新每个Epoch仅替换部分节点保持数据可用性与共识连续性侧链技术基本思想在主链之外构建多个面向不同应用的独立区块链,通过协议实现数据和数字资产流通。与分片的区别分片:通过共识协议维护跨分片一致性侧链:通过特定交易和锚定机制连接不同区块链关键机制:双向挂钩主链资产锁定→侧链资产释放侧链资产锁定→主链资产释放侧链技术在主链之外构建多个面向不同应用的独立区块链,通过协议实现数据和数字资产流通。分片通过共识协议维护跨分片一致性,侧链通过特定交易和锚定机制连接不同区块链。主链侧链1侧链2资产锁定资产释放双向挂钩的安全要求原子性锁定和释放必须同时成功或同时失败所有权一致性资产必须释放至对应用户账户兑换公平性兑换比例应公开、确定且可验证三种实现方式中心化双向锚定分布式/联邦式双向锚定内生式双向锚定侧链实现方式中心化锚定依赖可信第三方,简单高效,与区块链去中心化目标冲突分布式锚定通过门限签名代替中心节点,安全性依赖诚实参与者比例,典型案例:Plasma内生式锚定主链和侧链原生支持跨链验证,可通过SPV验证对方链上的交易,典型系统:Cosmos、Polkadot闪电网络核心思想:将大量普通交易放到链下执行,仅在区块链上进行最终结算RSMC支付通道流程建立
2-of-2
多签账户双方注入质押资金链下更新余额分配关闭通道并在链上结算安全机制支持单方面关闭通道旧状态提交需要等待挑战期,使用旧交易状态将受到资金惩罚
闪电网络建立2-2多签账户,双方注入质押资金,将大量用户之间的普通交易放到链下执行,仅在区块链上进行最终结算。
区块链用户1用户2开通交易通道交易结算链下交易HTLC多跳支付使用场景:A与C没有直接支付通道,但存在A→B→C执行过程C生成随机数
r,并发送
H(r)A向B发起带哈希锁和时间锁的支付B使用相同条件向C支付C公开
r
领取资金B使用
r
领取A的资金性质全部支付成功,或全部超时取消,保证多跳支付的原子性链下汇总Rollup基本思想交易在链下执行执行结果提交至主链主链验证结果并更新状态两种主要类型ZK-Rollup:有效性证明,确认快、证明开销高OptimisticRollup:欺诈证明,执行简单、存在挑战期链下汇总Rollup交易在链下执行,执行结果提交至主链,主链验证结果并更新状态,两种主要类型ZK-Rollup,OptimisticRollup。区块链用户链下应用服务计算结果可验证上链ZK-Rollup与OptimisticRollupZK-Rollup链下虚拟机批量执行交易,生成新的状态根和零知识证明智能合约验证证明后更新状态ZK-SNARK证明长度固定,批处理越多,单笔证明成本越低OptimisticRollup默认链下结果正确,设置挑战期,发现错误可提交欺诈证明恶意执行者将被罚没质押资金依赖至少一个诚实验证者持续监督区块链隐私保护目标隐藏交易金额PedersenCommitment利用加法同态验证输入与输出平衡隐藏接收者使用一次性地址防止多个地址被关联至同一用户隐藏发送者环签名零知识证明环签名与可链接环签名环签名签名者从一组公钥中动态构造“环”验证者只能确认签名来自环中某个成员无法确定真正签名者可链接环签名可识别同一UTXO是否被重复花费不能识别具体签名者身份同时实现匿名性和双花检测零知识证明与ZerocashZerocash的两个阶段Mint:匿名货币铸造,生成随机数和序列号,创建货币承诺,将承诺加入默克
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年货运从业资格试高货运员试试题(附答案)
- 2026年健康管理师三级《流行病学》模拟试题及答案
- 2026年节水知识竞赛试题库150道及参考答案【突破训练】
- 2026年老年照护专业技能考试及答案
- 2026年美甲理论知识模拟试题(含答案)
- 2026年南京残疾人单招考试试题及答案
- 2026年农村经济管理实务操作考试及答案
- 2026年人保财险理赔员考试试题及答案解析
- 2026年人工智能训练师(四级)实操技能模拟题库及答案
- 企业管理-改造学生宿舍的申请报告模板
- 鼠疫防治知识培训试题及答案
- 2026全球与中国膜曝气生物膜反应器 (MABR)行业现状动态与投资前景预测报告
- 中国康复医学临床路径指南(2025版)
- 油田射流泵课件
- 配送冷链运输协议
- 2025年检验科授权试题及答案
- 化工行业安全培训案例课件
- Unit3MySchool大单元整体教学分析人教版英语七年级上册
- 老年人防跌倒的预防及护理措施
- 2025年揭阳揭西县选调高中教师考试试题(含答案)
- 咯血患者介入治疗的护理讲课件
评论
0/150
提交评论