北京项目EVM升级到拜占庭版本

好处总结

  1. 牵头解决了最新版本编译器编译的代码在北京项目不能运行的问题(见如下鹏飞合约,李也碰到过)

  2. 可以使用library,解决了多卡数据挤在数据合约的问题,极大简化了代码

  3. 可以使用revert了,区分了系统异常和业务取消动作(之前的invalid opcode,其他同事都认为需要升级)

  4. 突破了编译器版本限制,可以使用最新的语法了,提升了编程的表现力(版本可以定在0.4.21;但是实验性功能还不能支持

1.为什么升级

昨天(2018-04-12)将EVM核心从1.5.0升级到了1.7.0,解决了用最新版本solidity编译器的合约间调用的报错。revert指令,已有代码但未启用的delegatecall等最新的solidity特性都可以用了,如果报错提示信息也更明确。

2.升级内容梳理

  • delegatecall是北京项目指令集中有的但是没有启用,这次启用(为什么原来没有启用,这个要从公链的配置说起,delegatecall是家园版本的配置,testnet从150万块开始才有,我们用的是testnet的这个配置,而北京链才刚刚搭建所以没有这个功能,实际上代码都在了,我去掉了这个限制,因为已经时隔多年,delegatecall没必要单独对待)

  • 合约调用的不同方式比如RETURNDATASIZE(3d)是从开源的1.6.0版本中升级加入的(以上第二点是用最新的0.4.22版本编译器编译出3d指令,导致智能合约运行报错的原因)

  • program等类适应性修改
    staticcall目前还不支持

3.出现的问题,不能同步等

53不能同步,因为对这个合约执行53报错,但是阿里云升级过了可以了(相当于硬分叉了


contract User{

    bytes32 name;

    uint age;



    function setName(bytes32 n) public{

        name = n;

    }



    function getName() public view returns (bytes32){

        return name;

    }

}

contract Users {

    function getUserName(address addr) public view returns (bytes32){

        return User(addr).getName();

    }

}

如上这个合约,用最新的0.4.22夜间版本编译,出现了3d指令,导致53报错。阿里云升级后,53回放时还是不能接受

3d和3e指令都是这次升级新增的;之前的返回方式(0.4.21之前的编译器)都是编译成直接返回,然后这次最新版本编译,这个指令应该被编译成先设置到一个buffer中,然后返回size和copy指令的间接返回


以太坊指令集0.4.21

F 前线 第一版 H 家园 第二版 B 拜占庭 三一版 C 君士堡 三二版

大部分指令都是第一版就有了,我们这次升级新增了如下指令及对应功能:

  • 家园版就增加了一个delegatecall,用于library库合约调用,在北京项目很有用

  • 拜占庭版本增加了4个指令

    • 3d 3e是returndatasize,returndatacopy,最新版本编译器编译合约间调用时会生成的指定,之前调用报错,现在支持了 (见 EIP 211

    • staticcall(EIP214) 会计算传入传出的长度,但是不改变状态,暂不支持

      • 旧合约不是特别知道的话,你不能假定调用后state不会改变;但是用staticcall可以

      • staticcall

    • revert(见EIP 206),这条指令非常有用,明确区分了业务报错和虚拟机报错,有利于排查问题;并且能返回多余的gas(也叫cheap throw)

  • 君士堡增加了4条指令(逻辑左移右移,创建合约的新指令),太新了,暂时用不到,我们北京项目版本都还没有纳入

猜你喜欢

转载自blog.csdn.net/wxid2798226/article/details/80510954
今日推荐