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 在 魔法豆
9,291 每月下载量
在 142 个 仓库中使用 (14 个直接使用)
5KB
CW Address Like
此软件包提供了一个特质 AddressLike
,它标记了可以用作CosmWasm地址的类型,即 String
和 cosmwasm_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
,不仅限于String
和Addr
。
如何使用
在这个crate中,我们提供了一个AddressLike
trait,它被简单地定义为
pub trait AddressLike {}
impl AddressLike for Addr {}
impl AddressLike for String {}
然后,开发者可以定义他们的类型为
struct Config<T: AddressLike> {
pub owner: T,
}
这限制了只有String
和Addr
可以用作T
。
许可证
本crate在或早于版本1.0.3
的内容是在GNU Affero General Public License v3或更高版本下发布的;该版本之后的内容是在Apache-2.0许可证下发布的。
依赖关系
~3.5–7MB
~143K SLoC