北海道のとある企業で働くエンジニアのブログ

北海道でエンジニアとして働いています。技術的なことや感じたことを書きます。最近はブロックチェーンにハマってます。

ブロックチェーンゲーム「イーサエモン(Etheremon)」

今回はブロックチェーンゲーム「イーサエモン(Etheremon)」を紹介します!

www.etheremon.com

これって何?

イーサエモンは、イーサリアムを利用したブロックチェーンゲームの一つです。

ポ○モンのイーサリアム版とも言われたりしますが、

  • 捕獲する
  • 育てる
  • 戦わせる
  • 進化させる
  • 卵を孵化させる
  • モンスターの売買を行う

といったことを行い、仮想通貨のイーサリアムやゲーム内通貨のEMONTを稼ぐことができるゲームです。

とりあえず、この動画をご覧ください!
※注意:英語です。雰囲気だけでも感じていただければ大丈夫です

youtu.be

いかがでしょうか。なんか面白そうじゃないですか!?

楽しいの?

一言で言うと、楽しいですw(私はハマっています)

私は2018年6月位からプレイしていますが、2019年1月現在もメインでプレイしているブロックチェーンゲームの一つです。

楽しいとは言っても、普通のスマホゲーム等とは楽しみ方が違います

私が感じているイーサエモンの楽しさを挙げてみます。

  • モンスターのイラストがいい
  • モンスターを仮想通貨で売買できる
  • ブロックチェーンゲームなので、モンスターや獲得したアイテムは自分の資産となる(育てたり集めたりするモチベに繋がる)

正直なところ、「純粋なゲームとしての楽しさ」という意味ではまだまだですが、育てたモンスターを売却する、売却して得られた仮想通貨で新たなモンスターを買う、といったことができるので、そのあたりのやりくりを考えながらモンスターを育てるというのは、ブロックチェーンゲームならではの楽しさかなと思います。

具体的にどんなことするの?

モンスターの捕獲

モンスターを捕獲するには、以下の4種類の方法があります。

  • 公式店で購入する(無料モンスターも3体います)
  • マーケットで購入する(トレーナー間の売買)
  • アドベンチャーモードで捕獲する(捕獲率0.2%位です...)
  • 外部のマーケットから購入する(OpenSeaなど)

初めての人で、あまりお金かけたくないような様子見の方には、無料モンスターをお勧めします。

最初からランキング上位を狙いたい、お金に糸目はつけない、という強気な方は、マーケットでBPが高いモンスターを購入しましょう。

レーニング(レベル上げ)

ジムモードは、モンスター1体だけをレベル上げするためのモードです。
1トレーニングあたり0.001ETHかかります。個人的には使ってません...

練習モードは、3~6体のパーティーを組んで、相手(プレイヤー)のパーティーと戦うモードです。

私は、ランキングに影響する「ランクモード」のパーティーに入れるにはまだ弱いモンスターを育てるのに、「練習モード」を使っています

ランクモード

「練習モード」と同じように、3~6体のパーティーを組んで、相手(プレイヤー)のパーティーと戦うモードです。

ランクモードに参加した全プレイヤーにレーティングポイントとランキングが付けられます。

勝利数に応じて、ゲーム内通貨のEMONTを獲得することができます。

2019年からランキングに応じた報酬ももらえるようになる予定です。

モンスターの属性、ギャルソン、祖先を考慮してパーティーを組みます。
長くなるので、解説は次回以降に回します。
他の入門記事を記載しているブログを参考にしてみましょう。

アドベンチャーモード

獲得したEMONT、もしくは仮想通貨のイーサリアムを使って、アドベンチャーモードと呼ばれる、いわゆるガチャを行うことができます。

獲得できるものは、EMONT、経験値、アイテム(レベルアップ用、各ステータスアップ用)、モンスターのいずれかです。

アドベンチャーモードの土地収入

