node.js - Kako mogu pročitati podatke iz buffera u TypeScriptu? (Solana)


Kako mogu pročitati podatke iz buffera u TypeScriptu?

Želim koristiti javni ključ da dobijem sve popise tokena koje posjedujem. Pokušavam to dobiti, ali vraća se prazan niz objekata.

import {Connection, Keypair} from "@solana/web3.js";

const Solana = new Connection("https://api.testnet.solana.com/","confirmed")
const getInfo = async () => {
    const recentInfo = await Solana.getEpochInfo()
    const DEMO_FROM_SECRET_KEY = new Uint8Array([
       223, 119, 171,   5, 237, 138,  42, 140, 176, 163,  74,
      107,  25, 143,  90,  97, 250, 158, 203, 102, 238,  19,
       77, 228, 211, 238, 147, 149,  40,  50, 211, 155,  51,
      207,  14,  53,  86, 230, 164,  27,  14, 202,  78, 181,
      185, 250,  16,  52, 134, 242,  96,  16,  12,  67,   2,
      178, 106, 241, 156, 212,  11, 150, 114,  72])
    const keypair = Keypair.fromSecretKey(DEMO_FROM_SECRET_KEY)

    console.log("=============get account info==============")
    async function fetchaccountdata() {
        const accountinfo = await Solana.getParsedAccountInfo(keypair.publicKey,"max")
        const accountinfodata =  JSON.stringify(accountinfo)
        const accountinfodata2 = JSON.parse(accountinfodata)
        console.log(accountinfo)
        console.log("=============get account info==============")
        console.log(accountinfodata)
        console.log(accountinfodata2)
    }
    fetchaccountdata()
}
getInfo()

Terminal je

accountinfodata = {"context":{"slot":94636033},"value":{"data":{"type":"Buffer","data":[]},"executable":false,"lamports":42784111360,"owner":{"_bn":"00"},"rentEpoch":231}}

accountinfodata2 = {
  context: { slot: 94636033 },
  value: {
    data: { type: 'Buffer', data: [] },
    executable: false,
    lamports: 42784111360,
    owner: { _bn: '00' },
    rentEpoch: 231
  }
}

Podaci objekta accountinfo su prazni niz. Kako mogu pročitati informacije?

Odgovor #1

Ovaj poziv dohvaća podatke o računu za vaš novčanik. Vaš novčanik drži samo SOL, zbog čega podaci ne prikazuju ništa!

Ako želite dobiti sve token račune koje posjedujete, bolje je koristiti getParsedTokenAccountsByOwner: https://github.com/solana-labs/solana/blob/2a42f8a06edd4d33c6cda4d66add0a2582d37011/web3.js/src/connection.ts#L2310

Odgovor #2

Bufer sadrži podatke o informacijama računa bez posebnog formata. Međutim, Borsh je nedavno uspostavljen kao standard.

Primjer borsh serijalizacije iz SPL-a: https://github.com/solana-labs/solana-program-library/blob/master/token/program/src/state.rs#L128

Primjer borsh deserijalizacije za metaplex metadata: https://github.com/metaplex-foundation/metaplex-program-library/blob/master/token-metadata/program/src/instruction.rs#L77-L78

Ako ne pokušavate dekodirati metaplex metadata, trebali biste potražiti shemu negdje drugdje, ali slijedite iste principe koda. Ako znate da račun ne koristi borsh, onda je na vama da ga dekodirate.

Posjetite Solana Tech Discord za više informacija/pomoći. https://discord.com/channels/428295358100013066/517163444747894795/917412508418068510