本文介绍了如何使用 Solana CLI 从主网克隆账户和程序,并将其部署到本地网络(Localnet),包括克隆 Metaplex 元数据程序和 NFT 铸币账户的步骤。
如果你在 Localnet 上进行构建,你可能会注意到一些你喜欢的程序不可用(例如,也许你无法在 localnet 上铸造 NFT)。这是因为 Localnet 是一个私有网络,没有访问 Mainnet 上相同的程序。Solana CLI 的一项强大功能是能够将程序和账户从 Mainnet 导出。这在构建可组合程序和在本地主机进行测试时非常有用。
本指南将教你如何使用 Solana CLI 从 Mainnet 克隆账户和程序,并将其部署到 Localnet。
在本指南中,你将:
请确保在继续之前已安装所需的依赖项:
依赖项 | 版本 |
---|---|
solana-cli | 1.15.2 |
你需要一个本地目录来存储你的克隆账户和程序。创建一个新目录,并在终端中导航到该目录。
mkdir solana-clones
cd solana-clones
让我们开始吧!
要在 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 中转储。就是这样。将程序字节码从 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 上复制功能的。
让我们开始我们的本地验证者。为此,我们需要使用 --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。
前往 Solana Explorer 确保你在正确的集群上(localnet)。在搜索栏中输入你的铸造地址(对我来说是 7FTdQdMqkk5Xc2oFsYR88BuJt2yyCPReTpqr3viH6b6C
)。你应该在 localnet 上看到你的 NFT!
如果你正在使用 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!