著名的Bancor專案和BNT,在鏈上幾乎是無用之物

買賣虛擬貨幣

作者 |  Emin Gün Sirer 、 Phil Daian

編譯 | 張   問

編輯 | 楊舒芳

整個虛擬貨幣市場都處於寒冬之中,這個時候,最適合用來反思。

我們來回顧下ICO最瘋狂的時候,一個叫做Bancor的著名專案。去年6月,這個專案完成ICO,幾個小時內就融到了1.44億美元,它的代幣BNT至今都位於山寨幣第一梯隊。

Bancor是以太坊上的一個DApp,主要想解決的是小代幣的流動性問題。現在代幣種類成千上萬,有的代幣沒上交易所,想交易卻找不到地方,或者即使上了交易所,由於這個幣的使用者少,都找不到人來交易。

於是Bancor想了一個方法,不需要有交易對方,而是直接跟系統交易。他們設計了一個演算法,利用類似央行儲備金的方法,可以算出代幣的價格。這樣的話,不需要交易所,不需要交易對方,就可以交易你想要交易的幣。

但這篇文章會告訴你,這個專案不僅存在很多問題,更重要的是,它在鏈上幾乎沒有意義。

    如果你想了解更多關於Bancor的具體技術細節,可以閱讀這篇技術向的文章。(10張圖帶你看懂Bancor協議)

Emin Gün Sirer是一位土耳其裔的美國計算機專家,現任美國康奈爾大學計算機系副教授。他的研究對作業系統和分散式系統都有重要貢獻。2003年,他推出了Karma系統,這也是第一個基於PoW的加密貨幣。

Phil Daian現就讀於美國康納爾大學,博士生二年級。目前主要研究加密貨幣和智慧合約。

Bancor去年6月完成了ICO,幾個小時內就融到了1.44億美元,前無古人。這不僅是ICO的紀錄,在整個人類眾籌史上,也無人匹敵。

正常情況下,想要融到這個量級的資金,你得透過VC,有一個值得信賴的團隊,經過好幾輪融資和大量的盡職調查,在行業內還得有幾件里程碑一樣的事件才行。但是在Bancor這裡,這些步驟都沒有。這個團隊5個月前剛出現,還什麼都沒幹呢,就融了9位數的錢。

在這篇文章裡,我們只是想說一下,Bancor的模式是有缺陷的。簡單來說,他們是用智慧合約來為數字貨幣提供流動性。最重要的是,他們有個演算法,可以為各種幣提供交易價格。我們說這個東西有問題,不是指他們跟DAO一樣被人攻擊,而是即使沒有人攻擊,Bancor的智慧合約本身也達不到他們想要的結果。

因為他們這個模式有可能會被礦工耍。即使礦工很善良,礦工也是跟著真正的市場走的。我們發現Bancor這個方法並不能提供什麼效率保障,而且還會浪費儲備。你要是打算把你的幣放在Bancor上,一定要三思啊。

下面就說下我們在瞭解Bancor程式碼和它的代幣BNT時,發現了哪些問題。

Bancor基本問題

1. 很多莫名其妙的術語。

Bancor用“非同步價格發現”的機制來解決“雙重需求偶合”的問題,還有一大堆類似的術語。問題是,這些術語有一半都不是真的。“非同步價格發現”這個術語,完全是他們自己造出來的一個詞。“非同步”是從分散式系統裡找的詞,“價格發現”是從經濟學裡找的。大家似乎挺吃這一套的,但其實,問題非常大——因為根本就沒有這種東西。

2. Bancor想解決的最主要問題是“雙重需求偶合”,但這其實並不是真正的問題。

“雙重需求偶合”這個問題,在經濟學裡,就好像是小學生做的應用題,在現實世界裡根本碰不到。

你拿著兩隻兔子進菜市場,我拎著兩隻雞。我們剛好想要對方手裡的動物回去做菜,這在現實世界裡會發生嗎?

3. 使用者總是可以用以太坊來作為交易媒介的。

