1 个稳定版本
1.2.2 | 2024年1月24日 |
---|
#2842 in 魔法豆
3,063 次每月下载
在 5 个crate中使用 (3 直接使用)
18KB
245 行
CW4 规范:群组成员
CW4 是一个存储群组成员的规范,它可以与 CW3 多重签名结合使用。目的是存储一组可以用来确定另一个部分的权限的成员/投票者。
由于这通常部署为合同对,我们期望此合同通常会被 QueryRaw
查询,其中一些数据结构的内部布局成为公共 API 的一部分。实现可能添加更多数据结构,但至少应该按照以下指定的键和相同的格式列出。
在这种情况下,一个 cw3 合同可以 读取 一个外部群组合同,除了读取本地存储之外没有显著的成本。但是,更新该群组合同(如果允许),将是一个外部消息,并将作为每个合同的额外开销来收费。
消息
我们定义了一个 InstantiateMsg{admin, members}
来使其易于将群组作为另一流程的一部分设置。实现应该与这种设置一起工作,但可能为 instantiate
阶段的非必要扩展添加额外的 Option<T>
字段。
群组合同支持三种消息
UpdateAdmin{admin}
- 修改(或清除)合同的管理员
发出的属性
键 | 值 |
---|---|
"action" | "update_members" |
"sender" | 消息发送者 |
"added" | 添加成员的数量 |
"removed" | 移除成员的数量 |
AddHook{addr}
- 在每次 UpdateMembers
调用时添加一个将被调用的合约地址。这只能由管理员调用,并且必须小心处理。返回错误或耗尽气量的合约将撤销成员变更(更多内容请参阅下方的 Hooks 部分)。
发出的属性
键 | 值 |
---|---|
"action" | "add_hook" |
"sender" | 消息发送者 |
"hook" | 钩子地址 |
RemoveHook{addr}
- 取消之前通过 AddHook
设置的合约地址的注册。
发出的属性
键 | 值 |
---|---|
"action" | "remove_hook" |
"sender" | 消息发送者 |
"hook" | 钩子地址 |
只有 admin
可以执行这些函数中的任何一个。因此,省略 admin
后,我们将得到与 cw3-fixed-multisig
类似的功能。如果包含一个,通常希望它是一个使用此群组合约作为群的 cw3
合约。这导致了一个“鸡生蛋,蛋生鸡”的问题,但我们在 cw3-flex-multisig
中说明了如何实例化。
查询
智能查询
TotalWeight{}
- 返回所有当前成员的总权重,如果某些条件定义在“成员百分比”上,这非常有用。
Member{addr, height}
- 如果该投票者是群组成员,则返回其权重(可能为0),或者如果他们不是群组成员,则返回 None
。如果设置 height 并且 cw4 实现支持快照,这将返回给定高度块的该成员的权重。
MemberList{start_after, limit}
- 允许我们分页浏览所有成员的列表。将包括 0 权重的成员。移除的成员将不包括在内。
Admin{}
- 返回 admin
地址,如果没有设置,则返回 None
。
原始查询
除了上述“智能查询”(构成公共 API)之外,我们还定义了两个用于提高合约-合约调用效率的原始查询。这些使用 cw4
导出的键
TOTAL_KEY
- 使用此键(b"total"
)进行原始查询将返回一个 JSON 编码的 u64
members_key()
- 接收一个 CanonicalAddr
并返回一个可以用于原始查询的键("\x00\x07members" || addr
)。如果成员不在群组内,则返回空字节,否则返回一个 JSON 编码的 u64
钩子
cw4
合约的一个特殊功能是它们允许管理员注册多个钩子。这些特殊合约需要响应群组成员资格的变化,这使它们保持同步。再次提醒,这是一个强大的功能,你应该只为完全信任的合约设置钩子,通常是一些与你一起部署的群组合约。
如果一个合约被注册为cw4合约上的钩子,那么每次UpdateMembers
成功执行时,钩子将接收到一个格式如下的handle
调用。
{
"member_changed_hook": {
"diffs": [
{
"addr": "cosmos1y3x7q772u8s25c5zve949fhanrhvmtnu484l8z",
"old_weight": 20,
"new_weight": 24
}
]
}
}
请参阅hook.rs以获取完整详细信息。请注意,此示例显示了更新或现有成员。old_weight
将在地址首次添加时缺失。如果地址被删除,则new_weight
将缺失。
接收合约必须能够处理MemberChangedHookMsg
,并且只有在它想要更改群组合约的功能(例如,一个希望在提案打开期间阻止成员变更的多重签名)时才应该返回错误。然而,这种情况相当罕见,通常表明代码脆弱。
请注意,消息发送者将是更新过的群组合约。务必在处理时检查这一点,以确保外部行为者不能调用此钩子,只有受信任的群组可以。
依赖关系
约4.5–6MB
约135K SLoC