solana - Solana 中 Token、Account 和 Associated account 的概念区别

标签 solana solana-web3js anchor-solana solana-program-library

我来自以太坊环境,Solana 概念有点令人困惑。我找到了各种指导代码步骤的教程,但并没有真正解释逻辑背后的概念。

我知道在 Solana 中我们有程序,它们不包含数据,只是逻辑 - 网络中的可执行实体。然后我们有帐户,它实际上包含数据。

我已经通读了 Solana 文档和程序库(例如 Token Program ),但我仍然有一些理解上的空白。

我必须建立一个自动化的 NFT 类型转换管道,但我在代币、账户和关联账户的概念之间有点迷茫。

现在,如果我遵循 token 程序教程(上面链接),它将指导我完成:

  1. 创建铸币厂
  2. 创建(或获取)关联帐户
  3. 为该帐户类型转换一个 token

所以,我想知道

  • 创建铸币厂并在 Solscan 中搜索它后,它会打开一个帐户实体。那么,铸币厂其实并不是代币,而只是一个持有数据的账户? (例如 here )。另一方面,我实际上可以在 Solscan 中找到 Token 实体。有什么区别?
  • 此 token (或帐户)没有任何元数据……几乎没有。它就像一个数据占位符。它是已经实际类型转换的代币还是半成品?如果是后者,我是否必须在之后附加元数据?
  • 关联帐户的用途是什么?
  • SPL 库有一个 mintTo 函数,在上述 Solana 文档的链接教程中使用了该函数。那是将代币转移到另一个钱包的 Action 吗?该示例实际上将其转移(铸币)到关联帐户。这里的逻辑是什么?
  • 如果我使用公共(public) Metaplex 程序来类型转换代币,并且我部署了自己的锚定程序——这个程序是否用于将元数据添加到类型转换的代币中?什么概念,没看懂。
  • 当我准备好 NFT(类型转换 + 元数据)并且我想将其转移到其他人的钱包时 - 我真的必须为该钱包创建一个关联账户,然后将代币转移到该账户吗?基本概念是什么?

最佳答案

这里有很多问题要解决,所以让我们一点一点地解决。

最重要的一点是术语“帐户”的重载,这意味着许多不同的东西。 Solana 中的帐户就像普通操作系统中的文件,它可以包含程序定义的任何数据。 token 程序定义:

  • 类型转换账户,处理新代币的创建
  • 持有账户(有时也称为代币账户),实际上持有一定数量的代币,并由某人拥有

关键是这些都是帐户。所以要回答你的问题:

once I create the mint, and search for it in Solscan, it opens an Account entity. So, the mint is actually not a token, but just an Account that holds data? (eg. here). On the other hand I can actually find Token entities in Solscan. What's the difference?

在此示例中,JAf858mSrDuQuHQCVqfA3KN8PNaVxZokMVNAJiC3zMpr 是类型转换地址(或代币类型),4FLiMhW2Weagy8LjtMCVkFQkLrB3zmF2VUcJDq2NQcJN 是用户持有该代币类型的代币地址。 Solscan 将其称为“ token 帐户”。

this token (or account) doesn't have any metadata... literally nothing. It's like a data placeholder. Is it an actually minted token already or something half baked? If the latter, then do I have to attach the metadata afterwards?

正确,位于 4FLiMhW2Weagy8LjtMCVkFQkLrB3zmF2VUcJDq2NQcJN 的帐户没有元数据,铸币厂 JAf858mSrDuQuHQCVqfA3KN8PNaVxZokMVNAJiC3zMpr 也没有。元数据附加在一个单独的帐户中,就像在 Metaplex token 元数据标准中一样。在该模型中,如果您拥有铸币权,则可以将其附加到铸币厂。

what is the Associated Account for?

关联代币账户是一个标准,它定义了一个“规范”账户,用于为给定钱包持有特定类型的代币,以便更容易找到为用户发送特定类型代币的位置。这样,只需使用您的 E5GvXygLz1AbCFqtcp14feEo8hy6YAv8wr74Xnpo1qBH 钱包地址,我就可以通过派生相关的 token 帐户知道将任何类型/铸币的 token 发送到哪里。 4FLiMhW2Weagy8LjtMCVkFQkLrB3zmF2VUcJDq2NQcJN 是 token 类型转换JAf858mSrDuQuHQCVqfA3KN8PNaVxZokMVNAJiC3zMpr 的派生地址。

the SPL library has a mintTo function that is used in the above linked tutorial from the Solana docs. Is that the action of transferring a token to another wallet? The example actually transfers (mints) it to an Associated Account. What's the logic here?

mintTo 创建全新的代币,并将它们放在一个持有账户中,根本不进行任何转移。

if I use the public Metaplex Program to mint the tokens, and I deploy my own Anchor Program - is this program for adding the metadata to the minted tokens? What's the concept here, I don't get it.

您不需要用于元数据的新程序——Metaplex token 元数据程序会为您完成。与其他任何程序一样,它是一个无状态程序,它定义了如何将数据写入帐户的逻辑。在这种情况下,该数据是代币类型转换的元数据。

When I've got an NFT ready (minted + metadata) and I want to transfer it to someone else's wallet - do I actually have to create an Associated Account for that wallet and then transfer the token to that Account? What's the underlying concept?

这是最佳实践。您从一个关联 token 帐户转移到另一个关联 token 帐户,如果目标用户的关联 token 帐户尚不存在,您可以使用关联 token 帐户程序创建它。它将在该地址创建一个新的 token 帐户,例如4FLiMhW2Weagy8LjtMCVkFQkLrB3zmF2VUcJDq2NQcJN,并将其分配给正确的所有者,例如E5GvXygLz1AbCFqtcp14feEo8hy6YAv8wr74Xnpo1qBH

您可以在 https://github.com/solana-labs/solana-program-library/blob/7caf27cca6a9f58055f93517774318eb2b2f97bf/token/program/src/processor.rs#L516 找到所有用于铸币的代币程序逻辑。并在 https://github.com/solana-labs/solana-program-library/blob/7caf27cca6a9f58055f93517774318eb2b2f97bf/token/program/src/processor.rs#L222 转账以及 https://github.com/solana-labs/solana-program-library/blob/7caf27cca6a9f58055f93517774318eb2b2f97bf/associated-token-account/program/src/processor.rs#L66 的相关 token 帐户程序

关于solana - Solana 中 Token、Account 和 Associated account 的概念区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72773942/

相关文章:

Solana key 生成公钥不匹配

typescript - 获取与 Solana 钱包地址关联的 Assets 列表

javascript - 什么是用于创建程序可用于执行契约(Contract)付款的转账账户的 Solana 模式?

javascript - 我想在 solana 上类型转换一个新的代币。如何使用 solana-web3.js 做到这一点?

solana - 如何在 Solana 中查看合约代码?

javascript - 如何查明交易是否在 Solana 上完成

solana - anchor : Error when trying to initialize a program derived account (PDA)