
지속형 nonce: 솔라나의 두 기기 서명
SSP는 2-of-2 지갑입니다. 모든 거래에는 두 개의 서명이 필요합니다. 하나는 컴퓨터의 브라우저 확장 프로그램 Wallet에서, 다른 하나는 휴대폰의 SSP Key에서 옵니다. 바로 이 설계가 핵심입니다. 한 기기를 훔친 도둑도 그것만으로는 당신의 자금을 옮길 수 없습니다. 하지만 여기에는 매우 인간적인 문제가 생깁니다. 컴퓨터는 거래를 1초도 안 되는 사이에 만들고 서명합니다. 휴대폰은 그로부터 2~3분 뒤에야 공동 서명할 수도 있습니다. 사람이 휴대폰을 집어 들고, 요청을 살펴보고, 승인을 눌러야 하기 때문입니다.
솔라나에서는 이 간격이 문제입니다. 이 글은 그 이유와, SSP가 깨지기 쉬운 것을 하나도 저장하지 않고 어떻게 이를 해결하는지 설명합니다.
만료되는 블록해시
모든 일반적인 솔라나 거래는 최근 블록해시라는 데이터를 지니고 있습니다. 이것은 체인의 최근 블록의 지문이며, 동시에 두 가지 일을 합니다. 거래가 최근에 만들어졌음을 증명하고, 같은 서명된 거래가 영원히 재생되는 것을 막습니다.
함정은 최근이라는 단어에 있습니다. 블록해시는 약 150블록 동안만 유효합니다. 솔라나에서는 블록이 빠르게 생성되므로 150블록은 겨우 60~90초 정도입니다. 그 창이 지나면 네트워크는 거래를 그대로 거부합니다. 서명에 문제가 있어서가 아니라, 블록해시가 낡았기 때문입니다.
이제 SSP의 서명 흐름을 이 시계에 맞대어 보십시오. Wallet이 거래를 만들고, 새 블록해시를 고정하고, 서명합니다. 그다음 사용자의 휴대폰으로 알림이 갑니다. 90초 안에 응답하면 괜찮습니다. 회의 중이거나, 휴대폰이 다른 방에 있거나, 단순히 거래를 차분히 읽고 싶다면 블록해시는 조용히 죽습니다. Wallet의 서명은 여전히 암호학적으로 유효하지만, 그 서명이 붙어 있던 거래는 이제 쓸모가 없습니다. 모든 것을 처음부터 다시 만들고 다시 서명해야 합니다.
서명하고 한 호흡에 전파하는 단일 서명자 지갑에게 90초의 창은 넉넉합니다. 두 서명 사이에 사람이 서 있는 2-of-2 지갑에게는, 사용자가 거듭 지는 경주입니다.
지속형 nonce란 무엇인가
솔라나에는 이에 대한 내장된 답이 있고, 그것은 SSP보다 먼저 존재했습니다. 바로 지속형 nonce입니다. 발상은 만료되는 블록해시를 만료되지 않는 값으로 바꾸는 것입니다.
지속형 nonce는 체인 위 자기만의 작은 계정 안에 살아 있습니다. nonce 계정입니다. 이 계정은 시스템 소유이고, 단 80바이트의 데이터를 보관하며, 그중 하나가 nonce 값 자체입니다. 블록해시를 대신하는 오래 사는 대역입니다. 거래는 최근 블록해시 대신 nonce 계정의 값을 사용하도록 만들 수 있습니다. 그 값은 늙지 않으므로 거래는 필요한 만큼 오래 유효한 상태로 남습니다. 몇 분, 몇 시간, 며칠이라도요.
하지만 공짜는 없으며, nonce에는 재생에 대한 방어가 필요합니다. 그 방어는 하나의 규칙입니다. 지속형 nonce를 사용하는 모든 거래는 특정 명령어 nonceAdvance를 맨 첫 명령어로 지녀야 합니다. 거래가 마침내 체인에 안착하면 nonceAdvance는 현재 nonce 값을 소비하고 계정을 새 값으로 회전시킵니다. nonce는 일회용입니다. 월요일에 서명한 거래는 수요일까지 기다릴 수 있지만, 일단 실행되면 바로 그 nonce는 다시는 다른 거래를 승인할 수 없습니다. 솔라나가 직접 쓴 이 메커니즘 설명을 읽고 싶다면 지속형 거래 nonce 문서가 1차 자료입니다.
이렇게 지속형 nonce는 재생 위험을 사지 않으면서 시간을 삽니다. 이것이 바로 두 기기를 쓰는 지갑이 필요로 하는 성질입니다.
SSP의 비틀기: 결코 저장할 필요 없는 nonce 계정
지속형 nonce 계정도 결국 하나의 계정이며, 솔라나에서 모든 계정에는 주소가 있습니다. 순진한 접근은 어떤 무작위 주소에 nonce 계정을 만들고, 그 주소를 영원히 조심스럽게 기억하는 것입니다. 지갑의 로컬 저장소에 적어 두고, 백업하고, 기기 초기화에서 살아남기를 바라는 식이죠. 그것은 잃어버릴 수 있는 또 하나의 깨지기 쉬운 물건입니다.
SSP는 그것을 저장하기를 거부합니다. 대신 SSP의 솔라나 멀티시그 프로그램에는 provision_nonce라는 명령어가 들어 있고, 그것은 nonce 계정을 파생된 주소에 만듭니다. 주소는 결정론적 레시피에서 나옵니다. 멀티시그 계정 그 자체, 고정된 텍스트 라벨 "nonce", 그리고 솔라나의 시스템 프로그램으로부터 계산됩니다. 같은 멀티시그를 넣으면 같은 nonce 주소가 나옵니다. 매번 그렇습니다.
이것이 중요한 이유는 이 시리즈의 나머지가 이미 확립한 것 때문입니다. SSP의 솔라나 멀티시그는 멀티시그 주소를 구성원 집합으로부터 파생하고, 금고 주소를 멀티시그로부터 파생합니다. (이 파생들이 처음이라면 자가 초기화 솔라나 멀티시그 글이 하나씩 짚어 줍니다.) 이제 nonce 계정도 같은 가족에 합류합니다. 그것 역시 순수한 파생입니다. 어떤 SSP 기기든 — 당신의 컴퓨터, 당신의 휴대폰, 막 다시 설치한 지갑이든 — nonce 계정의 주소를 처음부터 다시 계산할 수 있습니다. 잃어버릴 비밀 주소가 없습니다. 애초에 저장된 주소가 하나도 없기 때문입니다.
이 설계에서 몇 가지 실무적 참고 사항이 따라옵니다. provision_nonce는 허가가 필요 없습니다(permissionless). 누구든 작은 임대료(약 0.00144 SOL)를 내어 nonce 계정을 존재하게 할 수 있고, 내는 사람이 그 초기 권한자가 됩니다. 실제로는 SSP relay의 페이마스터입니다. 그 권한은 나중에 계정 주소가 결코 바뀌지 않은 채로 재지정될 수 있어서, 오늘 당신이 파생한 주소는 그 뒤의 운영 키가 교체되어도 여전히 올바릅니다. nonce 계정의 위치는 그것에 자금을 댄 사람이 아니라 당신의 멀티시그에 닻을 내립니다.
차분한 서명 흐름
조각들을 모으면 경주는 사라집니다. Wallet은 최근 블록해시 대신 파생된 nonce 계정을 사용하는 거래를 만들고, nonceAdvance를 첫 명령어로 두고 서명합니다. 푸시 알림이 휴대폰으로 갑니다. 사용자는 준비되었을 때 언제든 승인합니다. 그를 향해 째깍대는 시계는 없습니다. SSP Key가 두 번째 서명을 더하고, 완전히 서명된 거래가 전파됩니다. 지속형 nonce 위에 만들어졌으므로 그것은 여전히 유효하며, nonceAdvance가 nonce를 회전시켜 거래가 재생되지 못하게 합니다.
이름을 짚어 둘 만한 제약이 하나 더 있습니다. 솔라나는 단일 거래를 1232바이트로 제한합니다. 멀티시그 거래는 구성원 목록과 지출 명령어를 그 한계 안에 담아야 하며, 그것이 SSP가 솔라나의 간결한 버전 거래 형식을 쓰고 데이터를 최대한 빽빽하게 전달하는 이유입니다. 지속형 nonce는 크기 예산을 바꾸지 않습니다. 시간 예산만 바꿉니다.
모든 것을 파생하고, 아무것도 저장하지 않는다
이것이 솔라나 멀티시그, SSP의 방식으로 시리즈 전체를 관통하는 실입니다. 멀티시그 주소, 당신의 자금을 담는 금고, 그리고 이제 두 기기에 합의할 시간을 주는 nonce 계정 — 그중 어느 것도 SSP가 저장하고 지켜야 하는 값이 아닙니다. 각각은 지갑이 이미 알고 있는 입력으로부터 필요할 때 다시 계산됩니다. 백업할 것이 더 적고, 새어 나갈 것이 더 적고, 기기 초기화에서 잘못될 것이 더 적습니다. 이 발상에 기대는 멀티시그 설계, 예컨대 SSP의 단일 서명자 멀티시그 접근은 대개 고장 날 움직이는 부품이 가장 적은 쪽입니다.
시리즈의 나머지와 같은 정직함의 정신으로 맺음말을 하나 답니다. SSP의 솔라나 멀티시그 프로그램은 현재 devnet에만 배포되어 있으며, 어떤 mainnet 출시 이전에도 외부 보안 감사를 기다리고 있습니다. 여기서 설명한 설계 — provision_nonce와 그 파생된 nonce 계정을 포함하여 — 는 실재하고 오픈 소스 프로그램에서 읽을 수 있지만, 아직 프로덕션 인프라는 아닙니다. SSP의 두 기기 모델 자체가 처음이라면 입문 글 2-of-2 멀티시그란 무엇인가가 시작하기 좋은 곳입니다.
지속형 nonce는 솔라나의 작고 오래된 배관 한 조각입니다. SSP의 기여는 그 주소를 당신이 결코 기억할 필요 없는 또 하나의 것으로 만드는 일입니다.


