
0. 복습
- Solana 생태계 보안 (1) — Hello Solana
- Solana 생태계 보안 (2) — 프로그램 간 호출
- Solana 생태계 보안 (3) — 프로그램 업그레이드
- Solana 생태계 보안 (4) — 계정 유효성 검사
1. 개요
이전 블로그에서 우리는 Solana 프로그램의 접근 제어에 있어 중요한 계정 유효성 검사에 대해 논의했습니다. 그러나 탈중앙화된 DApp을 위해, 그리고 잠재적인 개인 키 유출을 방지하기 위해 멀티 시그는 매우 중요합니다. 이번 포스트에서는 멀티 시그의 구현 방법을 소개하겠습니다.
2. 멀티 시그의 개념
멀티 시그는 여러 사용자가 하나의 트랜잭션에 서명할 수 있도록 하는 디지털 서명 방식입니다. 해당 트랜잭션은 특권 함수(예: 민팅) 호출이나 자금 전송 명령 등이 될 수 있습니다. 멀티 시그의 메커니즘은 각자의 개인 키를 가진 n명의 당사자 중, 트랜잭션을 실행하기 위해 최소 m개의 개인 키가 서명해야 한다는 것입니다. 이를 통해 DeFi의 자금을 훨씬 안전하게 보호하고 개인 키 유출 및 러그 풀과 같은 잠재적 위험을 방지할 수 있습니다.
3. 멀티 시그 사용법
Solana에는 Serum에서 제공하는 멀티 시그 프로그램이 있으며, 이는 OpenZeppelin이 개발한 멀티 시그 로직과 매우 유사합니다. 이를 통해 여러 사용자가 완전히 온체인에서 트랜잭션에 서명할 수 있습니다. 그러나 필요한 서명을 모두 오프체인에서 수집할 수 있다면 과정이 더 간단해질 수 있습니다. 이를 설명하기 위해 지난 포스트의 테스트 코드에 멀티 시그 기능을 추가했습니다. 모든 테스트 코드는 여기에서 확인할 수 있습니다.
3.1 코드 리뷰
지난번에 소개한 프로젝트에서 config 계정의 관리자를 multisig 계정으로 교체했습니다. 이 경우 클라이언트가 Lock 및 Unlock 명령을 수행하려면 트랜잭션에 충분한 수의 유효한 소유자 서명을 포함해야 합니다.

네 가지 속성으로 구성된 Multisig라는 구조체를 추가했습니다. 이 속성들은 명령을 실행하는 데 필요한 서명 수, 유효한 서명자의 총 수, 계정의 상태(초기화 여부), 그리고 유효한 서명자의 공개 키 배열입니다.

이에 따라 instruction.rs에도 InitializeMultisig 명령을 추가했습니다. 이 명령은 클라이언트 측에서 인수 m(u8)을 받습니다. 이 값은 InitializeMultisig() 함수에 전달됩니다.

InitializeMultisig() 함수는 생성된 계정과 값 m을 받습니다. 악의적인 사용자가 계정을 재초기화하는 것을 방지하기 위해 계정이 이미 초기화되었는지 확인합니다(385-388번째 줄). 이후 값 m, n 및 서명자의 공개 키를 할당하여 멀티 시그 계정을 초기화합니다.

Lock() 함수에서 config 계정의 관리자 계정이 멀티 시그인지 확인합니다. 그렇다면 전달된 서명을 검증하고 집계합니다(151번째 줄부터 158번째 줄). 유효한 서명 수가 필요한 수에 도달하거나 초과하면 잠금이 수행됩니다(163번째 줄부터 168번째 줄). Unlock() 함수의 멀티 시그 구현은 Lock() 함수와 유사합니다.
테스트넷에 프로그램을 배포했으며 다음 링크에서 확인할 수 있습니다.
https://explorer.solana.com/address/4g5ZA47pDQ1Bv93aNYdSKAXB6DvPAnnbi9cNEx7722SK?cluster=testnet
3.2 트랜잭션 전송

InitializeMultisig() 함수에서 keys는 네 개의 계정을 포함합니다. 이들은 멀티 시그 계정과 세 명의 유효한 서명자 계정입니다. 서명자 중 한 명이 트랜잭션의 수수료 지불자이기도 합니다. m 값을 2로 설정했으며, 이는 특권 함수를 실행하기 위해 세 명의 서명자 중 두 명의 서명이 필요함을 의미합니다.

또한 명령 데이터에 multisig 계정의 공개 키를 전달하여 config 계정의 관리자를 multisig 계정으로 설정했습니다.

