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>作为交易的输入,也可以将它移除,从而恢复权限

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

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

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

    public fun deny_list_contains<T>(
       freezer: &DenyList,
       addr: address,
    ): bool {
        let name = type_name::get_with_original_ids<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<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<RCOIN>, denyaddy: address, ctx: &mut TxContext){
        coin::deny_list_remove(denylist, denycap, denyaddy, ctx );
    }

    public fun airdrop(cap: &mut TreasuryCap<RCOIN>, receiver:address ,ctx: &mut TxContext){
        let new_coin = coin::mint<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

  1. 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. 
  1. 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中的实际应用。希望有所帮助。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值