首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从javascript访问合同的公共数组

从javascript访问合同的公共数组
EN

Ethereum用户
提问于 2020-12-23 18:08:01
回答 2查看 813关注 0票数 0

看看这个基本的稳固契约:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT

pragma solidity 0.6.11;

contract MyContract {
   string[] public tmp;
   ...

   function read_tmp() public view returns(string[] memory){
      return tmp;
   }
}

我已经创建了一个脚手架松露反应项目。

首先,在尝试使用以下命令部署此契约时出错:

代码语言:javascript
复制
truffle migrate --network ropsten --reset

错误是:

TypeError:这种类型只支持在ABIEncoderV2中。使用“实用化实验ABIEncoderV2;”启用该特性。

此错误是由于string[]返回类型的read_tmp造成的。我不喜欢这样做,但是我已经在我的合同的顶部加上了这一行,部署现在开始工作了:

代码语言:javascript
复制
pragma experimental ABIEncoderV2;

我的第一个问题是:为什么我要启用实验特性?我的0.6.11编译器版本应该允许这个特性.

我的第二个问题是,我在App.js文件中尝试过这样的方法:

代码语言:javascript
复制
await this.state.contract.methods.tmp().call();

Solidity应该为tmp公共字段自动创建一个名为tmp()的getter。

我不明白为什么,但我的浏览器中有这个javascript错误:

未知(承诺)错误:"tmp“的参数数无效。得到0预期的1!

如果我调用read_tmp(),一切都会正常工作。所以我的问题是为什么tmp()需要一个论证?(我试图传递一个整数,但它不起作用)

非常感谢

EN

回答 2

Ethereum用户

发布于 2020-12-23 18:19:10

对于type[] public arr,编译器自动生成以下函数:

代码语言:javascript
复制
function arr(uint256 index) public view returns (type) {
    return arr[index];
}

当然,它不会添加到源代码中,因为这样会产生命名冲突。

但它被添加到字节码本身,实质上成为契约的一部分。

如果您想要一个返回整个数组的函数,那么需要自己实现它:

代码语言:javascript
复制
function getArr() public view returns (type[] memory) {
    return arr;
}

关于以下方面:

我的0.6.11编译器版本应该允许这个特性.

这是错误的;这个特性在ABI编码器V2下是支持的,默认情况下只能从Solc0.8.0开始激活(如稳健性0.8.0发布公告中所述)。

票数 1
EN

Ethereum用户

发布于 2021-10-23 23:28:57

您无法从坚固性中检索整个数组。你必须选择索引,这就是为什么它期待一个参数。如果您想在javascript中获得整个数组元素,那么在solidity中定义一个函数来获取数组的长度。

代码语言:javascript
复制
//Contract Code

function getTmpCount() public view returns(uint){
    return tmp.length;
}

然后在javascript代码中:

代码语言: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();
      })
  );
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/91464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档