Smart Contract Wallet 파헤치기 시리즈 — Dharma 제 3편

이 모든 사용자 경험을 개선하는데 사용된 Smart Contract 기법들!

--

이번 시리즈는 현재 운용되고 있는 Smart Contract 기반 지갑들을 종합적으로 분석합니다. 기존 블록체인 서비스 사용자의 경험을 기존과 어떻게 다르게 구성하여 개선했는지 알아보고, 어떤 방식으로 Smart Contract를 이용하여 운영하고 있는지 알아보겠습니다.

또한 사용자의 자산이 서비스의 Contract에 예치되는 만큼, 실질적인 자산의 소유주나 권익에 대한 대변을 충분히 하는지 확인할 수 있는 시간이 될 것입니다. 궁극적으로 이러한 아이디어에 영감을 얻어, Ethereum 커뮤니티 내에서 새로운 서비스를 만드는데 도움이 되셨으면 합니다.

<Smart Contract Wallet 파헤치기 시리즈>

<Dharma 제 1편>

<Dharma 제 2편>

<Dharma 제 3편>

지난 2편에서는 사용자의 Smart Wallet을 병렬적으로 확장하는 방법을 알아 보았습니다. Smart Wallet에 직접적으로 키를 추가할 수도 있었겠지만, 별도로 🔏KeyRing을 만들어 해당 계약을 확장하도록 하였습니다.

사용자들은 웹 브라우저별 키를 생성하고, 이 키를 KeyRing에 등록합니다. 새로운 브라우저의 키를 등록하기 위해서는 기존 키가 등록되어 있는 브라우저에서 등록을 허용해 주어야 하기 때문에 Dharma의 OAuth인 Coinbase가 해킹 당하더라도 사용자의 자산은 안전하다는 것을 알 수 있었습니다.

또한 Dharma가 사업을 영위하지 못하는 상황이 되더라도, 이를 대비한 장치가 있었다는 것을 확인할 수 있었습니다.

🙃 실수로 키를 다 잃어버렸어요.

어느날 Alice는 Dharma를 사용하던 컴퓨터를 분실하였습니다. 그리고 컴퓨터에 저장되어 있던 Key를 전부 분실하게 됩니다.

별도로 Key를 백업할 수 있는 방법이 제공되지 않기 때문에, 기존에 있던 Key를 다시 복구할 수 있는 방법은 없습니다. 😱

Alice는 어쩔 수 없이 새로운 컴퓨터를 구입한 뒤, Dharma 웹사이트를 실행시켰더니 왼쪽과 같은 화면이 떴습니다. 그리고 Bob은 별다른 선택의 여지가 없으므로 “Lost access to your other browser?” 버튼을 누릅니다. 이 버튼을 누르면 바로 이메일 클라이언트가 실행되어, Dharma에게 이메일을 보낼 수 있게 됩니다.

불쌍한 Alice… 만약 KeyRing을 복구하는 과정이 블록체인을 통해 이루어진다면, Bob은 굳이 Dharma에게 의존해서 Key를 복구할 필요가 없었을 것입니다. 따라서 Dharma가 어떠한 방식으로 Key를 복구하는지에 대해 자세히 알아보기 위해서는, Dharma의 컨트랙트 저장소를 통해 확인해보는 방법 밖에 없을 것 같습니다.

Dharma의 소스코드 저장소를 찾아본 결과, DharmaAccountRecoveryManagerV2 라는 컨트랙트가 배포된 것을 확인할 수 있었습니다. 그럼 본격적으로 Dharma가 어떻게 Smart Wallet의 복구 요청에 대응하고, 구체적인 작동방식은 어떻게 되는지 알아보도록 하겠습니다.

❓커다란 물음

Dharma는 Smart Wallet의 복구 요청에 어떻게 대응할 수 있을까요? Dharma의 한 직원이 사용자가 보낸 이메일에 대해 평가하고 판단하여 Wallet을 복구 시켜줄 수 있을까요? 만약 이메일을 보낸 사람이 해커라면 어떻게 되는 거죠?

