引言上篇文章介绍了deny_list,它是由系统事务创建的一个share_obj,用于进行对sui核心类型的地址访问控制。coin中有部分代码使用了deny_list,用来创建可以阻止某些地址在交易中使用相应的coin,也就是之前没有讲到的部分。
上篇文章介绍了deny_list,它是由系统事务创建的一个share_obj,用于进行对sui核心类型的地址访问控制。coin中有部分代码使用了deny_list,用来创建可以阻止某些地址在交易中使用相应的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<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);
}
}
用address1部署合约
sui client publish --gas-budget=100000000 --skip-fetch-latest-git-deps --skip-dependency-verification
获得: |TreasuryCap|0xe8e782b425fe85a768bfa63fda885ad21cf1c8939f6b216c26ec5b437f2a6a59| |DenyCap|0xc8da5610388f40617eb88a81588e321be7c9f64678d8b1407adbcf81d4dbd990| |package|0x4f76f0634d1dff123c19150ba96ce0ed7f56eb4dbda28ab66b627fdb1ecff523|
address1 调用airdrop 给address2铸币
sui client call --function airdrop --args 0xe8e782b425fe85a768bfa63fda885ad21cf1c8939f6b216c26ec5b437f2a6a59 0x48c5fdc3d18989593d68435f4f4310f67391298c1b2e1325fae7a4a9fb8fd6e7 --package 0x4f76f0634d1dff123c19150ba96ce0ed7f56eb4dbda28ab66b627fdb1ecff523 --module rcoin --gas-budget 100000000
获得:
coin:0x9a45669e6e8702e6e7928559b2ee0241500401ecef14ca29b6481a97c2eee201
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
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.
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-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!