gpt4 book ai didi

ethereum - Solidity 中的断言与要求?

转载 作者:行者123 更新时间:2023-12-05 01:43:39 25 4
gpt4 key购买 nike

我的理解是,如果失败,“require”会退还剩余的 gas,而“assert”不会。

虽然 b/c 剩余气体是什么意思,但我有点困惑?我经常指定一个非常大的 gas limit,即使我调用的合约要求很少。

如果我要指定 4,700,000 gas limit,并且只需要 50,000 gas,但在调用的合约中“断言”失败,我会失去所有 4,700,000 gas 吗?

最佳答案

是的,您会损失全部(或接近)金额。 assert 实际上是由于完全出乎意料的事情而对交易进行的灾难性救助。它应该用于检查诸如确保您的契约(Contract)没有以无效状态结束、避免除以 0、溢出/下溢等事情。

另一方面,

require 只会消耗在故障点之前用完的 gas。剩余的 gas 将被退还。

您指定的气体限制不应任意高。当您发起交易时,系统会发送您指定的全部气体,并在执行结束时将剩余的气体退还给您。您不仅在自己的合约中暴露于断言,而且如果您从自己的合约中调用其他合约,那么您就是在为该合约提供大量带宽,以使用您传递的 gas 做任何它想做的事情

显示耗气量的示例:

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;
}
}

所有测试都以 gas limit = 5000000 运行

测试 #1 - 运行 (8):函数成功运行 - 消耗了 1860 gas。

enter image description here

测试 #2 - run(15):函数通过断言,在要求时失败。仅运行第一个循环 - 消耗 1049 gas。

enter image description here

测试 #3 - run(25):函数在断言时失败。同样,仅运行第一个循环 - 消耗了 4978536 gas(哎哟)。

enter image description here

关于ethereum - Solidity 中的断言与要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com