Delegatecallとは、Ethereum Virtual Machine(EVM)における低レベル関数であり、呼び出し元のコントラクトのコンテキスト(storage、msg.sender 等)を保持したまま、別のコントラクトのコードを実行する仕組みである。
概要

Delegatecall は Solidity 0.4 系以降に導入された EVM 命令で、プロキシパターンやアップグレード可能なコントラクトを実現するために設計された。従来の CALL と異なり、呼び出し先のコードは別アドレスで読み込まれるが、ストレージは呼び出し元に残る。この特性により、ロジックとデータを分離した構造を作成できる。
役割と機能

- アップグレード可能なプロキシ: ERC1967 や Transparent Proxy の実装で利用。
- ライブラリ呼び出し: コントラクト間のコード共有に使用。
- メッセージ転送: msg.sender と msg.value をそのまま継承し、外部呼び出しをシミュレート。
特徴

- コンテキスト保持: 呼び出し元の storage, caller, value が変更されない。
- コード読み込みのみ: callee のコードは実行時に読み込まれ、状態遷移は呼び出し元で行われる。
- ガス効率: CALL と比較してオーバーヘッドが小さく、複雑なロジックを外部に委譲できる。
現在の位置づけ

DeFi プロトコルや NFT マーケットプレイスで広く採用されており、アップグレード性とモジュール化が求められる場面で不可欠。
しかし、delegatecall の不適切な使用は状態破壊やリスクを招くため、OpenZeppelin の TransparentProxy や UUPS など安全設計のベストプラクティスが推奨されている。
近年は MEV 攻撃に利用されるケースも報告され、セキュリティ監査の重要性が高まっている。
続きを読むには確認が必要です

