자체 초기화되는 Solana 멀티시그 지갑

·7분 읽기·작성자: SSP Editorial Team
SSP 브랜드의 짙은 남색 표지 위에 그려진 SSP 자체 초기화 Solana 멀티시그 지갑 도식

주소가 구성원 집합 자체인 Solana 멀티시그 지갑

멀티시그 지갑은 어떤 지출이든 승인하려면 두 개 이상의 키가 필요합니다. Bitcoin에서 지갑 주소는 단지 그 자신의 규칙, 즉 공개 키 목록과 "몇 개의 서명이 필요한가" 하는 숫자의 해시일 뿐입니다. 그 주소는 메모지 위에서도 계산할 수 있고, 나눠 줄 수 있으며, 누군가 블록체인에 손대기 훨씬 전에 자금을 받을 수 있습니다.

Solana는 전통적으로 이것을 하지 못합니다. 이 시리즈의 첫 번째 글에서 설명하듯, 주류 Solana 멀티시그는 지갑 주소가 존재하기도 전에 생성자가 고른 난수를 동반한 생성 트랜잭션을 실행하라고 요구합니다. SSP 자체의 Solana 멀티시그 프로그램은 대신 Bitcoin 방식을 취합니다. 그것은 자체 초기화형입니다. 지갑 주소가 구성원 집합입니다.

먼저 한 가지 알려 둡니다. SSP의 Solana 멀티시그 프로그램은 오픈 소스(RunOnFlux/Solana-Multisig)이며 현재 devnet에서만, 즉 Solana의 테스트 네트워크에서 동작합니다. 메인넷 배포는 외부 보안 감사에 달려 있습니다.

두 개의 주소: 멀티시그와 vault

SSP의 설계는 모든 멀티시그 지갑에 대해 두 개의 별도 주소를 사용합니다.

멀티시그 주소규칙을 담습니다. 정렬된 구성원 키 목록, 임계값("M-of-N"의 M), 그리고 제안된 트랜잭션의 카운터입니다. 이것은 SSP의 프로그램이 소유합니다.

vault 주소을 담습니다. SOL과 SPL 토큰입니다. Solana의 내장 System Program이 소유하며 자체 데이터를 저장하지 않습니다. vault가 입금 주소입니다. 당신에게 돈을 보내려는 사람에게 주는 주소가 바로 이것입니다.

둘 다 Program Derived Address, 즉 PDA라는 종류의 주소입니다. 개인 키가 없는 주소이며, 어떤 키도 결코 통제할 수 없도록 의도적으로 암호 곡선 바깥에 놓여 있습니다. 그것을 도출한 프로그램만이 그곳으로부터의 이동을 승인할 수 있습니다. 이 점은 마지막에 중요해집니다.

주소가 구성원으로부터 어떻게 계산되는가

바로 이 부분이 지갑을 자체 초기화형으로 만듭니다. 멀티시그 주소를 도출하는 방법을 쉬운 말로 하면: 글자 그대로의 라벨 multisig, 정렬된 구성원 목록의 SHA-256 해시, 그리고 임계값을 취하고, 이것들을 SSP의 프로그램 ID와 함께 Solana의 주소 도출 함수에 넣습니다. 세 가지 세부 사항이 주목할 만합니다.

구성원은 먼저 정렬되고 중복이 제거됩니다. 구성원 A, B, C로 이루어진 2-of-3 지갑은 그들을 C, A, B로 나열하든 B, C, A로 나열하든 정확히 같은 주소를 만듭니다. 순서는 중요하지 않으며, 오직 집합만이 중요합니다.

완전한 32바이트 해시가 사용되며, 줄인 버전은 결코 사용되지 않습니다. 해시를 잘라내면 실제 공격이 열립니다. 공격자는 같은 줄인 값으로 해시되는 다른 구성원 집합을 찾아낸 다음, 당신의 주소에 자신의 구성원을 등록하고 당신이 미리 넣어 둔 자금을 빼낼 수 있습니다. 완전한 32바이트 해시는 그러한 탐색을 천문학적으로 비싸게 만들기 때문에, 그런 일은 결코 일어나지 않습니다.

