如果一个智能合约从另一个智能合约读取数据,会消耗gas吗?

ank*_*kur 5 blockchain ethereum solidity tron

当一个合约的函数从第二个合约的函数读取数据时(即第二个合约没有状态更改)。它消耗天然气吗?

K S*_*K S 8

1) 查询

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

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);
   }
Run Code Online (Sandbox Code Playgroud)

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