君士坦丁堡分叉包含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(寧靜)
未來實施。