Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
솔라나 트랜잭션은 원자적으로 실행되는 명령어 목록입니다. 트랜잭션 구조(명령어, 계정, 서명자, 컴퓨트 예산)를 이해하는 것은 레이디움으로 무엇이든 구축하고, 디버깅하고, 최적화하기 위한 필수 전제 조건입니다. 이 페이지에서는 그 구조, 제약 조건, 그리고 실제 스왑에서 두 가지 수수료 범주(솔라나 네트워크 수수료, 레이디움 프로토콜 수수료)가 어떻게 적용되는지 다룹니다.

트랜잭션 구조

솔라나 트랜잭션은 세 가지 핵심 구성 요소로 이루어져 있습니다:
  • 메시지: 순서대로 정렬된 명령어 목록, 명령어가 참조하는 계정, 그리고 최근 블록해시입니다.
  • 서명: 서명자당 하나씩, 트랜잭션이 승인되었음을 증명합니다.
  • 최근 블록해시: 트랜잭션이 최근 것임을 증명합니다. 오래된 블록해시(150개 슬롯 이상)를 가진 트랜잭션은 거부됩니다.

명령어

명령어는 다음을 지정합니다:
  • program_id — 호출할 프로그램입니다.
  • accounts — 프로그램이 접근할 수 있는 계정(및 쓰기 가능/서명자 플래그)입니다.
  • data — 프로그램이 해석하는 불투명한 바이트입니다.
단일 트랜잭션은 여러 명령어를 포함할 수 있습니다. 명령어는 순서대로 실행되며, 하나라도 실패하면 이전의 모든 명령어가 롤백됩니다(원자적). 일반적인 레이디움 스왑 트랜잭션에는 다음이 포함됩니다:
  1. ComputeBudget::SetComputeUnitLimit — 기본 CU 제한을 높입니다.
  2. ComputeBudget::SetComputeUnitPrice — 우선순위 수수료를 설정합니다.
  3. 선택사항 CreateAssociatedTokenAccount — 사용자가 없는 경우 출력 ATA를 생성합니다.
  4. Raydium::SwapBaseInput — 스왑을 실행합니다.
  5. 선택사항 CloseAccount — 래핑된 SOL ATA를 닫습니다.
SDK는 이를 자동으로 패킹합니다 — 풀 타입의 자체 빌더(raydium.cpmm.swap, raydium.clmm.swap, raydium.liquidity.swap)를 통해, 또는 멀티홉 경로의 경우 raydium.tradeV2.swap을 통해.

트랜잭션의 계정

트랜잭션의 모든 명령어가 접근하는 모든 계정은 트랜잭션의 계정 키 목록에 나열되어야 합니다. 각 계정에는 플래그가 지정됩니다:
  • 서명자/비서명자: 계정 소유자가 트랜잭션에 서명해야 하나요?
  • 쓰기 가능/읽기 전용: 트랜잭션이 계정을 수정할 수 있나요?
런타임은 이 플래그를 강제합니다: 읽기 전용 계정에 쓰려고 시도하는 프로그램은 실패하고, 런타임은 필수 서명자가 없는 트랜잭션을 거부합니다. CPMM 스왑의 경우 계정 목록에는 약 13개의 항목이 있습니다(solana-fundamentals/account-model 참조). 여러 틱 배열 교차가 있는 CLMM 스왑은 20개 이상일 수 있습니다.

트랜잭션 크기 제한

솔라나는 트랜잭션을 서명, 메시지, 헤더를 포함하여 1232바이트로 제한합니다. 이는 복잡한 트랜잭션의 가장 일반적인 장애물입니다 — 레이디움의 CLMM과 멀티홉 라우팅은 정기적으로 이 제한에 도달합니다. 일반적인 약 1000바이트 레이디움 스왑의 분석:

주소 조회 테이블(ALT)

ALT를 사용하면 트랜잭션이 전체 32바이트 공개 키 대신 게시된 테이블의 1바이트 인덱스로 계정을 참조할 수 있습니다. 이는 트랜잭션을 대폭 압축합니다:
  • 20개 계정을 직접 참조하는 트랜잭션: 공개 키 약 640 B.
  • ALT를 사용하는 동일한 트랜잭션: 인덱스 약 20 B + ALT 참조.
레이디움은 메인넷의 CPMM/CLMM 스왑 경로에 대한 ALT를 유지합니다. SDK는 자동으로 이를 사용합니다. 멀티홉 경로를 구축하는 애그리게이터는 이에 크게 의존합니다.

컴퓨트 예산

모든 트랜잭션에는 컴퓨트 유닛(CU) 예산이 있습니다. 이를 초과하면 실행이 종료되고 트랜잭션이 실패합니다.
  • 기본값: 트랜잭션당 200,000 CU.
  • 최대값: 트랜잭션당 1,400,000 CU (ComputeBudget::SetComputeUnitLimit을 통해 상향).
  • 블록당 상한: 블록당 48M CU (프로토콜 수준).
일반적인 레이디움 CU 소비(전체 표는 integration-guides/priority-fee-tuning 참조): 항상 ComputeBudget을 통해 명시적 CU 제한을 설정하세요. 그렇지 않으면 200k 기본값을 받게 되는데, 이는 대부분의 레이디움 명령어에 너무 낮습니다.
CU 제한을 너무 낮게 설정하면 제한에 도달할 때 트랜잭션이 실패합니다. 너무 높게 설정하면 혼잡 시 우선순위가 낮아질 위험이 있으며(가격 책정 모델에 따라) 사용하지 않은 컴퓨트에 대해 비용을 지불할 수 있습니다.

