Надежность: может ли родительский контракт видеть обновления данных из дочернего контракта? - PullRequest
1 голос
/ 12 апреля 2019

У меня преждевременная реализация игры Ethereum. Я разделил свой код на два контракта, отделяя «игровые» функции от функций, вызываемых администратором.

Admin.sol наследуется от Game.sol, как показано ниже. Объект структуры создается в Admin, но Game не видит его. (Функция Getter ничего не возвращает)

import "./Game.sol";

contract Admin is Game

Тот же код, если не разделен на два контракта, работает отлично.

Заголовок функции в Admin.sol, которая создает объект:

function createJob(string memory _jname, uint _reward, uint _application_period, uint _job_duration) public {

Заголовок функции получения в Game.sol:

function getJob(uint _jID) public view returns (string memory, uint, uint, uint, uint)

Что я получаю от получателя:

Результат {'0': '', '1':, '2':, '3':, '4':}

Что дает понять, что это просто показывает мне «пустое» пятно на карте.

Возможно ли, чтобы изменения данных, сделанные в Admin.sol, были видны Game.sol? Если да, то как это делается?

Спасибо за помощь.

1 Ответ

1 голос
/ 15 апреля 2019

Да, это возможно.Первое, что вы должны понять, это то, что SmartContract может получить доступ только к своему собственному хранилищу, выделенному в EVM, поэтому один smartcontract не может получить доступ к переменным другого SmartContract, пока они не наследуются.В вашем случае вы можете развертывать их по отдельности, и при обновлении значений вы используете разные экземпляры.

Что вам нужно сделать, это развернуть только один контрактный контракт с наследованием (в приведенном ниже примере - ContractB).Где, как вы можете использовать функцию родительского договора тоже.Вот пример

pragma solidity >=0.4.22 <0.6.0;

contract ContractA {

      int a;

      function setA(int _a)  public {
           a = _a;
      }
      function getA() view public returns(int){
           return a;
      }
}

Принимая во внимание, что Контракт B такой:

pragma solidity >=0.4.22 <0.6.0;
import"./ContractA.sol";

contract ContractB is ContractA {
       function getContractAvalue() pure public returns(int){
           // For reference that you can also access the function of ContractA in ContractB
           return ContractA.a;
       }
}

Так что, если вы развернете только контракт B, вы сможете получить доступ к функции Контракта A, например, с однимможет внести изменения, и он будет храниться в том же пространстве хранилища в EVM, к которому можно получить доступ с правильными значениями.

Вы также можете проверить его на ремиксе, просто развернув ContractB, и вы сможете увидеть функцииДоговор А.

...