Почему адрес отправителя, указанный в событии, отличается от сохраненного в хранилище? - PullRequest
0 голосов
/ 09 января 2019

Адрес кошелька, который отправляется через событие, отличается от того, который хранится в договоре

Привет, у меня есть контракт, который развернут в сети разработки через трюфель. Я запускаю функцию, которая выглядит так:

    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 ]

0 голосов
/ 16 января 2019

Прежде всего о платформе. Это был трон, а не эфир. Может быть в ethereum такой проблемы нет. Итак, что я сделал:

  1. Я не передаю адрес в событии. Я сохраняю это во внутренней структуре
  2. В случае если я передам индекс сохраненного адреса в структуре
  3. Я написал отдельный метод, который возвращает адрес (и другую полезную информацию) из внутренних структур по его индексу.

Таким образом, с помощью этого обходного пути я смог получить необходимую информацию из контракта.

0 голосов
/ 09 января 2019

Если вы используете Metamask, имейте в виду, что он не переключает учетную запись, установленную как msg.sender, в контракт, а использует первую учетную запись (0) для подписания каждой транзакции.

Мы столкнулись с той же проблемой во время школьного проекта.

...