首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个Array[]与映射处理

多个Array[]与映射处理
EN

Ethereum用户
提问于 2018-12-05 10:28:38
回答 1查看 91关注 0票数 1

此代码正在运行,但当同一个用户出价时,将从第一个出价中替换出价,事件将打印两次相同的记录。

我想要一个地址做一个出价,并为他的第二次投标代码记录,他的出价,连同他的地址。

请提出整改建议。

谢谢

我的投标合同代码:

代码语言:javascript
复制
pragma solidity ^0.4.25;

contract bidding {
  address[] private bidderAccts;

  struct bidStruct {
    uint  bid;
  }
  mapping (address => bidStruct) biddersMap;

  event totalAccounts(address, uint );

  function setBidders(address _address , uint _bid)  public {
    bidStruct a = biddersMap[_address];
    a.bid = _bid;
    bidderAccts.push(_address) - 1 ;
  }

  function getBidders(address _address) view public returns(uint) {
    return biddersMap[_address].bid;
  }

  function countBidders() view public returns (uint) {
    return bidderAccts.length;
  }

  function allBidders() public  {
    for (uint i = 0; i < bidderAccts.length; i++) {
      emit totalAccounts(bidderAccts[i],biddersMap[bidderAccts[i]].bid);
    }
  }
}
EN

回答 1

Ethereum用户

发布于 2018-12-05 17:46:39

事情变得很尴尬,因为存储结构与需求不一致。我使用了反映所描述的需求的存储结构进行重构。

这可能更像你想要的。没有保修。

代码语言:javascript
复制
pragma solidity ^0.4.25;

contract bidding {

    address[] public bidderAccts;

    // For each address, there are 0-n bids
    mapping (address => uint[]) public bids;

    event LogNewBidder(address newBidder);
    event LogNewBid(address bidder, uint bid);

    function isBidder(address bidder) public view returns(bool isIndeed) {
        // has bid before
        return bids[bidder].length > 0;
    }

    function upsertBidder(address bidder) public {
        if(!isBidder(bidder)) {
            bidderAccts.push(bidder);
            emit LogNewBidder(bidder);
        }
    }

    function setBid(uint bid)  public {
            // there is no known rule about minimum bid, but let's say 0 is too low.
            require(bid > 0);
            upsertBidder(msg.sender);
            bids[msg.sender].push(bid);
            emit LogNewBid(msg.sender, bid);
    }

     function getUniqueBidderCount() view public returns (uint) {
        return bidderAccts.length;
    }       

}

我做出了一个判断决定,即设想投标人自己宣布出价更为分散,因此setBidmsg.sender将是投标人的角度对其进行攻击。如果你有一个更集中的想法和服务器将处理投标,然后传递给你的address bidder,并使用它代替msg.sender

希望能帮上忙。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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