【发布时间】:2018-10-12 15:14:06
【问题描述】:
说明
合约 A 有一个状态变量 owner ,它很好地初始化为 msg.sender。
但是这个owner变量在从另一个合约函数调用时变成了0x0,该函数获取合约A实例的地址并转换为A类型。
环境
- 编译器版本:0.4.25
- 框架/IDE:混音
- EVM 执行环境:
在 Remix IDE 的运行选项卡上选择“Javascript vm”;
Steps to Reproduce:步骤在代码中描述。
(代码也可在https://github.com/ethereum/solidity/issues/5210 获得)
pragma solidity 0.4.25;
contract A{
address public owner;
event Ret(string flag, address sender, address owner);
event ConstrutEvt(string flag, address owner );
function A() public{
owner = msg.sender;
emit ConstrutEvt("A", msg.sender);
}
function doSomething() public view returns(string flag, address sender, address owner){
emit Ret("A::doSomething", msg.sender, owner);
return ("A::doSomething", msg.sender, owner);
}
}
contract EvilDoer{
// step1: deploy contract A on remix IDE.
// and the log show `owner` is a valid address value.
// step2: deploy contract EvilDoer.
// step3: on remix IDE run tab, invoke doSomething() use the contract A address as argument.
// This time the log show that 'owner' is zero. Why ?
function doSomethingEvil(address instanceAddrOfA) public {
A contractA = A(instanceAddrOfA);
contractA.doSomething();
}
}
【问题讨论】:
标签: blockchain ethereum solidity smartcontracts contract