📖

[Astar]コントラクト備忘録14(文字列の初期化時設定について)

2023/02/26に公開

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

1 概要

  1. 文字列の初期化時設定について

2 内容

この記事は、こちらの続きになります。
https://zenn.dev/yuki2020/articles/0254ccba1e6413

こちらのメッセージを作成しました。

#[ink(constructor)]
        pub fn new(total_supply: Balance, name: Option<String>, symbol: Option<String>, decimal: u8, myname: Option<String>) -> Self {
            ink_lang::codegen::initialize_contract(|instance: &mut Self| {
                instance.metadata.name = name;
                instance.metadata.symbol = symbol;
                instance.metadata.decimals = decimal;
                instance.myname = myname;
                instance
                    ._mint_to(instance.env().caller(), total_supply)
                    .expect("Should mint total_supply");
            })
        }
        #[ink(message)]
        pub fn token_myname(&self) -> Option<String> {
            self.myname.clone()
        }

そして、構造体について、このように設定しました。

#[derive(Default, SpreadAllocate, Storage)]
    pub struct Contract {
        #[storage_field]
        psp22: psp22::Data,
        #[storage_field]
        metadata: metadata::Data,

        myname: Option<String>,
    }

下のように、mynameを入れて、「token_myname」という関数で呼び出しています。

ちなみに、ここで、なぜ「token_myname」という関数で「clone()」が使われているのでしょう?

こちらがchatGPTからの内容です。

もしclone()がないと、self.mynameの所有権が移ってしまいます。

そうならないために、clone()で新しいオブジェクトを作り、所有権が移らないようにしています。

chatGPT

では、下のように、「Taro」と入れてみます。

下のように、きちんと取り出せたようです!

Shibuya

YKLL92jXVKJvRDFPGQ1D9UxaMk2BPZH4fikbNr5okutX2N5

今回は以上です。

Discussion