首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gas视图函数

Gas视图函数
EN

Ethereum用户
提问于 2018-09-25 01:23:48
回答 2查看 2.9K关注 0票数 3

我在许多地方读到,视图函数不需要气体,但是事实并非如此,因为它们为区块链操作付出了代价,即使这些操作不会改变状态。例如,如果我错了,请纠正我:

代码语言:javascript
复制
pragma solidity ^0.4.17;

contract myContract {
    uint[] public anArray;   /// assume it has 1,000,000 (1Million) elements

/* function which returns how many times a specific element is in the n array*/

    function elementIndex(uint element) public view returns(uint){
        uint counter;
        for(uint i; i<anArray.length; i++){
            if(anArray[i] == element){
                counter++;
            }
        }
        return counter;
    }
function returnAllElements() public view returns(uint[]){
return anArray;
}}

当数组有100万元素时,真正的问题出现在前端。运行elementIndex()将永远无法工作,因为迭代将花费太长时间。returnAllElements也不能工作(我想)。

在这种情况下能做些什么呢?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2018-09-25 02:33:44

在您的示例中,elementIndexreturnAllElements函数都不需要任何气体,因为这两个函数都从块链读取状态变量,并给出了预期的结果。

您可以优化上述功能,以减少它们所花费的时间。

请参考以下问题以了解查看/纯气体使用-成本气体,如果内部调用的另一个功能?

请参阅下面的博客,以了解ethereum中呼叫和交易之间的区别-

https://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

票数 4
EN

Ethereum用户

发布于 2018-09-25 09:17:26

视图不会只在从网络外部调用时才会花费天然气,也就是说,如果合同中的一个函数是视图,并且是从另一个合同调用的,那么它将花费天然气。

如果从网络外部调用,它将不会花费天然气,原因是可以在不提交事务的情况下在用于连接到网络的本地节点中解析该函数。

希望这能有所帮助。

票数 6
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/59387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档