gpt4 book ai didi

ethereum - 为什么自动生成的 getter 函数会产生 gas 成本?

转载 作者:行者123 更新时间:2023-12-05 03:41:47 24 4
gpt4 key购买 nike

我认为在以太坊上读取数据应该是免费的,但是在契约(Contract)文档(链接如下)中指出,对于公共(public)数组,自动生成的 getter 函数一次只返回一个元素以避免大量的 gas 成本。

getter 函数不是只读的吗?如果是这样,为什么会产生大量的 gas 成本?

参见 https://docs.soliditylang.org/en/v0.5.3/contracts.html 中的 Getter 函数部分

最佳答案

与智能合约交互的主要方式有两种。

  • 只读调用是免费的。
  • 交易(可以产生状态变化——存储变化、事件日志……)需要 gas 费用。

从链下客户端应用程序的角度来看,您可以使用 Truffle call() 函数、Web3 call() 函数、JSON-RPC eth_call 方法和其他几种方式调用。

从 Solidity 合约的角度来看,不进行状态更改的只读函数应标记为 view(读取区 block 链数据,例如 getter)或 pure(不读取区 block 链数据,例如数学助手) .


If you have a public state variable of array type, then you can only retrieve single elements of the array via the generated getter function. This mechanism exists to avoid high gas costs when returning an entire array. You can use arguments to specify which individual element to return, for example data(0). If you want to return an entire array in one call, then you need to write a function

来源:Docs 链接自您的问题

Isn't a getter function read-only? If so, why would it incur large gas costs?

它是只读的。但这并不意味着它只能使用只读调用访问。

当您向需要从Contract B读取数据的Contract A发送交易时,它会进行内部交易。示例:

合约 A 部署在 0x123

pragma solidity ^0.8;

interface B {
// this is the generated getter function that the docs mention
function data(uint256 index) external returns (address);
}

contract A {
// executing this function requires a transaction
function getContractBFirstItem() external returns (address) {
B memory b = B(address(0x456));

// this creates an internal transaction (not a read-only call)
address firstItem = b.data(0);

return firstItem;
}
}

合约 B 部署在 0x456

pragma solidity ^0.8;
contract B {
// the getter function is generated from this public property
address[] public data;

constructor() {
// so that fhe first item exists and we can test it
data.push(address(0x789));
}
}

关于ethereum - 为什么自动生成的 getter 函数会产生 gas 成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67610072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com