問題一覧に戻る
上級高度なパターン
問題95: インラインアセンブリ基礎

SolidityのインラインアセンブリI学習 - Yul言語による低レベルEVMプログラミング。アセンブリはガス最適化と高レベルSolidityでは不可能な操作のためEVMオペコードへの直接アクセスを提供。Yulはメモリ、ストレージ、スタック操作の正確な制御を提供する中間言語。最適化に強力ですが、アセンブリは慎重なセキュリティ考慮が必要。アセンブリの理解はガス最適化、セキュリティ研究、高効率コントラクト構築に有用です。

pragma solidity ^0.8.0;

contract InlineAssemblyBasics {

function getCodeSize(address addr) public view returns (uint256 size) {
// インラインアセンブリブロック
assembly {
// コントラクトコードサイズを取得
size := ()
}
}

function efficientAdd(uint256 a, uint256 b) public pure returns (uint256 result) {
// 効率的な加算操作
assembly {
// 基本算術オペコード
result := (a, )
}
}

function checkZero(uint256 value) public pure returns (bool isZero) {
// アセンブリによるゼロチェック
assembly {
// 値がゼロかチェック
isZero := ()
}
}

function getBalance(address addr) public view returns (uint256 bal) {
// アドレス残高を取得
assembly {
// 残高操作
bal := ()
}
}

function memoryOperation() public pure returns (bytes32 data) {
// メモリ操作例
assembly {
// メモリに値を格納
(0x80, 0x123456789abcdef)
// メモリから値を読み込み
data := (0x80)
}
}

function hashData(uint256 a, uint256 b) public pure returns (bytes32 hash) {
// アセンブリによるハッシュ計算
assembly {
// メモリにデータを格納
mstore(0x00, a)
mstore(0x20, )

// Keccak256ハッシュ操作
hash := (, 0x40)
}
}
}