blockchain - 从外部合约调用时,solidity 合约状态变量值显示奇怪

标签 blockchain ethereum solidity smartcontracts contract

描述

合约 A 有一个状态变量 owner ,它初始化为 msg.sender。 但是,当从另一个获取合约 A 实例地址并转换为 A 类型的合约函数调用时,这个 owner 变量变成了 0x0

环境

  • 编译器版本:0.4.25
  • 框架/IDE:Remix
  • EVM执行环境:
    在 Remix IDE 的“运行”选项卡上选择“Javascript vm”;

重现步骤:代码中描述了步骤。

(代码也可在 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();  
    }    
}

最佳答案

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

当您设置返回值时,您正在为它们分配值字符串标志、地址发件人、地址所有者。虽然这是一个有效的操作,但您无意中所做的是覆盖上面定义的 owner 变量。

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

关于blockchain - 从外部合约调用时,solidity 合约状态变量值显示奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52782475/

相关文章:

javascript - 为类似数据结构的区 block 链对象数组排序

blockchain - Hyperledger Fabric 对等体可以水平扩展吗?

ethereum - web3j - 带有字符串参数的事件的 TypeReference

ethereum - 坚固性修饰符

blockchain - 向 Solidity 结构添加一个新字段使以太坊合约停止工作

blockchain - 迁移耗尽气体

azure - 为 Azure Blockchain Workbench 部署智能合约时出错

javascript - 松露测试中的时间延迟

javascript - 使用web3部署智能合约不支持同步请求

solidity - 如何可靠地从我的契约(Contract)中提取所有代币