当一个合同的功能从第二个合同的功能中读取数据时(也就是说,第二个合同上没有状态更改)。它消耗汽油吗?
答案 0 :(得分:1)
如果您只想获取信息而不更改状态,则可以免费查询合同。查询意味着您可以调用任何标记为view或pure的函数,并且没有用气成本。在这种情况下,无论您问什么节点,都可以立即回答查询,而不必问其他任何节点。
如果您要修改状态,则需要支付汽油费用,并且您必须发送交易并支付汽油费用。
我认为您最初的问题是关于在事务内部进行查询是否存在成本。这确实消耗了额外的气体。我在带有Solidity 0.6.1的Remix中尝试了该实验(为清楚起见,省略了大多数代码):
// 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);
}
我认为这应该引起一定的成本,因为可以从单个节点回答查询,但是必须由所有节点验证事务调用。