如何从主网分叉并部署 Solana 账户和程序到本地环境

  • QuickNode
  • 发布于 2024-03-15 11:50
  • 阅读 14

本文介绍了如何使用 Solana CLI 从主网克隆账户和程序,并将其部署到本地网络(Localnet),包括克隆 Metaplex 元数据程序和 NFT 铸币账户的步骤。

概述

如果你在 Localnet 上进行构建,你可能会注意到一些你喜欢的程序不可用(例如,也许你无法在 localnet 上铸造 NFT)。这是因为 Localnet 是一个私有网络,没有访问 Mainnet 上相同的程序。Solana CLI 的一项强大功能是能够将程序和账户从 Mainnet 导出。这在构建可组合程序和在本地主机进行测试时非常有用。

本指南将教你如何使用 Solana CLI 从 Mainnet 克隆账户和程序,并将其部署到 Localnet。

你将要做的事情

在本指南中,你将:

  • 克隆 Metaplex Metadata 程序
  • 克隆在 Mainnet 上铸造的 NFT
  • 使用克隆的 NFT 和 Metaplex Metadata 程序启动本地验证者

你需要的东西

请确保在继续之前已安装所需的依赖项:

  • Solana CLI 最新版本已安装
  • 一个现代的网页浏览器(例如,Chrome、Firefox、Brave)
依赖项 版本
solana-cli 1.15.2

设置你的项目

你需要一个本地目录来存储你的克隆账户和程序。创建一个新目录,并在终端中导航到该目录。

mkdir solana-clones
cd solana-clones

让我们开始吧!

克隆 Metaplex Token Metadata 程序

要在 Solana 上与 NFTs 进行交互,你需要 Metaplex Token Metadata 程序。这不是 Solana 原生的程序,因此如果我们想在 our localnet上使用它,我们需要从 Mainnet 克隆它。我们可以使用 Solana CLI 中的 dump 命令来完成。dump 命令将程序账户的可执行字节代码导出到文件中,我们可以将其部署到我们的 Localnet。为此,我们需要程序 ID。对于 Metaplex Token Metadata,程序 ID 为 metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s

在你的终端中输入以下命令以将程序导出到文件:

solana program dump -u m metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s metadata.so
  • -u 标志指定从中转储程序的集群。在这种情况下,我们从 Mainnet Beta 中转储。
  • 第一个参数是程序 ID。
  • 第二个参数是要导出程序的文件名。

就是这样。将程序字节码从 Mainnet 下载就是这么简单。现在,让我们获取一个 NFT 进行测试。

克隆在 Mainnet 上铸造的 NFT

dump 命令类似,我们可以使用 account 命令从 Mainnet 克隆一个账户。account 命令从网络获取账户的内容。该命令包括一个 --output-file 标志,允许我们将账户写入文件。让我们尝试使用我在 Mainnet 上铸造的 NFT(我将使用我的一个 NFT:7FTdQdMqkk5Xc2oFsYR88BuJt2yyCPReTpqr3viH6b6C)。

solana account -u m 7FTdQdMqkk5Xc2oFsYR88BuJt2yyCPReTpqr3viH6b6C --output-file nft.json --output json-compact

与前一步相似,我们通过 -u m(Mainnet Beta)定义我们的获取集群,并将账户 ID 指定为第一个参数。此外,我们使用 --output-file--output 标志将账户写入 Solana CLI 在启动验证者时可以使用的文件。

为了将我们的 NFT 获取到 Localnet,我们还需要一个账户:元数据账户。 不过,要获取 NFT 的元数据,我们还需要元数据账户。我的元数据 PDA 是 4tSgNWeqtgp2kwRgjTqgpenP4wxfPaVCvganMR2gnd8W,所以我将使用它。

如果你不知道你的 Metadata PDA 并想学习如何获取它,请点击这里。

Metaplex Metadata Account 是一个程序派生账户(PDA),由“metadata”这个词、程序 ID 和代币铸造地址生成。你可以使用 PublicKey.findProgramAddressSync 方法在 JavaScript 中派生它:

