Понимать различные типы видимости в функциях и переменных состояния
Язык 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 имеет несколько опций для определения уровней доступа к функциям смарт-контракта и переменным состояния.
В разработке блокчейна видимость и доступность не одно и то же. Мы можем ограничить доступ к функциям или переменным состояния, но его можно просмотреть снаружи.