Compound 是一個以太坊上的貨幣市場,一個任何使用者、機構和 dApps 都可以使用的鏈上賬本。它提供了存幣和借幣的功能,就像一個銀行,使用者可以存幣獲的利息收益,或進行抵押借幣。在實現原理上,Compound 的帳本模型也與銀行類似,並遵循了國際會計準則。
目前區塊鏈上沒有負債和信用的概念,需要超額抵押資產才能完成借貸行為。例如想要借出價值 100 美元的資產 B,則需要抵押價值 150 美元的資產 A。
要了解 Compound 實現原理參看第一部分“Compound 分解“,如果完全不瞭解 Compound,請參看第二部分“Compound 白皮書整理”;其他資料參看第三部分“參考“;Compound 使用教程連結 小課堂 | 使用 imToken 體驗去中心化「餘額寶」。
一、Compound 分解
實時結算的帳本
Compound 是一個使用智慧合約實現的實時結算帳本。帳本能實時結算的前提是交易逐筆發生,有確定的執行順序,交易發生時間真實可靠等。區塊鏈滿足這些特性,為帳本自動結算提供基礎。
在 Compound 上,當一個交易發生時賬本會對賬目進行一次結算,此時結算利息會更新到賬目餘額中。等到下次交易事件發生時,會再次觸發這樣的結算處理並更新餘額。
利率模型
一個銀行的簡單模型就是通過借款產生營收,營收作為存款使用者的利息。簡化 Compound 的利率模型,不設定浮動的借款利率,不考慮盈利,只保證賬目借貸平衡,有:
借款營收 = 存款利息
其中:
借款營收 = 借款總額 * 借款利率 * 時間
存款利息 = 存款總額 * 存款利率 * 時間
=>
借款總額 * 借款利率 * 時間 = 存款總額 * 存款利率 * 時間
=>
借款總額 * 借款利率 = 存款總額 * 存款利率
複製程式碼
根據公式有:
- 借款總額為零(沒有人進行借款),此時沒有營收產生,存款利率為零
- 借款總額增大,產生營收增多,存款利率也會提高
- 借款總額不變(營收不變),存款總額增大,存款利率降低
結論:利率隨著借款總額和存款總額的變動而變動。
帳本的變化
定義交易事件為:存款、提現、借款、還款。
如果沒有任何交易事件發生,存款總額、借款總額就不會發生變化,利率在這個段時間裡也會一直保持不變。隨著交易事件的產生,存款/借款總額會發生變化,這會引起利率發生改變。
假定借款利率是 0.05,下面狀態圖中圓圈代表帳本和利率的狀態,箭頭代表事件:
圖中 a 狀態無借款,無營收,存款利率為 0。事件 1.借50
發生,根據公式,可得新的存款利率為 0.025。
存款利率 =(借款總額 * 借款利率)/ 存款總額
= (50 * 0.05)/ 100 = 0.025
複製程式碼
事件 2、3 導致的帳本狀態也可以根據公式計算。
結論:交易事件引起利率變化。
營收和時間的關係
上節的狀態變化並沒有包含結算環節。隨著時間的推移,會有營收(利息)產生。
對於存款:
新的存款總額 = 存款總額 +(存款總額 * 存款利率 * 時間)
複製程式碼
對於貸款:
新的貸款總額 = 貸款總額 +(貸款總額 * 貸款利率 * 時間)
複製程式碼
假設借款利率 5% 為日利率(明顯是高利貸,但便於計算),疊加時間後進行結算的狀態圖如下:
黃色箭頭代表上一狀態的持續時間,當事件發生後,狀態更新並進入下一個時間段。
可以看出,考慮營收和時間的關係後,利率的變化變得更加複雜,但計算過程仍然清晰。
狀態 a 持續了 1 天,由於借款為 0,存款利率為 0,發生事件 1 進行結算後存款沒有產生變化,事件 1 增加了借款總額。重新計算利率可以得到新的存款利率 0.025。
事件 2 觸發,狀態 b 持續了 2 天,在進行結算時,可以推算出新的存款和借款總額:
## 結算
新的存款總額 = 100 +(100 * 0.025 * 2)= 105
新的借款總額 = 50 +(50 * 0.05 * 2) = 55
複製程式碼
結算後,存款總額再增加事件 2 存入的 50,結果為 105 + 50 = 155
。根據存款總額 155 和借款總額 55 計算出新的存款利率為 0.01774。
事件 3 觸發,狀態 c 持續了 1 天:
## 結算
新的存款總額 = 155 +(155 * 0.01774 * 1) = 157.75
新的借款總額 = 55 + (55 * 0.05 * 1) = 57.75
複製程式碼
由於還款為 20,此時借款總額是 57.75 - 20 = 37.75
。重新計算出存款利率為 0.012。
結論:交易事件發生時進行結算,結算結束後按事件調整餘額並引起利率變化。
每一筆明細帳
上述過程已經具有一定的複雜性,但由事件觸發狀態變化這個過程是很明確的。在實際生產中,存款和借款總額並不是由一個單一賬戶產生的,而是由無數的小賬目匯聚而成的。比如 Alice 存入 50,Bob 存入了 30,存款總額是 80。這裡就產生了更多問題,由於 Alice 和 Bob 的存款時間不同,它們的利率也不一樣。借款也與之類似。因此每一筆帳都要單獨進行結算,它們的利率根據總帳額度的變化而變化。
我們把狀態 a 的存款總額 100 歸為其他存款。在 2 天后,Alice 存入 50,結算後其他存款更新為 105。Alice 的存款增加了存款總額,使總額增長到 155,最終存款利率計算為 0.01774。
1 天后,Bob 也存入 50,此時 Alice 存款和其他存款以 0.01774 利率進行結算。結算結果如狀態 c 所示。
通過上述分析,可以發現每次事件產生,需要對每一筆明細帳進行結算。這樣隨著存款/借款的使用者增多,賬目會越來越多,每次結算的計算量也會越來越大。不過細心觀察可以發現,只要記錄了歷史利率,事件發生不需要對所有賬戶結算。我們直接根據各明細帳的初始的狀態計算圖中狀態 c:
其他存款 = 100 +(100 * 0.025 * 2)+((100 +(100 * 0.025 * 2))* 0.01774 * 1)
Alice存款 = 50 + (50 * 0.01774 * 1)
Bob存款 = 50
複製程式碼
其中 100 是其他存款的初始額度,50 是 Alice存款的初始額度。0.025 是第一期利率,0.01774 是第二期利率。可以看出,只要有歷史利率就可以通過迭代運算計算出每個明細賬戶的當前餘額。所以在進行結算操作時只需要對事件操作的明細帳進行結算,其他賬戶可以暫時不用結算,直到它們被操作時再計算即可。
結論:每次結算只需要計算餘額受影響的明細帳,並更新總帳。其他賬目可以等到被操作時再進行計算。
總結
我們討論了 Compound 的帳本原理,沒有對 Compound 的抵押、價格預言機和“壞賬”清算進行詳細討論。不過有了賬本模型,其他部分也很容易。所謂 A 資產的抵押,實際上是將 A 資產存入智慧合約,此時就可以借出 B、C、D…的資產(A 是超額抵押,借出價值必須低於 A 的價值)。價格預言機會時時更新 A、B、C、D…資產的價格,在抵押資產價值降低,達到一個風險閥值時(仍然沒有低於借出資產的價值),將 A “拍賣”,此時拍賣價格比市場價格更加優惠,自動償還了借出資產。
以上模型可以完全移植到區塊鏈中,當我們對智慧合約發起一筆交易事件就會觸發結算處理,並更新利率。這些過程完全自動化。
Compound 的本質是將一套傳統的會計模型複製到區塊鏈中,使會計賬本能進行實時結算。得益於此,存款/借款所需要簽署的法律檔案和手續,都被隱式的囊括在智慧合約中。人們無需再進行任何協商,只需要輕點幾下就可以使用該項服務。同時,它被部署在去中化的網路上,成為沒有地域性、自由開放的合約協議。只要遵循了合約的規則,任何人、任何機構都能無區別的使用這項低摩擦的金融服務。
不過,在區塊鏈上或許並不需要使用傳統會計模型處理賬務,我們有更多可行方案和更簡潔的數學模型實現像 Compound 一樣的金融服務。毋庸置疑,這些“未來”的金融服務會快速發展,構築一個新世紀。
二、Compound 白皮書整理
基礎特性
- 資金池
- 基於供需法則,由演算法生成利率
- 浮動利率,無需協商
- 完全透明的代幣餘額資訊,記錄所有歷史利率
存幣
- 匯聚使用者的代幣
- 實時提現
- 利息實時支付
用例
- 使用者進行存款,低風險獲得利息收入
- dApp 應用程式、機構和交易所的代幣增值
借幣
- 需要超額抵押
- 無期限限制
風險控制
- 借出代幣價值超過安全抵押率時,抵押會優於市場利率進行清算,鼓勵套利者進行套利,降低風險
用例
- 快速借 utility token 進行使用。隨時可借,無需等待(exchange 需要等待吃單)。
- 使用者抵押持有的組合資產(多種代幣)借出 ETH,進行 ICO 等投資。
- 做空
賬務系統
現金 + 借款 = 存款 + 抵押資產
複製程式碼
遵循國際會計準則:
事件 | 借 | 貸 |
---|---|---|
存入代幣 | 現金 | 供給 |
提取代幣 | 供給 | 現金 |
借出代幣 | 借款 | 現金 |
償還代幣 | 現金 | 借款 |
清算(借款人) | 供給(抵押) | 借款(資產) |
清算(清算人) | 現金(資產) | 供給(抵押) |
利率增長(供給) | 抵押淨值 | 供給 |
利率增長(貸) | 借款 | 抵押淨值 |
利率模型
U = 借款 /( 現金 + 借款 )
借款利率 = 10% + U * 30%
存款利率 = 借款利率 * U *( 1 - S )
複製程式碼