現在已經有現成的貨幣可以幫助我們交易,就是以太坊,只要是在以太坊上發行的幣,我們都可以用以太坊來交易,而且這些本來最開始就是用以太坊買的。你非得用BNT,就好像你在大海上,卻非得去一個兒童泳池裡游泳。

以太坊的目的就是作為各種以太坊上幣的交易媒介,我們當然也可以用BNT,但是這麼做,除了可以讓Bancor團隊賺錢外,沒什麼其他的用處。每一種使用Bancor演算法的代幣,我們都可以找到一種不需要Bancor的方法,而且還更有效率。

總而言之,BNT就是花架子,沒什麼用。

4. Bancor本質上是一種讓新代幣可以自動掛鉤的央行策略。

Bancor的理念其實很簡單:一個智慧合約,可以為一種幣提供買賣價格。這個叫做造市商。

假如,你打算創造一個幣,叫X。你炒作它,然後ICO,融了1個億美元。然後決定用價值1000萬美元的BNT來為X背書,這是你的儲備金。

那麼Bancor能幹啥?Bancor就是為你的X創造一個市場,用一個可以保證X的儲備/總供應量這個比率的價格來自動買賣你的X。也就是說,X的價格就是根據你的儲備金來的。如果你的儲備金是1.2億美元的BNT,那回購X的價格就更高,以便把儲備金拉回到一個正常水平。如果你的儲備金不多,那X價格就低。所以在這個智慧合約上,你可以一直交易,即使你沒有交易對手,全程只有你一個人。

5. 程式碼問題

一共,就只有,40行程式碼。

當然了,如果程式碼上確實是很厲害,有某些技術優勢,那一行程式碼價值350萬美元,我覺得沒什麼問題。

6. Bancor在鏈上能做到的事情,你自己在鏈下也行

你可以自己存1000萬美元做儲備金,閒著沒事的時候干預干預市場。你可以按照Bancor演算法來,得到的結果都是一樣的。所以用Bancor沒什麼用。

再說一遍,在控制X的價格上,單一的Bancor策略沒有什麼用。鏈上能做的事情,鏈下都能做。

Bancor的支持者可能會說,“你要為X提供儲備金啊。”可證明有儲備金的方式,不只一種啊。

7. 手動管理儲備金,比Bancor的策略要好很多

你自己管理儲備金,發起交易訂單。你不僅可以按照Bancor的演算法來,你還可以按照任何你喜歡的方式來,隨時調整策略。

8. Bancor的策略是將價格獨立於市場

Bancor的定價策略其實跟真正的市場平衡是沒什麼關係的。我們做一個簡單的實驗來說明這個問題。

假如,現在市場上對於X幣開始有恐慌情緒,新聞媒體上開始報導X專案的CEO已經跑了,CFO挪用公款,CTO在暗網上買毒品。但其實這些都是假新聞,一家公司買的水軍,黑你們公司。

這個時候你有1000萬美元儲備金,你有什麼好方法來控制價格?

一般情況下,你這1000萬儲備金就先拿著,不動,然後開個新聞釋出會,把CEO、CFO和清醒的CTO都叫來,讓大家看,緩和市場情緒。

但你要是用Bancor就不一樣了,那個智慧合約根本不知道外面發生了什麼事情,不知道市場走勢,只是盲目地提供交易價格。

在這種情況下,Bancor會在銀行擠兌期間掉地X的價格,直到儲備金用完。市場恐慌還在,你的儲備金也沒了。為什麼呢?不知所以的人們相信X確實價格歸零了,但是Bancor提供的價格是大於0的,所以人們就賣,直到你的儲備金消失殆盡。

9. Bancor這個方法不能利用盈餘價值

現在,一個Bancor的支持者會說,“你剛才的故事不完整,新聞釋出會以後,人們還會買X,然後智慧合約會讓儲備金再回來。”

