【Solidity】文字列を比較するには?

Solidityで文字列を比較する方法について解説します。

構文

Solidityで文字列を比較するには、以下の様にします。

keccak256(abi.encodePacked(文字列1)) == keccak256(abi.encodePacked(文字列2))

また、ABIエンコーディング(abi.encodePacked())ではなく、文字列バイト列変換(bytes())を使った方法でも可能です。

keccak256(bytes(文字列1)) == keccak256(bytes(文字列2))

どちらの方法でも構いませんが、後者の方が、若干だけコスト(ガス代)が安いと思われます。

サンプルコード

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Test {

    /* ABIエンコーディング(abi.encodePacked())を使用した方法 */
    function compareStringsByAbiEncoding(string memory s1, string memory s2) public pure returns(bool){
        // 文字列を比較
        return keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2));
    }

    /* 文字列バイト列変換(bytes())を使用した方法 */
    function compareStringsByBytes(string memory s1, string memory s2) public pure returns(bool){
        // 文字列を比較
        return keccak256(bytes(s1)) == keccak256(bytes(s2));
    }
    
}

SolidityではEVM(Ethereum Virtual Machine)の都合上、文字列をそのまま扱えないため、abi.encodePacked()やbytes()で文字列をバイト列にしたり、keccak256関数により文字列をハッシュ化したりする必要があります。他のプログラミング言語とは勝手が違い戸惑いますが、徐々に慣れていきましょう。

タイトルとURLをコピーしました