Comptes historiques
getHistoricalAccountInfo
Lisez n’importe quel compte Solana tel qu’il était à un slot antérieur ou juste après une transaction spécifique, avec les encodages de getAccountInfo et la position de la dernière écriture.
POST
/
getHistoricalAccountInfo
curl --request POST \
--url 'https://mainnet.helius-rpc.com/?api-key=' \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": "1",
"method": "getHistoricalAccountInfo",
"params": [
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
{
"slot": 445000000
},
{
"encoding": "jsonParsed"
}
]
}
'import requests
url = "https://mainnet.helius-rpc.com/?api-key="
payload = {
"jsonrpc": "2.0",
"id": "1",
"method": "getHistoricalAccountInfo",
"params": ["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", { "slot": 445000000 }, { "encoding": "jsonParsed" }]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: '1',
method: 'getHistoricalAccountInfo',
params: [
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
{slot: 445000000},
{encoding: 'jsonParsed'}
]
})
};
fetch('https://mainnet.helius-rpc.com/?api-key=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mainnet.helius-rpc.com/?api-key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => '1',
'method' => 'getHistoricalAccountInfo',
'params' => [
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
[
'slot' => 445000000
],
[
'encoding' => 'jsonParsed'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://mainnet.helius-rpc.com/?api-key="
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"1\",\n \"method\": \"getHistoricalAccountInfo\",\n \"params\": [\n \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n {\n \"slot\": 445000000\n },\n {\n \"encoding\": \"jsonParsed\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://mainnet.helius-rpc.com/?api-key=")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"1\",\n \"method\": \"getHistoricalAccountInfo\",\n \"params\": [\n \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n {\n \"slot\": 445000000\n },\n {\n \"encoding\": \"jsonParsed\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/?api-key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": \"1\",\n \"method\": \"getHistoricalAccountInfo\",\n \"params\": [\n \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n {\n \"slot\": 445000000\n },\n {\n \"encoding\": \"jsonParsed\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": "1",
"result": {
"context": {
"slot": 468129571
},
"value": {
"lamports": 531589475273,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"data": [
"<string>"
],
"executable": false,
"rentEpoch": 123,
"space": 82,
"lastUpdatedAt": {
"slot": 444999837,
"transactionIndex": 700
}
}
}
}{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "Paramètres non valides"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32001,
"message": "Non autorisé"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32005,
"message": "Trop de requêtes"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32603,
"message": "Erreur interne"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32002,
"message": "Service indisponible"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32003,
"message": "Délai d'attente de la passerelle dépassé"
},
"id": "1"
}getHistoricalAccountInfo est en version bêta. Les paramètres, la tarification, les formats de réponse et la couverture des données peuvent changer.Présentation
getHistoricalAccountInfo renvoie un compte Solana tel qu’il était à un slot antérieur ou immédiatement après une transaction spécifique dans ce slot. Il s’agit d’une méthode RPC exclusive à Helius. La méthode standard getAccountInfo renvoie uniquement l’état actuel.
La réponse contient les mêmes champs de compte que getAccountInfo, ainsi que lastUpdatedAt : le slot et la transaction correspondant à la dernière écriture de l’état reçu.
L’historique est disponible à partir du slot 444,959,999 (7 septembre 2026), qui correspond à l’état au début de l’époque 1030. Les requêtes portant sur des slots antérieurs renvoient l’erreur -32018.
getHistoricalAccountInfo est disponible sur le mainnet pour les forfaits Business et supérieurs, et coûte 0 crédit par appel pendant la période bêta. La tarification est susceptible de changer.
Choisir une position dans l’historique
Le deuxième paramètre est un objet de requête qui sélectionne le point de l’historique à lire :| Requête | Renvoie le compte |
|---|---|
Omis ou {} | Au dernier slot indexé, dans la limite de l’engagement demandé |
{ "slot": 445000000 } | À la fin du slot 445,000,000 |
{ "slot": 445000000, "transactionIndex": 10 } | Immédiatement après l’exécution de la transaction à l’index 10 dans le slot 445,000,000 |
transactionIndex nécessite slot. Pour lire un compte juste avant la transaction à l’index N, interrogez transactionIndex: N - 1. Pour la première transaction d’un slot, interrogez le slot précédent sans transactionIndex.
Les écritures qui ne proviennent pas de transactions, telles que les récompenses d’époque, sont appliquées à la fin du slot. Une requête avec transactionIndex ne les inclut jamais.
Exemple de requête
curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "1",
"method": "getHistoricalAccountInfo",
"params": [
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
{ "slot": 445000000 },
{ "encoding": "jsonParsed" }
]
}'
Lire la réponse
valueest le compte tel qu’il était à la position demandée, ounullsi le compte n’existait pas à ce moment-là : il n’avait pas encore été créé ou avait été fermé. Une réponsenullne contient aucunlastUpdatedAt.lastUpdatedAt.slotetlastUpdatedAt.transactionIndexidentifient l’écriture qui a produit cet état. L’écriture se trouve à la position demandée ou avant celle-ci.lastUpdatedAt.transactionIndexvautnulllorsque l’écriture a eu lieu en dehors d’une transaction, par exemple pour les récompenses d’époque.- Un
lastUpdatedAt.slotde 444,959,999 avec untransactionIndexégal ànullsignifie que le compte n’a pas changé depuis le début de la couverture historique. Cela ne signifie pas que le compte a été écrit dans ce slot. context.slotest le dernier slot que Helius avait indexé au moment de traiter la requête, et non le slot interrogé.- Les comptes de jetons
jsonParsedutilisent le nombre de décimales du mint à la position demandée. Si le mint ne peut pas être lu à cette position, le compte utilise base64 comme solution de repli.
lastUpdatedAt comme curseur. Consultez Parcourir l’historique d’un compte à rebours.
Erreurs
| Code | Signification |
|---|---|
-32018 | Le slot est antérieur au début de la couverture historique (slot 444,959,999) |
-32004 | Le slot est plus récent que ne l’autorise l’engagement demandé. Utilisez confirmed ou interrogez un slot plus ancien |
-32602 | Paramètres non valides, comme transactionIndex sans slot, l’encodage base58 ou un champ de configuration inconnu |
-32601 | Méthode introuvable. Appelez votre point de terminaison mainnet Helius ou Gatekeeper ; la méthode n’est pas disponible sur devnet |
Méthodes associées
Historical Accounts Guide
Fonctionnement des positions, de la couverture et de lastUpdatedAt pour les méthodes de comptes historiques
getHistoricalTokenAccountsByOwner
Répertoriez les comptes de jetons d’un portefeuille à un slot antérieur
getTransactionsForAddress
Trouvez le slot et le transactionIndex des transactions que vous souhaitez inspecter
getAccountInfo
Lisez l’état actuel d’un compte
Paramètres de la requête
Slot auquel lire l’état. Renvoie le compte tel qu’il était à la fin de ce slot. Le premier slot pris en charge est 444959999, soit l’état au début de l’époque 1030. Si ce paramètre est omis, lit le dernier slot indexé, dans la limite de l’engagement demandé.
Position d’une transaction dans le slot. Renvoie l’état du compte immédiatement après l’exécution de cette transaction, plutôt qu’à la fin du slot. Nécessite slot.
Format d’encodage des données du compte. base58 et binary ne sont pas pris en charge.
base64base64+zstdjsonParsed
Renvoie uniquement une tranche des données de chaque compte. S’applique aux encodages base64 et base64+zstd.
Niveau d’engagement. processed n’est pas pris en charge.
finalizedconfirmed
Autorisations
Votre clé API Helius. Vous pouvez en obtenir une gratuitement dans le tableau de bord.
Corps
application/json
Tableau contenant l'adresse du compte, un objet de requête facultatif qui sélectionne la position dans l'historique et un objet de configuration facultatif.
Required array length:
1 - 3 elementsAdresse encodée en base 58 du compte à lire.
Exemple:
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
Cette page vous a-t-elle été utile ?
⌘I
getHistoricalAccountInfo
curl --request POST \
--url 'https://mainnet.helius-rpc.com/?api-key=' \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": "1",
"method": "getHistoricalAccountInfo",
"params": [
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
{
"slot": 445000000
},
{
"encoding": "jsonParsed"
}
]
}
'import requests
url = "https://mainnet.helius-rpc.com/?api-key="
payload = {
"jsonrpc": "2.0",
"id": "1",
"method": "getHistoricalAccountInfo",
"params": ["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", { "slot": 445000000 }, { "encoding": "jsonParsed" }]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: '1',
method: 'getHistoricalAccountInfo',
params: [
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
{slot: 445000000},
{encoding: 'jsonParsed'}
]
})
};
fetch('https://mainnet.helius-rpc.com/?api-key=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mainnet.helius-rpc.com/?api-key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => '1',
'method' => 'getHistoricalAccountInfo',
'params' => [
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
[
'slot' => 445000000
],
[
'encoding' => 'jsonParsed'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://mainnet.helius-rpc.com/?api-key="
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"1\",\n \"method\": \"getHistoricalAccountInfo\",\n \"params\": [\n \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n {\n \"slot\": 445000000\n },\n {\n \"encoding\": \"jsonParsed\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://mainnet.helius-rpc.com/?api-key=")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": \"1\",\n \"method\": \"getHistoricalAccountInfo\",\n \"params\": [\n \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n {\n \"slot\": 445000000\n },\n {\n \"encoding\": \"jsonParsed\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/?api-key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": \"1\",\n \"method\": \"getHistoricalAccountInfo\",\n \"params\": [\n \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n {\n \"slot\": 445000000\n },\n {\n \"encoding\": \"jsonParsed\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": "1",
"result": {
"context": {
"slot": 468129571
},
"value": {
"lamports": 531589475273,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"data": [
"<string>"
],
"executable": false,
"rentEpoch": 123,
"space": 82,
"lastUpdatedAt": {
"slot": 444999837,
"transactionIndex": 700
}
}
}
}{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "Paramètres non valides"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32001,
"message": "Non autorisé"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32005,
"message": "Trop de requêtes"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32603,
"message": "Erreur interne"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32002,
"message": "Service indisponible"
},
"id": "1"
}{
"jsonrpc": "2.0",
"error": {
"code": -32003,
"message": "Délai d'attente de la passerelle dépassé"
},
"id": "1"
}