Blockchain 从外部合同调用时,solidity合同状态变量值显示奇怪 描述
合同A有一个状态变量Blockchain 从外部合同调用时,solidity合同状态变量值显示奇怪 描述,blockchain,ethereum,solidity,smartcontracts,contract,Blockchain,Ethereum,Solidity,Smartcontracts,Contract,合同A有一个状态变量owner,它初始化为msg.sender。 但当从另一个契约函数调用此owner变量时,该变量变为0x0,该函数获取契约A实例的地址并转换为类型 环境 编译器版本:0.4.25 框架/IDE:混音 EVM执行环境: 在RemixIDE的运行选项卡上选择“JavaScriptVM” 复制步骤:代码中描述了步骤。 (代码也可从以下网址获得) 您的问题不在于EvilDoer,而在于A中的doSomething()函数 设置返回值时,您将为它们分配值字符串标志、地址发送者、地址
owner
,它初始化为msg.sender
。
但当从另一个契约函数调用此owner
变量时,该变量变为0x0
,该函数获取契约A实例的地址并转换为类型
环境
- 编译器版本:0.4.25
- 框架/IDE:混音
- EVM执行环境:
在RemixIDE的运行选项卡上选择“JavaScriptVM”李>
您的问题不在于
EvilDoer
,而在于A
中的doSomething()
函数
设置返回值时,您将为它们分配值字符串标志、地址发送者、地址所有者
。虽然这是一个有效的操作,但您无意中所做的是覆盖您上面定义的owner
变量
要解决此问题,请将您的返回声明中的
所有者
的名称更改为类似于\u owner
的名称,这样您就不会覆盖全局变量。谢谢,您救了我,尽管这只是一个家庭练习。这真的是一个陷阱,我认为在使用solidity时会有很多陷阱,很多程序员可能会遇到。solidity对于主流编程语言来说太奇怪了,我就是不喜欢它。
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();
}
}