分類と説明
スマートコントラクトの中で、他のスマートコントラクトとやり取りしたい場合は、アクションを送信すれば良いです。
EOS 上の送信は、inline(同期呼び出し)
と deferred(遅延呼び出し)
2種類があります。
分類 | inline action | deferred |
---|---|---|
意味 | その場で他のアクションを呼び出す | 遅延して他のアクションを呼び出す |
送信タイミング | 同期実行 | 非同期 |
失敗の動き |
同一トランザクションにある 呼び出しターゲットが失敗したら呼び出し元のアクションも失敗 |
トランザクションが異なる 呼び出しターゲットが失敗しても呼び出し元アクションに影響なし |
inline action の送信
処理の中で action
を作成し、send()
を呼び出して送信する
#include <eosiolib/eosio.hpp>
using namespace eosio;
class hello : public eosio::contract {
public:
using contract::contract;
/// @abi action
void hi( account_name user ) {
action(
permission_level{get_self(), "active"_n}, // 使う権限
get_self(), // ターゲットアカウント
"say"_n, // ターゲットアクション
name{user} // ターゲットアクションのパラメータ
).send();
}
void say(string name) {
print("Hello, ", name);
}
};
EOSIO_ABI( hello, (hi) )
他のアカウントのアクションを呼び出す時は、別の設定が必要になるので、また別記事で
deferred action の送信
#include <eosiolib/eosio.hpp>
#include <eosiolib/transaction.hpp>
using namespace eosio;
class hello : public eosio::contract {
public:
using contract::contract;
/// @abi action
void hi( account_name user ) {
transaction txn{};
const uint128_t sender_id = 100; // 遅延呼び出しに付ける任意の id
txn.actions.emplace_back(
action(
permission_level{get_self(), "active"_n}, // 使う権限
get_self(), // ターゲットアカウント
"say"_n, // ターゲットアクション
name{user} // ターゲットアクションのパラメータ
)
);
txn.delay_sec = 60; // 遅延する秒数
txn.send(sender_id, user);
}
void say(string name) {
print("Hello, ", name);
}
};
EOSIO_ABI( hello, (hi) )
まとめ
同期で別のアクションを呼び出すだけではなく、指定する秒数を遅延してから他のアクションを実行することもできるので、もっt柔軟な処理を実装できそうですね。