최근 블록해시는 짧은 유효 창 안에 제출할 일반 거래에 쓰이고, durable nonce는 별도 nonce 계정의 값을 사용해 오프라인·다중 서명 시간을 확보한다. durable nonce가 무기한 재사용권을 주는 것은 아니다. nonce를 advance하거나 소비하면 같은 서명 거래는 더 이상 유효하지 않으며, 메시지를 바꿨다면 모든 서명을 다시 받아야 한다.
최근 블록해시는 왜 거래에 들어가나
솔라나 거래 메시지는 최근 블록해시를 포함한다. 검증자는 해당 해시가 BlockhashQueue 안의 처리 가능 범위에 있는지 보고 지나치게 오래된 거래를 거부한다. 이 장치는 과거에 서명한 같은 메시지가 계속 제출되는 것을 막지만, 서명 수집과 제출을 짧은 시간 안에 끝내야 한다는 제약도 만든다.
RPC의 lastValidBlockHeight는 거래가 언제까지 처리될 수 있는지 판단하는 기준이다. 단순한 벽시계 초 수로 환산한 값은 슬롯 속도와 네트워크 상태에 따라 달라질 수 있다. 지갑 화면의 예상 만료 시각보다 사용한 blockhash와 lastValidBlockHeight를 묶어 기록해야 한다.
nonce는 시간을 없애는 장치가 아니라 거래의 일회성을 다른 상태로 옮기는 장치다.
JOBCOIN 해설
durable nonce가 바꾸는 유효성 기준
durable nonce 거래는 최근 블록해시 대신 System Program이 소유한 nonce 계정의 저장 값을 메시지에 넣는다. 검증자는 nonce 계정이 초기화됐는지, 저장된 값이 거래의 recent_blockhash 필드와 맞는지, nonce authority가 서명했는지를 확인한다. 유효하면 nonce 값을 다음 값으로 진행시켜 같은 거래의 재실행을 막는다.
nonce 계정에는 임대 면제에 필요한 잔액이 있어야 하고 authority가 계정을 관리한다. 송금 자산의 소유자, 수수료 납부자, nonce authority는 서로 다른 계정일 수 있다. 세 역할을 하나로 가정하면 서명 누락이나 운영 권한 집중을 놓치기 쉽다.
두 방식의 실패 조건 비교
최근 블록해시 거래는 유효 창이 지나면 만료된다. durable nonce 거래는 대기 시간이 길어도 제출할 수 있지만, 다른 거래가 같은 nonce를 먼저 advance했거나 관리자가 nonce 계정을 닫고 잔액을 회수했다면 실패한다. 둘 다 이미 서명한 메시지 일부를 고쳐 되살릴 수는 없다.
| 항목 | 최근 블록해시 | durable nonce |
|---|---|---|
| 유효성 근거 | BlockhashQueue와 lastValidBlockHeight | nonce 계정에 저장된 현재 값 |
| 주요 용도 | 온라인 지갑의 즉시 제출 | 오프라인·다중 서명 수집 |
| 대표 실패 | 블록해시 만료 | nonce 선소비 또는 authority 서명 누락 |
| 복구 | 새 메시지 작성 후 전원 재서명 | 새 nonce로 메시지 작성 후 전원 재서명 |
다중 서명에서 메시지를 얼리는 순서
서명을 요청하기 전에 프로그램 명령, 계정 목록, 금액, fee payer, nonce 값과 advance 명령을 확정한다. 직렬화된 메시지 바이트가 서명 대상이므로 금액을 그대로 두고 수수료 납부자만 바꾸어도 모든 기존 서명이 무효가 된다. 일부 서명된 거래를 역직렬화한 뒤 수정하는 흐름을 피해야 한다.
가정 예시로 세 명 중 두 명이 승인하는 금고가 하루 동안 서명을 모은다고 하자. durable nonce로 메시지를 만든 뒤 다른 운영 거래가 같은 nonce 계정을 먼저 사용하면 마지막 서명을 받아도 제출할 수 없다. 이 예시는 구조 설명이며 실제 운영에서는 nonce 계정 분리, 변경 로그, 제출 직전 상태 재확인이 필요하다.
- nonce 계정 주소와 authority를 독립적으로 기록한다
- 서명 전 메시지 해시와 required signer 목록을 배포한다
- 수집된 각 서명을 고정된 메시지 바이트로 검증한다
- 제출 직전 nonce 계정의 현재 값이 서명 메시지와 같은지 확인한다
- 소비·만료 오류가 나면 메시지를 새로 만들고 전원 재서명한다
재전송과 중복 제출을 구별하는 법
네트워크 응답이 끊겼다고 즉시 새 거래를 만들면 첫 거래와 두 번째 거래가 모두 처리될 가능성을 검토해야 한다. 먼저 원래 서명의 상태를 조회하고, 최근 블록해시 거래라면 유효 높이까지 기다릴지 결정한다. durable nonce 거래는 nonce가 이미 진행됐는지와 원래 서명이 체인에 보이는지를 함께 확인한다.
AlreadyProcessed는 같은 메시지가 상태 캐시에 있다는 뜻이며 단순 수수료 부족과 다르다. blockhash not found는 일반 거래의 만료일 수도 있고 durable nonce 값 불일치일 수도 있다. 오류 문자열 하나만으로 결론 내리지 말고 메시지 유형과 계정 상태를 대조한다.
운영 기록과 권한 분리
오프라인 서명 절차에는 생성 시각, 클러스터, 메시지 해시, nonce 계정, 당시 nonce 값, authority, fee payer, 서명자별 수집 상태를 남긴다. 제출 담당자는 서명 내용을 바꾸지 않고 직렬화된 거래 그대로 전송해야 한다. nonce를 갱신하는 별도 작업도 변경 기록에 포함한다.
durable nonce는 키 보안을 대신하지 않는다. 오래 유효한 서명 파일이 노출되면 nonce가 소비되기 전까지 제출될 수 있으므로 암호화 저장, 접근 통제, 폐기 절차가 필요하다. 특정 거래의 성공이나 자산 안전을 보증하는 기능으로 해석하지 않는다.
자주 묻는 질문
durable nonce 거래는 영원히 유효한가요?
아니다. 해당 nonce가 다른 거래로 진행되거나 계정 상태가 바뀌면 기존 거래는 무효가 된다.
블록해시만 새것으로 바꾸면 기존 서명을 쓸 수 있나요?
블록해시는 서명 메시지에 포함된다. 값을 바꾸면 메시지 바이트가 달라지므로 필요한 모든 서명을 다시 받아야 한다.
nonce authority가 송금 자산 소유자여야 하나요?
반드시 같을 필요는 없다. nonce 진행 권한, 자산 지출 권한, 수수료 납부자는 서로 다른 역할이며 각각 필요한 서명이 충족돼야 한다.



