こんにちは、たいきです(@taiki_16_k)
Web3エンジニアになるべくSolidityを必死に勉強しています。
今回は、Solidity学習過程で学んだGas代の節約法をこの記事にメモしていこうと思います。
学んだことを随時この記事に更新していこうと思うのでよろしくお願いします。
constantを使う
変数をconstant
にするとガス代の節約につながります。
constant
は変更することのできない変数のことです。
その値はハードコーディングされており、constant
を使用することでガス代の節約になります。
なぜガス代が安くなるのかというと、読み取り専用の変数になり新しくデータを書き込むことができなくなるからです。
ブロックチェーン上のデータの書き込みはノードを運営するコンピュータ全部に書き込む必要が出てくるので当然ガス代は高くなります。
Javascriptのconstantも変えることのできない変数として同じような定義の仕方がありますね。
コード例
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Constants {
//コーディングの慣習としてconstantの場合は大文字にする
uint public constant MY_UINT = 123;
address public constant MY_ADDRESS = "YOUR_ADDRESS";
}
immutableを使う
上記と同様に変数をconstant
にするとガス代の節約につながります。
Immutable
はconstant
と同じく変えることの出来ない変数です。
もっとも、その値はコンストラクタの内部で設定することができますが、その後で変更することはできません。
コード例
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Immutable {
//コーディングの慣習としてconstantの場合は大文字にする
uint public immutable MY_UINT;
address public immutable MY_ADDRESS;
constructor() {
MY_UINT = 123;
MY_ADDRESS = msg.sender;
}
}
requireをCustom Errorに置き換える
requireステートメントをCustom Errorの形で書くとガス代が削減できます。
requireの条件を満たさなかった場合のエラー文(string)の分が削減できます。
これはコードを見た方がわかりやすいと思います。
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
//CustomErrorはコントラクト外に書く
error NotOwner();
contract CustomError {
address payable owner = payable(msg.sender);
function withdraw() public {
//通常ならこのrequireだが、、、
// require(msg.sender == owner, "Not owner");
// CustomErrorを使用した場合
if(msg.sender != owner) revert NotOwner();
owner.transfer(address(this).balance);
}
}
随時更新していきます
こちらの記事は学習過程において随時更新していく予定です。
よろしくお願いします。
TwitterではSolidityプログラミングや仮想通貨、起業関連の発信をしているのでよかったらフォローお願いします