lock() 함수에서 config 계정(410번째 줄) 외에도 multisig 계정(411번째 줄)과 두 명(최소) 이상의 유효한 서명자 계정(412번째 줄 - 413번째 줄)을 전달합니다. 서명자에 대해 isSigner 속성을 true로 설정합니다. 마찬가지로 unlock() 함수의 로직도 이와 유사합니다.
모든 테스트 트랜잭션은 아래에 나열되어 있습니다. 전체 과정은 AllocatePDA() -> InitializeMultisig() -> InitializeDoor() -> InitializeConfig() -> Unlock() -> Open() -> Close() -> Lock()입니다.
https://explorer.solana.com/tx/2inXLHv34NzkmwmvQ7iimdNbEX2Hj8qWS3MVteAPtwhCAPy1yxXXdvfzMmUL7tESsd4wat4LMcPNiEQav18kQTrZ?cluster=testnet
https://explorer.solana.com/tx/4GErNusHLXpUHBsAJ55c7v1Ur1jfv5hAR88CK8nabLnzc92b1UhDnNRryKVjKmcnJDXppmyk6m5RUdpR2w7MEbrU?cluster=testnet
https://explorer.solana.com/tx/2S8h66oWfh7cn4fwFCVPtgGw1o3NgzyWwU1GyRpDjH4PEBfe8LDMZGAEBYLRJpzL3anH9ENShntjg3q5K8gcZSrN?cluster=testnet
https://explorer.solana.com/tx/nVKxPYegbpH324y57uHDZiajpNA5u4bSSJ2gHFHHRx4GJBy1DcpxnccKh1Ltkv9dah1qJNi9jWuBnXbyHWXCJyw?cluster=testnet
https://explorer.solana.com/tx/3KK5CU88oV59VfdTrNpT4LsiUsetuGdc6qW3sNyyGEWVYtKJfD6XA2Nfknrriwuka9wknHpZs3WZ1WkeduDA1pZX?cluster=testnet
https://explorer.solana.com/tx/3rFo37CrLSsMehLk4kwmMSDnbRfLfoPCWZzRDXhwwLg1uq32gu4ddxkYYB3pJX1yiMN8MofnV1Y9CSaf8bQaNJ9Y?cluster=testnet
https://explorer.solana.com/tx/5yFq4dZAMpccn96jKNkYFVcmhmtrwZYSFEQ6pkNgSMd7e1Vy1ztAM3RdFUZjEtThjFssz1TFytowePPyY59we9rX?cluster=testnet
https://explorer.solana.com/tx/3Ut4DqjCQi1MoCsjRx24DxykyDMsmyRsjJSXS7D4FBeZQwrx4UzxWt2gDe6YRiwUHzFkH3eWkFHub6FNSp2Us4Q7?cluster=testnet
3.3 트랜잭션 테스트
멀티 시그가 실제로 작동하는지 테스트하기 위해 클라이언트 스크립트를 수정했습니다.

위에서 보이는 것처럼, 하나의 서명자 계정만 전달하고 하나의 유효한 서명만 제공했습니다.

서명이 부족하여 문이 잠금 해제되지 않는 것을 확인했습니다.
4. 요약
이 글에서는 Solana에서 멀티 시그의 간단한 구현 방법을 소개했습니다. 이는 여러 사용자로부터 오프체인에서 서명을 수집할 수 있는 시나리오를 위한 것입니다. 트랜잭션이 완전히 온체인에서 서명되어야 하는 시나리오는 추후에 소개할 예정입니다. 계속 팔로우해 주시면 앞으로의 포스트에서 더 많은 내용을 공유하겠습니다.
이 시리즈의 다른 글 읽기:
- Solana 생태계 보안 (1) — Hello Solana
- Solana 생태계 보안 (2) — 프로그램 간 호출
- Solana 생태계 보안 (3) — 프로그램 업그레이드
- Solana 생태계 보안 (4) — 계정 유효성 검사
- Solana 생태계 보안 (6) — 멀티 시그2
- Solana 생태계 보안 (7) — 타입 혼동
BlockSec 소개
BlockSec은 2021년 세계적으로 著名한 보안 전문가 그룹에 의해 설립된 선도적인 블록체인 보안 회사입니다. 이 회사는 대중화를 촉진하기 위해 새롭게 부상하는 Web3 세계의 보안과 사용성을 향상시키는 데 전념하고 있습니다. 이를 위해 BlockSec은 스마트 계약 및 EVM 체인 보안 감사 서비스, 보안 개발 및 위협 사전 차단을 위한 Phalcon 플랫폼, 자금 추적 및 조사를 위한 MetaSleuth 플랫폼, 그리고 Web3 빌더들이 암호화폐 세계에서 효율적으로 활동할 수 있도록 돕는 MetaSuites 확장 프로그램을 제공합니다.
현재까지 MetaMask, Uniswap Foundation, Compound, Forta, PancakeSwap 등 300개 이상의 저명한 고객사에 서비스를 제공했으며, Matrix Partners, Vitalbridge Capital, Fenbushi Capital 등 저명한 투자자들로부터 두 차례의 투자 라운드를 통해 수천만 달러를 조달했습니다.
공식 웹사이트: https://blocksec.com/
공식 트위터 계정: https://twitter.com/BlockSecTeam



