为什么事件中发出的发件人地址与存储中的发件人地址不同?

时间:2019-01-09 09:20:39

标签: solidity tron

通过事件发送的钱包地址与合同中存储的钱包地址不同

嗨,我有一个通过松露部署到开发网络的合同。 我触发如下函数:

    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事件。问题在于该事件的“用户”的值与存储在round.addresses中的msg.sender不同(存储在round.addresses中的值-已校正并且发出了一个值-错误)

2 个答案:

答案 0 :(得分:1)

如果您使用的是Metamask,请记住,它不会将设置为msg.sender的帐户切换为合同,它似乎使用第一个帐户(0)来签署每笔交易。

我们在一个学校项目中遇到了同样的问题。

答案 1 :(得分:1)

首先关于平台。它是tron而不是以太坊。可能在以太坊中没有这种问题。 所以我做了什么:

  1. 我不会在活动中传递地址。我将其保存在内部结构中
  2. 如果我确实在结构中传递了保存地址的索引
  3. 我编写了一个单独的方法,该方法通过其索引从内部结构返回地址(以及其他有用的信息)。

因此,通过使用此变通办法,我能够从合同中获取所需的信息。