以太坊区块链提供永久存储。只要区块链存在,保存在区块链上的所有内容都将永远可用,但这种永久性是有代价的。优化存储不仅可以降低成本,还可以确保以太坊的全局状态得到高效利用。
Solidity将变量存储在存储插槽中。每个插槽大小为32字节。当变量可以容纳在单个插槽时,可以分别使用单个SLOAD或SSTORE操作来读取或更新它们。
请看两份合约:
Solidity
// Without Optimization
pragma solidity ^0.8.9;
contract UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidity
// With Optimization
pragma solidity ^0.8.9;
contract OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
在Remix中部署这两个合约,并注意在使用不同变量时gas的差异。
在优化版本中,value1
和value2
共享一个32字节的插槽。
在完成存储插槽的使用后(尤其是完成临时数据存储时),你可以删除插槽或将其清零,以获得gas费用返还。
Solidity
pragma solidity ^0.8.9;
contract RefundExample {
uint256 public temporaryData;
function storeTemporaryData(uint256 data) public {
temporaryData = data;
}
function clearTemporaryData() public {
delete temporaryData;
}
}
在Remix中部署此合约。
存储一些临时数据,然后清除数据。
查看gas费用。留意执行删除(delete
)操作获得的gas退款。
如果数据不需要在链上访问,可以考虑将其记录为事件而不是存储该数据。事件比存储操作便宜得多。
Solidity
pragma solidity ^0.8.9;
contract EventExample {
event DataStored(uint256 data);
function storeData(uint256 data) public {
emit DataStored(data);
}
}
在Remix中部署并运行合合约。
请注意,与存储相比,gas成本更低。
现在,你已经掌握了一些基本的存储优化方法,务必要多加练习。你可以使用我们提供的示例,也可以尝试创建自己的方法。在接下来的课程中,我们将深入探讨函数的优化和库中代码的复用。优化策略既是一门艺术,也是一门科学。跟我们一起继续探索吧!
以太坊区块链提供永久存储。只要区块链存在,保存在区块链上的所有内容都将永远可用,但这种永久性是有代价的。优化存储不仅可以降低成本,还可以确保以太坊的全局状态得到高效利用。
Solidity将变量存储在存储插槽中。每个插槽大小为32字节。当变量可以容纳在单个插槽时,可以分别使用单个SLOAD或SSTORE操作来读取或更新它们。
请看两份合约:
Solidity
// Without Optimization
pragma solidity ^0.8.9;
contract UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidity
// With Optimization
pragma solidity ^0.8.9;
contract OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
在Remix中部署这两个合约,并注意在使用不同变量时gas的差异。
在优化版本中,value1
和value2
共享一个32字节的插槽。
在完成存储插槽的使用后(尤其是完成临时数据存储时),你可以删除插槽或将其清零,以获得gas费用返还。
Solidity
pragma solidity ^0.8.9;
contract RefundExample {
uint256 public temporaryData;
function storeTemporaryData(uint256 data) public {
temporaryData = data;
}
function clearTemporaryData() public {
delete temporaryData;
}
}
在Remix中部署此合约。
存储一些临时数据,然后清除数据。
查看gas费用。留意执行删除(delete
)操作获得的gas退款。
如果数据不需要在链上访问,可以考虑将其记录为事件而不是存储该数据。事件比存储操作便宜得多。
Solidity
pragma solidity ^0.8.9;
contract EventExample {
event DataStored(uint256 data);
function storeData(uint256 data) public {
emit DataStored(data);
}
}
在Remix中部署并运行合合约。
请注意,与存储相比,gas成本更低。
现在,你已经掌握了一些基本的存储优化方法,务必要多加练习。你可以使用我们提供的示例,也可以尝试创建自己的方法。在接下来的课程中,我们将深入探讨函数的优化和库中代码的复用。优化策略既是一门艺术,也是一门科学。跟我们一起继续探索吧!