如何解决Solidity - 为什么公共 Struct 变量的默认 getter 不会返回 Struct
我目前正在学习 solidity 语言,并且我注意到当我尝试在我的 JS 代码中获取 Struct 的值时,solidity 返回每个变量而没有数组。 我必须创建自定义 getter 才能访问结构中的所有数据。
我制作了一个非常简单的合约示例,其中在构造函数中初始化了一个 Struct。
我正在使用我的自定义 getter 访问变量并在 JS 代码中生成一个。
Test.sol
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' ],bar: [ '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' ],ctrt: '0x5FbDB2315678afecb367f032d93F642f64180aa3'
]
如果数据的某些部分不可见,明确说明变量是公共的有什么意义?
解决方法
引用 docs:
如果您有一个数组类型的公共状态变量,那么您只能通过生成的 getter 函数检索数组的单个元素。这种机制的存在是为了避免返回整个数组时的高gas成本。
这就是为什么当您使用 ethers.js 进行调用时,您看不到该值。
解决方案是创建一个返回栏内容的 getDataBar(uint i)
函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。