我们都知道,可以根据用户自己的账户信息+程序Id生成代币账户信息。如下图所示:
我通过如下代码可以得到代币账户(token account):
rpcClient := rpc.New(RpcMainNet)
programId := solana.MPK("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")
fromPubKey := solana.MustPublicKeyFromBase58("GmKsGRytiVoeMZGmBVCWPcUzJGHVqcvzhP5K9cstdr3E")
fromTokenAccount, err := rpcClient.GetTokenAccountsByOwner(context.Background(), fromPubKey,
&rpc.GetTokenAccountsConfig{
ProgramId: &programId,
},
&rpc.GetTokenAccountsOpts{
Encoding: solana.EncodingBase64Zstd,
})
if err != nil {
fmt.Printf("get from token account failed")
}
for index, account := range fromTokenAccount.Value {
fmt.Printf("get token account %d %v \n", index, account.Pubkey)
}
但是如何根据token account得到实际的token owner的公钥呢?我尝试了下面的方法,得到的owner是SPL Token的ProgramId:
rpcClient := rpc.New(RpcMainNet)
tokenMintPubKey := solana.MPK(TokenMainNetAddress)
tokenAccountPubKey := solana.MustPublicKeyFromBase58("3XRNhFEXkV7itJEJMDBN8iRHBgwhgk83XB5K3s3re3Ew")
tokenAccountInfo, err := rpcClient.GetAccountInfo(context.Background(), tokenAccountPubKey)
if err != nil {
fmt.Printf("get account info error %v\n", err)
}
fmt.Printf("get token account owner %v\n", tokenAccountInfo.Value)
我希望得到的是实际token的拥有者: GmKsGRytiVoeMZGmBVCWPcUzJGHVqcvzhP5K9cstdr3E