看看这个基本的稳固契约:
// SPDX-License-Identifier: MIT
pragma solidity 0.6.11;
contract MyContract {
string[] public tmp;
...
function read_tmp() public view returns(string[] memory){
return tmp;
}
}我已经创建了一个脚手架松露反应项目。
首先,在尝试使用以下命令部署此契约时出错:
truffle migrate --network ropsten --reset错误是:
TypeError:这种类型只支持在ABIEncoderV2中。使用“实用化实验ABIEncoderV2;”启用该特性。
此错误是由于string[]返回类型的read_tmp造成的。我不喜欢这样做,但是我已经在我的合同的顶部加上了这一行,部署现在开始工作了:
pragma experimental ABIEncoderV2;我的第一个问题是:为什么我要启用实验特性?我的0.6.11编译器版本应该允许这个特性.
我的第二个问题是,我在App.js文件中尝试过这样的方法:
await this.state.contract.methods.tmp().call();Solidity应该为tmp公共字段自动创建一个名为tmp()的getter。
我不明白为什么,但我的浏览器中有这个javascript错误:
未知(承诺)错误:"tmp“的参数数无效。得到0预期的1!
如果我调用read_tmp(),一切都会正常工作。所以我的问题是为什么tmp()需要一个论证?(我试图传递一个整数,但它不起作用)
非常感谢
发布于 2020-12-23 18:19:10
对于type[] public arr,编译器自动生成以下函数:
function arr(uint256 index) public view returns (type) {
return arr[index];
}当然,它不会添加到源代码中,因为这样会产生命名冲突。
但它被添加到字节码本身,实质上成为契约的一部分。
如果您想要一个返回整个数组的函数,那么需要自己实现它:
function getArr() public view returns (type[] memory) {
return arr;
}关于以下方面:
我的0.6.11编译器版本应该允许这个特性.
这是错误的;这个特性在ABI编码器V2下是支持的,默认情况下只能从Solc0.8.0开始激活(如稳健性0.8.0发布公告中所述)。
发布于 2021-10-23 23:28:57
您无法从坚固性中检索整个数组。你必须选择索引,这就是为什么它期待一个参数。如果您想在javascript中获得整个数组元素,那么在solidity中定义一个函数来获取数组的长度。
//Contract Code
function getTmpCount() public view returns(uint){
return tmp.length;
}然后在javascript代码中:
// you get the lenght of the array
const tmpCount = await contract.methods.getTmpCount().call()
const tmps = await Promise.all(
Array(tmpCount)
.fill()
.map((element, index) => {
return campaign.methods.tmp(index).call();
})
);https://ethereum.stackexchange.com/questions/91464
复制相似问题