Skip to content

Instantly share code, notes, and snippets.

@YoshihitoAso
Last active September 7, 2018 11:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YoshihitoAso/a11649b2409bf21ab155dc6a589dfa29 to your computer and use it in GitHub Desktop.
Save YoshihitoAso/a11649b2409bf21ab155dc6a589dfa29 to your computer and use it in GitHub Desktop.

EOS開発環境構築〜コントラクトサンプル実行

0. 前準備

  1. Dockerをインストールする。
  2. ここでは、下記のディレクトリを作成しておく。※構成は自由だが、変える場合は以下の手順を適宜書き換える必要がある。
.
├── build
│   └── hello
├── config ※nodeosのconfigが格納される
├── contracts ※コントラクトコードの本体
├── data  ※nodeosのデータ領域
└── work

1. 環境構築

1-1. イメージ取得

  • v1.2系(v1.2.4まで試している)を利用した場合、コントラクトのデプロイ時にWASMのエラーが発生した。
  • ここではv1.1系を利用している。
$ sudo docker pull eosio/eos-dev:v1.1.0

1-2. ネットワーク作成

  • 仮装ネットワークを作成する。
$ sudo docker network create -d bridge eosdev
  • 参考:削除
$ sudo docker network rm eosdev

1-3. nodeosコンテナ起動

  • 開発用ローカルネットワークを作成する。以下を実行すれば良い。コマンドオプションの説明などは割愛。
$ sudo docker run --rm --name nodeos -d -p 8888:8888 --network eosdev \
-v /home/yoshihito/eos/work:/work \
-v /home/yoshihito/eos/data:/mnt/dev/data \
-v /home/yoshihito/eos/config:/mnt/dev/config \
-v /home/yoshihito/eos/contracts:/contracts \
-v /home/yoshihito/eos/build:/build \
{コンテナイメージを指定}  \
/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"

1-4. keosdコンテナ起動

  • keosdを起動する。
  • ここで、keosdは外付けのボリュームを指定していないので、コンテナを落とした場合には情報が消えることに注意。
  • コンテナを落としても情報を残したい場合は、dockerのオプションを適宜修正する。
$ sudo docker run -d --name keosd --network=eosdev -p 9876:9876 \
-i eosio/eos-dev /bin/bash -c "keosd --http-server-address=0.0.0.0:9876 --http-validate-host=false"

1-5. 動作確認

  • ネットワークの動作確認
$ sudo docker logs -f nodeos
  • エンドポイントの動作確認
$ curl http://localhost:8888/v1/chain/get_info

1-6. CLI用のエイリアスの設定

  • cleos のエイリアスを指定しておくと楽なので設定しておく。
  • 以下を毎度設定するか、.bashrcなどに追記しておく。
$ alias cleos='sudo docker exec -it nodeos /opt/eosio/bin/cleos \
--url http://127.0.0.1:8888 --wallet-url http://keosd:9876'

2. ウォレットの作成

2-1. ウォレットの作成

  • ウォレットを作成する。
$ cleos wallet create --to-console
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JLACYa7XyinwS7Qsw9PVyJWcwtjBb143gQF5eg9KSzQJe*****"

このパスワードを忘れてはいけない。控えておく必要がある。

  • ウォレットの一覧取得
$ cleos wallet list
Wallets:
[
  "default"
]
  • ウォレットはロック/アンロックが可能。
  • アンロックは以下のように行う。
$ cleos wallet unlock -n default --password PW5JLACYa7XyinwS7Qsw9PVyJWcwtjBb143gQF5eg9KSzQJe*****
  • アンロックするとウォレットの一覧の見た目が若干変わる(アスタリスクが付く)。
$ cleos wallet list
Wallets:
[
  "default *"
]

2-2. 鍵の作成とインポート

  • 鍵の発行。
$ cleos create key --to-console
Private key: 5KMJQxyS5p62QfACFXL1qP1SBmvqzPWdZbcTVD2wEnY3Yn*****
Public key: EOS66GZgrJutTnNRc5Pf865nrvX4GLt2X61QiqENFgh4LSAwqHAhr
  • 「eosio」というデフォルトのユーザを登録する必要がある。5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3という秘密鍵をインポートする。
$ cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
  • 通常ユーザの鍵をインポートする。上で発行した鍵をインポートする。
$ cleos wallet import --private-key 5KMJQxyS5p62QfACFXL1qP1SBmvqzPWdZbcTVD2wEnY3YnzuUhh
imported private key for: EOS66GZgrJutTnNRc5Pf865nrvX4GLt2X61QiqENFgh4LSAwqHAhr
  • インポートしたキーの一覧を表示する。
$ cleos wallet keys
[
  "EOS66GZgrJutTnNRc5Pf865nrvX4GLt2X61QiqENFgh4LSAwqHAhr",
  "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"
]
  • Private Key の一覧を表示する。
$ cleos wallet private_keys --password PW5JLACYa7XyinwS7Qsw9PVyJWcwtjBb143gQF5eg9KSzQJe*****
[[
    "EOS66GZgrJutTnNRc5Pf865nrvX4GLt2X61QiqENFgh4LSAwqHAhr",
    "5KMJQxyS5p62QfACFXL1qP1SBmvqzPWdZbcTVD2wEnY3Yn*****"
  ],[
    "EOS8PrujWmrdpCqKLK9ew1bqUVTaBFej1SQ7Uct3oagwPrvCi6CR9",
    "5KUidfWZdrhK6T1o3dHHKDG9wjAz8xEApn6HETuJKtmpJgwHc8c"
  ]
]
  • コントラクトのアカウントを作成する。
  • cleos create account eosio {任意のアカウント名} {オーナー公開鍵} {アクティブ公開鍵}
  • オーナー鍵とアクティブ鍵が同じでもOK。
$ cleos create account eosio hello.code EOS66GZgrJutTnNRc5Pf865nrvX4GLt2X61QiqENFgh4LSAwqHAhr EOS66GZgrJutTnNRc5Pf865nrvX4GLt2X61QiqENFgh4LSAwqHAhr
  • 作成したアカウントを確認する。
$ cleos get accounts EOS66GZgrJutTnNRc5Pf865nrvX4GLt2X61QiqENFgh4LSAwqHAhr
{
  "account_names": [
    "hello.code"
  ]
}

3. コントラクトのコンパイル〜デプロイ〜実行

3-1. コントラクトサンプル

contracts/hello.cpp

#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;

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

      /// @abi action
      void hi( account_name user ) {
         print( "Hello, ", name{user} );
      }
};

EOSIO_ABI( hello, (hi) )

3-2. コンパイル

$ sudo docker exec -it nodeos /bin/bash -c "eosiocpp -o build/hello/hello.wast contracts/hello.cpp"

3-3. ABI作成

$ sudo docker exec -it nodeos /bin/bash -c "eosiocpp -g build/hello/hello.abi contracts/hello.cpp"

3-4. デプロイ

  • cleos set contract {コントラクトアカウント} {WASMファイルの格納場所} {デプロイアカウント名}@{権限}
$ cleos set contract hello.code build/hello -p hello.code@active

3-5. 疎通

  • 以下は関数hiの実行例である。
  • この例では「eosio」アカウントの「active」権限で実行を行なっている。
$ cleos push action hello.code hi ["eosio"] -p eosio@active
executed transaction: 82fb98f0215db787661484770a45eb6ea9783f5366dca7113a6e4b9d19af0763  104 bytes  1767 us
#    hello.code <= hello.code::hi               {"user":"eosio"}
>> Hello, eosio
warning: transaction executed locally, but may not be confirmed by the network yet    ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment