著名的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是在一个有意思的方向上的一次试错。接下来肯定会有更复杂的方法,迟早我们将拥有真正的智能合约,在进行货币管理的时候提供强有力的保证。

(作者:冲科技,内容来自链得得内容开放平台“得得号”;本文仅代表作者观点,不代表链得得官方立场)

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章