我来自以太坊环境,Solana的概念有点令人困惑。我找到了各种指导代码步骤的教程,但没有真正解释逻辑背后的概念。
我知道在 Solana 中,我们有程序,它们不包含任何数据,只是逻辑 - 网络中的可执行实体。然后我们有帐户,它实际上包含数据。
我已经阅读了 Solana 文档和程序库(例如令牌程序),但我仍然有一些空白的理解点。
我必须建立一个自动化的 NFT 铸造管道,我在代币、账户和相关账户的概念之间有点迷失。
现在,如果我按照令牌程序教程(上面链接),它将指导我完成:
- 创建薄荷糖
- 创建(或获取)关联帐户
- 向该帐户铸造代币
所以,我想知道
- 一旦我创建了铸币厂,并在 Solscan 中搜索它,它就会打开一个帐户实体。那么,铸币厂实际上不是一个代币,而只是一个保存数据的账户?(例如这里)。另一方面,我实际上可以在 Solscan 中找到令牌实体。有什么区别?
- 此令牌(或帐户)没有任何元数据...字面上什么都没有。它就像一个数据占位符。它实际上已经是铸造的代币还是半生不熟的东西?如果是后者,那么我之后是否必须附加元数据?
- 关联账户有什么用?
- SPL 库有一个
mintTo
函数,该函数在 Solana 文档中的上述链接教程中使用。这是将代币转移到另一个钱包的操作吗?该示例实际上将其转移(铸造)到关联帐户。这是什么逻辑? - 如果我使用公共 Metaplex 程序来铸造代币,并且我部署了自己的锚程序 - 这个程序是用于将元数据添加到铸造的代币中吗?这里是什么概念,我不明白。
- 当我准备好 NFT (铸造 + 元数据)并且我想将其转移到其他人的钱包时 - 我是否真的必须为该钱包创建一个关联帐户,然后将代币转移到该帐户?基本概念是什么?
这里有很多问题要介绍,所以让我们一点一点地介绍一下。
最重要的一点是术语"帐户"的重载,这意味着许多不同的事情。 Solana 中的帐户就像普通操作系统中的文件,它可以包含程序定义的任何数据。 令牌程序定义:
- 铸币账户,处理新代币的创建 持有账户
- (有时也称为代币账户),实际持有大量代币,并由某人拥有
关键的一点是,这些都是账户。 因此,要回答您的问题:
一旦我创建了铸币厂,并在 Solscan 中搜索它,它就会打开一个帐户实体。那么,铸币厂实际上不是一个代币,而只是一个保存数据的账户?(例如这里)。另一方面,我实际上可以在 Solscan 中找到令牌实体。有什么区别?
在此示例中,JAf858mSrDuQuHQCVqfA3KN8PNaVxZokMVNAJiC3zMpr
是铸币厂地址(或令牌类型),4FLiMhW2Weagy8LjtMCVkFQkLrB3zmF2VUcJDq2NQcJN
是该令牌类型的用户持有的令牌地址。 Solscan称之为"代币账户"。
此令牌(或帐户)没有任何元数据...字面上什么都没有。它就像一个数据占位符。它实际上已经是铸造的代币还是半生不熟的东西?如果是后者,那么我之后是否必须附加元数据?
正确,4FLiMhW2Weagy8LjtMCVkFQkLrB3zmF2VUcJDq2NQcJN
的帐户没有元数据,铸币厂也没有JAf858mSrDuQuHQCVqfA3KN8PNaVxZokMVNAJiC3zMpr
. 元数据附加到单独的帐户中,就像在 Metaplex 令牌元数据标准中一样。 在该模型中,如果您有铸币权限,则可以将其附加到铸币厂。
关联账户有什么用?
关联代币账户是一个标准,定义一个"规范"账户,用于持有给定钱包的特定类型的代币,以便更容易找到为用户发送特定类型代币的位置。 这样,只需您的钱包地址E5GvXygLz1AbCFqtcp14feEo8hy6YAv8wr74Xnpo1qBH
,我知道通过派生关联的代币帐户将任何类型的/铸币币发送到哪里。4FLiMhW2Weagy8LjtMCVkFQkLrB3zmF2VUcJDq2NQcJN
是令牌铸币JAf858mSrDuQuHQCVqfA3KN8PNaVxZokMVNAJiC3zMpr
的派生地址。
SPL 库有一个 mintTo 函数,该函数在 Solana 文档中的上述链接教程中使用。这是将代币转移到另一个钱包的操作吗?该示例实际上将其转移(铸造)到关联帐户。这是什么逻辑?
mintTo
创建全新的代币,并将它们放入持有账户,根本不进行转账。
如果我使用公共 Metaplex 程序来铸造代币,并且我部署了自己的锚程序 - 这个程序是用于将元数据添加到铸造的代币中吗?这里是什么概念,我不明白。
您不需要元数据的新程序 - Metaplex 令牌元数据程序会为您完成此操作。 与其他任何程序一样,它是一个无状态程序,它定义了如何将数据写入帐户的逻辑。 在这种情况下,该数据是代币铸币厂的元数据。
当我准备好 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