noder is
everywhere
  • 카테고리
    • 에디터 초이스
    • 인사이트
    • 프로젝트 해부학
    • 큐레이션
    • 번역 콘텐츠
    • 인간 탐구
    • 시황 분석
    • 교육
  • 소개
    • 노더 소개
    • 필진 소개
  • 후원
    • 후원하기
    • 후원자님들 ♥
  • 노더콘 2021
  • 컨택
    • 제휴 문의
    • 텔레그램
    • 페이스북
    • 필진 지원
    • 뉴스레터 구독
최근 인기 포스팅
  • 다크웹 탐사 (2): 어두운 면을 보다
    다크웹 탐사 (2): 어두운 면을 보다
  • 다크웹 탐사 (1): Explore. Privately.
    다크웹 탐사 (1): Explore. Privately.
  • 블록체인 게임의 성공을 위한 4가지 요소
    블록체인 게임의 성공을 위한 4가지 요소
  • 바이낸스는 왜 아직 원화를 지원하지 않는가
    바이낸스는 왜 아직 원화를 지원하지 않는가
  • TPS만 높으면 장땡인가
    TPS만 높으면 장땡인가
페이스북 페이지
페이스북 페이지
조회수
  • 129,032 hits
noder
  • 카테고리
    • 에디터 초이스
    • 인사이트
    • 프로젝트 해부학
    • 큐레이션
    • 번역 콘텐츠
    • 인간 탐구
    • 시황 분석
    • 교육
  • 소개
    • 노더 소개
    • 필진 소개
  • 후원
    • 후원하기
    • 후원자님들 ♥
  • 노더콘 2021
  • 컨택
    • 제휴 문의
    • 텔레그램
    • 페이스북
    • 필진 지원
    • 뉴스레터 구독
3K
260
  • 프로젝트 해부학
  • 에디터 초이스

MakerDAO MCD 파헤치기 (1): Single Collateral Dept

  • 8월 29, 2019
  • 예상 완독 시간 7 분
  • 신진환
Total
21
Shares
21
0
0

암호화폐 담보형(Crypto-Collateralized) 스테이블 코인인 DAI(Sai)에 대한 개념과 곧 적용될 새로운 컨트랙트 구조체인 MCD(Multi-Collateral Dept)를 자세히 살펴보고자 한다. DAI 토큰에 대해서 짧게 말하자면, DAI 토큰은 1달러에 패깅되도록 이더리움 스마트컨트랙트을 통해 구현되어있으며, DAI 토큰을 발행하고 유지하기 위해서는 ETH를 담보로 필요로 한다.

DAI 토큰의 매커니즘은 http://wiki.hash.kr/index.php/메이커다오 에 잘 정리되어 있다.

실제 이더리움 메인넷에 배포되어 있는 메이커다오 컨트랙트가 어떻게 동작하고 있는지 깊게 살펴볼 것이다. 현재까지 DAI 토큰의 담보물로 사용 가능한 자산은 ETH 하나이며, 곧 여러 자산을 담보로 사용 가능하도록 업데이트될 예정이다. Kovan 테스트넷에는 앞으로 메인넷에 적용될 MCD 컨트랙트가 테스트 중에 있으며, 해당 컨트랙트를 통해서 ETH뿐만 아니라 다양한 토큰들을 담보물로 설정하여 스테이블 토큰인 DAI를 발행할 수 있다.

MCD 구조를 알기 위해서는 먼저 단일 담보자산 구조인 SCD(Single Collateral Dept)를 이해하고 넘어가야 할 것이다. 현재 SCD 구조의 DAI 토큰은 담보부 채권에 해당하는 CDP를 통해 발행(mint)되고 있다. CDP 생성 및 관리에 대해서는 메이커다오의에 핵심 스마트 컨트랙트 중 하나인 Tub 컨트랙트를 통해 가능하다.

SCD 구조

우선 현재 메인넷에 배포되어 있는 메이커다오 컨트랙트들의 구조를 살펴보자.

메이커다오 컨트랙트들이 배포되어 있는 상태는 https://dai.makerdao.com/ 사이트에서 확인이 가능하다. 해당 링크는 구버전의 메이커 웹 UI 포털이며, 현재는 https://cdp.makerdao.com/ 를 사용하기 권장하고 있다. (기존 사이트에서 모든 메이커다오 컨트랙트를 실행하기 위한 토큰 Approve를 총 6번 수행하여야 하나, 새로운 메이커 포탈에서는 3번만 해주면 된다.)

