• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Yчимся создавать смарт-контракты Ethereum на Solidity с самого начала и пока смерть не разлучит нас / #2

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
И снова доброго дня!
Сегодня, продолжая изучение "умных договоров" Ethereum мы узнаем еще немного обязательной теории - без которой ну вообще никуда, я пробовал - не пошло. Ну и конечно же закрепим полученный материал практикой. Поэтому запасаемся сухариками / семечками / пивасиком или как кому по кайфу и поехали Господа!
Для начала создадим в кошельке MetaMask учетнe. записью с внешним владельцем (англ. externally owned account или ЕОА) Думаю это не трудно и картинки прикреплять не надо. Но, как вы уже могли догадаться, это не единственный тип учетных записей. Альтернативой служат учетные записи контрактов. В отличие от обычных ЕОА, они содержат код смарт-контрактов. Кроме того, у учетных записей контрактов нет приватного ключа. Их владение (и управление ими) определяется логикой смарт-контрактов - программой, записанной на блокчейн Ethereum в момент создания учетной записи контракта и выполняемой машиной EVM.
Точно так же, как и у ЕОА, у контрактов есть адреса, они могут отправлять и принимать эфир. Но когда контракт выступает адресатом транзакции, он выполняется в EVM и использует ее данные в качестве ввода. Помимо эфира транзакции могут содержать информацию, определяющую то, какую именно функцию контракта следует запустить и какие параметры ей будут переданы. Это позволяет транзакциям вызывать функции внутри контрактов. Стоит отметить, что ввиду отсутствия приватного ключа учетная запись контракта неспособна инициировать транзакцию. Это может сделать только ЕОА.
Сейчас, при написании нашего первого смарт-контракта мы будем использовать тестовую локальную сеть Ropsten, которую вы увидите при первом знакомстве с МетаМаском. Не бойтесь что что то не получится и бы отправите все свои кровные дядушке Сэму - нет, при регистрации можно получить бесплатный "пробный" эфир - который не имеет никакой реальной стоймости, а создан лишь для того чтоб вы поняли как работает сеть, контракты и прочие тонкости, которые мы обязателно разберем в этой и последующей статьях.
Первым делом нужно пополнить ваш кошелек. Вы будете делать это не в мейннете, поскольку настоящий эфир стоит «настоящих» денег и для работы с ним необходимо получить чуть больше опыта. Сейчас вы пополните свой кошелек эфиром из тестнета.
Переключите MetaMask на тестовую сеть Ropsten. Нажмите кнопку Buy (Купить) и затем щелкните по Ropsten Test Faucet. MetaMask откроет новую веб-страницу.
Нажмите зеленую кнопку Request 1 ether from faucet (Запросить 1 эфир у fauset). В нижней части страницы появится идентификатор транзакции. Демонстрационное приложение создало транзакцию, то есть послало вам платеж.
Идентификатор выглядит следующим образом:
Код:
O x 7grr56ssnjloc7ad5aaea6474adccfбf5c5dбabedllb70a350fcбf9590109680

В течение нескольких секунд майнеры Ropsten сгенерируют новую транзакцию, и ваш кошелек MetaMask покажет баланс в размере 1 ЕТ Н. Щелкните по идентификатору транзакции, чтобы открыть обозреватель блоков - веб-сайт, позволяющий визуализировать и исследовать блоки, адреса и транзакции. MetaMask использует для этого Etherscan, один из самых популярных обозревателей блоков для Ethereum.
Можете немного поиграться с переводами эфира только помните, что больше 1 перевести не сможите - за газ то кто будет платить?)
Наигрались - отлично поехали контрактить. Начнем с самог опростого - мы напишем контракт для управления fаuсеt.

