IDL abrufen
Rufe die IDL ab, die für ein Solana-Programm an einem beliebigen slot gültig war. Sie stammt aus dem Katalog, den Parsed Events zum Dekodieren von Anweisungen verwendet.
curl --request GET \
--url 'https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key='import requests
url = "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?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/v1/parsed-events/idl/{programId}/{slot}?api-key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"name": "kamino_lending",
"version": "0.1.0",
"instructions": [
{
"name": "refreshObligation",
"accounts": [
{
"name": "lendingMarket",
"isMut": false,
"isSigner": false
},
{
"name": "obligation",
"isMut": true,
"isSigner": false
}
],
"args": []
}
],
"errors": [
{
"code": 6000,
"name": "InvalidMarketAuthority",
"msg": "Market authority is invalid"
}
]
}slot aktiv wurde. slot muss keiner Version exakt entsprechen. Du kannst also einen beliebigen Zeitpunkt in der Vergangenheit angeben. Um eine bestimmte Version abzurufen, übergib ihren slot aus IDL-Versionen auflisten.
Die IDL stammt aus demselben Katalog, den Parsed Events und Parsed Streams zum Dekodieren von Anweisungen verwenden. Der Orb Explorer verwendet diese endpoints, um Programm-IDLs anzuzeigen.
Anwendungsfälle
- Verlauf mit der richtigen Schnittstelle dekodieren. Übergib den slot einer Transaktion, um die IDL abzurufen, die bei ihrer Ausführung aktiv war. Programme ändern im Lauf der Zeit ihre Anweisungen und Konten. Daher kann die aktuelle IDL ältere Transaktionen falsch interpretieren.
- Exakte Namen für Filter ermitteln. Transaktionsverlauf durchsuchen
match.programs[].instructionsakzeptiert Anweisungsnamen in der Schreibweise der IDL. - Änderungen an der Schnittstelle prüfen. Rufe zwei Versionen ab und vergleiche ihre
instructions, um zu sehen, was bei einem Upgrade hinzugefügt oder entfernt wurde. Sieh dir das Beispiel unter IDL-Versionen auflisten an.
IDL-Formate
Die response enthält das IDL-Dokument so, wie es gespeichert ist. Programme im Katalog verwenden eines von zwei Anchor-Formaten. Die Versionen eines Programms können beide verwenden. Prüfe vor dem Lesen, welches Format du erhalten hast:| Legacy Anchor (vor 0.30) | Anchor 0.30+ | |
|---|---|---|
| Programmname und -version | name und version auf oberster Ebene | metadata.name und metadata.version |
| Programmadresse | Kein address auf oberster Ebene | address auf oberster Ebene |
| Anweisungsdiskriminator | Nicht enthalten | instructions[].discriminator |
| Flags für Anweisungskonten | isMut, isSigner | writable, signer |
instructions. Die meisten IDLs enthalten außerdem accounts, types und errors. Viele enthalten auch events.
Credits
Jeder request kostet 10 Credits und ist in allen Tarifen verfügbar. Weitere Informationen findest du unter Credits.Fehler
| Status | Bedingung |
|---|---|
400 | programId ist keine gültige Base58-Adresse oder slot ist keine vorzeichenlose 64-Bit-Ganzzahl. |
401 | Der API key fehlt oder ist ungültig. Der Inhalt besteht aus Klartext: Unauthorized. |
404 | Der Katalog enthält keine IDL für das Programm oder bei beziehungsweise vor slot war keine Version aktiv. |
error-Meldung zurück, zum Beispiel {"error": "no IDL found for program KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD at or before slot 1"}.
Request-Parameter
slot aus „IDL-Versionen auflisten“, um genau diese Version abzurufen. Übergib alternativ den slot einer Transaktion, um die IDL abzurufen, die bei ihrer Ausführung gültig war.Autorisierungen
Pfadparameter
Programm-Adresse, Base58-codiert.
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Der nachzuschlagende slot. Er muss nicht dem Aktivierungs-slot einer Version entsprechen. Übergib einen slot aus „IDL-Versionen auflisten“, um genau diese Version abzurufen, oder den slot einer Transaktion, um die IDL abzurufen, die bei ihrer Ausführung gültig war.
x >= 0205509752
Antwort
Das IDL-Dokument in der gespeicherten Form. Es kommen sowohl das alte Anchor-Format als auch das Format von Anchor 0.30+ vor. Prüfe daher vor dem Lesen, welches Format du erhalten hast.
Ein IDL-Dokument, das in der gespeicherten Form zurückgegeben wird. Es kommen zwei Formate vor:
- Altes Anchor-Format (vor 0.30):
nameundversionauf der obersten Ebene. Anweisungskonten verwendenisMutundisSigner. - Anchor 0.30+:
addressundmetadata(name,version,spec,description) auf der obersten Ebene. Anweisungen enthalten einendiscriminator, und Anweisungskonten verwendenwritableundsigner.
Beide Formate enthalten instructions. Die meisten IDLs enthalten außerdem accounts, types und errors, viele auch events. Die Versionen eines Programms können unterschiedliche Formate verwenden.
War diese Seite hilfreich?
curl --request GET \
--url 'https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key='import requests
url = "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?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/v1/parsed-events/idl/{programId}/{slot}?api-key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key="
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
.asString();require 'uri'
require 'net/http'
url = URI("https://mainnet.helius-rpc.com/v1/parsed-events/idl/{programId}/{slot}?api-key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"name": "kamino_lending",
"version": "0.1.0",
"instructions": [
{
"name": "refreshObligation",
"accounts": [
{
"name": "lendingMarket",
"isMut": false,
"isSigner": false
},
{
"name": "obligation",
"isMut": true,
"isSigner": false
}
],
"args": []
}
],
"errors": [
{
"code": 6000,
"name": "InvalidMarketAuthority",
"msg": "Market authority is invalid"
}
]
}