앞서 본 DharmaAccountRecoveryManagerV2TimeLockerV2의 인터페이스를 구현하고 있습니다. 이름으로 유추하건대, 일정한 기간동안 잠금 상태로 두는 것으로 보입니다.

TimeLockerV2 Contract을 이용하려면 대표적으로 _setTimelock()을 이용해야 합니다.

_setTimelock()

앞선 글에서 보았듯, 이 함수는 initializationCalldata를 구성하는 것 처럼 함수 선택자(functionSelector)와 인수(arguments)를 각각 넣어 calldata를 만들게 됩니다. 이 calldata가 사용되기 위해서는 TimeLockerV2에 조회하여 설정된 시간이 만료되었는지 확인한 뒤에 calldata를 호출할 수 있게됩니다. 다시 말해, 특정 시간 뒤에 함수를 실행할 수 있도록 합니다.

앞쪽에 있는 다양한 검사 문을 제외하면, 실질적으로 봐야할 코드는 44번째 줄에서 시작됩니다. 기본적으로 설정된 함수의 인터벌+현재시간+extraTime을 조합하여 해당 함수의 실행 가능한 시점을 결정하게 됩니다.

또한 DharmaAccountRecoveryManagerV2는 단독으로 작동하지 않으며, 크게 5가지 권한이 존재합니다.

  • operator — 계정 복구 or 비활성화를 위한 timelock 시작 권한
  • recoverer — 계정 복구 timelock이 완료되었을 때 수행하는 권한
  • disabler — 계정 비활성화 timelock이 완료되었을 때 수행하는 권한
  • canceller — 계정 복구 or 비활성화 timelock 취소 권한
  • pauser — 위 4개의 권한을 정지시킬 수 있는 권한

operator의 경우 DharmaAccountRecoveryOperatorMultisig라는 계약이 배포되어 있으며, DharmaAccountRecoveryManagerV2계약의 소유자는 DharmaAccountRecoveryMultisig으로 설정되어 있습니다. 계약의 소유자는 5개의 권한 모두를 가지고 있으며, 내부적으로 calldata를 실행할 수 있는 execute() 함수를 가지고 있습니다. 그 외에 나머지 권한들은 EOA로 확인되나, 아직 배포되지 않은 Contract일 수도 있다는 점을 알고 있어야 합니다.

🌚 그래서 어떻게 복구한다고요?

여기까지 글을 읽었는데도 Dharma smart wallet의 복구 작동방식이 이해가 안된다면?
괜찮습니다. 코드만 보고 이 작동방식을 예상하는 것은 무척 어렵기 때문이죠😉

모두의 이해를 돕기 위해 간단히 예를 들어보겠습니다.

누군가 Dharma로 Smart Wallet의 복구를 요청했다고 했을 때, 충분한 시간동안 항의가 없는 경우라면 실제 본인이 복구를 요청했을 것이라고 판단하고고 복구 하도록 도와줍니다.

하지만 복구 상태의 Smart Wallet에 항의가 있는 경우 사용자가 브라우저에 저장된 키를 찾았거나, 타인에 의해 요청된 계정 복구를 저지하는 경우라고 볼 수 있습니다. 따라서, TimeLock은 실제 소유자가 확인할 수 있는 충분한 시간에 의미를 두는 것이라 볼 수 있습니다.

이러한 장치는 실제로 많이 사용되는 방식입니다. 추후에 공유드릴 Argent Wallet의 경우도 Timelock을 기반한 복구를 수행하고 있습니다. 요즘 Contract 개발자들 사이에서는 Timelock 방법이 원하는 결과에 빠르게 도달하지 못한다며 Social Recovery 방식이 언급되고 있는데, 앞으로 어떤 형태로 도입될 지는 두고봐야 할 것 같습니다.

🍄 Dharma가 사용한 기술 하나를 알아봅시다!

Dharma는 현대적인 Contract 기술을 많이 도입하였습니다. 대표적으로 제 1편에서 알려드렸던 create2가 있고, 전반적으로 모든 곳에서 사용된 delegatecall과 Vanity Address 그리고 이번에 소개해 드릴, 서명을 통해 Contract의 소유를 증명하는 EIP-1271이 있습니다.

