Пишем смарт-контракт Ethereum — это просто: Часть 1 — введение

Лучший способ разобраться в чём-то – попытаться это что-то объяснить другому

Данное руководство предназначено для тех, кто хочет научиться писать смарт-контракты на эфире. Для изучения вам потребуется знание основ программирования. Идеально было бы если читатель знаком с JavaScript. Предполагается что вы уже знакомы с понятием смарт-контрактов и имеете представление для чего они.

Смарт контракты Ethereum можно писать на разных языках. Мы же будем использовать solidity как наиболее распространенный на момент написания статьи.  Версия 0.4.18.

В этом уроке:

  1. Познакомимся с языком solidity
  2. Познакомимся со средой Remix
  3. Напишем наш первый смарт-контракт
  4. Научимся запускать наш смарт-контракт в тестовой среде

Писать и тестировать мы будем на Remix . Это довольно простая и распространенная среда, к тому же она работает из браузера. Выглядит она следующим образом:

Слева — список файлов. Центральное окно — место куда мы будем писать свой код. А справа инструменты.

Итак, наш первый смарт-контракт по традиции будет выводить приветствие «Hello, world»:

Вставьте этот код в среду Remix и выполните следующие действия.

  1. Переключитесь на вкладку «compile» в панели справа
  2. Выполните «start compile»
  3. Переключитесь на вкладку  «run»
  4. В поле «Environment» поставьте «JavaScript VM»  — это тестовая среда в которой мы будем исполнять наши контракты
  5. Выберите в списке контрактов тот, который будете заливать (сейчас это HelloWorld)
  6. Нажмите на кнопку «create» — таким образом мы создаем контракт внутри сети Ethereum

В дальнейшем эти действия нужно будет выполнять если вы хотите создать новый контракт внутри Ethereum.

После этих процедур панель справа должна выглядеть примерно так

Теперь наш контракт готов к выполнению. Вызовем функцию «getData» — для этого достаточно нажать на кнопку с соответствующей надписью.

Результатом работы будет.

Теперь мы видим нашу строку приветствия «Hello, world.»

Наш первый смарт-контракт написан и успешно выполнен!

Теперь разберем наш код.

В самой первой строчке указывается язык «solidity» и его версия 0.4.18.

Сам контракт описывается просто. Для тех кто знаком с ООП в программировании — контракт покажется похожим на класс.

В самом коде контракта у нас одна функция, которая возвращает строку.  Соответственно функция которая что-то возвращает описывается следующим образом.

Следует отметить что слово «constant» не обязательно, но его желательно ставить если функция не меняет внутреннего состояния контракта. Также не обязательно указывать слово public, так как  все функции по-умолчанию считаются public. Однако хорошим стилем считается указание public.

Функция, которая public видна всем. Подробнее об этом мы поговорим об этом позже, а пока будем считать все функции public.

Если функция ничего не возвращает, то убираем все что после названия функции.

Соответственно если функция ничего не принимает на вход то убираем входные_параметры.

Помимо функций внутри контракта могут содержаться переменные. Они записываются так

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

Типы переменных мы будем рассматривать по мере надобности.

Если что-то не понятно не переживайте, на практике станет все на свои места.

Давайте сделаем так чтобы контракт хранил строку «Hello, world» в переменной.

Теперь наша строка приветствия хранится в переменной wellcomeString. И тип у нее string.

Усовершенствуем наш контракт так чтобы строку приветствия можно было менять.

У нас появилась дополнительная функция setData которая принимает на вход новую строку приветствия и присваивает ее переменной wellcomeString.

Залейте контракт в сеть. После этого на правой панели внизу появятся две кнопки «getData» и «setData» которые соответствуют нашим функциям.

Напишите в поле рядом с кнопкой setData какую-нибудь строчку в двойных кавычках. Например «wellcome»  и нажмите setData. А затем getData. Если вы все правильно сделали, то getData вернет вашу строку.

На этом вводная часть заканчивается. Продолжение читать тут.

Если у вас возникли вопросы то можете смело писать на электронную почту (раздел «контакты»). Также приветствуется критика.

Если статья показалась вам полезной и вы желаете отблагодарить автора, то это можно сделать отослав немного эфира на адрес 0xEA15Adb66DC92a4BbCcC8Bf32fd25E2e86a2A770.

Полный список уроков тут.

  1. Спасибо, за предоставленные уроки!

    У меня проблема прям в самом начале(

    вылазиет ошибка
    transact to browser/businesscard.sol:HelloWorld.setData errored: Error encoding arguments: SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data

    Подозреваю это из-за этого
    в самом коде стоят восклицательные знаки Warning no visibility specified. defaulting to «public»
    как исправить?
    Заранее спасибо

    • Скорее всего проблема в неправильном формате входных данных, напишите подробнее на каком этапе возникает ошибка. Быстрее будет если вы будете задавать вопросы в чате телеграмм https://t.me/blockchainwitness

    • привет
      вы решили свою ошибку ?
      у меня так же выскакивает все время

      transact to browser/ballot.sol:HelloWorld.setData errored: Error encoding arguments: SyntaxError: Unexpected token « in JSON at position 1

    • Строка должна быть в кавычках. «World» а не World

    • Дополню: в прямых кавычках. Местный сильно умный скрипт меняет их на парные.

  2. спасибо! первый туториал, после которого наступила полная ясность.
    автору спасибо, эфира пока нет, но на карту приватБанк могу закинуть благодарность )

  3. Кода я перехожу по Ссылке REMIX у меня вот такая фигня, это надо очистить?

    • Да. Remix сохраняет сессию скорее всего по cookie.

  4. У тебя классные статьи, очень помогают в освоении данного материала, огромное спасибо! Про тестирование скоро думаешь статьи выпустить?

    • Введение уже лежит в черновике. Один-два дня на вычитку.

  5. «Сам контракт описывается просто. Для тех кто знаком с ООП в программировании — контракт покажется !походим! на класс.» — oshibka v tekste

  6. Warning при компиляции:
    «Gas requirement of function browser/ballot.sol:Hello.getData()unknown or not constant.
    If the gas requirement of a function is higher than the block gas limit, it cannot be executed. Please avoid loops in your functions or actions that modify large areas of storage (this includes clearing or copying arrays in storage)»
    А при выполнении пишет:
    »
    call to browser/ballot.sol:Hello.getData
    [call] from: — , to:browser/ballot.sol:Hello.getData(), data:3bc5d…5de30, return:
    {
    «0»: «string: Hello»
    }
    «

  7. На моб версии сайта ползунок для кода было бы неплохо сделать шире, а то тяжело попасть;)

    • Это сторонний плагин. Посмотрю что можно сделать.

  8. У меня вообще после первого вода слева перед цифрой 1 красный крестик появился и с права когда открываю вкладку run то там отсутствует выбор HelloWorld. Вообще нечего не получилось.

  9. А по какой интересно причине мае сообщение удалили? Тут что прям все программистами родились что ли все же когда то начинали и были дубами в этом деле.

    • Поясните, какой сообщение. Если сообщение не содержит спам, мат или порнографию я его не удаляю.

  10. Доброго времени!
    Вопрос простой: версия языка обязательно должна быть 0.4.18 ? у меня открывается Remix сразу на версии 0.4.0 и когда сам прописываю на 18 — выдает ошибку. Я так понял в settings можно выбрать последнюю версию? Или можно не изменять, а оставить 0.4.0.
    Буду благодарен за ответ

  11. Добрый день.
    Хорошая статья. У меня вроде все работает корректно как написано Вами. Продолжу изучение. Спасибо за урок.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *