問題一覧に戻る
上級ガス最適化
問題86: イベント vs ストレージ
Solidityでイベントとストレージをいつ使うか学習 - コストと機能のバランス。ストレージ操作は約2万ガスですがオンチェーンクエリが可能。イベントは約2千ガスですがオフチェーンログのみ。コントラクトが読み取り必要な重要な状態にはストレージを使用。監査記録、通知、履歴データにはイベントを使用。このトレードオフの理解はコスト効率の良いコントラクト構築に重要です。
pragma solidity ^0.8.0;
contract EventVsStorage {
// ストレージ:高価だがクエリ可能
mapping(address => uint256) public lastAction; // 20,000 gas
mapping(bytes32 => bool) public executedTxs; // 20,000 gas
// イベント:安価だがログのみ
event ActionPerformed(address indexed user, uint256 timestamp); // ~2,000 gas
event TransactionExecuted(bytes32 indexed txHash, bool success); // ~2,000 gas
// 高価:ストレージとイベント両方
function expensiveLog(address user) public {
lastAction[user] = ;
ActionPerformed(user, block.timestamp);
}
// 効率的:イベントのみ
function efficientLog(address user) public {
// ログ記録用イベント
ActionPerformed(user, );
}
// 混合アプローチ
function mixedApproach(bytes32 txHash) public {
// 重要な状態はストレージに
executedTxs[] = true;
// 監査記録はイベントに
TransactionExecuted(txHash, true);
}
// ストレージからクエリ
function getLastAction(address user) public view returns (uint256) {
return [user];
}
// ストレージ状態をチェック
function isExecuted(bytes32 txHash) public view returns (bool) {
return [txHash];
}
}