Solidity | модификаторы и виды функций
Сегодня пойдет разговор о таких штуках как public или view. Я их писал в прошлых статьях, но ни когда не объяснял зачем и что они значат. Давайте сегодня и разберемся.
Модификаторы
Модификаторы - это, можно сказать, условие, которое должно провериться перед выполнением функции.
Public
Я не буду объяснять, что именно делается под капотом этого модификатора, потому что это довольно трудно для понимания. В общем этот модификатор дает нам возможность обращаться к функции как извне смарт-контракта, так и внутри смарт-контракта. Так же public могут быть переменные.
Private
Ну тут по названию понятно, что private не дает возможность считать функцию извне смарт-контракта, и переменные состояния видны только для контракта, в котором они определены. То есть только твой смарт-контракт может обратиться к этой функции. Так же private могут быть переменные, но это не означает, что другие люди не смогут узнать что там находиться, поэтому очень важную информацию лучше так не хранить.
Internal
Interanl похож на private, но с одним отличием: Функции помеченные как internal могут быть считаны из других смарт-контрактов, которые наследуют наш.
External
External дает нам возможность обращается к функции из других смарт-контрактов без наследования и так же, на пример из фронтенда, но внутри нашего смарт контракта мы не можем обратиться к этой функции. Это нужно только для экономии газа, если вы уверены, что эта функция нужна только для фронтенда например.
Pure
Pure - это вид функции (чистая), означает, что мы не обращаемся, не перезаписываем, не используем переменные, которые были сохранены в блокчейн (storage).
View
View - это вид функции, когда мы обращаемся к переменной из блокчейна, но ни как ее не изменяем.
Returns()
В solidity если вы хотите вернуть что-то из функции, обязательно нужно указать что вы хотите вернуть. То есть нужно в начале функции написать returns(тип данных) ( returns(uint) ), так же , если вам нужно вернуть не один тип данных, то можно это указать ( returns(uint, string, uint[]) ).
Memory и calldata
Memory и calldata - являются ключевыми словами, определяющими область типов данных, в которой хранится переменная. Сразу хочу сказать, что это нужно только в функциях.
Хочется так же уточнить, что memory или calldata мы можем использовать только для сложных типов данных, которые могут не уместиться в 256 бит (array, string, struct), такие как uint или address не требуют уточнения.
Memory
Memory - временное хранение значений, после завершения функции информация пропадает. Может быть объявлена как в теле, так и как аргумент функции,
еще данные типа memory можно изменить в теле функции.
Calldata
Calldata - это уже как бы место хранения данных, особенность в том, что calldata может быть объявлена только как аргумент и переменную нельзя будет изменить в теле функции. Плюс в том, что если вы знаете, что вы не будете изменять переменную, то можно не плохо выиграть по газу .
Теперь понятно зачем мы пишем public или view в наших функциях. Если что-то не понятно, то можете мне написать и уточнить. Дальше больше.