🐈
[Astar]コントラクト備忘録18(psp34 Metadataについて)
こちらの知見がたまったので、備忘録として残します。
1 概要
- psp34 Metadataについて
2 内容
こちらのコントラクトを作成しました。
OpenBrushのexampleの中身そのままです。
#![cfg_attr(not(feature = "std"), no_std)]
#![feature(min_specialization)]
#[openbrush::contract]
pub mod my_psp34 {
use ink_prelude::vec::Vec;
use ink_storage::traits::SpreadAllocate;
use openbrush::{
contracts::psp34::extensions::metadata::*,
traits::{
Storage,
String,
},
};
#[derive(Default, SpreadAllocate, Storage)]
#[ink(storage)]
pub struct Contract {
#[storage_field]
psp34: psp34::Data,
#[storage_field]
metadata: metadata::Data,
}
impl PSP34 for Contract {}
impl PSP34Metadata for Contract {}
impl Contract {
/// A constructor which mints the first token to the owner
#[ink(constructor)]
pub fn new(id: Id, name: String, symbol: String) -> Self {
ink_lang::codegen::initialize_contract(|instance: &mut Self| {
let name_key: Vec<u8> = String::from("name");
let symbol_key: Vec<u8> = String::from("symbol");
instance._set_attribute(id.clone(), name_key, name);
instance._set_attribute(id, symbol_key, symbol);
})
}
}
}
では、このコードを見てみましょう。
1) Vec<u8>に値を入れるとは?
例えば、下はString::from("name")などをVec<u8>に入れていますが、これはそもそもどういうことなのでしょうか?
こちらの、chatGPTによる回答がわかりやすいと思います。
Vecは可変のバイト列を表し、u8は符号無し整数を表します。
そのため、下のように、各文字を文字コードにしたものを格納しています。
chatGPT
2) _set_attributeについて
では、下の_set_attributeについてです。
その名の通り、属性を設定していると想像がつきますが、実際に見てみましょう。
下のように、self.data().attributes()にデータを設定していることがわかります。
そして、attributesはMappingであることが書かれています。
そして、3番目に書かれていた、「AttributesKey」は、下のように、キーの型であることがわかりました。
3) get_attributeについて
そして、下のように、get_attributeが実装されていることも確認できました。
4) やってみよう
では、実際にやってみましょう。
下のように、IDをu8の「0」、「name」を「test」、「symbol」を「TST」に設定しました。
このように、get_attributeで取得することができました。
そして、デコードしてみると、うまく行っていることも確認できました。
https://dencode.com/ja/string/hex
shibuya
WZR3CA4Pq5SokRHeN9H4BueyFGsbV5CSW4SCJEYZ14GDmur
今回は以上です。
Discussion