繁体   English   中英

是否可以在不消耗Gas的情况下从另一个合同调用合同功能?

[英]Is it possible to call contract function from another contract without consuming Gas?

我写了非常基本的Concatenation和StringUtil合同 我尝试通过在StringUtil内创建实例的情况下使用并置协定来应用组合方法。 但是,Solidity编译器警告我添加payable关键字来连接函数,以便从StringUtil合约中使用它。 我以为连接不是一个应付操作。 =)有没有一种方法可以在不消耗汽油的情况下使用该功能? 我在脑海中浮现出一些想法,但它们不好。

将整个串联合同代码复制到StringUtil中并直接在其中使用。 但是,这不是一个好方法。

从Concatenation扩展StringUtil(合同StringUtil是Concatenation)。 但是,我需要在新创建的合约中编写更多功能,比如说Comparer并将其用作相同的方法。 这也不好。 因为,StringUtil已从Concatenation扩展。

你怎么看? 您是否知道有关此主题的最佳做法?

谢谢。

Solidity编译器警告我添加payable关键字以连接函数,以便从StringUtil合约中使用它

这是因为您已将concatenate功能标记为应付款。 它似乎没有进行任何醚转移,因此似乎没有必要。

有没有一种方法可以在不消耗气体的情况下使用该功能?

运行非view函数或pure函数将始终产生一定的耗气量,与完成的工作量成比例。 由于您的函数会修改存储,因此没有消耗大量电量就无法使用它。

至于可升级性,除非添加了call ,并且设置了一个接受函数签名和参数的方法,否则通常需要在添加新方法时重新部署两个合同。 您可以研究代理合同,以了解如何执行类似的工作。

我在下面做了一个非常简单的实验。 我在函数上同时应用了payable和view关键字。 这次的编译器没有警告我。 我发现我在发布第一篇文章时错误地调用了应付款功能。

  1. 调用视图关键字添加功能
  2. 不使用view关键字的调用功能
  3. 错误调用应付款功能
  4. 正确调用应付款功能,因此没有错误或警告

最后,我了解到将payable关键字添加到从另一个合同调用的函数中并不是强制性的事情。 我们可以管理被调用的函数是否消耗其他合同中的天然气。 这是正确的吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM