Solana 멀티시그 주소가 어려운 이유

·7분 읽기·작성자: SSP Editorial Team
Solana 멀티시그 주소에 관한 글의 SSP 브랜드 커버. QR 코드, 열쇠, 데이터베이스, 칩 아이콘 포함

지갑 주소는 단순한 것처럼 보입니다. 복사하고 붙여넣고 돈을 보내는 문자열이죠. 비트코인에서는 거의 그만큼 단순합니다. 솔라나에서는 공유 지갑 — 멀티시그 — 을 주소 뒤에 두는 일이 놀라울 만큼 어렵습니다. 이 글은 그 이유를 설명하고, 이 시리즈의 나머지가 답하는 질문을 제시합니다.

멀티시그 주소가 약속해야 하는 것

멀티시그 지갑은 여러 개의 키로 통제되는 지갑으로, 돈이 움직이기 전에 그중 정해진 수의 키가 동의해야 합니다. 예를 들어 "2-of-3" 멀티시그는 키가 세 개이고, 결제를 승인하려면 그중 아무 두 개가 필요합니다. 목적은 단일 장애 지점을 없애는 것입니다. 키 하나를 잃어버려도, 키 하나가 도난당해도 자금은 여전히 안전합니다.

이것이 유용하려면 주소는 두 가지 약속을 지켜야 합니다. 첫째, 미리 알 수 있어야 합니다 — 어떤 설정도 끝내기 전에 누군가에게 입금 주소를 건네고 싶기 때문입니다. 둘째, 정직해야 합니다 — 그 주소로 돈을 보내는 사람은 누구든, 합의된 키 그룹만이 합의된 규칙에 따라서만 거기서 지출할 수 있다고 믿을 수 있어야 합니다. 이 두 가지 약속을 기억하세요. 아래의 모든 내용을 꿰뚫는 실입니다.

비트코인에서는 주소가 곧 규칙

비트코인은 이를 쉬워 보이게 만듭니다. 비트코인 멀티시그는 작은 스크립트로 기술됩니다. 공개키 목록과 "M-of-N" 규칙입니다. 주소를 얻으려면 그 스크립트를 가져와 해시합니다. 주소(즉 P2WSH 주소)는 말 그대로 지출 규칙의 해시 그 자체입니다.

여기에는 조용하지만 강력한 결과가 있습니다. 누구든 단 한 건의 거래도 방송하기 전에, 인터넷이 없는 노트북에서 주소를 오프라인으로 계산할 수 있습니다. "지갑을 생성한다"는 단계는 없습니다 — 돈을 받기 위해 지갑이 네트워크에 존재할 필요가 없습니다. 스크립트는 나중에, 자금을 지출할 때에만 공개되고, 네트워크는 공개된 스크립트가 주소와 일치하는지, 유효한 서명이 충분한지 확인합니다. 주소를 미리 알 수 있나: 예. 정직한가: 예 — 주소가 규칙 자체에서 도출되므로, 다른 키 집합은 다른 주소를 만듭니다.

솔라나에서는 주소가 생성되어야 하는 계정

솔라나는 다르게 동작합니다. 솔라나에서는 모든 것이 계정 — 소유자가 있는 온체인 저장 슬롯 — 입니다. 자금은 계정에 살고, 프로그램은 계정에 살며, 멀티시그의 구성도 계정에 삽니다. 결정적으로, 계정은 공짜로 생겨나지 않습니다. 계정은 명시적으로 생성되고 비용이 지불되어야 합니다. 네트워크가 그 데이터를 저장하도록, 누군가가 "임대료"라 불리는 소량의 SOL로 계정에 자금을 넣습니다.

따라서 솔라나의 멀티시그는 단순한 주소가 아닙니다 — 멤버 목록과 임계값을 담은, 프로그램이 통제하는 계정입니다. 그리고 멀티시그가 무언가를 할 수 있게 되기 전에, 그 계정은 거래에 의해 생성되어야 합니다. 이것이 어려움의 뿌리입니다. 솔라나의 공유 지갑에는 비트코인에는 아예 없는 설정 단계가 있습니다.

PDA: 개인키가 없는 주소

솔라나에는 이를 위한 우아한 도구가 있는데, 프로그램 파생 주소(Program Derived Address), 줄여서 PDA라고 합니다. 보통의 솔라나 주소에는 대응하는 개인키가 있습니다 — 키를 가진 사람이 주소를 통제합니다. PDA는 의도적으로 곡선 밖에 있도록 만들어집니다. 유효해 보이는 주소이지만 개인키가 존재하지 않으며, 존재할 수도 없습니다. 누구도 그것을 위해 개인으로서 서명할 수 없습니다.

대신 PDA는 결정론적으로 도출됩니다. 몇 개의 입력값 — "시드"(seeds)라 불립니다 — 에 프로그램의 ID를 더해 단방향 함수에 통과시키면 주소가 나옵니다. 같은 시드와 같은 프로그램은 항상 같은 PDA를 만들므로, 누구나 그것을 재현할 수 있습니다. 그리고 개인키가 없으므로, 그 주소에 대한 동작을 인가할 수 있는 것은 소유 프로그램뿐입니다. 프로그램은 invoke_signed를 사용하는 프로그램 간 호출이라는 메커니즘으로 그 일을 합니다. 프로그램이 시드를 솔라나 런타임에 제시하면, 런타임이 그 PDA에 대한 서명 권한을 부여합니다. 암호학적 서명은 결코 생성되지 않습니다 — 행동할 권리는 키를 보유하는 데서가 아니라 시드를 아는 데서 옵니다.

