EOS Смарт-контракты


Для версий до 1.3.0!

Смарт контракты для EOSIO пишутся на языке программирования С++. Для экспериментов со смарт контрактами, нам потребуется установленное программное обеспечение EOSIO, которое поставляется со стандартными библиотеками С++ (находятся в директории ../eos/contracts/libc++).

Рекомендуется сначала протестировать и отладить ваш смарт контракт в Local Single-Node или Multi-Node Testnet.

[ссылки на статьи как запустить Local Single-Node или Multi-Node Testnet]

После установки EOSIO, перейдите в директорию ../../eos/contracts. В этой директории находятся примеры различных смарт контрактов, в ней же и создадим новую директорию в которой будет новый смарт контракт.

mkdir new_contract

cd new_contract

При помощи команды eosiocpp -n new_contract (new_contract название созданной папки) можно сгенерировать шаблоны заголовочного файла new_contract.hpp, который должен содержать переменные, константы, объявления функций вашего смарт контракта, и шаблон исходного файла new_contract.cpp, где будет реализация/определение функций.

Note: Если команда eosiocpp не доступна (eosiocpp: command not found), убедитесь что выполнены следующие действия

cd ../../eos/build

sudo make install

Впоследствии скрипт должен выводить, куда были скопированы двоичные файлы (по умолчанию это /usr/local/eosio/bin) и если этот путь еще не находится в переменной $ PATH, добавьте его.

export PATH=/usr/local/eosio/bin:$PATH

Compile
Для компиляции смарт контрактов также рекомендуется использовать инструмент eosiocpp, который предоставляется с установкой EOSIO.

Смарт контракт должен быть скомпилирован в WebAssembly (WASM) формат, который позволяет запускать высокопроизводительный код. WASM - это единственный формат, который принимает EOSIO blockchain. После того, как у вас готов файл .cpp, рекомендуется скомпилировать его в текстовую версию WASM (.wast) при помощи команды:

eosiocpp -o new_contract/new_contract.wast new_contract/new_contract.cpp

Также создается файл .abi (Application Binary Interface), который необходим внешними системами для выполнения операций смарт контракта.

eosiocpp -g new_contract/new_contract.abi new_contract/new_contract.cpp

Deploy

Для проверки/тестирования смарт контракта вам нужно будет запустить свой EOS Local Single-Node или Multi-Node Testnet с опцией --contracts-console или указать параметр contracts-console = true в файле config.ini.

Создаем аккаунт для смарт контракта при помощи следующей команды

cleos system newaccount --stake-net "0.1 EOS" --stake-cpu "0.1 EOS" --buy-ram-kbytes 8 existing_account contract_account owner_public_key active_public_key

В Testnet мы можем создать аккаунт используя вместо existing_account аккаунт eosio, ключи которого по-умолчанию

EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

Предварительно их надо импортировать в кошелек.

cleos wallet create -n wallet_name

cleos wallet unlock -n wallet_name --password your_wallet_password

cleos wallet import -n wallet_name --private-key your_private_key

Deploy the smart contract on an account

cleos set contract contract_account ../../contracts/new_contract

Если возникает ошибка [Error 3080001: Account using more than allotted RAM usage], следует купить больше RAM, для хранения информации смарт контракта, при помощи команды system buyram. Напимер:

cleos system buyram eosio contract_account "1 EOS"

//TODO подробнее про RAM в отдельной статье

Чтобы вызвать функцию contract_function смарт контракта some_account отправляет some_data контракту contract_account.

cleos push action contract_account contract_function '[ "some_data" ]' -p some_account@active

Note: Если мы хотим, чтобы вызываемая функция контакта аутентифицировала пользователя, тогда следует добавить require_auth(user) (подробнее C/C++ Function References) в .cpp файл там где реализована функция contract_function.

Update
Для того чтобы обновить контракт достаточно повторить компиляцию файла .wast и сгенерировать .abi, а затем снова выполнить команду cleos set contract contract_account ../../contracts/new_contract и контракт аккаунта будет обновлен. При обновлении, если новая версия контракта использует другое количество RAM, количество использованной памяти автоматически изменится на требуемое (если меньше, то часть использованной памяти освободится)

Note:

eosiocpp multi-tool will be removed in v1.3.0

contract development libraries (contracts/eosiolib , contracts/libc++ , and contracts/musl ) will be removed in v1.3.0, some contracts examples will be removed too

new tools eosio.wasmsdk repository

Follow us!

Website: https://atticlab.net/eos/

Twitter: https://twitter.com/atticlab_it

Facebook: https://www.facebook.com/atticlab/

Reddit: https://www.reddit.com/r/atticlabeosb/

Steemit: https://goldvoice.club/steem/@attic-lab

Medium: https://medium.com/eosatticlab

Golos: /@atticlab

Telegram Chat: https://t.me/atticlabeosb

Telegram channel: https://t.me/eos_atticlab


Comments 4


@atticlab А 1.3.0 когда выйдет? И планируете ли опубликовать версию для этого обновления? Благодарю.

02.09.2018 16:44
0

@denis-skripnik да, конечно, опубликуем

02.09.2018 17:54
0

@atticlab Ок. отлично. Благодарю. Планирую начать изучение написания смартконтрактов для EOS где-то через месяц-2.

02.09.2018 19:42
0

Смотрел стандартный смарт-контракт eosio.token и заметил, что он не покрывает полный life cicle токена. Создать можно, а удалить нельзя. Как так? Ощущение какой-то сырости

08.08.2019 13:18
0