일반적인 EOA는 비밀키로 부터 생성됩니다. 비밀키는 지속적으로 서명값을 만들어 내어 Ethereum에 기록됩니다. 하지만 Contract 자체는 배포자의 address와 nonce를 해시화하여 만든 것이기 때문에 서명 값이라는 것이 있을 수 없습니다. create2의 경우도 동일합니다.

ERC1271

Contract에 추가될 명세는 명확합니다. 데이터와 서명을 입력받아, Contract에서 검증되면 isValidSignature()의 함수 선택자(Function Selector)를 반환합니다. 여기에서는 이 값을 MAGICVALUE라고 합니다.

이러한 인터페이스는 다양한 가능성을 제공합니다. Ethereum에서는 ECDSA를 사용하고 있지만 이 인터페이스를 통해 Multi-Signature를 검증한다거나, BLS-Signature를 검증하는 등 특정 서명 방식에 국한되어 있지 않습니다.

Dharma의 Smart Wallet에도 해당 인터페이스가 사용되었습니다. 앞서 봤던 🔏KeyRing과 Smart Wallet에 해당 인터페이스가 각각 구현되어 있습니다. Dharma와 브라우저가 가지고 있는 키로 서명을 만들고, Contract를 통해 검증되어 작동되는 것이라 볼 수 있습니다. 덕분에 Dharma 또한 제 자산을 가로챌 수 없죠.

이러한 장치는 Identity Contract에서 좀 더 빛을 발하는데, 사용자의 Identity Contract를 증명할 때 이런 인터페이스가 사용될 수 있습니다. Identity Contract에 대해서는 나중에 기회가 되면 알려드리도록 하겠습니다.

👒 마치며

이번 Smart Contract Wallet 파헤치기 시리즈를 통해 Dharma에서 배포된 Contract를 소유하지 않기 위해 많은 노력을 기울인 것을 알 수 있었습니다. 특히 Dharma에서 사용된 Contract를 뜯어보면 뜯어 볼 수록 얼마나 사용자의 권한을 보장하고, 편리한 사용자 경험을 유도했는지 알 수 있었습니다.

총 3편의 글을 통해 최대한 세심하게 Dharma Smart Contract Wallet을 살펴보았는데, 많은 도움이 되셨나요? (사실 Dharma 시리즈는 5부작으로 기획되었으나, 마감에 쫓겨 최종적으로 3부작으로 기획되었습니다..)

하지만 Smart Contract Wallet 파헤치기 시리즈는 여기서 끝이 아닙니다!
앞으로 Argent, InstaDApp, DApper Wallet, Monolith 등… 열심히 분석한 Smart contract wallet 서비스들을 소개해 드릴 생각에 벌써부터 설레네요… 🥰 그럼 또 만나요~

[About Us]
HAECHI AUDIT은 글로벌 블록체인 업계를 선도하는 스마트 컨트랙트 보안 감사 및 개발 전문 기업입니다. 다년간 블록체인 기술 연구 개발 경험을 보유하고 있는 전문가들로 구성되어 있으며, 가장 신뢰할 수 있는 스마트 컨트랙트 보안 감사 및 개발 서비스를 제공합니다.

대표적인 포트폴리오로는 SK텔레콤, Kakao 블록체인 자회사인 Ground X, Carry 프로토콜 등이 있으며, 약 50여 곳 이상의 글로벌 프로젝트들을 대상으로 보안 감사를 진행한 경험을 보유하고 있습니다.

또한, 우수한 기술력을 인정받아 삼성전자, 서울시, KB금융그룹, 신한은행, 한화그룹 등의 지원을 받고 있으며, 이더리움 재단으로부터 개발 장려금을 수여한 바 있습니다.

--

--

𝚢𝚘𝚘𝚗𝚜𝚞𝚗𝚐.𝚎𝚝𝚑
HAECHI AUDIT

𝙱𝚕𝚘𝚌𝚔𝚌𝚑𝚊𝚒𝚗 𝚋𝚕𝚊𝚑 𝚋𝚕𝚊𝚑 🍻 𝙾𝚙𝚒𝚗𝚒𝚘𝚗𝚜 𝚊𝚛𝚎 𝚖𝚢 𝚘𝚠𝚗.