跳到主要内容
区块链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

模糊测试经常发现手动测试遗漏的问题:

  • 整数边界条件
  • 零值处理
  • 特殊地址(零地址、合约自身地址)
  • 大额转账的舍入误差

总结

基于属性的测试是智能合约安全的核心工具。它能自动发现你无法想象的边界情况,是传统单元测试的有力补充。