解读 DAI 架构流程图 —— Collateral模块
免责声明:本文不构成投资建议,仅研究技术为主,祝玩得开心 ^_^
上一节回顾
上个章节主要讲解了Core模块相关合约的细节,其中,包括
Vat
合约和Spot
合约。Vat
是dss
的核心Vault
引擎。它存储Vault
并跟踪所有相关的Dai
和抵押品余额。它还定义了可以通过操作Vault
和余额的规则。Vat
中定义的规则是不可变的,因此在某种程度上,可以将Vat
中的规则视为dss
的宪法。Spot
是负责连接预言机(Oracles
)与核心合约的现货接口。作为一个接口合约,它只存储当前的ilk
列表。本章节,我们来解读Collateral模块的细节。
Collateral
模块介绍
Collateral模块在MCD系统中充当抵押品角色,该模块会为
Vat
中添加的每个新抵押品类型(collateral type
)进行部署。它包含了针对某一特定抵押品类型的所有适配器和拍卖合约。抵押品模块主要由Join和Clip合约组成。
- 抵押品模块组件概述
Join
- 用于将未锁定的抵押品存入/提取到Vat
的适配器。Join
包含三个智能合约:GemJoin
、ETHJoin
和DaiJoin
。- 每个
join
合约都专门用于将给定的代币类型加入到Vat
中。正因为如此,每个join
合约在处理系统内不同类型的代币时都有略微不同的逻辑。
Join
合约究竟如何帮助 MCD 系统运行?Join
-join
适配器的目的是保留系统的安全性,只允许可信任的智能合约将值添加/删除到/从Vat
中。存放在金库中已存入/已锁定的抵押品的位置在相应的Join
适配器中。
潜在的陷阱(可能导致用户错误的来源)
- 当用户希望进入系统并与
dss
合约进行交互时,他们必须使用其中一个join
合约。 - 如果
join
合约中存在合同错误,而用户不小心调用了join
,他们仍然可以通过给定的join
合约上的相应退出调用来取回他们的代币。
故障模式
- 可能会有一个
vat
升级,需要创建新的join
合约- 如果一个
gem
合约在用户的抵押品在系统中时进行代币升级或冻结,可能会出现一种情况,即在冻结或升级完成后,用户无法兑换他们的抵押品。虽然这似乎是一个小风险,因为似乎进行这种升级的代币很可能希望与制造商社区合作,以确保这不是问题。
- 如果一个
- 潜在的网络钓鱼攻击
- 随着 MCD 系统的发展,我们将看到更多的
join
合约、用户界面等。这使得用户有可能被一个恶意的join
合约窃取资金,该合约会将代币发送到外部合约或钱包,而不是vat
。
- 随着 MCD 系统的发展,我们将看到更多的
Join
合约介绍
Join
由三个智能合约组成:GemJoin
、ETHJoin
和DaiJoin
:
GemJoin
- 允许将标准ERC20
代币存入系统以供使用。ETHJoin
- 允许使用本地Ether
。DaiJoin
- 允许用户将其Dai
从系统中提取到标准ERC20
代币。
每个
join
合约都是专门为允许给定的代币类型加入到Vat
而创建的。正因为如此,每个join
合约在处理系统内不同类型的代币时都有略微不同的逻辑。下面来看看join
合约的交互流程以及其所在的位置(用黄色标注出来了)
Join
合约细节说明
词汇表(
Join
)
vat
-Vat
地址的存储。ilk
- 为哪个Ilk
创建GemJoin
的id
。gem
- 用于转账的Ilk
地址。dai
-Dai
代币的地址。one
-DaiJoin
中用于数学的10^27 uint
。live
-join
适配器的访问标志。dec
-Gem
的小数位数。
每个
Join
合约都有 4 个公共函数:构造函数、join
函数、exit
函数和cage
函数。
- 构造函数在合约初始化时用于设置该
Join
合约的核心变量。 Join
和exit
都符合其名称。Join
为用户提供了将给定代币类型添加到Vat
的机制。它在每个变种中的逻辑略有不同,但通常简化为一个转账和一个在Vat
中的函数调用。Exit
非常相似,但相反,它允许用户从Vat
中移除他们想要的代币。Cage
允许适配器被排空(允许代币流出但不流入)。
关键机制和概念
GemJoin
合约具有非常特定和单一的目的,相对于核心智能合约系统的其他部分,它被抽象出来。当用户希望进入系统并与dss
合约进行交互时,他们必须使用其中一个join
合约。在完成dss
合约后,他们必须调用exit
函数离开系统并提取他们的代币。当GemJoin
被授权地址围困时,它可以从Vat
中退出抵押品,但它不能再加入新抵押品。- 通过
join
添加到系统的抵押品代币余额在Vat
中根据抵押品类型Ilk
计算为Gem
,直到它们被转换为锁定的抵押品代币(ink
),以便用户可以提取Dai
。 DaiJoin
合约具有类似的目的。它管理Vat
中跟踪的Dai
和Dai.sol
跟踪的ERC-20 Dai
之间的交换。在用户使用抵押品提取Dai
之后,他们将在Vat
中拥有一个余额。这个Dai
平衡可以使用持有Vat.dai
和mint
的ERC-20 Dai
的DaiJoin
合约从Vat
中退出。当用户希望将其Dai
移回Vat
账户系统(比如,偿还债务、参加拍卖、在End
打包bag
或利用DSR
等)时,他们必须调用DaiJoin.join
。通过调用DaiJoin.join
,有效地燃烧ERC-20 Dai
并将从DaiJoin
的余额转移Vat.dai
到用户在Vat
的账户。在系统的正常运行中,Dai.totalSupply
应该等于Vat.dai(DaiJoin)
余额。当DaiJoin
合约被授权地址围困时,它可以将Dai
移回Vat
,但它不能再从Vat
中退出Dai
。
需要注意的问题(可能导致用户错误的潜在来源)
- 加入合约中用户错误的主要来源是用户不应直接向合约转移代币,他们必须使用加入功能,否则将无法取回他们的代币。
- 由于系统的有限功能,加入合约系统中用户错误的来源有限。除了合约漏洞,如果用户不小心调用了
join
,他们总是可以通过给定的加入合约对应的退出调用来取回他们的代币。 - 这里需要警惕的主要问题是精心策划的网络钓鱼攻击。随着系统的发展,可能创建更多的加入合约或更多的用户界面,用户有可能被恶意的加入合约窃取资金,该合约并未实际将代币发送到
Vat
,而是发送到其他合约或钱包。
故障模式(操作条件和外部风险因素的边界)
- 可能会有一个
vat
升级,需要创建新的加入合约。 - 如果一个宝石合约在代币升级或代币冻结期间,用户的抵押品在系统中,可能会出现一种情况,即在冻结或升级完成后,用户无法赎回他们的抵押品。虽然这种情况可能带来一些风险,但进行升级的代币很可能希望与
Maker
社区合作,确保这不是一个问题。