LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 实例解读:如何设计一个简洁的去中心化稳定币?

实例解读:如何设计一个简洁的去中心化稳定币?

2020-07-20 白计划 来源:链闻

加密货币基金 Calibrated Markets 管理负责人 Jacob Eliosoff 介绍简洁版去中心化稳定币系统设计实现。

原文标题:《什么是最简单的去中心化稳定币?》
撰文:Jacob Eliosoff,加密货币基金 Calibrated Markets 的管理负责

本文作者 Jacob Eliosoff 为加密货币基金 Calibrated Markets 的管理负责人,Calibrated Markets 是 Trevi Digital Assets Fund 的 GP,该基金研究比特币和相关加密货币,并进行长期投资。

Calibrated 由 Jacob Eliosoff 进行管理,Jacob Eliosoff 是一位计算机程序员,自 2013 年秋季以来一直从事该基金的工作。

文章经白计划 Yaoyao 编译整理,内容有所删减。

一段时间以来,这个问题一直萦绕在我的脑海中。直到上周,受到 MakerDAO 和 Uniswap 等项目的启发,我茅塞顿开,在这篇文章中,我将回顾以下部分:

计划的稳定币设计,这里称为 USM(「极简美元」);它极简的四种操作 :mint/burn(创建 / 兑换 USM 稳定币) 和 fund/defund(创建 / 兑换相关的「投资代币」FUM);我遇到的最大设计障碍,以及我提出的解决方案;一个大约 200 行 Python 的概念证明实现。

这只是为了做个有趣的尝试,只要它不会无辜损失用户的钱,成为一个真实实现的话会很酷。

注 : 本文仍为草稿,可能会有所修改。

基本理念 : 无风险的 USM +高风险的 FUM

最简单的可行的稳定币是依靠 ETH 池创建 / 赎回代币。将价值 n 美元的 ETH(在铸造时) 存入池中,铸造出 n 个新的「USM」稳定币,或者从池中烧掉 m 个 USM 换取价值 m 美元的 ETH(在燃烧时)。

为了方便,将使用 Ethereum,但设计是与平台无关的。

为什么这个方案行不通呢 ?

首先,要想知道 x 个 ETH 值 n 美元,你需要一个或多个价格预言机。这一点我们稍后再谈,几乎所有的稳定币都需要这个,所以即使是最简单的设计也需要它。而更大的问题是 ETH 的价格波动。

假设 ETH 是 200 美元,在池中存入 10ETH 就能铸造出 2000USM。假设 ETH 跌至 150 美元,烧掉你的 2000USM,但是,池中已经没有足够的 ETH(你应该得到 2000/150=13.33ETH,但池中只有 10ETH)。

抵押品池的价值下降,以至于无法清算未偿付的债权 (代币)。这对稳定币投资者和金融业来说是一个非常熟悉的问题。当你的伞不断地收缩和膨胀时,你如何保持干燥 ?

最简单的解决方案也很常见 : 对池进行超额抵押—给它一个安全缓冲,用更多的 ETH 赎回未偿还的 USM。

这样做,我们的系统需要一种方式,让其他参与者—「投资者」—把 ETH 加入到池中 (以换取第二个代币 FUM),并激励他们这么做。

让我们尝试两种激励方式 :

手续费:对铸币 / 烧钱操作收取少量费用,并分红给投资者。

杠杆:可以建立一个有市场风险的 ETH 池 (它的价值随 ETH 的价格涨跌),支持一堆 USM 代币,这些代币的唯一目的就是避免这种风险 (价格保持在 1 美元)。

所以我们将把所有的市场风险都抛给投资者 :

稳定币用户存入有风险的 ETH,收回无风险的 USM;投资者存入风险较大的 ETH,收回风险更大的 FUM。

这又是一个熟悉的金融技巧——「分级」风险。

现在,在创建 / 赎回 USM 代币的 mint(ETH->USM) 和 burn(USM->ETH) 操作之上,我们添加了 fund(ETH->FUM) 和 defund(FUM->ETH) 操作来创建 / 赎回 FUM。

一个简单的例子

ETH 价格 200 美元:

A 将 10ETH 存入池中,铸成 2000USM。(我们暂时不计算手续费)

B 进行投资操作,存入另外 5 个 ETH 以换取 1000 个 FUM,初始定价为 1 美元。

池包含 15 个 ETH(10 个和 5 个加在一起),价值 3000 美元A 拥有价值 2000 美元的 2000USMB 有价值 1000 美元的 1000FUM

ETH 涨到 220 美元:

