关于DeFi去中心化稳定币项目的制作心得
在navil测试网中,我是自己在test/mocks目录下创建MockV3Aggreator来模拟价格预言机,我选择使用ChainLink-evm的AggregatorV3Interface(chainlink预言机接口)来获取单个抵押品的美元价值,兑换率为1:2000e8(这里相当于是1:2000,一个代币价值2000$)。但在这我们就遇到了问题,我们的测试数量是有限的(可以在foundry.t
github连接:doundry-defi
一.该项目实现的功能
创造与美元1:1的稳定币,仅有WETH和WBTC作为抵押品。DSC系统始终保持“超额抵押”状态,任何情况下所有抵押品的价值不应该低于所有DSC的美元支持价格。清算阙值=0.5,最小抵押率=200%,最小健康因子=1e18。
实现了抵押,销毁DSC,赎回,清算等功能。测试覆盖率达94%,并且进行了模糊测试排除了边界溢出以及授权问题。
二.首先是两个主要合约
1.dsc(DecentrailzedStableCoin.sol)
主要负责一些代币的创建,销毁以及转账等基础功能
2.dsce(DSCEngine.sol)
这是最核心的合约,也是耗时最多的合约。所有主要功能都将在这里实现。我们主要讲讲小数数位转换在计算健康因子中的应用以及在anvil中如何模拟价格预言机。
在navil测试网中,我是自己在test/mocks目录下创建MockV3Aggreator来模拟价格预言机,我选择使用ChainLink-evm的AggregatorV3Interface(chainlink预言机接口)来获取单个抵押品的美元价值,兑换率为1:2000e8(这里相当于是1:2000,一个代币价值2000$)。有个功能是去计算用户的HelthFactor(健康因子),这里就需要用到小数数位转换了。
假如我们抵押了1WETH,铸造了2DSC。1WETH = 2000e8$, 2DSC = 2$。我们可以发现他们的小数数位不同(但是本质意义上还是2000$和2$的区别),这里就需要进行数位转换,也就是2DSC=2e8。这样的话我们就能进行计算了,即healthFactor =1WETH(2000e8) / 2DSC(2e8) = 1000。
但是,我想要的健康因子不能是这种格式,因为我们大多数都是用uint256存储数值的。其一是uint256不能存储小数位,其二是小数数位少很容易发生精度损失。所以我们统一使用ether来作为单位,即1e18。
于是,最终的healthFactor =2000e8 / 2e8 * 1e18 = 1000e18.
当然了,healthFactor的正确计算还应该把WETH*你的清算阙值。(顺带一提:最低抵押率 = 最小健康因子 / 清算阙值)
三.模糊测试
我在测试中经常忘记要给DSCE合约授权,当然了,没授权的情况下revert也是需要测试的。常规的测试就不讲了,主要讲讲模糊测试。
想要理解模糊测试需要知道一点,即不变性:在这里指在任何操作序列下系统的某种属性始终保持不变,比如我的合约中总的抵押物价值始终大于总的铸造DSC价值。我们需要验证这种不变性就需要进行模糊测试,让机器人来生成海量的数据。但在这我们就遇到了问题,我们的测试数量是有限的(可以在foundry.toml中设置测试数量),那么我们如何在有限的测试数量下最大的探索边界值来寻找合约的漏洞呢。
举个例子,我让机器测试了128次,每次运行中会调用函数128次。但是有50次机器生成的随机抵押物地址都不在我们合约的抵押品范围中,于是会在开头就revert,浪费了很多测试机会。
所以,我们会创建两个测试文件,一个是Invariants.t.sol用来表明你要验证什么不变性,另一个Handler.t.sol来限制测试时的某些变量的范围,减少不必要测试的次数。Handler中限制的范围越多(合理且适当的范围),机器能够测试到的临界点和bug就可能越多 。
更多推荐



所有评论(0)