【问题标题】:Why Sender address emitted in event differs from saved in storage?为什么事件中发出的发件人地址与存储中保存的地址不同?
【发布时间】:2019-01-09 09:20:39
【问题描述】:

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

您好,我有一个通过 truffle 部署到开发网络的合同。 我触发的函数如下所示:

    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 中的值是正确的,发出的值是错误的)

【问题讨论】:

    标签: solidity tron


    【解决方案1】:

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

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

    【讨论】:

    • 好的,但是 msg.sender 也不等于 account[0]。它只是某种以 0x 为前缀的随机数,例如我使用的所有帐户都以 0x4 开头,但 emit 返回的值以 0x9 开头并包含字符。
    • 我刚刚发现可能会从地址发出作物前 2 个字符
    • @1099511627776 是这样吗?
    • 您设法解决了这个问题吗?在这种情况下,您可能希望分享它并将其标记为其他遇到相同问题的人的答案。
    • 好吧,我没有设法直接解决它,但我找到了解决方法
    【解决方案2】:

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

    1. 我没有在事件中传递地址。我把它保存在内部结构中
    2. 如果我确实在结构中传递了保存地址的索引
    3. 我编写了一个单独的方法,通过索引从内部结构返回地址(和其他有用的信息)。

    因此,通过使用此解决方法,我能够从合同中获得所需的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 2012-03-25
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多