PDA는 멀티시그에 꼭 맞는 보금자리입니다. 어느 한 사람이 아니라 프로그램 로직이 통제하는 주소이기 때문입니다. 여기까지는 좋습니다. 어려운 부분은 무엇을 시드로 고르느냐입니다.

생성 전에 자금을 넣어야 하는 문제

바로 여기서 솔라나의 지배적인 멀티시그들이 난관에 부딪힙니다. 비트코인의 결정론적 모델과 달리, 솔라나에서 가장 널리 쓰이는 멀티시그들 — Squads V4가 선두 사례로, 성숙하고 많은 감사를 받았습니다 — 은 멀티시그의 주소를 멤버 집합이 아니라 생성 시점에 새로 만들어 선택된 무작위 값에서 도출합니다. Squads V4에서 그 값은 create_key라 불리며, 생성자가 생성 거래를 실행할 때 만들어지는 일시적인 키입니다.

무작위 create_key에서 주소를 도출하는 것은 의도적이고 합리적인 설계 선택입니다 — 서로 다른 두 그룹이 정확히 같은 멤버 구성을 원하는 곤란한 경계 사례를 피해 갑니다. 그러나 명확히 이해할 가치가 있는 두 가지 결과가 있습니다.

  • 주소를 미리 알 수 없습니다. 누군가 생성 거래를 실행하기 전까지는 시드가 존재하지 않으며, 따라서 주소도 존재하지 않습니다. 입금 주소를 출력해 설정 전에 자금을 넣을 방법이 없습니다 — 생성 전에 자금을 넣어야 하는 문제입니다. 첫 번째 약속이 깨집니다.
  • 생성자는 설정 시점의 단일 신뢰 지점입니다. 특정 계정 하나가 그 생성 거래를 실행하고 그 무작위 값을 선택해야 합니다. 설정이라는 짧은 창 동안, 당신은 그 당사자가 올바르게 하리라 신뢰합니다.

이 중 무엇도 Squads V4를 안전하지 않게 만들지 않습니다 — 솔라나에서 가장 실전 검증을 거친 멀티시그이며 매우 큰 금액을 지킵니다. 그것은 단지 비트코인과는 다른 형태의 신뢰일 뿐입니다. 주소는 더 이상 "규칙의 해시"가 아닙니다. 그것은 "생성 거래가 우연히 만들어 낸 무언가"가 됩니다.

이더리움은 중간 길을 찾았다

이더리움은 비슷한 문제에 직면했고, CREATE2라는 기능으로 답했습니다. 고정된 입력으로부터 컨트랙트가 배포되기 전에 스마트 컨트랙트의 주소를 계산할 수 있게 해 줍니다. Safe 같은 지갑은 이를 사용해 이른바 반사실적 주소를 제공합니다. 공유하고 돈을 받을 수 있는, 실재하며 자금을 넣을 수 있는 주소이고, 그동안 실제 컨트랙트는 지연되어 배포됩니다 — 자금이 처음 움직여야 할 때에만요. 더 새로운 계정 추상화 표준인 ERC-4337은 같은 발상을 공식화합니다. 이렇게 이더리움은, 솔라나처럼 결국 온체인 객체가 존재해야 함에도 "미리 알 수 있다"는 약속을 되찾습니다.

이 시리즈가 답하는 질문

세 가지 모델을 나란히 놓아 봅시다. 비트코인: 주소는 규칙의 해시 — 오프라인으로 알 수 있고, 구조상 정직하며, 생성 단계가 없습니다. 이더리움: 반사실적 주소 — 미리 알 수 있고, 배포는 미뤄집니다. 솔라나의 범용 멀티시그: 주소가 생성 시점의 무작위성에서 옵니다 — 미리 알 수 없고, 설정 시 신뢰해야 할 생성자가 있습니다.

그래서 질문은 이렇습니다. 솔라나에는 계정이 필요하고, 계정은 생성되어야 합니다 — 그것은 사라지지 않습니다. 그러나 솔라나 멀티시그가 비트코인의 성질을 반드시 포기해야 할까요? 주소를 대신 멤버 집합과 임계값 — 규칙 그 자체 — 에서 순수하게 도출하여, 오프라인으로 알 수 있고, 설정 전에 자금을 넣을 수 있으며, 다른 키 그룹이 다른 주소를 만들기에 정직하게 할 수는 없을까요?

그것이 바로 SSP 팀이 자체 솔라나 멀티시그 프로그램에 구축해 넣은 성질입니다. 다음 글은 그 방법을 보여 줍니다. 멤버 집합 그 자체인 주소, 온체인에 무엇도 등록되기 전에 자금을 넣을 수 있는 금고, 그리고 생성자가 전혀 필요 없는 등록 단계입니다. 이 설계는 SSP Wallet의 솔라나 지원과 함께 출시되었습니다 — 출시 공지를 참고하세요 — 그리고 SSP가 보안을 다루는 방식 그대로, 이 프로그램은 현재 devnet 전용이며 메인넷 이전에 외부 감사를 기다리고 있습니다. 멀티시그 자체가 아직 낯설다면 멀티시그란 무엇이며 왜 중요한가부터 시작하세요. 그렇지 않다면 계속 읽어 주세요.

이 글 공유하기

관련 글