Gas 费用
由于 EVM 相当于一台超大型的单例虚拟机器,因此需要避免一些恶意的合约代码通过死循环的方式,恶意消耗计算资源。EVM 使用一种虚拟资源 gas 燃料来实现。
当用户每一次发起交易请求时,都需要指定允许消耗的 gas 总量。
EVM 每执行一条指令都需要消费一定的 gas。如果当 gas 用尽时,交易仍未能完成,则将触发 gas 耗尽异常,交易将被撤销,所有区块链改动被恢复。但是被消耗掉的 gas 并不能返回。
通过目前的 gas 价格,以及本次交易(无论成功还是失败)消耗的 gas 用量,可以计算得到用户最终需要支付的 gas 费用(通过以太币支付)。
通过这种方式,即使合约存在死循环,最终也会因 gas 耗尽而中止。而如果设置过大的 gas 值,最终攻击方也必须要付出大量的 gas 费用。
您可以通过 Etherscan 查看当前的 gas 价格。通过 MetaMask
授权合约调用时,也会显示该交易需要消耗的以太币。
我们可以通过 tx.gasprice()
来获取当前交易的 gas 价格,使用 gasleft()
可以获取当前剩余的 gas 用量:
Gas.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;
contract Gas {
function getGasPrice() public view returns (uint) {
return tx.gasprice;
}
function getGasLeft() public view returns (uint) {
return gasleft();
}
}