---
title: 다중서명 지갑
tags: security, wallet
description: 다중서명 지갑 원리 및 실제 사용기
---
# 다중서명 지갑
## 다중서명
* 보통 암호화폐 지갑은 단일 키 주소에 저장되고 해당 개인키를 소유한 사람이면 자금에 접근할수 있다.
* 다중서명은 해당 주소가 가지는 서로 다른 개인키를 사용해 동시에 서명했을 경우에만 자산에 접근할 수 있다. (2/3 , 3/3, 4/4 와 같이 다양한 조합을 사용할 수 있다.)
* 암호화폐 관련된 기업의 입장에서 단일키 보관방식은 리스크가 매우 크기 때문에 다중서명 방식을 통해 보유하고 있는 암호화폐를 더욱 안전하게 보관할 수 있다.
* 단순히 안전하게 보관하는것 이외에도 다중서명 기술은 여러가지 모델에 활용될 수 있다.
## 활용 방안
### 에스크로 거래
* 2/3 다중서명 지갑을 만드는 것은, 두 당사자간의 에스크로 거래를 가능하게 한다. 문제가 발생할 경우 상호 신회할 수 있는 중재자를 포함할 수 있게된다.
### 의사결정
* 특정 이사회에서 다중서명 지갑을 활용하면 자금 집행의 주체들의 다수결에 의한 합의된 결정만 실행할 수 있게한다.
## 어떤방식으로 구현?
* 다중서명 지갑은 지갑 역할을 하는 '컨트랙트'이다.
따라서 그 지갑의 주소는 개인의 주소가 아닌 스마트 컨트랙트의 주소이다.
컨트랙트 생성이기 때문에 지갑생성에 가스비가 든다.
최종으로는 dAPP의 형태로 enduser가 사용하게 된다.
## 단점
* 일반 지갑에 비해 종류가 많지 않아 사용자 편의성이 부족하다. 그 예로 다중서명 지갑에서 중앙화 거래소로 토큰을 전송하면 transaction이 잡히지 않을 위험이 있다. 다중서명 지갑의 transaction은 스마트 컨트랙트로 구현되어있기 때문에 그렇다.
* 스마트 컨트랙트에 의한 지갑이기 때문에 해당 컨트랙트에 버그가 존재하게 된다면 해커가 탈취할 hole을 만들어 낼 수도 있다.
## 다중서명 지갑 생성
* Gnosis safe가 다중서명 지갑에서는 유명하여 이걸로 진행해 보았다.
1. 기존 지갑을 연결하고 다중서명 지갑을 생성할 네트워크 선택
![connect wallet & select network](https://i.imgur.com/kYdHu9b.png)
2. 지갑 이름 설정
![지갑 이름 설정](https://i.imgur.com/Pwd3bJD.png)
3. 오너 설정 & transaction에 필요한 서명 갯수
![owners and confirmations](https://i.imgur.com/UTZbZtw.png)
4. review 및 가스비
![](https://i.imgur.com/bIl0fj4.png)
## 연계 솔루션
* 단순 보관용도 이외에도 다양한 방식으로 다중서명 지갑을 활용할 수 있다.
![gnosis safe 연계 솔루션](https://i.imgur.com/D5qq2td.png)
## 다중서명 지갑 종류
* [Consensys github](https://github.com/ConsenSysMesh/MultiSigWallet)
* [Gnosis github](https://github.com/Gnosis/MultiSigWallet)
* [Argent](https://www.argent.xyz/security/)
* [Bitgo](https://github.com/BitGo/eth-multisig-v2)
## 참고 사이트
* [gnosis safe (다중서명 지갑 생성 어플리케이션)](https://gnosis-safe.io/app)
* [MultiSigWallet 컴파일 후 체인에 배포하는 글](https://luniverse.io/2021/05/28/multi-signature-wallet/?lang=ko)
* [다중서명 지갑을 개발자 관점에서 작성한 글 #1](https://goodjoon.tistory.com/268)
* [다중서명 지갑을 개발자 관점에서 작성한 글 #2](https://goodjoon.tistory.com/270?category=632200)
<style>
html, body, .ui-content {
background-color: #333;
color: #ddd;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
color: #ddd;
}
.markdown-body h1,
.markdown-body h2 {
border-bottom-color: #ffffff69;
}
.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
color: #fff;
}
.markdown-body img {
background-color: transparent;
}
.ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a {
color: white;
border-left: 2px solid white;
}
.expand-toggle:hover,
.expand-toggle:focus,
.back-to-top:hover,
.back-to-top:focus,
.go-to-bottom:hover,
.go-to-bottom:focus {
color: white;
}
.ui-toc-dropdown {
background-color: #333;
}
.ui-toc-label.btn {
background-color: #191919;
color: white;
}
.ui-toc-dropdown .nav>li>a:focus,
.ui-toc-dropdown .nav>li>a:hover {
color: white;
border-left: 1px solid white;
}
.markdown-body blockquote {
color: #bcbcbc;
}
.markdown-body table tr {
background-color: #5f5f5f;
}
.markdown-body table tr:nth-child(2n) {
background-color: #4f4f4f;
}
.markdown-body code,
.markdown-body tt {
color: #eee;
background-color: rgba(230, 230, 230, 0.36);
}
a,
.open-files-container li.selected a {
color: #5EB7E0;
}
</style>