明天即将迎来以太坊的升级——君士坦丁堡升级,这里记录一下升级内容(要点)

1,“君士坦丁堡”是什么?

  • 君士坦丁堡是以太坊四个发展阶段中的第三阶段中的第二个子阶段。以太坊四个阶段非别是:Frontier(前沿),Homestead(家园),Metropolis(大都会),Serenity(宁静)。其中第三阶段会引入许多重要特性,于是就将第三阶段分成两步走——拜占庭子阶段跟君士坦丁堡子阶段。在君士坦丁堡子阶段会引入POS机制,变成POW + POS混合的局面,为Serenity阶段的纯POS做铺垫。
  • 君士坦丁堡升级是一次硬分叉,但这次硬分叉不会导致出现两个币——因为这是一次无争议的分叉——整个社区都赞同这次分叉,大家都升级了客户端,到了指定的块高度之后,一起实行新的共识。

2,君士坦丁堡升级了哪些内容?

本次升级围绕五个EIP,范围涉及挖矿奖励、合约效率、存储效率、链外扩容等方面。

  • EIP1234 减少出块奖励。
  • EIP145 增加移位操作符,减少执行合约的花费。
  • EIP1052 提升验证外部合约的效率。
  • EIP1014 状态通道。
  • EIP1283 更加合理的存储花费。优化SSTORE操作码的计费逻辑。

接下来我们分别研究下以上五个EIP的具体内容

2.1 EIP1234 减少出块奖励、推迟难度炸弹

这应该是本次升级最显著的改动了——将挖矿奖励由3eth将为2eth——称之为“the thirdening”。EIP1234还做了一件事:推迟难度炸弹大约12个月。所谓的难度炸弹,就是调高POW挖矿的难度,逼迫矿工由POW挖矿转为POS挖矿。如果难度炸弹过于激进,可能导致POW的那部分矿工收益锐减,可能会直接退出挖矿——会威胁链的安全。

2.2 EIP145 增加移位操作符,减少执行合约的花费

在EVM中增加三个原生操作符:SHL(左移)、SHR(逻辑右移)、SAR(算数右移)

名称 操作码 字节码 等效表达式 gas 备注
左移 SHL 0x1B (arg2 * 2^arg1) mod 2^256 35
逻辑右移 SHR 0x1C floor(arg2 / 2^arg1) 35 arg2、arg1为uint256
算术右移 SAR 0x1D floor(arg2 / 2^arg1) 3 arg2为int256,arg1为uint256

丰富EVM的指令集,有利于编译出更高效(花费gas更少)的代码,但是已发布的合约代码无法从本EIP中受惠。

2.3 EIP1052 提升验证外部合约的效率

在EVM中增加EXTCODEHASH 操作符,字节码0x3F。接受一个address做参数,计算该地址下的代码的hash,并返回。假如地址下并无代码(是一个外部账户),返回空数据的hash:c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470。本操作码耗400gas。

2.4 EIP1014 状态通道

V神提的EIP,不太好理解。表面上来看,就是在EVM中增加了一个操作符CREATE2,字节码0xF5。
实际上是为以后的链外扩容做基础。

2.5 EIP1283 更加合理的存储花费

本EIP针对SSTORE操作码的计费提出了一个优化方案。之前SSTORE操作码的计费逻辑是这样的:

  • 将Storage slot由0变为非0值,花费20000gas
  • 将Storage slot由非0更改为非0,花费5000gas。
  • 将Storage slot由非0更改为0,花费5000gas但是会返还15000gas,净赚10000gas。返还的gas不会超过当前交易的gas的一半。

现将计费逻辑优化如下:
首先针对Storage slot定义三个名次

  • 初始值(original value):本交易执行之前,Storage slot的值。
  • 当前值(current value):本交易中,执行当前SSTORE之前的值。
  • 新值(new value):本交易中,当前SSTORE之后的值。

对于一个特定的交易,一个Storage slot只有一个初始值,可能有多个当前值、多个新值。
优化后的计费逻辑如下:


function calcStoreGas(originalValue, currentValue, newValue){if(currentValue == newValue) return 200;//currentValue != newValueif(currentValue == originalValue){//该slot尚未在本次交易中更新过if(originalValue == 0) return 20000;if(newValue == 0) refund(15000);return 5000;}else{// 该slot已经在本次交易中被更新过了——slot已经脏了if(originalValue != 0){if(currentValue == 0) removeRefund(15000);if(newValue == 0) refund(15000);}if(originalValue == newValue){//该slot被重置到了上一个交易的状态if(originalValue == 0)refund(19800);elserefund(4800)}return 200;}
}

从上面的代码可以看出,EIP1283将大大减少合约运行时花费的gas。已发布的合约代码也可从本EIP中受惠。

总结

以上五个EIP便是本次君士坦丁堡升级的主要内容,除了EIP1234外,其他四个EIP皆是围绕着EVM进行升级:EIP145、EIP1052、EIP1014是新增操作码,EIP1283是优化已有的操作码的行为。

后记