현재 메인넷에서 가동되고 있는 MakerDao 시스템의 스마트 컨트랙트 소스 코드는https://github.com/makerdao/sai 에서 소스 코드를 확인할 수 있다. 이 중 Top, Tub, Tap, Vox만 웹 포털에서 주소를 확인 할 수 있는데, 이는 메이커다오 시스템에서 가장 중요한 컨트랙트만을 표시해 둔 것으로 생각하면 된다.

tub.sol 소스 코드: https://github.com/makerdao/sai/blob/master/src/tub.sol

메이커다오 시스템에서 중요한 동작을 하고 있는 Tub 컨트랙트를 먼저 살펴보도록 하겠다. 아래는 tub.sol 에 위치하고 있는 SaiTub 컨트랙트의 데이터 구조체이다.

uint256                   public  cupi;
    mapping (bytes32 => Cup)  public  cups;

    struct Cup {
        address  lad;      // CDP owner
        uint256  ink;      // Locked collateral (in SKR)
        uint256  art;      // Outstanding normalised debt (tax only)
        uint256  ire;      // Outstanding normalised debt
    }

Cup은 하나의 CDP에 해당하며 cups 배열에 저장되고 있다. 하나의 CDP가 Open(생성)될 때마다 cupi 가 하나씩 증가하게 된다. 현재 글이 작성되고 있는 2019년 7월 16일까지 총 19,343개의 CDP가 생성되었다. 해당 CDP들은 웹에서 조회 가능하도록 https://mkr.tools/cdps 사이트가 정보를 제공하고 있다.

Cup의 lad는 해당 CDP를 생성(open)한 User의 Address이며, 이는 give 메소드를 통해서 다른 Owner의 Address 이전이 가능하다. ink는 해당 CDP에 담보로 설정된 PETH의 양이다. 내부 변수명은 SKR로 불린다. PETH는 WETH를 메이커다오 시스템 내에서 사용하기 위한 토큰이며, Pooled ETH로 불린다. art 와 ink 는 CDP 를 통해 생성한 DAI의 양에 비례한 부채이며, 가치 안정화 수수료인 (Stability Fee)의 포함 여부로 구분된다.

WETH는 이더리움 네트워크에서 사용되고 있는 ETH를 ERC20으로 1:1 교환한 토큰이다. 컨트랙트 내부에서 ERC20 토큰으로 사용하기 편하도록 변환한 것이다. 메이커다오 시스템에서 담보 자산으로 PETH를 사용하며 해당 자산을 CDP에 고정(lock)함으로써 DAI 토큰 발행에 사용할 수 있다. 그리고 이 PETH는 메이커다오 시스템 내부 컨트랙트에서 사용되는 토큰으로 외부 거래소 등에서 교환할 수 없다.

PETH는 Tub 컨트랙트에서 사용되는 토큰으로 WETH와 교환 비율이 1:1이 아니다. 이유는 PETH 공급에 대한 인센티브를 주기 위함이다. 토큰 이코노미에 대한 부분은 다음에 더 다루어 보도록 하겠다. WETH 에서 PETH 전환은 Tub 컨트랙트의 join 메소드를 통해 전환되며, 반대로 PETH에서 WETH의 전환은 exit 메소드를 통해 전환된다. 앞에서 이야기하였지만 PETH는 Tub 컨트랙트를 벗어날 수 없다.

SCD Core Contracts : Tub & Tap

CDP 생성에 대한 부분은 Tub 컨트랙트에 위치하고 있다. Tub 컨트랙트가 CDP 생성(Open)과 Dai 토큰 생성(mint)에 관한 부분을 담당하고 있다면, Tap 컨트랙트는 악성 CDP, 즉 담보물 가치대비 더 많은 Dai토큰을 발행한 부실채권에 대한 청산을 담당하고 있다.

결국 CDP내 자산의 흐름을 따라가다 보면, Tub 혹은 Tap 컨트랙트에서 끝나게 된다. 사용자가 CDP를 안전한 상태로 운영한다면 Tub컨트랙트내에서만 담보자산인 PETH가 위치한다. 메이커다오에서 설정한 담보물 설정 기준인 150%보다 낮은 상태의 CDP는 위험상태이며, 다른 사용자들에 의해 언제든지 Tap컨트랙트로 강제 이동된다. 이는 CDP 강제 청산이라고도 불릴 수 있으며, Tub 컨트랙트의 bite 메소드를 통해서 강제청산 프로세스가 시작된다고 볼 수 있다.

