首页 > 解决方案 > Solidity将项目添加到结构中的嵌套数组

问题描述

我正在尝试将一个项目添加到一个结构内的结构数组中。

这是我的合同的样子:

contract AuctionHouse {
  struct Bid {
    address bidder;
    uint256 amount;
    uint256 timestamp;
  }
  
  struct Auction {
    address seller;
    uint256 reservePrice;
    uint256 winnerBidAmount;
    address winnerBidBidder;
    
    Bid[] Bids;
  }
  
  function listItem (uint256 _tokenId) public returns (bool) {
    Bid[] memory emptyBids;

    auctions[_tokenId] = Auction({
      seller: msg.sender,
      reservePrice: _reservePrice,
      winningBidAmount: 0,
      winningBidBidder: address(0),
      bids: emptyBids
    });

    return true;
  }
  
  function bid (uint256 _tokenId, uint256 _amount) public returns (bool) {
    Auction currentAuction = auctions[_tokenId];
    
    uint256 newBidIndex = currentAuction.bids.length + 1;
    Bid newBid = currentAuction[newBidIndex];
    newBid.bidder = msg.sender;
    newBid.amount = msg.amount;
    newBid.timestamp = block.timestamp;

    currentAuction.winningBidAmount = msg.value;
    currentAuction.winningBidBidder = msg.sender;
    
    return true;
  }
}

但我得到了错误:

contracts/AuctinoHouse.sol:274:26: TypeError: Indexed expression has to be a type, mapping or array (is struct TripAuctionHouse.Auction storage pointer)
    Bid storage newBid = currentAuction[newBidIndex];

我还尝试在出价功能内部进行更改:

Auction currentAuction = auctions[_tokenId];

拥有storagememory并试图解决这个问题,但这会产生不同的错误。

这样做的正确方法是什么?

标签: structethereumsolidity

解决方案


你以错误的方式抓住了 newBid

Bid newBid = currentAuction[newBidIndex];

这将返回 Auction 结构,而不是 Bid

我替换了这样的代码:

function bid (uint256 _tokenId, uint256 _amount) public returns (bool) {
    Auction currentAuction = auctions[_tokenId];
    
    uint256 newBidIndex = currentAuction.bids.length + 1;
    Bid newBid = currentAuction.Bids[newBidIndex];
    newBid.bidder = msg.sender;
    newBid.amount = msg.amount;
    newBid.timestamp = block.timestamp;

    currentAuction.winningBidAmount = msg.value;
    currentAuction.winningBidBidder = msg.sender;
    
    return true;
  }

推荐阅读