🐙

Tapyrus Tokenにメタデータを付与

2022/05/21に公開

Tapyrus Token にメタデータを付与

昨年 Tap! で実装した「NFT にメタデータをオンチェーンで持たせる方法」について、そろそろ忘れそうなので今のうちにまとめる。記事内では NFT について触れるが、Reissuable Token, Non-Reissuable Token でも同様の方法で実装可能なはず。

追記

実際に試せる Rails アプリを作って公開しました。
任意の Metadata ファイルを IPFS へアップロードし NFT を発行するまでの一連の流れをローカルで試せます。Docker Compose を使い Rails app, tapyrusd, IPFS ノードを構築します。

https://github.com/shmn7iii/tapyrus_token_metadata_sample

結論

先に結論。
「NFT 発行トランザクションのアウトプットに『IPFS へアップロードした任意 Metadata ファイルの CID を OP_RETURN の後ろに入れたアウトプット』を追加」しました。

01.jpeg

実装

とてもざっくり。ソースコードは Tap! 準拠。
発行自体は以下。

# wallet = 対象のウォレット
# cid = 対象ファイルのCID

tokens = Glueby::Contract::Token.issue_tap_nft(wallet: wallet, prefix: '', content: cid)

tokens に発行されたトークンが入る。発行処理は Glueby の issue_nft メソッドをオープンクラスで改造して作った issue_tap_nft を利用。

issue_tap_nft を含むオープンクラス箇所は以下。

https://github.com/shmn7iii/tapyrus_token_metadata_sample/blob/main/lib/monkey_patches/glueby/glueby_add_issue_nft_with_metadata_method.rb

issue_tap_nft に加え、トランザクションの発行メソッド create_tx_for_tap_nft も作成した。実際に CID をアウトプットに加える作業はこのメソッド内で処理している。ほとんどは元からあった NFT 用トランザクション発行メソッドの内容と同じであり、追加部分は

https://github.com/shmn7iii/tapyrus_token_metadata_sample/blob/main/lib/monkey_patches/glueby/glueby_add_issue_nft_with_metadata_method.rb#L43-L45

の部分。入れたい CID から script(Tapyrus Script)を用意し、それを新たなアウトプットとしてトランザクションに加えている。

script の作成部分について、ここで OP_RETURN の後ろに(ペイロード化した)CID を入れ込んだ Tapyrus Script を作成している。

https://github.com/shmn7iii/tapyrus_token_metadata_sample/blob/main/lib/monkey_patches/glueby/glueby_add_issue_nft_with_metadata_method.rb#L61-L69

これでトランザクションは

TxIn 発行に利用する UTXO
TxOut NFT を含む UTXO
OP_RETURN 以降に CID が格納された Script を含むアウトプット

のような構造になる。

GitHubで編集を提案

Discussion

ログインするとコメントできます