48 个版本 (6 个稳定版)
2.0.0 | 2024 年 3 月 26 日 |
---|---|
1.1.2 | 2023 年 11 月 23 日 |
1.1.0 | 2023 年 6 月 20 日 |
1.0.1 | 2022 年 12 月 19 日 |
0.3.2 | 2020 年 10 月 28 日 |
#1383 在 魔法豆
6,566 次每月下载
用于 29 个 crate (17 个直接使用)
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
调用时调用一个合同地址。这只能由管理员调用,并且必须小心处理。如果合同返回错误或用完gas,将回滚成员变更(更多信息请参阅下面的钩子部分)。
发出属性
键 | 值 |
---|---|
"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
。如果设置了高度,并且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–7MB
~149K SLoC