广告位出租、网站出售,联系:1466191513

智能合约测试的技巧与实践

科技新闻 2020-04-10 12:21158网络整理

前  言

区块链的发展伴随着信息安全的话题。在Solidity不长的发展历程中,发生过不止一次骇人听闻、影响深远的安全攻击事件,给一些机构和组织造成不可挽回的损失。

『祸乱生于疏忽,测试先于交付』,如果这些缺陷和漏洞在测试环节被发现,就能有效避免损失。

测试是智能合约开发与交付过程中至关重要的一环。其能有效检验实际结果是否符合设计预期,有助识别错误、查缺补漏。同时,高质量、可复用的测试,还有助于提升整体开发效率。

前文介绍了Solidity的前世今生、语法特性、设计模式、编程攻略和底层原理。作为系列终篇,本文将重点介绍和分享Solidity的测试场景、方法和实践。

前置准备

进入测试前,需要完成以下步骤:链的搭建、控制台安装、智能合约开发、智能合约编译与部署、利用Java等SDK开发一个应用。

详细准备工作可参考《FISCO BCOS零基础入门,五步轻松构建应用》和FISCO BCOS官方文档,此处不再赘述。FISCO BCOS官方文档地址:

https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html

测试环境

FISCO BCOS提供控制台、WeBASE-Front和SDK代码测试,这三种环境适用于不同测试场景:

· 控制台:提供命令行交互界面,通过在控制台创建合约和输入调用、查询指令,来进行简单调试。适用于非常简单的合约。

· WeBASE-Front:提供可视化交互界面以及简易的IDE环境。适用于业务逻辑并不复杂的合约,更推荐开发人员进行一些调试。

· SDK:例如集成Java Web3sdk,创建一个Java项目,并编写应用和测试代码。适用于对智能合约质量要求较高、要求测试案例可复用、业务逻辑复杂或要求持续集成的场景。

控制台测试

FISCO BCOS 2.0及以上版本提供了方便易用的命令行终端、『开箱即用』的区块链利器,详情可参考《FISCO BCOS 控制台详解,飞一般的区块链体验》。

接下来将通过一个合约示例来讲解如何运用控制台进行测试。

首先,我们写一个HelloWorld合约:

pragma solidity ^0.4.25;

contract HelloWorld{
    string public name;
    constructor() public{
       name = "Hello, World!";
    }
  
    function set(string n) public{
      name = n;
    }
}

然后,将这个合约命名为HelloWorld.sol,并保存到控制台所在的contracts/solidity/路径下。随后,执行./start.sh 启动控制台并部署合约:

=============================================================================================
Welcome to FISCO BCOS console(1.0.8)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
 ________ ______  ______   ______   ______       _______   ______   ______   ______
|        |      \/      \ /      \ /      \     |       \ /      \ /      \ /      \
| $$$$$$$$\$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\    | $$$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\
| $$__     | $$ | $$___\$| $$   \$| $$  | $$    | $$__/ $| $$   \$| $$  | $| $$___\$$
| $$  \    | $$  \$$    \| $$     | $$  | $$    | $$    $| $$     | $$  | $$\$$    \
| $$$$$    | $$  _\$$$$$$| $$   __| $$  | $$    | $$$$$$$| $$   __| $$  | $$_\$$$$$$\
| $$      _| $$_|  \__| $| $$__/  | $$__/ $$    | $$__/ $| $$__/  | $$__/ $|  \__| $$
| $$     |   $$ \\$$    $$\$$    $$\$$    $$    | $$    $$\$$    $$\$$    $$\$$    $$
 \$$      \$$$$$$ \$$$$$$  \$$$$$$  \$$$$$$      \$$$$$$$  \$$$$$$  \$$$$$$  \$$$$$$

=============================================================================================
[group:1]> deploy HelloWorld
contract address: 0x34e95689e05255d160fb96437a11ba97bb31809f

[group:1]>

合约被成功部署后就可以开始测试了。我们先打印这个合约中name的值,然后修改为新的值,最后重新查询name中的值。

[group:1]> call HelloWorld 0x34e95689e05255d160fb96437a11ba97bb31809f name
Hello, World!

[group:1]> call HelloWorld 0x34e95689e05255d160fb96437a11ba97bb31809f set "Hello, test!"
transaction hash: 0x72c8a95b651fb5d12c44b69624d5213d58af1509f00920757fce94d019b5eae8

[group:1]> call HelloWorld 0x34e95689e05255d160fb96437a11ba97bb31809f name
Hello, test!

[group:1]>

上述例子演示了如何使用控制台部署与调试合约。控制台设计简洁优雅,使用体验如丝般顺滑。不过,在处理一些复杂场景,例如需要切换外部账户,或通过可视化界面进行操作时,WeBASE-Front当仁不让地扛起大旗。

WeBASE-Front测试

WeBASE-Front为开发者提供了运行核心信息的可视化操作、Solidity开发的IDE环境以及私钥管理功能,让大家更便捷地开启区块链之旅。

关于WeBASE-Front的介绍可参考《WeBASE节点前置组件功能解析》与《安装部署说明》。《安装部署说明》地址:
https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/developer.html#

接下来,我们演示一个需要切换外部账户的测试案例,以下是合约代码:

pragma solidity ^0.4.25;

contract BasicAuth {
    address public _owner;

    constructor() public {
        _owner = msg.sender;
    }

    function setOwner(address owner)
        public
        onlyOwner
{
        _owner = owner;
    }

    modifier onlyOwner() { 
        require(msg.sender == _owner, "BasicAuth: only owner is authorized.");
        _; 
    }
}

在这个示例中,合约owner被自动赋值为合约部署者。修饰器onlyOwner决定了setOwner函数只能由_owner用户来发起。

在合约管理-合约IDE中,创建test文件夹,并复制合约代码:

智能合约测试的技巧与实践

然后,点击私钥管理-新增用户,创建user1和user2两个用户。

智能合约测试的技巧与实践

这时,选择部署合约,会弹出用户地址窗口选项,选择user1。

智能合约测试的技巧与实践

合约部署成功后,会展示合约地址、合约名、abi、合约binary等系列信息:

智能合约测试的技巧与实践

智能合约测试的技巧与实践
转载请表明文章出处
本文地址:https://www.5zhuo.com/keji/152832.html


标签:区块链  智能合约  Solidity  

站长统计代码放在此处

联系QQ:1466191513 免责声明:本网站所刊载信息,不代表网卓新闻网观点,本站是自动更新内容如有内容侵权或者需要更改内容请联系站长我们将删除或者更正内容