solidity-core
npx skills add https://github.com/stanah/dotagents --skill solidity-core
Agent 安装分布
Skill 文档
solidity-core: Solidity éçºåºç¤ã¹ãã«
Solidity ã¹ãã¼ãã³ã³ãã©ã¯ãéçºã«ãããè¨èªãã¹ããã©ã¯ãã£ã¹ãã»ãã¥ãªãã£ãã¬ã¹æé©åãFoundry ãã¹ãæ¦ç¥ãæä¾ããåºç¤ã¹ãã«ã
対象
- Solidity 0.8.x 以éã®ã¹ãã¼ãã³ã³ãã©ã¯ãéçºå ¨è¬
- Foundryï¼forge / cast / anvil / chiselï¼ã使ã£ãéçºããã¼
- ã³ã³ãã©ã¯ãã®ã»ãã¥ãªãã£ã¬ãã¥ã¼ã»æé©å
ã¯ã¼ã¯ããã¼
Step 1: ããã¸ã§ã¯ãæ§é ã®ç¢ºèª
- ããã¸ã§ã¯ãã«ã¼ãã§ Foundry ããã¸ã§ã¯ãã確èªãã:
foundry.tomlã®åå¨ããã§ãã¯hardhat.config.*ãåå¨ããå ´å㯠Hardhat ããã¸ã§ã¯ãã¨ãã¦æ±ã- ããããåå¨ããªãå ´å㯠AskUserQuestion ã§éçºç°å¢ã確èªãã
- Solidity ãã¼ã¸ã§ã³ã確èªãã:
foundry.tomlã®solc_versionãèªã¿åã- ã¾ãã¯
pragma solidity宣è¨ã Grep ã§æ¤åºãã - ãã¼ã¸ã§ã³ã 0.8.0 æªæºã®å ´åã¯ã¢ããã°ã¬ã¼ããæ¨å¥¨ãã
- ä¾åé¢ä¿ã確èªãã:
lib/ãã£ã¬ã¯ããªï¼Foundryï¼ã¾ãã¯node_modules/ï¼Hardhatï¼ãã¹ãã£ã³- OpenZeppelinãSolmateãSolady çã®ã©ã¤ãã©ãªä½¿ç¨ç¶æ³ãææ¡ãã
- æ¢åã®ã³ã³ãã©ã¯ãæ§é ã Glob ã§ã¹ãã£ã³ãã:
src/**/*.solã¾ãã¯contracts/**/*.sol- ãã¹ããã¡ã¤ã«:
test/**/*.sol - ã¹ã¯ãªãã:
script/**/*.sol
æ¤è¨¼ã²ã¼ã: foundry.toml ã¾ã㯠hardhat.config.* ãåå¨ããSolidity ãã¼ã¸ã§ã³ã 0.8.0 以ä¸ã§ãããã¨ã
Step 2: ãªãã¡ã¬ã³ã¹èªã¿è¾¼ã¿
ã¿ã¹ã¯ã«å¿ãã¦ä»¥ä¸ã®ãªãã¡ã¬ã³ã¹ãèªã¿è¾¼ã¿ã該å½ã»ã¯ã·ã§ã³ã鏿ãã:
| ãã¡ã¤ã« | ç¨é | èªã¿è¾¼ãæ¡ä»¶ |
|---|---|---|
references/language-patterns.md |
è¨èªæ©è½ã»ã³ã¼ãã£ã³ã°è¦ç´ | æ°è¦ã³ã³ãã©ã¯ã使ãã³ã¼ãã¬ãã¥ã¼æãNatSpec è¨æ³ãå½åè¦åãerror / event å®ç¾©ãã¿ã¼ã³ã確èªãã |
references/security-checklist.md |
èå¼±æ§ãã¿ã¼ã³ã»é²å¾¡ç | ã»ãã¥ãªãã£ã¬ãã¥ã¼æãå¤é¨å¼ã³åºããå«ãã³ã¼ã使æã該å½ããèå¼±æ§ã«ãã´ãªã鏿ãã |
references/gas-optimization.md |
ã¬ã¹æé©åãã¯ãã㯠| ã¬ã¹ã³ã¹ãæ¹åè¦æ±æãã«ã¼ãã»ã¹ãã¬ã¼ã¸æä½ãå«ãã³ã¼ã使æãé©ç¨å¯è½ãªãã¯ããã¯ã鏿ãã |
references/foundry-workflow.md |
Foundry éçºããã¼ã»ãã¹ãæ¦ç¥ | ãã¹ã使ããããã¤ã¹ã¯ãªãã使ãFuzz/Invariant ãã¹ãè¨è¨æ |
夿ã䏿ãªå ´å: è¤æ°ã®ãªãã¡ã¬ã³ã¹ãé¢é£ããå ´åã¯å ¨ã¦èªã¿è¾¼ããç¹ã«ã»ãã¥ãªãã£ã¯å¸¸ã«ç¢ºèªããã
æ¤è¨¼ã²ã¼ã: å°ãªãã¨ã 1 ã¤ã®ãªãã¡ã¬ã³ã¹ãã¡ã¤ã«ãæ£å¸¸ã«èªã¿è¾¼ãããã¨ã
Step 3: ã³ã¼ãçæã»ã¬ãã¥ã¼
- æ°è¦ã³ã³ãã©ã¯ã使æ:
language-patterns.mdã«å¾ããNatSpecã»ã³ã¼ãã£ã³ã°è¦ç´ãé©ç¨ããsecurity-checklist.mdã®è©²å½ãã¿ã¼ã³ã確èªããé²å¾¡ã³ã¼ããçµã¿è¾¼ãgas-optimization.mdã®æé©åãã¤ã³ããèæ ®ãã- OpenZeppelin ã³ã³ãã©ã¯ãã®ç¶æ¿ã§å®è£ å¯è½ãªæ©è½ã¯ç¬èªå®è£ ãé¿ãã
- æ¢åã³ã¼ãä¿®æ£æ:
- 夿´ç®æã«é¢é£ããã»ãã¥ãªãã£ãã¿ã¼ã³ã
security-checklist.mdã§ç¢ºèªãã - ã¬ã¹ã³ã¹ãã¸ã®å½±é¿ã
gas-optimization.mdã§è©ä¾¡ãã - 夿´ãã¤ã³ã¿ã¼ãã§ã¼ã¹ã«å½±é¿ããå ´å㯠NatSpec ãæ´æ°ãã
- 夿´ç®æã«é¢é£ããã»ãã¥ãªãã£ãã¿ã¼ã³ã
- ãã¹ã使æ:
foundry-workflow.mdã«å¾ããforge test ã®æ§æã決å®ãã- æ£å¸¸ç³»ã»ç°å¸¸ç³»ã»å¢çå¤ã®ãã¹ãã±ã¼ã¹ãç¶²ç¾ ãã
- Fuzz ãã¹ãã®é©ç¨å¯å¦ã夿ããï¼æ°å¤å ¥åããã颿°ã¯åå Fuzz ãã¹ãï¼
- Invariant ãã¹ãã®é©ç¨å¯å¦ã夿ããï¼ç¶æ ãæã¤ã³ã³ãã©ã¯ãã¯æ¨å¥¨ï¼
æ¤è¨¼ã²ã¼ã: forge build ãã¨ã©ã¼ãªãå®äºãããã¨ãforge test ã§å
¨ãã¹ãããã¹ãããã¨ã
Step 4: ã»ãã¥ãªãã£æçµãã§ãã¯
ã³ã¼ãçæã»ä¿®æ£å¾ãsecurity-checklist.md ã®è©²å½é
ç®ã§æçµç¢ºèªãè¡ã:
- Reentrancy: Checks-Effects-Interactions ãã¿ã¼ã³ã®éµå®ãå¤é¨å¼ã³åºãã®åã«ç¶æ ãæ´æ°ãã¦ãããã
- Access Control: é©åãªä¿®é£¾åï¼
onlyOwner,onlyRoleï¼ã®ä½¿ç¨ãOpenZeppelin ã®Ownable/AccessControlãæ¨å¥¨ã - Integer:
uncheckedãããã¯ã®å®å ¨æ§ãæç¢ºã«ãªã¼ãã¼ããã¼ãçºçããªãå ´åã«ã®ã¿ä½¿ç¨ãã¦ãããã - External Call: å¤é¨å¼ã³åºãã®æ»ãå¤ãã§ãã¯ã
callã®è¿ãå¤ã確èªãã¦ãããã - Input Validation:
require/ ã«ã¹ã¿ã ã¨ã©ã¼ã§å ¥åå¤ãæ¤è¨¼ãã¦ãããã
æ¤è¨¼ã²ã¼ã: ã»ãã¥ãªãã£ãã§ãã¯ãªã¹ãã® CRITICAL é ç®ã«è©²å½ããåé¡ã 0 ä»¶ã§ãããã¨ã
使ç¨ä¾
ä¾ 1: ERC20 ãã¼ã¯ã³ã®ä½æ
ã¦ã¼ã¶ã¼å ¥å: ãFoundry ã§ ERC20 ãã¼ã¯ã³ãä½ãããã
ã¢ã¯ã·ã§ã³:
- Step 1:
foundry.tomlç¢ºèª â Foundry ããã¸ã§ã¯ããlib/openzeppelin-contractsã®åå¨ãç¢ºèª - Step 2:
language-patterns.mdï¼NatSpec è¦ç´ï¼+foundry-workflow.mdï¼ãã¹ãæ§æï¼ãèªã¿è¾¼ã¿ - Step 3: 以ä¸ãçæ:
src/MyToken.solâ OpenZeppelinERC20ãç¶æ¿ãNatSpec ä»ãããã³ã颿°ã«onlyOwnertest/MyToken.t.solâ ãããã¤ãtransferãmint 権éãã¼ãã¢ãã¬ã¹ãã§ãã¯ã®ãã¹ãscript/DeployMyToken.s.solâ ãããã¤ã¹ã¯ãªãã
- Step 4: ã»ãã¥ãªãã£ãã§ã㯠â ã¢ã¯ã»ã¹å¶å¾¡ç¢ºèªããã³ãä¸éã®æç¡ã確èª
çµæ: OpenZeppelin ãã¼ã¹ã®åå®å ¨ãª ERC20 ãã¼ã¯ã³ããã¹ãä»ãã§çæãããã
ä¾ 2: æ¢åã³ã³ãã©ã¯ãã®ã»ãã¥ãªãã£ã¬ãã¥ã¼
ã¦ã¼ã¶ã¼å ¥å: ããã®ã³ã³ãã©ã¯ãã®ã»ãã¥ãªãã£ããã§ãã¯ãã¦ã
ã¢ã¯ã·ã§ã³:
- Step 1: 対象ã³ã³ãã©ã¯ããèªã¿è¾¼ã¿ãè¨èªãã¼ã¸ã§ã³ã»å¤é¨ä¾åãææ¡
- Step 2:
security-checklist.mdãèªã¿è¾¼ã¿ãå ¨ã«ãã´ãªã®ãã§ãã¯é ç®ãç¢ºèª - Step 3: ã³ã³ãã©ã¯ãã®å颿°ãæ¤æ»:
- external / public 颿°ã®ã¢ã¯ã»ã¹å¶å¾¡ã確èª
- å¤é¨å¼ã³åºãã®æç¡ã¨ CEI ãã¿ã¼ã³ã®éµå®ã確èª
- ã¹ãã¬ã¼ã¸æä½ã®å®å ¨æ§ã確èª
delegatecall/selfdestructã®ä½¿ç¨æç¡ã確èª
- Step 4: çºè¦ããåé¡ãéè¦åº¦å¥ï¼CRITICAL / WARNING / INFOï¼ã«åé¡ãã¦å ±å
çµæ: èå¼±æ§ã®ä¸è¦§ã¨ä¿®æ£æ¨å¥¨äºé ãéè¦åº¦é ã«åºåãããã
ä¾ 3: ã¬ã¹æé©å
ã¦ã¼ã¶ã¼å ¥å: ããã®ã³ã³ãã©ã¯ãã®ã¬ã¹ãæé©åãã¦ã
ã¢ã¯ã·ã§ã³:
- Step 1: 対象ã³ã³ãã©ã¯ããèªã¿è¾¼ã¿ã
forge test --gas-reportã§ãã¼ã¹ã©ã¤ã³ãè¨æ¸¬ - Step 2:
gas-optimization.mdãèªã¿è¾¼ã¿ãé©ç¨å¯è½ãªãã¯ããã¯ã鏿 - Step 3: 以ä¸ã®æé©åãæ¤è¨ã»é©ç¨:
- storage â memory ã®èªã¿è¾¼ã¿åæ°åæ¸
immutable/constantã®é©ç¨uncheckedã®å®å ¨ãªé©ç¨ï¼ã«ã¼ãã«ã¦ã³ã¿çï¼- ã«ã¹ã¿ã ã¨ã©ã¼ã¸ã®ç½®ãæãï¼
require(cond, "msg")âif (!cond) revert CustomError()ï¼ - ã¹ãã¬ã¼ã¸ãããã³ã°ã®æé©å
- Step 4: æé©åå¾ã«
forge test --gas-reportã§æ¹åéã確èªããã¹ããå ¨ä»¶ãã¹ãããã¨ã確èª
çµæ: ã¬ã¹ã³ã¹ãã®æ¹åéããã¼ã¹ã©ã¤ã³ã¨ã®æ¯è¼ã§è¡¨ç¤ºãããã
ãã©ãã«ã·ã¥ã¼ãã£ã³ã°
1. Foundry ãæ¤åºãããªã
çç¶: forge ã³ãã³ããè¦ã¤ãããªã
åå ã¨å¯¾ç:
- Foundry æªã¤ã³ã¹ãã¼ã«:
curl -L https://foundry.paradigm.xyz | bash && foundryupã§ã¤ã³ã¹ãã¼ã«ãæ¡å ããã - PATH æªè¨å®:
~/.foundry/binã PATH ã«å«ã¾ãã¦ããã確èªããã - Hardhat ããã¸ã§ã¯ã:
hardhat.config.*ãåå¨ããå ´å㯠Hardhat ã¯ã¼ã¯ããã¼ã«åãæ¿ãããnpx hardhat compile/npx hardhat testã使ç¨ã
2. Solidity ãã¼ã¸ã§ã³ä¸ä¸è´
çç¶: forge build ã§ã³ã³ãã¤ã«ã¨ã©ã¼ï¼Source file requires different compiler versionï¼
åå ã¨å¯¾ç:
- pragma 㨠foundry.toml ã®ä¸ä¸è´:
foundry.tomlã®solc_versionãpragma solidityã®ãã¼ã¸ã§ã³ç¯å²ã«åãããã - ä¾åã©ã¤ãã©ãªã®ãã¼ã¸ã§ã³å¶ç´: OpenZeppelin ã®ææ°çã¯
^0.8.20ãè¦æ±ãããã¨ããããforge install openzeppelin/openzeppelin-contracts@v4.xã§æ§ãã¼ã¸ã§ã³ãæå®ããããããã¸ã§ã¯ãã® Solidity ãã¼ã¸ã§ã³ãä¸ããã - remappings ã®ä¸å:
remappings.txtã«æ£ãããããã³ã°ãè¨å®ããã¦ããã確èªãããforge remappings > remappings.txtã§åçæå¯è½ã
3. ã³ã³ãã¤ã«ã¨ã©ã¼ï¼Stack too deepï¼
çç¶: CompilerError: Stack too deep
åå ã¨å¯¾ç:
- ãã¼ã«ã«å¤æ°ãå¤ããã: 颿°å ã®ãã¼ã«ã«å¤æ°ã struct ã«ã¾ã¨ããã
- 颿°ã®å¼æ°/æ»ãå¤ãå¤ã: struct ã弿°/æ»ãå¤ã«ä½¿ç¨ããã
- via-ir ã®æå¹å:
foundry.tomlã«via_ir = trueã追å ãããã³ã³ãã¤ã«æéãé·ããªãããstack depth ã®å¶éãç·©åãããã
4. ãã¹ãã® forge test ã失æãã
çç¶: ãã¹ãã setUp ã§å¤±æãã¾ãã¯äºæããªã revert
åå ã¨å¯¾ç:
- fork ãã¹ãã® RPC åé¡:
--fork-urlã® RPC ã¨ã³ããã¤ã³ããã¬ã¼ãå¶éã«å¼ã£ããã£ã¦ãããç°å¢å¤æ°ã§ææ RPC ãè¨å®ããã - ãããã¯ã¿ã¤ã ã¹ã¿ã³ã:
vm.warpã§ã¿ã¤ã ã¹ã¿ã³ããè¨å®ãã¦ããªããæéä¾åã®ãã¸ãã¯ãããå ´åã¯æç¤ºçã«è¨å®ããã - msg.sender ã®ä¸ä¸è´:
vm.prank/vm.startPrankã§ãã¹ãç¨ã®ã¢ãã¬ã¹ãè¨å®ãã¦ããã確èªããã
5. ä¾åé¢ä¿ã®ã¤ã³ã¹ãã¼ã«å¤±æ
çç¶: forge install ãã¨ã©ã¼ãã¾ãã¯ã¤ã³ãã¼ãã解決ã§ããªã
åå ã¨å¯¾ç:
- git submodule ã®åé¡:
git submodule update --init --recursiveã§ååæåããã - remappings ã®æªè¨å®:
forge remappings > remappings.txtã§ remappings ãçæãããVS Code ã® Solidity æ¡å¼µããã®ãã¡ã¤ã«ãåç §ããã - ãã¼ã¸ã§ã³æå®:
forge install openzeppelin/openzeppelin-contracts@v5.0.0ã®ããã«ã¿ã°ãæå®ããã
注æäºé
- Solidity 0.8.0 以éã¯ç®è¡ãªã¼ãã¼ããã¼/ã¢ã³ãã¼ããã¼ãçµã¿è¾¼ã¿ã§ãã§ãã¯ããããããSafeMath ã¯ä¸è¦ã
uncheckedãããã¯ã¯æç¢ºã«ãªã¼ãã¼ããã¼ãçºçããªãå ´åã«ã®ã¿ä½¿ç¨ããã- DeFiãNFTãã¬ããã³ã¹çã®ãã¡ã¤ã³åºæãã¿ã¼ã³ã¯ã対å¿ããå°éã¹ãã«ï¼
solidity-defiãsolidity-nftãsolidity-governanceï¼ãåç §ããã - ã¯ãã¹ãã§ã¼ã³ãã¿ã¼ã³ã¯
solidity-crosschainãåç §ããã - ããã³ãã¨ã³ãçµ±åã¯
web3-frontendãåç §ããã - ã¢ã«ã¦ã³ãæ½è±¡åã¯
web3-account-abstractionãåç §ããã - OpenZeppelin ã³ã³ãã©ã¯ãã®å©ç¨ãæ¨å¥¨ããç¬èªå®è£ ã¯é¿ããã