🖼️

軽量NFTであるURITokenを触ってみる

2023/05/25に公開

XRPレジャー とは

XRPレジャーはBitcoinやEthereumなどと同じ分散型のパブリックブロックチェーンです。PoWやPoSとは異なる独自のコンセンサスアルゴリズムが用いられています。
トークン機能やDEX機能をプロトコルネイティブに搭載しており、強力な決済機能があります。決済機能だけでなくNFTやAMM(開発中)、Hooks(スマコン/開発中)など様々な機能を搭載しています。

URIToken

URITokenはXRPレジャーに軽量かつ第一級オブジェクトとしてのNFT機能をもたらします。

このNFTは同一発行者で同一のURIデータを設定することが出来ないため、URIの一意性が保証されます。
スマートコントラクト機能であるHooksにおいてNFTをより簡単に利用できるようになることも特徴のひとつです。

執筆時点でXLS-35dとして開発中の機能であり、Hooks Testnet v3にて利用可能となっています。

https://github.com/XRPLF/XRPL-Standards/discussions/89

https://xumm.notion.site/Hooks-V2-V3-staging-net-info-518fa261c5cd49d2bcb89a5b9e7bef05

NFToken(XLS20)との比較

すでにメインネットで利用可能なNFTとしてNFToken(XLS20)が存在します。URITokenはNFToken(XLS20)と比較して以下のような特徴を持ちます。

NFToken URIToken
一意性 発行者+index 発行者+URI
第一級オブジェクト NFTokenPage URIToken
NFT準備金 NFTokenPage(平均16NFT)毎 1NFT毎
オファー NFTokenOffer URIToken内に設定
オファー準備金 あり なし
NFTオーダーブック ⭕️
ロイヤリティ ⭕️
ブローカーモード ⭕️

NFTの機能性という面ではNFTokenの方が優れており、複雑なユースケースに対応できますが、NFTokenではなくNFTokenPageが第一級オブジェクトである点が少ない準備金でNFTを扱える反面NFToken自体を扱いにくいという問題があります。

URITokenはシンプルなNFTの機能性を持ち、第一級オブジェクトである点がNFTokenよりも優れています。Hooksによるスマートコントラクト機能を利用することで、NFTを使った柔軟なロジックに対応することが簡単になります。

準備金の点ではNFTokenは平均16NFT毎、また1オファー毎に準備金が必要になります。URITokenは1NFT毎に準備金が必要となりますが、オファーによる準備金は必要ありません。

レジャーオブジェクトタイプ

URIToken

URITokenオブジェクトは次のような情報を表します。
トークンの発行者、所有者やURIを含むことがわかると思います。

{
  "LedgerEntryType":"URIToken",
  "Issuer":"rN38hTretqygfgcvADnJwZzHu5rawAvmkX",
  "Owner":"rN38hTretqygfgcvADnJwZzHu5rawAvmkX",
  "URI":"68747470733A2F2F6D656469612E74656E6F722E636F6D2F666752755A7A662D374B5541414141642F6465616C2D776974682D69742D73756E676C61737365732E676966",
  "Flags":0
}

他の設定可能ないくつかのフィールドは以下のトランザクションタイプにて説明します。

トランザクションタイプ

URITokenMint

URITokenMintトランザクションはURITokenで表されるNFTを発行するためのトランザクションです。
このトランザクションによりアカウントの必要とする所有者準備金が増加します。

以下はURITokenMintトランザクションの例です。

{
  "TransactionType":"URITokenMint",
  "Account":"raKG2uCwu71ohFGo1BJr7xqeGfWfYWZeh3",
  "Digest":"894E3B7ECDC9F6D00EE1D892F86E9BF0098F86BBD6CBB94D6ABFD78030EB5B9B",
  "URI":"68747470733A2F2F6D656469612E74656E6F722E636F6D2F666752755A7A662D374B5541414141642F6465616C2D776974682D69742D73756E676C61737365732E6A736F6E",
  "Flags": 1
}

DigestフィールドにはURIフィールドが指すコンテンツのハッシュ値を指定することができ、ミント時からURIのコンテンツが変更されていないかを検証することが可能になります。URIコンテンツの変更を意図するNFTではこのフィールドは省略することが望ましい場合があります。

FlagsフィールドではミントするNFTが発行者によってバーン可能かを指定することができます。バーン可能なNFTはURITokenBurnトランザクションによってバーンすることができます。バーン可能である場合、NFTの売買が発行者のHooksによって拒否することが可能になります。

URITokenBurn

URITokenMintトランザクションはURITokenで表されるNFTをバーンするためのトランザクションです。
このトランザクションによりバーンしたNFTを保有するアカウントの所有者準備金は減少します。

以下はURITokenBurnトランザクションの例です。

