水分子社區(HOH)前端共學營 - 筆記(1)

  • 楊景輝
  • 更新于 2025-01-04 16:38
  • 阅读 27

水分子社區(HOH)前端共學營-筆記(1)第一周第一課筆記MOVE合約:創建一個用戶產生object及管理object的簡單合約。合約可以分成7個部分,不是每一個部分都會用上,有些可能不會用上,主要是輔助大家去認識合約中的架構及相關理論。然而不同的人有不學習的方法,導師分享的習慣也是很

水分子社區(HOH)前端共學營 - 筆記(1)

第一周第一課筆記

MOVE合約: 創建一個用戶產生object及管理object的簡單合約。 合約可以分成7個部分,不是每一個部分都會用上,有些可能不會用上,主要是輔助大家去認識合約中的架構及相關理論。 然而不同的人有不學習的方法,導師分享的習慣也是很好,有利學習及方便自己檢查合約,我自己也是用相同方式學習,效果是不錯的,而且在實戰中,也真的方便自己可以在短時間內檢查合約。 如果想知導師是有什麼寫合約的習慣,可以去HOH的notion觀看相關教學視頻: https://hoh-zone.notion.site/15f577647e8780498123e01a85735d7a

簡單來說,可以分成Dependencies、Error Codes、Structs、Event Structs、Entry Functions、Getters、Helper Functions。

//==============================================================================================
// Dependencies
//==============================================================================================
use std::string::{String};
use sui::event;
use sui::table::{Self, Table};

在 Dependencies,是指在合約中會用到的東西,可以通過use的指令來接通。

//==============================================================================================
// Error Codes 
//==============================================================================================
const EProfileExisted: u64 = 0;

在 Error Codes,是自己在合約中加入的錯誤代碼,可以在不同檢查中使用不同的錯誤代碼,目的是方便查找bug,當然這個是個人習慣喜好,可以用自己的方式進行bug檢查。

//==============================================================================================
// Structs 
//==============================================================================================
public struct State has key{
    id: UID,
    users: Table<address,address>,
}

public struct Profile has key{
    id: UID,
    name: String,
    description: String,
}

在 Struct,是指結構體,結構體是自定義類型。 結構體的介紹: https://sui-book.com/advanced/ch01.struct.html

//==============================================================================================
// Init
//==============================================================================================
fun init(ctx: &mut TxContext){
    transfer::share_object(State{
        id: object::new(ctx),
        users: table::new(ctx),
});
}

在 Init,所有初始化的需求,可以在這部分處理。 Init的介紹: https://docs.sui.io/concepts/sui-move-concepts/init

//==============================================================================================
// Event Structs
//==============================================================================================
public struct ProfileCreated has copy, drop {
    id: ID,
    owner: address
}

在 Event Struct,是指事件結構體,與 emit 配合使用。 Event 的介紹: https://docs.sui.io/guides/developer/sui-101/using-events#move-event-structure

//==============================================================================================
// Entry Functions
//==============================================================================================
public entry fun create_profile(
    name: String,
    description: String,
    state: &mut State,
    ctx: &mut TxContext,
){
    let owner = tx_context::sender(ctx);
    assert!(!table::contains(&state.users,owner), EProfileExisted);
    let uid = object::new(ctx);
    let id = object::uid_to_inner(&uid);
    let new_profile = Profile{
        id:uid,
        name,
        description,
    };
    transfer::transfer(new_profile, owner);
    table::add(&mut state.users,owner,object::id_to_address(&id));
    event::emit(ProfileCreated{
        id, 
        owner
    });
}

在 Entry Functions ,入口函數(entry function)修飾符是用於可以直接被調用的函數。 在這合約中,只有一個入口函數,create_profile 是創建一個 Profile 的 object。 Entry Functions 的介紹: https://examples.sui-book.com/basics/entry-functions.html

//==============================================================================================
// Getters
//==============================================================================================
//
public fun check_if_has_profile(
    user_address: address,
    state: &State,
):Option<address>{
    if(table::contains(&state.users, user_address)){
        option::some(*table::borrow(&state.users, user_address))
    }else{
        option::none()
    }
}

在 Getters ,這類函數主要是讀取合約內的數據。

//==============================================================================================
// Helper Function
//==============================================================================================
#[test_only]
public fun init_for_testing(ctx: &mut TxContext){
    init(ctx);
}

在 Helper Function,可以放置其他跟合約相關的函數,例如這帶有 [test_only] 的函數,以表示在 test 的情況下才會被執行。

  • 原创
  • 学分: 1
  • 分类: Sui
  • 标签: Move 
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
楊景輝
楊景輝
杨景辉 香港城市大学 硕士 专长: 计算机编程(全栈工程师)、区块链开发、算法研究、数据库设计、项目管理