Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
Raydium의 최신 프로그램(CPMM, CLMM, Farm v6, LaunchLab)은 Anchor로 작성되었습니다. Anchor는 Solana의 네이티브 프로그램 모델 위에 계정 검증, 에러 처리, IDL(인터페이스 설명)을 제공하는 Rust 프레임워크입니다. AMM v4와 이전 버전의 Farm은 Anchor 이전에 작성되었습니다. 두 패러다임을 모두 이해하면 코드를 읽고, IDL에서 클라이언트를 생성하고, 예상치 못한 에러를 디버깅하는 데 도움이 됩니다.

프로그램 배포 모델

모든 Solana 프로그램은 Pubkey에 위치합니다. 프로그램의 바이트코드는 BPF Upgradable Loader(BPFLoaderUpgradeab1e11111111111111111111111)가 소유한 실행 가능한 계정에 저장됩니다. 프로그램 배포는 세 개의 계정으로 구성됩니다:
  1. Program 계정: 프로그램 ID에 위치한 작은 메타데이터 계정입니다. 소유자: BPF Upgradable Loader.
  2. ProgramData 계정: 실제 바이트코드를 보유합니다. [program_id, "programdata"]로 파생됩니다.
  3. Buffer 계정(임시): 업그레이드 중에 새 바이트코드를 보유합니다. 업그레이드 후 폐기됩니다.
ProgramData 계정은 업그레이드 권한을 가지고 있습니다. 이는 바이트코드를 새 버전으로 교체할 수 있는 키입니다. Raydium의 업그레이드 권한은 24시간 타임락 뒤의 멀티시그입니다. security/admin-and-multisig를 참조하세요.

배포된 프로그램 검증

온체인 프로그램이 감사 승인된 소스와 일치하는지 확인하려면:
해시가 일치하면 상호작용하는 프로그램이 예상한 소스임을 증명합니다. Raydium은 릴리스 노트에 검증된 빌드 지침을 게시합니다.

Anchor: Solana 위의 프레임워크

원시 Solana 프로그램은 다음 서명을 가진 Rust 함수입니다:
Anchor는 모든 보일러플레이트를 래핑하고 다음과 같이 작성할 수 있게 합니다:
Anchor는:
  • 각 명령어와 각 계정 타입에 대해 결정론적 8바이트 discriminator를 자동 생성합니다.
  • 계정 제약 조건(소유자, 시드, 쓰기 가능, 서명자, 민트 일치, 토큰 프로그램 일치)을 코드 실행 전에 검증합니다.
  • 클라이언트가 프로그램을 호출하는 데 사용하는 IDL — 인터페이스 설명 파일을 생성합니다.
  • Rust, TypeScript, Python 클라이언트 라이브러리와 함께 제공됩니다.

8바이트 discriminator

모든 Anchor 계정과 모든 Anchor 명령어는 8바이트 discriminator로 시작합니다. 이는 고정 문자열의 SHA-256의 첫 8바이트입니다:
Anchor 명령어를 호출할 때, 명령어 데이터의 첫 8바이트는 이 discriminator입니다. Anchor는 이를 조회하여 올바른 핸들러로 디스패치합니다. Anchor 계정을 읽을 때, 첫 8바이트는 그 타입을 알려줍니다. 이는 getProgramAccounts와 같은 타입의 모든 계정을 열거하는 도구에 중요합니다.

에러

Anchor 프로그램은 #[error_code]를 통해 에러를 정의합니다:
Anchor는 6000(0x1770)부터 시작하여 이들 숫자 코드를 자동 할당합니다. Raydium의 전체 에러 코드 테이블은 reference/error-codes에 있습니다.

IDL

Anchor IDL(Interface Description Language) 파일은 프로그램의 JSON 설명입니다: 명령어, 계정, 타입, 에러, 이벤트입니다. 이는 Ethereum ABI와 동등합니다. Raydium은 모든 Anchor 프로그램에 대해 IDL을 게시합니다. 온체인에서 라이브로 가져오세요:
또는 SDK 소스에서: src/raydium/*/idl/*.json.

IDL 구조

IDL에서 클라이언트 생성

Anchor의 anchor CLI는 TypeScript와 Rust 타입을 생성합니다:
Codama와 같은 서드파티 도구는 IDL에서 Rust, Go, Python 또는 JavaScript 클라이언트를 생성할 수 있습니다. (Codama는 JavaScript 렌더러만 제공했던 Metaplex Kinobi의 후속입니다.)

IDL이 당신의 친구일 때

Raydium SDK를 거치지 않는 커스텀 통합을 구축하려면:
  1. IDL을 가져오세요(온체인에서 라이브로 또는 SDK 소스에서).
  2. 원하는 명령어를 찾으세요(예: swap_base_input).
  3. 명령어 데이터를 구성하세요: 8바이트 discriminator + 인코딩된 인자.
  4. 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 구조체 바이너리 레이아웃.
Raydium SDK v2는 Anchor가 아닌 AMM v4 명령어에 대한 TypeScript 레이아웃을 제공하므로 클라이언트는 Anchor 없이 인코딩/디코딩할 수 있습니다:
통합 패턴은 동일합니다. 단지 Anchor의 IDL 기반 자동 생성을 얻지 못할 뿐입니다.

프로그램 업그레이드 메커니즘

ProgramData의 upgrade_authority만 업그레이드할 수 있습니다. 단계:
  1. 새 바이트코드를 컴파일합니다.
  2. 버퍼 계정에 작성합니다(solana program write-buffer).
  3. 업그레이드 명령어를 제출합니다: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. 런타임은 프로그램의 바이트코드를 버퍼의 내용으로 원자적으로 교체합니다.
Raydium은 이를 Squads 멀티시그 설정에서 구현된 24시간 타임락 뒤에 게이트합니다. 업그레이드 트랜잭션은 멀티시그 승인 후 실행되기 전에 24시간을 기다려야 합니다. 이는 서두른 / 강압된 업그레이드로부터 보호합니다. 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하면 로그는 다음을 표시합니다:
0x1770 = 6000 십진수 = 첫 번째 Anchor 에러(예: SlippageExceeded). IDL의 errors 배열과 교차 참조하세요. Raydium의 전체 에러 테이블은 reference/error-codes를 참조하세요.

계정 레이아웃 불일치

잘못된 슬롯에 잘못된 계정을 전달하면 Anchor의 계정 검증 매크로는 다음과 같은 에러를 반환합니다:
6000 미만의 에러 번호는 Anchor의 내장 에러입니다(Anchor의 ErrorCode enum 참조). 6000 이상의 에러는 프로그램의 커스텀 코드입니다.

포인터

소스: