Skip to main content
Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →

IDL là gì

Các chương trình Anchor trên Solana công bố một tệp IDL (Interface Definition Language) mô tả các instruction, bố cục tài khoản, enum lỗi và schema struct của chúng. IDL là nguồn sự thật cho việc tạo mã client — TS SDK, crate CPI Rust và các client của bên thứ ba đều được tạo từ (hoặc viết tay dựa trên) nó. Raydium công bố IDL cho CPMM, CLMM và LaunchLab. AMM v4, Stable AMM và Farm (v3 / v5 / v6) ra đời trước Anchor hoặc không được phân phối bởi Anchor — cấu trúc tài khoản của chúng được duy trì thủ công trong SDK.

Nơi tìm chúng

IDL nằm trong một kho lưu trữ chuyên dụng:
Các tệp chính xác: Các tệp IDL được phiên bản trong lịch sử git của kho; ghim vào một commit cụ thể nếu bạn cần tái tạo byte-for-byte. Một số IDL cũng có thể được kéo trực tiếp từ mainnet:
Hiện có hai cơ chế IDL trên chuỗi, và các chương trình của Raydium được chia giữa chúng — điều này quan trọng vì một phiên bản Anchor CLI nhất định có thể chỉ biết về một:
CPMM không có tài khoản anchor:idl cũ. IDL của nó đã được di chuyển sang chương trình Program Metadata, vì vậy anchor idl fetch CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C sẽ thất bại trên bất kỳ Anchor CLI nào chỉ kiểm tra PDA cũ. Sử dụng IDL được gửi kèm với SDK hoặc đọc tài khoản metadata ở trên, cho đến khi CLI của bạn hỗ trợ chương trình metadata.
Cả ba tài khoản IDL cũ đều có thể ghi được bởi IDL authority 2XVnob28A5Qnpcy95UVeHWNT6G8Poy3tpA3AFyAMoZDt, tách biệt với BPF upgrade authority của các chương trình — vì vậy IDL có thể được làm mới mà không cần triển khai lại, và cũng có thể chậm hơn một lần triển khai. Coi IDL trên chuỗi là một tiện lợi, không phải là bằng chứng về hình dạng bytecode được triển khai.

Tái tạo client TypeScript

Codegen của Anchor tạo ra một client được gõ từ IDL:
Hầu hết các nhà tích hợp không làm điều này — họ sử dụng trợ giúp raydium.cpmm.swap(...) cấp cao hơn, bao bọc các phương thức Anchor cộng với tất cả công việc kế toán (tạo ATA, điều chỉnh phí chuyển, ngân sách tính toán, định tuyến chương trình Token-2022). Chỉ tái tạo khi bạn cần một lớp dưới SDK.

Tái tạo client Rust (crate CPI)

Raydium công bố các crate Anchor cho các chương trình có IDL:
Trong mã, hãy tham chiếu chúng bằng tên lib của chúng, raydium_cp_swap và raydium_clmm. Không có crate nào được gọi là raydium_amm_v3 dưới bất kỳ cách viết nào. Lưu ý các nhánh khác nhau: raydium-cp-swap của master vẫn ghim anchor-lang 0.32.1, vì vậy tích hợp Anchor-1.0 cần chore/upgrade-anchor; CLMM ở 0.32.1 dù sao, đó là lý do tại sao hai crate không thể chia sẻ. Tính năng cpi hiển thị các struct tài khoản cpi::accounts::<Ix> và các invoker cpi::<ix>() — các wrapper CPI sẵn sàng sử dụng. Xem sdk-api/rust-cpi để xem các mẫu sử dụng. Nếu bạn thích tạo binding mới:

Tái tạo client Python

Không có SDK Python chính thức của Raydium. Các trình tạo của bên thứ ba bao gồm:
  • anchorpy — Cổng Python của client TypeScript của Anchor. Tạo các method builder được gõ từ IDL.
  • solders — các nguyên thủy Solana cấp thấp (giao dịch, keypair, pubkey) trong binding Rust; được sử dụng bên dưới anchorpy.