임계값은 주소의 일부입니다. 정확히 같은 구성원을 가진 2-of-3 지갑과 3-of-3 지갑은 서로 다른 주소에 있는 서로 다른 지갑입니다. 규칙이 정체성에 새겨져 있습니다.

vault 주소는 그다음 멀티시그 주소에 작은 인덱스 번호를 더해 도출됩니다(SSP는 항상 인덱스 0을 사용합니다). 따라서 vault 역시 구성원 집합과 임계값에 의해 전적으로 결정됩니다.

실질적인 결과는 이렇습니다. 누구나, 단 한 건의 트랜잭션을 보내기도 전에, 두 주소를 모두 오프라인으로 계산할 수 있습니다. vault 주소를 나눠 주고, 체인상으로는 아직 존재하지 않는 지갑으로 자금을 받을 수 있습니다. Bitcoin의 속성이 Solana로 옮겨진 것입니다.

허가가 필요 없는 등록: 누구나 켤 수 있다

지갑 주소는 당신이 구성원을 아는 순간 존재합니다. 하지만 거기서 지출하려면 규칙이 결국 체인에 기록되어야 합니다. 프로그램은 이 단계를 initialize라고 부릅니다.

대부분의 Solana 멀티시그에서는 권한을 가진 생성자만이 그에 해당하는 단계를 할 수 있습니다. SSP의 프로그램에서는 초기화에 허가가 필요 없습니다. 누구든 할 수 있습니다. 생성자 계정도, 구성원 서명도, 특별한 권한도 없습니다. 보통 SSP의 relay 서비스가 소액의 임대료를 내고 지갑을 켜지만, 누가 하든 정말로 상관없습니다.

이는 보안 검사를 보기 전까지는 불안하게 들립니다. 누군가 지갑을 초기화하면 프로그램은 그가 제공한 구성원 목록의 SHA-256 해시를 다시 계산하고, 그 해시가 주소에 새겨진 해시와 일치하지 않는 한 트랜잭션을 거부합니다. Solana의 계정 프레임워크는 독립적으로 주소를 같은 해시에 묶습니다. 이 두 검사를 합치면 정규 주소는 오직 정규 구성원 집합만을 담을 수 있습니다. 누구도 자신이 고른 구성원 목록으로 당신의 주소를 등록할 수 없습니다. 해시가 일치하지 않을 것이고 트랜잭션이 실패하기 때문입니다.

낯선 사람이 당신의 지갑을 초기화해도 해를 끼칠 수 없는 이유

공격자가 실제로 무엇을 시도할 수 있는지 따라가 봅시다.

그가 다른 구성원 집합으로 초기화한다. 다른 집합은 다른 값으로 해시되고, 그것은 다른 주소를 도출합니다. 공격자는 그저 Solana의 다른 어딘가에 자신만의 무관한 지갑을 만든 것뿐입니다. 당신의 vault와 연결도 없고, 당신의 자금에 대한 권리도 없습니다.

그가 당신의 구성원 집합으로 초기화한다. 해시가 일치하므로 트랜잭션은 성공하지만, 그가 한 일이라곤 당신의 임대료를 대신 내 준 것뿐입니다. 지갑은 이제 당신이 기대한 그대로의 규칙으로 등록되며, 공격자는 구성원이 아니므로 아무것도 제안하거나 승인하거나 실행할 수 없습니다. 돈은 결코 멀티시그 주소 자체에 놓이지 않습니다. 시스템이 소유하고 탈취될 수 없는 vault에 놓입니다. 누가 지갑을 초기화하든, 언제 하든, 결과는 같은 정규의, 규칙이 올바른 지갑입니다.

임계값은 등록할 때가 아니라 지출할 때 검사된다

이것은 Bitcoin의 P2WSH 멀티시그가 쓰는 것과 같은 모델이며, 분명히 말할 가치가 있습니다. M-of-N 임계값은 자금이 움직일 때만 적용되며, 등록 시에는 결코 적용되지 않습니다.

등록은 그저 "이들이 구성원이고, 이것이 임계값이다"라고 기록할 뿐입니다. 어떤 해도 끼칠 수 없기에 서명을 요구하지 않습니다. 진짜 관문은 지출 흐름으로, 거기서 프로그램은 승인 수를 세고 충분한 수의 구성원이 동의할 때까지 행동을 거부합니다. 주소는 규칙의 해시이며, 누구나 자금을 넣을 수 있고, 유효한 서명만이 지출할 수 있습니다. "M-of-N"이 무슨 뜻인지 복습하려면 2-of-2 대 2-of-3 대 M-of-N 멀티시그를 보세요.

