存储位置 | 特点 | 用途 | 成本 |
Storage | 永久存储 | 用于保存合约的状态变量,这些变量会存储在区块链上 | 较高的 Gas 费用,因为写入区块链是昂贵的操作 |
Memory | 临时存储 | 用于函数内部的临时变量,数据在函数调用结束后被销毁 | 相对较低 |
CallData | 只读临时存储 | 用于函数参数,它的数据不可修改。通常用于外部函数的参数,以节省 Gas | 最便宜,因为它是只读的,不需要存储在区块链上 |
Stack | 临时存储 | 用于处理临时值和执行操作,数据存储在 EVM 的栈中 | 非常低,因为数据只在执行期间存在 |
实践中的使用
根据实际需求选择合适的数据存储位置是编写高效 Solidity 合约的关键。以下是一些实践中的建议:
- 状态变量:使用
storage
存储永久性数据。 - 函数内部临时变量:使用
memory
存储在函数内部使用的数据。 - 外部函数参数:使用
calldata
存储传递给外部函数的只读数据。 - 临时计算:使用栈来处理短期的计算。