关于 solidity-development
面向智能合约开发者的 Solidity 开发技能,涵盖语言特性、设计模式、测试与升级方案,并提供代码示例和问题排查指引。
主要功能
- 01Solidity 0.8.x 语言特性
- 02合约设计模式
- 03Foundry 与 Hardhat 测试
- 04合约升级方案
- 05安全清单与问题排查
适用场景
- 01学习 Solidity 语言特性
- 02为合约设计选择模式
- 03使用模糊与不变量测试
- 04排查常见编译和安全问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pluginagentmarketplace/ custom-plugin-blockchain --skill solidity-development安装后在 Claude Code 中输入/solidity-development确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/config.yamlschema.jsonreferences/GUIDE.mdPATTERNS.mdscripts/validate.py详细介绍
Solidity 开发技能
掌握 Solidity 智能合约开发,涵盖设计模式、测试策略和生产环境最佳实践。
快速入门
# Invoke this skill for Solidity development
Skill("solidity-development", topic="patterns", solidity_version="0.8.24")
涵盖主题
1. 语言特性(0.8.x)
现代 Solidity 基础知识:
- 数据类型:值类型、引用类型、映射
- 函数:可见性、修饰符、重载
- 继承:菱形问题、C3 线性化
- 自定义错误:节省 Gas 的错误处理
2. 设计模式
经过实践检验的模式:
- CEI:检查-效果-交互
- Factory:合约部署模式
- Proxy:可升级合约
- 访问控制:RBAC、Ownable
3. 测试
全面的测试策略:
- 单元测试:Foundry、Hardhat
- 模糊测试:基于属性的测试
- 不变量测试:系统级属性
- 分叉测试:主网模拟
4. 可升级性
安全的升级模式:
- UUPS:自升级 Proxy
- 透明模式:管理员隔离
- Beacon:共享实现
- Diamond:多面体
代码示例
CEI 模式
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract SecureVault {
mapping(address => uint256) public balances;
error InsufficientBalance();
error TransferFailed();
function withdraw(uint256 amount) external {
// 1. CHECKS
if (balances[msg.sender] < amount) revert InsufficientBalance();
// 2. EFFECTS
balances[msg.sender] -= amount;
// 3. INTERACTIONS
(bool ok,) = msg.sender.call{value: amount}("");
if (!ok) revert TransferFailed();
}
}
Factory 模式
contract TokenFactory {
event TokenCreated(address indexed token, address indexed owner);
function createToken(
string memory name,
string memory symbol
) external returns (address) {
Token token = new Token(name, symbol, msg.sender);
emit TokenCreated(address(token), msg.sender);
return address(token);
}
}
Foundry 测试
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "forge-std/Test.sol";
contract VaultTest is Test {
Vault vault;
address alice = makeAddr("alice");
function setUp() public {
vault = new Vault();
vm.deal(alice, 10 ether);
}
function test_Deposit() public {
vm.prank(alice);
vault.deposit{value: 1 ether}();
assertEq(vault.balances(alice), 1 ether);
}
function testFuzz_Withdraw(uint256 amount) public {
amount = bound(amount, 0.01 ether, 10 ether);
vm.startPrank(alice);
vault.deposit{value: amount}();
vault.withdraw(amount);
vm.stopPrank();
assertEq(vault.balances(alice), 0);
}
function test_RevertWhen_InsufficientBalance() public {
vm.prank(alice);
vm.expectRevert(Vault.InsufficientBalance.selector);
vault.withdraw(1 ether);
}
}
模式参考
| 模式 | 使用场景 | 复杂度 |
|---|---|---|
| CEI | 所有状态更改 | 低 |
| Factory | 多个实例 | 低 |
| Clone (1167) | 节省 Gas 的副本 | 中 |
| UUPS | 可升级 | 中 |
| Diamond | 无限制大小 | 高 |
常见陷阱
| 陷阱 | 问题 | 解决方案 |
|---|---|---|
| 栈太深 | >16 个变量 | 使用结构体或辅助函数 |
| 合约太大 | >24KB | 拆分为库 |
| 重入 | 调用后更新状态 | 使用 CEI 模式 |
| 缺少访问控制 | 任何人都可以调用 | 添加修饰符 |
故障排除
“Stack too deep”
// Solution 1: Use struct
struct Params { uint256 a; uint256 b; uint256 c; }
// Solution 2: Block scoping
{ uint256 temp = x + y; }
// Solution 3: Internal function
function _helper(uint256 a) internal { }
“Contract size exceeds limit”
# Check contract sizes
forge build --sizes
解决方案:拆分为库,使用 Diamond 模式。
安全检查清单
- 所有提款操作都采用 CEI 模式
- 对管理员函数进行访问控制
- 输入验证(零地址、边界)
- 对外部调用添加重入保护
- 状态更改时发出事件
- 使用自定义错误以提高 Gas 效率
CLI 命令
# Development workflow
forge init # New project
forge build # Compile
forge test -vvv # Run tests
forge coverage # Coverage report
forge fmt # Format code
forge snapshot # Gas snapshot
交叉引用
- Bonded Agent:
03-solidity-expert - 相关技能:
ethereum-development、smart-contract-security
版本历史
| 版本 | 日期 | 更改 |
|---|---|---|
| 2.0.0 | 2025-01 | 生产级版本,支持 Foundry 和各类模式 |
| 1.0.0 | 2024-12 | 初始版本 |
评论
支持 Markdown