Gluebyでトークン発行してみる

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"
lib/tasks/tapyrus.rake
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...いや動かんなんで???わからんけど中身見るとみれる内容idtypeだけっぽいから省略。

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
glueby/lib/glueby/contract/token.rb

ということで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
glueby/lib/glueby/contract/token.rb

引数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

参考