LoginSignup
3
1

More than 5 years have passed since last update.

EOS の inline action と deferred action

Last updated at Posted at 2018-12-06

分類と説明

スマートコントラクトの中で、他のスマートコントラクトとやり取りしたい場合は、アクションを送信すれば良いです。
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柔軟な処理を実装できそうですね。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1