Чтение атрибутов или свойств из Контрактов

#solidity #truffle

Вопрос:

Допустим, в качестве примера у меня есть простой контракт:

 contract CryptoCharacters is ERC721Enumerable, Ownable {
  uint number;

  function setNumber(uint256 n) public { 
      number = n;
  }
}
 

Чтобы проверить это, я написал следующий тест:

   before(async function () {
        this.Chars = await ethers.getContractFactory("CryptoCharacters");
    });

    beforeEach(async function () {
        this._chars = await this.Chars.deploy()
        await this._chars.deployed()
        this.provider = ethers.getDefaultProvider();
    });

 it('test setting number', async function () {
        await this._chars.setNumber.call(OWNER_ADDRESS, 123);
        number = await this._chars.number      
        expect(number ).to.equal(123);
    });
 

Основная проблема заключается в том, что я не нашел способа прочитать свойство number из контраста без функции получения. Есть ли способ прочитать это свойство без функции получения ?

Что, если эта собственность-еще один контракт ? Могу ли я прочесть это так myInstance.subcontract.property ?

Спасибо за любую помощь !

Ответ №1:

Если вы создадите свойство public , оно будет доступно только для чтения для других контрактов и автономных приложений с помощью автоматически сгенерированной функции получения.

 uint public number;
 
 number = await this._chars.number()
 

Если свойство не является private таковым , дочерние контракты могут получить к нему доступ как для чтения, так и для записи.

 pragma solidity ^0.8;

contract Parent {
    // read-only for external contracts and off-chain apps
    // read-write for child contracts
    uint public number;
}

contract Child is Parent {
    function foo() public {
        number  ;
    }
}
 

Комментарии:

1. Будет ли это также работать для детских контрактов ? Допустим, у меня есть экземпляр контракта внутри моего контракта. Сработало бы это тоже ?

2. @GabrielSlomka Да. Если свойство не является private таковым , дочерние контракты могут получить к нему доступ как для чтения, так и для записи. Я отредактировал ответ и добавил пример. Описание см. в документах .