如何设置 Solana 验证节点

  • Helius
  • 发布于 2024-04-25 11:56
  • 阅读 47

本文详细介绍了如何从技术角度设置和运行Solana主网验证器,包括硬件要求、Solana CLI的安装、密钥对的生成、投票账户的设置、机器配置、监控和安全设置等。文章还提供了一些额外的资源和工具,帮助用户更好地管理和优化验证器。

19 分钟阅读

2024 年 4 月 23 日

本文将重点从技术角度介绍如何启动一个 Solana 主网验证节点。我们将设置工具和配置,以便使持续操作变得更容易,但更高级的验证节点操作不在范围之内。同时,运行验证节点的经济学,包括吸引质押和申请补贴等主题,也不在本文范围之内。顺便提一下,那些有兴趣运行验证节点的人可以使用 Cogent Crypto 的验证节点利润计算器 来估算验证节点在特定假设场景下的收益。

本文假定读者对 Linux 的基本系统管理有一定了解。你不必是程序员或系统管理专家即可运行验证节点,但需要对在终端中运行命令、基本的 shell 脚本和配置文件工作感到舒适。

如果你对 Linux 系统管理不太了解但想了解更多,可以参考许多优秀的入门资料,例如 Linux Journey

术语:什么是 Solana 验证节点?

Solana CLI 工具套件包含 solana-validator 二进制文件,能够:

  • 连接到 Solana 集群 并同步当前集群状态
  • 生成、接收和共享快照及其他集群数据以保持最新
  • 投票验证新块以作为集群共识的一部分
  • 处理传入交易并生成新块
  • 暴露 RPC 和事件驱动 API 以允许查询集群数据和提交新交易

Solana 验证节点也可以称为客户端(因为它连接到验证节点网络并请求数据)、服务器(因为它处理来自其他验证节点的请求并提供数据),或者节点。

RPC 节点是一个未质押、非投票的 Solana 验证节点,用于跟踪网络的所有信息。这意味着它们仅响应数据请求,不参与共识。

“Solana 验证节点”一词也可以指 Solana 生态系统中的一个实体,它运行一个质押的、可投票的 Solana 验证节点并参与共识。

关于 RPC、RPC 提供者和验证节点之间区别的更多信息可以在 这里 查找。

开始:获取服务器硬件

你将需要一台专门用于运行验证节点的强大计算机,如果你希望同时在测试网和主网运行验证节点,还需要第二台计算机。目前,最低要求是 12 个核心/24 个线程、256GB RAM、2 个 1TB SSD 硬盘(理想情况下带有 RAID0),以及 10GB 的网络连接。有关硬件要求的详细信息可以在 这里 找到。

如果你想通过仅在主网运行来节省成本,请注意,你必须运行测试网验证节点以符合 Solana 基金会委托计划(SFDP)。

你可以自行购买和操作硬件,或从数据中心提供商租用硬件(我们推荐 TeraSwitch)。你也可以从云计算提供商处租用,但我们不推荐这样,因为这通常成本高昂且更容易出现性能问题。Solana 基金会服务器计划旨在使验证节点操作员更容易从数据中心运营商处租用硬件。 了解更多内容

为了帮助 去中心化 网络,你可能希望考虑在尚未拥有许多 Solana 节点或质押的 ASN 和城市。某些质押池和 SFDP 将根据 ASN 和城市的去中心化奖励你。

目前的顶级数据中心可以在 这里 找到。

在本地安装 Solana CLI

强烈建议本地安装工具,以便生成所有必要的密钥并将提款密钥保存在验证节点服务器之外。有关如何在本地设置 Solana CLI 的说明可以在 这里 找到。

一旦你在命令行中可以使用这些工具,请将它们的默认指向配置为测试网:

代码

$ solana config set --url https://api.testnet.solana.com

对于主网,你可以将其指向这里的默认端点:

代码

$ solana config set --url https://api.mainnet-beta.solana.com

公共主网端点通常会因请求过多而饱和。如果你对性能不满意,可以 注册 Helius 并像这样使用你的 Helius 端点:

代码

$ solana config set --url https://mainnet.helius-rpc.com/?api-key=<YOUR-HELIUS-API-KEY>

