Solidity:UnimplementedFeatureError:此处未实现嵌套动态数组

Chr*_*son 5 arrays blockchain ethereum solidity smartcontracts

当我尝试在 Solidity 中执行此操作时,它给了我 UnimplementedFeatureError: 嵌套动态数组未在此处实现。

我在代码示例中看到了这一点。Solidity不支持这个吗?

编辑 - 下面发布了完整的代码。所以我发现问题只出在最后一个函数中。它不喜欢我返回动态数组。我如何实现相同的功能(我想返回数据的字符串数组)?

pragma solidity ^0.4.6;

contract EmailIntegrity {

  // Map an array of EmailIntegrityStructs for each email address.
  // The first element will be used for the integrity record.
  // The rest will be used for audit records.

  enum ItemType { Integrity, Audit }
  
  struct EmailIntegrityStruct {
    ItemType itemType;
    uint timestamp;
    string data;
  }

  mapping(address => EmailIntegrityStruct[])  emailIntegrityStructs;

  function hasEmailIntegrityData(address emailAddress) public constant returns(bool isEmail) {
    return emailIntegrityStructs[emailAddress][0].timestamp == 0;
  }

  function insertIntegrityData(address emailAddress, uint timestamp, string data) public returns(bool success) {
    if (hasEmailIntegrityData(emailAddress)) {
        revert(); 
    }
    EmailIntegrityStruct memory integrityData;
    integrityData.itemType = ItemType.Integrity;
    integrityData.timestamp = timestamp;
    integrityData.data = data;
    emailIntegrityStructs[emailAddress].push(integrityData);
    return emailIntegrityStructs[emailAddress].length == 1;
  }

  function insertAuditData(address emailAddress, uint timestamp, string data) public returns(bool success) {
    if (!hasEmailIntegrityData(emailAddress)) {
        revert(); 
    }
    EmailIntegrityStruct memory auditData;
    auditData.itemType = ItemType.Audit;
    auditData.timestamp = timestamp;
    auditData.data = data;
    emailIntegrityStructs[emailAddress].push(auditData);
    return emailIntegrityStructs[emailAddress].length > 1;
  }
  
  function getIntegrityData(address emailAddress) public constant returns(string data) {
    if (!hasEmailIntegrityData(emailAddress)) {
        revert(); 
    }
    return emailIntegrityStructs[emailAddress][0].data; 
  } 

  function getAuditData(address emailAddress) public constant returns(string[] data) {
    if (!hasEmailIntegrityData(emailAddress)) {
        revert(); 
    }
    var length = emailIntegrityStructs[emailAddress].length;
    string[] memory auditData = new string[](length - 1);
    for (uint i = 1; i < length ; i++) {
           auditData[i] = emailIntegrityStructs[emailAddress][i].data;
    }
    return auditData; 
  }

}
Run Code Online (Sandbox Code Playgroud)

Yil*_*maz 7

Solidity 和 Javascript 允许嵌套数组,但我们无法将嵌套动态数组从 Solidity 拉到 JavaScript 世界。

这是solidity和javascript之间桥梁的限制。由于 Solidity 内部的字符串表示为动态数组,因此我们无法传输字符串数组。

更新

从那时起,Solidity 不断发展,您可以返回包括结构的动态数组。测试合约:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract Test {
    struct User{
        string name;
        string LastName;
    }
    User[] public store;

    function addToStorage() external returns (User[] memory ) {
        User memory newUser=User(
            "yilmads","bin"
        );
        store.push(newUser);
        return store;
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*559 2

这对我来说编译得很好。

我添加了 Solidity 版本的定义MyStruct并将其升级到当前版本(尽管它pragma也可以与旧版本一起编译)。这是我通过Remix编译的代码:

pragma solidity ^0.4.19;

contract MyContract{
    struct MyStruct {
        uint256 foo;
    }
    mapping(address => MyStruct[])  myStruct;
}
Run Code Online (Sandbox Code Playgroud)

您使用的是旧版本的 Solidity 编译器吗?(这^0.4.6让我觉得也许你就是。)

你的是什么MyStruct?也许更有趣的结构会失败。一般来说,请尝试提供完整的代码示例来重现您所遇到的问题。