solana rpc 返回"base64+zstd" 结果能解码成可读字符串吗?

官方文档参考:https://docs.solana.com/developing/clients/jsonrpc-api#getaccountinfo
"base64+zstd" compresses the Account data using Zstandard and base64-encodes the result.

待解码数据如下:

"data": [
      "c2VydW0DAAAAAAAAAN/1mEELDQohNJI6FgPa4ZU1gA2/byFWYcnA8lt8oeJmAAAAAAAAAAAgyOLJc+L47CrO7pWnR108Q0yBD1qiNMtF1FehLf0ukcb6evO+2606PWXzaqvJdDGxu+TC0vbg5HymAgNFL11hBVQXKA5KOlE6syIUtDhk5KQkBQCetCy8WtJa914hH+uAaKfHvAQAAAAAAAAAAAAADbShIaxCEUfTaEGDulZQgAKnb9kAKcuGa216Ntj3eA10P/oGPAAAAJ7JuAAAAAAAZAAAAAAAAACrHB5LTexVOS4v1tpKHzPkvyUqdBRHI6zjJ7RX1XFSvIsKaabVU0X9IDocEMzOEy9nGL9BlxLZGFqPIE7h69g5g6F112nunsupDQplObWC296rtAfipPi8OMJxe++7Mn8f8FtRkIaWzL7pSp6/hcebfu990RvuTpF6pZHYBWC6T4CWmAAAAAAAZAAAAAAAAAAAAAAAAAAAAEJGyAAAAAAAcGFkZGluZw==",
      "base64"
    ],
请先 登录 后评论

最佳答案 2022-04-17 17:43

这个问题可以,没人解答,我来试试
solana-go-sdk/getAccountInfo.go at 7369c04fccd1043e385a5b1bb11cd57fba90aa09 · devexpert127/solana-go-sdk (github.com)
这里有一个例子

bin "github.com/gagliardetto/binary"
{
	pubKey := solana.MustPublicKeyFromBase58("4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R") // raydium token
	// advanced usage
	resp, err := client.GetAccountInfoWithOpts(
		context.TODO(),
		pubKey,
	// You can specify more options here:
		&rpc.GetAccountInfoOpts{
			Encoding:   solana.EncodingBase64Zstd,
			Commitment: rpc.CommitmentFinalized,
	// You can get just a part of the account data by specify a DataSlice:
	// DataSlice: &rpc.DataSlice{
	// 	Offset: pointer.ToUint64(0),
	// 	Length: pointer.ToUint64(1024),
	// },
			},
	)
	if err != nil {
		panic(err)
	}
	var mint token.Mint
	err = bin.NewBinDecoder(resp.Value.Data.GetBinary()).Decode(&mint)
	if err != nil {
		panic(err)
	}
}
import (
	"fmt"
	bin "github.com/gagliardetto/binary"
	"github.com/gagliardetto/solana-go/programs/token"
)

func main() {
	var mint token.Mint
	err := bin.NewBinDecoder([]byte("c2VydW0DAAAAAAAAAN/1mEELDQohNJI6FgPa4ZU1gA2/byFWYcnA8lt8oeJmAAAAAAAAAAAgyOLJc+L47CrO7pWnR108Q0yBD1qiNMtF1FehLf0ukcb6evO+2606PWXzaqvJdDGxu+TC0vbg5HymAgNFL11hBVQXKA5KOlE6syIUtDhk5KQkBQCetCy8WtJa914hH+uAaKfHvAQAAAAAAAAAAAAADbShIaxCEUfTaEGDulZQgAKnb9kAKcuGa216Ntj3eA10P/oGPAAAAJ7JuAAAAAAAZAAAAAAAAACrHB5LTexVOS4v1tpKHzPkvyUqdBRHI6zjJ7RX1XFSvIsKaabVU0X9IDocEMzOEy9nGL9BlxLZGFqPIE7h69g5g6F112nunsupDQplObWC296rtAfipPi8OMJxe++7Mn8f8FtRkIaWzL7pSp6/hcebfu990RvuTpF6pZHYBWC6T4CWmAAAAAAAZAAAAAAAAAAAAAAAAAAAAEJGyAAAAAAAcGFkZGluZw==")).Decode(&mint)
	if err != nil {
		fmt.Printf("+v", err.Error())
	} else {
		fmt.Printf("+v", mint)
	}
}

16501788161.png

请先 登录 后评论

其它 4 个回答

晓道

看了网上别人的例子,python确实不能这么干,主要没人这么干,别人干不来,但是我可以嘛,参考,https://github.com/solana-labs/solana-program-library/blob/master/token/program/inc/token.h文件
就是python解析二进制结构复杂一点点。
如有疑问,可以问我。
python中struct.pack()函数和struct.unpack()函数 - 南宫轩诺 - 博客园 (cnblogs.com)

buff ="c2VydW0DAAAAAAAAAN/1mEELDQohNJI6FgPa4ZU1gA2/byFWYcnA8lt8oeJmAAAAAAAAAAAgyOLJc+L47CrO7pWnR108Q0yBD1qiNMtF1FehLf0ukcb6evO+2606PWXzaqvJdDGxu+TC0vbg5HymAgNFL11hBVQXKA5KOlE6syIUtDhk5KQkBQCetCy8WtJa914hH+uAaKfHvAQAAAAAAAAAAAAADbShIaxCEUfTaEGDulZQgAKnb9kAKcuGa216Ntj3eA10P/oGPAAAAJ7JuAAAAAAAZAAAAAAAAACrHB5LTexVOS4v1tpKHzPkvyUqdBRHI6zjJ7RX1XFSvIsKaabVU0X9IAAAAAAAZAAAAAAAAAAAAAAAAAAAAEJGyAAAAAAAcGFkZGluZw=="
c0 = buff[36:44]
struct.unpack("<Q",c0.encode('utf-8')) 这个是supply
c2 = buff[44:45]
struct.unpack("<B",c2.encode('utf-8')) //decimals 挨个解下去,就搞定了
请先 登录 后评论
xwisen
请先 登录 后评论
xwisen

不知道用borsh 会不会简化这个操作。

请先 登录 后评论
xwisen

看了这些资料,我理解这个解码是需要事先知道数据结构的。不管是python还是golang。不知道为啥,你一开始就用了 token.Mint 这个结构,而且看起来还是对的。

请先 登录 后评论
  • 2 关注
  • 1 收藏,3985 浏览
  • xwisen 提出于 2022-04-16 23:42