{
  "TransactionType":"URITokenBurn",
  "Account":"r9XAC6zP5Db4qZBgRbweKUPtroxYnydTEQ",
  "URITokenID":"0FAC3CD45FCB800BB9CCCF907775E7D4FB167847D8999FF05CE7456D6C3A70FA",
}

URITokenの保有者はそのNFTをいつでもバーンすることができます。URITokenのミント時にFlagsフィールドでバーン可能なNFTとして設定されている場合は、発行者がバーンすることが可能となります。

URITokenCreateSellOffer

URITokenの売却オファーを作成するためのトランザクションです。

XLS20のNFTokenとは異なり、オファーのオブジェクトは作成せず、URITokenオブジェクトに直接オファーの情報を設定します。
すでにオファー情報が設定されていた場合は、上書きされます。

以下はURITokenCreateSellOfferトランザクションの例です。

{
  "TransactionType":"URITokenCreateSellOffer",
  "Account":"r9XAC6zP5Db4qZBgRbweKUPtroxYnydTEQ",
  "Amount":"100000",
  "URITokenID":"0FAC3CD45FCB800BB9CCCF907775E7D4FB167847D8999FF05CE7456D6C3A70FA",
  "Flags":524288
}

Amountフィールドでは売却の最低金額を指定します。XRPやIOUの額を指定します
Flagsフィールド

URITokenCancelSellOffer

URITokenの売却オファーをキャンセルするためのトランザクションです。
URITokenからオファー情報を削除します。

以下はURITokenCancelSellOfferトランザクションの例です。

{
   "Account":"rpiLN1C94hGKGpLUbhsadVHzdSXtB2Ldra",
   "TransactionType":"URITokenCancelSellOffer",
   "URITokenID":"0FAC3CD45FCB800BB9CCCF907775E7D4FB167847D8999FF05CE7456D6C3A70FA"
}

URITokenBuy

URITokenを購入するためのトランザクションです。
事前にURITokenCreateSellOfferトランザクションによりオファー情報が設定されていなければなりません。
つまりURITokenの取引はオンレジャー上では売却オファーの作成が必ず先に来ることになります。

{
  "TransactionType":"URITokenBuy",
  "Account":"rpiLN1C94hGKGpLUbhsadVHzdSXtB2Ldra",
  "Amount":"100001",
  "URITokenID":"0FAC3CD45FCB800BB9CCCF907775E7D4FB167847D8999FF05CE7456D6C3A70FA"
}

Destinationが指定されている場合はそのアカウントのみが購入することが可能です。
Amountフィールドは通貨が一致し、オファーの指定額以上である必要があります。

実際に試してみる

URIToken機能は執筆時点では開発中であり、Hooks Testnet v3にて利用可能となっています。
https://hooks-testnet-v3.xrpl-labs.com

またライブラリは以下のリポジトリのものを利用しています。
https://github.com/Transia-RnD/xrpl.js/tree/beta

今回利用したコードは以下になります。

https://github.com/develoQ/xrpl-sample/blob/main/samples/uritoken/index.ts

URITokenMintトランザクションの実行結果

https://hooks-testnet-v3-explorer.xrpl-labs.com/tx/F22BF9D6B78B00BC726B393653C602F07E1E0B0F983B0457381F184533DC9B01

meta.AffectedNodes[0]を確認するとCreatedNodeによりURITokenオブジェクトが作成されていることが確認できます。

URITokenCreateSellOfferトランザクションの実行結果

https://hooks-testnet-v3-explorer.xrpl-labs.com/tx/60EEE959F09E13CD33128974B2A247498484D9870D9EEAE13AEC419B30A16EF6

meta.AffectedNodes[0]を確認するとModifiedNodによりオファーの情報が追加されていることが確認できます。

URITokenBuyトランザクションの実行結果

https://hooks-testnet-v3-explorer.xrpl-labs.com/tx/6D5759F74FD3C2C58174477D1456F8B82F91CED07F344F39BD627B4CA55714E9

meta.AffectedNodes[2]を確認するとModifiedNodeによりURITokenOwnerが購入者へ変更され、Offer情報が削除されていることが確認できます。

URITokenBurnトランザクションの実行結果

https://hooks-testnet-v3-explorer.xrpl-labs.com/tx/EEC5D4726779426DB73B24C8A0294403C99A9A4E2379014946442582044CC787

meta.AffectedNodes[1]を確認するとDeletedNodeによりURITokenオブジェクトが削除されていることが確認できます。

おわりに

現在コミュニティにより開発中のURIToken機能について紹介しました。実際にトランザクションを実行してみるとNFTokenと比較しその挙動のシンプルさがわかると思います。

今回使用したコードは以下のリポジトリから参照できます。

https://github.com/develoQ/xrpl-sample/blob/main/samples/uritoken

興味を持たれた方はXRPレジャー開発者のDiscordチャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
https://xrpldevs.org

Discussion