解读 DAI 架构流程图 —— Collateral模块

免责声明:本文不构成投资建议,仅研究技术为主,祝玩得开心 ^_^

上一节回顾

上个章节主要讲解了Core模块相关合约的细节,其中,包括 Vat合约和Spot合约。Vatdss 的核心 Vault 引擎。它存储 Vault 并跟踪所有相关的 Dai 和抵押品余额。它还定义了可以通过操作 Vault 和余额的规则。Vat 中定义的规则是不可变的,因此在某种程度上,可以将 Vat 中的规则视为 dss 的宪法。Spot是负责连接预言机(Oracles)与核心合约的现货接口。作为一个接口合约,它只存储当前的 ilk 列表。本章节,我们来解读Collateral模块的细节。

Collateral模块介绍

Collateral模块在MCD系统中充当抵押品角色,该模块会为 Vat 中添加的每个新抵押品类型(collateral type)进行部署。它包含了针对某一特定抵押品类型的所有适配器和拍卖合约。抵押品模块主要由JoinClip合约组成。

  • 抵押品模块组件概述
    • Join - 用于将未锁定的抵押品存入/提取到 Vat 的适配器。Join 包含三个智能合约:GemJoinETHJoinDaiJoin
    • 每个 join 合约都专门用于将给定的代币类型加入到 Vat 中。正因为如此,每个 join 合约在处理系统内不同类型的代币时都有略微不同的逻辑。
  • Join 合约究竟如何帮助 MCD 系统运行?
    • Join - join 适配器的目的是保留系统的安全性,只允许可信任的智能合约将值添加/删除到/从 Vat 中。存放在金库中已存入/已锁定的抵押品的位置在相应的 Join 适配器中。

潜在的陷阱(可能导致用户错误的来源)

  • 当用户希望进入系统并与 dss 合约进行交互时,他们必须使用其中一个 join 合约。
  • 如果 join 合约中存在合同错误,而用户不小心调用了 join,他们仍然可以通过给定的 join 合约上的相应退出调用来取回他们的代币。

故障模式

  • 可能会有一个 vat 升级,需要创建新的 join 合约
    • 如果一个 gem 合约在用户的抵押品在系统中时进行代币升级或冻结,可能会出现一种情况,即在冻结或升级完成后,用户无法兑换他们的抵押品。虽然这似乎是一个小风险,因为似乎进行这种升级的代币很可能希望与制造商社区合作,以确保这不是问题。
  • 潜在的网络钓鱼攻击
    • 随着 MCD 系统的发展,我们将看到更多的 join 合约、用户界面等。这使得用户有可能被一个恶意的 join 合约窃取资金,该合约会将代币发送到外部合约或钱包,而不是 vat

Join合约介绍

Join 由三个智能合约组成:GemJoinETHJoinDaiJoin

  • GemJoin - 允许将标准 ERC20 代币存入系统以供使用。
  • ETHJoin - 允许使用本地 Ether
  • DaiJoin - 允许用户将其 Dai 从系统中提取到标准 ERC20 代币。

每个 join 合约都是专门为允许给定的代币类型加入到 Vat 而创建的。正因为如此,每个 join 合约在处理系统内不同类型的代币时都有略微不同的逻辑。下面来看看join合约的交互流程以及其所在的位置(用黄色标注出来了)

JoinDiagram

Join合约细节说明

词汇表(Join

  • vat - Vat 地址的存储。
  • ilk - 为哪个 Ilk 创建 GemJoinid
  • gem - 用于转账的 Ilk 地址。
  • dai - Dai 代币的地址。
  • one - DaiJoin 中用于数学的 10^27 uint
  • live - join适配器的访问标志。
  • dec - Gem 的小数位数。

每个 Join 合约都有 4 个公共函数:构造函数、join 函数、exit 函数和cage 函数。

  • 构造函数在合约初始化时用于设置该 Join 合约的核心变量。
  • Joinexit 都符合其名称。Join 为用户提供了将给定代币类型添加到 Vat 的机制。它在每个变种中的逻辑略有不同,但通常简化为一个转账和一个在 Vat 中的函数调用。Exit 非常相似,但相反,它允许用户从 Vat 中移除他们想要的代币。
  • Cage 允许适配器被排空(允许代币流出但不流入)。

关键机制和概念

  • GemJoin 合约具有非常特定和单一的目的,相对于核心智能合约系统的其他部分,它被抽象出来。当用户希望进入系统并与 dss 合约进行交互时,他们必须使用其中一个 join 合约。在完成 dss 合约后,他们必须调用 exit 函数离开系统并提取他们的代币。当 GemJoin 被授权地址围困时,它可以从 Vat 中退出抵押品,但它不能再加入新抵押品。
  • 通过 join 添加到系统的抵押品代币余额在 Vat 中根据抵押品类型 Ilk 计算为 Gem,直到它们被转换为锁定的抵押品代币(ink),以便用户可以提取 Dai
  • DaiJoin 合约具有类似的目的。它管理 Vat 中跟踪的 DaiDai.sol 跟踪的 ERC-20 Dai 之间的交换。在用户使用抵押品提取 Dai 之后,他们将在 Vat 中拥有一个余额。这个 Dai 平衡可以使用持有 Vat.daimintERC-20 DaiDaiJoin 合约从 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 社区合作,确保这不是一个问题。