アドベンチャーモードではモンスターが各土地を冒険して、何かを獲得するという設定ですが、その土地は所有することができます。

2019年1月現在、土地の販売は終了していますが、OpenSeaなどのマーケットで購入することも可能です。

土地を所有すると、アドベンチャーモードで利用された場合に土地の利用料を獲得することができます
いわゆる地主ですね。

稼げるの?

「投資」の目的でブロックチェーンゲームをやる人も多いと思いますが、イーサエモンは稼げるのでしょうか。

今のところは、私がイーサエモンに使った仮想通貨(ETH)の原資回収はできていません。
ただし、保有しているモンスターの資産価値を考慮すると、プラスになっていると考えられます。

ゲームを始めた当初、0.1ETH程度で購入したモンスターですが、進化させて育てた結果、1ETH以上の価値のあるモンスターになっています

また、アドベンチャーモードという、いわゆるガチャでゲットした伝説のモンスターは、5ETH以上の価値があるのではないかと考えられます。

価値のあるモンスターを増やして、マーケットで売却すれば、原資回収をしたうえで、さらに価値のある資産を保有しているということになるのです。

また、アドベンチャーモードの土地を保有して地主になると、何もしなくても収入が入ってきます。
イーサエモンの利用者が増え、アドベンチャーモードが頻繁に利用されるようになると、それだけで原資回収もできるかもしれませんね。

稼ぐ方法は?

私が考えるイーサエモンで稼ぐ方法は、こんな感じです。

産卵で稼ぐ
  1. モンスターを買う
  2. 買ったモンスターを育てて卵を産ませる(モンスターのレベルが下がります)
  3. 産まれたモンスターを売る
  4. 売った資金で日々のガス代を賄いながら、また卵を産むまで育てる
  5. 産まれたモンスターを売る・・・
モンスター転売で稼ぐ
  1. マーケットで安いモンスターを買う
  2. 必要に応じて付加価値をつけるために少し育てる
  3. マーケットで購入した価格より高値で売る
アドベンチャーモードで稼ぐ

捕獲率が低いのであまりお勧めしませんが...

  1. アドベンチャーモードでモンスターを捕獲
  2. 捕獲したモンスターをマーケットで売る

※伝説のモンスターが捕獲できた場合、一気に収支はプラスになると思いますが、「捕獲できたら奇跡」くらいに思っておいた方がいいです。

今後は?

イーサエモンは「Decentraland」とパートナーになっていて、今後も非常に楽しみなのです。

Decentralandについては以下の動画を見てみてください!
※これも英語です。雰囲気だけでも・・・

youtu.be

簡単に言うと、モンスターと一緒に仮想空間を旅したり、仮想空間でバトルしたりできるようになる、といったことが起こるかもしれません。

楽しみですよね!

最後に

いかがでしょうか。

イーサエモンはイラストのせいか、モンスターに愛着もわきますし、独自のエコシステムがあり、やり方によっては稼ぐことのできる面白いゲームですので、ぜひ一緒にプレイしてみましょう!

www.etheremon.com

PoL - 仮想通貨・ブロックチェーンのオンライン学習サービス

何かと話題の仮想通貨・ブロックチェーンを無料で学べるサイト「PoL」を紹介します。

pol.techtec.world

これは何?

簡単にいうと、「仮想通貨・ブロックチェーン技術を無料で学べるオンライン学習サービス」です。

2019年1月現在、公開されているカリキュラムは以下の通りです。

  • 仮想通貨の全体観をつかもう
  • 仮想通貨に触れてみよう~ウォレット編~
  • 仮想通貨に触れてみよう~取引所編~
  • 仮想通貨に触れてみよう~マイニング編~
  • 仮想通貨を取り巻く日本の規制を学ぼう
  • ブロックチェーンって何?まずは概要をつかもう
  • ブロックチェーンと仮想通貨の関係を理解しよう
  • ブロックチェーンの仕組みを理解しよう〜暗号技術編〜

