本文档介绍了在 Solana 上进行 Restaking 的流程和关键概念。它涵盖了账户结构(如 Vaults、Receipt Token Mint)、指令(如 Deposit、Withdrawal Request)、以及代码验证方法。此外,还提到了未来功能的待定实现,例如奖励机制、Oracle 接口以及初始化前存款用户的验证器选择。
该程序的高层流程如下图所示。
Vaults(金库):为每个白名单代币创建金库。金库是代币账户。账户的权限是一个 PDA,这意味着程序控制金库,并且任何从金库的借记都必须通过智能合约。
Receipt Token Mint(凭证代币铸币厂):凭证代币铸币厂是一个 NFT,它是存储有关质押数量、验证者和奖励信息的 PDA 的种子。 更多信息,请参考: https://docs.composable.finance/technology/solana-restaking/vaults/#receipt-token
Staking Params(质押参数):这是一个 PDA,它存储质押参数,并且也是 Receipt Token Mint
(凭证代币铸币厂)和 Vaults
(金库)的权限。
Vault Params(金库参数):PDA,它存储金库参数,这些参数是质押时间和为其质押的服务,以及何时申领奖励。
当合约部署时,调用 initialize
方法,其中设置了白名单代币、管理密钥和奖励代币铸币厂。 最初,guest_chain_initialization
设置为 false。 任何对质押参数的更新只能由管理密钥完成。 还会为奖励代币铸币厂创建一个代币帐户,该帐户将分配奖励。 由于权限是 PDA,因此从帐户的任何借记都只能通过合约发生(目前仅在 claim
方法中)。 之后,用户可以开始质押。
Deposit
(存款):用户可以质押任何白名单代币。 代币存储在金库中,并为用户铸造凭证代币。 向 Guest Chain 程序发出 CPI(跨程序调用)调用,其中更新指定验证者的质押。
Withdrawal Request
(提款请求):用户可以请求提款,并且在解除绑定期限结束后,代币将被提款。 在此方法中,凭证 NFT 将转移到托管账户,并且凭证 NFT 代币账户将被关闭。 所有待处理的奖励都在此方法中转移,并且用户在解除绑定期间将没有资格获得奖励。
Cancel Withdrawal Request
(取消提款请求):用户设置的提款请求可以取消,只要它们在解除绑定期间内,或者如果提款尚未执行。 他们将取回他们的凭证代币,并且提款请求将被取消。
Withdraw
(提款):用户只能在解除绑定期限结束后提取他们的代币。 当用户想要提取代币时,最终质押金额将从 Guest Chain 中获取。 凭证代币被烧毁。 对 Guest Chain 进行 CPI 调用以相应地更新质押。
Claim Rewards
(申领奖励):用户可以在不提取其质押的情况下申领奖励。 他们必须拥有不可替代的凭证代币才有资格申领奖励。
Set Service
(设置服务):一旦桥接上线,之前已存款的用户可以调用此方法将其质押委托给验证者。 在将其质押委托给验证者之前,用户无法提取或申领任何奖励。 但是在桥接上线后将不再需要此方法,否则会 panic。
Update Guest chain Initialization
(更新 Guest Chain 初始化):当桥接启动并运行时,管理员将调用此方法。 这会将 guest_chain_program_id
设置为指定的程序 ID,这将允许在存款期间进行 CPI 调用并将质押设置为验证者。
Update token Whitelist
(更新代币白名单):管理员可以更新代币白名单。 只能由在 initialize
方法期间设置的管理员调用。
Withdraw Reward Funds
(提取奖励资金):此方法只能由管理员调用,以从奖励代币账户中提取所有资金。 这是一种安全措施,因此只能在紧急情况下调用。
Change admin Proposal
(更改管理员提案):当前管理员提出的用于更改管理员的提案。 现有管理员提议一个新的管理员,并且在新的管理员在 accept_admin_change
中批准之前,管理员不会更改。
Accept admin change
(接受管理员更改):由现有管理员设置的新管理员预计会调用此方法。 当新的管理员调用此方法时,管理员将被更改。
Update Staking Cap
(更新质押上限):设置质押上限的方法,该上限限制了可以在合约中设置的总质押量。 此方法期望质押上限高于之前才能成功执行。
首先,从 emulated-light-client
Github 存储库编译程序代码,以获取其字节码。
git clone https://github.com/ComposableFi/emulated-light-client.git
anchor build
现在,安装 Ellipsis Labs verifiable build crate。
cargo install solana-verify
从已编译的 Restaking 程序中获取字节码的可执行哈希
solana-verify get-executable-hash target/deploy/restaking.so
从你要验证的链上 Restaking 程序的字节码中获取哈希
solana-verify get-program-hash -u <cluster url> \
8n3FHwYxFgQCQc2FNFkwDUf9mcqupxXcCvgfHbApMLv3
多重签名成员注意事项: 如果要验证升级程序缓冲区,则需要使用以下命令从缓冲区帐户获取字节码。 你可以从 squads 获取缓冲区帐户地址。
solana-verify get-buffer-hash -u <cluster url> <buffer address>
如果这两个命令的哈希输出匹配,则存储库中的代码与链上程序的代码匹配。
由于 Guest Chain 上尚未实施奖励,因此目前返回 nil 值。
尚未添加 Oracle 接口以获取 Guest Chain 中质押代币以及治理代币的当前价格。
在 Guest Chain 初始化之前已存款的用户可以选择以下三种方式之一选择验证者(尚未实施):
- 原文链接: github.com/ComposableFi/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!