繁体   English   中英

Solidity - 返回结构数组与 uint 数组

[英]Solidity - return struct array vs uint array

我只是在学习稳固性。 以前,solidity 不允许我们返回结构数组。 但是我们可以在较新的版本中做到这一点。 您更喜欢以下哪种架构来获取用户发布的帖子列表? (我想在客户端显示列表)

样本合同:

contract Post {
  // State variables
  uint256 private currentIndex = 0;

  /// ... another variables

  struct PostStruct {
    uint256 id;
    address user;
    string title;
    string body;
    string thumbnail;
    PostStatusEnum status;
    bool deleted;
  }

  PostStruct[] private posts;
  mapping(address => uint256[]) postIndexesByUser; // example: 0x01234 => [3, 5, 24, 112, 448]

  /// METHOD 1 OR METHOD 2 ?

}

方法一:

  /// @notice This function returns post by user address.
  /// @dev We will get _page and _perPage for pagination
  function getPostsByUser(
    address _user,
    uint256 _page,
    uint256 _perPage
  )
    external
    view
    onlyValidPostPage(_page)
    onlyValidPostPerPage(_perPage)
    returns (PostStruct[] memory)
  {
    uint256[] memory allPostIds = postIndexesByUser[_user];
    PostStruct[] memory result = new PostStruct[](_perPage);
    uint256 index = 0;

    require(
      _page * _perPage - _perPage < allPostIds.length,
      "There is no data to display."
    );

    for (uint256 i = _perPage * _page - _perPage; i < _perPage * _page; i++) {
      if (i < allPostIds.length) {
        result[index] = posts[allPostIds[i]];
        index++;
      }
    }
    return result;
  }

方法二: Just return the post IDs and then call the posts on the client side.

使用方法2。 尽量不要对合约代码进行大量计算,因为这会花费你大量的 gas 费用。 想象一下,您有 1000 个帖子,并且您必须为每次计算付费。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM