Chapter 12

[Yul Tutorial] Literals

かるでね
かるでね
2024.03.04に更新

リテラルについて、実際のコードを用いて説明していきます。

以下のRemixなどを使用して試してみてください。

https://remix.ethereum.org/

整数リテラルと16進数リテラル

整数リテラルと16進数リテラルは、Yul内で数値を表現するために使用されます。
以下のコード例では、これらのリテラルを使用して簡単な加算を実行し、結果を返します。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract YulLiterals {
    function integerAndHexLiterals() external pure returns (uint256) {
        uint256 result;
        assembly {
            // 整数リテラルと16進数リテラルの使用
            let a := 10  // 整数リテラル
            let b := 0xA // 16進数リテラル(10進数での10と同じ)
            result := add(a, b) // a + b = 20
        }
        return result;
    }
}

ASCII文字列リテラル

Yulでは、ASCII文字列リテラルを使用して、バイト列や文字列を操作できます。
以下の例では、ASCII文字列リテラルを使用してEVMのスタックに文字列を格納し、その結果を返します。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract YulLiterals {
    function asciiStringLiterals() external pure returns (bytes32) {
        bytes32 result;
        assembly {
            // ASCII文字列リテラルの使用
            result := "hello"
        }
        return result;
    }
}

16進数文字列リテラル

16進数文字列リテラルを使用すると、バイト列を直接記述できます。
以下の例では、16進数文字列リテラルを使用して特定のバイト列を操作してその結果を返します。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract YulLiterals {
    function hexStringLiterals() external pure returns (bytes32) {
        bytes32 result;
        assembly {
            // 16進数文字列リテラルの使用
            result := hex"68656c6c6f" // "hello"の16進数表現
        }
        return result;
    }
}

リテラルを組み合わせた演算

リテラルは、Yul内で複雑な演算を行う基本的な要素としても使用できます。
以下の例では、リテラルを組み合わせてビット演算を行ってその結果を返します。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract YulLiterals {
    function combineLiteralsForOperations() external pure returns (uint256) {
        uint256 result;
        assembly {
            // 整数リテラルとASCII文字列リテラルの組み合わせ
            let sum := add(3, 2) // 5になる
            result := and("abc", sum) // "abc"のASCII値と5のビットAND演算
        }
        return result;
    }
}