Blockchain 如果一个智能合约从另一个智能合约读取数据,它是否需要汽油?

Blockchain 如果一个智能合约从另一个智能合约读取数据,它是否需要汽油?,blockchain,ethereum,solidity,tron,Blockchain,Ethereum,Solidity,Tron,当一个契约的函数从第二个契约的函数读取数据时(即,第二个契约上没有状态更改)。它消耗汽油吗?1)查询 如果您只想在不改变状态的情况下获取信息,那么您可以免费查询合同。查询意味着您可以调用标记为或的任何函数,并且不存在任何气体成本。在这些情况下,您询问的任何节点都可以立即回答查询,而无需询问任何其他节点 2) 交易 如果您想修改状态,则需要支付汽油成本,您必须发送交易并支付汽油费用 3) 事务内部查询 我认为你最初的问题是关于在交易中查询是否有成本。这会消耗额外的汽油。我在0.6.1的混音中尝试了

当一个契约的函数从第二个契约的函数读取数据时(即,第二个契约上没有状态更改)。它消耗汽油吗?

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

2) 交易 如果您想修改状态,则需要支付汽油成本,您必须发送交易并支付汽油费用

3) 事务内部查询 我认为你最初的问题是关于在交易中查询是否有成本。这会消耗额外的汽油。我在0.6.1的混音中尝试了这个实验(为了清晰起见,大多数代码都省略了):


我认为这应该会产生成本,因为查询可以从单个节点得到响应,但事务调用必须由所有节点验证。

我只想从另一个合同中获取一些数据,而不更改该合同中的任何内容。这是免费的还是需要一些汽油?我误解了你的问题,我已经澄清了答案。我可以问很多次吗?因为我的合同会频繁地对另一个合同进行读取调用。如果您在上面的案例1中(发送查询),那么至少有以下限制:a)每个合同的最大固化代码数量有限制。b) 对其执行查询的节点可能对调用频率有限制。如果您运行自己的节点,则可以控制此限制。
   // 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);
   }