SSTORE
に関係するガスの節約 ここがわかりそうでわからなかった!view関数を外部から呼び出す場合、ガスは一切かからない。
uintなどのmaxを想定して記述する!
Each slot has a length of 32 bytes (32 bytes == 256 bits == 64 hex (or nibble))
できるだけconstantとかハードコードできるところはする!
uint256 public v1;
uint256 public constant v2;
function calculate() returns (uint256 result) {
return v1 * v2 * 10000;
}
1 slot = 256bit = 32bytesこれにより20,000 ガスを消費する!だからできるだけ詰めて宣言!
EVMのストレージは1slotが32bytesのkey-valueストア
「uint8
やuint64
...uint128
やbool
は必ずしもガスが安いわけではない」
EVMは32bytesを一度に処理するので、bool
は一度32bytesに変換される過程で余計なガスがかかってしまいます。
だから今回は2通りしかなくても、uint256
を使う方がガスの観点では好ましいのです。
// openzeppelinより!
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
// Good
uint256 a; // slot 0
uint128 b; // slot 1
uint128 c; // slot 1
// Bad
uint128 b; // slot 0
uint256 a; // slot 1
uint128 c; // slot 2