EOS 智能合约源代码解读 (11)wrap合约“action_wrapper类”
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EOS 智能合约源代码解读 (11)wrap合约“action_wrapper类”相关的知识,希望对你有一定的参考价值。
1. 功能
对于许多用例,需要从合同代码向另一个合同发送新操作。这是合同之间能够积极沟通的唯一途径。它为特定智能合约代码的特定操作创建“操作模板”,然后可使用该模板来调用此操作。
第一个参数是动作名称,第二个参数是动作的方法_declaration_。
2. action_wrapper 类的定义
template <eossys::name::raw Name, auto Action>
struct action_wrapper {
template <typename Code>
constexpr action_wrapper(Code&& code, std::vector<eossys::permission_level>&& perms)
: code_name(std::forward<Code>(code)), permissions(std::move(perms)) {}
template <typename Code>
constexpr action_wrapper(Code&& code, const std::vector<eossys::permission_level>& perms)
: code_name(std::forward<Code>(code)), permissions(perms) {}
template <typename Code>
constexpr action_wrapper(Code&& code, eossys::permission_level&& perm)
: code_name(std::forward<Code>(code)), permissions({1, std::move(perm)}) {}
template <typename Code>
constexpr action_wrapper(Code&& code, const eossys::permission_level& perm)
: code_name(std::forward<Code>(code)), permissions({1, perm}) {}
template <typename Code>
constexpr action_wrapper(Code&& code)
: code_name(std::forward<Code>(code)) {}
static constexpr eossys::name action_name = eossys::name(Name);
eossys::text_name code_name;
std::vector<eossys::permission_level> permissions;
static constexpr auto get_mem_ptr() {
return Action;
}
template <typename... Args>
action to_action(Args&&... args)const {
static_assert(detail::type_check<Action, Args...>());
return action(permissions, code_name, action_name, detail::deduced<Action>{std::forward<Args>(args)...});
}
template <typename... Args>
void send(Args&&... args)const {
to_action(std::forward<Args>(args)...).send();
}
template <typename... Args>
void send_context_free(Args&&... args)const {
to_action(std::forward<Args>(args)...).send_context_free();
}
};
2.1 调用示例
#include <eosio_token/include/eosio_token.hpp>
// can specify the contract to send the action to as first argument
token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});
// transfer arguments are now passed as postional arguments
payout.send(get_self(), to, quantity, memo);
token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});
transaction t{};
t.actions.emplace_back(payout.to_action(get_self(), to, quantity, memo));
t.delay_sec = 10;
t.send(0 /* sender id */, get_self(), false);
参考:
- EOS系列 - WASM智能合约 - 内置方法
以上是关于EOS 智能合约源代码解读 (11)wrap合约“action_wrapper类”的主要内容,如果未能解决你的问题,请参考以下文章