是否可以在不消耗 Gas 的情况下从另一个合约调用合约函数?

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

我写的很基础Concatenation and StringUtil contracts。我尝试通过在 StringUtil 中创建一个实例来应用组合方法,使用串联合同。但是,Solidity 编译器警告我将 payable 关键字添加到连接函数中,以便从 StringUtil 合约中使用它。我认为 concatenate 不是一个可支付的操作。 =)有没有办法在不消耗气体的情况下使用该功能?我在下面写的一些想法出现在我的脑海中,但它们并不好。

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

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

你有什么想法?您知道这方面的最佳做法吗?

谢谢。

Solidity compiler warned me to add payable keyword to concatenate function in order to consume it from StringUtil contract

这是因为您已将 concatenate 功能标记为应付。它似乎没有进行任何以太币传输,因此似乎没有必要。

Is there a way to use that function without consuming gas?

运行 不是 viewpure 的函数总是会产生一些 gas 成本,与完成的工作量成正比。由于您的函数修改了存储,因此不花费 gas 就无法使用它。

至于可升级性,您通常需要在添加新方法时重新部署两个合约,除非您使用 call,并设置一个方法来接受函数签名和参数。您可以研究代理合同,看看类似的东西是如何实现的。

下面我做了很简单的实验。我在函数上应用了 payable 和 view 关键字。这次编译器没有警告我。我发现我在 post 第一次 post 时错误地调用了 payable 函数。

  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 关键字添加到从另一个合约调用的函数中并不是强制性的。我们可以管理被调用的函数是否从另一个合约消耗气体。正确吗?