设置和引导验证节点将需要执行交易,因此你必须设置一个带有 SOL 的钱包。如果你刚刚开始设置测试网,可以通过以下命令创建一个默认钱包并给自己空投一些 SOL:

代码

$ mkdir -p ~/.config/solana
$ solana-keygen new --outfile ~/.config/solana/id.json
$ solana airdrop 1 ~/.config/solana/id.json

强烈建议为测试网和主网使用不同的钱包。由于密钥格式相同,两个网络可以使用相同的密钥,但要抵制这种诱惑。如果你在测试网和主网使用资金钱包的相同密钥,则很容易意外执行针对测试网的命令。

在这里阅读更多关于生成密钥的信息,以及一些更安全的密钥生成方法。

设置投票账户

你的验证节点投票账户使用 solana create-vote-account 命令和三个密钥对创建:

  1. 身份密钥对 - 验证节点使用此密钥对向网络确认其身份并提交诸如投票的交易。私钥需要保存在服务器上,因此最佳安全措施是确保其仅保留用于投票交易所需的 SOL(大约 1 SOL/天)。
  2. 投票账户密钥对 - 此密钥对指向投票账户本身,并用于查找投票账户以及对此进行委托质押。创建投票账户时,create-vote-account 命令只需要私钥以证明你拥有所需的密钥。在投票账户创建后,仅需公钥。这无法更改。
  3. 提款密钥对 - 此密钥对充当投票账户的主密钥,用于提取奖励、变更身份或提款密钥以及其他账户操作。这个密钥是三者中最敏感的,不应在服务器上生成或复制。对于主网,建议使用纸钱包、硬件钱包或多重签名来管理此密钥。

创建密钥对

按如下方式创建测试网的密钥对:

代码

$ solana-keygen new -o identity.json
$ solana-keygen new -o vote.json
$ solana-keygen new -o withdraw.json

可选:为提款密钥使用纸钱包

纸钱包是写在纸上的 12(或 24)个单词短语,每当需要签名某项事务时,都通过键盘输入。如果你不打算设置多重签名,使其附加的安全性对于主网提款密钥是合适的,因为它赋予对你投票账户的根访问权限。运行此命令:

代码

$ solana-keygen new --no-outfile

将出现的短语写在纸上。你可能还希望记下公钥、创建密钥时使用的确切命令和 solana-keygen --version。请注意,存在不同方案用于将短语转换为私钥。在将纸张收起来之前,验证一下能否使用它访问密钥:

代码

$ solana-keygen verify <PUBKEY> ASK
注意:

截至写作本文时,ASKprompt:// 占位符的密钥解码行为不同。请确保你知道哪个适用于你的密钥。

一定不要丢失写有密钥的纸张,因为没有其他方法可以恢复它。不要忘记清除终端缓冲区中的密钥短语。

可选:为投票账户提供个性化密钥

部分验证节点使用个性化公钥作为身份或投票账户密钥。例如,Helius 验证节点的身份密钥是 HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU,而我们的投票账户是 he1iusunGwqrNtafDtLdhsUQDFvo13z9sUa36PauBtk。可以使用 grind 子命令创建这些密钥,如下所示:

代码

$ solana-keygen grind --starts-with PREF1X:1

此子命令将生成一个公钥以 PREF1X 开头,你可以指定任何有效的 base58 字符串。这是通过生成密钥直到遇到一个符合标准的密钥,所以所需时间是基于所需前缀的长度呈指数级增长的。

投票账户密钥在广告后无法更改,特别是在有人开始将质押代理到此账户后,因此如果你想要个性化密钥,现在就是时机。

从密钥对创建投票账户

一旦密钥对准备就绪,创建投票账户本身,如下所示:

代码

$ solana create-vote-account --fee-payer ~/.config/solana/id.json vote_account.json identity.json withdrawal.json

这里,vote_account.json 是投票账户密钥对,identity.json 是验证节点身份密钥对,withdrawal.json 是提款权限密钥对,~/.config/solana/id.json 是一个内容充足的 SOL 钱包,用于支付投票账户创建费用。

如果你使用纸钱包作为提款密钥对,你的命令可以如下所示:

