1. 程式人生 > >Bancor的原理及智慧合約實現

Bancor的原理及智慧合約實現

寫在前面

  1. 本文涉及到bancor名詞可能會讓部分不熟悉bancor的同學看著有些confuse,先把區別寫在前面:
bancor plan: 可以理解為凱恩斯提出的“國際清算同盟計劃”

bancor protocol / bancor協議: 可以理解成bancor機制的核心演算法

bancor.network:基於bancor協議的智慧合約實現的去中心化交易所

  1. 另外本文中關於token使用的「發行」一詞的意思可以參考以下虛擬碼(相當於mint):
function issue(address _user, uint _amount) {
    balances[_user] += _amount;
    totalSupply += _amount;
}

bancor誕生的背景

二戰之後,凱恩斯為了遏制美元稱霸世界提出的“國際清算同盟計劃”中的重要計劃,也有人稱其為「bancor plan」。這個計劃主張多邊清算,取消雙邊清算。而bancor本身在這個計劃中,也是各國賬戶的記賬單位。

而bancor的初始分配則以二戰前三年的進出口貿易平均值計算,這樣加上英聯邦的殖民地,英聯邦可以分配到的bancor多達35%,可以讓英國在戰後黃金儲備耗盡的情況下,和美國共享國際金融的領導權。

而bancor plan所倡導的多邊清算,在區塊鏈token化興起的今天,被用來解決token市場的長尾效應。目前,幾乎每一個專案都要發行自己的token,目前大交易所都採用撮合交易的方式,即買和賣同時都有需求,交易才能發生。因此一些關注度小的token都有很大的流動性風險。

什麼是bancor協議

bancor協議不依賴於雙邊需求匹配,其運用聯結器 (connector)作為橋樑,實現了非同步價格機制。即使用者可以隨時按照自動計算得到的價格,把某一種token賣給"聯結器"拿出抵押物(通常是eth)或者換取其他token;買過程也一樣。(這裡說賣給了聯結器並不恰當,大家可以理解成把token傳送給聯結器,再由聯結器來實現兌換的邏輯)。

token發行方可以鎖定一些ETH在聯結器中並自定義CW(connector weight, 聯結器權重,以前也叫CRR,即恆定準備金率),發行出一定數量的自己的token,bancor裡稱之為智慧代幣(smart token)。一般如果買需求增加,smart token的價格就會相應升高;賣需求增加,smart token的價格會相應下降。至於漲跌幅度,可以根據專案方對自己token的定義結合專案需要,通過自定義CW來實現控制。

未來使用者也可以鎖定一些smart token來發行新的smart token。這樣就會形成一個價值網路,在這個網路中的token都可以以某種路徑實現雙向兌換,且因為非同步價格機制,因而並不依賴買賣需求雙邊匹配。

在這樣的機制保證下,即使是關注度小的token也沒有流動性風險,釋放token市場的長尾潛力。

bancor協議中的名詞解釋

bancor協議的白皮書中涉及到很多名詞,先做一下解釋:

  • connector(聯結器):可以認為連線不同token的兌換橋樑;
  • connector token(聯結器代幣):可以理解成抵押物。比如在bancor網路中token發行的最初階段,就是通過鎖定ETH來發行smart token的。在“抵押ETH發行token”這個過程中,ETH就是connector token。(當然在bancor的具體實現中,是通過ETHER TOKEN實現的,下詳述)。
  • smart token(智慧代幣):理解成你想要發行的TOKEN。還是用“抵押ETH發行token”這個過程為例,smart token就是那個想要發行的token。
  • CW(聯結器權重): 理解成調節價格敏感係數的引數。買入smart token時價格上升,賣出smart token時價格下降,但是漲跌幅度不是一個固定的值,可以用CW調節。

bancor-cw

上圖中可以看到:不同的cw值對應的smart token價格隨供應量不同表現出的不同走勢。

當cw為1時,價格恆定;cw為0.5時,價格隨供給量成線性變化;當價格分別為10%和90%時,價格隨供給量的增加,一個表現為敏感,另一個表現為不敏感。這樣的曲線走向和經濟學中的價格彈性有異曲同工之妙。(筆者在旁邊標註的E~s~表示的就是價格彈性係數)。

