# Introduction to DeFi | DeFi 导论 [toc] # 引 > 密码朋克认为最根本的一点是基本建构实际上定义了政治局面,所以,如果你有一个集中化的建构,即便由世界上最好的人来控制它,它也会吸引混蛋,而那些混蛋会利用他们的权力去做那些设计者本来没想去做的事。重点是要知道这关系到金钱。 —— 《密码朋克 ——自由与互联网的未来》 [澳] 朱利安·阿桑奇 早在比特币诞生之前,黑客与密码朋克们就开始了创造不依赖第三方信任机构的货币的努力[^Driving]。“I'm sure that in 20 years there will either be very large transaction volume or no volume.” 12 年后的今天,虽然没有像中本聪原本规划的那样成为世界货币,但比特币已经在世界范围内获得了史无前例的成功,促使着人们重新思考货币的本质的同时,也在不断的启发着她的后来者们,这其中也包括了曾经以世界计算机作为目标的以太坊。 [^Driving]: [比特币前传:黑客和密码朋克文化是这样诞生的](https://matataki.io/p/766) 在以太坊诞生之前,人们想要实现某个具体的去中心化应用时,只有修改比特币的代码,或者设计一条完全崭新的公链,例如染色币。这使得开发的应用难以扩展和维护,也难以在项目没有夭折之前,聚集起足够保障其安全性的算力,以太坊的诞生让开发去中心化应用的门槛和成本变得更低。 今天的的 DeFi 开发者和创业者们,早已不满足于实现货币本身,而是希望构建一整套拥有完整金融体系,有交易所、有货币、有银行、有信托、有衍生品的加密乌托邦了。这是一个演进飞快的世界,连记时的单位都与常世所不同。本书在写作过程中的目录和内容已经增删调整过很多次了,但也永远无法令人满意,只能在此时此刻取得一个快照(Snapshot),从中归纳出一些尽可能通用的不随时间进行而褪色的设计方法和开发技巧。 ## 各章览要 本书主要是一本面向一般工程师的指南,要读懂本书的全部内容,需要有一定的智能合约开发经验,本书将把一部分的必要知识放在附录中,而不去干扰接下來的「主线剧情」。在接下來幾個章節中,我们将選擇一些在行業內公認的最具有影響力的產品來一斑窺豹,這些產品代表了 DeFi 中最主要几种品类,她們是: - Ch 2 Uniswap 去中心化交易所。 - Ch 3 MakerDao 去中心化稳定币。 - Ch 4 Compound 去中心化的借贷协议。 - Ch 5 Yearn.finance 去中心化聚合器。 - Ch 6 MCDex 去中心化衍生品交易所。 第二章介绍去中心化交易所 Uniswap,Uniswap 是一种以极简主义为原则进行设计的自动化做市商协议,与传统的交易所相比,这种交易所不存在订单簿,用户直接与合约作为对手盘进行交易。 第三章介绍去中心化稳定币 MakerDAO,稳定币又被称为 DeFi 的王冠,长期以来,比特币作为货币一直被诟病的一个方面就是其价值尺度的功能,创造一种区块链上原生的稳定币是使得区块链得以走向大规模普及(Massive Addoption)所必须解决要解决的问题。 第四章介绍去中心化借贷协议 Compound,这是一个应用广泛的去中心化借贷协议,与 Uniswap 和 MakerDAO 类似,Compound 合约中也有一套机制去根据市场的供求关系实时调整利率。 第五章介绍去中心化聚合起 Yearn.finance,这个产品帮助用户智能的选择当前利率最高的 DeFi 项目进行投放,同时她也发行一个自己的治理通证 YFI,在这一章中,我们不仅将可以了解 DeFi 项目最迷人的特性 —— 互通性,还可以看到通证经济是如何在 DeFi 项目中起到画龙点睛的效果的。 第六章介绍去中心化衍生品交易所 MCDex,一个没有做空机制的市场是不完备的,这一个章节中我们将看到前面几章中所使用的合约开发技巧如何帮助我们创造出区块链上原生的衍生品。 ## 对习题的设置 本书将按照 TAOCP 中的方法,给出习题的大概难度,分为四个档位分别是: - N:水题,查阅书中段落或阅读文档就可以回答。 - R:中等题,需要一定的思考和计算。 - SR:难题,需要花费一些功夫,或者提交代码。 - SSR:特别难题,作为开放问题供读者进一步思考。 ## 勘误 量变引发质变,伟大的变革总是需要时间沉淀和积累的,而国内的多数玩家们喜 Hype 而轻 Depth。但「纸上得来终觉浅,绝知此事要躬行」,仅仅依靠本书提供的材料是远远不够打造一款崭新的 DeFi 产品的。碍于作者的水平有限,书中错误之处恐在所难免,还请读者不吝赐教,本书的 Github 勘误地址是 [https://github.com/lychees](https://github.com/lychees)。 # Ch 1 未来金融的大门 ## 什么是 DeFi DeFi 是去中心化金融「Decentralized Finance」的简称,但当这个简称在形成的时候,人们已经赋予了它超過字面意思的更多含义。關於 DeFi 究竟是什麼,曾經在 Devcon5 的周边活动 DeFi.WTF 上舉行過一次大辯論,每個參與者的觀點都不一致。因而我們暫且不去叩問這個術語的准确定義,而是去考察一些具體的 DeFi 產品,以試圖将她的定义歸納出来。 我们将提纲挈领的考察这些合约生产环境中最重要的业务逻辑相关的代码,并略去繁文缛节的细节和安全检查,但这并不是代表这些细节在合约开发中是不重要的,恰恰相反,它们是区分老练的合约工程师和新手最重要的准绳,毕竟 Code is Law,智能合约是与资产打交到的代码,即便是最老道的开发人员,有时也会一个简单的错误而导致数万乃至数千万,且没有后悔药可吃。 在最後一章中,我們將再次回到[^Junya]本節標題中所拋出的这个問題 —— 什麼是 DeFi。 [^Junya]: Junya Ishigami, Freeing Architecture ## DeFi 的特性 去中心化是 DeFi 产品的最核心特征,也是 DeFi 产品的基石。值得留意的是,去中心化與否並非二元對立,非 0 既 1 的结果,而是一个连续的光譜,光谱的两端分别是由主宰(中心化服务器)控制的虫族,和由卡拉(共识算法)连接的神族。 ![](https://i.imgur.com/8Ao9HoH.png) > 即将死于「单点故障」的异鬼军团 同样是一个细分领域的 DeFi 产品,它们的去中心化程度也 [很可能是不同的](https://orange.xyz/p/393)。《精通比特币》的作者曾经在直播时做过一次 QA 回答 [What Makes a Currency a Cryptocurrency?](https://www.youtube.com/watch?v=HX99C7NCWaM),我们不妨也模仿他的思路来探讨 DeFi 中的 “De” 具体体现在哪里。 - 无托管 无托管是去中心化的一个核心体现,通常的银行和交易所都需要用户将其资产托管给银行,而[控制也意味着负债](https://vitalik.ca/general/2019/05/09/control_as_liability.html),额外的托管也意味着用户需要承担交易所被骇或者跑路的风险,而这通常不是发生或不发生的问题,而是什么时候发生的问题。 - 中立性 以太坊的 Slogan 之一就是 We have no feature。中立意味着无偏见,或者无 KYC,KYC 是 Know Your Customer 的简称,字面意思是:了解你的客户。KYC 认证其实就是一种实名认证机制,主要用于预防反洗钱、身份盗窃、金融诈骗等犯罪行为,而 DeFi 产品通常是无偏见的,钱包另一端用户可能是一个平民也可能是一个罪犯,甚至是一只猴子,当然更多时候可能是一段代码。还在狱中服刑的丝绸之路的站长 Ross Ulbricht,[最近就写了一篇博文阐述了自己对 MakerDAO 协议的思考](https://medium.com/@RossUlbricht/remaking-the-maker-protocol-4b29f879f11)。迫于监管的压力,Uniswap 就曾在一次更新之后在前端页面阻止了来自一些国家的访问,但是很快官方也暗示这只是一个权宜之计,大家依然可以直接用钱包与合约进行交互或是使用第三方托管在 IPFS 的前端页面来进行访问。 - 抗审查 后疫情时代,全球化的进程暂告一段落,各国都开始走向封闭与对抗,各国都似乎开始走上了大局域网的道路,伴随着 App 消灭了数据之间的联系,划区运营应用商店制造了不同的花园围墙,严密审核禁止自行安装软件使得在分发渠道消灭 App 只需一纸政令。而比特币自诞生之初开始就是不被所有政府重视和承认的,在很多国家都被禁止,但这依然无法阻止她的生长壮大,类似美国政府迫使 TikTok 被收购这样的事情在区块链的世界里将更难被执行。 - 互通性 - 链上治理 [潘超:如何权衡 DeFi 的中心化与去中心化?](https://www.chainnews.com/articles/009361859090.htm) ## 如何使用 DeFi 产品 「纸上得来终觉浅,绝知此事要躬行」。我们强烈建议读者尽可能多的尝试使用和部署这些 DeFi 产品,你需要准备一个以太坊钱包,这里 PC 端推荐 MetaMask,移动端推荐使用 imToken,具体可以查阅网上的教程。 ## 本章注记 - [DeFi 懶人包:去中心化金融指南](https://blocktrend.gitbook.io/defi/) - [区块链社会学](https://matataki.io/p/4804) # Ch 2 Uniswap ## Uniswap 简介 本章介绍去中心化交易所 Uniswap,Uniswap 是一个运行在以太坊上的自动化做市商协议,主要用于 Ethereum 上的代币交换,它使用自动化做市(AMM)而不是订单簿。任何人都可以在 ETH 和任何 ERC20 代币之间快速交换,任何人也都可以通过提供流动性赚取手续费(每笔交易的 0.3%)并且在任何时候取回这些流动性,手续费的分润是实时的,但在价格变化较大的情况下,流动性提供者会遭受 "无常损失"(impermanent loss)。当价格恢复到提供流动性时的水平时,损失就会减少。如果交易量足够大,赚取的费用可能会抵消这一损失。任何人也都可以通过提供初始流动性池而创建一个新的交易对。 Uniswap 最鲜明的特征就是在交易的前后维持代币数量的乘积不变(Constant Product Market Maker),每个用户都可以为合约提供流动性并获得交易手续费作为回报。令人惊讶的是 Uniswap 迄今为止依然没有自己的原生治理通证而只有流动性代币,但这通常认为这也是 Uniswap 去中心化和极简主义的一个表现。Uniswap 会不会在 V3 中引入治理代币,将会如何引入成为每一个关心 DeFi 发展的人都在思考的问题。 本章中的代码来自 V2 版本。 ### 里程碑 - [2018-11 初版 Uniswap 在以太坊开发者大会 Devcon4 期间上线](https://uniswap.org/docs/v1/),这是一个使用类 Python 语法的合约语言 Vyper 实现的版本。 - [2019-11 Uniswap 一周年的时候创始人 Hayden 曾经写过一篇内容丰富的回顾其发展历史的 Blog](https://medium.com/uniswap/uniswap-birthday-blog-v0-7a91f3f6a1ba)。 - [2020-05 上线 V2](https://uniswap.org/blog/launch-uniswap-v2/),这是一个用 Solidity 实现的版本,开始实现支持原生 ERC20-ERC20 交易对等诸多新功能。 ### 增长 ![](https://i.imgur.com/4V8TVt9.png) - [DeFiPulse](https://defipulse.com/uniswap) ## 去中心化交易所的必要性與瓶頸 作為去中心化資產的加密貨幣,長期以來卻依靠著中心化的交易所提供的交易服務,作為一個悖論一直以來制約著加密貨幣的發展。自中心化交易所誕生之日開始,因各種事故所造成的丟幣事件就屢見不鮮[^1][^2]. ![](https://i.imgur.com/34FaYYN.jpg) > Mt.Gox 事件是第一次比特幣低潮的導火索 | 時間 | 交易所 | 被駭金額 | | -------- | -------- | -------- | | | Mt. Gox | $700MM | | | Coincheck | $530MM | | | Bitfinex | $120MM | | | Binanace | $27MM | 除了被駭的風險之外,去中心化交易所因為沒有引入額外的控制,從而無需進行 KYC 對用戶和資產進行區別對待,還可以提供相應的 API 對交易所的流動性進行編程,並且使得交易長尾和臨時的資產(cTokens, liquidity tokens, NFTs, etcs)成為可能。 雖然不時有新的中心化交易所的設計出現,但是因為速度、延遲、交易手續費等所造成用戶體驗方面的缺陷,使得這些去中心化交易所的交易規模都無法同便捷、高效的中心化交易所競爭,人們一直在等待著一個真正可以適合大規模應用的去中心化交易所方案。 [^1]: MtGox [^2]: 中心化交易所被駭總結。 [^3]: [🦄 Uniswap Birthday Blog — V0](https://medium.com/uniswap/uniswap-birthday-blog-v0-7a91f3f6a1ba) ## 定价曲线(Bounding Curve) 我們根據是否有具有訂單簿,通常可將去中心化交易所簡單分成有訂單和無訂單(AMM 既自動化做市商)兩種主要形式,Uniswap 屬於後者。簡單說來,Uniswap 通過 [工廠合約](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Factory.sol#L23),為每個交易對創建一個合約,合約中託管兩種資產 A 和 B,設她們的數量分別為 x 和 y,任何時刻,合約認為 x 數量的 A 資產和 y 數量的 B 資產的價值是相等的,並且在每次交易的前後,維持合約中 x 和 y 的乘積不變(Invariant)。 ![](https://i.imgur.com/H9entj5.png) 合約的初始流動性則有創建者給定,在給定了初始流動性的同時,它們的當前時刻的價格也就確定了。和 Bancor 所不同的是,任何用戶都可以隨時增加,和移除之前已增加的流動性,從而反映真實的市場交易需求。增加流動性的用戶將獲得對應的流動性通證,並作為日後分享合約交易手續費,以及贖回所提供的流動性資產的憑證。增加和删除流动性的过程中,维持合约中 x 和 y 的比值不变,即增减流动性操作不影响当前通证的价格。 Uniswap 由于其极简主义的设计,使得其相较其他去中心化交易所,非常节约交易手续费。对于 ETH 到 ERC20 的交易,它比 Bancor 的手续费低近 10 倍。 | 交易所 | Uniswap | EtherDelta | Bancor | Radar Relay (0x) | IDEX | Airswap | | -------- | -------- | -------- | -------- | -------- | -------- |---- | | ETH to ERC20 | 46,000 |108,000 | 440,000 | 113,000 | 143,000 | 90,000 | | ERC20 to ETH | 60,000 | 93,000 | 403,000 | 113,000 | 143,000 |120,000* | | ERC20 to ERC20 | 88,000 | - | 538,000 | 113,000 | - |- | Uniswap V2 中将协议分成了核心合约 [Uniswap Core](https://github.com/Uniswap/uniswap-v2-core) 和外围的辅助合约 [Uniswap Periphery](https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/UniswapV2Router02.sol)。而其中所有的兑换行为,最后都被规约到了核心合约的 swap 函数,此之谓「Uniswap」。 ```solidity=158 // this low-level function should be called from a contract which performs important safety checks function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock { require(amount0Out > 0 || amount1Out > 0, 'UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT'); (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings require(amount0Out < _reserve0 && amount1Out < _reserve1, 'UniswapV2: INSUFFICIENT_LIQUIDITY'); uint balance0; uint balance1; { // scope for _token{0,1}, avoids stack too deep errors address _token0 = token0; address _token1 = token1; require(to != _token0 && to != _token1, 'UniswapV2: INVALID_TO'); if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data); balance0 = IERC20(_token0).balanceOf(address(this)); balance1 = IERC20(_token1).balanceOf(address(this)); } uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0; uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT'); { // scope for reserve{0,1}Adjusted, avoids stack too deep errors uint balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3)); uint balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3)); require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(1000**2), 'UniswapV2: K'); } _update(balance0, balance1, _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } ``` 我们发现在 [UniswapV2Pair.sol](https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Pair.sol) 中,并没有进行相应的数值运算,而仅仅是在第 182 行检查了不等约束。这是一种有效的合约优化技巧,可以将较为耗时具体的数值操作转移到链下进行而同时保证链上合约运行的准确无误。 ## 流动性提供者(Liquidity Provider) Uniswap 的流动性通证是一种支持增发和销毁的 ERC20 通证,发行方为每个交易对合约,当用户执行 `add_liquidity` 操作时,最后将会由核心合约执行 `Mint` 函数根据该笔操作所提供的流动性与当前合约整体流动性的比值,计算出需要增发的流动性通证。 假设当前已发行 t 单位流动性通证,合约中 A、B 两种资产的储备金数值分别为 x,y。新加入的储备金分别为 x',y',那么需满足: `x/y = x'/d'` 新发行的流动性通证 t',那么有 `x'/x = y'/y = t'/t`。 根据此关系可以计算出新发行的流动性通证的数值(第 123 行)。 ```solidity=109 // this low-level function should be called from a contract which performs important safety checks function mint(address to) external lock returns (uint liquidity) { (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings uint balance0 = IERC20(token0).balanceOf(address(this)); uint balance1 = IERC20(token1).balanceOf(address(this)); uint amount0 = balance0.sub(_reserve0); uint amount1 = balance1.sub(_reserve1); bool feeOn = _mintFee(_reserve0, _reserve1); uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1); } require(liquidity > 0, 'UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED'); _mint(to, liquidity); _update(balance0, balance1, _reserve0, _reserve1); if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date emit Mint(msg.sender, amount0, amount1); } ``` 手续费则是直接增加的 liqudity pool 中,利用某种类似懒标记(Lazy Tag)的方式,因而每次交易时,k 的值实际有所增加,在销毁流动性通证的时候兑付,详情可参考文档中关于 [手续费的段落](https://uniswap.org/docs/v2/advanced-topics/fees)。 https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol ## 链上价格预言机(Onchain Oracle) ## 本章注记 最早的關於去中心化交易所的嘗試可追溯到比特幣時代的 Hash Time Locked Contracts,例如 Bisq 和 LocalBitcoins,這些模式昂貴,緩慢,不靈活但是久經檢驗。另一些嘗試是 Ring Exchanges,例如 ShapeShift。另一些人開始嘗試構建一條新的區塊鏈來處理交易,求中最具有代表性的是比特股(BitShares),但是這些定制化的區塊鏈因為缺少原生的交易資產,在跨鏈技術還沒有成熟的時代,需要引入額外的信任來構建可交易的資產。 緊接著出現的是 OasisDex 和 EtherDelta,前者是 MakerDAO 團隊為 MKR 和 DAI 建立的鏈上託管的交易所,在很長時間裡 OasisDex 都是 Ethereum 上流量最高的去中心化交易所之一。EtherDelta 則是劃時代的去中心化交易所設計方式,她通過 Off-chain Relay,On-chain Settlement 的方式,做出了絕佳的 trade-off,真正將中心化交易所帶向普及。 ![](https://i.imgur.com/J2rYqu0.png) 從完全鏈上模式的去中心化交易所中,又衍生出兩個分支,她們分別是有訂單薄的(代表產品 Kyber)和沒有訂單簿的 Bancor。Bancor 最早引入了 Bounding Curve 的概念,並提出無需訂單簿的交易機制更加能夠適應長尾代幣的需求[4],但是她的 Bounding Curve 設計較為複雜,且有一個保證金率的參數,使得合約在一經設定之後,流動性就是固定的。後來一些人們發現,Bounding Curve 不必依賴 Bancor 中的複雜曲線,例如註明的 P3D 遊戲,使用最簡單的一次函數來作為 Bounding Curve。而 Uniswap 中使用反比例函數(a.k.a. x*y=k 或者 Constant Product Market Maker Model)作為 Bounding Curve,所有的普通用戶都可以為交易所提供流動性,並創建流動性代幣。 很多後續的產品也在 Uniswap 的 Bounding Curve 基礎上進行改造,例如 Banlencer 和 Curve。 [^3]: [Bancor Protocol Continuous Liquidity for Cryptographic Tokens through their Smart Contracts](https://storage.googleapis.com/website-bancor/2018/04/01ba8253-bancor_protocol_whitepaper_en.pdf) - [解析 DeFi 項目《Uniswap》,吳冠融 Roger Wu](https://medium.com/taipei-ethereum-meetup/defi-uniswap-1-e36db975e4ae) - [A Brief History Of Decentralized Exchange, Tom Schmidt](https://github.com/carboclan/pm/issues/69) - [What explains the rise of AMMs?](https://medium.com/dragonfly-research/what-explains-the-rise-of-amms-7d008af1c399) - [When is Uniswap a good oracle?](https://medium.com/gauntlet-networks/why-is-uniswap-a-good-oracle-22d84e5b0b6c) ## 习题 1. [R] P3D 的线性价格曲线 2. [R] 可分润代币模型 3. [SR] Bancor 的价格公式 4. [SR] Rex 的设计 # Ch 3 MakerDAO ## MakerDAO 简介 MakerDAO 是一个在以太坊上的去中心化信用平台,用户通过提供超额抵押物(Collateral)铸造一种价值与美元挂钩的稳定币 DAI。任何人都可以锁定 ETH 或 BAT 等抵押品,并以该抵押品为抵押产生 DAI 债务。DAI 债务会产生稳定费(即持续计息)。 同时如同 MakerDAO 的名字所暗示的那样,MakerDAO 是一个二元通证体系,其上还有另一个治理通证 MKR,MKR 的持有者通过对稳定费水平等风险参数的投票来行使治理权。同时 MKR 也是用以支付稳定费的凭证,还 DAI 时将会销毁用户作为稳定费支付的 MKR。同时 MKR 的持有者也是黑天鹅事件发生时的最后一道防线。如果全系统的抵押品价值下降过快,MKR 就会被铸造,并在公开市场上出售,以筹集更多的抵押品,稀释 MKR 持有人的利益。MakerDAO 还有一个功能就是在合约中储蓄多余的 DAI 以获得用户支付的稳定费作为利息。 本章中的代码来自多抵押 DAI 版本。 ### 里程碑 - [2016-12 给出 2017 年产品路线图](https://web.archive.org/web/20170608025915/https://blog.makerdao.com/2016/12/02/2017-product-roadmap/) - [2017-12 初版 DAI 上线](https://medium.com/@MakerDAO/dai-is-now-live-ad87e34fc826) - [2018-09 多抵押 DAI 开放 Code Review](https://medium.com/@MakerDAO/dai-is-now-live-ad87e34fc826) - [2019-11 多抵押 DAI 上线](https://twitter.com/androolloyd/status/1196458513243017217?s=20) [https://github.com/makerdao/awesome-makerdao/tree/fb9704ef13ae0dcef5f6fc26f17fd155469258ca#milestones--achievements](https://github.com/makerdao/awesome-makerdao/tree/fb9704ef13ae0dcef5f6fc26f17fd155469258ca#milestones--achievements) ### 增长 ![](https://i.imgur.com/rLI2P0K.png) https://defipulse.com/maker ## 穩定幣 —— DeFi 的聖杯 ### 货币性的光谱 金银天然不是货币,但货币天然是金银。什么是货币?今天的人们需要以一种批判性的眼光重新审视这个问题。同之前所说的去中心化程度一样,货币性也可以认为是一个光谱,一些物品可能比一些物品更加具有货币性(例如 Steam 点卡之于香蕉)。一般认为,一种物品被称为是货币,需要同时具有下面的三个性质: - 价值储藏(Store of Value) - 交易媒介(Medium of Exchange) - 记账单位(Unit of Account) 但是如果缺少了其中的某些性质会怎么样?比特币长期以来不被认为是货币的缘故,正是因为他缺少了第三个性质。因为缺少稳定性,比特币很难在日常生活中作为记账单位来使用[^例外]。在很多交易场景中,人们无法使用剧烈波动的货币进行交易,例如预测市场,可能在揭晓结果的时候货币的价值已经与投入时发生了剧烈的变化,这极大的限制了加密货币的普及,著名的游戏平台 Steam 就曾经在 2017 年因为比特币价格的剧烈波动而撤销支付手段中对比特币的支持。如何构建区块链上原生的稳定币就成了加密货币发展过程中的一个重要环节,因而稳定币也被人称之为 DeFi 的圣杯。 [^例外]: 但是在一些互联网原生的环境下可能会有例外,例如一些勒索软件会要被骇者支付固定数额的比特币。 ### 稳定币的历史与分类 - 法币托管模式,代表产品 USDT、GUSD、Paxos、ets。 - 资产抵押模式,代表产品 MakerDAO。 - 算法央行模式,代表产品 Basis。 首先我们介绍稳定币中最早、影响力也最大的产品 [USDT](https://en.wikipedia.org/wiki/Tether_(cryptocurrency)), a.k.a. Tether。USDT 的构想产生于 Bitfinex 交易所对规避资本管制和政府监管的需求,其出现的原因和离岸美元是一致的,很多交易所没有办法获得美元账户及当地牌照,但是它需要通过美元进行计价和结算。Tether 没有办法直接和美国银行合作,因而它把存款放在台湾和欧洲的银行,这些银行虽然没有美联储的账户,因而没有美元准备金,但他们可以在美国的银行开个账户,因此就可以将用户的美元存到其在美国银行的账户里。有了这样的美元账户之后,Tether 就可以发行 USDT。在 2017 年牛市的前后,迫于世界范围内监管的压力,很多连美元账户都没有的交易所,选择直接将 USDT 作为他们的储备金,并作为主要支持的稳定币。 尽管存在着谁也说不清楚的潜在的超发罪名,但是事实上 USDT 获得了巨大的成功,帮助了无数的交易者完成了她们的交易,USDT 本身的市值甚至可以一定程度上衡量世界对加密货币的需求。 在 2018 年 10 月围绕着 Bitcoin Cash 展开的算力大战期间,USDT 的价格曾经一度逼近 0.9 美金。在 2019 年 4 月底围绕着 Tether 的一起诉讼案件中,Tether 的律师声称每 1 个 USDT 的背后 有 0.74 美金的储备金。但正是由于这些问题,使得人们一直都在寻找一种更好的稳定币方案。MakerDAO 就是在这样的背景下诞生的。 同 Tether 所不同的是,DAI 是一种去中心化的稳定币架构,每一个 DAI 的背后都有超额抵押的链上资产作为支撑。事实上早在 2010 年,比特币的先驱之一 Hal Finney 就提出过使用比特币作为储备金建立比特币数字银行的构想。 > “I believe this will be the ultimate fate of Bitcoin, to be the ‘high-powered money’ that serves as a reserve currency for banks that issue their own digital cash. Most Bitcoin transactions will occur between banks, to settle net transfers. Bitcoin transactions by private individuals will be as rare as… well, as Bitcoin-based purchases are today.” > —— Bitcoin Talk 2010 但无疑 MakerDAO 这种链上的央行,更加符合人们的构想。由于基于区块链完全透明的特性,人们始终知道 DAI 背后有足额的资产保证。如果资产价格上升,那么 DAI 的担保将更充足。如果资产下跌到一定值(原 CDP 开启者没有追加保证金或偿还 DAI),合约会自动启动清算。由于以太坊无需准入的特点,任何用户都可以清算抵押不足的资产,并且获得 3% 的无风险收益。这也激励了很多市场参与者扮演 Maker 中的 Keeper 角色,他们不仅可以从系统中获益,同时也保护了 DAI 的偿付性。 - [潘超,一篇文章读懂稳定币:3 种技术模式与基础理论介绍](https://www.chainnews.com/articles/043853363135.htm) - [Binance Research, The Evolution of Stablecoins](https://research.binance.com/en/analysis/stablecoins-evolution) ## DAI 的稳定机制 Blockchain is all about incentive. 稳定币的需求侧随着市场的变化而变化,因而我们用机制设计来决定供给侧,从而使得 DAI 的价格尽可能的接近 1 美金。 ### MakerDAO 黑话(Jargon) 本节开始我们将考察部分 MakerDAO 的合约代码,MakerDAO 的合约代码充满了令人迷惑的缩写(Jargon)以可读性差而闻名[^SAI],不时引起 [新人的抱怨](https://twitter.com/lassebirk/status/1199967318975094784)。 在 Maker 的紫皮书和 101 Slide 中 Maker 团队都做了详细的澄清,以说明为何团队会选择使用这些会令人摸不着头脑的缩写,而不是使用在金融和合约中的术语。 ![](https://i.imgur.com/B4pIPUO.png) [^SAI]: "The advantages of using this specific jargon are explained in the purple paper. It should be noted that this jargon creates a barrier to entry for developers and interested parties that want to understand the system." —— [SAI Coin Code Review_v1_3.pdf](https://makerdao.com/saiCodeReview/SAI%20Coin%20Code%20Review_v1_3.pdf) 除了以上这些原因,其实笔者还认为,这种缩写有一种难以言状的韵律感和幽默感,属于 [工程师三美德之「傲慢」](https://en.wikiquote.org/wiki/Talk:Larry_Wall)。[作为某以代码可读性差而知名的算法竞赛选手](https://www.zhihu.com/question/24379827/answer/30511070),笔者对此反而倍感亲切。 ### 铸币(Draw) ![](https://i.imgur.com/qhATBas.png) > Vat: a large tank or tub used to hold liquid 和 Uniswap 一样,MakerDAO 也由多个合约组成,其中最重要的三个合约叫做核心模块(Core Module),而核心模块中,又以 Vat 合约最为重要(下面中最大的圆柱形的部分),倘若日后发现了更好的方案,MakerDAO 的合约发生升级,那么最不可能发生变化的就是 Vat 合约。 ![](https://i.imgur.com/9P1uDAa.png) 如上一节所说,DAI 的铸造过程并不是由中央金融机构宏观调控完成的,而是通过在智能合约中托管的超额抵押物。在多抵押 DAI 合约中,负责托管抵押物的数据结构 [由原先的 CDPs(抵押债仓)变更为了 Vualts](https://blog.makerdao.com/say-goodbye-to-cdps-and-hello-to-maker-vaults/),负责描述相关行为的合约就叫做 Vat。 ![](https://i.imgur.com/Uv6M5Qt.png) > 对角巷中的古灵阁银行,根据电影《哈利波特与魔法石》中描述,哈利·波特的金库是 687 号,那里存放着父母遗留给他的一笔数目相当可观的财产。 每当用户将抵押品发送给 [Vat 合约](https://docs.makerdao.com/smart-contract-modules/core-module/vat-detailed-documentation) 时,就会收到新铸造的稳定币 DAI(198 行)。你所铸造的 DAI 的数量取决于你在 Vat 中投入的抵押品价值,这个比例是固定的(178 行),但会随着市场的供需关系而变化,抵押品与新铸造的 DAI 的价值比率,称之为抵押率(ilk.rate)。这一过程通常也称之为借 DAI。 ```solidity=164 // --- CDP Manipulation --- function frob(bytes32 i, address u, address v, address w, int dink, int dart) external note { // system is live require(live == 1, "Vat/not-live"); Urn memory urn = urns[i][u]; Ilk memory ilk = ilks[i]; // ilk has been initialised require(ilk.rate != 0, "Vat/ilk-not-init"); urn.ink = add(urn.ink, dink); urn.art = add(urn.art, dart); ilk.Art = add(ilk.Art, dart); int dtab = mul(ilk.rate, dart); uint tab = mul(ilk.rate, urn.art); debt = add(debt, dtab); // either debt has decreased, or debt ceilings are not exceeded require(either(dart <= 0, both(mul(ilk.Art, ilk.rate) <= ilk.line, debt <= Line)), "Vat/ceiling-exceeded"); // urn is either less risky than before, or it is safe require(either(both(dart <= 0, dink >= 0), tab <= mul(urn.ink, ilk.spot)), "Vat/not-safe"); // urn is either more safe, or the owner consents require(either(both(dart <= 0, dink >= 0), wish(u, msg.sender)), "Vat/not-allowed-u"); // collateral src consents require(either(dink <= 0, wish(v, msg.sender)), "Vat/not-allowed-v"); // debt dst consents require(either(dart >= 0, wish(w, msg.sender)), "Vat/not-allowed-w"); // urn has no debt, or a non-dusty amount require(either(urn.art == 0, tab >= ilk.dust), "Vat/dust"); gem[i][v] = sub(gem[i][v], dink); dai[w] = add(dai[w], dtab); urns[i][u] = urn; ilks[i] = ilk; } ``` 你可能已经注意到了这个 forb() 函数中,最后面两个参数都是有符号整形 `int dink, int dart`。就如同第一章中所介绍 Uniswap 合约中的 `swap()` 函数一样,此处的 Forb 函数,不仅可以处理借 DAI,也将可以处理还 DAI 的情况。 ### 还 DAI(Wipe) > 有借有还,再借不难。 > ——中国谚语 > 若想取回抵押品,金库所有者必须偿还之前铸币时所生成的 DAI,并支付此期间产生的稳定费。同 Uniswap 中使用 routing 合约来处理用户交互一样,在 MakerDAO 中也是分离处理的,其中普通用户与核心模块的交互逻辑是在 [代理模块(Proxy Module)](https://docs.makerdao.com/smart-contract-modules/proxy-module) 进行的。 ```solidity=517 function wipe( address manager, address daiJoin, uint cdp, uint wad ) public { address vat = ManagerLike(manager).vat(); address urn = ManagerLike(manager).urns(cdp); bytes32 ilk = ManagerLike(manager).ilks(cdp); address own = ManagerLike(manager).owns(cdp); if (own == address(this) || ManagerLike(manager).cdpCan(own, cdp, address(this)) == 1) { // Joins DAI amount into the vat daiJoin_join(daiJoin, urn, wad); // Paybacks debt to the CDP frob(manager, cdp, 0, _getWipeDart(vat, VatLike(vat).dai(urn), urn, ilk)); } else { // Joins DAI amount into the vat daiJoin_join(daiJoin, address(this), wad); // Paybacks debt to the CDP VatLike(vat).frob( ilk, urn, address(this), address(this), 0, _getWipeDart(vat, wad * RAY, urn, ilk) ); } } ``` 此处 `_getWipeDart` 为计算出所取回的抵押品的数量,我们发现此处返回的是一个负数,从而可以继续调用上一节 Vat 合约中的 Forb 方法。 ```solidity=181 function _getWipeDart( address vat, uint dai, address urn, bytes32 ilk ) internal view returns (int dart) { // Gets actual rate from the vat (, uint rate,,,) = VatLike(vat).ilks(ilk); // Gets actual art value of the urn (, uint art) = VatLike(vat).urns(ilk, urn); // Uses the whole dai balance in the vat to reduce the debt dart = toInt(dai / rate); // Checks the calculated dart is not higher than urn.art (total debt), otherwise uses its value dart = uint(dart) <= art ? - dart : - toInt(art); } ``` https://github.com/makerdao/dss-proxy-actions/blob/master/src/DssProxyActions.sol#L517 ### 清算(Grab) 当市场发生剧烈波动时,用户铸币时所使用的抵押品可能会资不抵债,这个时候合约为了优先保护 DAI 价格的稳定,就会执行清算动作。在 Vat 合约中,负责取走待清算资产的函数叫做 grab(),很形象的描述了清算的过程。 ```solidity=228 // --- CDP Confiscation --- function grab(bytes32 i, address u, address v, address w, int dink, int dart) external note auth { Urn storage urn = urns[i][u]; Ilk storage ilk = ilks[i]; urn.ink = add(urn.ink, dink); urn.art = add(urn.art, dart); ilk.Art = add(ilk.Art, dart); int dtab = mul(ilk.rate, dart); gem[i][v] = sub(gem[i][v], dink); sin[w] = sub(sin[w], dtab); vice = sub(vice, dtab); } ``` 这个函数只执行了最底层的清算逻辑,而负责监控资产状态,标记危险资产的 Agent,则是另一个核心合约——Cat。 ![](https://i.imgur.com/r5xvkmQ.png) > Cat: “bites” Vaults that are too risky. Cat 合约最核心的方法自然是 bite()。 https://github.com/makerdao/dss/blob/master/src/cat.sol#L119 ```solidity=119 // --- CDP Liquidation --- function bite(bytes32 ilk, address urn) external returns (uint id) { (, uint rate, uint spot) = vat.ilks(ilk); (uint ink, uint art) = vat.urns(ilk, urn); require(live == 1, "Cat/not-live"); require(spot > 0 && mul(ink, spot) < mul(art, rate), "Cat/not-unsafe"); uint lot = min(ink, ilks[ilk].lump); art = min(art, mul(lot, art) / ink); require(lot <= 2**255 && art <= 2**255, "Cat/overflow"); vat.grab(ilk, urn, address(this), address(vow), -int(lot), -int(art)); vow.fess(mul(art, rate)); id = Kicker(ilks[ilk].flip).kick({ urn: urn , gal: address(vow) , tab: rmul(mul(art, rate), ilks[ilk].chop) , lot: lot , bid: 0 }); emit Bite(ilk, urn, lot, art, mul(art, rate), ilks[ilk].flip, id); } ``` 其中第 131 行的 grab() 函数负责管控用户的待清算资产,再通过 134 行,交由相应的清算合约发起拍卖请求。 ```solidity=56 // --- Data --- struct Ilk { address flip; // Liquidator uint256 chop; // Liquidation Penalty [ray] uint256 lump; // Liquidation Quantity [wad] } ``` 注意此处的 `Ilk` 是 Cat 合约中的类型,与 Vat 合约中的定义不同,这里的 flip 是具体负责执行清算逻辑的合约地址,chop 是相应的罚金数量,而 lump 是等待被清算的资产数量。 ```solidity=22 interface Kicker { function kick(address urn, address gal, uint tab, uint lot, uint bid) external returns (uint); } ``` 第 22 行定义了拍卖合约中 kick() 函数的接口,而这个接口的具体逻辑则在外部的合约中定义,目前拍卖相关的逻辑,在 [主合约仓库的 flip 合约](https://github.com/makerdao/dss/blob/master/src/flip.sol#L107) 中。 ### 拍卖(Flip) > 牟先生顿了顿,慢慢地说:「当然,当然有了,我研究了这么多年,人类怎样才能进入更加公正合理的新社会?我觉得,最公平的办法,其实也就是最简单的办法。比如说分粥吧,谁分都行,但分完以后让别人先挑,剩下的最后一碗,是他自己的。」 > —— [电视剧《一手托两家》](https://dy.163.com/article/E8A0QN1P0541704S.html) 本节介绍 [MakerDAO 中的拍卖模块](https://docs.makerdao.com/smart-contract-modules/collateral-module/flipper-detailed-documentation),拍卖合约是一种常见的合约功能,一般也被用做作为 Solidity 合约的入门教程,关于更多种类的拍卖方式,可以参见附录。 类似博弈论中经典的分蛋糕问题,MakerDAO 中的拍卖合约也是一个两部方法,在第一个步骤中([tent](https://github.com/makerdao/dss/blob/master/src/flip.sol#L131)),首先使用一个升序的竞价拍卖,以筹得足够多的 DAI 用以填补系统的债务。第二个步骤中([dent](https://github.com/makerdao/dss/blob/master/src/flip.sol#L150)),再使用一个降序的竞价拍卖,以尽可能多的保护被清算人的资产。 https://makerdao.com/zh-CN/whitepaper/#maker-%E5%8D%8F%E8%AE%AE%E6%8B%8D%E5%8D%96 https://docs.makerdao.com/auctions/the-auctions-of-the-maker-protocol ### 喂价(Spot) ## 治理 ### MKR —— DAI 的治理孪生 Beyond: Two Souls ### 权益 ### 投票 ## 本章注记 ![](https://i.imgur.com/QwMn1xx.png) https://en.wikipedia.org/wiki/Money#cite_note-greco-5 经济学家和人类学家们关于货币本质和起源的争议从来没有停止过。 在《货币与交换机制》(1875年)一书中,威廉 斯坦利 杰文斯从四个功能方面对货币进行了著名的分析:交换媒介、共同的价值尺度(或记账单位)、价值标准(或延期支付标准)、价值储藏。到了1919年,杰文斯对货币的四种职能进行了总结,写成了下面的对句(Couplet)并在之后的宏观经济学教科书中广为流传。 > Money's a matter of functions four, > A Medium, a Measure, a Standard, a Store. —— 威廉 斯坦利 杰文斯 但现在大多数现代教科书只列举了交换媒介、记账单位和价值储藏三种职能,而把延期支付标准作为归入其他职能之中。关于货币的功能组合,历史上也有很多争议,有人认为它们需要更多的分离,单一的单位不足以处理所有的功能。其中一种观点认为,货币作为交换媒介的作用与其作为价值储藏的作用是冲突的:作为价值储藏的作用需要持有价值而不花费,而作为交换媒介的作用则需要货币流通;还有人认为,价值的储藏只是对交换的延缓,但并没有削弱货币是一种可以跨越空间和时间运输的交换媒介。 主流的经济学著作都认为,货币的出现源自复杂的物物交换。也有一些学者对这种观点提出挑战。票证主义者(Chartalism)认为,货币起源于国家引导经济活动的尝试,而不是自发地解决以物易物的问题,也不是将债务象征化的手段。货币之所以具有交换价值,是因为国家用货币对经济活动征税。人类学家大卫·格雷伯在[《债:第一个5000年》](https://book.douban.com/subject/20272111//)一书中对这一学说进行了佐证,并认为债的的出现远在货币之前。 比特币的出现则再次挑战了人们对于货币本质的理解,一些比特币的批评者认为比特币只是一种庞氏骗局,本身并不承载任何价值。另一些学长则主张从历史演化的角度给比特币正名。Saifedean Ammous 在 The Bitcoin Standard: The Decentralized Alternative to Central Banking 一书中回顾了货币发展的历史,总结了比特币相比她的前辈们的革命之处和她的缺陷。 - [Remaking the Maker Protocol](https://medium.com/@RossUlbricht/remaking-the-maker-protocol-4b29f879f11) - [想要从零开始理解MakerDAO?这篇文章应该是最佳选择](https://orange.xyz/p/345) - [MakerDAO 的“黑色星期四”](https://www.chainnews.com/articles/174831366892.htm) ## 习题 1. [N] [在 Vat 合约中有如下的结构定义](https://github.com/makerdao/dss/blob/master/src/vat.sol#L37): ```solidity=37 // --- Data --- struct Ilk { uint256 Art; // Total Normalised Debt [wad] uint256 rate; // Accumulated Rates [ray] uint256 spot; // Price with Safety Margin [ray] uint256 line; // Debt Ceiling [rad] uint256 dust; // Urn Debt Floor [rad] } struct Urn { uint256 ink; // Locked Collateral [wad] uint256 art; // Normalised Debt [wad] } ``` 其中唯 `Ilk.Art` 首字母大写,试说明原因。 # Ch 4 Compound ## Compound 简介 MakerDAO 是一个在以太坊上的去中心化信用平台,用户通过提供超额抵押物(Collateral)铸造一种价值与美元挂钩的稳定币 DAI。任何人都可以锁定 ETH 或 BAT 等抵押品,并以该抵押品为抵押产生 DAI 债务。DAI 债务会产生稳定费(即持续计息)。 同时如同 MakerDAO 的名字所暗示的那样,MakerDAO 是一个二元通证体系,其上还有另一个治理通证 MKR,MKR 的持有者通过对稳定费水平等风险参数的投票来行使治理权。同时 MKR 也是用以支付稳定费的凭证,还 DAI 时将会销毁用户作为稳定费支付的 MKR。同时 MKR 的持有者也是黑天鹅事件发生时的最后一道防线。如果全系统的抵押品价值下降过快,MKR 就会被铸造,并在公开市场上出售,以筹集更多的抵押品,稀释 MKR 持有人的利益。 MakerDAO 还有一个功能就是在合约中储蓄多余的 DAI 以获得用户支付的稳定费作为利息。 ## 利率模型 ### 使用率 Compound 的利率模型是根据市场供求关系决定的,衡量供求关系的一个指标就是使用率(utilization rate),使用率就是所有放貸進來的錢當中,已經被借走的比例,定义为: `ur = b / t`。其中 b 表示当前借出的金额,t 表示所有放贷的金额。 ## 借款年利率 (borrow rate) br = 基礎利率 + (ur x 加給利率) ## 放贷年利率 sr ≈ br x ur x (1 - 保留利率) ## 清算機制 ## 本章註記 - [Compound 审计报告:DeFi 项目中心化风险和智能合约漏洞不容忽视](https://www.chainnews.com/news/299594562904.htm) - [MolochDAO 联合创始人:Compound 上出借 DAI 存在智能合约风险、中心化单点故障和挤提风险](https://www.chainnews.com/news/121594847323.htm) - [橙皮书,去中心化的货币市场:Compound是怎样用区块链重构「借钱」这件事的?](https://orange.xyz/p/326) - [Compound-InterestRateModel合约分析](https://www.sher.vip/article/12#directory009217063377957895) - [Compound on OpenZeppelin](https://blog.openzeppelin.com/?s=Compound) - [What You Should Know Before Putting Half a Million DAI in Compound](https://medium.com/@ameensol/what-you-should-know-before-putting-half-a-million-dai-in-compound-fafdb2645f77) —————— # Ch 5 Yearn.finance ## Yearn.finance 简介 Yearn.finance 是一个去中心化的聚合器,利用 Aave、Compound、Dydx 和 Fulcrum 等借贷服务来优化你的代币借贷。当你把你的代币存入Yearn.finance 时,它们会被转换为 yTokens,并定期重新平衡,以选择最有利可图的借贷服务。Curve.fi 是 yTokens 的重要整合者——在yDAI、yUSDC、yUSDT、yTUSD 之间建立了一个 AMM(自动做市商),并赚取借贷和交易产生的费用。 提到 Yearn.finance 就不能不提到她的治理通证 YFI,YFI 分配给用一定 yToken 提供流动性的用户,通过流动性挖矿产生。 ### 里程碑 ### 增长 ![](https://i.imgur.com/QXeZVSa.png) https://defipulse.com/yearn.finance # Ch 6 MCDex ## MCDex 简介 > MCDex 全称是 MonteCarlo DEX,是一个提供永续合约的去中心化交易所,交易者可以用 ETH 做多/做空 ETH,而不需要持有其他加密货币。 ### 里程碑 - [2019-12 基于 Mai Protocol V1 上线 Beta 版本](https://medium.com/@montecarlodex/mcdex-%CE%B2-version-is-officially-launched-d553437243b1) - [2020-04 基于 Mai Protocol V2 上线 Perpetual 版本](https://medium.com/@montecarlodex/introduce-mcdex-v2-perpetual-c97b18ff4e23) - [2020-06 OpenZeppelin MCDEX Mai Protocol V2 审计报告](https://blog.openzeppelin.com/mcdex-mai-protocol-audit/) - [2020-07 开启流动性挖矿](https://medium.com/@montecarlodex/mcdex-will-launch-liquidity-mining-on-july-8th-8084691f8d6e) ### 增长 ![](https://i.imgur.com/vmzqz0z.png) https://defipulse.com/mcdex ## 衍生品市场 ![](https://i.imgur.com/hzJX5J5.png) > Hedge Fund. Noun. An ingenious device by which the rich get richer even while every other poor SOB is losing his shirt. -The Anarch's Dictionary, Volume Who's Counting? Gain 9 credit. > —— [对冲基金,矩阵潜徙(ANR)](https://juebankapai.fandom.com/zh/wiki/Hedge_Fund(ANR)) 衍生品(Derivatives)是三大金融工具(Financial Instruments)之一[^fi]。金融衍生品是一种合约,其价值和回报率由一些标的资产(Underlying)的表现情况衍生(Derives)出来,如同导数(Derivatives)之于原函数。 标的资产可以是农产品,矿石、股票、债券、利率、汇率或是指数等。一些较常见的衍生品包括远期(Forwards)、期货(Futures)、期权(Options)、掉期(Swaps)以及合成债务担保证券(Synthetic Collateralized Debt Obligations)和信用违约掉期(Credit Default Swaps)等结构性投资产品。衍生品可用于多种目的,包括对价格变动进行保险(对冲),增加价格变动的风险敞口以进行投机,或获得其他难以交易的资产或市场。对此类金融工具进行买卖投资者需要十分谨慎,因为由其引起的损失有可能大于投资者最初投放于其中的资金。在今年 4 月 20 日的晚间,美国 WTI 原油期货 5 月合约就曾上演过史诗级崩盘,一夜暴跌超 305%,收盘价格竟为 -37.63 美元/桶,成为历史上第一次负价格,刷新所有投资者的认知,不少投资者不仅亏光了本金,还欠下了一笔负债。对衍生品的滥用是造成 2008 年美国次贷危机的直接原因。 ![](https://i.imgur.com/RiOQpcv.png) [^fi]: 另外两个是股票(Shares)和债券(Bonds)。 ### 古典衍生品 人类进行衍生品(Derivative)交易的历史可以追溯到公元前 1750 年的古巴比伦时期,在汉谟拉比法典(Code of Hammurabi)中就允许双方就在未来某个日期以商定的价格交付货物和资产的形式订立合同,并允许合同的转让,法典促进了第一批衍生品,即远期和期货合同的形式。 关于期权合同最早的文字记录可以追溯到亚里士多德的《政治学》中,书中讲述了一个来自米利都的贫穷哲学家泰勒斯使用类似美剧《硅谷》中 Peter Gregory 的技巧,预测到下一个秋天橄榄的收成会特别好。泰勒斯成功地与当地的橄榄压榨机所有者达成了协议。没有人知道即将到来的收获季是丰收还是歉收,而橄榄压榨机主持有这些合约可以对冲掉因歉收所带来的潜在风险。后来证明,泰勒斯的预测是正确的,收获季的时候,使用橄榄榨油机的需求量急剧增加,超过了供应量(榨油机的可用性),泰勒斯就以高价卖出了这些橄榄榨油机的未来使用合同,并赚了一大笔钱。 ![](https://i.imgur.com/cAvr7jh.jpg) > [美剧硅谷 SE1 EP3 中](https://pangzitv.com/vod-play-id-20713-src-1-num-3.html),Peter Gregory 通过计算巴西和缅甸的蝗灾周期,买了一批印尼的芝麻期货,解决了两个创业者的融资问题。 更现代的例子来自江户时期日本大阪的 [堂岛米交易所](https://en.wikipedia.org/wiki/D%C5%8Djima_Rice_Exchange)。 总的来说衍生品的主要功能是: - 价格发现 - 对冲风险 - 降低门槛 - 金融投机 ### 加密衍生品 > δῶς μοι πᾶ στῶ καὶ τὰν γᾶν κινάσω. > —— Αρχιμήδης 最成功的加密衍生品当属比特币永续合约(Perpetual Contract),[这是一个加密世界的原生发明](https://twitter.com/zhusu/status/1291157925227094016),完美的契合了比特币市场 24 小时无间隙交易的特征以及大多数参与者投机的需求,使得比特币永续合约一经推出就迅速的达成了 Product Market Fit。 与传统的的期货合约相比,永续合约没有到期或交割的约定。以之前硅谷中所描述的芝麻期货合约为例,在传统的期货市场上,这些合约都标明了芝麻的交割时间,当期货合约到期时,芝麻应该按照合约的约定进行交割。因此,有人实际持有这些芝麻,这就造成了合约的账面成本(Carrying Costs)。例如之前的石油期货之所以会产生负价格,就是因为这些账面成本的存在,随着合约的账面成本增加,未来的潜在价格将变得更加不确定,因而现货市场与期货市场会存在系统性的价差。永续合约在模仿现货市场行为的同时,试图利用商品不交割的优势,以期缩小期货价格与现货价格的差距。 下面先介绍永续合约中出现的一些关键概念: - 保证金交易(Margin Trading):与 Ch 2 中所描述的现货市场不同,合约市场允许交易者使用保证金从市场借来自己没有的资产进行交易。 - 融资融券(Funding):既从市场上借来所需资产的过程。做多时,交易者需借来资金执行买入(融资),做空时,交易者需借来标的资产执行卖出(融券)。当然,借出方是不会让自己亏本的,当市场的价格快速变化,使得保证金的价值无法还清借款时,将被执行强制平仓(即所谓爆仓)。 - 杠杆(Leverage):杠杆倍率等于保证金比例的倒数,1% 的保证金比例也就意味着 100 倍杠杆,交易者的所有的盈亏都将会乘以这个倍率。 - 初始保证金(Initial Margin):建仓时所需要的最小保证金。下文缩写为 IM。 - 维持保证金(Maintenance Margin):防止被强制平仓所需要的最小保证金。如果交易者账户余额 + 未实现盈亏低于该数值,将会被强制平仓。下文缩写为 MM。 - 未实现盈亏(Unrealized Profit and Loss):未实现盈亏指用户未平仓仓位的收益,按照合理标记价格将当前仓位平仓后,预计的盈亏金额。不同于传统衍生品,本章所介绍的去中心化衍生品中,盈亏可以随时取出,所以实际是已实现盈亏。下文缩写为 PnL。 - 标价(Mark Price):计算 IM、MM 和 PnL 时所引用的标的价格。 - **资金费率(Funding Rate)**:多头和空头之间博弈和付款的参数。资金费率决定了哪一方是付款方。如果比率为正,则多头支付空头;反之,则空头支付多头。**资金费率是合约价格与标的资产的价格保持接近的关键所在**,设计糟糕的资金费率会让永续合约风险更高、波动性更大。 __ - [https://www.binance.com/en/support/faq/360033524991](https://www.binance.com/en/support/faq/360033524991) - [https://mcdex.io/references/#/zh-CN/white-paper](https://mcdex.io/references/#/zh-CN/white-paper) ### 去中心化衍生品 尽管比特币衍生品市场产生了影响深远的发展,但是和中心化交易所所面临的问题一样,人们一直在寻找是否有可以创造不依赖第三方托管机构的完全在链上运行的去中心化衍生品市场。智能合约为这种创新提供了可能。提供去中心化衍生品的产品主要有 [Synthetix](https://www.synthetix.io/),[UMA](https://umaproject.org/),[Market Protocol](https://marketprotocol.io/),[DDex](https://ddex.io/) 以及 [MCDex](https://mcdex.io/)[^SQ]。 [^SQ]: 岛娘案:我真的没有收钱 = =||。 ## Market Protocol 我们先介绍在 MCDex 中所使用的 Market Protocol。 Market Protocol 的核心功能就是允许用户在合约中锁入 ERC20 资产,以创建这些资产的头寸代币(Position Tokens)。头寸代币跟踪这些资产的价格,并提供指定价格上限和下限之间的价格敞口(Price Exposure),智能合约保证偿付能力,并提供杠杆作用,且无需追加保证金。类似物理世界中的磁极和电荷,头寸代币也总是成对出现的,她们分别代表了看多和看空两个方向的看多头寸代币(Long Position Token)和看空头寸代币(Short Position Token)。 ### 杠杆机制 ![](https://i.imgur.com/eYzPpfY.png) 下面以一个例子来说明,Market Protocol 的杠杆机制。 https://medium.com/market-protocol/position-tokens-pricing-on-mpx-explained-7b2d2ddb556f ### 铸币 ![](https://i.imgur.com/ASrU4cy.png) > 大型强子对撞机(图文无关)。 ```solidity=70 /// @notice Called by a user that would like to mint a new set of long and short token for a specified /// market contract. This will transfer and lock the correct amount of collateral into the pool /// and issue them the requested qty of long and short tokens /// @param marketContractAddress address of the market contract to redeem tokens for /// @param qtyToMint quantity of long / short tokens to mint. /// @param isAttemptToPayInMKT if possible, attempt to pay fee's in MKT rather than collateral tokens function mintPositionTokens( address marketContractAddress, uint qtyToMint, bool isAttemptToPayInMKT ) external onlyWhiteListedAddress(marketContractAddress) { MarketContract marketContract = MarketContract(marketContractAddress); require(!marketContract.isSettled(), "Contract is already settled"); address collateralTokenAddress = marketContract.COLLATERAL_TOKEN_ADDRESS(); uint neededCollateral = MathLib.multiply(qtyToMint, marketContract.COLLATERAL_PER_UNIT()); // the user has selected to pay fees in MKT and those fees are non zero (allowed) OR // the user has selected not to pay fees in MKT, BUT the collateral token fees are disabled (0) AND the // MKT fees are enabled (non zero). (If both are zero, no fee exists) bool isPayFeesInMKT = (isAttemptToPayInMKT && marketContract.MKT_TOKEN_FEE_PER_UNIT() != 0) || (!isAttemptToPayInMKT && marketContract.MKT_TOKEN_FEE_PER_UNIT() != 0 && marketContract.COLLATERAL_TOKEN_FEE_PER_UNIT() == 0); uint feeAmount; uint totalCollateralTokenTransferAmount; address feeToken; if (isPayFeesInMKT) { // fees are able to be paid in MKT feeAmount = MathLib.multiply(qtyToMint, marketContract.MKT_TOKEN_FEE_PER_UNIT()); totalCollateralTokenTransferAmount = neededCollateral; feeToken = mktToken; // EXTERNAL CALL - transferring ERC20 tokens from sender to this contract. User must have called // ERC20.approve in order for this call to succeed. ERC20(mktToken).safeTransferFrom(msg.sender, address(this), feeAmount); } else { // fee are either zero, or being paid in the collateral token feeAmount = MathLib.multiply(qtyToMint, marketContract.COLLATERAL_TOKEN_FEE_PER_UNIT()); totalCollateralTokenTransferAmount = neededCollateral.add(feeAmount); feeToken = collateralTokenAddress; // we will transfer collateral and fees all at once below. } // EXTERNAL CALL - transferring ERC20 tokens from sender to this contract. User must have called // ERC20.approve in order for this call to succeed. ERC20(marketContract.COLLATERAL_TOKEN_ADDRESS()).safeTransferFrom(msg.sender, address(this), totalCollateralTokenTransferAmount); if (feeAmount != 0) { // update the fee's collected balance feesCollectedByTokenAddress[feeToken] = feesCollectedByTokenAddress[feeToken].add(feeAmount); } // Update the collateral pool locked balance. contractAddressToCollateralPoolBalance[marketContractAddress] = contractAddressToCollateralPoolBalance[ marketContractAddress ].add(neededCollateral); // mint and distribute short and long position tokens to our caller marketContract.mintPositionTokens(qtyToMint, msg.sender); emit TokensMinted( marketContractAddress, msg.sender, feeToken, qtyToMint, neededCollateral, feeAmount ); } ``` https://github.com/MARKETProtocol/MARKETProtocol/blob/develop/contracts/MarketCollateralPool.sol#L70 上述代码的 117 行为用户将资产锁仓至合约,130 行交由主合约的 mintPositionTokens() 方法铸造头寸代币。 ```solidity=130 /// @notice called only by our collateral pool to create long and short position tokens /// @param qtyToMint qty in base units of how many short and long tokens to mint /// @param minter address of minter to receive tokens function mintPositionTokens( uint256 qtyToMint, address minter ) external onlyCollateralPool { // mint and distribute short and long position tokens to our caller PositionToken(LONG_POSITION_TOKEN).mintAndSendToken(qtyToMint, minter); PositionToken(SHORT_POSITION_TOKEN).mintAndSendToken(qtyToMint, minter); } ``` https://github.com/MARKETProtocol/MARKETProtocol/blob/develop/contracts/MarketContract.sol#L130 两种方向的头寸代币也都是 ERC20 代币,由两个不同的合约发行,且数量相等。 ```solidity=51 /// @dev Called by our MarketContract (owner) to create a long or short position token. These tokens are minted, /// and then transferred to our recipient who is the party who is minting these tokens. The collateral pool /// is the only caller (acts as the owner) because collateral must be deposited / locked prior to minting of new /// position tokens /// @param qtyToMint quantity of position tokens to mint (in base units) /// @param recipient the person minting and receiving these position tokens. function mintAndSendToken( uint256 qtyToMint, address recipient ) external onlyOwner { _mint(recipient, qtyToMint); } ``` https://github.com/MARKETProtocol/MARKETProtocol/blob/develop/contracts/tokens/PositionToken.sol ### 交割 头寸代币被铸造之后,她们就可以像普通的 ERC20 代币一样,在中心化或去中心化的交易所中进行交易,因而合约还需要负责接下来交割的逻辑。 铸造一对持仓代币所需的ERC20抵押品的数量可以通过取价格上限与价格底线的差额乘以qtyMultiplier来计算。所有这三个变量都是在部署新的MarketContract时定义的。这个金额代表了结算时整个可能的交易结果范围。一对多头和空头头寸代币的价值将始终是这个金额,事实上可以在任何时候以这个金额赎回。对于每一个单位的抵押品,多头代币可能会获得,空头代币的定义将失去。这样一来,这对代币始终是零和的,这两种代币的持有者对标的资产价格没有净敞口,它们基本上是完美对冲的。用户如果想获得风险敞口,无论是做多还是做空,只需在二级市场(交易所)上购买该特定的代币,或者铸造这对代币,然后卖掉不需要的那一面。 ```solidity=51 /// @notice Called by a user that currently holds both short and long position tokens and would like to redeem them /// for their collateral. /// @param marketContractAddress address of the market contract to redeem tokens for /// @param qtyToRedeem quantity of long / short tokens to redeem. function redeemPositionTokens( address marketContractAddress, uint qtyToRedeem ) external onlyWhiteListedAddress(marketContractAddress) { MarketContract marketContract = MarketContract(marketContractAddress); marketContract.redeemLongToken(qtyToRedeem, msg.sender); marketContract.redeemShortToken(qtyToRedeem, msg.sender); // calculate collateral to return and update pool balance uint collateralToReturn = MathLib.multiply(qtyToRedeem, marketContract.COLLATERAL_PER_UNIT()); contractAddressToCollateralPoolBalance[marketContractAddress] = contractAddressToCollateralPoolBalance[ marketContractAddress ].subtract(collateralToReturn); // EXTERNAL CALL // transfer collateral back to user ERC20(marketContract.COLLATERAL_TOKEN_ADDRESS()).safeTransfer(msg.sender, collateralToReturn); emit TokensRedeemed( marketContractAddress, msg.sender, qtyToRedeem, collateralToReturn, uint8(MarketSide.Both) ); } ``` ```solidity=51 // @notice called by a user after settlement has occurred. This function will finalize all accounting around any // outstanding positions and return all remaining collateral to the caller. This should only be called after // settlement has occurred. /// @param marketContractAddress address of the MARKET Contract being traded. /// @param qtyToRedeem signed qtyToRedeem, positive (+) for long tokens, negative(-) for short tokens function settleAndClose( address marketContractAddress, int qtyToRedeem ) external onlyWhiteListedAddress(marketContractAddress) { MarketContract marketContract = MarketContract(marketContractAddress); require(marketContract.isPostSettlementDelay(), "Contract is not past settlement delay"); // burn tokens being redeemed. MarketSide marketSide; uint absQtyToRedeem = qtyToRedeem.abs(); // convert to a uint for non signed functions if (qtyToRedeem > 0) { marketSide = MarketSide.Long; marketContract.redeemLongToken(absQtyToRedeem, msg.sender); } else { marketSide = MarketSide.Short; marketContract.redeemShortToken(absQtyToRedeem, msg.sender); } // calculate amount of collateral to return and update pool balances uint collateralToReturn = MathLib.calculateNeededCollateral( marketContract.PRICE_FLOOR(), marketContract.PRICE_CAP(), marketContract.QTY_MULTIPLIER(), qtyToRedeem, marketContract.settlementPrice() ); contractAddressToCollateralPoolBalance[marketContractAddress] = contractAddressToCollateralPoolBalance[ marketContractAddress ].subtract(collateralToReturn); // return collateral tokens ERC20(marketContract.COLLATERAL_TOKEN_ADDRESS()).safeTransfer(msg.sender, collateralToReturn); emit TokensRedeemed( marketContractAddress, msg.sender, absQtyToRedeem, collateralToReturn, uint8(marketSide) ); } ``` ```solidity=56 /// @notice determines the amount of needed collateral for a given position (qty and price) /// @param priceFloor lowest price the contract is allowed to trade before expiration /// @param priceCap highest price the contract is allowed to trade before expiration /// @param qtyMultiplier multiplier for qty from base units /// @param longQty qty to redeem /// @param shortQty qty to redeem /// @param price of the trade function calculateCollateralToReturn( uint priceFloor, uint priceCap, uint qtyMultiplier, uint longQty, uint shortQty, uint price ) pure internal returns (uint) { uint neededCollateral = 0; uint maxLoss; if (longQty > 0) { // calculate max loss from entry price to floor if (price <= priceFloor) { maxLoss = 0; } else { maxLoss = subtract(price, priceFloor); } neededCollateral = multiply(multiply(maxLoss, longQty), qtyMultiplier); } if (shortQty > 0) { // calculate max loss from entry price to ceiling; if (price >= priceCap) { maxLoss = 0; } else { maxLoss = subtract(priceCap, price); } neededCollateral = add(neededCollateral, multiply(multiply(maxLoss, shortQty), qtyMultiplier)); } return neededCollateral; } ``` ## Mai Protocol V1 https://github.com/mcdexio/mai-protocol MCDex 的 Mai Protocol V1 从 Market Protocol 上发展而来,参考了 0x Protocol 和 DDex 的 Hydro Protocol。 ## Mai Protocol V2 经过一段时间的试运行与反思,Mai Protocol V2 完全重构了之前的协议,新的协议参考并模拟了主流比特币永续合约,并使用 Ch 2 中所提到的 AMM 机制,以建立永续合约和保证金之间的交易对。同时为了不改变交易体验,并提供更好的流动性,协议也兼容链下订单簿模式。 - https://mcdex.io/references/#/zh-CN/white-paper - https://github.com/mcdexio/mai-protocol-v2 - [2020-06 OpenZeppelin MCDEX Mai Protocol V2 审计报告](https://blog.openzeppelin.com/mcdex-mai-protocol-audit/) 根据主要功能,Mai Protocol V2 可分为 Perpetual、AMM、Exchange 和 Oracle 四组合约模块。 ### Perpetual 合约 如同 Ch 3 中 MakerDAO 定义资产的 Vat 合约,Mai Protocol V2 中最重要的合约是定义永续合约资产的 Perpetual 合约。 https://github.com/mcdexio/mai-protocol-v2/tree/master/contracts/perpetual ### AMM 合约 https://github.com/mcdexio/mai-protocol-v2/tree/master/contracts/liquidity ```solidity=56 /** * @notice Real implementation of buy/long. * * @param trader The trader. * @param amount Buy amount. Must be a multiple of lotSize. * @param limitPrice Assert the trading price <= limitPrice. * @param deadline Assert the trading time <= deadline. */ function buyFrom( address trader, uint256 amount, uint256 limitPrice, uint256 deadline ) private returns (uint256) { require(perpetualProxy.status() == LibTypes.Status.NORMAL, "wrong perpetual status"); require(perpetualProxy.isValidTradingLotSize(amount), "amount must be divisible by tradingLotSize"); uint256 price = getBuyPrice(amount); require(limitPrice >= price, "price limited"); require(getBlockTimestamp() <= deadline, "deadline exceeded"); (uint256 opened, ) = perpetualProxy.tradePosition(trader, tradingAccount(), LibTypes.Side.LONG, price, amount); uint256 value = price.wmul(amount); uint256 fee = value.wmul(governance.poolFeeRate); uint256 devFee = value.wmul(governance.poolDevFeeRate); address devAddress = perpetualProxy.devAddress(); perpetualProxy.transferCashBalance(trader, tradingAccount(), fee); perpetualProxy.transferCashBalance(trader, devAddress, devFee); forceFunding(); // x, y changed, so fair price changed. we need funding now mustSafe(trader, opened); return opened; } ``` ### Exchange 合约 https://github.com/mcdexio/mai-protocol-v2/tree/master/contracts/exchange ### Oracle 合约 https://github.com/mcdexio/mai-protocol-v2/tree/master/contracts/oracle ## 本章注记 ![image.png](https://ssimg.frontenduse.top/article/2020/08/04/cbb4853ece33bbaf091d46ec1492cdd0.png) > 2011 年的 ICBIT 交易所,现已倒闭,图片来自 Bitcoin Magazine 最早的比特币衍生品也是以期货合约的形式出现的。这些合约允许投资者为他们的币锁定一定的价格,并允许使用复杂的策略。早在 2011 年,就有创业者建立了线上的交易网站(这是由少数个人运营的非常原始的交易所)来交易比特币的衍生品,如 ICBIT。交易者可以以现货价格买入数字货币,参与套利。如果存在溢价,则卖出期货合约。期货还使交易者能够对冲价格波动,锁定其 BTC 的价格。 对这种工具的需求增长来自于对比特币交易的需求,而无需通过传统的银行系统,投资者可以在几分钟内建立一个交易账户。投资者也以更复杂的方式进行交易,在IRC频道上写期权和谈判期货合约,如 #bitcoin-pit 和 #bitcoin-otc 进行专业交易。2012年出现了更多将比特币与传统市场连接起来的产品,推出了 1Broker,允许交易者使用比特币进行股票衍生品交易。 金融专业人士为了摆脱银行业务的烦闷,将目光投向了新奇刺激的加密货币世界,推动了比特币衍生品缓慢而又逐步的发展。由于加密市场发展不足(让人想起几十年前的华尔街),并经历了大规模的增长,促使传统金融业的人才流失到加密领域。因此,许多已经出现的衍生品交易所的创始人都有类似的背景(例如 BitMEX 的 Hayes)。传统市场现在很沉闷,这与上世纪七八十年代外汇和大宗商品交易员凭借波动可以赚取财富的日子形成鲜明对比。比特币衍生品的早期发展为交易者重温 "金融全盛时期 "奠定了基础,用货币取代了商品和外汇。 在运营了两年左右后,ICBIT 的用户已经发展到了 5000 人左右。在 2013 年的后期,ICBIT 拥有三个月 140 万美元的交易量,说明衍生品交易行业在加密货币市场已经处于萌芽阶段。比特币价格的起伏赢得了相信其愿景的投资者,也引起了批评者的注意,他们希望有办法做空比特币——而这正是衍生品所允许的。比特币市场的逐渐成熟导致了加密货币世界中最成功的衍生品的出现,即比特币永续掉期(perpetual swap)合约。 ### 比特币永续掉期合约 比特币永续掉期一个加密世界原生发明的 Product Market Fit 产品,因为 24 小时无间隙交易市场,使得比特币非常适合拿来投机。因而没过多久,比特币永续掉期合约就流行起来了,当比特币不顾无数谴责她的声音,重复着它的周期,表现出疯狂的价格波动时,越来越多的交易者开始利用衍生品从这些行情的波动中获利。2014 年,虽然比特币经济的金融方面还比较原始,但 BitMEX 和 BitVC 等衍生品平台已经在香港推出。期货是早期比特币衍生品的最主要形式,BitMex、OKCoin 在此期间确立了自己的地位。 虽然期货对套期保值和套利很有用,但到期日意味着对于那些想从市场波动中获利的投资者来说,期货并不那么理想(尤其是当他们想在过了期货到期日后还想继续持仓时)。另外,期货合约的价格往往会大幅偏离标的资产的价格。而比特币永续掉期提供了一种没有到期日的交易工具,加强了现货市场和衍生品市场之间的联系(因为套利变得更加容易)。同时,该创新合约还允许交易者在不触及美元的情况下对冲 BTC 头寸(如果你拥有 1 个BTC,你可以使用永续掉期做空 1 个BTC)。与期货合约相比,永续掉期提供了一种更简单的持仓方式。 ![image.png](https://ssimg.frontenduse.top/article/2020/08/04/f1fb88e032c567f3bd4527d0745a3f2f.png) 对比五大现货交易所的 BTC-美元交易量和衍生品交易所的 BTC-美元永续掉期交易量,我们不难看出永续掉期交易量占比特币整体交易量的 80% 左右。衍生品交易所的交易量大规模增长(从2017年底的40%左右增长),抓住了大部分的价格发现,是今天比特币价格的主要驱动力。因此,对于试图预测市场下一步走向的分析师来说,来自衍生品交易所的指标,如未平仓利息和资金利率,就显得尤为重要。 自 2018 年 2 月以来,衍生品交易所已经占据了约 80% 的比特币交易量,并在 2017 年的牛市期间超越 BTC-USD 的主要现货市场。熊市的开始沉淀了比特币衍生品交易量的强劲增长,因为投资者寻求从价格下跌中获利的方式。 [【ABS 2019】The State of Bitcoin Derivatives and its Future|Arthur Hayes](https://www.youtube.com/watch?v=HMiV2alk2Vk) [V 神是今年冯波局的主咖?你搞笑的吧](https://mp.weixin.qq.com/s?__biz=MzA4NjUxNTI5Mw==&mid=2649978412&idx=1&sn=5a0fe6871cddc4c12e5635b5f112e088&chksm=87c05d1eb0b7d4086a1879fd1aaa92068d340fb8614d3f2b5302a5984bb01bac82bab7f06532&scene=21#wechat_redirect) (岛娘案:此处应用 Hayes 的 Meme 图一枚:我给你 100 倍) 流动性最强的比特币衍生品是 BitMEX 于 2016 年 5 月推出的 XBT-美元永续掉期。比特币永续掉期的早期发展是与 ICO 热潮几乎是同时发生的,ICO 热潮占据了中心位置,投资者通过交易这些山寨币在这些项目上获得了难以想象的回报。但随着繁荣转为萧条,2018 年初 "加密冬天 "开始,衍生品市场开始逐渐占据中心位置。交易开始起飞,并超过了现货市场的交易量。受监管的衍生品也来到了市场上,CME 在2017年12月17日推出了比特币期货合约,这些古典玩家的参与提高了比特币的声誉。 虽然提供了一个被认为更安全的选择,但比特币和去中心化加密货币的本质是自我监管。衍生品市场的发展也意味着,交易所在没有限制性法规的国家运营,他们不受某些司法管辖区的规则和法规的约束。因此,出现了基于市场的解决方案来解决结算风险。大多数衍生品交易所采用自动清算的方式,将任何超额收益加入保险基金。保险基金有效地取代了传统市场中的中央清算所以确保任何赢家都能得到支付,或者在价格变动导致交易一方破产的情况下承担风险。 衍生品市场的不断发展对比特币的另一个影响是价格波动性的降低。自从衍生品市场变得更加重要以来,比特币回报率的长期波动率一直保持在 0.05 以下(除了2018年初BTC-美元达到峰值接近20000美元后的兴奋期)。衍生品市场的作用是为企业提供降低所持比特币波动性的方法,从而使比特币更适合作为一种货币,使其在商业中得到更广泛的应用。 ![image.png](https://ssimg.frontenduse.top/article/2020/08/04/f30d23be924e157ff833e7321ef46c55.png) 针对机构投资者的产品吸收缓慢,传统交易所是提供比特币衍生品的不受监管的在位者的 "后进者"。CME 的比特币期货允许机构在不必拥有任何比特币的情况下做空比特币,并让企业对冲风险(然而,目前还没有太多证据表明这种情况大规模发生)。另一方面,Bakkt 在 2019 年 9 月推出了实物结算的期货。 ![image.png](https://ssimg.frontenduse.top/article/2020/08/04/5f7f2960301914dd17ec2cf30112632d.png) 随着越来越多的投资者进入加密货币领域,类似于传统金融世界的工具交易活动将会增加。为了获得更大的主流接受度,机构交易者希望看到更多的安全和对现货市场的监管。受监管的产品进入市场的许多标准还没有出现(比如行情大小),操纵行为仍然无处不在,这需要时间来解决。然而,不受监管的衍生品交易所通过允许用户在几分钟内注册,无需提交敏感信息,并通过提供需要 BTC(或其他加密货币)作为抵押品的合约,完全绕开了银行业,从而保持了比特币的精神。 散户交易者仍在推动比特币市场的发展,我们距离看到机构的突出表现还有一段距离。在许多方面,受监管的衍生品交易所继承了一些与传统交易所相同的限制,例如排除散户交易者、限制波动性的断路器和有限的交易时间。除了这些交易员,另一个比特币衍生品交易的参与者是稳定生产比特币的矿工,并成为主要的流量来源,就像我们在黄金和石油等传统市场看到的那样。这些矿工们承担着矿机折旧、电价等成本,因而和古希腊的橄榄榨油机主一样,他们也有对冲因比特币价格的周期波动而产生的风险的需求。比特币永续掉期的成功和对监管产品的兴趣越来越大,是加密货币作为一种资产类别成熟的明显标志。 - [An Overview of the Evolution of Bitcoin Derivatives](https://medium.com/interdax/an-overview-of-the-evolution-of-bitcoin-derivatives-c10080c00d29) - [Deribit | 了解双币种合约 (quanto) 的风险与机遇](https://www.chainnews.com/articles/759376346616.htm) - [对话加密货币期权头号玩家 Deribit:它为何受专业投资者青睐?](https://www.chainnews.com/articles/629156709857.htm) # Ch 7 我在結束時開啟 ## 什么是 DeFi ### DeFi as a Movement ### DeFi as a Meme ### DeFi as a Future # 后记 —— Crypto as a DAO # 回收站 > 至于为春秋,笔则笔,削则削,子夏之徒不能赞一辞。弟子受春秋,孔子曰:“后世知丘者以春秋,而罪丘者亦以春秋。 > —— [史记,孔子世家](https://ctext.org/shiji/kong-zi-shi-jia/zhs) > Compound is an open-source, autonomous, extensible protocol that runs 24/7 — perfect for developers looking to build products that help users earn interest, or finance their ambitions. 有人说,2019 年是 DeFi 之年,DeFi 行业是今年唯一得到十足增长的公有链领域,根据 DeFi Pulse,数据。 生态多样性。| 并且还在不断的成长。| 至于什么是 DeFi?如何给予她一个准确的定义?她于我有什么联系? 希望大家可以带着这一问题阅读本书。我们将在本书的末尾重新回到这个问题,这里就 关于本书作者,岛娘(a.k.a. MinakoKojima,xiaodao),前谷歌工程师,ACM 区预赛金牌,微软编程之美挑战赛冠军。她在网上有多重身份,与本书相关的经历是,曾参与开发过山寨币矿池 Gpool,参与第一步国产区块链电影《圣人大盗》,目前 run 自己的 startup。 根据 X-Order 创始人 Tony Tao 说法,此前的 Defi 分为广义和狭义两个定义。 狭义:建立在公有链之上,以智能合约定义的金融服务。 广义:开放式金融。 什麼是「DeFi」?簡稱「DeFi」(去中心化金融或開放金融)是指利用開源軟體和分散式網絡將傳統金融產品轉變為不用講求信任且具透明的協議的運動,這些協議在沒有不必要的中介的情況下運行。我們可以設想「去中心化金融」對現在金融世界的影響,與當初開源軟體改變軟體產品的方式相同。 如同区块链并不是密码学的全部,同样的,区块链也不一定是开放式金融的全部。一个典型的案例,就是在 DeFi 里面,是不可能把币安这样的交易所当做是 DeFi 的一部分。之前坊间很多文章都会混淆 DeFi 和开放式金融,现在 Libra 诞生之后,估计以后这两个概念就能够更清晰的划分了。可以预想在可见的未来,央行发行了自己的数字货币,在这套数字货币上提供了一套自己的开放接口,那么应该属于开放式金融的范畴。 本书我们考察狭义的 Defi,既那些建立在公有链之上,以智能合约定义的金融服务。 1. 为什么合约工程师需要学习 Defi, Empower Trend Build Uniswap Compound MakerDAO Dy/Dx Web3 Business Model 去中心化是战略