代码

$ solana create-vote-account --fee-payer ~/.config/solana/id.json vote_account.json identity.json ASK

你可以使用此命令检查投票账户(或任何投票账户):

代码

$ solana vote-account <PUBKEY>

此时,身份密钥对需要用于运行验证节点服务器,提款密钥对需要保密,仅用于投票账户的提款和更改,而投票账户密钥对将不再需要(只需记住公钥)。

有关投票账户的更多信息可以在 这里 找到。

可选:设置佣金

create-vote-account 将佣金作为可选参数,但默认情况下,它是 100%,意味着你的验证节点是私密的。如果想要吸引外部质押到主网验证节点上,你可能需要选择较低的佣金。

如果我们的投票账户公钥是 <VOTE_ACCT_PUBKEY>,我们希望从我们的 id.json 资金钱包中支付更改费用,同时我们有一个纸钱包提款密钥,并且希望将佣金设置为 8%,我们可以这样做:

代码

$ solana vote-update-commission --fee-payer ~/.config/solana/id.json <VOTE_ACCT_PUBKEY> 8 ASK

可选:添加多重签名

多重签名是一种特殊类型的钱包,需要一个或多个其他钱包的签名才能执行交易,并可用于在多人之间共享投票账户的管理。即使你自己管理验证节点,你可能仍然希望考虑使用多重签名,以便稍后轻松将其他人添加到投票账户。

Squads 是一个 Solana 多重签名工具,具有专门用于管理共享验证节点的功能。要在 Squads 中设置验证节点:

  1. 使用支持的 Solana 钱包插件配置你的浏览器,例如 Backpack
  2. 导航到 Squads dApp
  3. 配置一个与你希望为验证节点选择的人和参数的队伍
  4. 导航到开发者 > 验证节点,按照流程添加验证节点
  5. 系统会要求你粘贴提款私钥,这将用于将现有提款密钥改为队伍共享的提款密钥
  6. 使用 solana vote-account 验证更新后的提款公钥

有关如何使用 Squads 进行共享验证节点管理的更多信息,可以在 这里 找到。

将你的机器配置为验证节点服务器

你的步骤会根据机器的起始点有所不同,但目标是使其最终成为:

  • 安装并保持最新的 Ubuntu 最新 LTS 版本
    • 其他 Linux 发行版(即 Debian 系列)也许可以运行,但这里的所有示例均假定 Ubuntu;离 Ubuntu 越远,你将越需要修改命令
  • 配置用户级 SSH 访问
  • 设置 sol 服务用户
  • 系统调优和硬盘设置

系统与用户设置

确保你的系统是最新的,并创建 sol 服务用户:

代码

$ sudo apt update
$ sudo apt upgrade
$ sudo adduser sol

你可能还希望给予 sudo 访问权限(这在便利性与安全性之间进行权衡):

代码

$ sudo adduser sol sudo

系统调优

添加 Solana Labs 推荐的设置到 sysctlsystemd 中,以增加允许的文件描述符、内存映射文件等的限制。当你的验证节点成为当前或即将到来的块领导者时,整个网络将试图打开连接并发送交易,因此文件描述符限制尤其重要。

Solana Labs 推荐的最新系统调优设置可以在这里找到。

硬盘配置

Solana Labs 目前的建议是你应该有 2 个物理 1TB+ SSD,一个用于账户数据,一个用于账本数据(操作系统也可以在此磁盘上)。由于高 IOPS,不建议将账户和账本放在同一磁盘上。

这是关于如何设置 2 个磁盘的指南

利用多个磁盘增加可用 IOPS 的另一种方法是将它们共同配置为一个 RAID0 卷,并让 RAID 控制器优化哪些条带存储在哪个驱动器上,以最大化这两个驱动器的 IOPS 能力。如果需要,也可以将其他驱动器添加到 RAID 中以进一步提高 IOPS。我们尚未在这种配置下运行验证节点时出现任何性能问题。

如果你使用单个 RAID0 卷,则只需在你的卷上设置验证节点数据目录,这可以直接在 sol 用户主目录下完成:

代码

