以太坊合约的可复用属性
随着智能合约安全技术的持续演进,基于属性的模糊测试已成为开发者和安全工程师的核心技术。该技术依赖于代码属性(通常称为不变量)的创建,这些属性描述了代码的预期行为。为帮助社区定义属性,我们发布了168个预构建属性集,可直接用于我们的智能合约模糊测试工具Echidna,或通过单元测试调用。
属性覆盖范围
该资源库包含以下测试内容:
- ABDKMath64x64数学库
- ERC-20代币标准
- ERC-4626代币化金库标准
ERC20属性
- 标准接口函数属性
- 基础合理性属性(例如:用户余额不应大于代币总供应量)
- 可销毁、可铸造和可暂停代币的扩展属性
ERC4626属性
- 验证舍入方向符合规范的属性
- 必须永不回退的函数回退属性
- 差分测试属性(例如deposit()必须匹配previewDeposit()预测功能)
- 功能属性(例如redeem()从正确账户扣除份额)
- 非规范安全属性(份额通胀攻击、代币授权检查等)
ABDKMath64x64
- 交换律、结合律、分配律和恒等属性
- 差分测试属性(例如2^(-x) == 1/2^(x))
- 特定输入范围应回退的验证属性
- 不应回退的负向验证属性
- 区间属性(例如min(x,y) <= avg(x,y) <= max(x,y))
实战工作坊
我们将通过两场直播提供实操指导:
- 3月7日:ERC20属性、示例用法和Echidna作弊码(Guillermo Larregay主讲)
- 3月14日:ERC4626属性、示例用法和有效模糊测试技巧(Benjamin Samuels主讲)
立即开始
安装步骤
- 安装Echidna
- 将属性导入项目:
- Hardhat项目:
npm install https://github.com/crytic/properties.git - Foundry项目:
forge install crytic/properties
- Hardhat项目:
- 根据文档创建测试合约
示例测试合约
pragma solidity ^0.8.0;
import "./path/to/YetAnotherCashEquivalentToken.sol";
import {ICryticTokenMock} from "@crytic/properties/contracts/ERC20/external/util/ITokenMock.sol";
import {CryticERC20ExternalBasicProperties} from "@crytic/properties/contracts/ERC20/external/properties/ERC20ExternalBasicProperties.sol";
contract CryticERC20ExternalHarness is CryticERC20ExternalBasicProperties {
constructor() {
token = ICryticTokenMock(address(new CryticTokenMock()));
}
}
Echidna配置文件示例
corpusDir: "tests/crytic/erc20/echidna-corpus-internal"
testMode: assertion
testLimit: 100000
deployer: "0x10000"
sender: ["0x10000", "0x20000", "0x30000"]
multi-abi: true
运行命令:echidna-test . --contract CryticERC20ExternalHarness --config tests/echidna-external.yaml
未来计划
- 扩展对PRBMath等数学库的测试
- 增加更多ERC标准测试
- 创建AMM和流动性池等非标准合约的测试集