Изменить содержимое переменной состояния в контракте A из контракта B

Если у меня есть два контракта, контракт A и контракт B. Как я могу изменить содержимое публично объявленных переменных состояния в контракте A из контракта B?

Ответы (1)

Не важно, что переменная 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);
  }
}

Надеюсь, поможет.

Привет, Роб, так что технически без интерфейса переменные состояния не могут быть перезаписаны внешними контрактами?
Верно. Нет. Внутреннее состояние контракта находится на 100% под контролем самого контракта, и никто этого не обходит. publicделает несколько вещей, одна из которых является «бесплатным» геттером. Это не означает, что существует бесплатный сеттер. Эта удобная функция имеет смысл, потому что нет проблем с контролем доступа к функциям только для чтения ... все видно всем, поэтому имеет смысл сделать ее более удобной. У установщиков очень часто есть проблемы с контролем доступа, специфичные для случая использования, поэтому имеет смысл оставить автору право решать, что приемлемо.