問題一覧に戻る
上級ガス最適化
問題87: 関数の可視性最適化
Solidityの関数可視性最適化を学習 - ガス効率のための適切なアクセス修飾子選択。external関数は外部呼び出し時にpublicより安価で、内部コピーを作成しません。calldataパラメータはexternal関数でmemoryよりガス効率的。internal関数は外部呼び出しオーバーヘッドなしにコード再利用を可能にします。可視性修飾子の理解は、適切なカプセル化とガス最適化されたコントラクト構築に重要です。
pragma solidity ^0.8.0;
contract VisibilityOptimization {
uint256 private count;
mapping(address => bool) private authorized;
// External:外部呼び出しで安価
function externalView() view returns (uint256) {
return count;
}
// Public:より高価、内部コピー作成
function publicView() public view returns (uint256) {
return count;
}
// Internal:継承と再利用用
function _internalHelper() view returns (bool) {
return authorized[msg.sender];
}
// calldataでバッチ操作
function batchOperation(address[] users) external {
// 効率的なループ処理
for (uint256 i = 0; i < users.length; i++) {
authorized[users[i]] = true;
}
}
// Memory:コピーされたデータ
function processData(uint256[] data) public {
uint256 sum = 0;
// データコピーオーバーヘッド
for (uint256 i = 0; i < data.length; i++) {
sum += data[i];
}
count = sum;
}
// Private:最も制限的
function _validate(address user) private pure returns (bool) {
return user != address(0);
}
}