15ETH 的池现在价值 3300 美元A 的 2000USM 仍然值 2000 美元B 的 1000FUM 值 1300 元

ETH 跌至 170 美元:

15ETH 值 2550 美元A 的 2000USM 值 2000 美元B 的 1000FUM 值 550 美元

ETH 跌至 100 美元:

15ETH 值 1500 美元A 的 2000USM 值 2000 美元B 的 1000FUM 值-500 美元

面对 ETH 价格的大幅下跌,B 的资金被证明是不足的 :

无论如何池都缩水了 (pool_value < usm_outstanding),不再有足够的 ETH 来赎回 A 的所有 USM,加上 B 也损耗了。

为什么缩水是不好的

这意味着并不是所有的 USM 持有者都可以赎回他们的 USM 来为 ETH 兑换 :

稳定币不再是「完全支持的」。只要用户不同时全部撤出 (「银行准备金业务」),那就没问题,但是…

实际上延迟兑换者最终可能会两手空空,这一事实激励持有人更早的兑换——导致潜在的银行挤兑。

FUM 投资者 B 的损失,同样也可能会促成一个糟糕的反馈循环,一旦出现下跌迹象,他们就会选择退出。

由于 FUM 的价格已如此之低,甚至是负值,新投资者可能会以极低的价格购买 FUM,这会严重地削减了早期投资者的资金。

这篇文章剩下的大部分内容都是关于如何避免这些情况,这是有意义的,因为除了「保持 1 美元」外,防止 / 处理抵押品贬值和基金投资人出局是稳定币设计中最基本的挑战。

更多关于 mint/burn/fund/defund 的细节

这个系统有三个动态部分 :

ETH 价格上下变化,改变池的价值。mint/burn 操作,创建 / 销毁 USM(同时向池中添加 / 从池中删除 ETH)。fund/defund 操作,创建 / 销毁 FUM(同时添加 / 移除 ETH)。

有关这些操作的更多详情 :

锚定美元 : 注意在正常运行的情况下 (特别是 : 不低于 1 美元,价格预言机准确),mint and 和 burn 应该保持 USM 与美元挂钩,让用户在任何时候可以立刻用 1 美元兑换价值 1 美元的 ETH,除了少量手续费。这个过程挑战在于如何保持系统资本化。

债务比率是这方面的关键度量 :usm_outstanding / pool_value。

当这个比率超过 100%(或者超过我们指定的 MAX_DEBT_RATIO,比如 80%) 时,系统可以通过禁用撤资和烧币操作来限制它,直到它下降,例如因新的投资者进入。

但以这种方式取消赎回,无论是频繁的还是偶尔短期的,都将损害用户对金融体系和价值锚定的信任。USM 在交易所的交易价格可能开始低于 1 美元……可能会有所缓解,但也可能不会。没有人会把赌注押在一个实验系统上。

铸币 / 烧币的具体机制很简单 : 投入 n 美元的 ETH,收回 nUSM(减去手续费),反之亦然。投资 / 撤资的机制更为巧妙。

基本模型是,这些操作会改变 FUM 的数量,但不会改变它的单价,它只是池的多余缓冲区的美元价值:

buffer_value=pool_value-usm_outstanding/fum_outstanding。

例如 (还是不计算手续费):

假设池中有 15 个 ETH,ETH 价格为 220 美元,池的总价值为 3300 美元,未偿付的 USM 为 2000 枚,FUM 为 1000 枚。

然后 :

负债比率 = $2000/$3300=60.61%缓冲值 =$3300-$2000=$1300FUM 单价 =$1300/1000=$1.30

C 将另外 13 个 ETH(价值 2860 美元) 投入池中,得到 2860 美元 /1.30 美元 =2200 个新铸造的 FUM。现在 :

池中有 28ETH,价值 6160 美元仍有 2000USM 未偿付3200 个 FUM 未偿还负债比率 =$2000/$6160=32.47%缓冲值 =$6160-$2000=$4160FUM 单价 =$4160/3200=$130

当 ETH 价格降到 200 美元 :

28ETH 价值 5600 美元2000USM 未偿还,3200FUM 未偿还负债比率 =$2000/$5600=35.71%缓冲值 =$5600-$2000=$3600FUM 单价 =$3600/3200=$1.125(下跌)

C 取走其 2200 个 FUM 中的 1000 个 (价值 :1000*$1.125=$1125),收回 $1125/ $200=5.625ETH:

22.375ETH 价值 4475 美元2000USM 未偿还,2200FUM 未偿还负债比率 =$2000/$4475=44.69%缓冲值 =$4475-$2000=$2475FUM 单价 =$2475/2200=$1.125(不变)

