概述
MakerDAO是一个去中心化的基于区块链的金融系统,提供稳定币(Dai)、抵押贷款(CDP)和去中心化治理服务。
MakerDAO质押借Dai(CDP)是在以太坊区块链上运行的智能合约。它是稳定币系统Dai的核心组成部分,其目的是创建Dai来换取抵押品,然后将其保留在托管中,直到归还借入的Dai为止。
CDP会动态改变Dai的总量,在用户抵押资产时创建Dai,当用户使用Dai赎回资产时销毁对应的Dai,这个过程通过智能合约实现。
本文主要分析CDP的实现原理。
借贷流程
CDP过程涉及多种Token的流转与智能合约的调用,如下图所示。(图中圆形为Token,圆角矩形为智能合约及其实体)
CDP过程中Token流转过程第一步:创建CDP并存储抵押物
用户首先发送一个交易到 Maker 创建CDP,然后打包ETH成为WETH,将WETH转换为PETH,此时CDP创建完成,抵押的ETH已经存入到CDP中。
第二步:从CDP中生成 Dai
CDP持有者发送一个交易并明细想要从CDP中生成Dai的数量,同时CDP也会产生同等数量的债务,这笔债务会锁定抵押物直到未偿付的债务被付清。
第三步:偿还债务和稳定费用
当用户希望赎回抵押资产的时候,他们需要偿还CDP中的债务以及这个债务的稳定费用。稳定费 用只能用MKR支付。当用户将应付的Dai和MKR支付给CDP后,CDP中的债务就会偿清。
第四步:拿回抵押资产并关闭CDP
当债务和稳定费用偿还后,CDP持有者可以发送一个交易给Maker并拿回所有的抵押资产。
Token介绍
- WETH是ETH的1对1映射,是一种符合ERC-20标准的Token,可与以太币互换。代币地址:0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
- PETH是Maker DAO中ETH池产生的一种Token,当用户把WETH存入Maker DAO时,会得到对应的PETH,但PETH与WETH不是1对1映射的,是根据一定的汇率计算出来的。代币地址:0xf53ad2c6851052a81b42133467480961b2321c09
- DAI,Maker DAO的稳定币,价格接近1$,使用CDP借贷得到的就是DAI。代币地址:0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359
- SIN,代表已清算的债务,价值等于1DAI,在债务清算过程中使用。代币地址:0x79f6d0f646706e1261acf0b93dcb864f357d4680
- MKR,用于偿还债务时支付佣金的代币,通过wipe方法,地址:0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2
智能合约
Sai Tub智能合约
抵押借Dai(CDP)系统。CDP 是你在 PETH 抵押后生成的 DAI 的债务。Maker DAO 的大多数操作都是在该合约中完成。
合约地址:0x448a5065aebb8e423f0896e6c5d525c040f59af3
Sai Tap智能合约
可以用于清算债务并从中产生利润。
合约地址:0xbda109309f9fafa6dd6a9cb9f1df4085b27ee8ef
Maker DAO中的的智能合约有很多方法,下表对主要部分进行了分类:
智能合约方法分类核心代码
1、创建一个CDP
function open() public note returns (bytes32 cup) {
require(!off);
// cup是指一个CDP借贷,借贷总数+1
cupi = add(cupi, 1);
cup = bytes32(cupi);
// 绑定cup的创建者,lad是指所有者
cups[cup].lad = msg.sender;
LogNewCup(msg.sender, cup);
}
2、锁定PETH到CDP中
function lock(bytes32 cup, uint wad) public note {
require(!off);
// 将wad数量的PETH累加到cup中,ink为抵押品
cups[cup].ink = add(cups[cup].ink, wad);
// skr是抵押品抽象出来的一种Token
skr.pull(msg.sender, wad);
require(cups[cup].ink == 0 || cups[cup].ink > 0.005 ether);
}
3、向用户释放DAI,通过增加art
function draw(bytes32 cup, uint wad) public note {
require(!off);
require(msg.sender == cups[cup].lad);
require(rdiv(wad, chi()) > 0);
// art是一个抵押的债务
cups[cup].art = add(cups[cup].art, rdiv(wad, chi()));
// rum是所有CDP art的总和
rum = add(rum, rdiv(wad, chi()));
cups[cup].ire = add(cups[cup].ire, rdiv(wad, rhi()));
// 发行新的DAI,并发送给债权人
sai.mint(cups[cup].lad, wad);
require(safe(cup));
require(sai.totalSupply() <= cap);
}
参考
质押借Dai:https://cdp-cn.makerdao.com/
白皮书(中文):https://makerdao.com/whitepaper/Dai-Whitepaper-Dec17-zh.pdf
合约代码:https://github.com/makerdao/sai/tree/master/src
MakerDAO Tokens Explained: DAI, WETH, PETH, SIN, MKR. Part 1:https://medium.com/coinmonks/makerdao-tokens-explained-dai-weth-peth-sin-mkr-part-1-a46a0f687d5e
开发者文档:https://github.com/makerdao/sai/blob/master/DEVELOPING.md
网友评论