Solidity | все о функциях
Функции работают так же как и во всех других языках, но есть небольшие особенности, которые реализованы специально для solidity. Мы рассмотрим примеры и их виды.
Функции Paybale
Paybale это еще один модификатор о котором я не говорил. Он дает нам возможность работать с деньгами (принимать, отправлять).
Рассмотрим пример
Функция getMoney() помечена как payable, это означает, что она может принимать деньги (даже не надо ни чего писать в теле функции).
Далее простая функция getBalance(), которая возвращает баланс смарт контракта. address(this).balance говорит: дай адрес этого контракта (this показывает на смарт-контракт) и покажи баланс (это похоже на js).
Мы отправляем на наш контракт 10 эфира вызываем функцию getMoney(), и потом вызываем функцию getBalance() и можем увидеть, что на смарт контракт пришли наши деньги. Можно так же заметить, что на нашем аккаунте осталось 89.9999... из 100 ETH.
Рассмотрим еще один пример
Теперь у нас добавилась функция withdrawAllMoney(), которая дает нам возможность вывести все деньги из смарт контракта.
Метод transfer() как раз отвечает за это. Еще мы можем заметить, что появился какой то msg.sender.
msg - это так называемая глобальная переменная, которая содержит свойства, позволяющие получить доступ к блокчейну.
msg.sender это адрес, откуда пришел внешний вызов функции. Другими словами это просто наш адрес кошелька.
Теперь если вы отправите деньги на смарт контракт, и вызовите функцию withdrawAllMoney(), вы получите все деньги смарт-контракта себе на кошелек
receive()
Функция receive() это можно сказать наша функция getMoney(), она просто получает деньги, если нет ни каких аргументов. Обычно нашу функцию getMoney() используют, если у нас есть какие-то аргументы или условия, а receive() уже просто как функция "пожирания денег". Помечается всегда как external payable.
Constructor()
Constructor() - это функция, которая вызывается одни раз при деплое смарт-контракта. Обычно используется для установки каких-то данных, которые потом не будут уже никогда изменятся.
На скрине рассмотрен банальный пример установки овнера смарт-контракта. Ну тут прям хочется уже работать и рассматривать разные кейсы.
Рассмотрим пример
Теперь вытащить все деньги со смарт-контракта может только владелец. Когда мы вызываем функцию withdrawAllMoney() с другого адреса (не владельца смарт-контракта), то транзакция откатывается. Так же появился какой-то require(), но о нем позже. Скажу только то, что он работает как if else. То есть если функцию вызывает владелец, то все ок, иначе откатываем транзакцию с причиной "Not an owner!".
Рассмотрим последний пример
Что за смарт-контракт?
Контракт в котором все люди которые отправляют деньги на смарт-контракт становятся его ходерами. Если ты отправишь на смарт-контракт больше 90 эфира, то его владение переходит к тебе и ты соответственно можешь вывести все деньги.
Функции смарт-контракта
В конструкторе задаем владельца.
Есть mapping, где просто указываем сколько денег закинул тот или иной адрес на каш контракт.
Функция makeHolders() принимает деньги , если отправили меньше 6 эфира, то транзакция откатывается revert().
Так же число toEth - это чилсо, которое переводит нам наш эфир из wei в eth
( 1 wei = 10 ** 18 eth).
Если условие if не сработало, то переходим в elsе, где просто увеличиваем баланс нашего холдера.
Wei - это минимальная единица эфира, на ней обычно все считается в solidity, потому что solidity не поддерживает дробные числа, например 1.99999 eth получить (как переменную баланса например) мы не сможем, a 1999990000000000000 wei сможем. Ну а потом если друг нужно будет где то на фронтенде показать баланс, то легко можно все это дело перевести обратно в eth.
С функцией getBalance() вы знакомы
Функция withdrawAllMoney() была модифицирована. Добавил условие: если баланс холдера на смарт-контракте больше 90 eth, то назначаем его овнером. И соответственно он может забрать все деньги со смарт-контракта.
Как это работает
Деплою смарт-контракт и задаю владельца в конструкторе, потом просто передаю 30 eth на контракт, чтоб стать холдером.
P.S да баланс отображается в wei, можно это конвертировать в eth, но это можете доделать сами.
Далее я перехожу на другой адрес и передаю на контракт 96 эфира и становлюсь холдером контракта. Так же смотрю кто является владельцем смарт-контракта (адрес, оканчивающийся на 2148).
Здесь вызываю функцию вывода средств и проверяю владельца (адрес, оканчивающийся на 0225 стал владельцем т.e этот аккаунт).
Владелец контракта поменялся.
На этом я думаю можно закончить. Рассмотрели разные виды функций и поделали разные простенькие контрактики для ознакомления. Дальше больше.
tg: мой телеграмчик)