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

luru20-cw-address-like

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

1个稳定版本

2.0.0 2024年4月2日

#5 in #marks


luru20-cw-ownable中使用

Apache-2.0

5KB

Luru20 CW Address Like

此crate提供了一个特质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

如何使用

在这个包中,我们提供了一个AddressLike特质,其定义非常简单:

pub trait AddressLike {}

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

然后开发者可以定义自己的类型为

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

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

许可证

此包在版本2.0.0及之前的版本内容根据GNU Affero General Public License v3或更高版本发布;该版本之后的内容根据Apache-2.0许可证发布。

依赖项

约3.5–7MB
约140K SLoC