徐々にコンテンツも増えているので、これからにも期待できるサービスではないかと思います。

使いやすさとかは?

私もPoLを利用していて、今のところすべてのカリキュラムは完了しているのですが、結構使いやすいという印象です。

まとまった時間もなかなか取れないので、スキマ時間で学習することが多いのですが、確認テスト含め、スマホ対応しているのがとても良いです。

図も豊富に使われているので、複雑な仕組みもイメージしやすいように工夫されています。

学習の流れ

以下のような流れで学習を進めます。

  • カリキュラムの学習
    • レッスンの学習(図を含めたテキスト読み込み)
    • レッスンごとの確認テスト
  • カリキュラムの確認テスト(Googleフォーム)

カリキュラムごとの確認テストをたまにやってみるのも、知識の確認に良いかなと思います。

最後に

仮想通貨やブロックチェーンに興味があったり、学習しようと思っている人は、ぜひ試してみてください!

pol.techtec.world

ブロックチェーンゲーム「マイクリプトヒーローズ」

My Crypto Heroes (MCH, マイクリ) | Crypto game from Japan!

「ゲームにかけた 時間も お金も 情熱も、あなたの資産となる世界」

2018~2019年の年末年始にかけてテレビCMやAbemaTVのCM等で見かけた方もいるのではないでしょうか。

mch.gg

今回は「マイクリ」について取り上げてみます。

これって何?

「マイクリ」は、簡単に言うと「ヒーロー」を育てて、「エクステンション(武器や防具)」を装備させ、強さを競うゲームですが、日本の会社が開発・運営しているブロックチェーンゲームの一つというのが大きな特徴です。

このブログでも取り上げつつある「ブロックチェーン」ですが、「ブロックチェーンゲーム」とはブロックチェーン技術を利用したゲームのことを言います。

では、普通のゲームと何が違うのでしょうか。

簡単に言うと、普通のゲームは「頑張ってレベルを上げてラスボス倒した!」「レアモンスターゲットだぜ!」「ゲーム内のお金めっちゃ貯めた!」という行為は、そのゲーム内でしか「価値」はないのが一般的です。

しかし、ブロックチェーンゲーム」では、ゲーム内で育てたキャラクター、アイテム、ゲーム内通貨など(これらのことを「アセット」と呼びます)は、「資産」として残り続けます

その「アセット」は、たとえゲームをやめたとしても消えることはありません。
しかも、アセットを取り扱うマーケットを利用すれば、売買することが可能です。

売買できるってどういうこと?

ブロックチェーンゲーム内の売買は、一般的に「仮想通貨」を利用します。

マイクリでも、「仮想通貨」であるEthereum(イーサリアム)を使ってゲーム内の通貨であるGUMを購入したり、強いヒーローやエクステンション(武器や防具)を購入することができます。

また、自分で強くしたヒーローやエクステンションを売却することも可能です。

例えば、
・レアなエクステンションをゲット
・マーケットで売る
・売って得たGUMで強いヒーローを買う
といったことが可能です。

さらに、OpenSeaといった「アセット」を売買できるサイトを利用すれば、他のゲームやアプリ、サービスに利用できる仮想通貨(Ethereumなど)を得ることも可能です。

どうやって始めればいいの?

とりあえず↓から公式サイトにアクセスして「How to start?」を読んでみてください。

My Crypto Heroes (MCH, マイクリ) | Crypto game from Japan!

技術仕様(エンジニアの人向け)

マイクリの中の人は、かなりゲーム内部の技術仕様について語ってくれていますので、ブロックチェーンゲームがどうやって動いているのかを理解するのに大変参考になります

speakerdeck.com

最後に

いかがでしたでしょうか。

「マイクリ」に限らず、ブロックチェーンゲーム」はこれからさらにのびていく分野だと思いますので、要注目です

乗り遅れないように、とりあえずやってみることをおすすめします!

mch.gg

ブロックチェーンとは何か

