LoginSignup
0
0

More than 5 years have passed since last update.

EOS の公式コントラクトとして、下記あります。

今回は、最後のeosio.sudo を読んでみます。

ソース

意外に内容が少ないです。
処理では、標準のアクションではなく、処理の中 read_action_data を使って独自でパラメータを解析しています。
ソースにインラインでコメントして行きます。

eosio.sudo.hpp

#pragma once

#include <eosiolib/eosio.hpp>

namespace eosio {

   class sudo : public contract {
      public:
         sudo( account_name self ):contract(self){}

         void exec();

   };

} /// namespace eosio

eosio.sudo.cpp

#include <eosio.sudo/eosio.sudo.hpp>
#include <eosiolib/transaction.hpp>

namespace eosio {

/*
exec function manually parses input data (instead of taking parsed arguments from dispatcher)
because parsing data in the dispatcher uses too much CPU if the included transaction is very big

If we use dispatcher the function signature should be:

void sudo::exec( account_name executer,
                 transaction  trx )
*/

void sudo::exec() {
   // 認証確認
   require_auth( _self );

   // この4行は、手動でアクションのデータを取得しています。理由は、冒頭のコメントによると、CPU を節約するためです
   constexpr size_t max_stack_buffer_size = 512;
   size_t size = action_data_size();
   char* buffer = (char*)( max_stack_buffer_size < size ? malloc(size) : alloca(size) );
   read_action_data( buffer, size );

   account_name executer;

   // この2行は、取得したアクションデータから、アカウントを解析し、`executer` 変数に設定しています
   datastream<const char*> ds( buffer, size );
   ds >> executer;

   // 実行者の確認
   require_auth( executer );

   // アクションデータから、2番めのパラメータのポインター位置を取得する
   size_t trx_pos = ds.tellp();
   // 遅延トランザクションを送信する(遅延時間は 0 )
   send_deferred( (uint128_t(executer) << 64) | current_time(), executer, buffer+trx_pos, size-trx_pos );
}

} /// namespace eosio

EOSIO_ABI( eosio::sudo, (exec) )

結局何をやってるの?

EOS は、ガバナンス仕組みがあります。ECAF によって、21 個の BP の中、15 個の認可を貰えば、アカウントのオーナーキーを変更したり、コントラクトを変更したりすることができますが、この過程は不透明であるため、もっとシンプル、かつ透明化するために、eosio.sudo コントラクトが設けられました。

こうすることで、たとえ、ECAF の投票によって、hackaccount1active キーを変更したい場合、下記のように実行することになります。

# トランザクションデータを change.json に作成する
$ cleos set account permission -s -j -d hackaccount1 active EOS4uY...HJR owner > change.json

# wrap コントラクトの exec アクションを実行する
$ cleos wrap exec hackaccount1 change.json

EOS ネットワーク上の立ち位置

  • EOS のメインネットでは、eosio.wrap アカウントにデプロイされています
  • もともとコントラクトは eosio.sudo となっていますが、sudo は、Linux の場合、スーパー権限を持っていて、一旦認可しておくと一定時間内で再認可なしで権限を持てるようになっているので、EOS の場合もスーパー権限持ってるの? 一定時間内で権限を持つままになるの? と誤解しやすいので、eosio.wrap アカウントにデプロイされています

まとめ

これで、公式のコントラクトを一通り確認しました。

0
0
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
0
0