好吧,讓我們回到釋出會的時候,高管都來了,人們眼前一亮,你們還發布了新的共識機制,大家為之瘋狂。你的幣價不管漲到什麼價位他們都買,在交易所裡,一枚X幣已經價值連城,你隨便賣一枚就可以衣食無憂。

但是你沒有,你用Bancor的方法。這個智慧合約根本不知道外面已經瘋狂成什麼樣子。X的價格還是一樣便宜。大家買你的幣就跟不要錢一樣。

由此可見,真實的市場和Bancor的差別有多麼大。我們已經展示了真實市場的兩個極端情況,可Bancor不會理解真實市場,它非常低效。

10. Bancor演算法,對於已經有流動性、但價值不穩定的資產是不可取的

前兩個場景說了兩個極端,但是在正常情況下,你的幣要是控制在造市商的手裡,你根本沒有可能有內幕交易,比如你明知道有些新聞是謠言。這其實就是在靈活性和可靠性之間做取捨。你可以利用自己的認知來賺額外的錢,這是靈活性;但是用Bancor的話,使用者就會覺得很開心,這是可靠性。

的確如此,儲備金的確可以阻礙價格發展。平常價格上下小波動的時候沒什麼,但是一旦情況有變,價格驟降,Bancor馬上會犧牲儲備金來維持價格。如果價格陡升,Bancor馬上會賣幣,讓市場維持在一個均衡水平。

11. Bancor無法衡量和維持資產的真正均衡價值

前面的案例已經說明了根本問題:Bancor只是為了維持一個儲備率而設計的。根本無法衡量資產的真正價值。它只能盲目地出價,利用儲備金來判斷定價。

12. 因此,Bancor就像一個可以動態調整的貨幣掛鉤

貨幣掛鉤已經被試驗了好幾次了:每當一個銀行試圖利用儲備金率來控制匯率的時候,你就有機會賭了。想想喬治索羅斯,大師級別地操作讓英格蘭銀行儲備金減少。

而現在,這一切呈現在了公鏈上。演算法固定,完全有可預見性。

13. Bancor提供投機機會,這樣並不會讓市場區域均衡。Bancor永遠都是落後於市場的。

Bancor價格和真實市場價格之間的差價,其實就是Bancor使用智慧合約定價的代價。

Bancor其實並沒有幫市場定價,Bancor價格跟真實市場的價格總是有差價的。這就給了投機者機會,投機者可以彌補兩個價格的差距。

所以,Bancor總是落後於真實市場的,它做的是緩衝器的工作。

14. Bancor並沒有在價格發現的過程中“消除勞動力”

儘管Bancor說他們在價格發現的過程中已經沒有了勞工,但是他們的合約並不是這樣的。他們只是把造市商的工作轉嫁到了投機者的身上。投機者現在的工作就是告訴Bancor合約現在資產的真實價值,工作的獎勵就是差價。

15. 沒有跡象表明Bancor方法是最佳的,這種利用儲備金的方法可能連說好都算不上

之前我們說Bancor利用儲備金來定價,這其實並不壞,只不過這不是利用儲備金的最好方式。

舉個例子,為什麼不用別的公式?或者AI技術?歷史價格?訂單深度?一個央行對儲備金的管理方法是千變萬化的。Bancor只是選了最簡單的一條

16. Bancor方法對於有大量流動性的市場是有害的

在外部市場已經有流動性的時候,Bancor的自動交易應該暫停。把這麼一個礙事的東西放進市場,儲備金不能這麼用吧。

設計Bancor明智的方法是在任何時段內對儲備金的使用進行限制,以避免上述問題。目前還沒有類似的說明。要想達到這個目的,需要將真實市場流動性告訴Bancor可能有點麻煩,但至少要在任何給定時間內限制儲備金的使用。

17. Bancor說可以提供流動性,但是並沒有

流動性指的是在價格沒有大幅變動的情況下,提供大量的交易的能力。Bancor合約並沒有保證這個能力。價格可以任意地變動,價格滑點取決於交易量的大小。因為Bancor只是簡單的一個無風險模型。