f:id:nw_ocean:20181014232357p:plain

ブロックチェーンとは何かを理解していきたいと思います。

ブロックチェーンの基本的な仕組み

ブロックチェーンとは、簡単に表現すると「ブロックをチェーン(鎖)状につなげたデータベース」と言えます。

  • ブロック:「複数の取引データをまとめたもの」
  • 取引データ:「何のデータがどこからどこに、どれだけ送られたか」

f:id:nw_ocean:20181014233501p:plain

分散型台帳

「データベース」というと、どこかにデータベースのサーバーやその管理者がいるというのが一般的ですが、ブロックチェーンでは「ネットワーク上の複数のノード(コンピューター)のそれぞれがデータを持っている」という特徴があります。(=分散型)

複数のノードでデータを持つことになるので、悪意のあるノードによってデータが改ざんされることが想定されるため、改ざんに非常に強い仕組みを持っています。

さらに、複数のノードで構成されることにより、システムが停止しづらいという特徴もあります。

また、取引データがまとまったものは「台帳」と呼ぶことができるため、ブロックチェーンはその特徴から「分散型台帳技術」と呼ばれることもあります。

もう少しわかりやすい解説

このスライドが簡潔にわかりやすく解説してくださっているので、こちらをご覧ください!

「非中央集権型」

一般的な構成のシステムは、そのデータベースが止まったり、改ざんされてしまうと、全体が動作しなくなります。つまり、システム全体の管理する「中央」が存在するという形となっていて、このことを「中央集権型」と呼びます。

しかし、ブロックチェーン各ノードがそれぞれにデータベースを持つため、「非中央集権型」と呼ばれます。一部が止まったり、改ざんされたとしても、システム全体が止まることはなく、改ざんされたデータは各ノードによって拒否され、正常なデータが維持されます。

「非中央集権型」は、「中央」(=管理者)がいなくてもシステムを維持することができ取引に対する仲介手数料や、システムの管理費を管理者に支払う必要もありません

ブロックチェーンを扱う上で、「非中央集権型」という言葉はよく出てくるので、覚えておきましょう。

f:id:nw_ocean:20181014235254p:plain

仮想通貨との関係

ブロックチェーンを知ろうとすると「仮想通貨」や「ビットコイン」が必ず出てきます。

ブロックチェーンは、ビットコインの中核となす技術としてサトシ・ナカモト氏が発表した仕組み」です。その技術的な優位性により、ビットコインのみならず、他の仮想通貨や、まったく別の分野への応用も期待されるようになってきた、というわけです。

ちなみに、サトシ・ナカモト氏は日本人のような名前ですが、その存在は明らかになっていません。

今回のまとめ

今回は、ブロックチェーンの基本的な仕組みと概念、背景について触れてきました。

今後はもう少し技術的な部分について掘り下げていく予定です。


※注意※
簡単に説明するために、記事中では厳密にいうと誤っていたり、誤解を招く表現もあるかと思います。
今回はあくまでも概念を大雑把に把握することを目的としているため、予めご了承ください。
あまりにも酷い場合はご指摘いただければ修正いたします。

ブロックチェーンの勉強を始めました

もう随分と更新していませんでしたが・・・

突然ですが、最近何かと話題になっているブロックチェーンの勉強を始めました。

ブロックチェーンというのは、ものすごく簡単に言うと、

  • 仮想通貨に使われている技術
  • インターネット以来の発明
  • 活用範囲は仮想通貨だけに留まらず、さまざまな分野に応用され始めている

・・・など、いろいろと言われている、これからアツい分野であることはほぼ間違いないテクノロジーです。

もう少し勉強を進めたら、入門記事とか、書いていってみようと思います!

FuelPHP + MySQL で PHP Webアプリケーションを作ってみる ― データ表示処理

データベースからデータを取得して画面表示する処理を実装します。

データベース接続設定

