name: solidity-dev description: 精通Solidity语言特性、模式和安全智能合约开发的最佳实践。涵盖ERC标准、Gas优化、可升级合约和安全模式。 allowed-tools: Read, Grep, Write, Bash, Edit, Glob, WebFetch
Solidity开发技能
专家级Solidity智能合约开发,强调安全模式、Gas优化和ERC标准合规。
能力
- 安全编码模式:实现检查-效果-交互模式、重入保护
- Gas优化:在适当情况下使用汇编/Yul编写Gas高效代码
- NatSpec文档:生成全面的合约文档
- ERC标准:实现ERC-20、ERC-721、ERC-1155、ERC-4626合规代币
- OpenZeppelin集成:正确使用和扩展OZ合约
- 现代Solidity特性:利用0.8+版本特性(自定义错误、unchecked块)
- 可升级合约:实现UUPS和透明代理模式
安全模式
检查-效果-交互(CEI)模式
function withdraw(uint256 amount) external {
// 检查
require(balances[msg.sender] >= amount, "余额不足");
// 效果
balances[msg.sender] -= amount;
// 交互
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "转账失败");
}
自定义错误(Gas高效)
// 替代require字符串
error InsufficientBalance(uint256 requested, uint256 available);
error Unauthorized(address caller);
function withdraw(uint256 amount) external {
if (balances[msg.sender] < amount) {
revert InsufficientBalance(amount, balances[msg.sender]);
}
}
无检查算术
function increment(uint256 i) external pure returns (uint256) {
// 当不可能溢出时安全
unchecked {
return i + 1; // 节省约80 gas
}
}
ERC标准模板
ERC-20代币
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
contract GovernanceToken is ERC20, ERC20Permit, ERC20Votes {
constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {
_mint(msg.sender, 1000000 * 10**decimals());
}
// 多重继承所需的覆盖函数
function _afterTokenTransfer(address from, address to, uint256 amount)
internal override(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal override(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal override(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
ERC-721 NFT
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol";
contract MyNFT is ERC721, ERC721URIStorage, ERC721Royalty {
uint256 private _tokenIdCounter;
constructor() ERC721("MyNFT", "NFT") {
_setDefaultRoyalty(msg.sender, 250); // 2.5%
}
function safeMint(address to, string memory uri) external {
uint256 tokenId = _tokenIdCounter++;
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
}
可升级合约模式
UUPS代理
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract MyContractV1 is UUPSUpgradeable, OwnableUpgradeable {
uint256 public value;
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize() public initializer {
__Ownable_init();
__UUPSUpgradeable_init();
}
function _authorizeUpgrade(address newImplementation)
internal override onlyOwner
{}
function setValue(uint256 _value) external {
value = _value;
}
}
Gas优化技术
存储打包
// 差:使用3个存储槽(96字节)
contract Unpacked {
uint256 a; // 槽0
uint8 b; // 槽1
uint256 c; // 槽2
}
// 好:使用2个存储槽(64字节)
contract Packed {
uint256 a; // 槽0
uint256 c; // 槽1
uint8 b; // 槽1(与前一个打包)
}
Calldata vs Memory
// 对只读数组使用calldata
function processData(uint256[] calldata data) external pure returns (uint256) {
uint256 sum;
for (uint256 i; i < data.length;) {
sum += data[i];
unchecked { ++i; }
}
return sum;
}
汇编优化
function efficientTransfer(address to, uint256 amount) external {
assembly {
// 从存储加载余额
let bal := sload(add(balances.slot, caller()))
// 检查余额
if lt(bal, amount) {
revert(0, 0)
}
// 更新余额
sstore(add(balances.slot, caller()), sub(bal, amount))
sstore(add(balances.slot, to), add(sload(add(balances.slot, to)), amount))
}
}
流程集成
此技能与以下流程集成:
| 流程 | 目的 |
|---|---|
smart-contract-development-lifecycle.js |
完整开发工作流 |
erc20-token-implementation.js |
ERC-20实现 |
erc721-nft-collection.js |
NFT集合开发 |
erc1155-multi-token.js |
多代币开发 |
erc4626-tokenized-vault.js |
金库实现 |
gas-optimization.js |
性能调优 |
smart-contract-upgrade.js |
代理升级 |
工具参考
| 工具 | 目的 | 安装 |
|---|---|---|
| Foundry | 开发框架 | curl -L https://foundry.paradigm.xyz | bash |
| Hardhat | 开发框架 | npm install hardhat |
| Solhint | 代码检查器 | npm install solhint |
| Prettier Solidity | 格式化工具 | npm install prettier-plugin-solidity |
最佳实践清单
- [ ] 使用最新的稳定Solidity版本(0.8.x+)
- [ ] 为外部调用实现CEI模式
- [ ] 使用自定义错误替代require字符串
- [ ] 添加NatSpec文档
- [ ] 实现适当的访问控制
- [ ] 考虑Gas优化
- [ ] 添加全面的测试
- [ ] 运行静态分析(Slither)
- [ ] 记录升级路径
另请参阅
skills/foundry-framework/SKILL.md- Foundry开发skills/hardhat-framework/SKILL.md- Hardhat开发skills/openzeppelin/SKILL.md- OpenZeppelin合约skills/gas-optimization/SKILL.md- Gas优化agents/solidity-auditor/AGENT.md- 安全审计代理