Язык Solidity: Неllo World (Урок 1)

Язык Solidity. Урок 1. Основные принципы и пишем Неllo World



Вступление

Все мы жители блокчейна, а значит храним свои данные в распределенной базе и используем токены. Иногда мы меняем токены на другие на биржах, обычно bitcoin. Но можно и на другие. Один из них ETH блокчейн-платформы Ethereum, которая предоставляет возможность использования смарт-контрактов, о них мы и поговорим.

От автора

Помню были времена в конце 2015-года курс ETH составлял примерно доллар-два за токен. Тогда у меня была возможность купить штучек так 300-400. Но я как и полагается программисту в вязаной шапке, отращивающему бороду, на новый год потратил все на пивко и кальмаров (которые в итоге ел кот). В то время, хоть я и понимал перспективы, меня интересовали не инвестирование, а сама технология. Я загрузил блокчейн Ethereum запустил на компе JSON-RPC и вечерами проводили всяческие эксперементы. Кстати говоря мне эти знания помогают и при разработке ботов в golos. Но к техническим деталям мы еще вернемся. А пока разберемся, в чем же сила самого Ethereum. Прежде всего в смарт-контрактах, которые пишутся на языке Solidity.

О технологии в двух словах

Смысл блокчейна заключается в том, что туда надо, что-то загружать. Для этого используется специальный протокол, часто работающий поверх HTTP или WS. В большинстве случаев формат описывается в JSON-нотации, например, `{"param1:"val1", "param2":"val2", "data":"что-угодно", "id":"n+1"}`. Узел (нода) на который отправляется такая транзакция рассылает ее соседям, и так по цепочки. Она сохраняется в блоке, а блог проходит подтверждение. Таким образом транзакция сохраняется. Так вот в поле data сохраняется не обычный текст, а байт-код, который умеет интерпретировать виртуальная машина Еthereum. Она находится у майнера, которому вы посылаете запрос к контракту, по тому же JSON-RPC. Так как код в контрактах поддерживает циклы, майнера можно надолго загрузить. Или вообще ввести бесконечный цикл. Что бы этого не случалось каждая команда в байт коде имеет стоимость, измеряемую в gas (минимальная единица ETH). Собственно это и обуславливает популярность Ethereum, помимо прочьего.

Где будем писать наш код

Для выполнения кода Solidity не обязательно загружать его в блокчейн. Точнее это делается уже после его компиляции. Блокчейн для кода контрактов можно рассматривать как надежное хранилище. Поэтому для нашего изучения вполне подойдет Solidity IDE Remix, которая работает прямо в браузере по ссылке https://ethereum.github.io/browser-solidity

Принцип работы Смарт-контрактов

Я люблю рассматривать смарт-контракты двумя способами:

Смарт-контракты как веб-службы

В этом блоге мы часто рассматриваем программирование на php. Поэтому приведу аналогию такую. Смарт-контракт можно сравнить с php-скриптом: Вы из своего браузера отправляете какому-нибудь серверу запрос типа GET, в котором сообщаете некоторые данные. Сервер отыскивает у себя файл этого скрипта (контракта) и в месте с параметрами запроса отдает его php-интерпретатору (вирт. машине). Тот интерпретирует код, в соответствии с параметрами, возвращает результат серверу, а сервер вам (вашему браузеру). Для начального понимания такой пример сравнения смарт-контракта с php-скриптом вполне думаю подходит.

Смарт-контракты как иточник данных

Больше всего начинающих разработчиков смарт-контрактов, наверное интересует вопрос: "где же функции echo или print?". Без паники - их там нет. Там есть встроенные функции по душу блокчейна. О них в 3-м уроке. Так вот. Сами по себе функции, определяемые нами в смарт-контракте, рассматриваются как точки входа в контракт (ввод), а возвращаемое значение функций - вывод. В принципе как и у любой функции и первых и вторых параметров в функциях контрактов Solidity может не быть. Тогда по-логике функция должна изменять переменные состояния контракта.

Переменные состояния контракта

Кто изучал объектно-ориентированное программирование наверное заметили, что смарт-контракты похожи на классы. Так же как и у объектов классов ООП у контрактов Solidity есть переменные, определенные внутри контракта - глобальные, а те которые определены внутри функций локальные. Первые называются переменными состояния смарт-контракта. Как можно догадаться из ООП, где переменные класса "живут" пока существует обект класса, существуют и его переменные и все, что в них записывали. Также и у контракта в блокчейне, пока контракт в нем "жив" (разработчик может предусмотреть его самоуничтожение определив вызов функции suicide()), то и все переменные, определенные в нем хранят, передаваемые им значения. Таким образом определяя состояние этого контракта. Для изменения и чтения значений этих переменных разработчик собственно и определяет функции. Которые затем могут быть вызваны интерфейсами других аккаунтов сети Ethereum, а также непосредственно из других смарт-контрактов. Локальные же переменные (определенные внутри функций) в блокчейне не хранятся, они как и положено живут только во время вызова функции. Каким образом это происходит мы рассмотрим в следующих уроках. О переменных и типах в следующем. А пока напишем наш смарт контракт Hello, World.

Практика: Пишем Hello, World на Solidity

1. Открываем веб сайт IDE. У меня вот.
2. Нажимаем создание нового файла - плюсик слева вверху (изначально он черного цвета).
3. Ниже в ветке browser он появится под именем по умолчанию (дважды по ниму кликнув вы сможете изменить его название). Также в середине IDE на панели редактирования откроется новая вкладка. В ней то мы и будем писать наш код.
pragma solidity ^0.4.0;


contract HelloWorld {
    
    function hello() constant returns (string res) {
        
        return "Hello, World";
   
    }

}

Вот такой наш первый умный-контракт. Он ничего не сохраняет, ни чего полезного не делает, а только "говорит" Привет, Мир!

Нажимаем на правой панели кнопку create, чтобы создать контракт.


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

Здесь следует отметить, что означают эти результаты:

Value - это "сырое" значение, возвращенное функцией. Его размер и последовательность байт зависят от типа возвращаемого функцией значения (его указывает разработчик смарт-контракта).

Transaction cost - количество топлива за транзакцию.

Execution cost - израсходованное на транзакцию (выполнение функции смарт-контракта) количество топлива.

Decoded - результат.

И так в первом уроке по Solidity мы увидели наш Hello, World!.


В следующем уроке поговорим о функциях и типах переменных.

образованиекриптовалютыethereumsolidityпрограммирование
86
105.183 GOLOS
0
В избранное
Руслан Дорофеев
Сетевое программирование
86
0

Зарегистрируйтесь, чтобы проголосовать за пост или написать комментарий

Авторы получают вознаграждение, когда пользователи голосуют за их посты. Голосующие читатели также получают вознаграждение за свои голоса.

Зарегистрироваться
Комментарии (12)
Сортировать по:
Сначала старые