deny_list在coin中的应用

  • shaflow01
  • 更新于 2024-03-07 16:01
  • 阅读 928

引言上篇文章介绍了deny_list,它是由系统事务创建的一个share_obj,用于进行对sui核心类型的地址访问控制。coin中有部分代码使用了deny_list,用来创建可以阻止某些地址在交易中使用相应的coin,也就是之前没有讲到的部分。

引言

上篇文章介绍了deny_list,它是由系统事务创建的一个share_obj,用于进行对sui核心类型的地址访问控制。coin中有部分代码使用了deny_list,用来创建可以阻止某些地址在交易中使用相应的coin,也就是之前没有讲到的部分。

Regulated Coin

coin中提供了create_regulated_currency方法用来创建一个受管制的coin。

    public fun create_regulated_currency<T: drop>(
        witness: T,
        decimals: u8,
        symbol: vector<u8>,
        name: vector<u8>,
        description: vector<u8>,
        icon_url: Option<Url>,
        ctx: &mut TxContext
    ): (TreasuryCap<T>, DenyCap<T>, CoinMetadata<T>) {
        let (treasury_cap, metadata) = create_currency(
            witness,
            decimals,
            symbol,
            name,
            description,
            icon_url,
            ctx
        );
        let deny_cap = DenyCap {
            id: object::new(ctx),
        };
        transfer::freeze_object(RegulatedCoinMetadata<T> {
            id: object::new(ctx),
            coin_metadata_object: object::id(&metadata),
            deny_cap_object: object::id(&deny_cap),
        });
        (treasury_cap, deny_cap, metadata)
    }

与create_currency不相同的是,此方法多返回了一个权限凭证DenyCap,持有DenyCap的人可以将一些地址列入deny_list,从而让这个地址不能在交易中使用coin<T<T>>作为交易的输入,也可以将它移除,从而恢复权限

增加/移除/检查是否存在

    public fun deny_list_add&lt;T>(
       deny_list: &mut DenyList,
       _deny_cap: &mut DenyCap&lt;T>,
       addr: address,
       _ctx: &mut TxContext
    ) {
        let type =
            ascii::into_bytes(type_name::into_string(type_name::get_with_original_ids&lt;T>()));
        deny_list::add(
            deny_list,
            DENY_LIST_COIN_INDEX,
            type,
            addr,
        )
    }

    public fun deny_list_remove&lt;T>(
       deny_list: &mut DenyList,
       _deny_cap: &mut DenyCap&lt;T>,
       addr: address,
       _ctx: &mut TxContext
    ) {
        let type =
            ascii::into_bytes(type_name::into_string(type_name::get_with_original_ids&lt;T>()));
        deny_list::remove(
            deny_list,
            DENY_LIST_COIN_INDEX,
            type,
            addr,
        )
    }

    public fun deny_list_contains&lt;T>(
       freezer: &DenyList,
       addr: address,
    ): bool {
        let name = type_name::get_with_original_ids&lt;T>();
        if (type_name::is_primitive(&name)) return false;

        let type = ascii::into_bytes(type_name::into_string(name));
        deny_list::contains(
            freezer,
            DENY_LIST_COIN_INDEX,
            type,
            addr,
        )
    }

交互示例

使用地址

│ address1 │ 0x2fcdfe7c92fe670d267474fbd7aa89baef55c5f93b1953a9e82614c9abb7abc6 │ │ address2 │ 0x48c5fdc3d18989593d68435f4f4310f67391298c1b2e1325fae7a4a9fb8fd6e7 |

合约代码

