- Dockerをインストールする。
- ここでは、下記のディレクトリを作成しておく。※構成は自由だが、変える場合は以下の手順を適宜書き換える必要がある。
.
├── build
│ └── hello
├── config ※nodeosのconfigが格納される
├── contracts ※コントラクトコードの本体
├── data ※nodeosのデータ領域
└── work
- v1.2系(v1.2.4まで試している)を利用した場合、コントラクトのデプロイ時にWASMのエラーが発生した。
- ここではv1.1系を利用している。
$ sudo docker pull eosio/eos-dev:v1.1.0
- 仮装ネットワークを作成する。
$ sudo docker network create -d bridge eosdev
- 参考:削除
$ sudo docker network rm eosdev
- 開発用ローカルネットワークを作成する。以下を実行すれば良い。コマンドオプションの説明などは割愛。
$ 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"
- 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"
- ネットワークの動作確認
$ sudo docker logs -f nodeos
- エンドポイントの動作確認
$ curl http://localhost:8888/v1/chain/get_info
- 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'
- ウォレットを作成する。
$ 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 *"
]
- 鍵の発行。
$ 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"
]
}
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) )
$ sudo docker exec -it nodeos /bin/bash -c "eosiocpp -o build/hello/hello.wast contracts/hello.cpp"
$ sudo docker exec -it nodeos /bin/bash -c "eosiocpp -g build/hello/hello.abi contracts/hello.cpp"
cleos set contract {コントラクトアカウント} {WASMファイルの格納場所} {デプロイアカウント名}@{権限}
$ cleos set contract hello.code build/hello -p hello.code@active
- 以下は関数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 ]