EIP1283有bug,会引起重入攻击,已经从君士坦丁堡升级中移除,放进下一次的伊斯坦布尔升级中,并更名为EIP2200,消除了重入攻击,详情稍后奉上。

君士坦丁堡升级要点详解相关推荐

  1. Ethereum 君士坦丁堡安全漏洞对 FOD 的影响

    FOD 与 Ethereum 的前世今生 FOD 是 FIBOS 生态中的稳定币,与 USDC 1:1 锚定,其服务于需要稳定价值衡量的应用场景.FOD 通过跨链网关将 ETH 链上的 USDC 与 ...

  2. 君士坦丁堡分叉引起的安全问题

    目录 君士坦丁堡分叉引起的安全问题 一. 什么是君士坦丁堡分叉 二. 一个重入合约 三. 一份尝试攻击的合约 四. 组合调用 分叉之前 分叉之后 调用顺序 五. 如何解决 君士坦丁堡分叉引起的安全问题 ...

  3. 以太坊君士坦丁堡:是利好?-千氪

    以太坊官方发文提醒硬分叉注意事项:分叉时间预计在1月16日,区块高度在7080000.并强调,此次硬分叉就像Office软件升级一样,会出现一些兼容类的问题,节点需要全部更新升级. 此次更新是无争议的 ...

  4. 全球区块链第9周看点 | 以太坊君士坦丁堡/圣彼得堡硬分叉正式完成;纳斯达克正式上线BTC和ETH指数...

    TokenInsight整理了区块链行业在交易所.项目治理.通用平台.稳定币.隐私.游戏等方面发生的大事件,并对此进行了点评. 本周市场数据 针对本周(2019 年 2 月 23 日至 2019 年 ...

  5. 文明与征服君士坦丁阵容搭配推荐 文明与征服君士坦丁攻略

    这里面虽然君士坦丁大家都认为很强,但是他是个肉坦,在输出方面会有所欠缺,所以很多人不喜欢玩,但是越到后面就越能了解到这个角色的重要性.因为纯爆发的越到后面越不好打,好不容易打过了自己损失也大,而以君士 ...

  6. 划动浮空岛_划动浮空岛攻略轻松通关要点详解

    划动浮空岛攻略轻松通关要点详解,玩家在游戏中一定要注意自己的移动位置,同时我们需要了解自己的各种装置,这个才是最关键的.下面的攻略就为玩家详细的介绍一些获得高分和通关的技巧,这些都是最重要的.想要了解 ...

  7. iOS开发证件要点详解

    iOS开发证书要点详解 引言 关于开发证书配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一 ...

  8. linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...

    今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...

  9. 【UDS统一诊断服务】(补充)五、ECU bootloader开发要点详解 (1)

    文章目录 引言 1. bootloader的功能 2. 如何建立可靠的总线通信? 重要说明: 3. 解析编程文件(S19/HEX/BIN) 引言 bootloader的功能 如何建立可靠的总线通信? ...

最新文章

  1. .sh是什么语言_shell的重生历史:从sh到bash
  2. Linux IPv6 UDP套接字编程示例
  3. 尽量使用const、enum、inline代替#define
  4. 项目托管到GitHub及简单使用
  5. 群晖docker装huginn_应用篇:Docker版Zerotier实现内网穿透
  6. python按键盘上哪个键运行_python根据键盘输入进行相应操作
  7. java中实现将一个数字字符串转换成逗号分隔的数字串, 即从右边开始每三个数字用逗号分隔
  8. 建立带头结点的双向链表_尾插法
  9. java android上传文件_Java-Android-如何将txt文件上传到网站?
  10. Nginx配置优化参考
  11. mysql 条件触发器_具有条件的MySQL更新触发器(MySQL Update Trigger with Conditions)
  12. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_3 配置解决中文乱码的过滤器
  13. AVOD-代码阅读理解系列(一)
  14. ACM/ICPC World Finals 2012 B Curvy Little Bottles
  15. 【ATSC】 为什么选择ATSC 3.0
  16. 清华大学何平:央行数字货币具备许多优势 但不可盲目推进
  17. Java学习视频资料
  18. 转:彼得·德鲁克:如何发挥人的长处?
  19. 最近爆火chatGTP是人工智能还是人工智障?
  20. 【JZOJ3622】【BOI2011】2circles (半平面交+旋转卡壳)

热门文章

  1. 调整 Windows 11 任务栏位置
  2. sap税码配置_SAP税务管辖码Tax Jurisditcion code功能(1)
  3. php国际象棋棋盘,php趣味编程 - php输出国际象棋棋盘 - 小徐
  4. 联想计算机不能进入系统桌面,联想笔记本电脑进不了桌面怎么办
  5. JWT的数据格式详解
  6. nmon analyser 使用中报错“宏”不可用的问题及处理
  7. 永远不要忽视 粉红色/红色的异样字体 在你不知道为什么跟你期望偏差那么大的时候,,不要急记得去问问为什么
  8. 【MySQL】在线无锁无延迟DDL神器gh-ost
  9. 一行输入两个整数,以空格间隔
  10. mybatis中更新mysql时间多了一秒