Lấy IDL
Lấy IDL có hiệu lực cho một chương trình Solana tại bất kỳ slot nào từ danh mục mà Sự kiện đã phân tích sử dụng để giải mã các lệnh.
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. slot không cần khớp chính xác với một phiên bản, vì vậy bạn có thể truyền bất kỳ thời điểm nào trong lịch sử. Để lấy một phiên bản cụ thể, hãy truyền slot của phiên bản đó từ Liệt kê các phiên bản IDL.
IDL đến từ cùng danh mục mà Sự kiện đã phân tích và Luồng đã phân tích sử dụng để giải mã các lệnh. Trình khám phá Orb sử dụng các endpoint này để hiển thị IDL của chương trình.
Trường hợp sử dụng
- Giải mã lịch sử bằng đúng giao diện. Truyền slot của một giao dịch để lấy IDL đang có hiệu lực khi giao dịch đó được thực thi. Các chương trình thay đổi lệnh và tài khoản theo thời gian, vì vậy IDL hiện tại có thể diễn giải sai các giao dịch cũ.
- Tìm tên chính xác cho bộ lọc. Quét lịch sử giao dịch
match.programs[].instructionschấp nhận tên lệnh đúng như cách chúng được ghi trong IDL. - Xem xét các thay đổi về giao diện. Lấy hai phiên bản và so sánh
instructionscủa chúng để xem bản nâng cấp đã thêm hoặc xóa những gì. Xem ví dụ tại Liệt kê các phiên bản IDL.
Định dạng IDL
Phản hồi là tài liệu IDL đúng như được lưu trữ. Các chương trình trong danh mục sử dụng một trong hai định dạng Anchor và các phiên bản của cùng một chương trình có thể sử dụng cả hai. Hãy kiểm tra định dạng bạn nhận được trước khi đọc:| Anchor cũ (trước 0.30) | Anchor 0.30+ | |
|---|---|---|
| Tên và phiên bản chương trình | name và version ở cấp cao nhất | metadata.name và metadata.version |
| Địa chỉ chương trình | Không có address ở cấp cao nhất | address ở cấp cao nhất |
| Bộ phân biệt lệnh | Không được bao gồm | instructions[].discriminator |
| Cờ tài khoản của lệnh | isMut, isSigner | writable, signer |
instructions. Hầu hết IDL cũng có accounts, types và errors; nhiều IDL còn có events.
Credit
Mỗi yêu cầu tốn 10 credit và khả dụng trong tất cả các gói. Xem Credit.Lỗi
| Trạng thái | Khi nào |
|---|---|
400 | programId không phải là địa chỉ base58 hợp lệ hoặc slot không phải là số nguyên 64 bit không dấu. |
401 | API key bị thiếu hoặc không hợp lệ. Nội dung phản hồi là văn bản thuần túy: Unauthorized. |
404 | Danh mục không có IDL cho chương trình hoặc không có phiên bản nào có hiệu lực tại hoặc trước slot. |
error, chẳng hạn như {"error": "no IDL found for program KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD at or before slot 1"}.
Tham số yêu cầu
slot từ Liệt kê các phiên bản IDL để lấy chính xác phiên bản đó hoặc truyền slot của một giao dịch để lấy IDL có hiệu lực khi giao dịch được thực thi.Ủy quyền
Tham số đường dẫn
Địa chỉ chương trình, được mã hóa bằng base58.
"KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD"
Slot cần tra cứu. Slot này không cần khớp với slot kích hoạt của một phiên bản. Truyền một slot từ Liệt kê các phiên bản IDL để lấy chính xác phiên bản đó, hoặc slot của một giao dịch để lấy IDL có hiệu lực khi giao dịch được thực thi.
x >= 0205509752
Phản hồi
Tài liệu IDL được trả về đúng như khi lưu trữ. Cả định dạng Anchor cũ và định dạng Anchor 0.30+ đều có thể xuất hiện, vì vậy hãy kiểm tra định dạng đã nhận trước khi đọc.
Một tài liệu IDL, được trả về đúng như khi lưu trữ. Có hai định dạng:
- Anchor cũ (trước 0.30): có
namevàversionở cấp cao nhất. Các tài khoản của lệnh sử dụngisMutvàisSigner. - Anchor 0.30+: có
addressvàmetadata(name,version,spec,description) ở cấp cao nhất. Các lệnh chứa mộtdiscriminator, còn tài khoản của lệnh sử dụngwritablevàsigner.
Cả hai định dạng đều có instructions. Hầu hết IDL cũng có accounts, types và errors; nhiều IDL còn có events. Các phiên bản của cùng một chương trình có thể sử dụng các định dạng khác nhau.
Trang này có hữu ích không?
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"
}
]
}