ERC-5639 위임 레지스트리 (Delegation Registry)

Review · 계정·지갑 · 2022-09-09 작성

자산을 보관하는 금고 지갑이 다른 지갑에 소유 증명 권한을 위임해 두는 공용 등록부입니다. 디앱은 이 등록부를 조회해 위임 지갑의 서명만으로 금고 지갑의 자산 보유를 확인할 수 있습니다.

왜 필요한가

이더리움에서 자산 소유를 증명하려면 그 자산을 보관한 지갑으로 직접 메시지에 서명하거나 컨트랙트와 상호작용해야 합니다. 마켓플레이스 프로필 수정, NFT 보유자 전용 콘텐츠 접근, 행사 입장, 에어드랍 수령이 모두 그렇습니다. 확인 자체는 읽기만 하면 되는 작업인데도 자산을 옮길 수 있는 지갑으로 서명하게 되므로, 악성 디앱이나 피싱 사이트가 내민 서명 요청에 한 번 속으면 그 지갑에 묶인 자산을 크게 잃을 수 있습니다. 실제로 사용자가 악성 페이로드에 실수로 서명해 자산을 잃는 사례가 많았습니다. 또 많은 사용자가 자산 대부분을 콜드 스토리지(cold storage)에 두는데, 보안을 높일수록 접근 장벽도 같이 높아져 하드웨어 지갑이나 멀티시그로 매번 서명하는 일은 불편합니다. 그래서 하나의 지갑을 대신해 인증할 수 있는 지갑을 여러 개 승인해 두는 방법이 필요합니다.

구현해야 하는 것

심층 설명

세 가지 위임 범위

레지스트리는 DelegationType 열거형으로 NONE, ALL, CONTRACT, TOKEN 네 값을 정의하고, 쓰기 함수 세 개로 범위를 나눠 위임합니다. delegateForAll(delegate, value)는 금고가 통제하는 모든 컨트랙트에 대해, delegateForContract(delegate, contract_, value)는 특정 컨트랙트에 대해, delegateForToken(delegate, contract_, tokenId, value)는 특정 토큰 하나에 대해 위임을 설정합니다. value는 true면 설정, false면 철회입니다. Rationale은 이런 세분화 덕분에 금고가 자산 보안을 세밀하게 통제할 수 있고, 제3자 지갑에 관련 자산만 제한적으로 열어 주는 활용이 가능해진다고 설명합니다.

위임 확인과 포함 관계

디앱이나 스마트 컨트랙트는 checkDelegateForAll, checkDelegateForContract, checkDelegateForToken의 반환값으로 위임 여부를 확인합니다. 수준 사이에는 포함 관계가 있습니다. 토큰에 대해서는 토큰 수준, 그 토큰이 속한 컨트랙트의 컨트랙트 수준, 금고 전체 수준 중 하나라도 위임이 있으면 행동할 수 있고, 컨트랙트에 대해서는 컨트랙트 수준이나 금고 전체 수준 위임이 있으면 됩니다. 스마트 컨트랙트 수준에서 확인할 때는 가스를 아끼기 위해, 디앱이 위임 지갑이 가진 위임 수준을 컨트랙트에 힌트로 알려 주어 가장 가스 효율이 좋은 확인 함수로 검증하게 하는 것이 기대됩니다.

철회 방법 세 가지

금고 지갑은 revokeDelegate(delegate)로 특정 위임 지갑의 모든 권한을 거두고, revokeAllDelegates()로 자신이 등록한 모든 위임을 한 번에 거둡니다. 반대로 위임을 받은 쪽도 revokeSelf(vault)를 호출해 특정 금고의 위임 목록에서 자신을 스스로 제거할 수 있습니다. 철회는 RevokeDelegate, RevokeAllDelegates 이벤트로 기록되고, 위임의 설정과 해제는 DelegateForAll, DelegateForContract, DelegateForToken 이벤트의 value 값(true는 설정, false는 철회)으로 구분됩니다.

온체인 열거를 선택한 이유

읽기 함수들은 위임 관계를 체인 위에서 바로 나열할 수 있게 합니다. getDelegationsByDelegate는 특정 위임 지갑이 대신할 수 있는 모든 위임을 DelegationInfo 구조체 배열로 돌려주고, getDelegatesForAll, getDelegatesForContract, getDelegatesForToken은 금고 기준으로 각 수준의 위임 지갑 목록을, getContractLevelDelegations와 getTokenLevelDelegations는 금고의 컨트랙트 수준과 토큰 수준 위임 전체를 돌려줍니다. Rationale은 추가 가스 비용을 감수하고 온체인 열거를 넣은 이유로, 디앱 프런트엔드가 연결된 지갑이 접근할 수 있는 위임을 찾아 UI 선택기를 제공할 수 있다는 점을 듭니다. 열거가 없으면 사용자가 금고 주소를 직접 입력하거나 디앱이 모든 위임 이벤트를 인덱싱해야 합니다.

다중 기기 보안과 위임 체인

Motivation은 시드 문구를 기기마다 입력하는 대신, 기기마다 고유한 지갑을 만들어 본 지갑의 승인된 2차 지갑으로 등록하는 방식을 제안합니다. 특정 기기의 지갑이 유출되거나 분실되면 그 지갑의 인증 권한만 제거하면 됩니다. 또 지갑 인증은 체인으로 이어질 수 있어, 2차 지갑이 다시 하나 이상의 3차 지갑을 승인하면 3차 지갑은 2차 주소와 최상위 본 주소 모두에 대한 서명 권한을 갖습니다. 팀원이 각자 서명자를 갖되, 본 지갑이 뿌리에서 권한을 철회하는 것만으로 트리 전체를 무효화할 수 있습니다. 하드웨어 지갑 사용자는 모바일 기기 같은 비하드웨어 지갑을 인증용으로 승인해 두면 하드웨어 지갑을 들고 다니지 않아도 대부분의 디앱을 쓸 수 있습니다.

독립 배포되는 불변 레지스트리

명세의 인터페이스 주석은 이 레지스트리를 독립된 기본 요소(standalone primitive)로 배포되는 불변(immutable) 컨트랙트로 설명합니다. 새로 출시되는 프로젝트는 이 레지스트리에서 기존에 등록된 콜드 월렛에서 핫 월렛으로의 위임을 읽어, 그 권한을 자신의 흐름에 통합할 수 있습니다. 사용자가 위임을 한 번 등록해 두면 이후 등장하는 프로젝트들이 같은 기록을 읽어 쓸 수 있다는 구조입니다.

현재 상태는 Review

이 문서는 2022년 9월 9일 만들어진 표준 트랙(Standards Track) ERC이고 현재 상태는 Review입니다. 아직 검토 단계의 제안이므로 인터페이스 이름이나 동작 규칙이 앞으로 바뀔 수 있고, 최종 표준으로 확정된 것이 아닙니다. 이 레지스트리를 구현하거나 디앱에 통합하려는 개발자는 원문의 최신 버전과 상태를 먼저 확인하는 것이 안전합니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs