【问题标题】:solidity contract state variable value show strange when invoke from external contrace从外部合约调用时,solidity 合约状态变量值显示奇怪
【发布时间】: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


    【解决方案1】:

    您的问题不在于EvilDoer,而在于A 中的doSomething() 函数。

    当您设置返回值时,您正在为它们分配值string flag, address sender, address owner。虽然这是一个有效的操作,但您无意中所做的是覆盖了您在上面定义的 owner 变量。

    要解决此问题,请将返回声明中的 owner 名称更改为 _owner 之类的名称,以免覆盖全局变量。

    【讨论】:

    • 谢谢,你救了我,虽然这只是一个家庭练习。这确实是一个陷阱,我认为在使用solidity 时有很多陷阱,许多程序员可能会遇到。
    • Soliity 在主流编程语言中是如此陌生,我就是不喜欢它。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2021-12-26
    • 2021-09-11
    • 2022-07-09
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多