如何可靠地返回结构数组?

Sur*_*hli 7 algorithm data-structures ethereum solidity smartcontracts

我正在为进行投标的以太坊智能合约设计解决方案。用例包括保留一个名称,例如。“myName”并分配给一个地址。然后,人们可以竞标该名称(在本例中为 myName)。对于多个名称,可能会发生多个这样的出价

struct Bid {
  address bidOwner;
  uint bidAmount;
  bytes32 nameEntity;
}

mapping(bytes32 => Bid[]) highestBidder;
Run Code Online (Sandbox Code Playgroud)

因此,正如您在上面看到的,Bid 结构保存一个投标人的数据,类似地,映射最高投标人中的键(例如 myName)指向一组此类投标人。

现在,当我尝试返回诸如 highBidder[myName] 之类的内容时,我遇到了问题

显然,solidity 不支持返回结构数组(动态数据)。我要么需要重新构建我的解决方案,要么找到一些解决方法来使其工作。

如果你们对这个问题有任何疑问,请告诉我,我会尽量说清楚。

我被困在这里任何帮助将不胜感激。

小智 8

返回 Solidity 中的结构数组?
在下面的函数getBid中返回 bid 结构数组。

contract BidHistory {
  struct Bid {
    address bidOwner;
    uint bidAmount;
    bytes32 nameEntity;
  }
  mapping (uint => Bid) public bids;
  uint public bidCount;

  constructor() public {
    bidCount = 0;
    storeBid("address0",0,0);
    storeBid("address1",1,1);
  }
  function storeBid(address memory _bidOwner, uint memory _bidAmount, bytes32 memory _nameEntity) public  {
    bids[tripcount] = Bid(_bidOwner, _bidAmount,_nameEntity);
    bidCount++;
  }
  //return Array of structure
  function getBid() public view returns (Bid[] memory){
      Bid[] memory lBids = new Bid[](tripcount);
      for (uint i = 0; i < bidCount; i++) {
          Bid storage lBid = bids[i];
          lBids[i] = lBid;
      }
      return lBids;
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

关于“返回结构数组”...只是一个小解决方法,以便返回从介质中提取的结构数组

pragma solidity ^0.4.13;

contract Project
{
    struct Person {
        address addr;
        uint funds;
    }

    Person[] people;

    function getPeople(uint[] indexes)
    public
    returns (address[], uint[]) {
        address[] memory addrs = new address[](indexes.length);
        uint[]    memory funds = new uint[](indexes.length);

        for (uint i = 0; i < indexes.length; i++) {
            Person storage person = people[indexes[i]];
            addrs[i] = person.addr;
            funds[i] = person.funds;
        }

        return (addrs, funds);
    }
}
Run Code Online (Sandbox Code Playgroud)

uint[] 索引参数应包含您要访问的索引。

最好的


Ada*_*nis 6

正如您所提到的,Solidity 尚不支持此功能。权力正在计划改变它以便你可以,但现在,你必须检索元素的数量,然后将分解的结构作为元组检索。

function getBidCount(bytes32 name) public constant returns (uint) {
    return highestBidder[name].length;
}

function getBid(bytes32 name, uint index) public constant returns (address, uint, bytes32) {
    Bid storage bid = highestBidder[name][index];

    return (bid.bidOwner, bid.bidAmount, bid.nameEntity);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编辑以解决有关storagevs 的评论中的问题memory

局部存储变量是指向状态变量的指针(它们总是在 中storage)。来自Solidity 文档

局部变量 x 的类型是 uint[] 存储,但由于存储不是动态分配的,因此必须从状态变量中分配它才能使用。因此,不会为 x 分配存储空间,而是仅用作存储中预先存在的变量的别名。

这是指一个示例,其中使用的变量是uint[] x。这同样适用于我的代码Bid bid。换句话说,没有创建新的存储。

在成本方面:

getBid("foo", 0)使用Bid memory bid

在此处输入图片说明

getBid("foo", 0)使用Bid storage bid

在此处输入图片说明

在这种情况下,storage更便宜。