這幾天練習使用golang呼叫solana合約,切換一門語言,感覺不那麼輕鬆,搞evm的時候,有ethereum的程式碼是go實現的,感覺golang 像是evm第一語言。
早上的時候,看群友提問
需求
1.想判斷solana地址是否合法
2.想判斷合法地址下,是否持有三個token中的任一個,即balance > 1
剛好做練習,所以簡單寫寫,想法如下:
用錢包位址和token位址算token的帳號位址,再呼叫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)
後面群友提出更有效率的方案:
可以用 rpc getMultipleAccounts 一次請求幾百個token賬戶,批量拿幾次應該就夠了,降低helius rpc的額度消耗,同時性能也好
相對來說群友這個方法比較好,畢竟helius的rpc都是有限額的,一條能搞定,就不要搞3條
這個思路上有一點點差異,這個是獲取的帳號數據,所以代碼這麼寫:
//获取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) } } }
我就隨便發發,做做筆記,歡迎交流。
以上是solana 取得錢包token餘額,及優化的詳細內容。更多資訊請關注PHP中文網其他相關文章!