#cosmwasm #cosmos #string #address #marks #addr #query-response

cw-address-like

一个标记未检查或已检查的CosmWasm地址字符串的特质

6 个稳定版本

2.0.0 2024年8月12日
1.0.4 2023年2月28日
1.0.3 2023年1月11日
1.0.1 2022年12月6日
1.0.0 2022年11月27日

#327魔法豆

Download history 1943/week @ 2024-05-04 2562/week @ 2024-05-11 2404/week @ 2024-05-18 2347/week @ 2024-05-25 2407/week @ 2024-06-01 2796/week @ 2024-06-08 2539/week @ 2024-06-15 2470/week @ 2024-06-22 2025/week @ 2024-06-29 1849/week @ 2024-07-06 2167/week @ 2024-07-13 2260/week @ 2024-07-20 2079/week @ 2024-07-27 2129/week @ 2024-08-03 2789/week @ 2024-08-10 2083/week @ 2024-08-17

9,291 每月下载量
142 仓库中使用 (14 个直接使用)

Apache-2.0

5KB

CW Address Like

此软件包提供了一个特质 AddressLike,它标记了可以用作CosmWasm地址的类型,即 Stringcosmwasm_std::Addr

背景

在CosmWasm中,通常有两种类型用于表示地址

  • String - 表示一个 未验证 的地址,在合约API中使用,即消息和查询响应。
  • cosmwasm_std::Addr - 表示一个 验证 的地址,在合约内部逻辑中使用。

当合约从一个消息中接收地址(作为 String)时,它不能简单地假设它是有效的。相反,它应该使用 deps.api.addr_validate 方法来验证它,该方法返回一个 Addr。然后,合约可以在其业务逻辑中使用 Addr 或将其保存到存储中。

同样,当合约在查询响应中返回地址时,也应将其从 Addr 转换回 String

问题

当我们需要定义一个既要在API中又要在内部逻辑中使用的结构体或枚举时,会出现问题。例如,考虑一个将“配置”存储在其存储中的合约,其中使用Addr来表示合约所有者的地址,同时提供一个查询配置的方法,该方法使用String

在这种情况下,开发者可以为每种情况定义两种类型

struct Config {
    pub owner: Addr,
}

struct ConfigResponse {
    pub owner: String,
}

这种方法可行,但稍微有些麻烦,特别是当配置包含更多字段时。

另一种方法是定义一个包含泛型的单个类型

struct Config<T> {
    pub owner: T,
}

然后,在API中使用Config<String>,在内部逻辑中使用Config<Addr>

这种方法的主要缺点是没有对T可以是什么类型的限制。理论上,可以将任何类型插入此处作为T,不仅限于StringAddr

如何使用

在这个crate中,我们提供了一个AddressLike trait,它被简单地定义为

pub trait AddressLike {}

impl AddressLike for Addr {}
impl AddressLike for String {}

然后,开发者可以定义他们的类型为

struct Config<T: AddressLike> {
    pub owner: T,
}

这限制了只有StringAddr可以用作T

许可证

本crate在或早于版本1.0.3的内容是在GNU Affero General Public License v3或更高版本下发布的;该版本之后的内容是在Apache-2.0许可证下发布的。

依赖关系

~3.5–7MB
~143K SLoC