logo

「Solidity開発者向けSui Move入門編」を読んで(2)

いまだに俺のAptosは一向に火を吹かない
profile photo
TaniguchiAkira

続き

onlyOwnerってどうするの?

https://yakitori.dev/blog/00-sui-move-for-solidity-devs/
https://yakitori.dev/blog/00-sui-move-for-solidity-devs/
専用のオブジェクトを作ってやるといい。
Solidityと違い、デプロイ時に自動で実行される関数というものはMoveにはない。
なのでブログに記載されているこの例のように「init」的な関数を作り、個別に実行する必要がある。
ここではGallerryOwnerCapというオブジェクトを作成し、その所有者はinit関数を実行したものに設定している。
またupdate_priceの第1引数にGalleryOwnerCapを指定させることにより、GallerryOwnerCapの所有者のみが実行できるようになっている。
なので結果的に、priceを変更できるのはownerのみ、という実装が可能になる。
ただ、この例だと誰でもinit関数を実行できてしまうので、
  • init関数の再実行を防ぐ処理
  • owner権限をtransferできる処理
を追加する必要がある。

変数の前についてる”&”や”&mut”って何?

参照渡しか値渡しかを指定している。Cっぽいね。というかRustっぽいね。
Solidityにはない概念なので説明すると、変数の記録されているメモリの位置を渡すか、変数の値自体を渡しているかの違いになる。
メモリの位置を渡している場合、元の変数の値を変更することができる。値だけを渡している場合、元の変数の値は当然変更できない。
&→参照渡し、変数のデータの変更を加えないようにしたい場合に使う。
&mut→参照渡し、変数のデータの変更を加えたい場合に使う。
何もつけない→値渡し、ついでに所有権も移動する
なぜデータに変更を加えたくないのに参照渡しをするのかというと、処理速度向上のため。
値そのものではなくデータの場所を教えることにより、データのコピー処理が必要なくなり、メモリの利用量がへる。
何もつけない場合は上に書いた通り所有権も移動するので、関数内でデータを削除したりもできる。
なので
typescript
public struct MyStruct { value: u64 } let x = MyStruct { value: 42 }; // 'x' owns MyStruct let y = x; // Ownership of MyStruct moves from 'x' to 'y' // 'x' is now invalid and cannot be used 😱
のあとxを参照すればエラーを起こすし、
typescript
struct MyStruct { value: u64 } fun example() { let s = MyStruct { value: 42 }; // 's' owns the value let s_ref = &s; // Immutable borrow of 's' let s_mut_ref = &mut s; // Mutable borrow of 's' let t = s; // Move ownership to 't'; 's' is now invalid }
これはエラーが発生しない。この後sを参照すれば、当然エラーになる。
typescript
public fun delete_art(art: DigitalArt) { // 'art' is consumed here; caller loses ownership let DigitalArt { id, artist, title, price } = art; object::delete(id); }
これは所有権を移転しているので、関数内でdeleteが可能
typescript
public fun display_art(art: &DigitalArt) { // Immutable borrow; caller retains ownership let artist = art.artist; let title = art.title; let price = art.price; // Display or return the information }
これは所有権は特に変わらず、データの参照ができる例
typescript
public fun update_price(art: &mut DigitalArt, new_price: u64) { // Mutable borrow; caller retains ownership art.price = new_price; }
これも所有権が変わらず、データの変更ができる例
続きはまた後日。
最後に変数のtypeについて書いて終わります。

外部リンク

「Solidity開発者向けSui Move入門編」を読んで(1)
俺のAptosは一向に火を吹かない
「Solidity開発者向けSui Move入門編」を読んで(1)
A Gentle Introduction to Sui Move, for Solidity developers | yakitori.dev
For when you want your Solidity devs to cry in a new language
A Gentle Introduction to Sui Move, for Solidity developers | yakitori.dev
Related posts
post image
Aptos Japanがないのはなぜなのか
post image
俺のAptosは一向に火を吹かない
post image
Solidity
OpenZeppelin
AA
OpenZeppelin 5.2.0が出るよ
Powered by Notaku