{"author":{"address":null,"user":"https://learnblockchain.cn/people/19478"},"content":{"body":"水分子社區（HOH）前端共學營 - 筆記(1)\r\n\r\n第一周第一課筆記\r\n\r\nMOVE合約: 創建一個用戶產生object及管理object的簡單合約。\r\n合約可以分成7個部分，不是每一個部分都會用上，有些可能不會用上，主要是輔助大家去認識合約中的架構及相關理論。\r\n然而不同的人有不學習的方法，導師分享的習慣也是很好，有利學習及方便自己檢查合約，我自己也是用相同方式學習，效果是不錯的，而且在實戰中，也真的方便自己可以在短時間內檢查合約。\r\n如果想知導師是有什麼寫合約的習慣，可以去HOH的notion觀看相關教學視頻: https://hoh-zone.notion.site/15f577647e8780498123e01a85735d7a\r\n\r\n簡單來說，可以分成Dependencies、Error Codes、Structs、Event Structs、Entry Functions、Getters、Helper Functions。\r\n\r\n    //==============================================================================================\r\n    // Dependencies\r\n    //==============================================================================================\r\n    use std::string::{String};\r\n    use sui::event;\r\n    use sui::table::{Self, Table};\r\n\r\n在 Dependencies，是指在合約中會用到的東西，可以通過use的指令來接通。\r\n\r\n    //==============================================================================================\r\n    // Error Codes \r\n    //==============================================================================================\r\n    const EProfileExisted: u64 = 0;\r\n\r\n在 Error Codes，是自己在合約中加入的錯誤代碼，可以在不同檢查中使用不同的錯誤代碼，目的是方便查找bug，當然這個是個人習慣喜好，可以用自己的方式進行bug檢查。\r\n\r\n    //==============================================================================================\r\n    // Structs \r\n    //==============================================================================================\r\n    public struct State has key{\r\n        id: UID,\r\n        users: Table\u003caddress,address\u003e,\r\n    }\r\n\r\n    public struct Profile has key{\r\n        id: UID,\r\n        name: String,\r\n        description: String,\r\n    }\r\n    \r\n 在 Struct，是指結構體，結構體是自定義類型。\r\n 結構體的介紹: https://sui-book.com/advanced/ch01.struct.html\r\n    \r\n\r\n    //==============================================================================================\r\n    // Init\r\n    //==============================================================================================\r\n    fun init(ctx: \u0026mut TxContext){\r\n        transfer::share_object(State{\r\n            id: object::new(ctx),\r\n            users: table::new(ctx),\r\n    });\r\n    }\r\n\r\n在 Init，所有初始化的需求，可以在這部分處理。\r\nInit的介紹: https://docs.sui.io/concepts/sui-move-concepts/init\r\n\r\n    //==============================================================================================\r\n    // Event Structs\r\n    //==============================================================================================\r\n    public struct ProfileCreated has copy, drop {\r\n        id: ID,\r\n        owner: address\r\n    }\r\n\r\n 在 Event Struct，是指事件結構體，與 emit 配合使用。\r\n Event 的介紹: https://docs.sui.io/guides/developer/sui-101/using-events#move-event-structure\r\n\r\n    //==============================================================================================\r\n    // Entry Functions\r\n    //==============================================================================================\r\n    public entry fun create_profile(\r\n        name: String,\r\n        description: String,\r\n        state: \u0026mut State,\r\n        ctx: \u0026mut TxContext,\r\n    ){\r\n        let owner = tx_context::sender(ctx);\r\n        assert!(!table::contains(\u0026state.users,owner), EProfileExisted);\r\n        let uid = object::new(ctx);\r\n        let id = object::uid_to_inner(\u0026uid);\r\n        let new_profile = Profile{\r\n            id:uid,\r\n            name,\r\n            description,\r\n        };\r\n        transfer::transfer(new_profile, owner);\r\n        table::add(\u0026mut state.users,owner,object::id_to_address(\u0026id));\r\n        event::emit(ProfileCreated{\r\n            id, \r\n            owner\r\n        });\r\n    }\r\n    \r\n  在 Entry Functions ，入口函數（entry function）修飾符是用於可以直接被調用的函數。\r\n  在這合約中，只有一個入口函數，create_profile 是創建一個 Profile 的 object。\r\n  Entry Functions 的介紹: https://examples.sui-book.com/basics/entry-functions.html\r\n\r\n    //==============================================================================================\r\n    // Getters\r\n    //==============================================================================================\r\n    //\r\n    public fun check_if_has_profile(\r\n        user_address: address,\r\n        state: \u0026State,\r\n    ):Option\u003caddress\u003e{\r\n        if(table::contains(\u0026state.users, user_address)){\r\n            option::some(*table::borrow(\u0026state.users, user_address))\r\n        }else{\r\n            option::none()\r\n        }\r\n    }\r\n    \r\n  在 Getters ，這類函數主要是讀取合約內的數據。\r\n\r\n    //==============================================================================================\r\n    // Helper Function\r\n    //==============================================================================================\r\n    #[test_only]\r\n    public fun init_for_testing(ctx: \u0026mut TxContext){\r\n        init(ctx);\r\n    }\r\n在 Helper Function，可以放置其他跟合約相關的函數，例如這帶有 [test_only] 的函數，以表示在 test 的情況下才會被執行。","title":"水分子社區（HOH）前端共學營 - 筆記(1)"},"history":null,"timestamp":1735979897,"version":1}