foundry-solidity

Polar Sponsor
爱发电 赞助
.NET 9.0

使用 Foundry 工具套件构建和测试 Solidity 智能合约。适用于以太坊合约开发、编写 Forge 测试、脚本部署及调试。

创始人团结发展:与创始人1.5.0和团结组织0.8.30建立安全高效智能合同的完整指南.

功能概述

创始人团结发展:与创始人1.5.0和团结组织0.8.30建立安全高效智能合同的完整指南.是一项面向实际任务的技能,主要用于When to use this Skill.;Developing Ethereum/EVM智能合同。

核心要点

  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

Foundry Solidity 开发

使用 Foundry 1.5.0 和 Solidity 0.8.30 构建安全、高效智能合约的完整指南。

适用场景

  • 开发 Ethereum/EVM 智能合约
  • 编写 Forge 测试(单元测试、模糊测试、不变式测试、分叉测试)
  • 通过脚本部署合约
  • 使用 Foundry 工具(forge、cast、anvil、chisel)
  • 处理 foundry.toml、*.t.sol、*.s.sol 文件
  • 调试交易与合约交互

快速开始

# 创建新项目
forge init my-project && cd my-project

# 编译合约
forge build

# 运行测试
forge test

# 部署(预执行)
forge script script/Deploy.s.sol --rpc-url sepolia

# 部署(广播上链)
forge script script/Deploy.s.sol --rpc-url sepolia --broadcast --verify

项目结构

my-project/
├── foundry.toml          # 配置文件
├── src/                  # 合约源码目录
│   └── Counter.sol
├── test/                 # 测试文件(*.t.sol)
│   └── Counter.t.sol
├── script/               # 部署脚本(*.s.sol)
│   └── Deploy.s.sol
└── lib/                  # 依赖库目录
    └── forge-std/

核心命令

编译与测试

forge build                          # 编译合约
forge test                           # 运行全部测试
forge test -vvvv                     # 显示执行轨迹(trace)
forge test --match-test testDeposit  # 按测试函数名过滤
forge test --match-contract Vault    # 按合约名过滤
forge test --fork-url $RPC_URL       # 分叉测试
forge test --gas-report              # 输出 Gas 消耗报告

部署

# 单合约部署
forge create src/Token.sol:Token --rpc-url sepolia --private-key $KEY --broadcast

# 脚本化部署(推荐方式)
forge script script/Deploy.s.sol:Deploy --rpc-url sepolia --broadcast --verify

# 验证已部署合约
forge verify-contract $ADDRESS src/Token.sol:Token --chain sepolia

Cast —— 区块链交互工具

cast call $CONTRACT "balanceOf(address)" $USER --rpc-url mainnet
cast send $CONTRACT "transfer(address,uint256)" $TO $AMOUNT --private-key $KEY
cast decode-tx $TX_HASH
cast storage $CONTRACT 0 --rpc-url mainnet

Anvil —— 本地节点模拟器

anvil                           # 启动本地节点
anvil --fork-url $RPC_URL       # 分叉主网状态
anvil --fork-block-number 18000000

基础测试合约示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

import {Test, console} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";

contract CounterTest is Test {
    Counter public counter;
    address public user;

    function setUp() public {
        counter = new Counter();
        user = makeAddr("user");
        deal(user, 10 ether);
    }

    function test_Increment() public {
        counter.increment();
        assertEq(counter.number(), 1);
    }

    function test_RevertWhen_Unauthorized() public {
        vm.expectRevert("Unauthorized");
        vm.prank(user);
        counter.adminFunction();
    }

    function testFuzz_SetNumber(uint256 x) public {
        x = bound(x, 0, 1000);
        counter.setNumber(x);
        assertEq(counter.number(), x);
    }
}

关键 Cheatcodes

// 账户与 ETH 操作
address alice = makeAddr("alice");          // 创建带标签的地址
deal(alice, 10 ether);                      // 向地址发放 ETH
deal(address(token), alice, 1000e18);       // 向地址发放 ERC20 代币

// 账户伪装(Impersonation)
vm.prank(alice);                            // 下一次调用以 alice 身份执行
vm.startPrank(alice);                       // 后续所有调用均以 alice 身份执行
vm.stopPrank();

