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