Курс разработчика EOS. Часть 4. Пишем первый смарт-контракт "Hello world"

avatar igorart 7 months ago

Назад Содержание Вперед

В этой статье мы напишем собственный контракт "Hello world".

    1. Запускаем в отдельном терминале блокчейн
      nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --contracts-consol
    2. Открываем еще один терминал и создаем папку hello
      
      cd eos 
      mkdir hello 
      cd hello
      
    3. Затем, любым текстовым редактором в данной директории создаем файл hello.cpp 

      и копируем туда следующий код

 
#include <eosiolib/eosio.hpp>

#include <eosiolib/print.hpp>

using namespace eosio;

class hello : public eosio::contract {

public:

	using contract::contract;

	/// @abi action

	void hi(account_name user) {

		print("Hello, ", name{ user });

	}

};

EOSIO_ABI(hello, (hi))

Давайте более подробно рассмотрим содержимое данного файла. В первых двух строках

  
#include <eosiolib/eosio.hpp>

#include <eosiolib/print.hpp>

люди уже знакомые с С++ догадались, что мы подключаем необходимые нам хэдер-файлы(eosio.hpp и print.hpp) из библиотеки eosiolib, используя директиву include. Следующей строкой

  
using namespace eosio;

подключаем пространство имен eosio. Мы бы могли конечно этого не делать, но тогда бы нам пришлось для каждого action (например some_action()) писать так - eosio::some_action(). Например, для нашего action hi() мы бы писали 


eosio::void hi( account_name user ){..}

Вот мы и дошли до action. Рассмотрим что это такое и с чем его едят.

Любой смарт-контракт в EOS состоит из action(действий) и переменных. Action представляют собой нечто подобное на функции или методы в иных языках программирования. Передавая данные через action мы взаимодействуем с блокчейном. Смарт-контракты взаимодействуют между собой посредством action и shared memory. O shared memory мы поговорим в следующих статьях.

Тремя последующими строками 


class hello : public eosio::contract {

public:

	using contract::contract;

мы говорим о том, что наш класс hello будет наследоваться от стандартного контракта contract в пространстве имен eosio. Также наследуем конструктор (using contract::contract;).

Строку

 /// @abi action

необходимо писать перед каждым действием, чтобы скрипт eosiocpp, при помощи которого мы запускаем наш контракт, мог создать .abi файл (интерфейс в формате JSON файла) . 

Рассмотрим action "hi" нашего смарт-контракта.


void hi(account_name user) {

	print("Hello, ", name{ user });

}

В нее мы передаём название нашего аккаунта (account_name user) - это наши входные данные. Функция print выведет нам сообщение "Hello название_аккаунта".

Осталось самое интересное. "Где же начало программы или по-другому точка входа?" - спросите вы. Во многих языках программирования точкой входа является функция main(). В eos контрактах такой точкой входа служит метод apply() или по-другому обработчик действий apply(). Он прослушивает все action и выполняет требуемое. Но почему жы мы его не видим в коде программы? Видим лишь в конце непонятную строку EOSIO_ABI( hello, (hi) ).  Дело в том, что создатели eos любезно позаботились о нас и спрятали тонкости реализации обработчика действий apply(). Это было сделано для того, чтобы мы могли больше сосредоточиться на разработке наших контрактов. Был создан макрос EOSIO_ABI(), он то и скрывает все тонкости обработчика действий apply(). Структура его очень проста.

EOSIO_ABI(class_name, (action_1)(action_2)(action_3)...(action_n))

Первым параметром передается название класса(у нас "hello"), затем через запятую название всех action в скобках. Так как у нас только одно action -"hi", макрос выглядит как  EOSIO_ABI( hello, (hi) ).

После небольшой теоретической паузы ...

  1. Создадим файл и скопируем туда содержимое описанного выше кода при помощи текстового редактора vim. Если же у вас его нет, то его необходимо предварительно установить. Сделаем это

     

    sudo apt-get install vim
  2. Далее создаем файл.
    sudo vim hello.cpp
    затем нажимаем "i" и копируем содержимое в файл  ,"Escape", "Shift+z","Shift+z"
  3. Компилируем код WebAssembly
    eosiocpp -o hello.wast hello.cpp
  4. Создаем файл abi
    eosiocpp -g hello.abi hello.cpp
    В директории должны быть сгенерированы следующие файлы:
  5. Создаем аккаунт hello.code. Будем использовать его для запуска нашего контракта

    Для этого нам необходимы два public ключа, сгенерированные в предыдущем уроке по созданию аккаунта.

    cleos create account eosio hello.code значение_public_Owner_key значение_public_Active_key

    Если возникает ошибка,то разлочиваем кошелек.>

    cleos wallet unlock
  6. Вводим команду

    cleos set contract hello.code ../hello -p hello.code

    Результатом будет выполнение транзакции

  7. Вызовем функцию hi из  hello классаю Команда должна иметь вид

    cleos push action {account} {action_name} '{data}' -p {account}@active

    где account - аккаунт от имени которого выполняется действие
    action_name - название действия(action)
    data - данные которые будут переданы в действие в качестве параметров
    Вводим команду:

    cleos push action hello.code hi '["eoswitnessac"]' -p eoswitnessac

    eoswitnessac - аккаунт созданный  в одной из статей.
    В консоле наблюдаем, что наш контракт выполнился:

  8. В другом терминале мы можем увидеть, что транзакция (контракт - наша программа) выполнилась в блокчейне

 

Резюме

Вот и все, мы написали первый контракт "Hello World".

Для всех, кому интересен EOS присоединяйтесь в эту группу в телеграме.

Назад Содержание Вперед