此代码正在运行,但当同一个用户出价时,将从第一个出价中替换出价,事件将打印两次相同的记录。
我想要一个地址做一个出价,并为他的第二次投标代码记录,他的出价,连同他的地址。
请提出整改建议。
谢谢
我的投标合同代码:
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);
}
}
}发布于 2018-12-05 17:46:39
事情变得很尴尬,因为存储结构与需求不一致。我使用了反映所描述的需求的存储结构进行重构。
这可能更像你想要的。没有保修。
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。
希望能帮上忙。
https://ethereum.stackexchange.com/questions/63595
复制相似问题