Tub 과 Tap컨트랙트를 그림으로 표현하면 위와 같다. 거대한 욕조(bath tub)에는 CDP들이 존재한다고 해보자. 이 CDP들을 마치 욕실 장난감처럼 욕조 내 물 수위에 따라 위치가 오르락내리락한다. 각각의 CDP들은 비중이 다른데 CDP에 담겨있는 담보 PETH를 기준으로 DAI 토큰을 많이 발행하면 할수록 비중이 무거워 욕조 수면 아래로 가라앉게 된다. 조금만 생각을 해본다면 욕조의 물 높이가 곧 ETH의 가격이라는 것을 눈치챘을 것이다. 욕조의 수면 높이가 높아지게 되면 그만큼 모든 CDP가 위쪽으로 이동하게 된다. 반대로 ETH 가격이 낮아지면, 욕조의 수면이 따라서 낮아지게 되고 모든 CDP들도 바닥 쪽으로 이동하게 된다. 이때 오른쪽 수도꼭지(Tap)가 위치하고 있는데 이 수도꼭지가 위치한 부근까지 CDP가 내려오면 강제 청산이 가능해지며, Tub 컨트랙트의 Bite 메소드를 통해 Tap 컨트랙트로 담보자산이 이동된다.

담보자산인 ETH의 가격이 상승한다면 모든 CDP가 Tap을 통해 강제 청산될 수 있는 Dept Ratio 150% 라인보다 높아지게 된다. 다시 욕조의 물의 높이에 비유하자면, ETH 가격인 수위가 높아지면 강제 청산 당할 수 있는 CDP들이 상대적으로 높은 위치로 이동하게 된다. 따라서 아래 예시에서 나온 unsafe 상태의 CDP도 safe 상태가 될 수 있다. CDP 생성자들은 자기 자신의 담보자산인 PETH를 지키기 위해 CDP에 더욱더 많은 PETH를 잠금(lock) 하거나 Dai 를 상환하게 된다. 그렇지 않다면 담보자산과 함께 unsafe 상태가 될 것이고 Tub 컨트랙트의 Bite 함수로 해당 CDP가 강제로 닫히게(shut) 되며, PETH가 Tap 컨트랙트로 이동된다.

반대로 담보자산의 가격이 하락한다면 모든 CDP들이 Tap을 통해 강제청산될 수 있는 Dept Ratio 150% 라인에서 가까워지게 되고, unsafe 상태에 있는 CDP들이 더 생겨나게 될 것이다.

Tub 컨트랙트의 Bite 함수를 살펴보자.

function bite(bytes32 cup) public note {
        require(!safe(cup) || off);

        // Take on all of the debt, except unpaid fees
        var rue = tab(cup);
        sin.mint(tap, rue);
        rum = sub(rum, cups[cup].art);
        cups[cup].art = 0;
        cups[cup].ire = 0;

        // Amount owed in SKR, including liquidation penalty
        var owe = rdiv(rmul(rmul(rue, axe), vox.par()), tag());

        if (owe > cups[cup].ink) {
            owe = cups[cup].ink;
        }

        skr.push(tap, owe);
        cups[cup].ink = sub(cups[cup].ink, owe);
    }

Bite 함수는 각각의 CDP 를 타겟으로 작동하며, unsafe 상태일때만 작동한다. off는 전체 메이커다오 시스템이 셧다운되었는지에 대한 flag이다.

또한, tab(cup) 을 호출하는데, 이는 CDP가 발행한 부채(art)에 해당하는 이자를 계산하여 리턴해준다.

function tab(bytes32 cup) public returns (uint) {
     return rmul(cups[cup].art, chi());
}

tab 함수를 따라가면 chi() 함수를 호출하는데, chi 함수는 drip 을 실행하고 _chi 를 리턴한다. 이때 _chi는 새로 업데이트된 누적 스테이블 수수료 비율이다. 