FUM 的价格

当池的资金缩水时,在第一个例子中,FUM 的单价暴跌到-0.50 美元。我们不能以负的价格或接近 0 美元的价格投资 / 撤资。

在这种情况 (例如,当债务比率 >MAX_DEBT_RATIO) 下最简单的处理方式是:

禁用撤资 (池需要资金)为了基金运营的目的,在资金价格上加一个溢价,保持资金价格 >$0。

但思考良久后会发现,有很多不同的方式来定义这种溢价,我在整个系统工作的 7 天里有 5 天是用来探索它们的。细节不在这篇文章的讨论范围之内,但简而言之,到目前为止我最喜欢的规则是 :

当债务比率 >MAX_DEBT_RATIO 时,投资操作 (投入 ETH 换取新的 FUM) 需要至少按 min_fum_buy_price 计算支付,即在债务比率超过 MAX_DEBT_RATIO 时对应的以 ETH 计算的 FUM 单价。

一旦债务比率回落到低于 MAX_DEBT_RATIO, min_fum_buy_price 将被清除,基金操作将再次以正常的 FUM 价格进行 (buffer_value/fum_outstanding)。

如果你想知道所有细节,可以了解这个例子 (如果不是,你可以跳过它):

再从 15 个 ETH 计算,ETH 价格 $220,价值 :$3300,包含 2000USM, 1000FUM:

负债比率 =$2000/$3300=60.61%缓冲值 =$3300-$2000=$1300FUM 单价 =$1300/1000=$1.30

ETH 价格跌至 100 美元 :

15ETH 价值 1500 美元2000USM 未偿还,1000FUM 未偿还负债比率 =$2000/$1500=133.33%缓冲值 =$1500-$2000=-$500FUM 理论单价 =-$500/1000=-$0.50

因为债务比率已经上升到 MAX_DEBT_RATIO=80% 以上,我们设置 min_fum_buy_price 为 ETH 下跌至 80% 时。

在这个例子中,当 ETH 价格达到 $166.67 时,当 buffer_value 是 (15*$166.67)- $2000=$500,因此 FUM 价格是 $500/1000=$0.50=0.003 ETH。

此时 D 投入 $600 的 ETH。因为 min_fum_buy_price=0.003,D 支付 0.003 ETH(0.30 美元) 每 FUM 的单价,而不是负理论价格-0.50 美元。所以 D 得到 6/ 0.003=2000 枚新铸造的 FUM:

此时 ETH 价格 $100,21ETH 价值 $21002000USM 未偿还,3000FUM 未偿还负债比率 =$2000/$2100=95.24%缓冲值 =$2100-$2000=$100理论上的 FUM 价格 =$100/3000=$0.0333min_fum_buy_price=0.003ETH(计算约为 $0.30)

如果 ETH 进一步下跌至 60 美元 :

21ETH 价值 $12602000USM 未偿还,3000FUM 未偿还负债比率 =$2000/$1260=158.73%缓冲值 =$1260-$2000=-$740FUM 理论价格 =-$740/3000=-$0.2467min_fum_buy_price=0.003ETH($0.18)

D 再次投入 6ETH=$360,同样得到 6/0.003=2000FUM。

以 ETH 计算,D 的融资利率与以前相同 (即 min_fum_buy_price=0.003ETH),但当 ETH 降至 60 美元时,以美元计算的利率更便宜 (0.003ETH=0.18 美元,之前是 0.30 美元):

此时 27ETH 价值 $16202000USM 未偿还,5000FUM 未偿还负债比率 =$2000/$1620=123.46%缓冲值 =$1620-$2000=-$380理论上的 FUM 价格 =-$380/$5000=-$0.076min_fum_buy_price=0.003ETH($0.18)

无论如何,最简洁、最安全的确保投资者投入合理的 (主动的) 资金的方式,还有进一步研究的空间。目前大致的方式是,当系统资金不足时,FUM 的价格应该低到足以吸引新的投资者进入,但又不能低到彻底折损老的投资者。

(Elliot Olds 的一个伟大建议 : 在这些情况下,债务比率 >MAX_DEBT_RATIO,即系统需要资金时,使 FUM 购买价格随时间下降。

这样就避免了 min_fum_buy_price 高于投资者的预期系统因缺乏资金而消亡。随着价格的不断下降,投资最终会到位,即使其价格会大大削减现有 FUM 持有者的风险 / 回报。新资金到位后,USM 的烧币将会恢复,这应该会让 USM 持有者安心,并对锚定美元的汇率抱有信心。)

