合约实践:避免区块Gas限制导致问题
矿工要收集交易并打包到区块里,因为矿工们可以得到 Gas 费用,理论上,他们会按gas price 排序,并尽可能高效利用区块的 Gas 空间,即让交易的 Gas Limit 总和尽可能接近区块 Gas 上限。一笔交易的 Gas 耗用量如果大于这个上限,是根本没法被打包的。
## 可能漏洞
当合约中存在依赖时间、依赖数据大小(如数组长度)的循环时,都可能会有潜在的漏洞。
随时间的延长,或数据的增大,gas 的消耗就可能对应的线性增长,很可能突破区块限制导致无法打包。
下面是一个有这样漏洞的合约:
“`js
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…
区块限制
以太坊上的计算资源是有限的,单个区块可用的 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...
剩余50%的内容订阅专栏后可查看
- 发表于 2020-01-13 16:43
- 阅读 ( 2609 )
- 学分 ( 34 )
- 分类:智能合约
- 专栏:全面掌握Solidity智能合约开发