메이커다오 시스템에서 가장 핵심적인 함수가 바로 drip() 함수이다. Dai 토큰을 발행한 모든 CDP는 모든 Dai 토큰을 상환하고 추가적으로 Stability Fee를 지불해야만 담보자산인 PETH를 되돌려 받을 수 있다. 이때 Stability Fee를 개별 CDP마다 계산해주어야 하는데 이 수수료 계산을 CDP 생성자인 User 입장에서는 동기가 없다. 마치 은행에서 대출을 받았는데 대출금액에 이자를 은행이 아니라 대출자 스스로 계산하는 것이다. 대출자로서는 이자를 납부하고 싶은 동기가 전혀 없기 때문에 이자 계산을 하지 않을 것이다.

따라서 개별 CDP가 아닌 CDP를 통해 생성한 전체 부채(=Dai 생성된 양)를 기준, 발생하는 이자를 drip 함수를 통해 계산하도록 하였다.

//--Stability-fee-accumulation--------------------------------------

    // Accumulated Rates
    function chi() public returns (uint) {
        drip();
        return _chi;
    }
    function rhi() public returns (uint) {
        drip();
        return _rhi;
    }
    function drip() public note {
        if (off) return;

        var rho_ = era();
        var age = rho_ - rho;
        if (age == 0) return;    // optimised
        rho = rho_;

        var inc = RAY;

        if (tax != RAY) {  // optimised
            var _chi_ = _chi;
            inc = rpow(tax, age);
            _chi = rmul(_chi, inc);
            sai.mint(tap, rmul(sub(_chi, _chi_), rum));
        }

        // optimised
        if (fee != RAY) inc = rmul(inc, rpow(fee, age));
        if (inc != RAY) _rhi = rmul(_rhi, inc);
    }

메이커다오 시스템에서 drip 메소드는 사용자들이 메이커다오 컨트랙트에서 액션들을 할 때마다 실행하도록 설계하였다. 예를 들어 Dai를 생성(draw)하거나, 상환(wipe) 하거나, 강제청산 가능하도록 Bite를 실행하는 등 이자 연산과 관련된 여타 행동을 사용자들이 할 때마다 drip 함수가 실행된다. 사용자들이 메이커다오를 사용하려면 drip 함수가 간접적으로 호출되면서 CDP들에서 발생하는 이자가 계속해서 업데이트하게 된다.

마치며

SCD 시스템에서 CDP 와 담보 대출에 대한 이자계산인 drip함수를 살펴보았다. 이 구조는 MCD에서도 구조가 크게 다르지 않다. 다음 포스팅에서는 MCD 구조에서의 Dai 토큰 발행과 이자 계산에 대해 어떤 차이가 있는지 살펴보고자 한다.

공유하기:

  • Tweet
  • Telegram
Total
21
Shares
Share 21
Tweet 0
Pin it 0
Related Topics
  • 메이커다오
  • 스테이블코인
  • MakerDAO
  • MCD
  • SCD
신진환

생계는 이더리움, 노후는 비트코인.

추천 콘텐츠
스테이터스
콘텐츠 보기
  • 프로젝트 해부학
  • 에디터 초이스

디앱 re:UX 1호 – 안전한 커뮤니케이션을 위한 스테이터스

  • 7월 15, 2020
  • 노더
블록체인 게임
콘텐츠 보기
  • 에디터 초이스
  • 인사이트

블록체인 게임: 게임의 무엇이 토큰화되어야 하는가

  • 6월 30, 2020
  • 박재민
데이터 3법
콘텐츠 보기
  • 에디터 초이스
  • 인사이트

데이터 3법, 마이데이터 그리고 DID

  • 5월 18, 2020
  • 유수웅
디카르고
콘텐츠 보기
  • 프로젝트 해부학

상품을 움직이는 세 가지: 정보, 물질, 그리고 돈

  • 4월 29, 2020
  • 류짬
다크웹
콘텐츠 보기
  • 프로젝트 해부학

다크웹 탐사 (2): 어두운 면을 보다

  • 3월 26, 2020
  • 김동욱
화폐권력
콘텐츠 보기
  • 에디터 초이스
  • 인사이트

화폐는 권력이다

  • 3월 4, 2020
  • 박예신
큐레이션
콘텐츠 보기
  • 큐레이션
  • 에디터 초이스

노더스 멤풀 1호 – 플라즈마의 역사

  • 2월 6, 2020
  • 노더
콘텐츠 보기
  • 에디터 초이스
  • 인사이트

거래소 출금 수수료의 비밀: 공익을 위한 개인의 희생

  • 1월 29, 2020
  • Leo Won

댓글 남기기 응답 취소

  • 제휴 문의
노더를 찾아와주셔서 감사합니다

Input your search keywords and press Enter.