Maison > développement back-end > Golang > solana obtient le solde des jetons du portefeuille et l'optimise

solana obtient le solde des jetons du portefeuille et l'optimise

Barbara Streisand
Libérer: 2024-12-26 12:39:10
original
921 Les gens l'ont consulté

solana 获取钱包token余额,及优化

Ces derniers jours, je me suis entraîné à utiliser Golang pour appeler des contrats Solana et changer de langue. Lorsque je fais evm, certains codes Ethereum sont implémentés en go. Cela ressemble à la première langue de Golang Evm.
Le matin, je lis les questions posées par le groupe

Exigences
1. Vous voulez déterminer si l’adresse de Solana est légitime
2. Vous souhaitez déterminer si l'adresse légale contient l'un des trois jetons, c'est-à-dire un solde > 1

Il se trouve que je faisais quelques exercices, je vais donc écrire brièvement. L'idée est la suivante :
Utilisez l'adresse du portefeuille et l'adresse du jeton pour calculer l'adresse du compte du jeton, puis appelez GetTokenAccountBalance

lokey :=solana.MustPublicKeyFromBase58("HgJ5zad5N4pwKpAM8HQDA3g2r2H7EMLVN6S5HvHdiNyR") //钱包地址
tokenmint := solana.MustPublicKeyFromBase58("J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn") //token 地址
tokenacc, _, _ := solana.FindAssociatedTokenAddress(lokey, tokenmint) //算出token账号地址
outtbl, err = client.GetTokenAccountBalance(context.Background(), tokenacc,rpc.CommitmentFinalized)
Copier après la connexion

Les membres du groupe suivants ont proposé une solution plus efficace :

Vous pouvez utiliser rpc getMultipleAccounts pour demander des centaines de comptes de jetons à la fois Quelques fois par lots devraient suffire, ce qui réduit la consommation de quota d'helius rpc et offre de bonnes performances

Relativement parlant, la méthode des groupes d'amis est meilleure. Après tout, les RPC d'Helius ont des quotas. Si vous pouvez en gérer un, n'en faites pas trois

.

Il y a une petite différence dans cette idée. Ce sont les données du compte obtenues, donc le code est écrit comme ceci :

//获取token 账号代码和前面一样
out, _ := client.GetMultipleAccounts(context.Background(), lokey, tokenacc, tokenacc2, tokenacc3, tokenacc4)
for _, ov := range out.Value {
    if ov != nil {
    if ov.Owner.String() == "11111111111111111111111111111111" { 
            log.Debugf("acc %s,bl %d", ov.Owner.String(), ov.Lamports)
    } else {
            var ta token.Account
            err = bin.NewBinDecoder(ov.Data.GetBinary()).Decode(&ta)
            log.Debugf("acc %s,bl %d", ta.Owner.String(), ta.Amount)
    }
    }
}
Copier après la connexion

Je vais juste le poster et prendre des notes Bienvenue pour communiquer.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal