[Astar]RMRKコントラクト備忘録⑤(「assign_metadata」「token_uri」を細かく見てみよう!)
本日は、RMRKの「Minting」について続きを見ていきます。
こちらの「assign_metadata」関数について見ていきます。
すると、「nft_metadata」というマッピングに挿入していることがわかります。
「MintingData」を確認すると、データが4つあり、そのうちの一つに「nft_metadata」があることが確認できました。
ここで、このキーのタイプである、「ResolverKey」について見ていきましょう。
まず、大まかな構成として、「PhantomData」型を表しており、「StorageKey」と「KeyType」が実装されていることが確認できます。
そして、下のように、ResolverKeyはL,Rという型パラメータを持ち、その型パラメータの情報を保持するために、「PhantomData」を使用していることがわかります。
では次に、「StorageKey」の実装部分についても見ていきましょう。
LがAutoKeyか否かによりKeyという関連定数が定義されています。
下のように、「StorageKey」はストレージキーを表すためのトレイトです。
Lが「AutoKey」か否かにより、LかRのどちらをKeyにするかを定義しています。
次に、KeyTypeを見て見ましょう。
ここでは、「IS_AUTO_KEY」が定義されています。
このように、Rは関係なく、Lが「IS_AUTO_KEY」か否かのみで決定しています。
では、「assign_metadata」に戻り、こちらの「insert」関数も見てみましょう。
こちらになります。
構造としては、「ink_env::set_contract_storage」を実行し、キーとバリューを設定しています。
せっかくなので、Valueの用件となっている、「Storable」も見てみます。
このように、「Sized」の継承と、「encode」「decode」で構成されていることが確認できました。
なお、Sizedについてはこちらです。
Rustでは、コンパイル時にサイズが既知である型をsized type, サイズが動的に決まる型をunsized typeとしています。
せっかくなので、Codecも見ていきます。
CodecはEncodeとDecodeにより構成されています。
そして、Encodeの定義がこちらです。
エンコード時のサイズを予想するヒントを返す、size_hintメソッドなどがあります。
では、実際にやって見ましょう。
このように設定することができます。
他にも「token_url」メソッドも見てみましょう。
「ensure_exists_and_get_owner」メソッドがあります。
その名の通り、下のように、所有者がいるかどうかを確認し、いない場合は「TokenNotExists」エラーを返します。
「_token_uri」メソッドは下のように、uriを返し、設定されていない場合は、「UriNotFound」エラーを返します。
and_thenメソッドについてはこちらです。
値が存在する場合のみ処理を行います。
and_then()内では、下のようにクロージャが実行されています。
なお、「PreludeString」は「ink::prelude::string::String」です。
では、実際にやってみましょう。
トークンがそもそも存在しない時は、このようにエラーを出します。
uriが存在しているときは、このようにuriを返し、
存在しない時は、このように返します。
今回は以上です。
Discussion