💬

[Astar]コントラクト備忘録16(psp34の「_mint_to」について)

2023/02/28に公開

こちらの知見がたまったので、備忘録として残します。

1 概要

  1. psp34の「_mint_to」について

2 内容

こちらのコントラクトを作成しました。

OpenBrushのexampleの中身そのままです。

#![cfg_attr(not(feature = "std"), no_std)]
#![feature(min_specialization)]

#[openbrush::contract]
pub mod my_psp34 {
    use openbrush::{
        contracts::psp34::extensions::metadata::*,
        traits::Storage,
    };

    #[ink(storage)]
    #[derive(Default, Storage)]
    pub struct Contract {
        #[storage_field]
        psp34: psp34::Data,
        #[storage_field]
        metadata: Data,
        next_id: u8,
    }

    impl PSP34 for Contract {}

    impl Contract {
        #[ink(constructor)]
        pub fn new() -> Self {
            Self::default()
        }

        #[ink(message)]
        pub fn mint_token(&mut self) -> Result<(), PSP34Error> {
            self._mint_to(Self::env().caller(), Id::U8(self.next_id))?;
            self.next_id += 1;
            Ok(())
        }

        #[ink(message)]
        pub fn mint(&mut self, id: Id) -> Result<(), PSP34Error> {
            self._mint_to(Self::env().caller(), id)
        }
    }
}

1) _mint_toについて

今回は、この辺りの関数を見てみようと思います。

ここで実行されている、「_mint_to」に着目します。

OpenBrushの「psp34.rs」を見てみます。

このように、実際の処理として、以下が行われていることがわかります。

self.data().balances.increase_balance(&to, &id, true);
self.data().token_owner.insert(&id, &to);


https://github.dev/Supercolony-net/openbrush-contracts

2) increase_balanceについて

では、ここで行われている、「increase_balance」関数について見てみましょう。

下のように、#[inline(always)]となっています。

こちらは、下のchatGPTにもあるように、コンパイラが常にインライン展開するように指示するRustの属性です。

chatGPT

では、コードの中身を見てみましょう。

マッピングである、「owned_tokens_count」を取得し、「unwrap_or」関数を実行しています。

そして、下にあるように、「unwrap_or」関数は値が存在する場合はその値を返し、ない場合は指定された値を返します。

今回であれば、0を返します。

chatGPT

3) insertについて

では、次は「insert」関数です。

下のように、「push_packed_root」関数を実行しています。

こちらにあるように、「insert」関数はストレージにキーと値のペアを格納するために使用されます。

chatGPT

4) mint_tokenについて

また、今回のコードに戻りますが、「mint_token」メソッドは実行時に、「self.next_id」をインクリメントしています。

(なお、そのため「mint」関数で既にトークンIDがミントされている場合はエラーになります。)

ちなみに、IDはこちらの「types.rs」にあります。

5) 実行してみよう

実際に行うと、このように実行することができます。

なお、トークンIDがミント済みの場合はこのようになります。

Shibuya

aPd2PUTUxMyUnv1xwAdztHdAYQZkAxaNLpBneewWz97QKFD

今回は以上です。

Discussion