合约实践:避免区块Gas限制导致问题
以太坊上的计算资源是有限的,单个区块可用的 Gas 是有个上限的,这就是“区块 Gas 上限”。 现在单个区块区块限制约为 990万。
矿工要收集交易并打包到区块里,因为矿工们可以得到 Gas 费用,理论上,他们会按gas price 排序,并尽可能高效利用区块的 Gas 空间,即让交易的 Gas Limit 总和尽可能接近区块 Gas 上限。一笔交易的 Gas 耗用量如果大于这个上限,是根本没法被打包的。
当合约中存在依赖时间、依赖数据大小(如数组长度)的循环时,都可能会有潜在的漏洞。 随时间的延长,或数据的增大,gas 的消耗就可能对应的线性增长,很可能突破区块限制导致无法打包。
下面是一个有这样漏洞的合约:
pragma solidity ^0.5.20;
contract TerribleBank {
struct Deposit {
address depositor;
uint256 amount;
}
Deposit[] public deposits;
function deposit() external payable {
deposits.push(Deposit({
depositor: msg.sender,
amount: m...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!