前面的討論大概解釋了Bancor的基本價值,現在我們看看在以太坊中的使用情況。

老鼠倉

18. Bancor完全可以做“老鼠倉”

Bancor現在完全可以做簡單的老鼠倉。礦工可以看到使用者正在提交訂單,然後礦工就可以在用於提交訂單之前搶先提交。於是,礦工總是可以在Bancor裡面拿到比使用者還好的價格。

Bancor裡面有一個minReturn的概念,類似於限價訂單,就是如果訂單低於某一個盈利水平,使用者可以取消訂單。

但是礦工確切地知道使用者設定的限價水平。以太坊的交易不是藏著掖著的,所以礦工可以搶在使用者之前,擠壓使用者。

做老鼠倉也是一樣,礦工可以在使用者之前提交賣單,價格就會有變動。而且礦工可以用簡單的軟體自動完成這個過程,甚至肺礦工也可以這麼做,就是多付一些費用。

19. Bancor對於做老鼠倉的漏洞修復建議沒有用

在Twitter上,Bancor的技術人員曾表示他們計劃在同一個區塊內的所有交易收取相同的固定價格。

他們說的東西現在還沒有在以太坊上實現。交易在區塊內執行都是獨立的。如果在一個區塊內有兩個交易T1和T2,T1的執行是獨立的,它都不知道T2的存在。所有T1和T2收同樣的價格根本不可能。T1都不知道T2會不會被執行。

我們可以想到一種方案,T1和T2都放在一個區塊內,然後“執行”放在下一個區塊內,這樣上述的問題就不會出現,但這樣做很噁心啊,不僅費用高,還容易被攻擊。

一般來說,任何方案包括a)為礦工提供所有資訊,b)沒有任何不確定性,c)訂單不能保證獨立性的,都是可操控的。Bancor所設想的所有修改意見,都符合上述三點。

缺乏測試的糟糕數學

20. Bancor重新做了一套數學公式

Bancor自己重新定義了一遍自己的加減乘除四則運算。順便說一句,我很遺憾他們會這麼做,原因有二。

一是財務應用不應該擔心溢位錯誤。以太坊應該提供一些基礎教學,確保重新定義自己運算的事情不再出現。

二是,任何一個基本數學實現的程式碼應該像Bancor程式碼那樣。這個程式碼裡混著特殊的數字。程式碼應該有一些基本格式,程式碼不僅要寫對,還得容易檢查。像是Bancor這種程式碼裡寫些亂七八糟的東西的話,我們在大一的時候就教過學生不要這麼幹。

21. Bancor沒有測試過自己的數學邏輯

這些數學函式被專門測試的次數,一共就只有6次。其中乘法運算只被測過一次,就是用2957乘以1740.

冪函式更槽糕。這麼關鍵的函式,居然沒有一個定向測試。都是其他測試順帶著測的。程式碼裡面包含了30多種情況,有30多個神奇的數字,但是測試卻屈指可數。

22. 算術錯誤可能是致命的

Bancor這個垃圾程式碼裡面,常量太多了,我們想測試這個程式碼正不正確都很困難。好程式碼是一種藝術,Bancor完全不是。任何一個常量有錯都是致命的。

甚至簡單的四捨五入在這裡都可能有問題。一個舍入錯誤是可以讓攻擊者從交易中獲利的。雖然這種攻擊每次獲利不大,但是攻擊者可以玩一天。

一個極端情況是那些儲備金已經消耗完的幣,怎麼重返市場。目前的Bancor合約沒有這個體現,也就是儲備金沒有了就是沒了。calculatePurchaseReturn這個命令根本沒有用。

整合和擴充套件

23. Bancor不支援基於Bancor的代幣有供應上限的概念

如果基於Bancor的代幣不是證券,而是作為系統訪問的代幣,那麼它們是有可以兌換某些服務的權力。在許多情況下,系統只能提供有限的服務,所以代幣設計者會為代幣設定供應上限。但是Bancor的智慧合約不會,沒有上限。

