이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
Raydium의 최신 프로그램(CPMM, CLMM, Farm v6, LaunchLab)은 Anchor로 작성되었습니다. Anchor는 Solana의 네이티브 프로그램 모델 위에 계정 검증, 에러 처리, IDL(인터페이스 설명)을 제공하는 Rust 프레임워크입니다. AMM v4와 이전 버전의 Farm은 Anchor 이전에 작성되었습니다. 두 패러다임을 모두 이해하면 코드를 읽고, IDL에서 클라이언트를 생성하고, 예상치 못한 에러를 디버깅하는 데 도움이 됩니다.
프로그램 배포 모델
모든 Solana 프로그램은Pubkey에 위치합니다. 프로그램의 바이트코드는 BPF Upgradable Loader(BPFLoaderUpgradeab1e11111111111111111111111)가 소유한 실행 가능한 계정에 저장됩니다.
프로그램 배포는 세 개의 계정으로 구성됩니다:
- Program 계정: 프로그램 ID에 위치한 작은 메타데이터 계정입니다. 소유자: BPF Upgradable Loader.
- ProgramData 계정: 실제 바이트코드를 보유합니다.
[program_id, "programdata"]로 파생됩니다. - Buffer 계정(임시): 업그레이드 중에 새 바이트코드를 보유합니다. 업그레이드 후 폐기됩니다.
security/admin-and-multisig를 참조하세요.
배포된 프로그램 검증
온체인 프로그램이 감사 승인된 소스와 일치하는지 확인하려면:Anchor: Solana 위의 프레임워크
원시 Solana 프로그램은 다음 서명을 가진 Rust 함수입니다:- 각 명령어와 각 계정 타입에 대해 결정론적 8바이트 discriminator를 자동 생성합니다.
- 계정 제약 조건(소유자, 시드, 쓰기 가능, 서명자, 민트 일치, 토큰 프로그램 일치)을 코드 실행 전에 검증합니다.
- 클라이언트가 프로그램을 호출하는 데 사용하는 IDL — 인터페이스 설명 파일을 생성합니다.
- Rust, TypeScript, Python 클라이언트 라이브러리와 함께 제공됩니다.
8바이트 discriminator
모든 Anchor 계정과 모든 Anchor 명령어는 8바이트 discriminator로 시작합니다. 이는 고정 문자열의 SHA-256의 첫 8바이트입니다:getProgramAccounts와 같은 타입의 모든 계정을 열거하는 도구에 중요합니다.
에러
Anchor 프로그램은#[error_code]를 통해 에러를 정의합니다:
reference/error-codes에 있습니다.
IDL
Anchor IDL(Interface Description Language) 파일은 프로그램의 JSON 설명입니다: 명령어, 계정, 타입, 에러, 이벤트입니다. 이는 Ethereum ABI와 동등합니다. Raydium은 모든 Anchor 프로그램에 대해 IDL을 게시합니다. 온체인에서 라이브로 가져오세요:src/raydium/*/idl/*.json.
IDL 구조
IDL에서 클라이언트 생성
Anchor의anchor CLI는 TypeScript와 Rust 타입을 생성합니다:
IDL이 당신의 친구일 때
Raydium SDK를 거치지 않는 커스텀 통합을 구축하려면:- IDL을 가져오세요(온체인에서 라이브로 또는 SDK 소스에서).
- 원하는 명령어를 찾으세요(예:
swap_base_input). - 명령어 데이터를 구성하세요: 8바이트 discriminator + 인코딩된 인자.
- IDL이 지정한 순서대로 계정을 전달하세요.
sdk-api/anchor-idl를 참조하세요.
Anchor 이전 프로그램: AMM v4 및 Farm v3/v5
이 프로그램들은 Anchor 이전에 작성되었습니다. 이들은 다음을 사용합니다:- 수동 명령어 디스패치:
instruction_data의u8태그와match문. - 수동 계정 검증:
if accounts[0].owner != &expected_program { ... }. - Borsh 직렬화된 명령어 인자: discriminator 없음, 단지
instruction_data[1..]. #[repr(C, packed)]를 통한 레이아웃: C 구조체 바이너리 레이아웃.
프로그램 업그레이드 메커니즘
ProgramData의upgrade_authority만 업그레이드할 수 있습니다. 단계:
- 새 바이트코드를 컴파일합니다.
- 버퍼 계정에 작성합니다(
solana program write-buffer). - 업그레이드 명령어를 제출합니다:
BpfLoaderUpgradeable::Upgrade { buffer, program, authority }. - 런타임은 프로그램의 바이트코드를 버퍼의 내용으로 원자적으로 교체합니다.
security/admin-and-multisig를 참조하세요.
프로그램을 불변으로 만들기
업그레이드 권한을None으로 설정할 수 있으며, 이 시점에서 프로그램은 영구적으로 불변이 됩니다. Raydium은 어떤 제품에 대해서도 이를 수행하지 않았습니다. 팀은 보안 수정을 푸시할 수 있는 능력을 유지합니다. 트레이드오프: 사용자는 멀티시그 + 타임락 프로세스를 신뢰해야 합니다.
프로그램과 렌트
프로그램 배포는 렌트 면제 lamport를 소비합니다:- 50 KB 프로그램: 약 0.35 SOL의 렌트.
- 200 KB 프로그램: 약 1.4 SOL의 렌트.
solana program close) lamport가 반환됩니다. Raydium 프로그램은 활성 상태로 유지되며 폐기 예정이 아닙니다.
Anchor 프로그램 디버깅
로그 출력
Anchor의msg! 매크로는 트랜잭션의 로그에 씁니다. 트랜잭션을 시뮬레이션하여 로그를 확인하세요:
- 프로그램 호출(
Program CPMMoo8... invoke [1]). - 프로그램 코드의
msg!호출. - 컴퓨트 유닛 소비(
consumed 137842 of 400000 compute units). - 프로그램 성공 또는 에러.
에러 코드
Anchor 프로그램이 throw하면 로그는 다음을 표시합니다:SlippageExceeded). IDL의 errors 배열과 교차 참조하세요.
Raydium의 전체 에러 테이블은 reference/error-codes를 참조하세요.
계정 레이아웃 불일치
잘못된 슬롯에 잘못된 계정을 전달하면 Anchor의 계정 검증 매크로는 다음과 같은 에러를 반환합니다:ErrorCode enum 참조). 6000 이상의 에러는 프로그램의 커스텀 코드입니다.
포인터
solana-fundamentals/account-model— 프로그램이 계정을 소유하는 방식.solana-fundamentals/pdas-and-cpis— Anchor가 선언하는 PDA.sdk-api/anchor-idl— Raydium의 IDL 가져오기 및 사용.reference/program-addresses— 프로그램 ID.reference/error-codes— 에러 코드 참조.security/admin-and-multisig— 업그레이드 권한 제어.
- Anchor 문서.
- Solana 프로그램 배포.
- Raydium IDL(SDK
src/raydium/*/idl/*.json에 게시됨).