우선순위 수수료

기본 트랜잭션 수수료(서명당 5000 라모포트) 외에도 검증자는 점점 더 우선순위 수수료를 지불하는 트랜잭션을 우선시합니다: CU당 마이크로라모포트 단위의 팁입니다.
예: 10,000 µL/CU × 300,000 CU = 3,000,000 µL = 0.003 SOL. 우선순위 수수료는 로컬입니다 — 블록 내 순서에만 영향을 미칩니다. 포함될 가능성을 높이지는 않습니다. 혼잡 중에 합리적인 우선순위 수수료를 설정하는 것이 필수입니다.
이를 동적으로 크기 조정하는 방법은 integration-guides/priority-fee-tuning을 참조하세요.

명령어 개수 및 계정 개수 제한

1232바이트 총 제한 외에도:
  • 트랜잭션당 최대 계정: 128개.
  • 명령어당 최대 계정(CPI): 64개.
  • 트랜잭션당 최대 명령어: 하드 제한 없음, 크기 제한으로만 제한됨.
  • 최대 CPI 깊이: 4 (프로그램이 다른 프로그램을 호출할 수 있고, 그것이 다른 프로그램을 호출할 수 있으며, 4단계까지 깊음).
여러 틱 배열을 교차하는 레이디움 CLMM 스왑은 계정 제한에 대해 강하게 밀어붙일 수 있습니다 — 단일 스왑은 풀, 입력/출력 볼트, 입력/출력 ATA, 여러 틱 배열, 가능하면 전송 훅 프로그램의 추가 계정, 그리고 필수 컴퓨트 예산/시스템/토큰 프로그램 참조를 접근합니다. CPI를 통해 레이디움을 구성하는 설계(예: 자동 복합화)는 이를 고려해야 합니다.

레이디움 스왑의 수수료 범주

사용자 스왑 트랜잭션은 두 가지 범주의 수수료를 지불합니다:

솔라나 네트워크 수수료

검증자에게 SOL로 지불됩니다.
  • 기본 서명 수수료: 서명당 5000 라모포트. 거의 항상 1개 서명 = 0.000005 SOL.
  • 우선순위 수수료: CU 가격 × CU 제한(마이크로라모포트). 혼잡에 따라 변함. integration-guides/priority-fee-tuning 참조.
이 수수료는 검증자에게 가며, 레이디움과 무관하고, 실패한 트랜잭션에 대해서도 청구됩니다(일부 우선순위 수수료 엣지 케이스 제외).

레이디움 프로토콜 수수료

스왑 금액에서 공제됩니다.
  • 스왑 수수료: 입력의 백분율 (CPMM 일반적으로 0.25%, CLMM 0.01%–1% 티어별). LP와 프로토콜 목적지 간 분할. ray/protocol-fees 참조.
이 수수료는 레이디움의 회계 내부입니다 — 사용자는 이를 수수료 없는 풀이 생성할 것보다 더 작은 출력 금액으로 봅니다.

예: CPMM 0.25% 티어를 통한 $1000 USDC → SOL

슬리피지(가격 영향 + 시장 변동)는 수수료가 아니지만 동일한 최종 결과에 영향을 미칩니다.

버전 지정 트랜잭션

솔라나에는 두 가지 트랜잭션 형식이 있습니다:
  • 레거시: 원본 형식, ALT 지원 없음.
  • v0 (버전 지정): ALT 지원, 향후 버전으로 확장 가능.
모든 최신 솔라나 도구는 v0을 사용합니다. 레이디움 SDK는 기본적으로 v0 트랜잭션을 내보냅니다.

블록해시 신선도

트랜잭션은 최근 약 150개 슬롯(약 60초) 내의 블록해시를 포함해야 합니다. 그 범위를 벗어나면 검증자가 거부합니다. 재시도 루프의 경우 각 재시도에서 새로운 블록해시를 가져오세요:
상향 조정되는 수수료를 사용한 전체 재시도 패턴은 integration-guides/priority-fee-tuning을 참조하세요.

병렬 실행

솔라나는 멀티코어 검증자에서 충돌하지 않는 트랜잭션을 병렬로 실행합니다. 두 트랜잭션이 동일한 계정에 모두 쓰면 충돌합니다. 레이디움에 대한 의미:
  • 동일한 풀의 두 스왑은 병렬로 실행될 수 없습니다 — 둘 다 풀 상태에 씁니다.
  • 풀 A의 스왑과 풀 B의 스왑은 계정 목록이 겹치지 않으면 병렬로 실행됩니다.
  • 읽기 전용 트랜잭션은 동일한 계정의 쓰기 작업을 차단하지 않습니다(읽기 전용은 자신과 동시이지만 쓰기와는 동시가 아님).
이것이 솔라나가 단일 풀 직렬화에도 불구하고 높은 DEX 처리량을 유지할 수 있는 이유입니다.

트랜잭션 확인 수준

트랜잭션을 제출할 때 확인 수준을 선택합니다: 스왑 UX의 경우 confirmed가 표준입니다. 큰 가치를 처리하는 작업(풀 생성, 보상 충전)의 경우 finalized가 더 안전합니다.

시뮬레이션

솔라나는 제출 전에 트랜잭션을 시뮬레이션하는 것을 지원합니다:
레이디움 SDK는 getBestSwapInfo를 계산할 때 내부적으로 시뮬레이션을 사용하여 선택된 경로가 실제로 성공하는지 확인합니다. 시뮬레이션은 무료가 아닙니다 — RPC 용량을 소비합니다 — 하지만 비용을 지불하기 전에 오류를 포착합니다.

포인터

출처: