我的理解是"要求"如果它失败则退还剩余的气体而#34;断言"没有按'吨
虽然b / c剩余的气体是什么意思,但我有点困惑?即使我打电话的合同要求很少,我也经常指定一个非常大的气体限制。如果我要指定4,700,000气体限制,并且只需要50,000气体,但是"断言"在被叫合同中失败了,我会失去所有4,700,000天然气吗?
答案 0 :(得分:3)
是的,你会失去全部金额(或接近它)。由于完全出乎意料的事情,assert
实际上是交易的灾难性保释。它应该用于检查确保合同没有处于无效状态,避免除以0,上溢/下溢等等。
require
只会消耗到故障点所用的气体。剩余的气体将被退还。
您指定的气体限制不应该任意高。当您启动交易时,会发送您指定的全部气体,并且在执行结束时剩余的任何内容将退还给您。你不仅要在自己的合约中将自己暴露给asserts
,而且如果你从自己的合同中调用其他合同,那么你给合同带来了很大的带宽,可以用你传递给它的气体做任何想做的事情。
显示燃气消耗量的示例:
pragma solidity ^0.4.16;
contract Test {
function run(uint8 i) public pure {
uint8 total = 0;
for (uint8 j = 0; j < 10; j++)
total += j;
assert (i < 20);
require (i < 10);
for (j = 0; j < 10; j++)
total += j;
}
}
所有测试均以气体限制= 5000000
运行测试#1 - 运行(8):功能成功运行 - 消耗1860气体。
测试#2 - 运行(15):函数传递断言,失败于require。只运行第一个循环 - 消耗1049个气体。
测试#3 - 运行(25):断言时函数失败。同样,只运行第一个循环 - 消耗4978536气体(ouch)。