// 时间与区块控制
vm.warp(block.timestamp + 1 days);          // 设置区块时间戳
vm.roll(block.number + 100);                // 设置区块高度

// 断言与预期行为
vm.expectRevert("Error message");           // 预期发生 revert 并匹配错误消息
vm.expectRevert(CustomError.selector);      // 预期发生自定义错误
vm.expectEmit(true, true, false, true);     // 预期下一次 emit 的事件(参数:logTopic1, logTopic2, logData, logAddress)
emit Transfer(from, to, amount);            // 必须紧随其后,用于匹配预期事件

// 存储读写
vm.store(addr, slot, value);                // 写入存储槽
vm.load(addr, slot);                        // 读取存储槽

部署脚本示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

import {Script, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";

contract Deploy is Script {
    function run() external {
        uint256 deployerKey = vm.envUint("PRIVATE_KEY");

        vm.startBroadcast(deployerKey);
        Counter counter = new Counter();
        counter.setNumber(42);
        vm.stopBroadcast();

        console.log("已部署至:", address(counter));
    }
}

现代 Solidity 编程模式(Solidity 0.8.30)

// 自定义错误(更省 Gas)
error InsufficientBalance(uint256 available, uint256 required);

// 瞬态存储(Transient Storage,0.8.28+)——低成本重入防护
bool transient locked;
modifier nonReentrant() {
    require(!locked, "Reentrancy");
    locked = true;
    _;
    locked = false;
}

// 不可变变量(immutable,读取成本低)
address public immutable owner;

// 命名映射键(Named mapping parameters)
mapping(address user => uint256 balance) public balances;

// require 配合自定义错误(0.8.26+)
require(amount <= balance, InsufficientBalance(balance, amount));

配置文件(foundry.toml)

[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc = "0.8.30"
optimizer = true
optimizer_runs = 200
evm_version = "prague"

fuzz.runs = 256
invariant.runs = 256
invariant.depth = 50

[rpc_endpoints]
mainnet = "${MAINNET_RPC_URL}"
sepolia = "${SEPOLIA_RPC_URL}"

[etherscan]
mainnet = { key = "${ETHERSCAN_API_KEY}" }
sepolia = { key = "${ETHERSCAN_API_KEY}" }

[profile.ci]
fuzz.runs = 10000
invariant.runs = 1000

参考资料

详细指南请参阅:

  • 测试:参阅 references/testing.md,涵盖完整测试模式(单元、模糊、不变式、分叉)、全部 Cheatcodes 及最佳实践
  • forge-std API:参阅 references/forge-std-api.md,完整函数参考(150+ 个函数)
  • Solidity 0.8.30:参阅 references/solidity-modern.md,了解新特性与现代语法
  • 部署:参阅 references/deployment.md,涵盖脚本编写、合约验证与多链部署
  • 配置:参阅 references/configuration.md,详述所有 foundry.toml 配置项
  • Gas 优化:参阅 references/gas-optimization.md,涵盖存储打包、编译器设置与性能分析
  • 设计模式:参阅 references/patterns.md,涵盖访问控制、重入防护、工厂模式及常见编程范式
  • 安全:参阅 references/security.md,涵盖常见漏洞、防御性编码模式与审计准备要点
  • 资源:参阅 references/resources.md,含官方文档、常用库、安全工具与学习路径
  • 调试:参阅 references/debugging.md,涵盖执行轨迹(traces)、断点、console.log 及交互式调试器使用方法
  • 依赖管理:参阅 references/dependencies.md,涵盖 forge install、remappings 与 Soldeer 包管理器
  • CI/CD:参阅 references/cicd.md,涵盖 GitHub Actions 工作流、缓存策略与 Gas 消耗追踪
  • Chisel:参阅 references/chisel.md,了解交互式 Solidity REPL 的使用
  • Cast 进阶功能:参阅 references/cast-advanced.md,涵盖数据解码/编码、钱包管理与批量操作
  • Anvil 进阶功能:参阅 references/anvil-advanced.md,涵盖账户伪装、状态操控与挖矿模式

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习