😽

[Astar]コントラクト備忘録30(Flushを学ぼう)

2023/03/07に公開

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

1 概要

  1. Flushについて

2 内容

Flushについて知見が溜まりましたので、記事にいたします。

まずは、こちらの「Flush」のtraitを見てみましょう。

このように、「flush」と「load」の二つの関数があることがわかります。

ではまず、「flush」から見てみましょう。


https://github.dev/727-Ventures/openbrush-contracts

「flush」内では、こちらの「set_contract_storage」が使われています。

こちらに書かれているように、値をコントラクトのストレージに書き込むときに使われます。


https://paritytech.github.io/ink/ink_env/

このようにドキュメントを確認すると、キーとバリューを引数に取ることがわかります。

https://paritytech.github.io/ink/ink_env/fn.set_contract_storage.html

では、次に、「load」を見てみましょう。

今度は、「set」ではなく、「get_contract_storage」が使われています。

https://github.dev/727-Ventures/openbrush-contracts

では、何をやっているのかを確認しましょう。

その名の通り、下のように、ストレージキーに対応したストレージを取得することがわかります。

https://paritytech.github.io/ink/ink_env/

こちらを見てみると、引数にキーをとり、値を取ることがわかります。

https://paritytech.github.io/ink/ink_env/fn.get_contract_storage.html

そして、取ってきたstateを「core::mem::swap」を行っています。

ちなみに、「core::mem::swap」はその名の通り、交換を行なっています。

selfと新しく取得したstateを入れ替えています。

ちなみに、「core::mem::swap」はこのようになっています。

https://doc.rust-lang.org/beta/core/mem/fn.swap.html

そして、交換したstate(元々のself)を明示的に破棄するために「ManuallyDrop」を使用しています。

ちなみに、「ManuallyDrop」はこちらになります。

https://doc.rust-lang.org/stable/core/mem/struct.ManuallyDrop.html

今回は以上です。

Discussion