значение переменной состояния контракта солидности показывается странным при вызове из внешнего контраста - PullRequest
0 голосов
/ 12 октября 2018

Описание

Контракт A имеет переменную состояния owner, которая инициализируется скважиной до msg.sender.Но эта переменная owner стала 0x0 при вызове из другой функции контракта, которая берет адрес экземпляра контракта A и конвертирует в тип A.

Environment

  • Версия компилятора: 0.4.25
  • Framework / IDE: Remix
  • Среда выполнения EVM:
    Выберите «Javascript vm» на вкладке «Выполнение» Remix IDE;

Шаги для воспроизведения:шаг описан среди кода.

(код также доступен на 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();  
    }    
}

1 Ответ

0 голосов
/ 12 октября 2018

Ваша проблема не в EvilDoer, а в функции doSomething() в A.

Когда вы устанавливаете свои возвращаемые значения, вы присваиваете им значения string flag, address sender, address owner.Хотя это допустимое действие, вы непреднамеренно делаете перезапись переменной owner, которую вы определили выше.

Чтобы исправить это, измените имя owner в декларации возврата на что-то вроде _ownerчтобы не перезаписывать глобальную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...