bancor中涉及到的數學證明

在bancor的白皮書中有提高,smart token的價格公式為:

$$ price = \dfrac{connectorBalance}{smartToken's supply \times CW} $$

我們對上面的公式做個變形,用R表示connector balance(比如說ETHER),用S表示smart token的供給量,用F表示CW, 最後用P表示智慧代幣的價格。

那麼整個市場上的smart token的市值上限就是S*P,根據上面的公式定義,得到R = FSP,變換成之前的公式也就是

$$ P = \frac{R}{SF} $$

當用戶想購買非常少數量的smart token,用dS表示,那麼該使用者就需要支付PdS,而使用者正是connetor token作為支付貨幣,因此connector balance增加的dR = PdS

這樣我們又得到了一個公式 (F是一個常量) :

$$ dR = d(FSP) = Fd(SP) = F(SdP + PdS) $$

繼續往下推導:

$$ P dS = dR = F(S dP + P dS) $$

$$ P dS(1 − F) = FS dP $$

$$ P dS (\frac{1}{F} - 1) = S dP $$

為了計算方便,繼續使得α = 1/F - 1:

$$ αP dS = S dP $$

$$ α \frac{dS}{S} = \frac{dP}{P} $$

$$ α d log S = d log P $$

等式兩邊同時積分:

$$ α log S + A = log P $$

$$ e^A S^α = P $$

$$ P = (\frac{S}{S_0})^ α P_0 $$

這樣再已知當前smart token供應量、初始價格P~0~和初始供應量S~0~的基礎上,就可以推算出當前的Smart token的價格。

繼續,如果一個使用者想要買總量為T的smart token,這樣總供應量就會從S~0~變為S~0~+T, 那麼使用者所需支付的費用為:

$$ E = \int_{S_0}^{S_0 + T}{P}dS $$

$$ = \int_{S_0}^{S_0 + T}{P(\frac{S}{S_0})^α}dS $$

$$ = P_0S_0\frac{(S/S_0)^{α+1}}{α + 1}|_{S_0}^{S_0+T} $$

$$ = P_0S_0(\frac{((S_0+T)/S_0)^{α+1}}{α+1} - \frac{(S_0/S_0)^{α+1}}{α+1}) $$

$$ = P_0S_0((1 + \frac{T}{S_0})^{α+1} - 1) $$

$$ = FP_0S_0((1+\frac{T}{S_0})^{1/F} -1 $$

$$ = R_0((1 + \frac{T}{S_0})^{1/F} - 1) $$

$$ =\sqrt[F]{1 + \frac{T}{S_0}} - 1 $$

細心的同學可能已經發現了,這其實就等於之前提到的price-supply曲線從S~0~到S~0~+T這段區間曲線下的面積。

對F這個引數,也就是CW,還有一個很有趣的視角:

bancor-cw圖

即圖中紫色部分的面積除以灰色部分的面積恰好等於CW。有興趣的同學可以自行驗證一下。這裡貼出原貼地址:

bancor協議的智慧合約實現

注: bancor.network團隊已經實現了bancor協議的智慧合約實現。

這裡舉一個簡單的例子,以ETH和智慧代幣的兌換為例,進行說明。

1. 用ETH買入Smart Token

當用戶想用1個eth來兌換一定量的智慧代幣時,智慧合約地執行步驟是:

  1. connector接收1eth,併發行出等額的etherToken,注意這裡的etherToken並不是ETH,而是和ETH保持1:1兌換關係的ERC20 TOKEN。
  2. 繼續用這些etherToken在bancor中經過計算得到一定數量的smart token,比如1w個smart token;
  3. 把這1w個smart token發行到使用者的地址下;(這裡的發行指的其實是mint的過程)

在上面的例子中,ETHERTOKEN和SmartToken都是發行出來的,因此在之前的價格計算公式中,connector_balance和smart token's supply都會變多。

再具體一些,在智慧合約的具體實現中,connector又被拆分成兩個角色bancorConverterbancorNetwork,分別對應兩個智慧合約,把上面的ETH兌換smartToken的操作進一步細化得到:

  1. 使用者傳送1個ETH給bancorConverterbancorConverter再把這1個ETH傳送給bancorNetwork
  2. bancorNetwork拿著這1個ETH在ETHERTOKEN存入ETHERTOKEN中,並給自己發行一個etherToken:

    EtherToken.deposit(bancorNetwork, 1 * 10^18);
  3. bancorNetwork把這1個etherToken傳送給了bancorConverter
  4. bancorConverter裡實現代幣兌換的計算,並把計算得到的一定數量的smartToken發行給bancorNetwork
  5. 最後,bancorNetwork再把這一筆smartToken傳送給使用者;

以上面的方式完成了ETH兌換smartToken的全過程。

下圖為ETH、etherToken以及smartToken的資金流向圖:

ethToSmartToken

可以看到,ETH最後留在了ETHERTOKEN合約地址中;etherToken最後留在了bancorConverter合約地址中;而smartToken則流向了使用者。

2. 賣出smartToken換回ETH

這個過程比上一個更簡單:

  1. 使用者把想要賣出的smartToken傳送給bancorNetwork
  2. bancorConverter中銷燬bancorNetwork賬戶上相應數量的smartToken,並計算出smartToken對應多少數量的etherToken,然後把計算得到的etherToken從自己的地址轉移到bancorNetwork地址;
  3. bancorNetwork再拿著得到的etherToken,去ethertoken的合約地址中兌換出等額的eth,併發送給使用者

下圖為賣出smartToken換回ETH中的資金流向圖:

smartToken2ETH

可以看到,直接從使用者的賬戶上銷燬smartToken;而etherToken則從bancorConverter中流向bancorNetwork並最終銷燬;在完成上述過程中,則從ETHERTOKEN地址中把ETH還給使用者。

基於bancor的交易所封裝實現

bancor.network官方的github庫其實已經挺完善了,不過任何人想要使用換幣的邏輯就必須經過白名單的認可,換言之只有白名單中標記為true的地址才可以進行換幣行為,這樣對單個使用者很不友好,而bancor官方也並未給出交易所的智慧合約實現,因此我們在bancor的基礎上又封裝了一個bancorExchange,用於實現特定幣種之間的兌換行為。

在readme裡列出了系列合約的kovan地址,大家可以自行測試。當然如果想親手部署一個bancor網路的同學,我們也給出了詳細的部署步驟,網址如下:

寫在最後

bancor plan是一個很棒的去中心化貨幣解決方案,雖然在幾十年前就被凱恩斯提出,但是因為中心化(政治)的原因被廢棄。感謝區塊鏈的興起,又把bancor帶回了大眾的視野,並在區塊鏈的技術支援下,得到了完全實現。

那麼像bancor這樣曾經因為技術水平或者中心化組織出於自身利益被廢棄卻很棒的提議,是否都可以隨著區塊鏈的普及而復活,從而為整個世界帶來更有效率地執行方式?

筆者這裡想拋磚引玉,就拿我們目前最熟悉的DAO來說,就是區塊鏈世界中代替企業的一種存在。

科斯在「社會成本問題」中曾經探討過產權界定和資源配置有效性的問題,他認為:

  • 在交易費用為0時,不管產權屬於誰,資源都會落到最有價值的用途上;
  • 在交易費用大於0時,產權的界定有利於提升效率;

而受限於技術水平,科斯認為企業是唯一降低交易費用的方式,因為企業替代了市場的作用,企業的本質就是對價格機制的替代。價格機制的執行本身也是有成本的,市場執行本身也存在費用,企業的存在就是通過管理協調替市場降低成本的必然結果。

而張五常在「經濟的解釋」中則更進一步地提出,市場只要合約就可以了,企業只是合約的特殊表現形式。是用一種叫“企業”的長期合約替代了“市場”的一系列短期合約的方式來節省交易費用的結果。

很顯然,基於區塊鏈和智慧合約,已經發展除了初級的DAO組織,這些DAO就是以一種「新的合約」代替「企業」這種合約。在某種程度上已經實現了鬆散的協調自制;未來DAO在市場資源配置上,是否可以既代替企業實現更有效率的資源分配,在網路價值傳遞中,又可以超越企業的科層制的傳播實現更廣泛更高效的價值互聯呢?

期待更多像bancor.network這樣優秀的專案,幫助我們在實現去中心化價值傳遞的道路上走的更遠。