解读 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社区合作,确保这不是一个问题。