그린 체크를 받았어요. 그런데 방금 무슨 일이죠?
Source: Dev.to
위 링크에 있는 전체 글을 번역하려면, 번역하고 싶은 텍스트(코드 블록이나 URL을 제외한 본문)를 제공해 주세요.
제공해 주시면 원본 서식과 마크다운을 그대로 유지하면서 한국어로 번역해 드리겠습니다.
개요
devnet에서 처음으로 확인된 트랜잭션을 받았을 때, 나는 약 10초 정도 기분이 좋았다—그런 다음 실제로 무슨 일이 일어난 건지 전혀 몰랐다는 것을 깨달았다. 나는 트랜잭션을 블랙 박스처럼 다루고 있었다: 주소를 입력하고, 금액을 입력하고, 전송 버튼을 누르면 끝. 이런 접근 방식은 뭔가 잘못되었을 때나 기본 전송 이상의 무언가를 만들려고 할 때 바로 깨진다.
나는 파고들어 보니 Solana 트랜잭션은 네 부분으로 구성되어 있다는 것을 발견했다. 각각을 이해하면 다른 많은 개념들이 자연스럽게 연결된다.
Solana 트랜잭션의 네 부분
- Instructions – 수행하고자 하는 작업.
- Accounts – 어떤 데이터가 사용될지.
- Signatures – 권한 증명.
- Recent blockhash – 내장된 만료 스탬프.
명령어 (Instructions)
명령어는 바로 그 행동 자체입니다. 이 입력값으로 이 프로그램을 호출한다 라고 명시합니다.
기본 SOL 전송의 경우, 명령어는 Solana의 System Program을 호출합니다. System Program은 지갑 간 SOL 이동을 처리하는 내장 프로그램으로, 별도로 배포할 필요 없이 항상 존재합니다.
핵심 포인트: 하나의 트랜잭션에 여러 명령어를 포함할 수 있습니다. SOL을 전송하고, 계정을 생성하고, 다른 프로그램을 호출하는 작업을 모두 한 번에 수행할 수 있습니다. 트랜잭션은 전부‑또는‑전무 방식이며, 모든 명령어가 성공해야 트랜잭션이 완료되고, 하나라도 실패하면 전체가 롤백됩니다. 부분적인 결과는 없습니다.
계정 (Accounts)
Solana에서는 거의 모든 것이 계정입니다—지갑, 토큰 잔액, 배포된 프로그램 등. 네트워크 상태는 본질적으로 각 행에 주소와 데이터를 갖는 거대한 테이블이라고 볼 수 있습니다.
명령어를 작성할 때는 그 명령어가 접근할 모든 계정을 미리 선언해야 합니다. 읽기만 하더라도 마찬가지입니다. 또한 각 계정을 다음과 같이 표시합니다:
- Writable(쓰기 가능) 혹은 Read‑only(읽기 전용)
- Signer(서명 필요) 혹은 그렇지 않음
처음엔 번거롭게 느껴질 수 있지만, 이를 통해 Solana는 어떤 트랜잭션을 병렬로 실행할 수 있는지 판단합니다. 공유 계정이 없으면 충돌이 없으므로 동시에 처리할 수 있습니다. 이러한 병렬 처리 덕분에 Solana는 초당 많은 트랜잭션을 처리할 수 있습니다.
서명 (Signatures)
트랜잭션이 네트워크에 전파되기 전에 개인 키로 서명됩니다. 검증자들은 실행 전에 서명이 공개 키와 일치하는지 확인합니다. 서명 후 트랜잭션이 변조되면 서명이 맞지 않아 거부됩니다.
두 가지 중요한 점:
- 다중 서명이 가능합니다. 일부 프로그램은 양쪽 모두가 서명해야 하고, 멀티시그 설정에서는 최소한의 공동 서명자가 필요합니다.
- 서명 자체가 트랜잭션 ID입니다. Explorer URL에 보이는 긴 문자열은 별도의 식별자가 아니라 암호학적 서명이며, 동시에 권한 증명의 역할도 합니다.
최신 블록해시 (Recent Blockhash)
모든 트랜잭션은 최근에 생성된 블록의 해시인 최신 블록해시를 포함해야 합니다. 이는 두 가지 역할을 합니다:
- 재전송 방지 – 누군가가 서명된 트랜잭션을 나중에 다시 제출하는 것을 막습니다. 블록해시는 트랜잭션을 특정 시점에 묶어두므로, 오래된 해시를 참조하면 네트워크가 거부합니다.
- 만료 – 블록해시는 약 150 블록(≈ 60–90 초) 동안만 유효합니다. 이 기간이 지나면 트랜잭션은 무효가 되고, 다시 시도하려면 새로운 블록해시가 필요합니다.
이는 전통적인 Web2 데이터베이스 트랜잭션과 큰 차이점이며, 전통적인 트랜잭션은 절대 만료되지 않습니다. Solana 트랜잭션을 만료일이 있는 서명된 수표로 생각하면 됩니다: 서명은 유효하지만 짧은 시간 창 안에서만 사용할 수 있습니다.
실용 팁: 블록해시는 가능한 한 늦게, 즉 트랜잭션을 보내기 직전에 가져오세요.
모두 합쳐 보기
Solana 트랜잭션은 단순한 요청이 아니라, 서명된, 시간 제한이 있는, 전부 혹은 전무 번들이며, 네트워크에 전송되기 전에 자체 인증 및 만료 시간을 선언합니다.
Solana Explorer에서 devnet 트랜잭션을 열면 다음을 확인할 수 있습니다:
- Account Inputs – 모든 계정이 표시되며, 쓰기 가능 또는 읽기 전용으로 라벨링됩니다
- Instructions – 각 명령이 프로그램 및 데이터와 함께 확장되어 표시됩니다
- Signatures – 페이지 하단에 표시됩니다
보이는 내용을 위의 네 부분에 대응시켜 보세요. 화면에 표시된 트랜잭션이 직접 보낸 것인지, 단순히 살펴보는 것인지에 따라 레이아웃이 달라집니다.
결론
네 개의 구성 요소인 instructions, accounts, signatures, 그리고 recent blockhash가 정착되면, 이상하게 보였던 Solana의 많은 측면들이 이해되기 시작합니다. 이 이해는 제 #100DaysOfSolana 여정에서 중요한 단계입니다.