rusldv
7 лет назадЯзык 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. Нажимаем создание нового файла - плюсик слева вверху (изначально он черного цвета).
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!.