【Aptos/Move】これ知らないと始まらない ~ModuleとかScriptとかResourcesとか~
はじめに
Aptos盛り上がってますね。触ってみようとチュートリアルやろうと思ったのですが、そもそものAptosチェーンの構造がよく分かってなかったので、まずはそれをtips的にまとめていこうと思います。
Moveとは?
RustベースのWeb3専用言語
- Rustをラッパーした言語
- アカウントチェック(tx送信者が特定の条件を満たしているかの検証)が言語レベルでサポート
- Rustに比べてコード数が少ない
- セキュリティについても安心できる
Yuseiさんが作成されたこの資料がとてもわかりやすくまとまっているのでおすすめです!
Moveにおけるデータ管理(Solidityとの違い)
Ethereumなどの開発ではSolidityで書かれたContractベースで、そこにstateとしてAddressごとのbalanceが紐づく形になっていますが、MoveではAddressがベースとなっておりそこにModule(コード)やリソース(値)が紐づく形になっています。下記の図がわかりやすいです。
ここのデータ管理の部分の理解がめちゃくちゃ大切
Solidityのデータ管理
Moveのデータ管理
- Global Storage に Key/Value マップがある
- その直下に Address 単位ごとにデータ保存領域が確保されている
ModuleとScript
どちらもMoveのProgramですが明確な違いがあります。
Module
struct
Resource(デジタル資産)のパラメータを定義します。例えばcoinだとnameやvalueなど。NFTだとimageやdescriptionなどがあったりしますね。
function
上記のstructを操作するコード。Moduleのstructを操作するには該当のModuleのfunctionで定義された機能でしかstructを操作できない。ただしfunctionはあくまでも定義、ライブラリのようなものでこれが直接実行されるというものではない。
Script
function のみ。
上記の Module に定義された function を呼び出して実行を行うプログラム。これを実行することで、Moduke内の構造体のGlobal Storageの操作を行なっていく。なので Module で定義されたfunctionの実行しか行えないため、この構造がセキュリティを担保する一つの要素となっている。実際のScriptの例が下記です。
Move Script
イメージとしてはこのようになると思います。
- main 関数として実行プログラムがScriptに記載されている。
-
aptos_framework
としてのModuleがすでにGlobal Stateにデプロイされていている - そこで呼び出している
coin::balance
やaptos_account::transfer
にbalanceの参照やtransferのステートを変更するコードが記載されている
Resources
それぞれのアカウントアドレス内に保存された、デジタル資産のこと。
White Paoerより
例として、アドレス0x50が保持するデータ値に、0x3::coin::Coinがあります。ここで、0x3はcoinモジュールが格納されているアドレス、coinはモジュール名、そしてCoinはデータタイプの名前を指しています。
おわりに
かなり簡単な部分ではありますが、Aptosがどのような構造なのかチュートリアルをする段階で最低でも分かってないといけないというものをまとめました。
Discussion