Понимать различные типы видимости в функциях и переменных состояния

Язык Solidity позволяет указывать доступность для контрактных функций и переменных состояния. Это позволит нам установить ограничения на построение смарт-контракта и на то, могут ли другие контракты или адреса получать доступ к данным.

Переменные состояния контракта и функции имеют небольшую разницу, которую мы собираемся проверить. Я хочу отметить, что доступность и видимость — разные вещи в контексте разработки блокчейна.

Видимость функции

Функции в смарт-контрактах могут иметь четыре уровня доступности.

Общественный

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

function publicFunction() public {
  publicInt += 1;
}

Внешний

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

function externalFunction() external {
  externalInt += 1;
}
function callExternalFunction() public {
  this.externalFunction();
}

Внутренний

Внутренние функции можно вызывать из того же смарт-контракта или любого другого, унаследованного от него.

function internalFunction() internal {
  internalInt += 1;
}

Частный

Частные функции не видны, и к ним нельзя получить доступ с других смарт-контрактов или адресов. Эти функции недоступны в контрактах, которые наследуют смарт-контракт, в котором эта функция определена.

function internalFunction() internal {
  internalInt += 1;
}

Видимость переменной состояния контракта

Переменные состояния смарт-контракта могут быть public, internal и private.

Общественный

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

contract Accessibility {
  uint public publicInt;
}
// can get and set from other smart contracts
contract AccessPublic {
  Accessibility accessibility = new Accessibility();
  function accessPublicInt() public view returns(uint) {
    uint publicInt = accessibility.publicInt();
    return publicInt;
  }
}

Внутренний

Как и в случае с функциями, к internal переменным состояния можно получить доступ из контракта, в котором они определены, или любого другого, наследуемого от смарт-контракта. Важно отметить, что переменные состояния смарт-контракта по умолчанию имеют значение internal.

uint internal internalInt;

Частный

Переменная состояния private имеет те же характеристики, что и функции. Доступ к нему можно получить только в рамках того же контракта, а не каких-либо других контрактов.

uint private privateInt;

Видимость и доступность

В разработке блокчейна видимость и доступность имеют разные значения.

Все внутри смарт-контракта может быть видно, потому что все транзакции открыты в реестре, который может видеть каждый.

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

TL;DR

Язык программирования Solidity имеет несколько опций для определения уровней доступа к функциям смарт-контракта и переменным состояния.

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

Ссылки