Multiple Array[] zusammen mit Mapping-Handling

Dieser Code wird ausgeführt, aber wenn derselbe Benutzer ein Gebot abgibt, wird das Gebot vom ersten Gebot ersetzt und das Ereignis druckt zweimal denselben Datensatz.

Ich möchte, dass eine Adresse ein Gebot abgibt und für seinen 2. Gebotscode beide Gebote zusammen mit seiner Adresse aufzeichnet.

Bitte schlagen Sie die Berichtigung vor.

Danke

Mein Code für den Bietervertrag:

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);
    }
  }
}
Was bedeutet bidderAccts.push(_address) - 1???
Übrigens möchten Sie vielleicht ein Eingabeargument in der Funktion hinzufügen allBidders, um die maximale Anzahl von Iterationen anzugeben. Sonst kommt man irgendwann in den Fall, dass diese Funktion nicht mehr ausgeführt werden kann, weil sie die Blockgröße überschreitet.
Außerdem müssen Sie zu bidStruct aändern bidStruct storage a. Ich bin mir nicht sicher, warum der Compiler Sie nicht davor gewarnt hat.
@goodvibration .push() -1gibt eine Zeile zurück. Es ist nichts zugewiesen, in diesem Fall also nutzlos. Ich stelle mir vor, von anderen Beispielen abgeholt.

Antworten (1)

Es wird heikel, weil die Speicherstruktur nicht den Anforderungen entspricht. Ich habe mit einer Speicherstruktur umgestaltet, die die beschriebenen Anforderungen widerspiegelt.

Dies könnte eher dem entsprechen, was Sie möchten. Keine Garantie.

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

}

Ich habe eine Urteilsentscheidung getroffen, dass es dezentraler ist, sich vorzustellen, dass die Bieter selbst ihr Gebot abgeben, also setBidgreift es aus der Perspektive an, msg.senderdie der Bieter sein wird. Wenn Sie eine zentralisiertere Idee im Sinn haben und ein Server die Gebote verarbeitet, dann übergeben Sie sie address bidderso wie Sie waren und verwenden Sie diese anstelle von msg.sender.

Ich hoffe es hilft.