流动性质押是一种Web3概念,允许用户质押自己的代币,同时仍具有流动性以参与去中心化金融(DeFi)。通过将SOL放入流动性质押池,池管理员会将其分发给经过筛选的验证者组。作为交换,您将获得一个代表代币(或流动性质押代币),该代币反映了您质押的SOL。与质押的SOL不同,这种新代币
<!--StartFragment-->
流动性质押是一种 Web3 概念,允许用户质押自己的代币,同时仍具有流动性以参与去中心化金融 (DeFi)。通过将 SOL 放入流动性质押池,池管理员会将其分发给经过筛选的验证者组。作为交换,您将获得一个代表代币(或流动性质押代币),该代币反映了您质押的 SOL。与质押的 SOL 不同,这种新代币具有流动性,可以在 DeFi 平台中交换、出售、移动和使用。
流动性质押作为一种帮助保护网络同时保持流动性以参与去中心化金融 (DeFi) 的方式越来越受欢迎。Solana 有一个用于创建流动性质押池和代币的原生程序。本指南将介绍如何使用Solana 质押池计划在 Solana 上创建流动性质押池。
依赖 | 版本 |
---|---|
solana 命令行工具 | 1.16.10 |
spl-权益池 | 0.6.4 |
rustc | 1.69.0 |
在我们的演示中,我们将使用 Solana CLI 来管理两个钱包:一个 Pool Authority 钱包和一个 User 钱包。Pool Authority 钱包将用于创建池并添加验证者。User 钱包将把 SOL 存入池中并接收流动质押代币。
安装Solana CLI和SPL-Stake-Tool CLI后,为你的项目创建一个新目录并在终端中导航到该目录:
mkdir solana-liquid && cd solana-liquid
用于简化调试的日志
您现在可以访问 RPC 端点的日志,从而帮助您更有效地解决问题。如果您在 RPC 调用中遇到问题,只需检查 QuickNode 仪表板中的日志即可快速识别和解决问题。在我们的定价页面上了解有关日志历史记录限制的更多信息。
让我们创建用于此演示的两个钱包。我们将使用solana-keygen
命令创建两个新钱包:AUTHORIY.json
和USER.json
。在您的终端中,输入:
solana-keygen new --no-bip39-passphrase -s -o AUTHORITY.json && solana-keygen new --no-bip39-passphrase -s -o USER.json
AUTHORITY.json
通过在终端中输入以下命令来更新 Solana 配置以指向钱包和 Solana 的开发网络:
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
让我们继续创建我们的流动权益池。
[Solana 质押池计划]是一个 Solana 程序,用于将 SOL 汇集在一起,以便在一组池定义的验证器中进行质押。简而言之,该计划(ID:[SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy])为团队创建了一个标准,用于建立质押池、实施验证器分配策略、收取费用以及从池中存入/提取资金。Solana 的质押池 CLI 使团队可以轻松创建和管理自己的流动质押池。在创建我们的池之前,让我们先介绍一下该计划的一些要素。
每个权益池包含两个数据账户:
权益池包含有关池的整体信息,包括费用、池代币铸造、管理金额等。
由于权益池可以拥有大量验证者,并且 Solana 对交易规模有严格的限制,因此更新权益池的总价值可能需要多个交易(这由权益池 CLI 处理)。
与传统质押类似,质押池有三种类型的质押账户(或质押状态):
权益池计划允许当局对权益池实施不同类型的费用:
费用类型 | 描述 |
---|---|
SOL 存款 | 当用户将 SOL 存入池中时向用户收取的百分比 |
质押保证金 | 当用户将权益账户委托给权益池时,向用户收取的费用百分比 |
SOL 提款 | 当用户从池中提取 SOL 时向用户收取的百分比 |
提现权益 | 当用户将 SOL 提取到已激活的质押账户时,向用户收取的百分比 |
Epoch(权益奖励) | 每个时期结束时从矿池中扣除的矿池质押奖励百分比 |
推荐 | 分配给合作伙伴应用程序或钱包的池存款费用的百分比 |
\
避免经济攻击
了解权益池费用对于避免针对权益池的某些经济攻击至关重要
在最简单的攻击中,在每个时期结束之前,恶意池代币持有者会找到该时期池中表现最好的验证者,提取价值相当于其所有池代币的活跃质押,等到时期结束,获得最大质押奖励,然后存回质押池。实际上,恶意存款人总是被委托给质押池中表现最好的验证者,而实际上从未向该验证者承诺质押。最重要的是,恶意存款人会绕过任何时期费用。为了使这种攻击不可行,质押池管理员可以设置存款或取款费用。如果质押池的整体表现为 6% APY / \~3.3 个基点/时期,而最佳验证者的表现为 6.15% APY / \~3.37 个基点/时期,则最低质押存款/取款费用为 0.07 个基点。
让我们创建我们的流动权益池。
spl-stake-pool
在终端中输入查看命令选项spl-stake-pool -h
。您应该会看到一个选项列表。您应该会看到create-pool
一个选项。让我们也探索一下它的选项,然后使用它来创建我们的池。在您的终端中,运行spl-stake-pool create-pool -h
以查看创建池的选项。您应该会看到我们需要指定我们的 epoch 费用和最大验证者数量。我们还可以选择指定其他费用和权限。让我们创建一个流动质押池,收取提款的 0.1% 费用和 5% 的 epoch(质押)奖励。
在您的终端中,输入以下命令来创建一个新的流动权益池:
spl-stake-pool create-pool \
--epoch-fee-numerator 5 \
--epoch-fee-denominator 100 \
--max-validators 10 \
--withdrawal-fee-denominator 1000 \
--withdrawal-fee-numerator 1
你应该在终端中看到类似这样的内容:
Creating reserve stake FW97PaKCuUEws2hcwgFojXtcs886KcWtcNZkBDqgA3PY
Creating mint 9rb1D5DKpGRChr8wpvbwgiTC324GFnkx9o85c2LKX5Uf
Creating associated token account 2moXNUzN5zuk2qake7TWBsypU99cWjDdbEnVDAVZfVRM to receive stake pool tokens of mint 9rb1D5DKpGRChr8wpvbwgiTC324GFnkx9o85c2LKX5Uf, owned by EST7AuMSjdoPG1UvpJRKpWzirzrPbBJGhiTzUh8gjJRk
Creating pool fee collection account 2moXNUzN5zuk2qake7TWBsypU99cWjDdbEnVDAVZfVRM
Signature: 4e5gymVC9JfWWKims2mLzeytjuxrDjggQ6ZTMsSovfv3nhxT4W9KLgPyryhps6ihTR13McVH4j2B3TtJ6K7iUo7
Creating stake pool Co6uQcNnMq9i5NgFvtehDv8Yo83TStNwBMGhgWkKXCU7 with validator list HVmBDKny4X8t77X3UKWfB2KvU7cNzr4VsSkF1PgUiZmW
Signature: LuCzBhesbsUEti4qZtAiaQgieEGySRJLCi5MGyarjG67bVmjv1KxQEg2mdxPDHfLzefnSrF7F9fnVgQMgHZTZ8Y
恭喜!您刚刚创建了第一个流动质押池。以下是已创建账户的摘要及其用途:
AUTHORITY.json
钱包)的流动权益代币。您现在可以通过在终端中输入以下命令来查看有关您的池的详细信息(确保包含上述步骤中的权益池地址):
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>
干得好。实际上,您现在拥有一个流动质押池,其中只有一个验证者,但没有质押(您可以重新运行spl-stake-pool list -v <YOUR_STAKE_POOL_ADDRESS>
以查看更新的详细信息)。您可以随意重复此步骤,将多个验证者添加到您的质押池中。
让我们将一些 SOL 存入池中并接收我们的流动质押代币。
要将 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,而您的流动质押代币余额增加了 2:
如果你在资源管理器中向下滚动,你应该会看到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,而您的流动质押代币余额减少了 0.1。您还将看到 LST 已被质押池计划烧毁(或销毁):
让我们继续将 SOL 委托给验证者。
在委托 SOL 之前,我们必须先将钱包设置回钱包AUTHORITY.json
。在终端中,输入以下命令:
solana config set -k ./AUTHORITY.json
如果你完全按照步骤操作,你的储备账户应该有 1.9 SOL 可供质押。你可以在终端中输入以下命令来确认储备余额:
spl-stake-pool list -v <YOUR_STAKE_POOL_ADDRESS>
你应该在终端中看到类似这样的内容:
Stake Pool Info
===============
Stake Pool: 35YFYPM2e6oRNh54ZbJzgyAQLeLxzouHWeZpDFxdRt7m
//...
Stake Accounts
--------------
Reserve Account: 8mq8jPQ5U289k8sbZxG3Pk8xF2HDfHzNcTqVS5ndSCbr Available Balance: ◎1.900000000
//...
Vote Account: FwR3PbjS5iyqzLiLugrBqKSa5EKZ4vK9SKs7eQXtT59f Stake Account: H5j8BLLDqU1zrdjRb9jkoZDXAo5Gom3h6PUZVDAY13oH Active Balance: ◎0.000000000 Transient Stake Account: 5L7DdJvD9Y9WZqriD2inPh526syCZJkH4knWqLHTwFnn Transient Balance: ◎0.000000000 Last Update Epoch: 557
让我们使用 将 1 SOL 委托给验证者increase-validator-stake
(请记住,您可以使用-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:
//...
Stake Accounts
--------------
Reserve Account: 8mq8jPQ5U289k8sbZxG3Pk8xF2HDfHzNcTqVS5ndSCbr Available Balance: ◎0.900000000
//...
Vote Account: FwR3PbjS5iyqzLiLugrBqKSa5EKZ4vK9SKs7eQXtT59f Stake Account: H5j8BLLDqU1zrdjRb9jkoZDXAo5Gom3h6PUZVDAY13oH Active Balance: ◎0.000000000 Transient Stake Account: 5L7DdJvD9Y9WZqriD2inPh526syCZJkH4knWqLHTwFnn Transient Balance: ◎1.000000000 Last Update Epoch: 557
SOL 将在下一个纪元开始时质押。您可以通过重新运行list
命令来检查质押的状态。您可以通过在终端中输入以下命令来检查当前纪元的状态:
solana epoch-info
干得好,到达了这一步。现在,您有了自己的权益池,您可以在其中管理权益分配,用户可以轻松存入和提取 SOL。我们鼓励您探索权益池 CLI(可通过 访问spl-stake-pool -h
)中可用的其他命令,并探索权益池计划,以了解有关该计划及其功能的更多信息。以下是一些值得尝试的建议:
向您的池中添加更多验证者
将现有的质押账户转移到你的权益池(使用deposit-stake
命令)
下一个纪元之后:
spl-stake-pool update
以计算权益池代币的正确价值decrease-validator-stake
命令)withdraw-stake
命令)从池中删除验证者(使用remove-validator
命令)
修改费用
探索 Solana用于重新平衡验证者池的示例脚本
添加元数据(流动质押代币的图标、名称和描述)
您可能会注意到,您只能withdraw-sol
从储备账户和withdraw-stake
活跃的验证者质押账户进行质押。这意味着您的用户将无法使用临时资金(待激活或停用质押)。在探索质押池演示时,您可能会发现,管理流动性、用户体验和用户对流动性的期望是流动质押池的重要考虑因素。
<!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!