在这个教程中,我们将学习如何编写 Rust 智能合约并使用 Metaplex 在 Solana 上铸造 NFT。
用熟悉的语言学习 Web3.0 开发 : JAVA | php | Python/ target=_blank class=infotextkey>Python | .NET / C# | Golang | Node.JS | Flutter / Dart
在 Solana 开发中,我们回面临许多奇怪的自定义错误和错误,并且由于 Solana 开发生态系统没有 Eth 开发生态系统那么大,因此修复它们 可能非常困难和令人沮丧。但不用担心。当遇到困难时,只需在正确的地方寻找解决方案。
在我的开发过程中,我不断地在Anchor discord 服务器、Metaplex和Superteam服务器上提出疑问,并查看 Github 上的其他代码仓库和 Metaplex 程序库本身。
在这个教程中,我们将使用的工具包括:
在命令行使用以下命令将你的网络设置为 devnet:
|
|
要确认它是否有效,请在执行上述命令后检查输出:
|
|
接下来,请参考Solana wallet docs设置 文件系统钱包,并使用命令solana airdrop 1添加一些devnet的 sol通证。
最后,使用另一个anchor CLI终端 通过以下命令创建一个anchor项目:
|
|
确保Anchor.toml也设置为 devnet。
|
|
在项目中,必须有一个名为程序的文件夹。转到programs/<your-project-name>/Cargo.toml并添加这些依赖项。确保使用版本0.24.2, 可以使用avm来更改它:
|
|
由于安全漏洞,Anchor 已删除 0.24.2 之前的所有版本,因此请确保使用该版本
然后转到src 中的lib.rs文件并导入这些:
|
|
现在我们可以编写 mint 函数了!
首先,让我们mint为函数创建账户结构:
|
|
不要担心未检查的帐户,因为我们会将其传递给 Metaplex 程序,它会为我们检查。
为了在 Anchor 中使用 Unchecked 帐户,我们需要在每个帐户上方添加此注释:
|
|
让我们创建一个函数,使用刚刚创建的结构来铸造通证:
|
|
如果想调试你的程序,最好使用msg!()记录想要检查的任何值。它接受字符串,因此必须使用std::string::ToString来转换。 你的日志将出现在终端或.anchor/program-logs/<program-id>
有几点需要说明一下。
creator数组需要包含铸造 NFT 的人,但你可以将份额设置为 0,所以这并不重要。这是代码:
|
|
我还没有实现集合,因为它不在本指南的范围内,但你可以使用以下方法来实现:
|
|
为什么我在这里将 Max supply 设置为 0?在 Metaplex 中,如果是一种通证,那么你必须将其最大供应量设置为零,因为总供应量 - 声称的供应量 (1-1) 等于 0。
|
|
编写函数后,运行anchor build && anchor deploy,应该会看到已部署的程序 ID
将此程序 ID 粘贴到Anchor.toml和lib.rs文件中,替换全部的默认ID即
Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS。
在做任何事情之前,请确保已导入@solana/web3.js和@solana/spl-token。 在tests/<test-file>.ts里面添加这些导入和常量:
|
|
现在让我们制作通证和关联的通证账户,如下面代码所示:
|
|
注意:mint 和 freeze 权限必须相同,否则不起作用。
createInitializeMintInstruction( mintKey.publicKey, 0,
program.provider.wallet.publicKey,// mint auth
program.provider.wallet.publicKey // freeze auth
),
现在,调用 mint 函数并传递数据和帐户:
|
|
好了!现在只需运行anchor test,就应该能够铸造你的 NFT:
|
|
如果提示任何带有 0x1 等十六进制值的自定义程序错误,请将十六进制值转换为纯文本,然后前往metaplex github 并使用你的浏览器搜索“error(”
可以在这里查看 NFT:solscan
我希望本指南对所有 Solana 极客有用。当我第一次尝试铸造 NFT 时感到非常困难,希望这篇文章对你有所帮助。 可以从这里下载教程里的代码。
原文链接:
http://blog.hubwiz.com/2022/08/03/mint-nft-on-solana/