以太坊合约可复用属性指南 - 提升智能合约安全的模糊测试技术

51 阅读2分钟

以太坊合约的可复用属性

随着智能合约安全技术的持续演进,基于属性的模糊测试已成为开发者和安全工程师的核心技术。该技术依赖于代码属性(通常称为不变量)的创建,这些属性描述了代码的预期行为。为帮助社区定义属性,我们发布了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主讲)

立即开始

安装步骤

  1. 安装Echidna
  2. 将属性导入项目:
    • Hardhat项目:npm install https://github.com/crytic/properties.git
    • Foundry项目:forge install crytic/properties
  3. 根据文档创建测试合约

示例测试合约

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和流动性池等非标准合约的测试集