Let`s move - sui move开发实战-dao(5)反馈

引言

我将前文实现的简单的dao参与了https://dacade.org/communities/sui的挑战,得到了反馈,改进了我代码中出现的不足,让我收获不少。

反馈详情

风格问题

首先,反馈修正了我一些代码中的风格问题。填补了未出现的空格,删除了多余的空行。
举例:
修改前

    const ETaskDistributeEnded:u64 = 0;
    const ENotTaskCapOwner:u64 = 1;
    const EProposalClosed:u64 = 2;
    const EVoteSelf:u64 = 3;
    const EInvailVotes:u64 = 4;
    const EProposalCheck:u64 = 5;
    const EProposalNotClosed:u64 = 6;
    const ERoleCheck:u64 = 7;
    const EProposalNotPassed:u64 = 8;
    const EAlreadyClaimed:u64 = 9;
    const EInsufficientTreasurySupply:u64 = 10;
    const TOTAL_SUPPLY:u64 = 100_000_000_000_000_000;
    const PROPOSAL_FEE:u64 = 5;
    const LEVEL0_REWARD:u64 = 0;
    const LEVEL1_REWARD:u64 = 10;
    const LEVEL2_REWARD:u64 = 15;
    const LEVEL3_REWARD:u64 = 30;




    struct DAO has drop{}
    struct Dao<phantom T> has key{

修改后

    const ETaskDistributeEnded: u64 = 0;
    const ENotTaskCapOwner: u64 = 1;
    const EProposalClosed: u64 = 2;
    const EVoteSelf: u64 = 3;
    const EInvailVotes: u64 = 4;
    const EProposalCheck: u64 = 5;
    const EProposalNotClosed: u64 = 6;
    const ERoleCheck: u64 = 7;
    const EProposalNotPassed: u64 = 8;
    const EAlreadyClaimed: u64 = 9;
    const EInsufficientTreasurySupply: u64 = 10;

    const MAX_VOTES_ONE_TIME: u64 = 10;
    const TOTAL_SUPPLY: u64 = 100_000_000_000_000_000;
    const PROPOSAL_FEE: u64 = 5;
    const LEVEL0_REWARD: u64 = 0;
    const LEVEL1_REWARD: u64 = 10;
    const LEVEL2_REWARD: u64 = 15;
    const LEVEL3_REWARD: u64 = 30;

    struct DAO has drop {}
    struct Dao<phantom T> has key {

修改前

let (treasury_cap,metadata) = coin::create_currency<DAO>(witness,18,b"DAO",b"dao",b"Dao token.",option::none(),ctx);

修改后

        let (treasury_cap, metadata) = coin::create_currency<DAO>(
            witness,
            18,
            b"DAO",
            b"dao",
            b"Dao token.",
            option::none(),
            ctx,
        );

修改前

public fun set_community_task(core_cap:& CoreCap, describe:String, reward_amount:u64, ctx:&mut TxContext){
        check_corecap_role(core_cap,ctx);
        let new_task = CommunityTask{
            id: object::new(ctx),
            describe:describe,
            reward_amount:reward_amount,
            distribute_ended: false,
        };
        transfer::share_object(new_task);
    }

修改后

    public fun set_community_task(
        core_cap: &CoreCap,
        describe: String,
        reward_amount: u64,
        ctx: &mut TxContext,
    ) {
        check_role(core_cap, ctx);
        let new_task = CommunityTask {
            id: object::new(ctx),
            describe: describe,
            reward_amount: reward_amount,
            distribute_ended: false,
        };
        transfer::share_object(new_task);
    }

此类修改还有很多,由于篇幅问题不在一一展示。
良好的代码风格不仅可以提高代码规范性,而且可以提升代码可读性,在今后的编程中我会注意代码风格问题

更加优雅的条件判断

由于我此前学习solidity,更加习惯使用if/else语句进行条件判断。但是rust和move中有一种更加优雅的模式匹配方式那就是match
修改前:

        //2.reward calculation
        let level = proposal.level;
        let reward_amount:u64;
        if(level == 1){
            reward_amount = LEVEL1_REWARD;
        }
        else if(level == 2){
            reward_amount = LEVEL2_REWARD;
        }
        else{
            reward_amount = LEVEL3_REWARD;
        };

修改后:

        let reward_amount: u64 = match proposal.level {
            1 => LEVEL1_REWARD,
            2 => LEVEL2_REWARD,
            3 => LEVEL3_REWARD,
            _ => LEVEL0_REWARD,

更加优雅的角色检验

我实现的dao模块有三个成员凭证,分别是普通成员,核心成员,和初始核心成员凭证,凭证与地址绑定,由于它们的角色验证会经常在函数中被使用,所以我抽象出了三个函数来分别验证这些成员

    fun check_init_corecap_role(init_core_cap:& InitCoreCap,ctx: &mut TxContext){
        assert!(init_core_cap.role_address== tx_context::sender(ctx), ERoleCheck);
    }

    fun check_corecap_role(core_cap:& CoreCap,ctx: &mut TxContext){
        assert!(core_cap.role_address== tx_context::sender(ctx), ERoleCheck);
    }

    fun check_membercap_role(member_cap:& MemberCap,ctx: &mut TxContext){
        assert!(member_cap.role_address == tx_context::sender(ctx), ERoleCheck);
    }

非常感谢反馈者提供的修改建议,让我更加深刻理解到了rust中特征的魅力

  1. 首先定义一个特征,用于改特征的对象需要实现特征方法role_address
    trait MyTrait {
        fn role_address(&self) -> address;
    }
  1. 分别为三个成员凭证实现此特征
    impl MyTrait for InitCoreCap {
        fn role_address(&self) -> address {
            self.role_address
        }
    }

    impl MyTrait for CoreCap {
        fn role_address(&self) -> address {
            self.role_address
        }
    }

    impl MyTrait for MemberCap {
        fn role_address(&self) -> address {
            self.role_address
        }
    }
  1. 最后,只需要实现一个函数来进行角色验证,传入的cap需要实现MyTrait特征
    fun check_role(role_cap: &dyn MyTrait, ctx: &mut TxContext) {
        assert!(role_cap.role_address() == tx_context::sender(ctx), ERoleCheck);
    }

一些安全检查

  1. 在初始化金库时检查是否溢出
  // Check for overflow
        assert!(TOTAL_SUPPLY >= balance::value<DAO>(&total_balance), EInsufficientTreasurySupply);
  1. 在投票时确定投票者是否有足够数量的dao
        assert!(
            balance::value(coin::balance<DAO>(&coin)) >= votes,
            EInsufficientTreasurySupply
        );

结语

此次反馈的push链接https://github.com/shaflow01/dao-demo-on-sui/pull/1/files,其中的一些改进让我收获不少,我会总结其中可取的地方在今后的编程开发中注意并提高。

Move语言学习交流QQ群: 79489587
Sui官方中文开发者电报群: https://t.me/sui_dev_cn

相关推荐

  1. Let`s move - sui move开发实战-dao(5)反馈

    2024-04-01 13:48:02       16 阅读
  2. Let`s move - sui move开发实战-dao(6)反馈

    2024-04-01 13:48:02       19 阅读
  3. Python Django 5 Web应用开发实战

    2024-04-01 13:48:02       8 阅读
  4. Python Django 5 Web应用开发实战

    2024-04-01 13:48:02       8 阅读
  5. Golang 开发实战day05 - Loops(1)

    2024-04-01 13:48:02       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-01 13:48:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-01 13:48:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-01 13:48:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-01 13:48:02       18 阅读

热门阅读

  1. el-dialog宽度自适应

    2024-04-01 13:48:02       15 阅读
  2. 04_Linux磁盘和文件系统

    2024-04-01 13:48:02       19 阅读
  3. 使用Jackson进行序列化和反序列化

    2024-04-01 13:48:02       17 阅读
  4. Android笔记--MediaCodec(一)

    2024-04-01 13:48:02       14 阅读
  5. 英国生物数据库的申请流程

    2024-04-01 13:48:02       13 阅读
  6. flask+uwsgi+云服务器 部署服务端

    2024-04-01 13:48:02       22 阅读