PlatON的智能合约自动化测试(三)

原创 PlatON

PlatON的智能合约自动化测试(三)

回顾上期我们讲解了PlatON的自动化测试相关介绍,这次我们来讲解智能合约在PlatON里都做了哪些测试工作,首先我们要了解什么是智能合约,本质上来说,智能合约是一段程序,它以计算机指令的方式实现了传统合约的自动化处理。简单地讲,智能合约就是双方在区块链资产上交易时,触发执行的一段代码,这段代码就是智能合约。那么从以下几个问题来说明下PlatON的智能合约测试。本篇为第三部分。

| 智能合约覆盖测试范围

对应PlatON每个版本,我们都会对其针对合约相关进行验证,验证的内容主要包含以下四个方向:

基本运算符测试合约

function add(uint a, uint b) internal pure returns (uint c) { 
    c = a + b; 
    require(c >= a, "SafeMath add wrong value"); 
    return c; 
} 
function sub(uint a, uint b) internal pure returns (uint) { 
    require(b <= a, "SafeMath sub wrong value"); 
    return a - b; 
}

通过编写测试合约,在合约里编写运算符逻辑,如算数运算符、比较运算符或者是逻辑运算符等的逻辑代码,然后通过编译部署后调用来验证PlatON对这些基础的支持。

合约类型

EVM测试合约

string public constant name = type(TypeName).name;

function getContractName() public returns(string memory contractName){ 
    return name; }

WASM测试合约

ACTION void clone_contract(const Address & contract_address){ 
    auto info = platon_create_contract(contract_address, 0U, 0U); 
    if(info.second) set_state("clone", info.first); 
}

PlatON链支持EVM和WASM合约,所以我们在测试过程中也要针对两种不同的合约类型进行语法、方法及数据类型测试用例覆盖,保证在这两种合约能达到预期测试结果。

PlatON内置合约调用

function assemblyCallppos(bytes memory data,address addr) public {
    uint256 len = data.length; 
    uint retsize; 
    bytes memory resval; 
    assembly {
        let result := delegatecall(gas(), addr, add(data, 0x20), len, 00)
        retsize := returndatasize()
    }
    resval = new bytes(retsize); 
    assembly { 
        returndatacopy(add(resval, 0x20), 0, returndatasize()) 
    } 
    returnValue = resval;
}

除了支持外部合约调用,我们在测试时也会编写测试合约调用PlatON经济模型业务代码,从而验证通过外部合约能正常调用到PlatON对RPC接口。

编译器版本适配

随着时间推移,智能合约的发展迭代出不同的编译版本,PlatON在每个版本都需要适配已经发布的合约编译器,确保用户在使用不同编译器版本编译出来的合约能正常部署到链上,所以PlatON在测试环境会收集到行业中主流版本进行编译器适配的功能回归。

| 后续优化的思考

目前对于我们测试团队来说,JUnit测试框架在测试过程中使用过于繁琐,维护脚本也上需要投入一定的人力进行修复,版本迭代时需要对历史数据进行复查以及在脚本的修改上花很大的精力。经过内部测试团队人员的讨论和调研,也为了配合经济模型自动化的统一,我们后续会考虑针对现有的智能合约自动化进行移植,使用python语言进行重新开发,简化生成java包装类的过程。使用者在整个过程中能够更加清晰地了解整个合约的调用过程,另一方面python也是测试相对主力的语言,使得更多测试人员可以参与进来丰富自动化的内容。

本文转载自https://mp.weixin.qq.com/s/8253ITB2IUlJ_zl1f96Xsg

(0)
PlatONWorld-M6的头像PlatONWorld-M6管理员
上一篇 28 9 月, 2021 15:01
下一篇 29 9 月, 2021 08:32

相关推荐

发表回复

登录后才能评论