🐈

[Astar]コントラクト備忘録18(psp34 Metadataについて)

2023/03/01に公開

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

1 概要

  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