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