軽量NFTであるURITokenを触ってみる
XRPレジャー とは
XRPレジャーはBitcoinやEthereumなどと同じ分散型のパブリックブロックチェーンです。PoWやPoSとは異なる独自のコンセンサスアルゴリズムが用いられています。
トークン機能やDEX機能をプロトコルネイティブに搭載しており、強力な決済機能があります。決済機能だけでなくNFTやAMM(開発中)、Hooks(スマコン/開発中)など様々な機能を搭載しています。
URIToken
URITokenはXRPレジャーに軽量かつ第一級オブジェクトとしてのNFT機能をもたらします。
このNFTは同一発行者で同一のURIデータを設定することが出来ないため、URIの一意性が保証されます。
スマートコントラクト機能であるHooksにおいてNFTをより簡単に利用できるようになることも特徴のひとつです。
執筆時点でXLS-35dとして開発中の機能であり、Hooks Testnet v3にて利用可能となっています。
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にて利用可能となっています。
またライブラリは以下のリポジトリのものを利用しています。
今回利用したコードは以下になります。
URITokenMint
トランザクションの実行結果
meta.AffectedNodes[0]を確認するとCreatedNodeによりURIToken
オブジェクトが作成されていることが確認できます。
URITokenCreateSellOffer
トランザクションの実行結果
meta.AffectedNodes[0]を確認するとModifiedNodによりオファーの情報が追加されていることが確認できます。
URITokenBuy
トランザクションの実行結果
meta.AffectedNodes[2]を確認するとModifiedNodeによりURIToken
のOwner
が購入者へ変更され、Offer情報が削除されていることが確認できます。
URITokenBurn
トランザクションの実行結果
meta.AffectedNodes[1]を確認するとDeletedNodeによりURIToken
オブジェクトが削除されていることが確認できます。
おわりに
現在コミュニティにより開発中のURIToken機能について紹介しました。実際にトランザクションを実行してみるとNFTokenと比較しその挙動のシンプルさがわかると思います。
今回使用したコードは以下のリポジトリから参照できます。
興味を持たれた方はXRPレジャー開発者のDiscordチャンネルへ是非お越しください!
日本語チャンネルもありますので、英語ができなくても大丈夫です!
Discussion