키드 논스·최근 루트, 프라이버시 거래의 두 걸림돌 제거
Strawmap Hegotá (2027) · keyed nonces & recent roots
새 거래 형식인 프레임 트랜잭션(EIP-8141)에 두 장치를 더합니다. 발신 주소 하나에 여러 번호표 줄을 두어 관계없는 거래가 기다리지 않게 합니다. 또 앱이 최근 기록한 요약값인 머클 루트(Merkle root)를 거래 대기열 검증 단계에서 확인할 수 있게 합니다.
왜 필요한가
제안된 프레임 트랜잭션은 보내는 주소마다 논스(nonce, 거래 일련번호)를 하나만 쓰므로 앞 거래가 늦어지면 같은 주소의 뒤 거래는 모두 기다려야 합니다. 프라이버시 앱은 활동이 특정 주소에 묶이지 않도록 여러 사용자가 공용 발신 주소 하나를 쓰는데 논스가 하나뿐이면 이 주소가 병목이 됩니다. 한 사용자의 거래가 블록에 들어가면 관련 없는 다른 사용자의 대기 중 출금이 전부 무효가 됩니다. 또 하나, 프레임 트랜잭션은 공개 멤풀(mempool, 거래 대기열)에서 검증될 때 다른 앱의 저장소를 읽지 못합니다. 그 값은 언제든 바뀔 수 있기 때문입니다. 그런데 프라이버시 앱은 최근 커밋먼트(commitment) 트리 루트로 지출을 증명해야 합니다. 키드 논스는 번호표 줄을 여러 개로 나눠 첫 문제를, 최근 루트는 리오그(reorg, 체인 재정렬)가 아니면 바뀌지 않는 표준 저장소에 루트를 두어 둘째 문제를 풉니다. 두 제안은 2026년 7월 ACDE에서 헤고타 후보로 접수돼 9월 포함 검토(CFI)로 올라갔고 10월에는 bogota-devnet-1에 넣기로 했습니다. Strawmap의 헤고타(Hegotá) 칸은 예상일 뿐 확정이 아닙니다.
어떻게 동작하나
- 번호표 줄을 여러 개로 나눕니다 거래의 논스 자리에 논스 키 목록(최대 16개)과 순번을 넣습니다. 키가 겹치지 않는 거래는 서로 순서를 기다리지 않습니다. 키 목록이 비어 있으면 지금처럼 계정 논스를 씁니다. 키별 순번은 프로토콜이 전용 컨트랙트 저장소에 직접 기록합니다.
- 한 번만 쓰는 키도 지원합니다 순번을 최댓값으로 보내면 선택한 키가 모두 미사용이어야 하고 쓰이면 그 키는 소진됩니다. 썼다는 표시를 남겨야 하는 널리파이어(nullifier)처럼 한 번만 써야 하는 값에 맞춘 형태입니다. 이 검사는 어떤 프레임도 실행되기 전에 합니다.
- 앱이 최근 루트를 표준 컨트랙트에 적습니다 앱은 표준 컨트랙트에 salt(구분값)와 루트를 보내 그 슬롯(slot, 합의 계층의 시간 단위) 칸에 기록합니다. 쓰는 주체는 호출 주소와 salt로 구분되고 주체마다 8192칸을 돌려 씁니다. 저장값에 주체와 슬롯이 함께 들어가 옛 루트로는 통과하지 못합니다.
- 거래는 지난 슬롯의 루트만 가리킵니다 슬롯 S에 적은 루트는 S+1부터 가리킬 수 있습니다. 참조할 수 있는 창은 현재 슬롯을 뺀 8191슬롯입니다. 전용 VERIFY 프레임이 이를 검사합니다. 리오그가 아니면 값이 바뀌지 않으니 노드가 멤풀에서 미리 확인하고 색인해도 안전합니다.