4

当一个合约的函数从第二个合约的函数中读取数据时(即第二个合约没有状态变化)。它会消耗气体吗?

4

1 回答 1

5

1) 查询

如果您只想在不更改状态的情况下获取信息,那么可以,您可以免费查询合同。查询意味着您可以调用任何标记为viewpure的函数,并且没有 gas 成本。在这些情况下,您询问的任何节点都可以立即回答查询,而无需询问任何其他节点。

2) 交易

如果您想修改状态,则需要支付 gas 费用,并且您必须发送交易并支付 gas。

3)事务内部的查询

我认为您最初的问题是关于在交易中进行查询是否需要付费。这确实会消耗额外的气体。我在 Remix with Solidity 0.6.1 中尝试了这个实验(为了清楚起见,大部分代码被省略):

   // Gas used = 24,656
   function SetSomethingInAnotherContract_WithoutCall() public
   {
       anotherContract.SetSomething(4);
   }

   // Gas used = 28,124
   function SetSomethingInAnotherContract_WithCall() public
   {
       uint temp = anotherContract.GetSomething(); // in a query this would be free
       anotherContract.SetSomething(4);
   }

我认为它应该产生成本是有道理的,因为可以从单个节点回答查询,但事务调用必须由所有节点验证。

于 2020-01-21T16:43:49.513 回答