Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blockchain 从外部合同调用时,solidity合同状态变量值显示奇怪 描述_Blockchain_Ethereum_Solidity_Smartcontracts_Contract - Fatal编程技术网

Blockchain 从外部合同调用时,solidity合同状态变量值显示奇怪 描述

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()函数 设置返回值时,您将为它们分配值字符串标志、地址发送者、地址

合同A有一个状态变量
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();  
    }    
}