Если у меня есть два контракта, контракт A и контракт B. Как я могу изменить содержимое публично объявленных переменных состояния в контракте A из контракта B?
Не важно, что переменная public
. Это подразумевает многое, но не означает, что любой или любой контракт может прийти и перезаписать его.
contract A
придется взорвать функцию. contract B
потребуется знание этой функции, а также знание адреса контракта А. Это более чем один способ решения каждой из этих проблем. В качестве отправной точки рассмотрим.
В контракте A создайте функцию, которая фактически записывает в переменную состояния.
function setValue(uint newValue) public returns(bool success) {
someValue = newValue;
return true;
}
в контракте B.sol сообщить B об интерфейсе и расположении A и создать экземпляр.
contract AInterface {
function setValue(uint newValue) public returns(bool success);
}
contract B {
AInterface a;
function B(address addressContractA) public {
a = AInterface(addressContractA);
}
function setThatThing(uint newNumber) public returns(bool success) {
return a.setValue(newNumber);
}
}
Надеюсь, поможет.
NowsyMe
Роб Хитченс
public
делает несколько вещей, одна из которых является «бесплатным» геттером. Это не означает, что существует бесплатный сеттер. Эта удобная функция имеет смысл, потому что нет проблем с контролем доступа к функциям только для чтения ... все видно всем, поэтому имеет смысл сделать ее более удобной. У установщиков очень часто есть проблемы с контролем доступа, специфичные для случая использования, поэтому имеет смысл оставить автору право решать, что приемлемо.