$ sudo su sol
$ mkdir -p /home/sol/accounts
$ mkdir -p /home/sol/ledger
$ mkdir -p /home/sol/snapshots
$ mkdir -p /home/sol/logs

在验证节点服务器上安装 Solana CLI

重复 上述步骤 在验证节点服务器上安装 Solana CLI,只是这次以 sol 用户身份安装。建议在验证节点服务器上从源代码构建。

如果你使用 Solana 安装工具,可以使用 solana-install 命令对新版本执行未来更新(你必须这样做以继续参与集群)。

可选:安装 Jito 验证节点客户端

Jito Labs 已经 fork 了 Solana 验证节点并发布了自己的版本,增加了最大可提取价值(MEV)功能。MEV 是将或重新排序你创建的区块中的交易以获利的理念。Jito 创建了一个市场,供那些希望支付额外费用以做到这一点的人(“搜索者”)。如果你运行 Jito 验证节点,他们将向你的验证节点发送 MEV 交易捆绑,以便在其创作的区块中包含,为此需支付额外小费。

Jito 验证节点为你的验证节点操作增加了一些复杂性和延迟,但同时为 MEV 小费增加了额外的收入来源。其配置大体相同,但你还需要另外了解:

  • 收集和管理 MEV 小费
  • 来自 Jito 区块引擎的延迟
  • 可能需要运行 Jito 中继器

有关安装 Jito 验证节点客户端的说明可以在 这里 找到。

创建验证节点运行脚本

创建 validator.sh Shell 脚本

首先,将你的验证节点身份密钥对复制到远程服务器:

代码

$ scp identity.json remoteuser@your.validator.host:/home/sol

管理验证节点配置的标准方法是将其封装在 shell 脚本中。创建一个起始脚本并使其可执行:

代码

$ sudo su sol
$ cat >/home/sol/validator.sh <<EOF
#!/bin/bash
PATH=/home/sol/.local/share/solana/install/active_release/bin:$PATH
exec solana-validator \
    --identity /home/sol/identity.json \
    --vote-account <VOTE_ACCOUNT_PUBKEY> \
    --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \
    --known-validator 7XSY3MrYnK8vq693Rju17bbPkCN3Z7KvvfvJx4kdrsSY \
    --known-validator Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN \
    --known-validator 9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv \
    --only-known-rpc \
    --log /home/sol/logs/solana-validator.log \
    --accounts /home/sol/accounts \
    --snapshots /home/sol/snapshots \
    --ledger /home/sol/ledger \
    --rpc-port 8899 \
    --dynamic-port-range 8000-8020 \
    --entrypoint entrypoint.testnet.solana.com:8001 \
    --entrypoint entrypoint2.testnet.solana.com:8001 \
    --entrypoint entrypoint3.testnet.solana.com:8001 \
    --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \
    --wal-recovery-mode skip_any_corrupted_record \
    --limit-ledger-size
EOF
$ chmod +x /home/sol/validator.sh

这些设置适合于快速和安全地在测试网上启动。一旦一切设置妥当,你需要返回此脚本并运行 solana-validator --help 以查看完整的配置选项列表并进行自定义。

尝试使用脚本启动验证节点:

代码

$ ./validator.sh

第一次启动时,它将需要赶上集群的当前状态。

验证验证节点是否正常运行

你可以通过以下命令从集群中的任何地方跟踪自己的(或任何人的)可见进度:

代码

$ solana catchup <IDENTITY_PUBKEY>

你还可以通过以下命令从 sol 用户的会话中查看其内部进展:

代码

$ solana-validator --ledger /home/sol/ledger monitor

有关检查你的验证节点是否已成功连接到集群的更多信息可以在 这里 找到。

将验证节点设置为 守护进程

创建 systemd 单元 文件将其管理为守护进程:

代码

$ sudo cat >/etc/systemd/system/sol.service <<EOF
[Unit]
Description=Solana Validator
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=sol
LimitNOFILE=1000000
LogRateLimitIntervalSec=0
ExecStart=/home/sol/validator.sh

[Install]
WantedBy=multi-user.target
EOF

确保你之前的 ./validator.sh 调用不再运行,然后以守护进程身份启动验证节点:

代码

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now sol

设置监控与安全

禁用基于密码的身份验证

