即将来临的君士坦丁堡硬分叉详情(2019年1月)

30次阅读

共计 1392 个字符,预计需要花费 4 分钟才能阅读完成。

君士坦丁堡分叉包含 5 个 EIP
EIP145
EVM 目前只有算数和逻辑运算,缺少原生移位运算,这个提案里补充上了,将之前通过算术运算实现的左移和右移运算的 gas 成本从 35 减少到 3gas。向后兼容对之前创建的合约没有影响。
新增栈操作码:0x1b 左移,0x1c 逻辑右移,0x1d 算术右移。
EIP1014
这个提案改变了合约地址的生成算法,原来的只需要对交易发起地址和这笔交易的 nonce 进行 keccak256 就可以了,现在加了几个参数变成:keccak256(0xff ++ address ++ salt ++ keccak256(init_code)))[12:],主要是为了避免生成的地址发生碰撞。
新增栈操作码:0xf5 Create2。
EIP1052
新增一个操作 EXTCODEHASH,可以直接返回合约的字节码 Hash,而以前获取合约字节码 Hash 的操作是 EXTCODECOPY,gas 比较昂贵。
新增栈操作码:0x3f EXTCODEHASH。
EIP1283
EVM 存储很贵,这个提案就是要优化 SSTORE 操作指令,改变这个操作消耗 gas 的测算算法。SSTORE 是 EVM 将数据存入内存槽的主要指令。
EIP1234
这个提案调整难度炸弹、降低挖矿奖励。
1、这次分叉并不包含 Casper,POS 的切换也被推迟了,还是采用 POW 机制,只不过调整下 POW 的难度计算规则,我们看下之前的难度计算规则:
// 根据父块和最新块的时间差动态调整难度,小于 10 增加难度,大于等于 20 减小难度。

block_diff = parent_diff + 难度调整 + 难度炸弹
难度调整 = parent_diff // 2048 * MAX(1 – (block_timestamp – parent_timestamp) // 10, -99)
难度炸弹 = INT(2^((block_number // 100000) – 2))
从上面可以看到,难度炸弹是指数曲线增长的,到一定区块高度会陡增,从而减慢出块时间,而本次分叉不再用区块高度了,而是用一个伪区块高度计算,从而将难度炸弹延迟大约 12 个月,以太坊系统还保持以往 15 秒一块的稳定速率,等到 2019 年冬季结束的时候,平均出块时间会是 30 秒。
看一下替换区块高度的那个伪区块高度:
fake_block_number = max(0, block.number – 5_000_000) if block.number >= CNSTNTNPL_FORK_BLKNUM else block.number
CNSTNTNPL_FORK_BLKNUM 是本次君士坦丁堡分叉生效的高度:第 708 万块。
2、为了减小以后切换到 POS,矿工发生分叉的概率,本次也减小了区块奖励提前让大家适应下。
具体每块的奖励由 3eth 降到 2eth,叔块奖励也调整为:
new_uncle_reward = (8 – k) * new_block_reward / 8
k = block.number – uncle.number
侄块的奖励:
new_nephew_reward = new_block_reward / 32
分叉史
最后梳理一下以太坊分叉史,以太坊规划了四个升级阶段:
1、Froniter(边境)\2、Homestead(家园)\3、Metropolis(大都会)
大都会分两个阶段:拜占庭和君士坦丁堡。\ 本次君士坦丁堡分叉就位于大都会的第二阶段,预计 2019 年 1 月实施。
4、Serenity(宁静)
未来实施。

正文完
 0