eosio.bios の役割

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

- [ ] eosio.bios
- [x] eosio.msig　紹介記事　[EOS のアカウント・ロール・権限　応用編 - Qiita](https://qiita.com/blueplanet/items/2e6148ab02f56d22c229)
- [ ] eosio.sudo
- [ ] eosio.system
- [x] eosio.token 紹介記事　[eosio.token コントラクトを解読してみる - Qiita](https://qiita.com/blueplanet/items/dad6ffce0e5d5f583f3f)

今回は、`eosio.bios` を読んでみます。

## ソース

`.cpp` には`EOSIO_ABI`以外何もないので、全部`.hpp` に書かれています。

```c++
#pragma once
#include <eosiolib/eosio.hpp>
#include <eosiolib/privileged.hpp>

namespace eosio {

   class bios : public contract {
      public:
         bios( action_name self ):contract(self){}

         void setpriv( account_name account, uint8_t ispriv ) {
            require_auth( _self );
            set_privileged( account, ispriv );
         }

         void setalimits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {
            require_auth( _self );
            set_resource_limits( account, ram_bytes, net_weight, cpu_weight );
         }

         void setglimits( uint64_t ram, uint64_t net, uint64_t cpu ) {
            (void)ram; (void)net; (void)cpu;
            require_auth( _self );
         }

         void setprods( std::vector<eosio::producer_key> schedule ) {
            (void)schedule; // schedule argument just forces the deserialization of the action data into vector<producer_key> (necessary check)
            require_auth( _self );

            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 );
            set_proposed_producers(buffer, size);
         }

         void setparams( const eosio::blockchain_parameters& params ) {
            require_auth( _self );
            set_blockchain_parameters( params );
         }

         void reqauth( action_name from ) {
            require_auth( from );
         }

      private:
   };

} /// namespace eosio
```

## 説明
- setpriv
    - アカウントの特別権限フラグを設定する
- setalimits
    - アカウントのリソースリミットを設定する
- setglimits
    - グローバルのリソースリミットを設定する
    - **まだ実装されていない**
- setprods
    - ブロック生成者（BP）を設定する
- setparams
    - 下記のような、ブロックチェーン全体の動きを制御するパラメータを設定する

```c++
uint64_t max_block_net_usage;

uint32_t target_block_net_usage_pct;

uint32_t max_transaction_net_usage;

/**
  * The base amount of net usage billed for a transaction to cover incidentals
  * @brief The base amount of net usage billed for a transaction to cover incidentals
  */
uint32_t base_per_transaction_net_usage;

uint32_t net_usage_leeway;

uint32_t context_free_discount_net_usage_num;

uint32_t context_free_discount_net_usage_den;

uint32_t max_block_cpu_usage;

uint32_t target_block_cpu_usage_pct;

uint32_t max_transaction_cpu_usage;

uint32_t min_transaction_cpu_usage;


/**
  * The numerator for the discount on cpu usage for CFA's
  *
  * @brief The numerator for the discount on cpu usage for CFA's
  */
uint64_t context_free_discount_cpu_usage_num;

/**
  * The denominator for the discount on cpu usage for CFA's
  *
  * @brief The denominator for the discount on cpu usage for CFA's
  */
uint64_t context_free_discount_cpu_usage_den;

/**
  * Maximum lifetime of a transacton
  *
  * @brief Maximum lifetime of a transacton
  */
uint32_t max_transaction_lifetime;

uint32_t deferred_trx_expiration_window;

uint32_t max_transaction_delay;

/**
  * Maximum size of inline action
  *
  * @brief Maximum size of inline action
  */
uint32_t max_inline_action_size;

/**
  * Maximum depth of inline action
  *
  * @brief Maximum depth of inline action
  */
uint16_t max_inline_action_depth;

/**
  * Maximum authority depth
  *
  * @brief Maximum authority depth
  */
uint16_t max_authority_depth;
```

## EOS ネットワーク上の立ち位置
- `EOS` のメインネットでは、`eosio` アカウントにデプロイされています
- `eosio.bios` は、その言葉どおり、`EOS` ブロックチェーンが動く基本的な動作を制御しているので、新しいチェーンを立ち上げるとき、`eosio.system` と一緒に、最初にデプロイしないといけないコントラクトになります
- `EOSIO` を使って自分のチェーンを動くケースになりますが、`eosio.system`コントラクトを使わない場合は、`setprods`を使って `BP(ブロック生成アカウント）`を設定できます

## まとめ
`eosio.bios`　は、ブロックチェーン全体の基本的な制御を行うコントラクトになっています。