EOSのスマートコントラクト開発入門

そもそもEOSとは?

仮想通貨の一種。ビットコインの仲間です。

ビットコインとの違いはブロックチェーンの利用用途です。

ビットコインは通貨の残高管理を行うために改ざん不可能なデータベースであるブロックチェーンを利用していますが、

EOSは通貨の残高管理だけでなくプログラムの実行結果も管理するためにブロックチェーンを利用します。

同じようにプログラムを実行可能な仮想通貨としてEthereumと呼ばれる仮想通貨が有名ですが、EOSはイーサリアムに比べてスケーラビリティ性能がいいと言われています。

(これはビットコインやイーサリアムがPoWという分散性が高い一方でスケーラビリティが低いアルゴリズムを採用して構築されているのに対して、EOSがDPoSという分散性を妥協した代わりにスケーラビリティの高いアルゴリズムを採用していることが理由ですが、長くなるのでここでは省略します。)

このEOS、最近少し流行っているようで、Dappladerを見ると、Ethereumのアプリケーションの一日の利用者数が一日数百程度であるのに対して、EOSは8000人近くのアプリケーションが存在します。

流行っているらしいので入門してみよう

というわけで簡単に入門(というか何ができるかを調査)してみました。

ブロックチェーンのインストール

まず最初にインストール方法から・・・。

https://developers.eos.io/eosio-nodeos/docs/docker-quickstart

を参考に以下のコマンドを叩きます。

$ docker pull eosio/eos-dev:latest
$ docker network create eosdev
$ docker run \
  --name nodeos -d -p 8888:8888 \
  --network eosdev \
  -v /tmp/eosio/work:/work \
  -v /tmp/eosio/data:/mnt/dev/data \
  -v /tmp/eosio/config:/mnt/dev/config \
  eosio/eos-dev \
/bin/bash -c \
  "nodeos -e -p eosio \
    --plugin eosio::producer_plugin \
    --plugin eosio::history_plugin \
    --plugin eosio::chain_api_plugin \
    --plugin eosio::history_api_plugin \
    --plugin eosio::http_plugin \
    -d /mnt/dev/data \
    --config-dir /mnt/dev/config \
    --http-server-address=0.0.0.0:8888 \
    --access-control-allow-origin=* \
    --contracts-console \
    --http-validate-host=false" \
    --filter-on="*"

これでローカルのdockerにEOSのブロックチェーンが立ち上がります。curlでlocalhost:8888にアクセスすればブロックチェーンの情報が取得できます。

curl http://localhost:8888/v1/chain/get_info

また、後述する秘密鍵やアカウントの管理のために便利なクライアントツールがあるので、そちらも以下に従ってインストールします。

https://developers.eos.io/eosio-home/docs/installing-the-contract-development-toolkit

brew tap eosio/eosio.cdt
brew install eosio.cdt

秘密鍵・公開鍵、ウォレット、アカウントの概念

EOS特有の概念として秘密鍵・公開鍵とウォレットとアカウントがあります。

秘密鍵・公開鍵

ビットコインや他のブロックチェーンは、秘密鍵と公開鍵に基づいてトランザクション(ブロックチェーン上の何らかの処理)を判定します。

秘密鍵と公開鍵は暗号学に基づいた安全性の高いパスワードとアカウント名のようなものだと考えればOKです。

秘密鍵(パスワード)を持っていれば、公開鍵(アカウント名)に紐付いて保存されている仮想通貨の送受信やスマートコントラクト処理などを行うことができます。

以下のコマンドで秘密鍵と公開鍵を作成できます。

$ cleos create key --to-console

Private Key: 5...... Public Key: EOS.....

上記のような結果がコンソールに保存されると思うので保存します。

これを利用して、仮想通貨の送信や受信などができるようになる・・・はずです。

ウォレット

以上のように、個別に秘密鍵を作成して保存・管理することはできますが、それだけだと管理コストが高いので、ウォレットと呼ばれるソフトウェアを利用して秘密鍵を暗号化して保存します。

$ cleos wallet create --to-console

ここでパスワードが表示されると思いますが、これは秘密鍵を暗号化して管理するための大事なものなので、大切に保管しましょう。

$ cleos wallet import

上記コマンドを打って先程作成した秘密鍵を入力することでウォレットで管理することができるようになります。(ちなみにcleos wallet create keyを実行すると鍵の作成と保管を一度にやってくれます)

アカウント

ウォレットにて鍵の管理は比較的楽になりましたが、公開鍵は人間が覚えるのは極めて困難なランダムな文字列です。

アカウント機能を利用して管理しやすくしましょう。今回はaliceという名前をつけます。

cleos create account eosio alice  [作成した公開鍵:EOS......] -p eosio@active

ただし、このコマンドを実行するためには管理者アカウントであるeosioの秘密鍵をウォレットに読み込んでいる必要があります。以下を実行してください。

$ cleos wallet import
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

スマートコントラクトの作成とデプロイ

以上で開発環境やアカウント周りの知識はOKかと思うので、hello_worldコントラクトを作成してdeployしてみます。

今回は以下のようなhello worldコントラクトをdeployしてみます。

#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>

using namespace eosio;

class hello : public contract {
  public:
      using contract::contract;

      [[eosio::action]]
      void hi( name user ) {
         print( "Hello, ", user);
      }
};

EOSIO_DISPATCH( hello, (hi))

コンパイル

$ eosio-cpp -o hello.wasm hello.cpp --abigen

デプロイ

$ cleos set contract hello . -p hello@active

ただし、helloというアカウントに対してdeployしているので、前述した方法で秘密鍵公開鍵とアカウントを作成します。

以上で完了です。以下のようなコマンドを実行すると動作確認可能です。

$ cleos push action hello hi '["alic"]' -p alice@active

(これもaliceアカウントが必要なので別途作成してください)

まとめ

まだテストネットやメインネットへのリリース方法など把握していない&どれくらいの性能がでるのか不明ですが、勉強次第まとめます。