Множественный массив [] вместе с обработкой сопоставления

Этот код работает, но когда один и тот же пользователь делает ставку, ставка заменяется первой ставкой, и событие дважды печатает одну и ту же запись.

Я хочу, чтобы один адрес сделал ставку, а для второго кода ставки записал обе его ставки вместе со своим адресом.

Пожалуйста, предложите исправление.

Спасибо

Мой код для контракта на торги:

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);
    }
  }
}
В чем смысл bidderAccts.push(_address) - 1???
Кстати, вы можете добавить входной аргумент в функцию allBidders, чтобы указать максимальное количество итераций. В противном случае в какой-то момент вы можете столкнуться со случаем, когда эта функция больше не может выполняться, поскольку она превышает размер блока.
Кроме того, вам нужно изменить bidStruct aна bidStruct storage a. Я не уверен, почему компилятор не предупредил вас об этом.
@goodvibration .push() -1возвращает строку. Он ничему не назначен, поэтому в данном случае бесполезен. Я себе подобрал из других примеров.

Ответы (1)

Все становится неловко, потому что структура хранилища не соответствует требованиям. Я провел рефакторинг со структурой хранения, которая соответствует описанным требованиям.

Это может быть больше похоже на то, что вы хотите. Нет гарантии.

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;
    }       

}

Я пришел к выводу, что более децентрализовано представление о том, что участники торгов сами объявляют свои ставки, поэтому setBidкритикую это с точки зрения того, кто msg.senderбудет участником торгов. Если вы имеете в виду более централизованную идею, и сервер будет обрабатывать ставки, то передайте, address bidderкак вы это делали, и используйте его вместо msg.sender.

Надеюсь, поможет.