简而言之,您需要一个config.yaml文件,这是我的:
uint balance = weth.balanceOf(address(this));
uint balance = weth.balanceOf(address(this));
可是偏离了多远?我们可以配置价值,使其与抱负价值相差1美元吗?
// Assert revert on overflow
// SPDX-License-Identifier: GPL-3.0-or-later
这些是我写的第一个恍惚测试合约,这是幸运的,因为作为库或无状态的合约,,它们很容易被恍惚化。在我开始处理惩罚恍惚的有状态合约之后不久,这让我大白我做的每件事都是大错特错的。
function muld_(uint256 x, uint256 y)
cryticArgs: [“ — compile-force-framework”, “Buidler”]
uint z = muld(x, y);
您大概会留意到哪里有些奇怪的对象。我们正在恍惚的这个UNIT是什么?
Echidna将耗费一些时间来阐明合约并举办配置,最终您将看到以下内容:
/// @dev Test that supply and balance hold on deposit.echidna github有许多文档和一些教程,我无法完全领略。拯救我的是古斯塔沃·格里科(gustavogrieco)的一个运行示例,从此我对其举办了修改和重用。
address internal holder;
seqLen: 50
prefix: “crytic_”
独一知道的要领是用大量随机场景测试智能合约。Trail of Bits汇报我们在代码审核期间利用恍惚测试器,这就是我们如何做到的。
assert((x * y) / UNIT == z); // Assert math
如何利用恍惚起?
Echidna将对您合约中的每个public函数举办恍惚处理惩罚。那大概不是您想要的。有时您大概只想测试一个贫苦的函数,而不是合约中的10个测试,个中有9次通过。
首先您将必需安装echidna。在网站上的所有选项中,我设法下载了Ubuntu的预编译二进制文件。为此,您还需要安装cryptic-compile并举办更滑腻的安装。我记得我花了一些时间才把它弄对,这是最近很少见的工作,所有工作都以npm软件包的形式呈现。
我们将利用echidna在此合约中挪用DecimalMathInvariant.muld_函数20,000次。Echidna知道它必需运行这个函数,因为它是民众函数。该函数有两个参数(x和y),因此echidna将在每次运行时利用随机值。
通过恍惚化,大量测试随机场景,以找出大概会呈现的意外功效的值。
assert(address(weth).balance == weth.totalSupply());
WETH10 internal weth;
4. 也就是说,假如y小于1,z也会小于x(假如产生下溢,那将不是真的)。
constructor () {
assert(weth.totalSupply() == add(supply, ethAmount));
import “../helpers/DecimalMath.sol”;
}
恍惚器调测
}
/// that will return weth when asked to.
coverage: true
恍惚状态合约
/// @dev Implements simple fixed point math mul and div operations for 27 decimals.
什么是恍惚器?
譬喻在Yield上,我们计较分数指数,该指数是迭代计较的,而且在以太坊上运行很是昂贵,因为以太坊每次操纵都要费钱。
function deposit(uint ethAmount) public {
uint supply = weth.totalSupply();
在此文件中,我具有一个帮助函数来辅佐我计较Yield白皮书中的稳定量。我将在其他任那里所利用该函数,而且我不想本身对其举办测试,因为我无法确认它是否离开上下文。
assert (divd(z, y) <= x); // We are rounding down
在上面的合约中,我要查抄定点乘法的四个属性:
在同一个文件中,我甚至有一个稳定的测试函数,它被注释掉,使其internal化。这是开拓遗留下来的,应该清理一下,这真令人难过。
pragma solidity ^0.6.10;
}
uint supply = weth.totalSupply();
所有测试通过都很棒。除非第一次产生这种环境,不然您应该会猜疑并假设您对测试举办了错误编码。首先您需要学会接管测试失败的功效。您不会得到日志、特定assert失败的信息或状态变量的内容。
assert(weth.balanceOf(address(this)) == sub(balance, ethAmount));
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。