Tapyrus Tokenにメタデータを付与
Tapyrus Token にメタデータを付与
昨年 Tap! で実装した「NFT にメタデータをオンチェーンで持たせる方法」について、そろそろ忘れそうなので今のうちにまとめる。記事内では NFT について触れるが、Reissuable Token, Non-Reissuable Token でも同様の方法で実装可能なはず。
追記
実際に試せる Rails アプリを作って公開しました。
任意の Metadata ファイルを IPFS へアップロードし NFT を発行するまでの一連の流れをローカルで試せます。Docker Compose を使い Rails app, tapyrusd, IPFS ノードを構築します。
結論
先に結論。
「NFT 発行トランザクションのアウトプットに『IPFS へアップロードした任意 Metadata ファイルの CID を OP_RETURN の後ろに入れたアウトプット』を追加」しました。
実装
とてもざっくり。ソースコードは 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
を含むオープンクラス箇所は以下。
issue_tap_nft
に加え、トランザクションの発行メソッド create_tx_for_tap_nft
も作成した。実際に CID をアウトプットに加える作業はこのメソッド内で処理している。ほとんどは元からあった NFT 用トランザクション発行メソッドの内容と同じであり、追加部分は
の部分。入れたい CID から script
(Tapyrus Script)を用意し、それを新たなアウトプットとしてトランザクションに加えている。
script の作成部分について、ここで OP_RETURN の後ろに(ペイロード化した)CID を入れ込んだ Tapyrus Script を作成している。
これでトランザクションは
TxIn | 発行に利用する UTXO |
---|---|
TxOut | NFT を含む UTXO |
OP_RETURN 以降に CID が格納された Script を含むアウトプット |
のような構造になる。
Discussion