Casper 概念原型 乙

jan   |     |   2273 次阅读

Original post by Vitalik Buterin on March 5th, 2016.

在Serenity的第一个python版本概念原型发布过去两周之后,今天我很高兴地宣布Serenity概念原型乙(Serenity PoC2)已经完成了!虽然这个版本依然离能在测试网络上运行客户端很遥远,更不要说和生产可用版本的差距,它也是包含了一系列重要的改进。概念原型乙最重要的目标是实现一个完整的协议,覆盖基本的边界情况(重复投注和区块的裁剪),以便确保我们掌握了协议的每一个细微之处,并可以在测试环境中(即便是高度受限的环境)观测其实际运行情况。这个目标已经达到了。相对于仅包含支撑Casper和EIP101运行之最小功能集合的概念原型甲,概念原型乙实现了完整的Casper/Serenity协议,包括EIP101和105。

译注: EIP是以太坊改进提案(Ethereum Improvement Proposal)的缩写。

在概念原型乙中新增的具体特性如下:

  • EIP 105的实现 - EIP 105是“分片脚手架”提案,目的是让以太坊上交易的处理可以在一定程度上并行化,并且为更后面阶段的分片(sharding)设计(尚未确定)打下基础。概念原型乙使用这里描述的二叉树分片机制,使交易可以自行指定一个“活动范围”,从而限制交易在执行中可以访问的地址范围,保证指定了不同活动范围的交易可以并行的被处理。它还引入了SSTOREEXTSLOADEXT两个操作码,使得合约可以操作其它分片中相同地址上的存储(前提是目标分片在同一个地址范围中)。因此这个二叉分片树实际上同时实现了超合约分片机制和次合约分片机制。

  • Gas检验 - 实现了通过对交易数据进行模式匹配来确保其正确支付Gas费用的算法。现在的做法是只接受发往特定类型账户的交易,此类账户必须包含一段特定的“规定账户代码”,规定代码允许账户所有者自由选择两段代码:checker code和runner code. Check code用来做快速检查,例如签名和nonce校验,它会分配到250,000个gas的费用上限。Runner code用来执行交易处理所需的开销大的操作(例如,使用超过250,000个gas来调用另外一个合约)。这个改动的主要实际用途,是用户现在可以让合约(例如多重签名钱包,环签名混币等)直接支付gas费用,而无需再自己持有一个保留少量以太币的账户用来支付gas费用 - 唯一的条件是合约支付费用的代码本身的执行费用不超过250,000个gas.

  • 环签名混币合约 - test.py代码包含了一个环签名验证合约实例的创建,可以用来混币:五个用户各自发送0.1个以太币和公钥给这个合约,然后各自通过可关联环签名(linkable ring signature)提走0.1个以太币,这样就同时做到了 i) 每个存入0.1个以太币的用户都可以提走0.1个以太币,且 ii) 你无法得知哪一笔提取对应哪一笔存入。这个实现能通过Gas检验,因此有一个非常大的优点,也就是无需一个额外的账户来支付提取以太币的交易费用(如果在当前的以太坊上实现相同的环签名合约则需要这个额外的账户,这会导致潜在的隐私泄漏问题),相反的,你可以直接发出提取费用的交易,Gas检验代码会确认交易签名正确,然后混币合约就会在该交易打包进区块链时自己向矿工支付费用。

  • 更明确的利率和评分规则参数 - 现在的评分规则(根据验证人投注行为来分配其所获得回报的机制)是对数曲线和二次曲线评分规则的线性组合,其参数设置为:i) 在区块和状态树根上的投注都完全正确且有最大“勇气值”(代表快速达到100%收敛的意愿)的投注将获得大约每个块十亿分之97.28的回报,即50.58%的年回报率,ii) 在每一个块,向所有验证人收取十亿分之74的罚金,即大约36.98%的负年利率,因此完美投注的净回报期望是大约十亿分之22, 即大约10%的年回报率。在任何一个区块或是状态树根上的完全错误投注(带有最高确定度的错误投注)会毁掉超过90%的保证金,一定程度上的错误投注造成的损失会小得多,但依然会使回报变成负数。这些参数会持续被改进,以保证现实参与的验证人能得到合理的报酬。

  • 更明确的验证人就职规则 - 最多250个验证人,所需的最低保证金从1250个以太币起步,按公式min = 1250 * 250 / (250 - v)以双曲线速率增长,v是当前有效验证人数量(例如,假设现在有125位有效验证人,最低保证金就是2500个以太币,如果有225位有效验证人则需要12500个以太币,如果有248位有效验证人所需的最低保证金是156250个以太币)。当你加入后,你最长可以在三千万秒(大约一年)的时间内进行投注并获得回报,这个时间点之后将会启动一个特殊的惩罚机制,每个块收取十亿分之100的罚金,使得此时的验证工作没有利润,以此强迫验证人变动。

  • 新的预编译合约 包括ECADD, ECMUL(对于环签名很关键), MODEXP, RLP decode和gas存入合约(规定账户代码用来支付gas费用的一种机制,理论上如果需要可以在EVM里面实现,但可能会有效率问题)。

  • 将LOG和CREATE重构为预编译合约 - 出于向后兼容的原因依然保留这些操作码,但是它们现在只是简单的调用预编译的合约。这是往“抽象”发展的其中一步。

  • 直接对状态树根进行投注的新机制

  • 检测和删除双重投注和双重出块的逻辑

  • 当验证人在某一高度产出多个块时依然可以达成共识的处理逻辑

到目前为止协议中的一切决定都不是最终确定的,关于这些细节的争论依然在我们的研究聊天室中继续。接下来的概念原型将朝着Serenity节点实现的方向推进,包括一个合适的P2P网络层,最终的目标是运行起一个多计算机构成的Serenity测试网络。同时,我们的研究团队将继续锤炼协议细节,确保协议的每一个部分都是正确且合理的。

接下来几周我们会发布关于Casper协议规格和设计理念的更多资料,覆盖从广义投注共识概念到具体设计决定,例如验证人参与规则,投注机制和区块提案人选择,的各个方面。

译者: @jan