[Astar]コントラクト備忘録16(psp34の「_mint_to」について)
こちらの知見がたまったので、備忘録として残します。
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