Язык 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!.
Очень актуальная тема! Особенно в свете того, что в solidity нет валидации кода и неопытный пользователь может создать контракт, который попросту лишит его средств
но ведь есть тестнет (вроде как)...
да и форки ефира exp, ubq, soil - там более дешёвые монеты
Кстати может кто подскажет: на базе ubq уже есть токены, а на базе моего любимица exp - нету(((
Да это понятно. Думаю vik о другом говорит. Вот например есть у тебя сервер для тестов, а есть боевой. Ну и что. Если документации мало и человек не знает английский, то программа может пйомать баг и там и там, и в самый неподходящий момент =)
Спасибки, буду читать....я тоже было дело покупал 300 ефиров!!! но держал недолго((( А ведь ожидал что будет №2 после битка
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
sergiy, chiliec, niiu, vik, voltash, on1x, vika-teplo, optimist, anomalywolf, yakov, dimas102, wind33, dignityinside
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
Очень интересно! Когда следующий урок?
Благодарю. Ну начну завтра писать. Либо вечером либо послезавтра)
Помогите, пожалуйста, мне с mist разобраться.
Создал учетные записи. Перечислил на них немного эфира. Баланс второй день нулевой. Блоки в mist обновлял. Причем Etherscan сразу показал, что эфир на нужные адреса зачислен. Как быть?
И еще. Создал тестовые контракты. Они второй день «создаются» . Наверное нет эфира на их создание? Но как в таком случае их закрыть? Пробовал сделать это через консоль mist. Как советует документация. Но mist их не видит. Что можно с этим счделать?
Спасибо!
Ну там много аспектов, которые могут приводить к некорректной работе. Я вообще mist себе не ставил. Пользуюсь командной строкой.
Предлагаю дождаться урока про установку ноды и там обсудить.
А каким образом программа инициирует доступ к оплате своего исполнения? она по идее как-то должна связаться с кошельком, на котором есть средства?
Я просто не описал параметры настроек вверху IDE. Там gas limit как раз сообщает сколько максимально готов потратить аккаунт на выполнение контракта. И соответственно определенное кол-во газа списывается с вызывающего аккаунта в пределах установленного лимита.
Платит тот, кто вызывает контракт. Это либо аккаунт авторизованный своим ключом, либо другой контракт.