Почему адрес отправителя, указанный в событии, отличается от сохраненного в хранилище?
Адрес кошелька, который отправляется через событие, отличается от того, который хранится в контракте
Привет, у меня есть контракт, который развернут в сети разработки через трюфель. Я запускаю функцию, которая выглядит так:
struct Round {
bool isValue;
uint32 id;
RoundState state;
address[] addresses;
RoundBet[] bets;
mapping(address => bool) betUsers;
mapping(address => uint256) userBets;
uint256 winTicket;
uint256 amount;
uint256 lastTicket;
address winner;
}
.....
event roundBet(
address user,
uint256 amount,
uint256 start,
uint256 end
);
......
function test() payable public {
Round storage round = roundsHistory[currentRound];
require(round.isValue == true);
require(round.state == RoundState.started);
require(msg.value >= MIN_BET);
uint256 amount = msg.value - msg.value % MIN_STEP;
if(!round.betUsers[msg.sender]){
round.addresses.push(msg.sender);
round.betUsers[msg.sender] = true;
}
round.userBets[msg.sender] += amount;
uint256 sticket = round.lastTicket + 1;
uint256 eticket = sticket + amount;
uint256 length = round.bets.push(RoundBet(true, sticket, eticket, msg.sender, amount));
round.amount += amount;
round.lastTicket = eticket;
if(round.addresses.length == 2){
round.state = RoundState.running;
emit roundTimerStart(currentRound);
}
emit roundBet(msg.sender,amount, sticket, eticket);
}
Как вы можете видеть, я посылаю событие roundBet в конце вызова функции. Проблема в том, что значение "user" этого события отличается от msg.sender, который хранится в round.addresses(значения, хранящиеся в round.addresses - являются правильными, а выбрасываемые - неправильными)
2 ответа
Если вы используете Metamask, имейте в виду, что он не переключает учетную запись, установленную как msg.sender, на контракт, а использует первую учетную запись (0) для подписания каждой транзакции.
Мы столкнулись с той же проблемой во время школьного проекта.
Прежде всего о платформе. Это был трон, а не эфир. Может быть в ethereum такой проблемы нет. Итак, что я сделал:
- Я не передаю адрес в событии. Я сохраняю это во внутренней структуре
- В случае если я передам индекс сохраненного адреса в структуре
- Я написал отдельный метод, который возвращает адрес (и другую полезную информацию) из внутренних структур по его индексу.
Таким образом, используя этот обходной путь, я смог получить необходимую информацию из контракта.