Gluebyでトークン発行できるらしいからやてみよう。Tapyrusハンズオンワークショップレポジトリのall_samplesブランチから資料拝借。
下準備
Tapyrusのdevノード立ててrakeタスク整備していこう
ノード立て
いつもの。
$ git clone https://github.com/chaintope/workshop202107.git $ cd workshop202107 $ git checkout all_samples $ docker-compose up -d
ちなめっちゃ時間かかった
DB作成
$ docker compose exec web bundle exec rails db:migrate
Create wallet
$ docker compose exec web bundle exec rails tapyrus:createwallet
3回
したら書き込み
# wallet FAUCET_ID = "f7f1ba5b929f4bec56b6218eec5b811e" SENDER_ID = "b0a74fae23bee3b25ecb33a67f6dc588" RECEIVER_ID = "9f44c2adbe74ccc1765396539e92fa48"
Generate block
$ docker compose exec web bundle exec rails tapyrus:generate
all_sampleブランチでは最後にSyncも一緒にやってくれるそう。便利〜。
試しにgetbalance
$ docker compose exec web bundle exec rails tapyrus:getbalance faucet balance={""=>5000000000} sender balance={} receiver balance={}
できてるね
トークン発行
いざ
FT発行
Bitcoinベースなのでカラードコインチック
$ docker compose exec web bundle exec rails tapyrus:issuetoken rails aborted! Glueby::Contract::Errors::InsufficientFunds: Glueby::Contract::Errors::InsufficientFunds /myapp/lib/tasks/tapyrus.rake:86:in `block (2 levels) in <main>' /myapp/bin/rails:5:in `<top (required)>' /myapp/bin/spring:10:in `require' /myapp/bin/spring:10:in `block in <top (required)>' /myapp/bin/spring:7:in `<top (required)>' Tasks: TOP => tapyrus:issuetoken (See full trace by running task with --trace)
う〜〜んw
資金不足らしい。レイクタスク覗くとsenderさんのwallet使って発行してるらしいのでfaucetからsenderさんにお金渡しておこう。
$ docker compose exec web bundle exec rails tapyrus:faucet $ docker compose exec web bundle exec rails tapyrus:generate % docker compose exec web bundle exec rails tapyrus:getbalance faucet balance={""=>9000000000} sender balance={""=>1000000000} receiver balance={}
ではもう一回
$ docker compose exec web bundle exec rails tapyrus:issuetoken [Warning] Use key_type parameter instead of compressed. compressed parameter removed in the future. [Warning] Use key_type parameter instead of compressed. compressed parameter removed in the future. issue token: id=0d7a60034049d8a2f7d0e2b7e8d5162e624c142200095f3726f30a39d2e3b9af, type=reissuable 0fdc3a0a41b7567ff0da444bdb0a557707324be41ff24609c5e015b145d664ce 61ddf3e5de03417b7830a6fa39b0c0e417be81c800612b5904c6c53c6111e1fb
いけたね。warningは無視します。下3行について、
puts "issue token: id=#{token_id}, type=#{token_type}" => issue token: id=0d7a60034049d8a2f7d0e2b7e8d5162e624c142200095f3726f30a39d2e3b9af, type=reissuable txs.each do |tx| puts tx.txid => 0fdc3a0a41b7567ff0da444bdb0a557707324be41ff24609c5e015b145d664ce => 61ddf3e5de03417b7830a6fa39b0c0e417be81c800612b5904c6c53c6111e1fb
下2つがトランザクションIDっぽい。ほえ〜。作ったトークンインスタンスに格納されてるっぽい。
トークン情報を取得
$ docker compose exec web bundle exec rails tapyrus:tokeninfo[0d7a60034049d8a2f7d0e2b7e8d5162e624c142200095f3726f30a39d2e3b9af]
引数はさっきのid
...いや動かんなんで???わからんけど中身見るとみれる内容id
とtype
だけっぽいから省略。
NFT発行
$ docker compose exec web bundle exec rails tapyrus:issuenft rails aborted! Glueby::Contract::Errors::InsufficientFunds: Glueby::Contract::Errors::InsufficientFunds /myapp/lib/tasks/tapyrus.rake:126:in `block (2 levels) in <main>' /myapp/bin/rails:5:in `<top (required)>' /myapp/bin/spring:10:in `require' /myapp/bin/spring:10:in `block in <top (required)>' /myapp/bin/spring:7:in `<top (required)>' Tasks: TOP => tapyrus:issuenft (See full trace by running task with --trace)
あれ?
$ docker compose exec web bundle exec rails tapyrus:getbalance faucet balance={""=>9000000000} sender balance={} receiver balance={}
無一文で草
$ docker compose exec web bundle exec rails tapyrus:faucet $ docker compose exec web bundle exec rails tapyrus:generate $ docker compose exec web bundle exec rails tapyrus:getbalance faucet balance={""=>13000020000} sender balance={"c10d7a60034049d8a2f7d0e2b7e8d5162e624c142200095f3726f30a39d2e3b9af"=>100, ""=>1999980000} receiver balance={}
ここのgenerateでブロック生成されたタイミングで一個前のFTがwallet内に残高として記録された。のでこんな表記になってる。ともあれお金入ったので、
$ docker compose exec web bundle exec rails tapyrus:issuenft [Warning] Use key_type parameter instead of compressed. compressed parameter removed in the future. issue token: id=6c3155e0ef2ab177e997f0efda2060f424e0862bf671c9154fcb3685960fc581, type=nft 8b2614725df2fdc0011cb939a05c3deb2a35bf704cef9f219d1099edf8f6fb73
できたあ。今回はトランザクション一回なんだなあ。ふむ。
確定させてバランス取ってみよう。
$ docker compose exec web bundle exec rails tapyrus:generate $ docker compose exec web bundle exec rails tapyrus:getbalance faucet balance={""=>18000030000} sender balance={"c10d7a60034049d8a2f7d0e2b7e8d5162e624c142200095f3726f30a39d2e3b9af"=>100, ""=>1999970000, "c36c3155e0ef2ab177e997f0efda2060f424e0862bf671c9154fcb3685960fc581"=>1} receiver balance={}
考察
・アマウント
FT発行について、rakeタスク読むとamount: 100
なので100
発行。かかったお金は1000000000
NFT発行について、同じくamount: 100
だけどバランス取ると1
。かかったお金は10000
uuum.
NFTさんのrakeタスク上のamount: 1
にしたけど結果変わらずバランスとって1
、かかったお金10000
NFTの場合は無視されるのかな?
と思ってGluebyの本体見に行くと
def issue_reissuable_token(issuer:, amount:) ~~~ end def issue_nft_token(issuer:) tx = create_issue_tx_for_nft_token(issuer: issuer) tx = issuer.internal_wallet.broadcast(tx) out_point = tx.inputs.first.out_point color_id = Tapyrus::Color::ColorIdentifier.nft(out_point) [[tx], color_id] end
ということでNFTではamount無視されることがわかりました。ちなみにエラー回避は
case token_type when Tapyrus::Color::TokenTypes::REISSUABLE issue_reissuable_token(issuer: issuer, amount: amount) when Tapyrus::Color::TokenTypes::NON_REISSUABLE issue_non_reissuable_token(issuer: issuer, amount: amount) when Tapyrus::Color::TokenTypes::NFT issue_nft_token(issuer: issuer) else raise Glueby::Contract::Errors::UnsupportedTokenType end
引数token_type
でswitchして中身で端的に引数のamount
使ってないだけだった
つまりtoken_type
がNFTの時のamount
は廃棄されるということですね。
・トークンID
てかNFTさんのtoken_id
違くね?
発行時点で "6c3155e0ef2ab177e997f0efda2060f424e0862bf671c9154fcb3685960fc581"
バランスで "c36c3155e0ef2ab177e997f0efda2060f424e0862bf671c9154fcb3685960fc581"
頭にc3
が追加されたのはなぜ?
んでよくみたらFTさんも違った、頭にc1
が追加されてる。
トークンタイプ?そんな気がする。
多分だけど c1: REISSUABLE
, c2: NON_REISSUABLE
, c3: NFT
かな。最初のFTは分類上REISSUABLE
。
参考