module rcoin::rcoin {
    use std::option;
    use sui::coin::{Self,TreasuryCap,DenyCap};
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};
    use sui::deny_list::{Self, DenyList};

    struct RCOIN has drop {}

    fun init(witness: RCOIN, ctx: &mut TxContext) {
        let (treasury, deny_cap, metadata) = coin::create_regulated_currency(witness, 6, b"RCOIN", b"shaflow", b"shaflow`s rcoin", option::none(), ctx);

        transfer::public_freeze_object(metadata);
        transfer::public_transfer(treasury, tx_context::sender(ctx));
        transfer::public_transfer(deny_cap, tx_context::sender(ctx));
    }

    public fun add_addr_from_deny_list(denylist: &mut DenyList, denycap: &mut DenyCap&lt;RCOIN>, denyaddy: address, ctx: &mut TxContext){
        coin::deny_list_add(denylist, denycap, denyaddy, ctx );
    }

    public fun remove_addr_from_deny_list(denylist: &mut DenyList, denycap: &mut DenyCap&lt;RCOIN>, denyaddy: address, ctx: &mut TxContext){
        coin::deny_list_remove(denylist, denycap, denyaddy, ctx );
    }

    public fun airdrop(cap: &mut TreasuryCap&lt;RCOIN>, receiver:address ,ctx: &mut TxContext){
        let new_coin = coin::mint&lt;RCOIN>(cap, 100,ctx);
        transfer::public_transfer(new_coin, receiver);
    }
}
  1. 用address1部署合约

    sui client publish --gas-budget=100000000 --skip-fetch-latest-git-deps --skip-dependency-verification

    获得: |TreasuryCap|0xe8e782b425fe85a768bfa63fda885ad21cf1c8939f6b216c26ec5b437f2a6a59| |DenyCap|0xc8da5610388f40617eb88a81588e321be7c9f64678d8b1407adbcf81d4dbd990| |package|0x4f76f0634d1dff123c19150ba96ce0ed7f56eb4dbda28ab66b627fdb1ecff523|

  2. address1 调用airdrop 给address2铸币

    sui client call --function airdrop --args 0xe8e782b425fe85a768bfa63fda885ad21cf1c8939f6b216c26ec5b437f2a6a59 0x48c5fdc3d18989593d68435f4f4310f67391298c1b2e1325fae7a4a9fb8fd6e7 --package 0x4f76f0634d1dff123c19150ba96ce0ed7f56eb4dbda28ab66b627fdb1ecff523 --module rcoin --gas-budget 100000000 

    获得:
    coin:0x9a45669e6e8702e6e7928559b2ee0241500401ecef14ca29b6481a97c2eee201

  3. address1 将address2加入deny_list

    sui client call --function add_addr_from_deny_list --args 0x0000000000000000000000000000000000000000000000000000000000000403 0xc8da5610388f40617eb88a81588e321be7c9f64678d8b1407adbcf81d4dbd990 0x48c5fdc3d18989593d68435f4f4310f67391298c1b2e1325fae7a4a9fb8fd6e7 --package 0x4f76f0634d1dff123c19150ba96ce0ed7f56eb4dbda28ab66b627fdb1ecff523 --module rcoin --gas-budget 100000000 

    成功交易:4t8MFsnzBi9Z4KWMyCzS32JCGdt6T2LZBrM2i6Cx6QDk

  4. address2尝试将coin转移给address1
    在钱包中进行
    报错:

    Send transaction failed: Error: Transaction execution failed due to issues with transaction inputs, please review the errors and try again: Address 0x48c5fdc3d18989593d68435f4f4310f67391298c1b2e1325fae7a4a9fb8fd6e7 is denied for coin 4f76f0634d1dff123c19150ba96ce0ed7f56eb4dbda28ab66b627fdb1ecff523::rcoin::RCOIN. 
  5. address1将address2从deny_list中移除

    sui client call --function remove_addr_from_deny_list  --args 0x0000000000000000000000000000000000000000000000000000000000000403 0xc8da5610388f40617eb88a81588e321be7c9f64678d8b1407adbcf81d4dbd990 0x48c5fdc3d18989593d68435f4f4310f67391298c1b2e1325fae7a4a9fb8fd6e7 --package 0x4f76f0634d1dff123c19150ba96ce0ed7f56eb4dbda28ab66b627fdb1ecff523 --module rcoin --gas-budget 100000000 

    成功交易:5UGRtRbxKDx7hafV9orwKRZaZEzBx3kfDp5bzcnY68Zr

6.address2再次尝试将coin转移给address1
成功交易:8LBc5Sok5NFVHXgHpq2TbxGCbtqu8KXvo6QoBg9WN9aM

总结

本文介绍了deny_list在coin中的应用。首先,我们了解了如何创建受管制的coin,并获取相应的权限凭证DenyCap。然后,通过示例展示了如何使用DenyCap来管理deny_list,包括添加和移除地址,并验证了交易中deny_list的限制。这个简短的示例展示了deny_list在coin中的实际应用。希望有所帮助。

<!--StartFragment-->

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

<!--EndFragment-->

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

1 条评论

请先 登录 后评论
shaflow01
shaflow01
0x4937...bA76
江湖只有他的大名,没有他的介绍。