8 Обращение к контракту через встроенные вызовы действий
В этом разделе руководства приведены инструкции по отправке действий во внешний контракт. Примеры выполнения инструкций показаны на контракте, в котором ведется счет выполняемых действий, написанных в этом контракте.
8.1 Контракт счетчика адресной книги addressbook
Войти в CONTRACTS_DIR и создать там каталог с именем abcounter, а также файл abcounter.cpp.
cd CONTRACTS_DIR
mkdir abcounter
cd abcounter
touch abcounter.cpp
Открыть файл abcounter.cpp и записать в него следующий программный текст:
Особенность данного тексте в том, что в нем имеется ограничение на вызовы действия для аккаунта контракта. Для ограничения используется require_auth для контракта addressbook. Только аккаунт контракта addressbook имеет авторизацию на выполнение require_auth. Действие count отправляется не пользователем, а контрактом addressbook.
8.5 Скомпилировать заново и установить контракт addressbook
Поскольку изменения не должны повлиять на ABI, повторно редактировать ABI-файл не требуется (убедиться, что этот файл не обновился).
eosio-cpp -o addressbook.wasm addressbook.cpp
cleos set contract addressbook CONTRACTS_DIR/addressbook
8.6 Выполнить тестирование отправки действия из контракта addressbook контракту abcounter
Перед началом тестирования убедиться, что контракты abcounter и addressbook установлены.
8.6.1 Проверить отправку уведомления контракту abcounter, а также изменение записи в таблице контракта addressbook, исполнив:
8.6.3 Проверить, что метод upsert модифицирует запись.
cleos push action addressbook upsert '["alice", "alice", "liddell", 21,"1 there we go", "wonderland", "amsterdam"]' -p alice@active
Действия считаются успешно выполненными, если в результирующей выдаче будет содержаться информация вида:
executed transaction: …
# addressbook <= addressbook::upsert {"user":"alice","first_name":"alice","last_name":"liddell","street":"1 coming down","city":"normalla...
# addressbook <= addressbook::notify {"user":"alice","msg":"alice successfully emplaced record to addressbook"}
>> Notified
# alice <= addressbook::notify {"user":"alice","msg":"alice successfully emplaced record to addressbook"}
# abcounter <= abcounter::count {"user":"alice","type":"emplace"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
8.6.4 Проверить удаление записи для пользователя alice из таблицы, исполнив:
Действие считается успешно выполненной, если в результирующей выдаче будет содержаться информация вида:
executed transaction: ...
# addressbook <= addressbook::erase {"user":"alice"}
>> Erased
# addressbook <= addressbook::notify {"user":"alice","msg":"alice successfully erased record from addressbook"}
>> Notified
# alice <= addressbook::notify {"user":"alice","msg":"alice successfully erased record from addressbook"}
# abcounter <= abcounter::count {"user":"alice","type":"erase"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
Toaster:addressbook sandwich$
8.6.5 Проверить возможность манипулировать данными контракта abcounter, исполнив:
cleos push action abcounter count '["alice", "erase"]' -p alice@active
cleos get table abcounter abcounter counts --lower alice
Таблица контракта abcounter должна содержать следующую информацию: