1 个稳定版本

1.2.2 2024年1月24日

#2842 in 魔法豆

Download history 577/week @ 2024-03-13 359/week @ 2024-03-20 455/week @ 2024-03-27 466/week @ 2024-04-03 526/week @ 2024-04-10 538/week @ 2024-04-17 658/week @ 2024-04-24 568/week @ 2024-05-01 439/week @ 2024-05-08 428/week @ 2024-05-15 653/week @ 2024-05-22 709/week @ 2024-05-29 617/week @ 2024-06-05 1007/week @ 2024-06-12 699/week @ 2024-06-19 675/week @ 2024-06-26

3,063 次每月下载
5 个crate中使用 (3 直接使用)

Apache-2.0

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