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魔法豆

Download history 1124/week @ 2024-04-08 1368/week @ 2024-04-15 1600/week @ 2024-04-22 1164/week @ 2024-04-29 1346/week @ 2024-05-06 1346/week @ 2024-05-13 1858/week @ 2024-05-20 1031/week @ 2024-05-27 1241/week @ 2024-06-03 1195/week @ 2024-06-10 1259/week @ 2024-06-17 1170/week @ 2024-06-24 1504/week @ 2024-07-01 949/week @ 2024-07-08 1836/week @ 2024-07-15 2183/week @ 2024-07-22

6,566 次每月下载
用于 29 个 crate (17 个直接使用)

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 调用时调用一个合同地址。这只能由管理员调用,并且必须小心处理。如果合同返回错误或用完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