26 个版本 (12 个重大更改)

0.17.1 2023年1月26日
0.16.0 2022年12月16日
0.15.1 2022年9月22日
0.13.0 2022年7月26日
0.8.1 2022年3月29日

#6 in 魔法豆

Download history 32/week @ 2024-03-16 43/week @ 2024-03-23 64/week @ 2024-03-30 25/week @ 2024-04-06 36/week @ 2024-04-13 23/week @ 2024-04-20 31/week @ 2024-04-27 25/week @ 2024-05-04 35/week @ 2024-05-11 31/week @ 2024-05-18 30/week @ 2024-05-25 37/week @ 2024-06-01 22/week @ 2024-06-08 19/week @ 2024-06-15 33/week @ 2024-06-22 7/week @ 2024-06-29

每月下载量 87
用于 12 个crate(9 个直接使用)

Apache-2.0

47KB
726

TG4 规范:群组成员

基于 cw-plus CW4.

TG4 是一个存储群组成员资格的规范,可以与 TG3 多重签名结合使用。目的是存储一组可以用来确定其他部分权限的成员/选民。

由于这通常作为一对合约部署,我们预计这个合约将经常使用 QueryRaw 进行查询,并且某些数据结构的内部布局将成为公共API的一部分。实现可能添加更多数据结构,但至少这里列出的一些应该在指定的键下,并且以相同的格式。

在这种情况下,一个tg3合约可以 读取 外部群组合约,无需比读取本地存储更高的成本。但是,更新该群组合约(如果允许),将是一个外部消息,并且每个合约将收取实例化开销。

消息

我们定义了一个 InstantiateMsg{admin, members},以便将组作为另一流程的一部分来设置。实现应与此设置兼容,但可以在 instantiate 阶段添加额外的 Option<T> 字段,以配置非基本扩展。

组合约支持三种消息

UpdateAdmin{admin} - 更改(或清除)合约的管理员

AddHook{addr} - 在每次 UpdateMembers 调用时添加一个合约地址。这只能由管理员调用,必须小心处理。如果合约返回错误或耗尽gas,将回滚成员更改(详见下面的挂钩部分)。

RemoveHook{addr} - 注销由 AddHook 设置的先前设置的合约地址。

只有 admin 可以执行这些函数中的任何一个。因此,通过省略 admin,我们最终得到了与 cw3-fixed-multisig 类似的功能。如果我们包括它,通常希望它是一个 tg3 合约,该合约将此组合约用作组。这会导致一个鸡生蛋的难题,但我们将在 cw3-flexible-multisig 中介绍如何实例化它。

查询

智能

TotalPoints{} - 返回所有当前成员的总分数,这对于定义在“成员百分比”上的某些条件非常有用。

Member{addr, height} - 如果该投票者是组成员,则返回其分数(可能为0),如果不是组成员,则返回 None。如果设置了 height,并且 tg4 实现支持快照,则此操作将返回给定高度块的开始时该成员的分数。

ListMembers{start_after, limit} - 允许我们分页遍历所有成员的列表。包括 0 分的成员。已删除的成员不会包括在内。

ListMembersByPoints{start_after, limit} - 允许我们分页遍历按降序排序的成员列表。

Admin{} - 返回 admin 地址,如果没有设置,则返回 None

原始

除了上述“智能查询”,这些构成了公共API之外,我们还定义了两个原始查询,这些查询旨在提高合约与合约调用中的效率。它们使用 tg4 导出的键。

TOTAL_KEY - 使用此键(b"total")进行原始查询将返回一个JSON编码的u64

member_key() - 接受一个Addr并返回一个可以用于原始查询的键("\x00\x07members" || addr)。如果成员不在组内,则返回空字节;否则返回一个包含成员指针和可选的成员加入起始高度的JSON编码的MemberInfo结构,可用于在有相同点数的成员之间进行平局判定。详细信息请参见query.rs

钩子

tg4合约的一个特殊功能是它们允许管理员注册多个钩子。这些是特殊的合约,需要响应组成员资格的变化,这使得它们可以保持同步。请注意,这是一个强大的功能,您应该只为完全信任的合约设置钩子;通常是与组一起部署的某些合约。

如果某个合约被注册为tg4合约上的钩子,那么每次UpdateMembers成功执行时,钩子将收到一个格式如下handle调用

{
  "member_changed_hook": {
    "diffs": [
      {
        "addr": "cosmos1y3x7q772u8s25c5zve949fhanrhvmtnu484l8z",
        "old_points": 20,
        "new_points": 24
      }
    ]
  }
}

有关完整详情,请参见hook.rs。注意,此示例显示了一个更新或现有成员。old_points如果地址是第一次添加则不存在。如果地址被删除,则不存在new_points

接收合约必须能够处理MemberChangedHookMsg,并且只有在它想要更改组合约的功能(例如,一个多签名合约想要在存在开放提案时阻止成员资格更改)时才应返回错误。然而,这种情况相当罕见,通常指向脆弱的代码。

请注意,消息发送者将是更新的组合约。确保在处理时检查这一点,以便外部行为者不能调用此钩子,只有受信任的组才能。

依赖关系

~3.5–5MB
~109K SLoC