EOS 学習メモ:コントラクト実行権限編 の続き。
今回は ココ に用意されている token
contract を用いる。コードは触った後で読もうと思うけど、これが Ethereum で言うところの ERC20 みたいな標準規格に則った実装なのかな?後で調べよう。
まずは token
contract を GitHub から落としてくる(前にまだ git をインストールしていなかったので、先にしておく)。
$ apt install git -y
$ cd /tmp/contracts
$ git clone https://github.com/EOSIO/eosio.contracts --branch v1.4.0 --single-branch
token 用の account をつくる。
$ cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
token
contract をコンパイルする。こないだは -I
オプションをつけなかったが、今回はヘッダファイルが分割されて include
ディレクトリ下に配置されており、これを src
ディレクトリ下の contract が include しているため、つけてコンパイラに教えてあげる必要がある。
$ cd eosio.contracts/eosio.token
$ eosio-cpp -I include -o eosio.token.wasm src/eosio.token.cpp --abigen
デプロイする。
$ cleos set contract eosio.token . --abi eosio.token.abi -p eosio.token@active
Reading WASM from /tmp/contracts/eosio.contracts/eosio.token/eosio.token.wasm...
Publishing contract...
executed transaction: 88c44241a05c85cdc7d5ac416562f8352f2fc3f6055d3573126af93d0a966a7d 9304 bytes 68415 us
# eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d0100000001aa011c60037f7e7f0060047f...
# eosio <= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e310008076163636f756e7400010762616c616e63...
シンボルと総発行量を指定してトークンを生成する(まだ発行ではない)。issuer(トークンに関する管理系操作を行える特権 account 的な位置付けらしい)には eosio
を指定。総発行量とシンボルに関しては、Bitcoin への愛を込めて 21000000.0000 LOVE とする。
$ cleos push action eosio.token create '[ "eosio", "21000000.0000 LOVE"]' -p eosio.token@active
executed transaction: bc4c72bc65dabb0c58d8e2b026b630f6046604ed1406b8e44342459906b5b99c 120 bytes 1479 us
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"21000000.0000 LOVE"}
issuer である eosio
から、こないだつくった alice
に対して 1 LOVE 発行する。
$ cleos push action eosio.token issue '[ "alice", "1.0000 LOVE", "congrats!" ]' -p eosio@active
executed transaction: 1c27b782ec77a195f5063a2c897e42de5657766de34d4193c2b0a2824c0a3ca5 128 bytes 20257 us
# eosio.token <= eosio.token::issue {"to":"alice","quantity":"1.0000 LOVE","memo":"congrats!"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"alice","quantity":"1.0000 LOVE","memo":"congrats!"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"alice","quantity":"1.0000 LOVE","memo":"congrats!"}
# alice <= eosio.token::transfer {"from":"eosio","to":"alice","quantity":"1.0000 LOVE","memo":"congrats!"}
issue
action の中で transfer
action が実行されているので、transfer
action 関連のログも出力されている。issue
action は transfer
action を実行しなければならないわけではないが、全ての account の残高は transfer
action だけから算出できた方がよいよね、などの基本方針の下、実行するようにしているらしい。
なお、ブロードキャストせずにどんなトランザクションになるか確認したい場合は -d
オプション(don't broadcast)と -j
オプション(return transaction as json)をつければよいよとのこと。
$ cleos push action eosio.token issue '[ "alice", "1.0000 LOVE", "congrats!" ]' -p eosio@active -d -j
{
"expiration": "2019-01-30T18:44:25",
"ref_block_num": 63138,
"ref_block_prefix": 183074369,
"max_net_usage_words": 0,
"max_cpu_usage_ms": 0,
"delay_sec": 0,
"context_free_actions": [],
"actions": [{
"account": "eosio.token",
"name": "issue",
"authorization": [{
"actor": "eosio",
"permission": "active"
}
],
"data": "0000000000855c341027000000000000044c4f564500000009636f6e677261747321"
}
],
"transaction_extensions": [],
"signatures": [
"SIG_K1_KkSnFjeVF8gwoAMYJUCPtRxQc7Xd5aBVdbzsFVPXyy8iMuojHiUmgShza3gra4HDwxg9CkxBsQp2kRtHNB4B47XyfVyEqF"
],
"context_free_data": []
}
さて。発行はできたようなので、試しに alice
から bob
に 0.1 LOVE を送ってみる。
$ cleos push action eosio.token transfer '[ "alice", "bob", "0.1000 LOVE", "so cool" ]' -p alice@active
executed transaction: 9738c14c36a7963b100d6e007ee88c6b57f2ef16e64897230d122d43acbb4f85 136 bytes 3621 us
# eosio.token <= eosio.token::transfer {"from":"alice","to":"bob","quantity":"0.1000 LOVE","memo":"so cool"}
# alice <= eosio.token::transfer {"from":"alice","to":"bob","quantity":"0.1000 LOVE","memo":"so cool"}
# bob <= eosio.token::transfer {"from":"alice","to":"bob","quantity":"0.1000 LOVE","memo":"so cool"}
alice
と bob
の残高を確認する。
$ root@55c05f196687:/tmp/contracts/eosio.contracts/eosio.token# cleos get currency balance eosio.token alice LOVE
0.9000 LOVE
$ root@55c05f196687:/tmp/contracts/eosio.contracts/eosio.token# cleos get currency balance eosio.token bob LOVE
0.1000 LOVE
alice
はもともと 1 LOVE 保有していて 0.1 LOVE を bob
に送ったわけなので、想定通りである。めでたし。
今回はここまで。