代币计划概念及相关代币账户计划

Moa*_*med 0 .net c# blockchain solana

我正在尝试将代币 [USDT] 从一个钱包发送到另一个钱包。但我认为我在理解关联令牌帐户 [ATA] 的概念时遇到了一些困难

据我的理解:

1 - 每个想要保存、接收或发送代币的钱包账户都必须在网络中的账户中注册这些代币吗?

2 - 发送方可以注册接收方的帐户

3-这些概念正确吗?

以上所有操作均通过以下指令完成=> AssociatedTokenAccountProgram.CreateAssociatedTokenAccount

4 - 一旦接收者的钱包地址被注册,就可以通过指令将代币发送给他=> TokenProgram.Transfer

  Account ownerAccount = wallet.Account;
  PublicKey UsdtAddress = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB");
  PublicKey ToAddress = new PublicKey("CDQ3Gya9QermsPzU3cTNW9QPLbMVLbALQ2S8AwbruVJ");

  var Transaction = new TransactionBuilder().
             SetRecentBlockHash(blockHash.Result.Value.Blockhash).
             SetFeePayer(wallet.Account).

             AddInstruction(AssociatedTokenAccountProgram.CreateAssociatedTokenAccount(
             ownerAccount, // Sender Account [Wallet Owner]   ?
             UsdtAddress,    // Tether Address On-Chain         ?
             ToAddress)).  // The Recipient Wallet Address    ?
             
             AddInstruction(TokenProgram.Transfer(
             ownerAccount,
             ToAddress,
             100,
             ownerAccount)).

             Build(new List<Account> { ownerAccount });

  var txReq = await rpcClient.SendTransactionAsync(Transaction);
Run Code Online (Sandbox Code Playgroud)

我很抱歉让您等了这么久,但经过多次尝试,都没有成功,我真的认为我需要有人解释一下发送令牌的工作原理。

Moa*_*med 5

经过长时间的努力,我取得了一些成果,我将留下此评论作为问题的解决方案和对事物如何工作的理解,如果它包含一些错误,请随时留下解释和更正这

让我们首先就一些概念达成一致:

1-钱包账户是一个普通账户,属于系统程序所有,称为[账户所有者]

2- 拥有私钥的人被称为权威者

3 - 每个代币在链上都有一个账户,有自己的所有者和权限

现在发生了什么?

如果您想首次拥有其中一些代币,则必须创建一个称为关联代币账户的账户

关联代币账户:它只是网络内的一个账户,将每个钱包与代币的特殊且唯一的地址相关联!这清楚吗??

您的钱包号码 =>关联的代币账户<= 代币账号

G1G2G3G4 => A1T2A3T4 <= USDTADDRESS243

它的工作是用特定的代币地址保存和存储特定钱包地址的数据,比如数量、余额和许多其他我还没见过的功能

第一次将这些代币发送到不包含 [ATA] 的帐户时,您将构建为此帐户创建 [ATA] 的指令,并直接附加指令以通过同一交易发送代币,这种结构对我有用,

在此输入图像描述

最后:可以简单地知道钱包的关联代币账户,因为我们需要发送带有关联代币的代币,而不是主钱包的地址

以下是创建关联代币账户并将一些 USDT 发送到该地址的代码:

    PublicKey UsdtAddress = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB");

    //The [ATA] for my public address in the USDT token account = Sender
    Account ownerAccount = wallet.Account;
    var FromAssociatedTokenAccount=AssociatedTokenAccountProgram.DeriveAssociatedTokenAccount(ownerAccount,UsdtAddress); 

    //The [ATA] for Receiver public address in the USDT token account = Sender = Receiver 
    PublicKey ToAddress = new PublicKey("DqiE6PDXPFMMDC2jzoqY45VEqyEzdGd5qauVCQY8s3A7");
    var ToAssociatedTokenAccount = AssociatedTokenAccountProgram.DeriveAssociatedTokenAccount(ToAddress, UsdtAddress);
    //Note that a ToAssociatedTokenAccount can be defined, with the possibility that it is not registered/created on-Chain



    var blockHash = await rpcClient.GetRecentBlockHashAsync();
    var Transaction = new TransactionBuilder().
             SetRecentBlockHash(blockHash.Result.Value.Blockhash).
             SetFeePayer(ownerAccount).
 AddInstruction(AssociatedTokenAccountProgram.CreateAssociatedTokenAccount(
             ownerAccount,
             ToAddress,
             UsdtAddress)).

             AddInstruction(TokenProgram.Transfer(
             FromAssociatedTokenAccount,
             ToAssociatedTokenAccount,
             1,
             ownerAccount)).

             Build(new List<Account> { ownerAccount });
     var txReq = await rpcClient.SendTransactionAsync(Transaction);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所以最后,请带一杯咖啡阅读这篇文章,我认为澄清一些有关 Solana 区块链的概念很好: https://www.brianfriel.xyz/how-to-create-a-token-on-索拉纳/