import { PublicKey } from "@solana/web3.js";

let NFT_MINT = new PublicKey("7FTdQdMqkk5Xc2oFsYR88BuJt2yyCPReTpqr3viH6b6C"); // 👈 替换为你的 NFT 铸造地址
let METADATA_PROGRAM = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');

const getMetadataAddress = async (mint) => {
    return PublicKey.findProgramAddressSync(
        [Buffer.from("metadata"), METADATA_PROGRAM.toBuffer(), mint.toBuffer()],
        METADATA_PROGRAM
    )
}

getMetadataAddress(NFT_MINT).then(([metadata, bump]) => {
    console.log(metadata.toBase58());
}).catch(console.error);

要了解有关 Solana NFT 元数据的更多信息,请查看我们的 Solana NFT Metadata Deep Dive

solana account -u m 4tSgNWeqtgp2kwRgjTqgpenP4wxfPaVCvganMR2gnd8W --output-file metadata.json --output json-compact

这两个账户将足以在链上看到我们的 NFT,这对于本次演示是足够的,但如果你想在 localnet 上与 NFT 进行更多的交互,你可能需要克隆其他账户(例如,所有者账户、所有者的关联代币账户等)。这对于你希望从 Mainnet 克隆的任何程序都是适用的——你需要了解该程序是如何工作的、需要哪些账户,以及它们是如何用于在 Localnet 上复制功能的。

使用克隆的账户和程序初始化本地 Solana 验证者

让我们开始我们的本地验证者。为此,我们需要使用 --bpf-program--account 标志来进行克隆的账户和程序。--bpf-program 标志指定要部署到 localnet 的程序,而 --account 标志指定要部署到 localnet 的账户。

solana-test-validator -r --bpf-program metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s metadata.so --account 7FTdQdMqkk5Xc2oFsYR88BuJt2yyCPReTpqr3viH6b6C nft.json --account 4tSgNWeqtgp2kwRgjTqgpenP4wxfPaVCvganMR2gnd8W metadata.json

我们需要使用 -r 标签重置本地验证者。如果验证者不被重置,-bpf-program--account 标志将被忽略。

你应该会在终端中看到验证者正在初始化:

Ledger location: test-ledger
Log: test-ledger/validator.log
⠄ Initializing...                                                                                              Waiting for fees to stabilize 1...
Identity: ...
Genesis Hash: ...

干得好!现在让我们在链上找到我们的 NFT。

在 Localnet 上查找你的 NFT

前往 Solana Explorer 确保你在正确的集群上(localnet)。在搜索栏中输入你的铸造地址(对我来说是 7FTdQdMqkk5Xc2oFsYR88BuJt2yyCPReTpqr3viH6b6C)。你应该在 localnet 上看到你的 NFT!

Localnet上的NFT

Anchor 测试配置

如果你正在使用 Anchor 构建项目,可以在运行 anchor test 时使用克隆的账户和程序。只需通过向 Anchor.toml 文件添加以下内容,将你的 Anchor.toml 指向克隆的程序和账户(确保更新文件路径和名称以匹配你的克隆账户和程序):

[[test.genesis]]
address = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"
program = "genesis/accounts/metadata.so"

[[test.validator.account]]
address = "7FTdQdMqkk5Xc2oFsYR88BuJt2yyCPReTpqr3viH6b6C"
filename = "genesis/accounts/nft.json"

有关如何为 Anchor 测试配置本地测试验证者的更多信息,请查看以下资源:

总结

就是这样!你已经成功克隆了一个程序和一个账户从 Mainnet 并将其部署到 Localnet。这在构建可组合程序(或在现有程序上构建)时变得非常有用。

我们希望了解更多你正在构建的内容。请在 Discord 中与我们联系,或关注我们在 Twitter 上,以随时了解最新信息!

我们 ❤️ 反馈!

如果你对本指南有任何反馈,请 告诉我们。我们很乐意听取你的意见。

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

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。