まず、FuelPHPでデータベースに接続するための設定を行います。
app/config/development/db.php に下記を設定します。

<?php

return array(
    'default' => array(
        'type'           => 'pdo',
        'connection'  => array(
            'dsn' => 'mysql:host=localhost;dbname=user_management',
            'username'       => 'root',
            'password'       => '********', // 設定したパスワード
            'persistent'     => false,
            'compress'       => false,
        ),
        'identifier'     => '`',
        'table_prefix'   => '',
        'charset'        => 'utf8',
        'enable_cache'   => true,
        'profiling'      => false,
        'readonly'       => false,
    ),
);

Model

データベースからデータを取得する機能は、Modelと呼ばれるクラスで実装します。
今回は、とりあえず条件なしに全件取得する処理を実装します。

DEPT_MSTからデータを取得するModel: app/classes/model/deptmst.php

<?php
namespace Model;

class DeptMst extends \Model  {
    public static function get_all()
    {
        $results = \DB::query('SELECT * FROM dept_mst')->execute();
        return $results->as_array();
    }
}

USER_MSTからデータを取得するModel: app/classes/model/usermst.php

<?php
namespace Model;

class UserMst extends \Model  {
    public static function get_users()
    {
        $query = 'SELECT d.DEPT_NAME ' .
                 '     , u.USER_CD ' .
                 '     , u.USER_NAME ' .
                 '     , u.ENTER_DATE ' .
                 '  FROM user_mst u ' .
                 '  INNER JOIN dept_mst d ' .
                 '          ON d.dept_cd = u.dept_cd ';
        $results = \DB::query($query)->execute();
        return $results->as_array();
    }
}

Controller

Modelを使ってデータを取得し、画面表示するためのViewを呼び出す処理をControllerとして実装します。
app/classes/controller/list.php

<?php
use \Model\DeptMst;
use \Model\UserMst;

class Controller_List extends Controller
    public function action_index()
    {
        $data['depts'] = DeptMst::get_all(); // DEPT_MSTからデータ取得
        $data['users'] = UserMst::get_users(); // USER_MSTからデータ取得
        return Response::forge(View::forge('list/index', $data));
    }
 }

View

Controllerから呼び出されるViewを実装します。
Viewでは、渡されたデータをHTMLとして表示する役割を担います。
前回はプルダウンの内容や一覧のデータは固定で記載していましたが、ここでは取得したデータを表示するようになっています。
app/views/list/index.php

<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <title>社員管理システム</title>
  <?php echo Asset::css('style.css'); ?>
</head>
<body>
  <div class="header">
    <h1>社員管理システム</h1>
  </div>
  <div class="main">
    <table class="search">
      <tr>
        <th>所属</th>
        <td>
          <select class="dept_code">
            <option selected>(選択してください)</option>
            <?php
            foreach ($depts as $dept)
            {
                echo '<option>'.$dept['DEPT_NAME'].'</option>';
            }
            ?>
          </select>
        </td>
      </tr>
      <tr>
        <th>社員コード</th>
        <td><input type="text" class="emp_code small" value="" /></td>
      </tr>
      <tr>
        <th>社員名</th>
        <td><input type="text" class="emp_name wide" value="" /></td>
      </tr>
    </table>
    <div class="action_area">
      <button class="search_button">検索</button>
    </div>
    <table class="list">
      <tr>
        <th style="width: 100px;">所属</th>
        <th style="width: 100px;">社員コード</th>
        <th style="width: 200px;">社員名</th>
        <th style="width: 100px;">入社</th>
      </tr>
      <?php
      foreach ($users as $user)
      {
          echo '<tr>'.
               '<td>'.$user['DEPT_NAME'].'</td>'.
               '<td>'.$user['USER_CD'].'</td>'.
               '<td>'.$user['USER_NAME'].'</td>'.
               '<td>'.date('Y/m/d', strtotime($user['ENTER_DATE'])).'</td>'.
               '</tr>';
      }
      ?>
    </table>
  </div>
