問題一覧に戻る
中級実践的な機能
問題69: 低レベル呼び出し

Solidityの低レベル関数呼び出しを学習します - 強力だが危険なコントラクト相互作用ツールです。callはターゲットのコンテキストで実行し、オプションでETHを送信。delegatecallは呼び出し元のコンテキストで実行し、ストレージ操作を許可 - 信頼できないターゲットの場合は高リスク。staticcallは読み取り専用実行を保証。これらは安全チェックがなく、明示的なエラー処理が必要です。delegatecallはプロキシなどの慎重に設計されたパターンでのみ使用すべきです。常に戻り値を検証。高度なパターンに不可欠ですが、重大なセキュリティリスクがあります。

pragma solidity ^0.8.0;

contract LowLevelCalls {
event Result(bool success, bytes data);

// 警告:低レベル呼び出しは高いセキュリティリスクがあります!
function callWithETH(address target) public payable {
// ETH転送付きcall(戻り値チェック必須!)
(bool success, bytes memory data) = target.("");
require(success, "Call failed");
}

// Delegatecall(ストレージ破壊リスク!)
function delegateCall(address logic) public {
(bool success, ) = logic.(
abi.encodeWithSignature("update()")
);
require(success, "Delegatecall failed");
}

// 読み取り専用操作のStaticcall
function readOnly(address target) public view returns (bytes memory) {
(bool success, bytes memory data) = target.(
abi.encodeWithSignature("getData()")
);
require(success, "Staticcall failed");
return data;
}
}