はじめに
XRP LedgerでNFTのmint、transferするまでのチュートリアルを試しました。
XRPLではネイティブでNFTが扱えるので、スマートコントラクトを作るというよりはどうやって操作するのかを調査します。
とはいえ、公式リポジトリのnft mint処理のhtmlを開いて、実行しただけです。
アカウント作成
最初に紹介したhtmlを開いて、Get New Standby Accountをクリックするだけです。
これだけでtestnet上に使えるXRP配られて使える状態になるのは便利ですね。
NFT mint
Mint NFTボタンを押すだけです。
Transaction Receipt
nfts: {
"result": {
"ledger_hash": "C4A8F7A36EF9220967BF4918B16794CBD727FA22F0E3446DDD9C63C006F66972",
"ledger_index": 12931659,
"validated": true,
"account": "r4awAxMKLoDmzgSDHwNivujgmAQWp5cZHR",
"account_nfts": [
{
"NFTokenID": "00010000E755066744A0DCD4C71F15DE74D7EEEA5EFE111427615EC100C54F26",
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469",
"Flags": 1,
"Issuer": "r4awAxMKLoDmzgSDHwNivujgmAQWp5cZHR",
"NFTokenTaxon": 0,
"nft_serial": 12930854
},
{
"NFTokenID": "00010000E755066744A0DCD4C71F15DE74D7EEEA5EFE11143E472FC200C54F27",
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469",
"Flags": 1,
"Issuer": "r4awAxMKLoDmzgSDHwNivujgmAQWp5cZHR",
"NFTokenTaxon": 0,
"nft_serial": 12930855
},
{
"NFTokenID": "00010000E755066744A0DCD4C71F15DE74D7EEEA5EFE1114552D00C300C54F28",
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469",
"Flags": 1,
"Issuer": "r4awAxMKLoDmzgSDHwNivujgmAQWp5cZHR",
"NFTokenTaxon": 0,
"nft_serial": 12930856
}
],
"limit": 100
},
"id": 15,
"api_version": 2,
"type": "response",
"warnings": [
{
"id": 2001,
"message": "This is a clio server. clio only serves validated data. If you want to talk to rippled, include 'ledger_index':'current' in your request"
}
]
}
コード
処理としては以下のようになっています。
// Note that you must convert the token URL to a hexadecimal
// value for this transaction.
// ------------------------------------------------------------------------
const transactionJson = {
"TransactionType": "NFTokenMint",
"Account": standby_wallet.classicAddress,
"URI": xrpl.convertStringToHex(standbyTokenUrlField.value),
"Flags": parseInt(standbyFlagsField.value),
"TransferFee": parseInt(standbyTransferFeeField.value),
"NFTokenTaxon": 0 //Required, but if you have no use for it, set to zero.
}
// ----------------------------------------------------- Submit signed blob
const tx = await client.submitAndWait(transactionJson, { wallet: standby_wallet} )
const nfts = await client.request({
"method": "account_nfts",
"account": standby_wallet.classicAddress
})
Flagsは NFTTokenMint 時のみ設定可能で、後から変更不可です。

公式Docより引用
フラグ値計算例
例:lsfBurnable (0x0001), lsfOnlyXRP (0x0002), lsfTransferable (0x0008)
→ 合計値: 1 + 2 + 8 = 11
→ ビッグエンディアン表記: 0x000B
NFTのID
IDの採番は以下のようになっています。

公式Docより
Dの部分がNFTの種類(EVMでいうコントラクトアドレス)にあたる部分ですかね。
NFT Transfer
これも公式リポジトリのhtmlファイルをローカルで開いて実行しただけです。
EVMと違ってtransferした後に、受け取る側がAcceptしないといけないようです。正確にはCreate Sell Offerしてから受け取る側でNFT Offer Indexを指定してAccept Sell Offerをする必要があります。
なので、あるNFTを任意のアドレスに持たせるにはMint, Create Sell Offer, Accept Cell Offerの3つのtxが必要そうです。
疑問点
以下正しいかどうか裏取ってないのですが、ChatGPTの回答
シーケンス番号が1からじゃないのはなぜ?
Testnetではアカウントリセットとかあるので、以前に使われていた可能性がある
本番で確かめれば良さそう。
同いTaxon使ってるのにTaxon部分が発行する度に変わるのはなぜ?
NFT発行時にTaxonはscrambledされるため。ただし、XRPL APIでは取得できる
Explorer上では分類ごとに見るみたいなことできないからちょっと不便かも
シーケンスが32bitなら40億個くらいまでしかIssuerごとに発行できない?
その通り
通常ユースケースなら、問題ないけどちょっと少なく感じる。
Taxonが違っても関係なく、Issuerごとに上限が32bit
BulkMintとかない?
ありません。
txの並行処理するしかなさそうです。とはいえ、現在Batch TransactionというのがMainnetへの導入検討中(多分入りそう?)だそうなので、これを使うとある程度はまとめて処理することができそうです。