</body>
</html>

FuelPHP + MySQL で PHP Webアプリケーションを作ってみる ― 画面表示

ここからは実際に画面を作っていきます。

画面デザイン

今回はこのような画面を作ってみたいと思います。
f:id:nw_ocean:20140405160402p:plain

FuelPHPで画面を表示してみる

プロジェクト作成

以前紹介したときと同様に、NetBeansFuelPHPのプロジェクトを作ります。
[新規プロジェクト > PHPアプリケーション]を選択していき、PHPフレームワークのところでFuelPHPを選択します。
ここでは、プロジェクト名を「UserManagement」としました。
f:id:nw_ocean:20140405160453p:plain

base_urlの設定

app/config/config.php の base_url を下記のように書き換え、ベースとなるURLを設定します。

'base_url'  => '/usermanagement/public/',

Controllerの作成

controller 配下に list.php を下記の内容で作成します。

<?php

class Controller_List extends Controller
{
	public function action_index()
	{
		return Response::forge(View::forge('list/index'));
	}
}

Viewの作成

views 配下に list フォルダを作成し、その中に index.php を作成します。

<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <title>社員管理システム</title>
  <?php echo Asset::css('style.css'); ?>
</head>
<body>
  <div class="header">
    <h1>社員管理システム</h1>
  </div>
  <div class="main">
    <table class="search">
      <tr>
        <th>所属</th>
        <td>
          <select class="dept_code">
            <option selected>(選択してください)</option>
            <option>総務部</option>
            <option>経理部</option>
            <option>開発部</option>
          </select>
        </td>
      </tr>
      <tr>
        <th>社員コード</th>
        <td><input type="text" class="emp_code small" value="" /></td>
      </tr>
      <tr>
        <th>社員名</th>
        <td><input type="text" class="emp_name wide" value="" /></td>
      </tr>
    </table>
    <div class="action_area">
      <button class="search_button">検索</button>
    </div>
    <table class="list">
      <tr>
        <th style="width: 100px;">所属</th>
        <th style="width: 100px;">社員コード</th>
        <th style="width: 200px;">社員名</th>
        <th style="width: 100px;">入社</th>
      </tr>
      <tr>
        <td>総務部</td>
        <td>00001</td>
        <td>総務 一郎</td>
        <td>2000/04/01</td>
      </tr>
      <tr>
        <td>総務部</td>
        <td>00002</td>
        <td>総務 次郎</td>
        <td>2001/04/01</td>
      </tr>
      <tr>
        <td>経理部</td>
        <td>00003</td>
        <td>経理 三郎</td>
        <td>2002/04/01</td>
      </tr>
      <tr>
        <td>経理部</td>
        <td>00004</td>
        <td>経理 史郎</td>
        <td>2003/04/01</td>
      </tr>
    </table>
  </div>
</body>
</html>

スタイルシートの作成

assets/css 配下に style.css を作成します。

body {
  font-size: 10pt;
}
.header {
  width: 100%;
  text-align: center;
}
.main {
  width: 100%;
}
.action_area {
  width: 100%;
  text-align: center;
  margin: 10px;
}
h1 {
  font-size: 12pt;
  margin: 30px;
}
table {
  margin-left: auto;
  margin-right: auto;
}
table.search {
  width: 500px;
  margin-left: auto;
  margin-right: auto;
  border-style: solid;
  border-width: 1px;
}
table.search th {
  background-color: #C2FFA3;
  width: 120px;
}
table.list {
  width: 600px;
  border-style: solid;
  border-width: 1px;
}
table.list th {
  background-color: #C2FFA3;
  width: 120px;
}
table.list td {
}
input.small {
  width: 100px;
}
input.wide {
  width: 300px;
}
button {
  width: 100px;
}

確認

Apacheを起動し、ブラウザで「http://localhost/usermanagement/public/list/」にアクセスして確認してください。