系统其他部分

预言机使用什么价格 (ETH/USD,系统依赖的唯一外部数据),这是一个其他人可能更想了解的问题。在我的思考中,我建议使用 Uniswap 的其他几个稳定币价格的平均值 :USDT,USDC,PAX,DAI,TUSD。

投资 USM->FUM: 让投资支持 USM 作为一种投资方式 (因此,USM->FUM),连同 ETH (ETH->FUM),可能是个好主意。特别是当 ETH 的价格下降时,也就是当投资者花费 USM 可能比 ETH 更好的时候。

请注意,USM->FUM 投资操作对 ETH 池中的金额没有影响,即使扣除了手续费。它只是销毁了一些用户的 USM,并给予他们新铸造的 FUM 作为回报,而不动 ETH 池。

限价购买订单 : 该设计的一个有前景的补充是一个投资选项,用户可以以「6ETH 铸造 2000FUM」或「600USM 铸造 2000FUM」的选项下限价购买,如果价格下降到指定的比率就会触发。

这相当于在投资 op 中添加了一个可选参数:

max_price_in_eth/max_price_in_usm。

这样的设计可以在资金池的缓冲区之上,提供第二道防线。而且,由于 ETH 和 FUM 的价格很可能是密切相关的,以美元计价的投标应该比较稳定。

按照我们这里的目标 (以及 Uniswap) 的精神,治理应该是最小化的:「部署后就忘记」。

设计中没有包含冻结 / 撤回功能 : 如果需要修复这个部分,应该启动一个新的智能合同,用户可以选择迁移到新版本。我能想到的唯一受管理员限制的操作是指定一个「自愿升级」合同,这样用户就可以选择将他们的财产自动转移。

其他非美元挂钩的币种应该比较容易 : 唯一的挑战是找到一个好的价格来源,例如,ETH/EUR。事实上,比特币比欧元硬币更容易使用,因为 ETH/BTC 很容易从 Uniswap 获得。存入 ETH 时需要选择 :

造币厂 :0.025(或当时 ETH/BTC 的汇率)「BTC-pegcoins」,与 BTC 挂钩,就像 USM 与美元挂钩一样;基金 :1 ETH 的「比特币基金」——押注 ETH/ 比特币,就像 FUM 是押注 ETH/ 美元一样。

面对攻击

只是一些初步想法 :

预言机操纵价格。如果攻击者可以操纵价格来源,他们可以打破锚定,低买高卖,抽干资金池。

预言机是该系统最明显的弱点,随着 ETH 在池中的增长,它将成为更大的目标。对我们有利的是,这是许多其他系统 / 智能合同的共同弱点,所以我们可以利用这一点。

一个明显的处理方式是使这四种操作中的一部分或全部延迟 : 例如 burn 的逻辑可以是「给 USM,等一个小时,拿回 ETH」,而不是「给 USM,拿回 ETH」。这虽然影响用户体验,但可以对抗价格操纵,值得一试。

USM 系统对实时价格非常敏感。一些可能的方法可以降低这种灵敏度 :

a) 启动和执行之间的延迟,如上所述。

b) 随机分配这个延迟,例如,「你的铸币将在下一个小时的随机时间以 ETH/USD 的价格进行加工。」

c) 取较大数量的源价格的平均数 : 例如,多个平台上的多个稳定币。

d) 更高的手续费。下面示例代码中的往返买卖手续费为 0.6%,但这只是一个概念证明。

e) 一般来说,在某种程度上,是许多连锁系统共同面临的挑战,值得遵循它们的最佳实践。

当 ETH 的价格下降。抵押品担保体系崩溃最明显的方式就是抵押品贬值。然而,在这个系统中,贬值似乎在一定程度上得到了控制。在超过 MAX_DEBT_RATIO 的情况下,赎回被禁止,如果 ETH 暴跌,系统就会停止,直到注入新的资金。

FUM 持有者当然会损失大部分资金,但这是一种补偿风险,就像借款人拖欠贷款一样,而不是像大型保险公司破产那样的系统性失败。

特别是,只要 1 预言机的价格仍然准确,2 新的投资者总持续出现,USM 的锚定美元的会应该可以抵御 ETH 的价格下跌。所以预言机的价格似乎更脆弱。

概念验证实施

我编写了一个简单的 Python 命令行实现,虽然会有 bug,还需要进一步的修改,但它已经足够让您了解系统是如何工作的。下面是一个来自上面例子的副本镜像操作示例 :

来源链接:medium.com

—-

编译者/作者:白计划

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...