처음부터 끝까지, 전체 생애 주기

조각들을 한데 모으면, SSP Solana 멀티시그 지갑의 일생은 이렇습니다.

  1. 도출. 누구나 구성원과 임계값으로부터 멀티시그 주소와 vault 주소를 오프라인으로 계산합니다. 블록체인도, 비용도 없습니다.
  2. 사전 입금. 누구나 vault 주소로 SOL이나 토큰을 보냅니다. 지갑이 아직 등록되지 않았어도 작동합니다.
  3. 초기화. 누구나, 보통은 SSP의 relay가, 허가가 필요 없는 등록 트랜잭션을 제출합니다. 프로그램은 구성원 해시를 검증하고 정규 규칙을 체인에 기록합니다.
  4. 제안. 한 구성원이 트랜잭션 제안을 만듭니다. 전용 제안 계정에 간결하게 저장됩니다.
  5. 승인. 각 구성원이 제안을 각각 한 번씩 승인합니다. 승인은 체인상에 누적됩니다.
  6. 실행. 승인이 임계값에 도달하면 누구나 실행을 촉발할 수 있습니다. 프로그램은 먼저 제안을 실행됨으로 표시하고 — 결코 두 번 실행되지 않도록 하는 의도적인 보호 장치입니다 — 그다음 vault 자신이 서명자로 행동하면서 각 명령을 수행합니다.

이 마지막 단계가 바로 키 없는 vault 주소가 빛을 발하는 지점입니다. vault는 개인 키가 없는 PDA이므로, 어떤 사람도 어떤 프로그램도 통상적인 방식으로 서명하여 그 자금을 옮길 수 없습니다. 유일한 출구는 SSP의 프로그램이 승인되고 임계값에 도달한 제안을 실행하는 것입니다. 프로그램은 vault의 도출 방법을 Solana 런타임에 제시함으로써 vault를 위해 "서명"합니다. 그 권한은 오직 그 주소의 소유자이기 때문에 얻습니다.

생성자도, 관리자도, 제자리 키 교체도 없다

마지막 두 가지 속성이 설계를 한데 엮습니다.

구성원 집합과 임계값은 불변입니다. 지갑이 일단 초기화되면, 프로그램의 어떤 명령도 그 구성원이나 임계값을 바꿀 수 없습니다. 그렇게 할 코드 경로가 없습니다. 누가 지갑을 통제하는지를 바꾸려면 — 다른 시스템이 막연히 "키 교체"라고 부르는 것 — 새 구성원 집합으로 새로운 멀티시그를 만들고 자금을 그쪽으로 옮깁니다. 옛 주소는 옛 규칙을 영원히 간직합니다.

생성자 역할도, 관리자 키도, 결코 없습니다. 많은 멀티시그 설계는 구성원을 무시하거나 구성을 바꿀 수 있는 권한 계정을 둡니다. SSP의 프로그램에는 하나도 없습니다. 손상시킬 것도, 피싱할 관리자 키도, 강요할 생성자도 없습니다. 구성원과 임계값이 이야기의 전부입니다.

이 미니멀리즘은 의도적인 절충입니다. SSP는 기능이 풍부한 거버넌스 플랫폼이 아니라 작고 결정론적인 기본 요소를 만들었습니다. 다음 글 SSP의 Solana 멀티시그 대 Squads는 이 설계를 성숙하고 감사받았으며 지배적인 Solana 멀티시그인 Squads V4와 정직하게 비교합니다. 제품 맥락은 Solana 지원 출시 발표SSP Wallet v1.39.0에 무엇이 들어왔는지 다룹니다.

핵심 아이디어는 머릿속에 담길 만큼 작습니다. SSP의 Solana 멀티시그에서 지갑 주소는 그 자신의 규칙의 지문입니다. 구성원과 임계값을 알면, 주소를 압니다. 그 외에는 아무것도 필요하지 않고, 그 외에는 아무것도 신뢰하지 않습니다.

이 글 공유하기

관련 글