solidity-crosschain
npx skills add https://github.com/stanah/dotagents --skill solidity-crosschain
Agent 安装分布
Skill 文档
solidity-crosschain: ã¯ãã¹ãã§ã¼ã³éçºã¹ãã«
ã¯ãã¹ãã§ã¼ã³éä¿¡ã»ããªãã¸è¨è¨ã»ãã«ããã§ã¼ã³ãããã¤ã®ãã¿ã¼ã³ãæä¾ãããã¡ã¤ã³ç¹åã¹ãã«ã
対象
- ããªãã¸è¨è¨ï¼Lock & MintãBurn & MintãLiquidity Poolï¼
- ã¯ãã¹ãã§ã¼ã³ã¡ãã»ã¼ã¸ã³ã°ï¼LayerZero V2ãChainlink CCIPãWormholeï¼
- ãã«ããã§ã¼ã³ãããã¤æ¦ç¥ï¼CREATE2 deterministic deployï¼
ã¯ã¼ã¯ããã¼
Step 1: ã¯ãã¹ãã§ã¼ã³è¦ä»¶ã®æ´ç
ã¦ã¼ã¶ã¼ã®è¦ä»¶ããã¯ãã¹ãã§ã¼ã³ã®å¯¾è±¡ãã¿ã¼ã³ãå¤å®ãã:
| ã¦ã¼ã¹ã±ã¼ã¹ | ãªãã¡ã¬ã³ã¹ | èªã¿è¾¼ã¿æã®æ³¨ç®ãã¤ã³ã |
|---|---|---|
| ãã¼ã¯ã³ããªã㸠| references/bridge-patterns.md |
Lock & Mint vs Burn & Mint vs Liquidity Pool ã®é¸æåºæºãRate Limiting ãã¿ã¼ã³ |
| ã¯ãã¹ãã§ã¼ã³ã¡ãã»ã¼ã¸éä¿¡ | references/messaging-patterns.md |
ãããã³ã«å¥ã®éåä¿¡ãã¿ã¼ã³ï¼lzSend/lzReceiveãccipSend/ccipReceiveï¼ |
| ãã«ããã§ã¼ã³ããã㤠| references/bridge-patterns.md |
CREATE2 deterministic deployããã§ã¼ã³éã®ã¢ãã¬ã¹ä¸è´ |
| Omnichain Token (OFT) | references/messaging-patterns.md |
LayerZero OFT ãã¿ã¼ã³ãpeer è¨å®ãRate Limiting |
æ¤è¨¼ã²ã¼ã: 対象ã®ã¯ãã¹ãã§ã¼ã³ã¦ã¼ã¹ã±ã¼ã¹ãç¹å®ã§ãããã¨ã䏿ãªå ´å㯠AskUserQuestion ã§ãä½ãï¼ãã¼ã¯ã³/ã¡ãã»ã¼ã¸/NFTï¼ããã©ã®ãã§ã¼ã³éã§ãéä¿¡ããã確èªããã
Step 2: ãããã³ã«é¸æ
è¦ä»¶ã«åºã¥ããããã³ã«ã鏿ãã:
| å¤æåºæº | LayerZero V2 | Chainlink CCIP | Wormhole |
|---|---|---|---|
| ã»ãã¥ãªãã£ã¢ãã« | Ultra Light Node + DVNï¼ã«ã¹ã¿ã å¯è½ï¼ | DONï¼åæ£ãªã©ã¯ã«ãããã¯ã¼ã¯ï¼ | Guardian Networkï¼19 ãã¼ãï¼ |
| 対å¿ãã§ã¼ã³æ° | 70+ | 15+ï¼æ¡å¤§ä¸ï¼ | 30+ |
| ãã¼ã¯ã³ããªã㸠| OFT / ONFT | CCIP Token Transfer | Portal Bridge |
| ã¬ã¹ã³ã¹ã | ä¸ | é«ï¼LINK æ¯æãï¼ | ä½ |
| ã«ã¹ã¿ãã¤ãºæ§ | é«ï¼DVN 鏿å¯è½ï¼ | ä¸ | ä¸ |
| æç度 | é«ï¼V2 㯠2024ãï¼ | é« | ä¸ |
鏿ã¬ã¤ãã©ã¤ã³:
- ã»ãã¥ãªãã£æåªå : Chainlink CCIPï¼DON ã®å®ç¸¾ãä¿éºããï¼
- åºç¯ãªãã§ã¼ã³å¯¾å¿: LayerZeroï¼70+ chainsï¼
- ã¬ã¹ã³ã¹ãéè¦: Wormholeï¼ä½ã¬ã¹ï¼
- ãã¼ã¯ã³ããªãã¸: LayerZero OFTï¼ã·ã³ãã«ãª APIï¼ã¾ã㯠CCIPï¼é«ã»ãã¥ãªãã£ï¼
夿ã䏿ãªå ´å: AskUserQuestion ã§ãã»ãã¥ãªã㣠vs ã³ã¹ããã対象ãã§ã¼ã³ãã確èªããã
æ¤è¨¼ã²ã¼ã: ãããã³ã«ã決å®ãã対å¿ãã SDK / ã©ã¤ãã©ãªãå©ç¨å¯è½ã§ãããã¨ã
Step 3: ã³ã¼ãçæ
solidity-coreã®language-patterns.mdã«å¾ã NatSpecã»ã³ã¼ãã£ã³ã°è¦ç´ãé©ç¨ããã- ã¯ãã¹ãã§ã¼ã³åºæã®ã»ãã¥ãªãã£å¯¾çãçµã¿è¾¼ã:
- éä¿¡å
æ¤è¨¼:
_origin.srcEid/_origin.senderã®ãã¯ã¤ããªã¹ãæ¤è¨¼ - ãªãã¬ã¤æ»æé²æ¢: ã¡ãã»ã¼ã¸ ID / nonce ã®éè¤ãã§ãã¯
- Rate Limiting: æ¥æ¬¡/æéãããã®æµåºéå¶é
- ã¬ã¹ãªããã: åä¿¡å´ã®
lzReceive/ccipReceiveã«ååãªã¬ã¹ãè¨å®
- éä¿¡å
æ¤è¨¼:
- ãã¹ãã³ã¼ããåæã«çæãã:
- ã¢ãã¯ã¨ã³ããã¤ã³ã / ã«ã¼ã¿ã¼ã§ã®ãã¼ã«ã«ãã¹ã
- ã¡ãã»ã¼ã¸éä¿¡ â åä¿¡ã®ããã¼ãã¹ã
- 䏿£ãªéä¿¡å ããã®ã¡ãã»ã¼ã¸æå¦ãã¹ã
- Rate Limiting ã®ãã¹ã
æ¤è¨¼ã²ã¼ã: forge build ãã¨ã©ã¼ãªãå®äºãããã¨ã
Step 4: ã»ãã¥ãªãã£æçµç¢ºèª
ã¯ãã¹ãã§ã¼ã³ç¹æã®ã»ãã¥ãªãã£ãªã¹ã¯ã確èªãã:
- ã¡ãã»ã¼ã¸æ¤è¨¼: éä¿¡å ãã§ã¼ã³ IDã»ã¢ãã¬ã¹ãæ¤è¨¼ãã¦ãããããã¼ãã³ã¼ãããã peer è¨å®ãæ£ãããã
- ãªãã¬ã¤æ»æ:
processedMessages[messageId]çã§ã¡ãã»ã¼ã¸ã®éè¤å®è¡ã鲿¢ãã¦ãããã - Rate Limiting: 大éã®è³éæµåºãé²ãæ¥æ¬¡å¶éãè¨å®ããã¦ããããé¾å¤ã¯ TVL ã® 10-20% ãæ¨å¥¨ã
- 失æã¡ãã»ã¼ã¸ã®å復:
lzReceive/ccipReceiveã revert ããå ´åã®ãªã«ããªæ©æ§ãããããLayerZero ã®RetryableMessageãã¿ã¼ã³ã使ç¨ãã¦ãããã - ã¬ã¹ã®ååæ§: åä¿¡å´ã®å®è¡ã«ååãªã¬ã¹ãè¨å®ããã¦ãããã
extraOptions/gasLimitã®å¤ãé©åãã
æ¤è¨¼ã²ã¼ã: CRITICAL ã¬ãã«ã®ã»ãã¥ãªãã£åé¡ã 0 ä»¶ã§ãããã¨ã
使ç¨ä¾
ä¾ 1: LayerZero OFT ã§ã¯ãã¹ãã§ã¼ã³ãã¼ã¯ã³éä¿¡
ã¦ã¼ã¶ã¼å ¥å: ãEthereum 㨠Arbitrum éã§ãã¼ã¯ã³ãéä¿¡ããããLayerZero ã使ã£ã¦ã
ã¢ã¯ã·ã§ã³:
- Step 1: ãã¼ã¯ã³ããªã㸠â
bridge-patterns.md+messaging-patterns.mdãèªã¿è¾¼ã¿ â OFT ãã¿ã¼ã³ã鏿 - Step 2: LayerZero V2 ã鏿ï¼ãã¼ã¯ã³ããªã㸠+ åºç¯ãªãã§ã¼ã³å¯¾å¿ï¼
- Step 3: 以ä¸ãçæ:
src/MyOFT.solâ@layerzerolabs/oft-evm/contracts/OFT.solãç¶æ¿ãRate Limiting ä»ãtest/MyOFT.t.solâ ã¢ãã¯ã¨ã³ããã¤ã³ãã§ã® send / receive ãã¹ããRate Limiting ãã¹ãscript/DeployOFT.s.solâ Ethereum + Arbitrum ãããã¤ã¹ã¯ãªããscript/SetPeers.s.solâ åæ¹åã® peer è¨å®ã¹ã¯ãªãã
- Step 4: peer è¨å®ã®æ£å½æ§ãRate Limiting é¾å¤ãã¬ã¹è¨å®ã確èª
ãããã¤æé :
- Ethereum ã«
MyOFTãããã㤠- Arbitrum ã«
MyOFTãããã㤠- åæ¹ã§
setPeer(remoteEid, remoteAddress)ãå®è¡ - Rate Limiting ãè¨å®ï¼
setRateLimitsï¼ - ãã¹ãéä¿¡ã§åä½ç¢ºèª
çµæ: Ethereum â Arbitrum éã§ OFT ãã¼ã¯ã³ãéåä¿¡å¯è½ã«ãªããRate Limiting ã§å¤§éæµåºã鲿¢ã
ä¾ 2: Chainlink CCIP ã§ãã¼ã¯ã³ + ã¡ãã»ã¼ã¸éä¿¡
ã¦ã¼ã¶ã¼å ¥å: ãCCIP ã§ USDC ãããªãã¸ãã¤ã¤ãã«ã¹ã¿ã ãã¼ã¿ãä¸ç·ã«éãããã
ã¢ã¯ã·ã§ã³:
- Step 1: ãã¼ã¯ã³ + ã¡ãã»ã¼ã¸ â
messaging-patterns.mdã® CCIP ã»ã¯ã·ã§ã³ãèªã¿è¾¼ã¿ - Step 2: Chainlink CCIP ã鏿ï¼é«ã»ãã¥ãªã㣠+ ãã¼ã¯ã³è»¢éãµãã¼ãï¼
- Step 3: 以ä¸ãçæ:
src/CCIPSender.solâClient.EVM2AnyMessageæ§ç¯ãLINK / Native ææ°ææ¯æããccipSendå®è¡src/CCIPReceiver.solâCCIPReceiverç¶æ¿ã_ccipReceiveã§ãã¼ã¯ã³ + ã¡ãã»ã¼ã¸å¦çtest/CCIP.t.solâ ã¢ãã¯ã«ã¼ã¿ã¼ã§ã®éä¿¡ãã¹ãã䏿£ã¡ãã»ã¼ã¸æå¦ãã¹ã
- Step 4: ã«ã¼ã¿ã¼ã¢ãã¬ã¹ã®æ£å½æ§ï¼å ¬å¼ãããã¤ï¼ãLINK æ®é«ãéä¿¡å ãã¯ã¤ããªã¹ãã確èª
çµæ: USDC ã¨ã«ã¹ã¿ã ãã¼ã¿ãåæã«ã¯ãã¹ãã§ã¼ã³éä¿¡ããã³ã³ãã©ã¯ããçæãããã
ä¾ 3: ãã«ããã§ã¼ã³ãããã¤ï¼CREATE2ï¼
ã¦ã¼ã¶ã¼å ¥å: ãå ¨ãã§ã¼ã³ã§åãã¢ãã¬ã¹ã«ã³ã³ãã©ã¯ãããããã¤ãããã
ã¢ã¯ã·ã§ã³:
- Step 1: ãã«ããã§ã¼ã³ããã㤠â
bridge-patterns.mdã® CREATE2 ã»ã¯ã·ã§ã³ãèªã¿è¾¼ã¿ - Step 2: ãããã³ã«ä¾åãªãï¼ãããã¤æ¦ç¥ã®ã¿ï¼
- Step 3: 以ä¸ãçæ:
src/Deployer.solâ CREATE2 Factoryãsalt+bytecodeãã deterministic ã¢ãã¬ã¹ãè¨ç®script/MultiChainDeploy.s.solâ è¤æ°ãã§ã¼ã³ã«é 次ãããã¤ãcomputeAddressã§ã¢ãã¬ã¹äºåè¨ç®test/Deployer.t.solâ ã¢ãã¬ã¹äºåè¨ç®ã¨å®éã®ãããã¤ã¢ãã¬ã¹ã®ä¸è´ãã¹ã
- Step 4: deployer ã¢ãã¬ã¹ã® nonce 管çãbytecode ã®å®å ¨ä¸è´ï¼constructor args å«ãï¼ã確èª
çµæ: å ¨ãã§ã¼ã³ã§åä¸ã¢ãã¬ã¹ã«ã³ã³ãã©ã¯ãããããã¤ãããã
ãã©ãã«ã·ã¥ã¼ãã£ã³ã°
1. ã¯ãã¹ãã§ã¼ã³ã¡ãã»ã¼ã¸ãå±ããªã
çç¶: éä¿¡ãã©ã³ã¶ã¯ã·ã§ã³ã¯æåããããåä¿¡ãã§ã¼ã³ã§å®è¡ãããªã
åå ã¨å¯¾ç:
- ã¬ã¹ä¸è¶³: åä¿¡å´ã®
lzReceive/ccipReceiveã«è¨å®ããã¬ã¹ãªããããä¸è¶³ãã¦ãããLayerZero ã®å ´å:OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0)ã§ã¬ã¹ãªããããå¢å ããã - peer æªè¨å®: éä¿¡å
/åä¿¡å
ã®
setPeerãåæ¹åã§è¨å®ããã¦ããã確èªãããLayerZero Scan / CCIP Explorer ã§ã¡ãã»ã¼ã¸ã¹ãã¼ã¿ã¹ã確èªããã - DVN è¨å®ã®åé¡ï¼LayerZeroï¼: éå信両æ¹ã§åã DVN ãè¨å®ããã¦ããã確èªãããããã©ã«ã㯠LayerZero ã® DVNã
- ã«ã¼ã¿ã¼ã¢ãã¬ã¹ã®ä¸æ£ï¼CCIPï¼: åãã§ã¼ã³ã®å ¬å¼ CCIP Router ã¢ãã¬ã¹ã使ç¨ãã¦ããã確èªããã
2. setPeer ã失æãã
çç¶: onlyOwner ã§ãªãã¼ããã¾ã㯠peer ãæ£ããè¨å®ãããªã
åå ã¨å¯¾ç:
- owner ã®ä¸ä¸è´: ãããã¤å¾ã® owner ãæ£ããã¢ãã¬ã¹ã確èªããããã«ãã·ã°ã®å ´åã¯ææ¡çµç±ã§å®è¡ããã
- ã¢ãã¬ã¹ã®ãã¤ã夿:
setPeerã¯bytes32åãåãåããaddressToBytes32(remoteContractAddress)ã§æ£ãã夿ãã¦ããã確èªãããabi.encode(address)ã§ã¯ãªãå·¦ããã£ã³ã°ã使ç¨ããã - Endpoint ID ã®ä¸ä¸è´: åãã§ã¼ã³ã® LayerZero Endpoint IDï¼eidï¼ãæ£ããã確èªãããMainnet 㨠Testnet ã§ç°ãªãã
3. Rate Limiting ã«å¼ã£ããã
çç¶: RateLimitExceeded ã§ãã©ã³ã¶ã¯ã·ã§ã³ããªãã¼ããã
åå ã¨å¯¾ç:
- å¶éå¤ã®ç¢ºèª: ç¾å¨ã®æ¥æ¬¡å¶éã¨ç´¯è¨éä¿¡éã確èªããã
getRateLimitState()ã§æ®ãæ ãåå¾ããã - å¶éå¤ã®èª¿æ´: ããã¸ã§ã¯ãã® TVL ã¨æ³å®ãã©ãã£ãã¯ã«åºã¥ãå¶éå¤ã調æ´ãããåæã¯ TVL ã® 10% / æ¥ãæ¨å¥¨ã
- ãªã»ããã¿ã¤ãã³ã°: Rate Limiting ã®ãªã»ããããã¼ãªã³ã°ã¦ã£ã³ãã¦ï¼sliding windowï¼ãåºå®æéï¼daily resetï¼ã確èªããã
4. CREATE2 ãããã¤ã§ç°ãªãã¢ãã¬ã¹ã«ãªã
çç¶: ãã§ã¼ã³éã§ãããã¤ã¢ãã¬ã¹ãä¸è´ããªã
åå ã¨å¯¾ç:
- constructor 弿°ã®ä¸ä¸è´: constructor ã®å¼æ°ããã§ã¼ã³éã§ç°ãªã£ã¦ããï¼ä¾: ãã§ã¼ã³åºæã®ã¢ãã¬ã¹ï¼ã弿°ã bytecode ã«å«ã¾ãããããå
¨ãã§ã¼ã³ã§åä¸ã«ããå¿
è¦ãããããã§ã¼ã³åºæã®è¨å®ã¯
initialize颿°ã§è¨å®ããã - Factory ã¢ãã¬ã¹ã®ä¸ä¸è´: CREATE2 ã¢ãã¬ã¹ã¯ deployer ã¢ãã¬ã¹ã«ãä¾åãããå ¨ãã§ã¼ã³ã§åã Factory ãåãã¢ãã¬ã¹ã«ãããã¤ããã
- salt ã®ä¸ä¸è´: å ¨ãã§ã¼ã³ã§åã salt ã使ç¨ãã¦ããã確èªããã
5. CCIP ã®ææ°æè¨ç®ã失æãã
çç¶: getFee ãäºæããªãå¤ãè¿ããã¾ã㯠ccipSend ãææ°æä¸è¶³ã§ãªãã¼ã
åå ã¨å¯¾ç:
- LINK æ®é«ä¸è¶³: ã³ã³ãã©ã¯ãã«åå㪠LINK ãã¼ã¯ã³ãããã¸ããããã¦ããã確èªããã
getFeeã§äºåã«ææ°æãè¦ç©ããã - Native æ¯æãã®å ´å:
msg.valueãgetFeeã®è¿ãå¤ä»¥ä¸ã§ããã確èªãããä½å°åã¯è¿éãããã - ã¡ãã»ã¼ã¸ãµã¤ãº: ãã¼ã¿ãµã¤ãºã大ããã¨ææ°æãå¢å ãããä¸è¦ãªãã¼ã¿ã忏ããã
注æäºé
- ã¯ãã¹ãã§ã¼ã³ãããã³ã«ã¯ã¾ã æçéä¸ã§ãããAPI ã®å¤æ´ãé »ç¹ãæ¬çªãããã¤åã«åãããã³ã«ã®ææ°ããã¥ã¡ã³ããå¿ ã確èªããã
- ã¯ãã¹ãã§ã¼ã³ã¡ãã»ã¼ã¸ã¯éåæã§ããã失ææã®ãªã«ããªè¨è¨ãä¸å¯æ¬ ã
lzReceive/ccipReceiveã revert ããå ´åã®åè©¦è¡æ©æ§ãå®è£ ããã - Rate Limiting ã¯å¿ é ãããªãã¸ã®èå¼±æ§ãçºè¦ãããå ´åã®è¢«å®³ãæå°éã«æããã
- ãã¹ããããã§ã®ååãªæ¤è¨¼ãè¡ã£ã¦ããæ¬çªãããã¤ãããLayerZero Scan / CCIP Explorer ã§ã¡ãã»ã¼ã¸ã®ç¶æ ã確èªããã
- åºç¤çãªãã¿ã¼ã³ï¼ã¢ã¯ã»ã¹å¶å¾¡ãã¬ã¹æé©åçï¼ã¯
solidity-coreãåç §ããã - ããã³ãã¨ã³ãçµ±åï¼ã¯ãã¹ãã§ã¼ã³éä¿¡ UIï¼ã¯
web3-frontendãåç §ããã