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://steemit.com/eos/@attic-lab
Medium: https://medium.com/eosatticlab
Golos: https://golos.io/@atticlab
Telegram Chat: https://t.me/atticlabeosb
Telegram channel: https://t.me/eos_atticlab