見出し画像

【EOS 開発】 環境構築からコントラクトの実行までできる開発チュートリアル

こんにちは。DaiDaiです。今回はEOSの開発チュートリアルを作成してみました。
日本語情報がとても少ないので開発者の助けになれば幸いです!
※eosv1.1を対象としています。

目次
1.環境構築
2.ウォレットの作成
3.アカウントの作成
4.コントラクトの作成
5.コントラクトのデプロイ、実行

1.環境構築

・ docker インストール
ubutnu16.04の方はこちらを参照

//まずは下準備からしていきます。
$ sudo apt-get update
$ sudo apt-get upgrade

//dockerのインストール
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
//インストール確認
$ sudo docker -v
Docker version 18.06.0-ce, build 0ffa825

daiki@daiki-ThinkPad-X1-Carbon-3rd:~$ docker run --name eosio -d -p 8888:2888 -p 8876:8876 -v /tmp/work:/work -v /tmp/eosio/data:/mnt/dev/data -v /tmp/eosio/config:/mnt/dev/config eosio/eos-dev:v1.1.0 /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"

Macの方はこちらを参照。

・ eos v1.1.0のimageを取得

$ docker pull eosio/eos-dev:v1.1.0

・ コンテナを起動
※コンテナの起動と同時にシングルノードの起動を行っています

$ docker run --name eosio -d -p 8888:2888 -p 8876:8876 -v /tmp/work:/work -v /tmp/eosio/data:/mnt/dev/data -v /tmp/eosio/config:/mnt/dev/config eosio/eos-dev:v1.1.0 /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"

・ ノードの監視
ブロックの生成やコントラクトの実行結果等が確認できます。

$ docker logs -f eosio

・ コンテナのIPアドレス取得

//$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' コンテナIDまたはコンテナ名
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' eosio
172.17.0.2

・ 動作確認
http://172.17.0.2:8888/v1/chain/get_info
こちらのURLにアクセスします。
172.17.0.2の部分は自分のコンテナのIPアドレスに書き換えてください。
以下の値が表示されれば正常に動いてることの確認が取れます。
※Macでは確認できないようです。logの出力さえできていれば問題なく、動作はするのでとばしても問題ありません。

//画面に表示されます。
{"server_version":"75635168","chain_id":"cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f","head_block_num":94142,"last_irreversible_block_num":94141,"last_irreversible_block_id":"00016fbd9b6fdb6498576bb394cd17a874864e883f9fc9ea02fc287062874020","head_block_id":"00016fbe03e5eee5bafd99e21827f8feae9ba6f3ea34f401d983daffbe1a4a25","head_block_time":"2018-10-12T06:43:48.000","head_block_producer":"eosio","virtual_block_cpu_limit":200000000,"virtual_block_net_limit":1048576000,"block_cpu_limit":199900,"block_net_limit":1048576}

・ コンテナにログイン

$ docker exec -it eosio bash

・ 下準備

# apt-get update
# apt-get install lsof

2.ウォレットの作成

・ ウォレットの作成
ウォレットのpasswordが表示されます。
ウォレットのアンロックやウォレット内の秘密鍵を表示する場合に使用します。
※忘れないよう保存しておいてください!

# cleos wallet create
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JXCHq8ReVv6MqETxYkvWSqx7eHtRqvnVbruEodzoTGJeuo7sCa"

・ ウォレットの確認
ウォレットが生成されているか確認します。

# cleos wallet list
Wallets:
[
 "default *"
]

・ ウォレットのunlock
ウォレットは定期的にLockされます。Lockされた場合はコントラクトの実行等、鍵を使うアクションがすべて実行できなくなります。想定通りの動作が行われない時はまず鍵のunlockを実行してみましょう。

# cleos wallet unlock --password PW5JXCHq8ReVv6MqETxYkvWSqx7eHtRqvnVbruEodzoTGJeuo7sCa
Error 3120007: Already unlocked

3.アカウントの作成

コントラクトをデプロイ、実行するためにはアカウントが必要です。アカウントを作成するためには鍵を生成し、アカウント名をつける必要があります。

・ eosioアカウントの作成
アカウント名と鍵を紐付ける際に別のアカウントが必要です。今回はデフォルトで用意されているeosioアカウントを利用します。

以下のprivate keyを固定でウォレットにインポートします。
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
インポートした時点でeosioアカウントとして認識されます。

# cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

・ 鍵の作成

# cleos wallet create_key
Created new private key with a public key of: "EOS6hiCxCTRk4qqtWPWAvRqco3FmL6BWbEYCiKGjMPMaKqRBsnh9L"

・ インポートされている公開鍵の確認

