Опубликован: 28.01.2018 | Уровень: для всех | Доступ: платный
Лекция 4:

Обзор всех аспектов среды Solidity. Среда разработки Ethereum, Web3 и Truffle

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >
Ключевые слова: приложение, надежность, доступ, операции, адрес, запрос, права, язык программирования, управление учетными записями, функция, служебное слово, фигурные скобки, компиляция, отладка, ПО, значение, переменная, конструктор, множественное наследование, наследование, конструирование, браузер, объект, пользователь, отправитель сообщения, очередь, аргумент, вызов функции, CAT, тело функции, параметр, INSERT, компилятор, contract, AND, пользовательский тип, ложь, целый, бит, поддержка, код возврата, список, хранение данных, ссылка, массив, команда, тип массива, push, INDEX, числовой тип, ассоциация, истина, send, указатель, recipient, MIX, механизмы, сценарий, транзакция, среда разработки, Размещение, файл, коды операций, Java, ассемблер, RPC, HTML, HTTP, программа, ABI, исполнение, интерфейс, JSON, входной параметр, байт, запуск, идентификатор, запись, дополнительный код, консоль, Web, номер порта, пароль, домен, порт, конфигурация, контроллер, путь, отображение, веб-страница, поле, интеграция, объединение, определение, локальный хост, build, сборка, require, менеджер, модуль, controller, якорь, контент, app

Обсудим, какое распределенное приложение нам предстоит создать

Этот раздел полностью посвящен изучению среды программирования Solidity. Однако перед тем, как погрузимся в ее изучение, давайте поговорим о том, какого рода распределенное приложение нам предстоит написать. В ходе этого курса будем создавать распределенный веб-кошелек с высокой степенью надежности. Его надежность обеспечена самой структурой блокчейна. Распределенность же означает, что к кошельку возможен доступ нескольких пользователей, однако распоряжаться хранящимися в кошельке средствами можно только при наличии соответствующего доступа.

Как же работает распределенный кошелек? У такого кошелька есть некоторый баланс, и несколько пользователей могут подключаться к нему и отправлять средства на другие счета. Эти операции отслеживаются через транзакции в блокчейне. Рассмотрим подробнее на примере. В нашем кошельке пять тысяч единиц эфира, и адрес 0xdeadbeef1 отправляет запрос на перевод одной тысячи единиц эфира на другой адрес 0xdeadbeef2. Кошелек должен будет проверить, что отправитель уполномочен распоряжаться хранящимся в кошельке эфиром. Если такие права есть, то на адрес 0xdeadbeef2 отправится перевод тысячи единиц эфира. Кроме того, это событие будет зарегистрировано, о транзакции будет составлен отчет.

Для программирования данного примера в блокчейне будем использовать язык программирования высокого уровня Solidity. Solidity очень похож на JavaScript, но есть и различия. То, что в других языках называется классами, в среде Ethereum называется контрактами. Контракт может состоять из нескольких функций. Еще есть события, описывающие историю работы распределенного приложения, а также другие структуры, такие как библиотеки. Наш сравнительно простой распределенный веб-кошелек будет состоять из нескольких функций. Две функции будут реализовывать управление учетными записями пользователей - одна позволит добавлять адреса, уполномоченные распоряжаться эфиром в кошельке, а другая - отзывать доступ к кошельку. Специальная функция будет позволять отправлять эфир из кошелька другим пользователям сети; кроме того, должен быть и способ получать эфир, это будет реализовано так называемой функцией запасания эфира. Еще кошелек будет регистрировать и отправлять события трех видов. Одно событие будет срабатывать при отправке эфира, второе - при редактировании авторизованного на распоряжение эфиром адреса, а третье - при отзыве у такого адреса прав. Следующие лекции будут посвящены освоению среды Solidity для написания этих функций и событий.

Классы контрактов, функций и условий

В этой лекции будут раскрыты следующие вопросы: как создавать простые контракты, как выглядят структура и функции контракта, а также как использовать условия в среде Solidity. Начнем с простого контракта. Понятие контракта в среде Solidity похоже на понятие класса в других языках программирования. Контракт задается словом contract, а затем ему необходимо дать имя. Пусть это будет SimpleDapp. Итак, структура простого контракта - это имя, служебное слово contract, и логика контракта, заключенная в фигурные скобки.