24. Bancor不能擴充套件

投機者可以利用Bancor對在其鏈上的幣進行連續的交易,他們根本不關心這些幣都是些什麼。因為如果有人關心的話,這些幣就不用Bancor來提高流動性了。

使用者超付

25. Bancor欺騙使用者

Bancor的智慧合約不能發出帶小數點的代幣量,只能是把你的錢拿走,然後給你一個四捨五入以後的整數。因為你提交你的出價後,你不知道你的交易什麼時候會被執行,所以你不僅要向礦工支付交易費用,還要給Bancor額外的費用或者幣,以便合約可以執行交易。你猜錯的話,比如說,會拿到1.99998個幣,一般四捨五入就成1個幣了。那你為那0.99998個幣多付的費用就沒了。

這肯定會讓使用者沮喪,他們提交了2個幣,回來就剩一半了。Bancor的白皮書聲稱你可以預見你換回來的東西,都是扯的:你根本不知道你能換回來多少。

潛在的重入問題

26. Bancor程式碼很難驗證是正確的

他們的程式碼真是一團糟。

寫得好的程式碼看起來是個藝術品,不管是用什麼語言寫的。但是Bancor程式碼的質量實在太差了。一般寫的差的程式碼有幾個標誌:程式碼路徑亂,不遵循最佳方法。正常情況下執行得都不錯,到了極端情況,事情可能就複雜得多。在我的課上,我學生們會說“你看這個問題不會發生,A要先發生,但A是有B和C保護的,C確保B不會發生”,這是程式碼路徑的邏輯體現。我的學生都知道,更別提Bancor了。

27. Bancor程式碼在sell函式里有重入問題

再BancorChanger中,似乎有一個重入問題。不是每個重入問題都是漏洞,也不是每個漏洞都致命。但是在資金轉移後,應該是沒有狀態變化的,可這個還沒有部署的程式碼第389行有變化。

我們不能確定這個漏洞是不是可以利用,但是感覺很怪。在資金轉以後,沒有理由對關鍵的事項,比如虛擬餘額的執行狀態進行更改。

28. Bancor程式碼在change函式里也有重入問題

當從一種代幣換到另一種代幣的時候。首先是buy函式,然後是sell函式。但是這兩個函式都是從Bancor合約裡調出來的。因此,如果在這兩個函式操作期間,代幣轉回到Bancor合約裡,可能情況就亂了。

同樣,我們還是不能確定這漏洞可不可以被利用

29. Bancor程式碼是假設基於Bancor的ERC20代幣是協同的

問題是ERC20的代幣會包含惡意程式碼。Bancor技術人員不可能去稽覈頂部程式碼。即使他們檢查了,也有可能在部署後更改ERC20代幣的合約。

意見

Bancor的方法不能被證明是正確的,這種盲目創造市場的方法有很多問題,比如老鼠倉,潛在的重入問題,程式碼質量等等問題,都值得注意。

世界上有問題的想法很多,但不是所有瑕疵的想法都會導致災難。也許礦工們都心地善良,不會做老鼠倉,也許程式碼裡所有數字都是對的,也許四捨五入的問題也沒有嚴重的後果。

但我們可以明確知道,Bancor方法不是一種貨幣的最佳用途。不在區塊鏈上,一些有信源的人當然可以以更好的方式創造市場。Bancor模仿的就是鏈下,在鏈上它幾乎沒有任何增值。

總體而言,目前的Bancor方法從根本上來說就是效率低下並且會讓儲備金流失。假設我們上面說的問題都不存在,我們也預測說基於Bancor的幣自己也能發現Bancor方法的侷限性。

從積極的角度去看, Bancor是在一個有意思的方向上的一次試錯。接下來肯定會有更復雜的方法,遲早我們將擁有真正的智慧合約,在進行貨幣管理的時候提供強有力的保證。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;