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

时间:2018-08-03 07:34:47

标签: ethereum solidity

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

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

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

您有什么想法?您知道此主题的最佳做法吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

  

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

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

  

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

运行不是viewpure的函数将始终产生一定的耗气量,与完成的工作量成比例。由于您的函数会修改存储空间,因此无法在不浪费电量的情况下使用它。

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

答案 1 :(得分:0)

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

  1. Calling view keyword added function
  2. Calling function without using view keyword
  3. Wrongly Calling payable function
  4. Correctly Calling payable function as a result there is no error or warning

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