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);
}
}
}
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 setBid
greift es aus der Perspektive an, msg.sender
die der Bieter sein wird. Wenn Sie eine zentralisiertere Idee im Sinn haben und ein Server die Gebote verarbeitet, dann übergeben Sie sie address bidder
so wie Sie waren und verwenden Sie diese anstelle von msg.sender
.
Ich hoffe es hilft.
gute Stimmung
bidderAccts.push(_address) - 1
???gute Stimmung
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.gute Stimmung
bidStruct a
ändernbidStruct storage a
. Ich bin mir nicht sicher, warum der Compiler Sie nicht davor gewarnt hat.Rob Hitchens
.push() -1
gibt eine Zeile zurück. Es ist nichts zugewiesen, in diesem Fall also nutzlos. Ich stelle mir vor, von anderen Beispielen abgeholt.