ETH2.0 Specs
Casper共识机制
Casper 实现有助于改变以太坊生态系统。其中两个项目的实现分别是 Friendly Finality Gadget (Casper FFG) 和 Correct-by-Construction(Casper CBC)。
Casper FFG 是由以太坊创始人 Vitalik Buterin创立的。Casper FFG 是 Casper 的最初版本,是 PoW/PoS的混合版。然而,由 Vlad Zamfir 创立的 Casper CBC 已经制定了被广泛认为是一种卓越的协议。
ETH2.0 最终采用Vitalik 的 Casper FFG共识协议。
ETH2.0信标链(Beacon chain) 采用Casper共识机制,Casper属于权益证明制(PoS)范畴,除了继承PoS机制低能耗、防51%攻击更安全的优势外,还在现有PoS机制上增加经济惩罚机制,解决PoS机制本身存在的“无利害攻击”问题。
“无利害攻击”是PoS系统的一个经典攻击问题。PoS系统节点持有权益证明(即按币的数量)就可以参与挖矿,权益占比越大负责出块的概率也越大,由于PoS不需要额外付出挖矿的算力成本,挖矿边际成本为0,区块链网络产生分叉的可能性更高。PoS验证者可以选择同时在两条链上进行“投票”,不论最后哪条链成为“最长链”胜出,验证节点都可以获得区块奖励。这和PoW链不同,如图4所示,PoW链不会发生这种现象,因为算力只有一份,而Token同时存在在两条链上。随着时间推移,这种无成本为多条链出块的投票行为会助长更多的网络安全攻击行为,损伤区块链网络本身的安全性。
Casper通过设置惩罚经济模型来解决PoS的无成本攻击问题,确保网络可以正常运转。它的主要机制包括:
-
验证节点需要预先在链上抵押锁定一定数量的以太坊(BETH)作为保证金。
-
验证节点每一轮需要对区块进行“下注”,验证节点需要评估其他节点会“下注”哪个块胜出,同时也“下注”这个块。如果支持正确的链就可以拿回保证金外加区块奖励及区块内的交易Gas费;如果下注没有迅速达成一致,就只能拿回保证金。如果验证节点明显地改变下注,进行“投机下注”,比如先投某个块有很高概率胜出,再投另外一个块,将被信标链严惩, 最坏结果就是没收全部保证金,并从验证节点委员会中剔除,同时验证节点也可以监督其他节点的投注并举报此类投机行为。由于可能造成的经济损失,验证节点会选择对自己最有利的结果进行投注,当全网验证节点数量足够多时,投注机制确保最后的结果分布趋向于收敛,即大多数验证节点都选择的某个高概率胜出的区块作为最终一致性结果。
-
Casper验证节点委员会随机选举验证节点,每隔一个周期进行一次轮换选举,随机指派验证节点负责指定分片内的校验区块出块,确保分片内的验证节点不形成“合谋”,降低网络安全性。
Casper PoS的基本思路是正向奖励诚信、负向惩罚作恶,所以对于验证节点设置非常多的惩罚规则来防止分叉,对于不尽责的验证节点,也存在惩罚保证金的风险。成为Casper 验证节点需要在ETH PoW主链上注册的验证管理器合约上至少质押32个BETH才能运行信标链节点客户端软件。
考虑前期ETH矿工从PoW节点转为PoS验证节点参与度可能低于预期,Vitalik主导了Casper FFG这个PoW/PoS混合挖矿方案,在现有以太坊PoW协议上叠加一层PoS协议,在PoS协议正式稳定前维持PoW挖矿不变,但每通过PoW挖矿产生50个区块触发一次PoS节点区块验证,这样做方便让社区一部分用户可以先参与新PoS链的测试,直到社区顺利过渡到纯PoS主网。
Casper 还有一个纯PoS的竞争版本实现Casper CBC, 由Vlad Zamfir主导,和FFG采用的混合共识不同,CBC从一开始就完全定义成PoS链,理论创新较多,实际部署难度高于FFG,可能ETH2.0不会直接采用。CBC和FFG的目标是一致的,即提高整个区块链系统共识的安全性。技术思想方面,CBC更倾向通过新的共识改进BFT(拜占庭容错协议)不超过三分之一作恶节点数量的限制,容错率降到1/4。Vitalik Butterin主导的FFG更倾向如何将现有的BFT1/3容错协议更好地运用在信标链上。目前来看,Vitalik主导的FFG路线获得了胜出。
总结: merge阶段,ETH1.0 POW出块模式不变,在此基础上包装一层casper进行区块的二次确认,然后通过crosslink提交摘要信息至信标链。
分片技术
分片技术(sharding)其实来源于一种传统概念扩容技术,它指将数据库分成若干片段,以增加处理效率。在区块链中,它指将区块链网络分成多个碎片,每个碎片中包含一定的节点,由这些节点分别处理每个碎片中的事务,以提高区块链整体的性能。
因此,在ETH2.0升级中,以太坊将通过分片技术提高系统并发交易处理吞吐量水平。它将网络划分为64个分片(旧方案中曾预计采用1024个分片),每个分片处理网络中不同的交易,并处于独立的账户空间。
每个分片内的交易结果将由信标链网络上的验证节点委员会指定的验证节点负责验证,验证节点不需要验证分片外的交易,分片每隔一段时间(即时隙Slot,12s)由验证节点产生一个校对区块, 校对区块包含分片内的状态和交易内容,提供可验证信息(如Merkle根)。这也意味着,每过12秒整个网络中就产生64个分片链区块,再加1个信标链区块。
随后,通过交联(crosslink)过程,信标链可以引用不同分片链的内容和状态,获得该分片网络的真实性证明,而不需要去验证分片内每一笔交易,最终信标链验证委员会通过Casper机制对信标链内所有分片链进行校对,随后区块结果获得最终确定性,分片也将通过交联获得信标链对引用的分片区块完成最终确认的状态结果。
ETH2.0将网络分成两部分,左边L1代表信标链网络,右边L2代表分片网络,分片之间空间各自独立,不同的分片由验证节点组成的验证委员会维护,相当于也是多条独立的区块链。信标链通过交联(crosslink)收集分片内的交易真实性证明摘要(Merkle根),ETH2.0分片技术第一阶段就是建立信标链-分片的锚定模型,分片内交易结果的确认要等待信标链的区块结果确认,分片内不支持状态存储。
总结一下,ETH2.0分片技术的阶段1属于链上数据分片范畴,即只是将验证节点随机划分到不同的网络,处理不同的交易数据,分片未涉及处理状态的问题,ETH通过信标链这个核心中枢来负责最终交易状态的共识验证并在区块确认后在各个分片进行同步,信标链同时协调跨分片的状态通信,信标链基于Casper 共识来实现区块的更新, 通过交联技术实现信标链和分片的状态通信。
EVM 2.0虚拟机eWASM
ETH2.0的阶段1“分片链”仍不支持智能合约,但是随着ETH2.0新虚拟机eWASM的推出,这一情况将被改变。新虚拟机推出后,分片链将可以执行智能合约,每个分片链管理一个eWASM,包括账户、合约代码、状态、收据、其他抽象等等,这些ETH1.0拥有的概念将迁移至分片链。这将发生在信标链和分片网络稳定运行之后,分片内增加对智能合约的支持会增加状态存储的开销,以及分片之间跨分片(状态)通信的复杂性。eWASM将应对分片内运行智能合约的挑战,这是可预见的趋势,分片内支持状态操作才能明显提高ETH扩容后的交易性能。
eWASM是针对以太坊EVM推出的WebAssembly子集,EVM最初设计过程强调简单和安全,以保证智能合约运行结果的无歧义和正确性,所以EVM不支持数据类型方面精确度不确定的浮点计算。同时EVM只支持处理通用区块32位8字节数据,不支持64位。EVM本身支持的操作码也较少,只能支持有限的几种编程语言进行智能合约开发比如Solidity/Vyper,并不支持C/C++/Rust硬件及系统级别语言开发,Solidity本身语言在内存泄露、执行速度方面存在很多改进的地方。
WebAssembly(简称WASM)的设计目标是性能和效率,是为Web开发构建的一个高效计算引擎(Web虚拟机),体系架构设计接近传统计算机,支持接近硬件水平的指令,性能非常好,其支持计算机CPU RSIC指令集使得Web应用程序能利用本地计算机的硬件功能提高代码的执行速度,所以兼容多种编程语言,软件代码更加易于阅读和调试,包括Google、Microsoft等传统互联网公司以及Polkadot、EOS、Cardano等知名区块链项目都在陆续采用WASM。
eWASM是以太坊上的WASM, 向后兼容目前的EVM,不支持浮点数操作,其相比EVM最明显的优势是代码执行的速度和效率上的大幅提升,执行速度提升意味着区块每秒可以处理的交易数量TPS(吞吐量)提升,eWASM也支持更多的编程语言种类进行智能合约开发,这些编程语言相比Solidity具有更广泛的社区开发支持资源,包括编译工具、开发人员。
eWASM还有一个“优化”的地方是用eWASM智能合约替代预编译,预编译是EVM字节码的特殊位,通常代表某些通用的特定操作比如签名和哈希计算,EVM评估预编码字节代替评估合约地址内的整段代码,可以减少执行代码的Gas费用,如果不通过预编译,EVM将评估智能合约地址整段代码,效率非常低,同时很多复杂的密码计算将导致很高的Gas成本,有可能超过区块的限制而导致交易无法处理。
但是预编译存在一个缺点就是要如果加入新的操作字节码进行预编译,通常需要网络发生硬分叉,硬分叉因为有争议而较难实现。eWASM可以消除大多数当前的预编译,并用eWASM合约替换,这些智能合约可以通过重写和重新部署,而无需使用硬分叉,来增加更多新的通用操作,这使得eWASM比EVM更具优势。
智能合约如何跨分片调用
分片链A智能合约内抛出链B的调用消息,经过信标链传播在链B完成调用。
此部分调用是异步的过程。