区块链Mar 28, 2026
Deep EVM #19:智能合约的基于属性测试——Foundry模糊测试
OS
Open Soft Team
Engineering Team
什么是基于属性的测试
传统单元测试验证特定输入的特定输出。基于属性的测试定义不变量(应始终为真的属性),然后让模糊测试器生成数千个随机输入来尝试违反这些不变量。
Foundry模糊测试
Foundry内置强大的模糊测试器。任何接受参数的测试函数自动成为模糊测试:
// Foundry会用随机值调用此函数数千次
function testInvariant_TotalSupplyNeverDecreases(
address from,
address to,
uint256 amount
) public {
uint256 supplyBefore = token.totalSupply();
// ... 执行操作 ...
assertGe(token.totalSupply(), supplyBefore);
}
不变量测试
Foundry的不变量测试在每次操作后验证全局属性:
function invariant_SumOfBalancesEqualsTotalSupply() public {
uint256 sum = 0;
for (uint i = 0; i < holders.length; i++) {
sum += token.balanceOf(holders[i]);
}
assertEq(sum, token.totalSupply());
}
实际发现的Bug
模糊测试经常发现手动测试遗漏的问题:
- 整数边界条件
- 零值处理
- 特殊地址(零地址、合约自身地址)
- 大额转账的舍入误差
总结
基于属性的测试是智能合约安全的核心工具。它能自动发现你无法想象的边界情况,是传统单元测试的有力补充。