/etc/ssh/sshd_config 文件中,SSH 守护进程可以被设置为不接受密码或挑战响应登录方法:

代码

...
PasswordAuthentication no
ChallengeResponseAuthentication no
...

不要忘记用新配置重载 sshd 守护进程:

代码

$ sudo systemctl reload sshd

添加 fail2banufw

fail2ban 开箱即用,可以禁止多次认证失败的连接:

代码

$ sudo apt install fail2ban

ufw 是随系统提供的防火墙,可以通过几个命令进行设置(假设你的最终验证节点配置使用默认端口和端口范围,并在 22 端口上托管 SSH):

代码

$ sudo ufw allow 22/tcp
$ sudo ufw allow 8000:10000/tcp
$ sudo ufw allow 8000:10000/udp
$ sudo ufw enable

验证节点身份密钥对

在实际操作中,大多数验证节点将其身份密钥保存在验证节点服务器上,以便验证节点脚本可以在没有人工干预的情况下运行和重新启动。然而,使用 ASKprompt:// 传递身份密钥给验证节点也是可能的,因此它不需要保存在验证节点服务器的文件系统中。这样会增加你的运营开销和风险,因为现在需要人为干预 systemd 并手动管理守护进程,但这是可能的。

保护你身份密钥对的最佳策略是仅为其提供满足几天投票成本的最低 SOL 金额。

Shinobi Systems 发布了一些工具来帮助管理投票账户,包括实现自动平衡转移,而无需每次使用提款密钥。

查看 Solana Labs 页面获取更多验证节点安全提示

使用 Watchtower 设置监控

solana-watchtower 包含于 Solana CLI 工具包中,可用于监视你的验证节点及其更广泛集群的问题并进行报警。其配置和运行可以类似于验证节点,通过创建一个 watchtower.sh 脚本完成。

以下是一个示例,使用 PagerDuty 进行警报,并将其日志写入 watchtower.log

代码

$ cat >watchtower.sh <<EOF
#!/bin/bash
PATH=/home/solana/.local/share/solana/install/active_release/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

exec >>watchtower.log \\
  env PAGERDUTY_INTEGRATION_KEY=<PAGERDUTY_KEY> \\
solana-watchtower \\
  --validator-identity <IDENTITY_PUBKEY> \\
  --monitor-active-stake \\
  --interval 20 \\
  --minimum-validator-identity-balance 3 \\
  --url https://api.testnet.solana.com
EOF

Solana Labs 还有一个使用 Telegram 进行报警的 示例

不建议在与验证节点相同的机器上设置 watchtower,因为如果整个机器宕机你将无法收到通知,但如果你另外有多个监控形式并可以分别监控这些情况,可能没有问题。

与验证节点不同,watchtower 的资源占用不高,可以在 AWS 或 GCP 等云或无服务器计算环境中运行。

可选:基于社区的监控

Solana 社区内有许多人也在监控集群,并愿意提供基于 watchtower 相似条件的警报。

Stakewiz 提供基于 Telegram 的 Solana 验证节点监控。例如,如果你希望根据 Helius 验证节点提供警报,你可以 导航到其页面,然后点击“+ 创建警报”。

请注意,基于社区的监控旨在让人们了解与其质押的验证节点的问题,作为验证节点操作员,你不应仅依赖他人来监控你的服务。

可选:通过 getHealth RPC 方法进行自定义监控

如果你想直接检查验证节点的健康状态,验证节点的 JSON RPC 接口有一个名为 getHealth 的方法,可以轮询你的验证节点是否健康及相关问题的信息。

可选:第三方监控解决方案

一旦你的验证节点扩展且你有收入来源需要保护,你可能希望考虑商用级 SaaS 监控解决方案,例如 DatadogSplunk。这些类型的解决方案通常通过在你的服务器上运行一个守护进程来允许本地监控日志和指标,并将这些数据导出到提供者,或者通过 NS 端点远程轮询你的验证节点的 getHealth 的方法。

向验证节点添加质押

Solana 网络通过 权益证明(PoS) 投票过程达成共识,这意味着验证节点的投票权重与委托给它的 SOL 质押量成正比,类似于股票公司将质押的 SOL 视为股份。除了投票外,你验证节点作为区块领导者的频率也与质押给它的 SOL 数量成正比。