Код:
contract Faucet {
    function withdraw (uint withdraw_ amount ) puЫic {
        require (withdraw_amount < = 100000000000000000);
        msg.sender.transfer (withdraw_amount);
    function() public payable{}

Надеюсь тут понятно что открытие контракта в Solidity на чинается со слова contract, обьявление функций - function, withdraw - название функции, uint - беззнаковое целое число, public - объявляет функцию публичной. Require - встроенная функция в Solidity, прозволяющая проверять соответствие withdraw_amount - этой цифре с большими нулями, которое является 100 000 000 000 000 000 wei». Wei является наименьшей деноминацией эфира, а сама сумма равна О,1 эфира. Если условие False - функция вызовет исключение и дропнет транзакцию.
Эта часть контракта является основной логикой нашего faucet. Он контролирует вывод средств из контракта, устанавливая лимит на снятие. Это очень простое ограничение, но оно может дать вам представление о возможностях программируемого блокчейна: децентрализованное ПО для управления деньгами.

Дальше идет сам вывод:
Код:
msg.sender.transfer( withdraw_amount ) ;
Здесь есть несколько интересных моментов. Объект msg является одним из входящих параметров, доступ к которым имеют все контракты. Он представляет транзакцию, которая инициировала выполнениеэтого контракта. Атрибут sender содержит адрес отправителя для данной транзакции. Встроенная в язык функция transfеr передает эфир из текущего контракта по адресу отправителя. Если читать справа налево, это означает передачу [средств] отправителю сообщения, который инициировал выполнение контракта. Функция transfer принимает сумму в качестве единственного аргумента. Мы передадим ей значение withdraw_amount, которое параметром функции withdraw, объявленной несколькими строчками выше. Сразу за этим идет закрывающая фигурная скобка, которая указывает на завершение определения функции withdraw.
Далее мы прописываем еще одну функцию:
Код:
function ( ) puЬlic рауаЫе { }

Это так называемая резервная функция (или функция по умолчанию), которая вызывается в случае, когда транзакция, инициировавшая контракт, не указала ни одной из объявленных в нем функций (или вообще никакой) или не содержала никаких данных. Контракты могут содержать только одну функцию по умолчанию (без имени), и обычно именно она получает эфир. В связи сэтим она определяется как публичная (puЬlic) и оплачиваемая (рауаЫе); это означает, что она может принимать эфир в контракт. Помимо этого она больше ничего не делает, как можно понять по пустым фигурным скобкам ( { } ). Если мы выполним транзакцию, которая отправляет эфир по адресу контракта (как будто это кошелек), эта функция его примет. Сразу за функцией по умолчанию идет последняя закрывающая фигурная скобка, которая завершает определение контракта Faucet.

Вот и все!
Надеюсь найти компилятор Remix для Solidity, скачать и установить его не доставит вам большего труда чем понять этот мини смарт-контракт, который мы выше рассмотрели.

Что ж, у нас есть контракт. Мы скомпилировали его в байт-код. Теперь нам нужно «зарегистрировать» его в блокчейне Ethereum. Для проверки контракта мы
будем использовать тестнет Ropsten, поэтому нам нужно выбрать соответствующий блокчейн для его использования.
Регистрация контракта в блокчейне подразумевает создание специальной транзакции с конечным адресом О х ОО00О00О000000000000000ООО00О00000000000 , известным также как нулевой. Этот адрес говорит блокчейну Ethereum о том, что вы хотите зарегистрировать контракт. К счастью, Remix IDE сделает все это за вас и отправит транзакцию в MetaMask.

Для начала перейдите во вкладку Run и выберите пункт Injected Web3 в раскрывающемся списке Environment (Окружение). Это позволит Remix IDE подключиться к кошельку MetaMask, а через него и к тестнету Ropsten. Сделав это, вы увидите Ropsten в списке Environment (Окружение). Кроме того, в раскрывающемся списке Account будет показан адрес вашего кошелька.
Под настройками запуска, которые вы только что подтвердили, находится контракт Faucet, готовый к созданию. Нажмите кнопку Deploy (Remix сформирует специальную транзакцию «создания», а MetaMask попросит вас ее подтвердить. Вы можете заметить, транзакция не содержит эфир, но содержит в себе 258 байт данных (скомпилированный контракт) и потратила газ в размере 10 gigawei. Нажмите Submit (Отправить), чтобы ее подтвердить.


Оставьте окно Remix открытым - мы вернемся к нему позже. Теперь откройте в своем браузере страницу ropsten.etherscan.io и вставьте адрес в поисковую строку. На экране должна появиться история адреса контракта. Пошлите тестовый эфир на адрес своего контракта в REMIX - поздравляю вы пополнили свой баланс с помощью смарт контракта.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх