Ethereum Solidity—为什么公共结构变量的默认getter不';t返回结构中的每个变量

Ethereum Solidity—为什么公共结构变量的默认getter不';t返回结构中的每个变量,ethereum,solidity,ethers.js,Ethereum,Solidity,Ethers.js,我目前正在学习Solidity语言,我注意到当我试图在JS代码中获取结构的值时,Solidity会返回每个不带数组的变量。 我必须创建自定义getter来访问结构中的所有数据 我制作了一个非常简单的契约示例,其中包含在构造函数中初始化的结构 我使用自定义getter访问变量,并在JS代码中生成一个 测试溶胶 pragma solidity ^0.8.4; contract Test { struct Data { string foo; address

我目前正在学习Solidity语言,我注意到当我试图在JS代码中获取结构的值时,Solidity会返回每个不带数组的变量。 我必须创建自定义getter来访问结构中的所有数据

我制作了一个非常简单的契约示例,其中包含在构造函数中初始化的结构

我使用自定义getter访问变量,并在JS代码中生成一个

测试溶胶

pragma solidity ^0.8.4;

contract Test {

    struct Data {
        string foo;
        address[] bar;
        address ctrt;
    }

    Data public d;

    constructor() {
        d.foo = "HELLO WORLD";
        d.bar.push(msg.sender);
        d.ctrt = address(this);
    }

    function getD() public view returns (Data memory) {
        return d;
    }
}
Test.js

const {ethers} = require('hardhat');

describe('Test', function () {
  it('should test something', async function() {
    const factory = await ethers.getContractFactory('Test')
    const test = await factory.deploy();
    console.log("Result from var:");
    console.log(await test.d());
    console.log("Result from getter:");
    console.log(await test.getD());
  })
});
结果显示在控制台中:

Result from var:
[
  'HELLO WORLD',
  '0x5FbDB2315678afecb367f032d93F642f64180aa3',
  foo: 'HELLO WORLD',
  ctrt: '0x5FbDB2315678afecb367f032d93F642f64180aa3'
]
Result from getter:
[
  'HELLO WORLD',
  [ '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' ],
  '0x5FbDB2315678afecb367f032d93F642f64180aa3',
  foo: 'HELLO WORLD',
  bar: [ '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' ],
  ctrt: '0x5FbDB2315678afecb367f032d93F642f64180aa3'
]
如果某部分数据不可见,那么明确地说某个变量是公共变量有什么意义呢?

引用:

如果有数组类型的公共状态变量,则只能通过生成的getter函数检索数组的单个元素。这种机制的存在是为了在返回整个阵列时避免高昂的气体成本

这就是为什么当您使用ethers.js进行调用时,您看不到该值

解决方案是创建一个
getDataBar(uint i)
函数,返回条形图内容