在Solidity中断言与要求?

时间:2018-02-18 00:51:28

标签: ethereum

我的理解是"要求"如果它失败则退还剩余的气体而#34;断言"没有按'吨

虽然b / c剩余的气体是什么意思,但我有点困惑?即使我打电话的合同要求很少,我也经常指定一个非常大的气体限制。

如果我要指定4,700,000气体限制,并且只需要50,000气体,但是"断言"在被叫合同中失败了,我会失去所有4,700,000天然气吗?

1 个答案:

答案 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气体。

enter image description here

测试#2 - 运行(15):函数传递断言,失败于require。只运行第一个循环 - 消耗1049个气体。

enter image description here

测试#3 - 运行(25):断言时函数失败。同样,只运行第一个循环 - 消耗4978536气体(ouch)。

enter image description here