Xem sdk-api/python-integration để xem hướng dẫn đầy đủ hơn.

Chính sách thay đổi IDL

Raydium tuân theo các quy tắc này để ổn định IDL:
  1. Các discriminator instruction không bao giờ thay đổi. Thêm instruction mới mở rộng enum ở cuối; các discriminator hiện có vẫn ổn định.
  2. Kích thước tài khoản ổn định; các trường mới đến từ padding dự trữ. Mỗi struct trạng thái Raydium mang một vùng padding ở cuối được định kích thước khi tạo, và một trường mới được tạo ra từ padding đó thay vì được nối thêm — vì vậy độ dài byte của tài khoản và các offset của tất cả các trường đã tồn tại trước đó vẫn cố định. Hệ quả là các byte bạn trước đó đọc là padding có thể trở nên có ý nghĩa, và một trường có thể được loại bỏ trở lại padding (như PlatformConfig.curve_params trong bản phát hành 2026-08-31). Đọc lại định nghĩa struct sau khi nâng cấp; không giả định padding vẫn bằng không.
  3. Các mã enum lỗi chỉ được nối thêm. Một mã lỗi hiện có luôn có nghĩa là điều tương tự.
  4. Các thay đổi phá vỡ được gửi trong các chương trình mới. Khi cần thiết kế lại, nhóm triển khai một ID chương trình mới (ví dụ: CPMM như một chương trình mới thay vì nâng cấp AMM v4). Các pool cũ tiếp tục chạy trên chương trình cũ; các pool mới đi đến chương trình mới.
Chính sách này giữ cho các client được tái tạo hầu như tương thích ngược: một client được tạo dựa trên IDL cũ hơn tiếp tục giải mã các trường nó biết, ở các offset nó biết. Điều nó sẽ không thấy là một trường được tạo ra từ những gì nó vẫn coi là padding — và, trong trường hợp loại bỏ hiếm gặp, một trường nó giải mã có thể không còn được viết. Nó không thấy “các byte ở cuối thừa”: độ dài tài khoản không thay đổi.

Phải làm gì khi IDL thay đổi

  1. Cập nhật SDK. npm update @raydium-io/raydium-sdk-v2.
  2. Tái tạo mã client của bạn nếu bạn sử dụng Anchor codegen trực tiếp.
  3. So sánh bố cục tài khoản. Các trường ở cuối của bố cục mới là điều duy nhất mã của bạn chưa thấy; xác nhận xem bạn có cần chúng không.
  4. Không giả định các discriminator instruction cũ không hợp lệ. Theo quy tắc 1, chúng vẫn hoạt động.
  5. Chạy lại các bài kiểm tra tích hợp trên devnet trước khi triển khai đến mainnet.

Khắc phục sự cố IDL

Lỗi “Invalid discriminator”

Thường có nghĩa là một client được xây dựng dựa trên phiên bản N của IDL đang cố gọi một instruction chỉ tồn tại trong phiên bản chương trình trước triển khai. Kéo lại IDL từ chương trình trực tiếp:
Đối với CPMM, điều này sẽ không hoạt động — xem bảng vị trí IDL ở trên; thay vào đó kéo IDL được gửi kèm với SDK.

Lỗi giải mã tài khoản

Nếu program.account.<Name>.fetch(pubkey) ném lỗi với “Invalid account discriminator”, tài khoản được tạo bởi phiên bản chương trình trước đó và Anchor đang từ chối discriminator 8 byte của nó. Cách khắc phục là sử dụng trình phân tích bố cục thô từ SDK (PoolInfoLayout.decode(accountData)) không thực thi các discriminator Anchor.

Các instruction bị thiếu trong client được tạo

Codegen TS của Anchor chỉ tạo các phương thức cho các instruction có mục nhập IDL có name được phân tích cú pháp dưới dạng một định danh hợp lệ. Tất cả các instruction của Raydium đều thỏa mãn điều này, nhưng nếu bạn thấy sự không khớp, hãy kiểm tra xem tệp IDL có phải từ bản phát hành SDK hiện tại không.

Con trỏ

Nguồn: