【问题标题】:Conceptual difference between Token, Account and Associated account in SolanaSolana 中 Token、Account 和 Associated 账户的概念区别
【发布时间】:2022-06-29 08:13:54
【问题描述】:

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

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

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

我必须建立一个自动化的 NFT 铸造管道,我有点迷失在令牌、帐户和关联帐户的概念之间。

现在,如果我按照令牌程序教程(上面链接),它将引导我完成:

  1. 创建薄荷
  2. 创建(或获取)关联帐户
  3. 为该帐户铸造令牌

所以,我想知道

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

【问题讨论】:

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


    【解决方案1】:

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

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

    • mint 帐户,用于处理新令牌的创建
    • 持有账户(有时也称为代币账户),实际持有一定数量的代币,并由某人拥有

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

    一旦我创建了铸币厂,并在 Solscan 中搜索它,它就会打开一个 Account 实体。那么,铸币厂其实并不是一个代币,而只是一个持有数据的账户? (例如这里)。另一方面,我实际上可以在 Solscan 中找到 Token 实体。有什么区别?

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

    这个令牌(或帐户)没有任何元数据......实际上什么都没有。它就像一个数据占位符。它是已经实际铸造的代币还是半生不熟的东西?如果是后者,那么我必须在之后附加元数据吗?

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

    关联帐户的用途是什么?

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

    SPL 库有一个 mintTo 函数,该函数在 Solana 文档的上述链接教程中使用。这是将代币转移到另一个钱包的行为吗?该示例实际上将其转移(铸造)到关联帐户。这里的逻辑是什么?

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

    如果我使用公共 Metaplex 程序来铸造代币,并部署我自己的锚程序 - 这个程序是否用于将元数据添加到铸造的代币中?这是什么概念,我不明白。

    您不需要新的元数据程序——Metaplex Token Metadata 程序可以为您做到这一点。它是一个无状态程序,就像任何其他程序一样,它定义了如何将数据写入帐户的逻辑。在这种情况下,该数据是代币铸币厂的元数据。

    当我准备好 NFT(铸造 + 元数据)并且我想将其转移到其他人的钱包时 - 我真的必须为该钱包创建一个关联帐户,然后将令牌转移到该帐户吗?基本概念是什么?

    这是最佳做法。您从一个关联令牌帐户转移到另一个,如果目标用户的关联令牌帐户尚不存在,您可以使用关联令牌帐户程序创建它。它将在该地址创建一个新的令牌帐户,例如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 上找到相关代币账户程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多