# cleos wallet keys
[
 "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"
 "EOS6hiCxCTRk4qqtWPWAvRqco3FmL6BWbEYCiKGjMPMaKqRBsnh9L"
]

・ インポートされている秘密鍵の確認
ウォレットのpasswordを使用することでウォレット内の秘密鍵を確認することができます。

//walletの暗号鍵を利用
# cleos wallet private_keys --password PW5JXCHq8ReVv6MqETxYkvWSqx7eHtRqvnVbruEodzoTGJeuo7sCa
[[
   "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
   "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
 ],[
   "EOS6hiCxCTRk4qqtWPWAvRqco3FmL6BWbEYCiKGjMPMaKqRBsnh9L",
   "5Jq9AcGH5RmTmdFnRxDgiF8iKtNzrd8rCMDVS7pDLfA3j1JThgj"
 ]
]


・ アカウント作成
eosioアカウントを用いてtesterアカウントを作成します。testerアカウントは先ほど作った公開鍵を使用します。

//# cleos create account eosio tester eosio_public_key tester_public_key
# cleos create account eosio tester EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6hiCxCTRk4qqtWPWAvRqco3FmL6BWbEYCiKGjMPMaKqRBsnh9L
executed transaction: 515511161f5f3e19364d173b7e754fa0782db804b7a5b1110acb1cab7a23f1bc  200 bytes  283 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"tester","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJq...

4.コントラクトの作成

・ コントラクトの作成

# mkdir hey
# cd hey/
# vim hey.cpp

以下のコントラクトをコピーして貼り付けてください。

#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
class hey : public eosio::contract {
 public:
     using contract::contract;
     /// @abi action
     void hi( account_name user ) {
        print( "hey, ", name{user} );
     }
};
EOSIO_ABI( hey, (hi) )

・ コントラクトをWebAssemblyにコンパイル
コントラクトをコンパイルし、wastファイルにコンパイルします。

# eosiocpp -o hey.wast hey.cpp

・ コントラクトをABIにコンパイル
コントラクトをコンパイルし、abiファイルにコンパイルします。

root@654c83558d07:/contracts/hey# eosiocpp -g hey.abi hey.cpp
2018-08-19T06:44:47.026 thread-0   abi_generator.hpp:68          ricardian_contracts  ] Warning, no ricardian clauses found for hey
2018-08-19T06:44:47.026 thread-0   abi_generator.hpp:75          ricardian_contracts  ] Warning, no ricardian contract found for hi
Generated hey.abi ...

・ファイルの確認

# ll
total 56
drwxr-xr-x 2 root root  4096 Aug 19 06:44 ./
drwxr-xr-x 1 root root  4096 Aug 19 06:42 ../
-rw-r--r-- 1 root root   485 Aug 19 06:44 hey.abi
-rw-r--r-- 1 root root   300 Aug 19 06:44 hey.cpp
-rw-r--r-- 1 root root  3042 Aug 19 06:44 hey.wasm
-rw-r--r-- 1 root root 32490 Aug 19 06:44 hey.wast

5.コントラクトのデプロイ、実行

・ コントラクトのデプロイ
testerアカウントでhey.contractをデプロイします。

//cleos set contract [アカウント] ../hey -p [アカウント]@active
# cleos set contract tester ../hey -p tester@active
Reading WAST/WASM from ../hey/hey.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 6a9455dd07edb91f09985e81fcb9b6896a088b64fe2b02d0eaa487dd861c81e3  1792 bytes  464 us
#         eosio <= eosio::setcode               {"account":"tester","vmtype":0,"vmversion":0,"code":"0061736d01000000013b0c60027f7e006000017e60027e7...
#         eosio <= eosio::setabi                {"account":"tester","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d65010000000...
warning: transaction executed locally, but may not be confirmed by the network yet    ] 

・ コントラクトの実行
testerアカウントでデプロイしたコントラクトをeosioアカウントから実行していきます。

//cleos push action [デプロイ先のアカウント] hi ["eosio"] -p [送り元のアカウント]@active
# cleos push action tester hi ["eosio"] -p eosio@active
executed transaction: 4b80d5858b6207f88d5edb0079db54499352a31a01f7788f17fdd0d0943b8f68  104 bytes  314 us
#        tester <= tester::hi                   {"user":"eosio"}
>> hey, eosio
warning: transaction executed locally, but may not be confirmed by the network yet    ] 

ノードのログも確認しましょう。

[(tester,hi)->tester]: CONSOLE OUTPUT BEGIN =====================
hey, eosio
[(tester,hi)->tester]: CONSOLE OUTPUT END   =====================

コントラクトが実行されていることを確認できました!

この記事が気に入ったらサポートをしてみませんか?