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

9 месяцев назад

Язык 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!.


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

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

Очень актуальная тема! Особенно в свете того, что в solidity нет валидации кода и неопытный пользователь может создать контракт, который попросту лишит его средств

·

но ведь есть тестнет (вроде как)...
да и форки ефира exp, ubq, soil - там более дешёвые монеты
Кстати может кто подскажет: на базе ubq уже есть токены, а на базе моего любимица exp - нету(((

·
·

Да это понятно. Думаю vik о другом говорит. Вот например есть у тебя сервер для тестов, а есть боевой. Ну и что. Если документации мало и человек не знает английский, то программа может пйомать баг и там и там, и в самый неподходящий момент =)

Спасибки, буду читать....я тоже было дело покупал 300 ефиров!!! но держал недолго((( А ведь ожидал что будет №2 после битка

70
  ·  9 месяцев назад

Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
sergiy, chiliec, niiu, vik, voltash, on1x, vika-teplo, optimist, anomalywolf, yakov, dimas102, wind33, dignityinside
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!


Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"

А каким образом программа инициирует доступ к оплате своего исполнения? она по идее как-то должна связаться с кошельком, на котором есть средства?

·

Платит тот, кто вызывает контракт. Это либо аккаунт авторизованный своим ключом, либо другой контракт.

·

Я просто не описал параметры настроек вверху IDE. Там gas limit как раз сообщает сколько максимально готов потратить аккаунт на выполнение контракта. И соответственно определенное кол-во газа списывается с вызывающего аккаунта в пределах установленного лимита.

Очень интересно! Когда следующий урок?

·

Благодарю. Ну начну завтра писать. Либо вечером либо послезавтра)

·
·

Помогите, пожалуйста, мне с mist разобраться.
Создал учетные записи. Перечислил на них немного эфира. Баланс второй день нулевой. Блоки в mist обновлял. Причем Etherscan сразу показал, что эфир на нужные адреса зачислен. Как быть?
И еще. Создал тестовые контракты. Они второй день «создаются» . Наверное нет эфира на их создание? Но как в таком случае их закрыть? Пробовал сделать это через консоль mist. Как советует документация. Но mist их не видит. Что можно с этим счделать?

Спасибо!

·
·
·

Ну там много аспектов, которые могут приводить к некорректной работе. Я вообще mist себе не ставил. Пользуюсь командной строкой.
Предлагаю дождаться урока про установку ноды и там обсудить.