2 个稳定版本
1.3.1 | 2023年8月17日 |
---|---|
1.3.0 | 2023年8月16日 |
在 #squads 中排名第 3
用于 2 crate
62KB
941 行
Squads 多签程序库
该程序简化了多签的签名和执行交易的过程。该程序使用 Anchor 编写,具有可以由程序 IDL 易于反序列化的指令和账户。如果您想通过 CPI 调用程序,您需要在指令参数之前添加 Anchor 判别器(8 字节十六进制),然后是所需序列化的数据。
内容
入门
anchor test --skip-deploy
将运行多签的基本功能。您可能需要调整声明的程序 ID。
账户和指令
账户
程序中有 3 种类型的账户
- 多签 (Ms)
- 交易 (MsTransaction)
- 指令 (MsInstruction)
指令
指令可以分类如下
- 内部指令,是直接调用 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