1个稳定版本
| 2.0.0 | 2024年4月2日 |
|---|
#5 in #marks
5KB
Luru20 CW Address Like
此crate提供了一个特质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。
如何使用
在这个包中,我们提供了一个AddressLike特质,其定义非常简单:
pub trait AddressLike {}
impl AddressLike for Addr {}
impl AddressLike for String {}
然后开发者可以定义自己的类型为
struct Config<T: AddressLike> {
pub owner: T,
}
这限制了只有String和Addr可以用于T。
许可证
此包在版本2.0.0及之前的版本内容根据GNU Affero General Public License v3或更高版本发布;该版本之后的内容根据Apache-2.0许可证发布。
依赖项
约3.5–7MB
约140K SLoC