#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
таковым , дочерние контракты могут получить к нему доступ как для чтения, так и для записи. Я отредактировал ответ и добавил пример. Описание см. в документах .