🐙

[Astar]RMRKコントラクト備忘録⑤(「assign_metadata」「token_uri」を細かく見てみよう!)

2023/04/01に公開

本日は、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