君士坦丁堡分叉包含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(宁静)
未来实施。