Gas 及其在 Solidity Programming 中的消耗
Gas and it's consumption in Solidity Programming
我最近一直在努力学习 Solidity。
但是作为一个只会C++的开发者,Java有开发经验。
我无法理解 Gas in Solidity 的逻辑。
- 为什么需要它?
- 消耗点数是多少?
- 如何降低它的消耗?
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 页。
我最近一直在努力学习 Solidity。
但是作为一个只会C++的开发者,Java有开发经验。
我无法理解 Gas in Solidity 的逻辑。
- 为什么需要它?
- 消耗点数是多少?
- 如何降低它的消耗?
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 页。