2 个稳定版本

1.3.1 2023年8月17日
1.3.0 2023年8月16日

#squads 中排名第 3


用于 2 crate

AGPL-3.0-or-later

62KB
941

Squads 多签程序库

该程序简化了多签的签名和执行交易的过程。该程序使用 Anchor 编写,具有可以由程序 IDL 易于反序列化的指令和账户。如果您想通过 CPI 调用程序,您需要在指令参数之前添加 Anchor 判别器(8 字节十六进制),然后是所需序列化的数据。

内容

入门

anchor test --skip-deploy 将运行多签的基本功能。您可能需要调整声明的程序 ID。

账户和指令

账户

程序中有 3 种类型的账户

指令

指令可以分类如下

  • 内部指令,是直接调用 squads-mpl 指令
  • 外部/任意指令,可以附加到将被多签最终执行的交易上

内部指令

主要影响 Ms 账户的内部指令

  • 创建
  • 添加成员
  • 移除成员
  • 更改阈值
  • 添加成员 & 更改阈值
  • 移除成员 & 更改阈值

与处理MsTransactions相关的内部说明

  • 创建
  • 附加外部/任意指令
  • 签发/激活
  • 批准
  • 拒绝
  • 取消
  • 执行

权限

每个创建和执行的MsTransaction都代表一个授权机构执行。授权机构通过u32推导而来,并在创建时(通过传递authority_index参数)保存在MsTransaction账户中。索引为0的授权机构是为直接影响多签名的MsTransactions预留的(添加成员、更改阈值等)。其他授权索引是中立的,代表在执行期间将签署的底层账户/PDA。例如,多签名可以使用authority_index 1来表示保险库,authority_index 2表示二级保险库,authority_index 3表示程序升级授权。如何利用这些以及确保创建的MsTransaction中的authority_index与附加指令中指定的必要账户相匹配,由最终用户决定。

如果多签名希望增加保存在Ms账户中的authority_index,以方便推导用户界面的授权PDAs,则还有一个附加指令。Ms账户中的authority_index可以作为推导可能已使用的授权的方式,但它对多签名的操作没有影响——它仅为了方便。

创建多签

要使用Squads MPL创建多签名,请调用create 指令。指定多签名的阈值、一个随机密钥以初始化多签名地址,以及签署任何交易所需的密钥。

创建 Ms 交易

初始化MsTransaction

要为多签名创建交易,请调用create_transaction 指令,并将授权索引作为参数。请注意,尽管交易可以包含多个指令,但只能利用一个授权。在创建MsInstruction账户后,它将处于Draft状态。有关授权的更多信息

将MsInstructions附加到MsTransaction

当MsTransactions处于Draft状态时,创建MsTransaction的成员可以自由附加MsInstructions。使用add_instruction 指令,并将要附加到MsTransaction的指令作为序列化的Solana TransactionInstruction作为参数传递。附加的指令将被保存在相应的MsInstruction账户中,相关PDA作为地址,可通过MsTransaction和相关MsInstruction账户的instruction_index跟踪。请注意,即使执行者可以请求更多的计算周期,执行仍然有数据限制,所以我们建议将所有附加指令所需的唯一账户总数保持在30个以下,否则MsTransaction将需要依次执行。

激活 Ms 交易

在附加了所需的MsInstructions后,MsTransaction的创建者可以激活MsTransaction,以便多签名可以对其实施投票以批准或拒绝。使用activate_transaction 指令将MsTransaction的状态从Draft切换到Active

批准或拒绝 Ms 交易

具有Active状态的MsTransactions可以被投票批准或拒绝。要批准交易执行,请使用approve_transaction 指令。同样,要拒绝MsTransaction,请使用reject_transaction 指令

执行 Ms 交易

为了执行MsTransaction,除了IDL中指定的账户外,调用执行的用户/密钥还必须传入一个引用此格式(2条指令的示例)的MsInstructions账户列表。

第一个MsInstruction(《instruction_index of 1》)

  • MsInstruction的PDA
  • MsInstruction将要调用的程序_id
  • 所有其他引用此MsInstruction的账户列表

第二个MsInstruction(《instruction_index of 2》)

  • MsInstruction的PDA
  • MsInstruction将要调用的程序_id
  • 所有其他引用此MsInstruction的账户列表

执行所需的账户可以通过MsTransaction账户本身推导出来,因为MsTransaction账户包含一个instruction_index,在附加MsInstruction时需要顺序递增。要执行,首先可以获取MsTransaction账户,然后根据MsTransaction中的instruction_index反向推导出所有MsInstruction账户,推导出MsInstruction的PDAs,获取MsInstruction账户,然后按照上述解释格式化多签的ExecuteInstruction。要了解如何实现这一点,可以查看此处的一个测试辅助函数。发送给ExecuteTransaction指令的账户应遵循唯一的数组索引模式,其中数组中的项数与预期账户列表映射,每个项代表从Context中的remaining_accounts字段中使用的账户的索引。

验证

您可以使用以下命令验证commit c95b7673d616c377a349ca424261872dfcf8b19d构建和链上程序:anchor verify -p squads_mpl SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -d projectserum/build:v0.26.0 --provider.cluster {specify-cluster-here} 注意:由于一个怪癖,请确保avm use 0.24.0,否则IDL不会验证,只有程序本身。

贡献

鼓励社区为Squads-MPL做出贡献,无论是提出修复、更新还是添加更多程序。对于一般的修复和特性建议,请提交拉取请求以供审查。

其他工具和程序

  • 程序管理器 - 管理Squads多签程序升级的程序
  • Squads Grinder - 如果您想尝试研磨一个保险库/权威地址,请使用虚荣权威密钥研磨器

依赖项

~21–30MB
~517K SLoC