직렬화된 Solana 트랜잭션이란 무엇인가요?
직렬화된 Solana 트랜잭션은 압축된 바이트 배열입니다. 개수 접두사가 붙은 64바이트 ed25519 서명 목록 뒤에 메시지가 오며, 메시지에는 헤더(서명자 수와 읽기 전용 계정 수), 32바이트 키로 된 계정 주소, 최근 blockhash, 그리고 각각 프로그램과 계정을 인덱스로 참조하는 명령들이 들어 있습니다. 지갑과 RPC 노드는 이를 base64 또는 base58로 주고받으며, 첫 번째 서명이 트랜잭션 ID 역할도 합니다.
결과 읽기
- 계정은 메시지 순서대로 나열됩니다: 서명자 먼저, 그다음 쓰기 가능, 그다음 읽기 전용. fee payer는 계정 0입니다.
- 명령은 프로그램, 디코딩된 이름과 필드를 표시하고, "계정 및 데이터" 아래에 정확한 계정 목록과 데이터 바이트를 보여줍니다.
- 상단의 전송은 무엇이 이동하는지 요약합니다: System Program을 통한 SOL, Transfer / TransferChecked를 통한 토큰.
Legacy vs. versioned (v0) 메시지
| 속성 | Legacy | v0 (versioned) |
|---|---|---|
| 메시지 접두사 | 없음; 헤더로 시작 | 헤더 앞에 0x80 버전 바이트 |
| 계정 | 1232바이트 한도까지 모두 인라인으로 나열 | 인라인 + address lookup table 인덱스 |
| 오프라인 해석 가능 | 예, 모든 계정이 메시지 안에 있음 | lookup table 항목은 온체인 데이터 필요 |
| 주요 생성 주체 | 단순 지갑, 구형 SDK | DEX 애그리게이터, 계정이 많은 모든 것 |
예시
SOL 전송 메시지에는 3개의 계정이 있습니다: 발신자(서명자, 쓰기 가능), 수신자(쓰기 가능), System Program 11111111111111111111111111111111. 단일 명령은 계정 인덱스 2를 가리키며 데이터는 02000000(명령 2 = Transfer, little-endian u32) 뒤에 little-endian u64 수량이 이어지므로, 00e1f50500000000은 100,000,000 lamports = 0.1 SOL입니다. USDC 전송은 대신 Token 프로그램을 대상으로 수량과 decimals = 6을 담은 TransferChecked 명령을 사용합니다.
지갑 프롬프트 확인하기
dApp이 서명을 요청하면 지갑은 보통 시뮬레이션을 표시합니다. 진실을 확인하고 싶다면 dApp에서 직렬화된 메시지를 로그로 출력해(대부분의 라이브러리는 transaction.serialize({ requireAllSignatures: false })를 제공) 여기에 붙여넣으세요. Compute Budget 설정과 시뮬레이션 요약이 숨길 수 있는 SetAuthority나 Approve를 포함한 모든 명령을 볼 수 있습니다.
관련 도구: Solana 주소 검증기, lamports 변환기, devnet 일괄 전송.