Обратите внимание, что в этом же файле хранится еще один контракт.


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


Добавим в наше приложение переменную типа uint. Подробнее о типах переменных будет рассказано в другой лекции.


Если обратить внимание на раздел создания контракта в правой части браузера, можно заметить, что доступ к некоторым переменным по умолчанию ограничен. Чтобы взаимодействовать с этими переменными из других контрактов, необходимо задать ряд функций. Попробуем скомпилировать наш простой контракт и вставить его на вкладке Functions.


Создадим две функции для работы с этой переменной. В среде Solidity одни функции могут возвращать некоторые значения, а другие - нет. Зададим переменную someVar. Она будет брать значение другой переменной myVar. Еще потребуется функция, возвращающая значение someVar.


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

Посмотрим внимательнее, как работает приложение SimpleDapp. Сейчас функция getSomeVar возвращает наше число. По умолчанию эта переменная равна нулю.


В среде Solidity переменные инициализировать не нужно, некоторые значения им заданы по умолчанию. Теперь попробуем задать этой переменной другое значение, например, 4. getSomeVar теперь возвращает четыре.


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


В среде Solidity содержимое контракта может обращаться к другому контракту. Давайте создадим контракт SomeOtherSimpleDapp, который будет возвращать значение someVar из контракта SimpleDapp.

Конструктор в среде Solidity работает примерно так же, как и любой другой конструктор. Он будет вызываться, когда контракт создается, а его функция называется так же, как и сам контракт. Вот простой конструктор для контракта SomeOtherSimpleDapp. Поработаем с контрактом SimpleDapp. Создадим переменную типа SimpleDapp, чтобы при ее инициализации во время создания контракта она сразу получила тип SimpleDapp. Это будет работать, если напрямую указать адрес контракта, являющегося источником типа. Можем создать еще одну копию SimpleDapp.


Посмотрим, как можно взаимодействовать с контрактом. В случае с первым контрактом SimpleDapp имеем дело со ссылкой на контракт, созданный выше. Как же это работает? Мы создали контракт SimpleDapp. У него есть некоторый адрес. Сейчас функция getSomeVar возвращает ноль, поскольку мы не указали конкретный адрес.


Скопируем адрес и создадим OtherSimpleDapp.


В контракте OtherSimpleDapp пока нет настоящих функций.


Давайте напишем пару функций для демонстрации работы ссылок. Одна возвращает getSomeVar из контракта SimpleDapp, что является ссылкой на у копию SimpleDapp. Другая возвращает getSomeVar из новой копии SimpleDapp.


Создадим SimpleDapp еще раз. Теперь изменим значение someVar в первом контракте SimpleDapp, пусть это будет шестнадцать. Видно, что функция getSomeVar из первой копии контракта возвращает шестнадцать. Функция GetSimpleDappSomeVar из другого контракта, ссылающегося на контракт выше, тоже возвращает шестнадцать, поскольку является ссылкой на ранее созданный контракт.


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


Рассмотрим другой пример. Создадим новый контракт и новую переменную.


А теперь применим условие и вернем какое-нибудь значение для случаев, когда значение переменной равно двум, меньше двух или больше двух. Для ввода этого условия пригодится служебное слово if. Создадим еще одну функцию для установки значения переменной. Теперь создадим контракт.


Изначально переменная someVar имеет значение ноль, что, конечно, меньше двух. Изменим значение на четыре.


Теперь функция getMyVariable возвращает "greater than two", как и должно быть.


Изменим значение someVar на два. Теперь getMyVariable возвращает "is exactly two".


Можно задавать функции, которые будут возвращать больше одной переменной. Функция getMyVar возвращает две переменных: строку и переменную someVar.


Помимо условной функции if, в среде Solidity есть и другие составные структуры, например, else, while, for, break, continue, return и short if. Чтобы узнать больше о структурах контроля, рекомендуется ознакомиться с документацией Solidity на http://solidity.readthedocs.io. Там хранится огромное число примеров и вариантов применения среды Solidity.


< Лекция 3 || Лекция 4: 123456 || Лекция 5 >
Алексей Миронов
Алексей Миронов

Здравствуйте, сколько стоит курс Работа с Ethereum?

Сергей Домников
Сергей Домников
Россия
Светлана Пузына
Светлана Пузына
Россия, г. Москва