当一个合约的函数从第二个合约的函数中读取数据时(即第二个合约没有状态变化)。它会消耗气体吗?
1489 次
1 回答
5
1) 查询
如果您只想在不更改状态的情况下获取信息,那么可以,您可以免费查询合同。查询意味着您可以调用任何标记为view或pure的函数,并且没有 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 回答