有许多钱包、去中心化应用程序和其他工具可以轻松将你的 SOL 质押给现有的验证节点,但以下是通过 CLI 手动执行的步骤:

  1. 使用 solana-keygen new 创建 3 个密钥对
  2. 使用 solana create-stake-account 从密钥对中创建一个质押账户
  3. 将一些 SOL 转入质押账户(可以通过 solana airdrop 在测试网中执行)
  4. 使用 solana delegate-stake 将存入的质押委托给一个验证节点
  5. 等待下一个时代以激活质押,并使用 solana stake-account 检查状态

创建密钥对和质押账户

创建密钥对和质押账户的过程与创建投票账户的过程类似,其中 3 个密钥对如下:

  1. 质押权限密钥对 - 允许对质押账户进行操作,例如委托、撤销委托、拆分、合并
  2. 质押账户密钥对 - 识别质押账户本身的公钥(创建质押账户后不需要私钥)
  3. 提款密钥对 - 用于提取质押和重置质押账户上权限密钥对的主密钥对。处理时要小心,并考虑使用硬件钱包、纸钱包或多重签名

建议为测试网和主网使用不同的密钥,原因与投票账户相同。然而,你可以对同一集群的多个质押账户重用单个质押权限和提款权限密钥对。对于质押账户的合并,需要使用相同的密钥。

以下是一个使用文件型钱包创建一个 1 SOL 的质押账户的示例,在测试网上使用 id.json 钱包为其提供资金,并将该质押委托给你的新验证节点:

代码

$ solana-keygen new -o stake_auth.json
$ solana-keygen new -o stake_acct_1.json
$ solana-keygen new -o stake_withdrawal_auth.json
$ solana airdrop 1 ~/.config/solana/id.json
$ solana create-stake-account --from ~/.config/solana/id.json stake_acct_1.json 1 --stake-authority stake_auth.json --withdraw-authority stake_withdraw_auth.json --fee-payer ~/.config/solana/id.json
$ solana delegate-stake --stake-authority stake_auth.json <STAKE_ACCT_1_PUBKEY> <VOTE_ACCT_PUBKEY> --fee-payer ~/.config/solana/id.json
注意:

<VOTE_ACCT_PUBKEY> 是指投票账户的地址,而不是验证节点身份!

现在你可以检查状态,以查看质押的激活情况及其将在哪个时代激活:

代码

$ solana stake-account <STAKE_ACCT_1_PUBKEY>

一旦下一个时代开始并且质押激活,你验证节点的投票将开始计算,你可以通过 solana vote-account 命令查看最近的投票。如果你像示例一样只添加了少量 SOL,请不要指望你的验证节点会成为区块领导者。

投票成本约为每天 1-2 SOL,因此截至本文写作,你的验证节点仅投票在主网上的费用约为 200-300 美元/天。

(有关 质押委托管理质押账户 的更多信息)。

发布验证节点信息

如果你浏览常见的 Solana 验证节点目录,如 validators.app,你会注意到所有验证节点都有名称、描述、徽标和其他元数据。这些数据会被在链上发布供每个集群的所有注册验证节点使用,并可以通过运行 solana validator-info get 查看。

一旦你的验证节点启动并运行,你可能希望发布你的信息,特别是在你在主网上运行并且试图吸引质押时。

以下是如何发布你元数据的基本示例:

代码

$ solana validator-info publish "My Awesome Validator" \
--website "https://awesome-validator.xyz/" \
--icon-url "https://awesome-validator.xyz/icon360x360.png" \
--keypair validator_identity.json \
--details "The best validator in the world!"

当元数据记录创建完成后,将会有自己的密钥,可以在以后使用 --info-pubkey 参数更新。请注意,图标网址最大长度为 80 个字符。有关发布验证节点信息和元数据的更多信息可以在 这里 找到。

结论

恭喜你!如果你跟着步骤走到这一点,你应该已经成功启动了自己的 Solana 验证节点。欢迎加入 Solana 验证节点社区!

附加资源

  • 原文链接: helius.dev/blog/how-to-s...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/