Solidityでは文字列の比較は一手間必要
SolidityではStringを比較するときに
function test() public view returns (bool){
return "" == "";
}
このような書き方をすると、コンパイルエラーが出ます。
TypeError: Operator == not compatible with types literal_string "" and literal_string ""
解決方法
こちらのstackoverflowでは、記事作成時点で下記のようなる回答として下記のような実装がありました。
// 記事作成時点で50いいね
function test() public pure returns (bool) {
return keccak256(abi.encodePacked("string")) == keccak256(abi.encodePacked("string"));
}
// 記事作成時点で7いいね
function test() public pure returns (bool) {
return keccak256(bytes("string")) == keccak256(bytes("string"));
}
追加調査
この回答を見てて、abi.encodePackedとbytesのどっちがコードの効率がいいのか気になったので調べてみました。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract CompateAbiEncodePackedAndBytes {
function execute1() public {
require(test1());
}
function execute2() public {
require(test2());
}
function test1() public pure returns (bool) {
return keccak256(abi.encodePacked("string")) == keccak256(abi.encodePacked("string"));
}
function test2() public pure returns (bool) {
return keccak256(bytes("string")) == keccak256(bytes("string"));
}
}
こちらの共有用リンクからすぐテストができます。
abi.encodePackedを使ったコード
to CompateAbiEncodePackedAndBytes.execute1() 0xd9145CCE52D386f254917e481eB44e9943F39138
transaction cost 21923 gas
bytesを使ったコード
to CompateAbiEncodePackedAndBytes.execute2() 0xd9145CCE52D386f254917e481eB44e9943F39138
transaction cost 21499 gas
ほんの少しですがBytesを使った方がGas効率が良さそうです。NFTを実装する際に、小さなガスコストの節約を積み重ねることで、よりユーザーにとって便利なものが提供できるようになるので、ぜひ試してみてください!