简体   繁体   English

在传递给另一个合约作为参数时,msg.sender地址是否已更改?

[英]Is the msg.sender address changed while passing to another contract as a parameter?

I'm here to ask my problem on solidity code. 我是在这里问我关于统一代码的问题。

Here is simple example code. 这是简单的示例代码。 Contract 'Map' has a mapped data. 合同“地图”具有映射的数据。 It has each address's T/F values. 它具有每个地址的T / F值。 I created an account X and add it to 'simpleMap' . 我创建了一个帐户X并将其添加到'simpleMap'

Contract 'Ask' lookup mapping data through 'Map' contract. 通过“地图”合约进行合约“询问”查找映射数据。 What I expected result when X called askMe() was TRUE but it was always FALSE . X调用askMe()时,我期望的结果是TRUE但始终为FALSE

When I called whoIsMsgSender it returns the exact X 's account. 当我调用whoIsMsgSender它将返回确切的X帐户。 What's the problem?? 有什么问题??

pragma solidity ^0.4.24;

contract Map {
    mapping (address => bool) simpleMap;

    function add(address _address) external {
        simpleMap[_address] = true;
    }

    function isTrue(address _address) external view returns (bool _ret) {
        return simpleMap[_address];
    }
}

contract Ask {
    Map public map = Map(Map's address like 0x~~ just for test);
    function askMe() external view returns (bool _ret) {
        return map.isTrue(msg.sender);
    }

    function whoIsMsgSender() external view returns (address _address) {
        return msg.sender;
    }
}

I tried your contracts in Remix, but askMe() returned true for me. 我在Remix中尝试了您的合同,但是askMe()为我返回了true。 How are you separating the two contracts? 您如何分开这两个合同? Maybe Map is not yet deployed before Ask is trying to call a function on it. 也许在Ask尝试在其上调用函数之前尚未部署Map。 I separated the two contracts: 我分开了两个合同:

pragma solidity ^0.4.24;

contract Map {
    mapping (address => bool) simpleMap;

    function add(address _address) external {
        simpleMap[_address] = true;
    }

    function isTrue(address _address) external view returns (bool _ret) {
        return simpleMap[_address];
    }
}


pragma solidity ^0.4.24;

contract Map { function isTrue(address _address) external view returns (bool _ret); }

contract Ask {
    Map public map = Map(MAP_ADDRESS);
    function askMe() external view returns (bool _ret) {
        return map.isTrue(msg.sender);
    }

    function whoIsMsgSender() external view returns (address _address) {
        return msg.sender;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 检查 msg.sender 是否是特定类型的合约 - Check if msg.sender is a specific type of contract Solidity:从另一个具有相同 msg.sender 的合约调用合约函数 - solidity: call contract function from another contract with the same msg.sender 为什么msg.sender具有已部署合同的帐户的地址(而不是与之交互的帐户的地址)? - Why msg.sender has the address of the account which has deployed the contract (and not the one's which interacts with it)? 是否可以使用其存储但传递 msg.sender 来可靠地调用合约? - Is it possible to call a contract in solidity, using its storage but passing along msg.sender? 无法从智能合约向 msg.sender 发送以太币 - Not able to send ether to msg.sender from smart contract 下面代码中的 msg.sender 和 address(this) 有什么区别? - what is the differnce between msg.sender and address(this) in below code? 如何在不使用设置 msg.value 的情况下将资金从 msg.sender(amount) 转移到收件人地址 - how to transfer fund from msg.sender(amount) to recipient address without using setting msg.value msg.sender 在solidity中有什么用? - What is the use of msg.sender in solidity? 如果我将地址作为参数传递,为什么我需要在 function 中使用`msg.sender`? - Why do I need to use `msg.sender` in my function if I pass an address as an argument? Solidity 基础知识:“msg.sender”代表什么 - Solidity basics: what "msg.sender" stands for
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM