Bancor Protocol
The Bancor Protocol enables automatic price determination and an autonomous liquidity mechanism for tokens on smart contract blockchains. These Smart Tokens have one or more connectors to a network that hold balances of other tokens, allowing users to instantly purchase or liquidate a Smart Token for any of its connected tokens directly through the Smart Token’s contract, at a price that is continuously recalculated to balance buy and sell volumes.
Bancor Protocol白皮书中像上面这样介绍Bancor协议,它提出的背景是大量的token存在市值小,上币难的问题。为了解决Token经济中的交易长尾问题。它的解决方案是在智能合约中抵押一定的connector token,例如eth,eos等,通过固定的计算公式计算出smart token相对于connector token的实时兑换价格。这个价格是随着smart token发行量的改变和改变的。
简单说,这个协议描述了这样一种发行token的方式:
- Token的发行与交易绑定:从smart token contract中购买数量为A的smart token,那么该token的总发行量就增长A,向smart token contract卖出数量为A的smart token,该token的总发行量就减少A。
- Token的价格与发行量绑定:确定的发行量对应确定的价格。
- Token的市值与合约中的connector token余额成固定比例,即connector weight的倒数。
举个例子,假设创建一个smart token ABC,初始准备金为100ETH,初始发行量为1000个ABC,初始价格设为0.2Eth/ABC。那么cw = 100 / (0.2*1000) = 0.5,这个cw会作为一个常量,应用到今后该合约的交易价格计算中。
smart token价格计算公式
其中P指最当前价格,P0指初始价格,S指smart token的发行量,S0指初始发行量,
如果用户想要买入数量为T的smart token,那么他需要支付的connector token数量为E
其中R0指合约内的connector token余额在与合约进行交易的过程中,CW保持恒定,其计算公式为
\R指当前connector token余额,S表示当前的smart token发行量,P表示当前的smart token相对于connector token的价格
Bancor In CoinEx Dex Chain
在dex 1.0中,我们提供了价格曲线为直线的bancor实现,在这样的实现中价格随发行量的增加线性增长
定义dex bancor需要三个参数:smart token的初始价格,最大价格,最大供应量。需要特别指出的是,与bancor protocol中的概念不同,dex bancor将bancor的创建和smart token的发行分离,仅仅使用bancor来达到自动化做市的目的。dex bancor更像一个存放smart token和connector token的池子,在创建bancor时需要将用户指定数量的smart token锁定在池子中,这个数量也是该bancor可以卖出的smart token的最大数量,用户无需锁定任何connector token,在今后的买卖交易中,池子中的smart token和connector token会动态的变化。价格则随着smart token的数量变化而做确定性变化。此外,任何在dex上发行的token都可以作为connector token。
只有smart token的owner有权利创建该token为stock的bancor市场,用户可以随时根据当前价格来选择购买或卖出,交易是立即发生的,不需要买卖双方订单的撮合。每一笔bancor交易都会改变当前bancor市场中锁定的smart token数量,从而根据公开的计算公式来改变smart token价格。在bancor市场创建时,会指定一个最早可删除时间点,当链上时间超过该时刻后,bancor的创建者有权利删除bancor市场。
典型的直线价格供应量关系如下图所示
为了增加更加丰富的价格波动设计,在dex 2.0中,我们提供了指数曲线形式的价格-供应量关系。我们在smart token的初始价格,最大价格,最大供应量的基础上,增加了maxMoney参数。
价格计算公式如下
connector token余额公式:
其中,AR (alpha reciprocal)的计算公式:
通过创建bancor时四种参数的不同组合,可以得到不同的AR,不同的AR可以产生不同的价格曲线,并且这个公式支持初始价格为0的场景,读者可能注意到,当AR=1时,该曲线退化为直线。
指数运算的实现
上面公式中涉及到指数运算,coinex dex chain使用cosmos sdk中的Dec数据类型来表示价格,但是Dec不支持指数运算,而且浮点数运算随编译器,机器的不同会产生不同的结果,这在区块链应用中是大忌,所以我们提前在一台机器上生成如下这张表
我们简化表示为:
AR的范围为[0.0, 6,0],
的范围为[0.000,1.000],所以这张表里目前有60000个数据。
其中,按照公式计算出的AR向下取整到表中的数据,而
则分别向上下取证,取到表中相邻的两个值,按照线性插值的方式,计算出真正的
举个例子:
假设当前ar=3.333,那么我们向下取整到3.3,
=0.5026,我们向上下取整到0.502和0.503,然后在表中查找到两个值:
和
,再根据0.5025在0.502和0.503这两点确定的直线上的位置,计算出最后的k,这个例子中k如下
计算出k后我们就可以套用到上面的价格和connector token余额公式计算出当前的smart token价格和bancor中的money数量。
这次交易的成交价格可以按下面的公式计算得出
由于
是向上下取整,做线性插值,那么容易得出,在这个小区间内,价格是一个常量,推而广之,整个价格曲线实际上是一段段常量拟合成的指数曲线,这是对计算精度与计算确定性的一种权衡。
是向上下取整,做线性插值,那么容易得出,在这个小区间内,价格是一个常量,推而广之,整个价格曲线实际上是一段段常量拟合成的指数曲线,这是对计算精度与计算确定性的一种权衡。
典型的指数价格供应量关系如下图所示
对于上述指数计算表的生成,还可以依据指数的同底数幂相乘,底数不变,指数相加的运算规则,做下述转换:
这样可以有效降低计算表中的计算项数目,比如指数取小数点后两位,进过上述公式变换,表中数目从
降低到
,但是也容易看出,在链上实际计算时,需要额外的做两次大数乘法。空间与时间的平衡是我们接下来需要仔细斟酌的地方。
Conclusion
Dex chain利用bancor protocol进行自动化做市,先后提供了直线,曲线形式的价格-供应量关系,并放开了smart token和connector token的配对限制,作为撮合交易的一个重要补充,很好的活跃了token经济。
本文由CoinEx Chain开发团队成员 helldealer撰写。CoinEx Chain是全球首条基于Tendermint共识协议和Cosmos SDK开发的DEX专用公链,借助IBC来实现DEX公链、智能合约链、隐私链三条链合一的方式去解决可扩展性(Scalability)、去中心化(Decentralization)、安全性(security)区块链不可能三角的问题,能够高性能的支持数字资产的交易以及基于智能合约的Defi应用。