Back to Blog

Solana 생태계 보안 강화 (5) — 멀티시그

April 10, 2022
5 min read

0. 복습

1. 개요

이전 블로그에서 우리는 Solana 프로그램의 접근 제어에 있어 중요한 계정 유효성 검사에 대해 논의했습니다. 그러나 탈중앙화된 DApp을 위해, 그리고 잠재적인 개인 키 유출을 방지하기 위해 멀티 시그는 매우 중요합니다. 이번 포스트에서는 멀티 시그의 구현 방법을 소개하겠습니다.

2. 멀티 시그의 개념

멀티 시그는 여러 사용자가 하나의 트랜잭션에 서명할 수 있도록 하는 디지털 서명 방식입니다. 해당 트랜잭션은 특권 함수(예: 민팅) 호출이나 자금 전송 명령 등이 될 수 있습니다. 멀티 시그의 메커니즘은 각자의 개인 키를 가진 n명의 당사자 중, 트랜잭션을 실행하기 위해 최소 m개의 개인 키가 서명해야 한다는 것입니다. 이를 통해 DeFi의 자금을 훨씬 안전하게 보호하고 개인 키 유출 및 러그 풀과 같은 잠재적 위험을 방지할 수 있습니다.

3. 멀티 시그 사용법

Solana에는 Serum에서 제공하는 멀티 시그 프로그램이 있으며, 이는 OpenZeppelin이 개발한 멀티 시그 로직과 매우 유사합니다. 이를 통해 여러 사용자가 완전히 온체인에서 트랜잭션에 서명할 수 있습니다. 그러나 필요한 서명을 모두 오프체인에서 수집할 수 있다면 과정이 더 간단해질 수 있습니다. 이를 설명하기 위해 지난 포스트의 테스트 코드에 멀티 시그 기능을 추가했습니다. 모든 테스트 코드는 여기에서 확인할 수 있습니다.

3.1 코드 리뷰

지난번에 소개한 프로젝트에서 config 계정의 관리자를 multisig 계정으로 교체했습니다. 이 경우 클라이언트가 LockUnlock 명령을 수행하려면 트랜잭션에 충분한 수의 유효한 소유자 서명을 포함해야 합니다.

네 가지 속성으로 구성된 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에서 멀티 시그의 간단한 구현 방법을 소개했습니다. 이는 여러 사용자로부터 오프체인에서 서명을 수집할 수 있는 시나리오를 위한 것입니다. 트랜잭션이 완전히 온체인에서 서명되어야 하는 시나리오는 추후에 소개할 예정입니다. 계속 팔로우해 주시면 앞으로의 포스트에서 더 많은 내용을 공유하겠습니다.

이 시리즈의 다른 글 읽기:


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

Sign up for the latest updates
돼지도살 사기로 잃어버린 암호화폐를 복구하는 방법

돼지도살 사기로 잃어버린 암호화폐를 복구하는 방법

피그 버처링 사기로 2025년 미국 피해자들이 72억 달러를 잃었습니다. 자금 회수를 위해선 수사기관 공식 신고와 충분한 온체인 증거가 필요합니다. 이 2026년 가이드는 피해 직후 1시간 내 조치, 자금 흐름 보고서, 현실적인 회수 가능성, 그리고 피해자를 노리는 2차 '회수 서비스' 사기 식별법을 다룹니다.

~$135만 달러 손실: BarnBridge, DeFiTuna | BlockSec 주간 보고
Security Insights

~$135만 달러 손실: BarnBridge, DeFiTuna | BlockSec 주간 보고

이 주간 보고서는 2026년 7월 13일부터 19일까지 발생한 2건의 보안 사고를 다루며, 이더리움과 솔라나에서 총 약 135만 달러의 손실이 발생했습니다. 솔라나 대출 프로토콜 DeFiTuna은 포지션 가치가 0일 때 부채와 무관하게 건전한 것으로 처리되는 결함으로 약 57만 달러를 잃었습니다. BarnBridge는 더 이상 사용되지 않지만 활성 상태인 이더리움 거버넌스 시스템을 악용한 공격자가 악의적인 제안을 통과시켜 약 77만 6천 달러의 USDC를 탈취당했습니다.

암호화폐의 오염 분석: 포이즌, 헤어컷, FIFO 방식 설명

암호화폐의 오염 분석: 포이즌, 헤어컷, FIFO 방식 설명

오염 분석은 수사관이 블록체인에서 도난 암호화폐를 추적하는 방법입니다. 이 가이드는 포이즌, 헤어컷, FIFO 세 가지 표준 방법을 이더리움 실제 예시와 한계점과 함께 설명하고, 현대 자금 추적 도구의 대규모 적용 방식을 소개합니다.