Gas 及其在 Solidity Programming 中的消耗

Gas and it's consumption in Solidity Programming

我最近一直在努力学习 Solidity。

但是作为一个只会C++的开发者,Java有开发经验。

我无法理解 Gas in Solidity 的逻辑。

  1. 为什么需要它?
  2. 消耗点数是多少?
  3. 如何降低它的消耗?

EVM-based 网络通常 public 并且对任何人开放。他们处理的交易数量也有限。

必须为交易付费可以减少垃圾交易的数量,否则这些交易会充斥网络,使普通用户无法使用。


一般来说,与使用非持久性数据位置(例如内存)相比,使用持久性存储的成本要高出 100 到 1000 倍(仅针对每个事务限定范围,然后未分配)。

gas 使用优化的经验法则是尽可能少地访问存储。例如,与其对存储进行两次读取,不如进行一次读取,并将数据存储在内存变量中(这样读取起来要便宜得多)。

uint8 number;

function isNumberValid() external returns (bool) {
    return (
        number >= 100  // storage read
        && number <= 200  // storage read
    );
}

“两次存储读取”(上图)比“一次存储读取、一次内存存储和两次内存读取”(下图)更昂贵。

uint8 number;

function isNumberValid() external returns (bool) {
    uint8 _number = number; // storage read, memory store
    return (
        _number >= 100  // memory read
        && _number <= 200  // memory read
    );
}

在(定期更新)Yellow paper、附录 G 和 H 中有一份相当详尽的清单,列出了每个操作的 gas 成本,目前在第 27 和 28 页。