EOS 学習メモ:トークンお試し編

in #eos6 years ago (edited)

dg1uxga7sv.jpg

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"}



alicebob の残高を確認する。

 $ 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 に送ったわけなので、想定通りである。めでたし。

今回はここまで。