Delegatecall

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

目次

概要

概要(Delegatecall)の図解

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

役割と機能

役割と機能(Delegatecall)の図解

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

特徴

特徴(Delegatecall)の図解

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

現在の位置づけ

現在の位置づけ(Delegatecall)の図解

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

×

続きを読むには確認が必要です

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次