本指南详细介绍了在Solana上创建液态质押池的步骤,包括如何配置环境、添加验证者、存入SOL以及质押的过程。该文提供了丰富的示例和命令,帮助用户在去中心化金融中保持流动性,同时保证网络的安全性。
Liquid Staking 是一个 Web3 概念,允许用户质押他们的代币,同时仍然能够在去中心化金融 (DeFi) 中保持流动性。通过将 SOL 放入一个 Liquid Staking 池,它会被池管理者分配给经过筛选的验证者组。作为交换,你将获得一个代表你质押的 SOL 的代币(或 Liquid Staking 代币)。与质押的 SOL 不同,该新代币是流动的,可以在 DeFi 平台上进行交换、出售、移动和使用。
Liquid Staking 作为一种帮助保障网络同时为参与去中心化金融 (DeFi) 保持流动性的方式,它的受欢迎程度不断上升。Solana 拥有一个针对创建 Liquid Staking 池和代币的原生程序。本指南将介绍如何使用 Solana Stake Pool Program 在 Solana 上创建一个 Liquid Staking 池。
依赖项 | 版本 |
---|---|
solana-cli | 1.16.10 |
spl-stake-pool | 0.6.4 |
rustc | 1.69.0 |
在我们的演示中,我们将使用 Solana CLI 来管理两个钱包:一个池管理钱包和一个用户钱包。池管理钱包将用于创建池和添加验证者,用户钱包将存入 SOL 到池中并接收 Liquid Staking 代币。
在你安装 Solana CLI 和 SPL-Stake-Tool CLI 后,创建一个新目录并在终端中导航到该目录:
mkdir solana-liquid && cd solana-liquid
让我们创建两个将用于此次演示的钱包。我们将使用 solana-keygen
命令创建两个新钱包:AUTHORITY.json
和 USER.json
。在终端中输入:
solana-keygen new --no-bip39-passphrase -s -o AUTHORITY.json && solana-keygen new --no-bip39-passphrase -s -o USER.json
通过在终端中输入以下命令,更新你的 Solana 配置以指向 AUTHORITY.json
钱包和 Solana 的 Devnet:
solana config set -ud -k ./AUTHORITY.json
你应该能够输入 solana config get
并看到你的端点,并确认你的钱包已正确配置。
通过使用 solana address
命令获取你创建的新钱包的地址:
solana address -k AUTHORITY.json && solana address -k USER.json
这将把两个钱包地址记录到你的终端。你将需要每个钱包大约 5 SOL 用于此次演示。你可以从 Solana Faucet 请求 SOL。有关获取 Devnet SOL 的其他方式,请查看我们的 在 Solana 上空投测试 SOL 的完整指南。
在移动到下一步之前,通过使用 solana balance
命令验证你两个钱包中是否都有 SOL:
solana balance -k AUTHORITY.json && solana balance -k USER.json
你应该在终端中看到如下响应:
5 SOL
5 SOL
让我们继续创建我们的 Liquid Staking 池。
Solana Stake Pool Program 是一个 Solana 程序,用于将 SOL 汇集在一起,由定义的池进行质押。简而言之,该程序(ID: SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy) 为团队创建质押池、实施验证者分配策略、收集费用以及存取资金提供了标准。Solana 的 Stake Pool CLI 使团队能够轻松创建和管理自己的 Liquid Staking 池。在创建池之前,让我们先介绍一下该程序的几个要素。
每个质押池包含两个数据账户:
质押池包含有关池的总体信息,包括费用、池代币铸造、管理金额等。
由于质押池可以拥有大量的验证者,并且 Solana 对交易大小有限制,更新质押池的总价值可能需要多次交易(这由 Stake Pool CLI 处理)。
与传统的质押类似,质押池有三种类型的质押账户(或质押状态):
质押池程序允许管理员对池实施不同类型的费用:
费用类型 | 描述 |
---|---|
SOL 存入 | 用户在将 SOL 存入池时收取的 % |
质押存入 | 用户在将质押账户委托给池时收取的 % |
SOL 取出 | 用户在从池中取出 SOL 时收取的 % |
质押取出 | 用户在从池中向已激活的质押账户取出 SOL 时收取的 % |
纪元(质押奖励) | 在每个纪元结束时收取的池质押奖励的 % |
推荐 | 分配给应用或钱包的池存入费用的 % |
避免经济攻击
理解质押池费用对于避免 某些经济攻击 至关重要。
在最简单的攻击中,就在每个纪元结束前,恶意池代币持有者会寻找该纪元内表现最佳的验证者,提取价值全部池代币的活动质押,等待纪元过渡,赚取最大质押奖励,然后再将其投入质押池。 从实际角度来看,恶意存入者总是委托给质押池中表现最佳的验证者,而无需真正将质押提交给该验证者。此外,恶意存入者绕过任何纪元费用。 为了使这种攻击不可行,质押池管理者可以设置存入或取出的费用。如果质押池的整体绩效为 6% APY / ~3.3 基点/纪元,而最佳验证者的绩效为 6.15% APY / ~3.37 基点/纪元,那么最低的质押存取费用应为 0.07 基点。
让我们创建我们的 Liquid Staking 池。
通过在终端中输入 spl-stake-pool -h
,查看 spl-stake-pool
命令选项。你应该能看到选项列表。你应该能看到 create-pool
作为选项。让我们进一步探讨其选项,随后用它来创建我们的池。在终端中运行 spl-stake-pool create-pool -h
查看创建池的可用选项。你应该看到我们需要指定我们的纪元费用和最大验证者数量。我们还有选项来指定其他费用和权限。让我们创建一个在取出时收取 0.1% 的费用和在纪元(质押)奖励中收取 5% 的 Liquid Staking 池。
在终端中输入以下命令以创建新的 Liquid Staking 池:
spl-stake-pool create-pool \
--epoch-fee-numerator 5 \
--epoch-fee-denominator 100 \
--max-validators 10 \
--withdrawal-fee-denominator 1000 \
--withdrawal-fee-numerator 1
你将在终端中看到如下内容:
创建储备质押 FW97PaKCuUEws2hcwgFojXtcs886KcWtcNZkBDqgA3PY
创建铸造 9rb1D5DKpGRChr8wpvbwgiTC324GFnkx9o85c2LKX5Uf
创建关联代币账户 2moXNUzN5zuk2qake7TWBsypU99cWjDdbEnVDAVZfVRM 以接收铸造 9rb1D5DKpGRChr8wpvbwgiTC324GFnkx9o85c2LKX5Uf 的质押池代币,拥有者为 EST7AuMSjdoPG1UvpJRKpWzirzrPbBJGhiTzUh8gjJRk
创建池费用收取账号 2moXNUzN5zuk2qake7TWBsypU99cWjDdbEnVDAVZfVRM
签名: 4e5gymVC9JfWWKims2mLzeytjuxrDjggQ6ZTMsSovfv3nhxT4W9KLgPyryhps6ihTR13McVH4j2B3TtJ6K7iUo7
创建质押池 Co6uQcNnMq9i5NgFvtehDv8Yo83TStNwBMGhgWkKXCU7,带验证者列表 HVmBDKny4X8t77X3UKWfB2KvU7cNzr4VsSkF1PgUiZmW
签名: LuCzBhesbsUEti4qZtAiaQgieEGySRJLCi5MGyarjG67bVmjv1KxQEg2mdxPDHfLzefnSrF7F9fnVgQMgHZTZ8Y
恭喜!你刚刚创建了你的第一个 Liquid Staking 池。以下是创建的账户及其用途的摘要:
AUTHORITY.json
钱包的) Liquid Staking 代币。你现在可以通过在终端中输入以下命令查看有关你池的详细信息(确保包括上述步骤中的质押池地址):
spl-stake-pool list -v <YOUR_STAKE_POOL_ADDRESS>
你应该能够看到有关你的质押池及其相关账户和质押的信息:
尽管用户可以立即向池中存入 SOL,但池仍然需要验证者。让我们向池中添加一些验证者。
要向你的新池中添加验证者,你需要知道验证者的投票账户公钥。如果你在主网进行操作,你可能已经通过自己的研究知道了一些你希望质押的特定验证者。你可以通过在各种区块浏览器或社区验证器跟踪器上查找来找到验证者的投票账户密钥:
由于在 Devnet 操作,我们将从 CLI 中获取验证者列表。在终端中输入以下命令以获取验证者列表:
solana validators
你应该能够看到验证者及其投票账户密钥的列表。我会寻找一个佣金较低并使用 Solana 最新版本的验证者。我将选择 FwR3PbjS5iyqzLiLugrBqKSa5EKZ4vK9SKs7eQXtT59f
作为我的第一个验证者。可以自由选择一个你喜欢的验证者 - 我们稍后可以添加更多或删除这个。
在终端中,使用 add-validator
命令将验证者添加到你的池中(你可以运行 spl-stake-pool add-validator -h
查看该命令的所有标志和选项)。确保包括验证者的投票账户密钥和你的池地址:
spl-stake-pool add-validator <YOUR_STAKE_POOL_ADDRESS> <VOTE_ACCOUNT_ADDRESS>
干得好。实际上,你现在已经拥有了一个带有单个验证者的 Liquid Staking 池,但还没有质押(你可以重新运行 spl-stake-pool list -v <YOUR_STAKE_POOL_ADDRESS>
以查看更新的详细信息)。可以自由重复此步骤,以向你的质押池添加多个验证者。
让我们向池中存入一些 SOL 并接收我们的 Liquid Staking 代币。
要向池中存入 SOL,你需要使用 deposit-sol
命令。虽然我们可以使用任何钱包(包括我们的权限钱包)进行此操作,但让我们保持账户/角色分开,使用 USER.json
钱包将 SOL 存入池中。使用 solana config set
命令将你的钱包设置为 USER.json
钱包:
solana config set -k ./USER.json
你需要指定希望存入的 SOL 数量和要用来存入 SOL 的钱包。在终端中输入以下命令以将 2 SOL 存入池中:
spl-stake-pool deposit-sol <YOUR_STAKE_POOL_ADDRESS> 2
你应该能够在终端中检查返回的交易,以确保存入成功。将事务 ID 复制并粘贴到 Solana Explorer 中以查看交易细节(请确保选择 Devnet)。你应该会看到你的 SOL 余额减少了 2 SOL,你的 Liquid Staking 代币余额增加了 2:
如果你向下滚动到探测器,你应该可以看到创建 Liquid Staking 代币的 mint_to
指令:
让我们从池中提取一些 SOL,以便熟悉其功能。之所以可以这样做,是因为这部分 SOL 还未委托给验证者(我们的池在其储备账户中还有余额)。我们将从池中提取 0.1 SOL。在终端中输入以下命令:
spl-stake-pool withdraw-sol <YOUR_STAKE_POOL_ADDRESS> ./USER.json 0.1
请注意,withdraw-sol
函数要求我们传递一个资金目的地(我们已将其传递到 ./USER.json
钱包中)。
你应该在终端中看到类似的交易确认。如果你在 Solana Explorer 中查看此交易,你应该会看到你的 SOL 余额增加了 0.1 SOL,Liquid Staking 代币余额减少了 0.1。你还将看到 LST 已被 Stake Pool Program 销毁(或销毁):
让我们继续将我们的 SOL 委托给验证者。
在我们能够将 SOL 委托给验证者之前,必须先将钱包设置回 AUTHORITY.json
钱包。在终端中输入以下命令:
solana config set -k ./AUTHORITY.json
如果你完全遵循了本指南,你的储备账户应该有 1.9 SOL 可用于质押。你可以通过在终端中输入以下命令来确认你的储备余额:
spl-stake-pool list -v <YOUR_STAKE_POOL_ADDRESS>
你应该在终端中看到以下内容:
质押池信息
===============
质押池: 35YFYPM2e6oRNh54ZbJzgyAQLeLxzouHWeZpDFxdRt7m
//...
质押账户
--------------
储备账户: 8mq8jPQ5U289k8sbZxG3Pk8xF2HDfHzNcTqVS5ndSCbr 可用余额: ◎1.900000000
//...
投票账户: FwR3PbjS5iyqzLiLugrBqKSa5EKZ4vK9SKs7eQXtT59f 质押账户: H5j8BLLDqU1zrdjRb9jkoZDXAo5Gom3h6PUZVDAY13oH 活跃余额: ◎0.000000000 暂时性质押账户: 5L7DdJvD9Y9WZqriD2inPh526syCZJkH4knWqLHTwFnn 暂时余额: ◎0.000000000 上次更新纪元: 557
让我们使用 increase-validator-stake
将 1 SOL 委托给验证者(请记住,你可以使用 -h
标志查看与此命令相关的选项)。你需要前面步骤中的 STAKE_POOL_ADDRESS
和验证者的 VOTE_ACCOUNT_ADDRESS
。在终端中输入以下命令:
spl-stake-pool increase-validator-stake <YOUR_STAKE_POOL_ADDRESS> <VOTE_ACCOUNT_ADDRESS> [AMOUNT]
你应该会收到交易确认。随意在 Solana Explorer 中浏览该交易,然后重新运行 spl-stake-pool list -v <YOUR_STAKE_POOL_ADDRESS>
命令,以查看池的最新详细信息。你应该看到你的储备余额减少了 1 SOL,验证者的暂时质押增加了 1 SOL:
//...
质押账户
--------------
储备账户: 8mq8jPQ5U289k8sbZxG3Pk8xF2HDfHzNcTqVS5ndSCbr 可用余额: ◎0.900000000
//...
投票账户: FwR3PbjS5iyqzLiLugrBqKSa5EKZ4vK9SKs7eQXtT59f 质押账户: H5j8BLLDqU1zrdjRb9jkoZDXAo5Gom3h6PUZVDAY13oH 活跃余额: ◎0.000000000 暂时性质押账户: 5L7DdJvD9Y9WZqriD2inPh526syCZJkH4knWqLHTwFnn 暂时余额: ◎1.000000000 上次更新纪元: 557
SOL 将在下一个纪元开始时被质押。你可以通过重新运行 list
命令来检查质押的状态。你可以通过在终端中输入以下命令来检查当前纪元的状态:
solana epoch-info
很好,你已经到达这一点。你现在拥有自己的质押池,可以管理质押分配,用户可以轻松存入和取出 SOL。我们鼓励你探索在 Stake Pool CLI 中可用的其他命令(通过 spl-stake-pool -h
访问)以及探索 Stake Pool Program 文档,以了解有关程序及其功能的更多信息。以下是一些建议的尝试事项:
deposit-stake
命令)spl-stake-pool update
计算质押池代币的适当价值decrease-validator-stake
命令)withdraw-stake
命令)remove-validator
命令)你可能会发现你只能从储备账户 withdraw-sol
,而只能从活跃的验证者质押账户 withdraw-stake
。这意味着暂时性资金(待激活或停用的质押)将无法提供给你的用户。在探索你的质押池演示时,你可能会发现管理流动性、用户体验和用户对流动性的期望是 Liquid Staking 池的重要考虑事项。
如果你遇到困难、有问题或只是想谈谈你正在构建的内容,请在 Discord 或 Twitter 上给我们留言!
让我们知道 如果你有任何反馈或新的主题请求。我们很乐意听到你的声音。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!