Solidity智能合约开发Skill solidity-dev

Solidity智能合约开发技能专注于以太坊区块链上的安全、高效智能合约编写。该技能涵盖ERC标准代币开发、Gas优化技术、安全模式实现、可升级合约设计等核心领域,适用于DeFi、NFT、DApp等Web3应用开发。关键词:Solidity开发、智能合约、区块链开发、以太坊、ERC标准、Gas优化、安全审计、DeFi、NFT、Web3开发。

智能合约 0 次安装 3 次浏览 更新于 2/23/2026

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 - 安全审计代理