写在前面
- 本文涉及到bancor名词可能会让部分不熟悉bancor的同学看着有些confuse,先把区别写在前面:
bancor plan: 可以理解为凯恩斯提出的“国际清算同盟计划”bancor protocol / bancor协议: 可以理解成bancor机制的核心算法
bancor.network:基于bancor协议的智能合约实现的去中心化交易所
- 另外本文中关于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调节。
上图中可以看到:不同的cw值对应的smart token价格随供应量不同表现出的不同走势。
当cw为1时,价格恒定;cw为0.5时,价格随供给量成线性变化;当价格分别为10%和90%时,价格随供给量的增加,一个表现为敏感,另一个表现为不敏感。这样的曲线走向和经济学中的价格弹性有异曲同工之妙。(笔者在旁边标注的$E_s$表示的就是价格弹性系数)。
bancor中涉及到的数学证明
在bancor的白皮书中有提高,smart token的价格公式为:
$$ price = \frac{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) $$
$$ =R_0(\sqrt[F]{1 + \frac{T}{S_0}} - 1) $$
细心的同学可能已经发现了,这其实就等于之前提到的price-supply曲线从$S_0$到$S_0$+T这段区间曲线下的面积。
对F这个参数,也就是CW,还有一个很有趣的视角:
即图中紫色部分的面积除以灰色部分的面积恰好等于CW。有兴趣的同学可以自行验证一下。这里贴出原贴地址:
https://forum.evolution.land/...
bancor协议的智能合约实现
注: bancor.network团队已经实现了bancor协议的智能合约实现。
这里举一个简单的例子,以ETH和智能代币的兑换为例,进行说明。
1. 用ETH买入Smart Token
当用户想用1个eth来兑换一定量的智能代币时,智能合约地执行步骤是:
- connector接收1eth,并发行出等额的etherToken,注意这里的etherToken并不是ETH,而是和ETH保持1:1兑换关系的ERC20 TOKEN。
- 继续用这些etherToken在bancor中经过计算得到一定数量的smart token,比如1w个smart token;
- 把这1w个smart token发行到用户的地址下;(这里的发行指的其实是mint的过程)
在上面的例子中,ETHERTOKEN和SmartToken都是发行出来的,因此在之前的价格计算公式中,connector_balance和smart token's supply都会变多。
再具体一些,在智能合约的具体实现中,connector又被拆分成两个角色bancorConverter
和bancorNetwork
,分别对应两个智能合约,把上面的ETH兑换smartToken的操作进一步细化得到:
- 用户发送1个ETH给
bancorConverter
,bancorConverter
再把这1个ETH发送给bancorNetwork
-
bancorNetwork
拿着这1个ETH在ETHERTOKEN存入ETHERTOKEN中,并给自己发行一个etherToken:EtherToken.deposit(bancorNetwork, 1 * 10^18);
-
bancorNetwork
把这1个etherToken发送给了bancorConverter
; - 在
bancorConverter
里实现代币兑换的计算,并把计算得到的一定数量的smartToken发行给bancorNetwork
; - 最后,
bancorNetwork
再把这一笔smartToken发送给用户;
以上面的方式完成了ETH兑换smartToken的全过程。
下图为ETH、etherToken以及smartToken的资金流向图:
可以看到,ETH最后留在了ETHERTOKEN
合约地址中;etherToken最后留在了bancorConverter
合约地址中;而smartToken则流向了用户。
2. 卖出smartToken换回ETH
这个过程比上一个更简单:
- 用户把想要卖出的smartToken发送给
bancorNetwork
; - 在
bancorConverter
中销毁bancorNetwork
账户上相应数量的smartToken,并计算出smartToken对应多少数量的etherToken,然后把计算得到的etherToken从自己的地址转移到bancorNetwork
地址; -
bancorNetwork
再拿着得到的etherToken,去ethertoken的合约地址中兑换出等额的eth,并发送给用户
下图为卖出smartToken换回ETH中的资金流向图:
可以看到,直接从用户的账户上销毁smartToken;而etherToken则从bancorConverter
中流向bancorNetwork
并最终销毁;在完成上述过程中,则从ETHERTOKEN
地址中把ETH还给用户。
基于bancor的交易所封装实现
bancor.network官方的github库其实已经挺完善了,不过任何人想要使用换币的逻辑就必须经过白名单的认可,换言之只有白名单中标记为true的地址才可以进行换币行为,这样对单个用户很不友好,而bancor官方也并未给出交易所的智能合约实现,因此我们在bancor的基础上又封装了一个bancorExchange
,用于实现特定币种之间的兑换行为。
github地址:https://github.com/evolutionl...
在readme里列出了系列合约的kovan地址,大家可以自行测试。当然如果想亲手部署一个bancor网络的同学,我们也给出了详细的部署步骤,网址如下:
https://github.com/evolutionl...
写在最后
bancor plan是一个很棒的去中心化货币解决方案,虽然在几十年前就被凯恩斯提出,但是因为中心化(政治)的原因被废弃。感谢区块链的兴起,又把bancor带回了大众的视野,并在区块链的技术支持下,得到了完全实现。
那么像bancor这样曾经因为技术水平或者中心化组织出于自身利益被废弃却很棒的提议,是否都可以随着区块链的普及而复活,从而为整个世界带来更有效率地运行方式?
笔者这里想抛砖引玉,就拿我们目前最熟悉的DAO来说,就是区块链世界中代替企业的一种存在。
科斯在「社会成本问题」中曾经探讨过产权界定和资源配置有效性的问题,他认为:
- 在交易费用为0时,不管产权属于谁,资源都会落到最有价值的用途上;
- 在交易费用大于0时,产权的界定有利于提升效率;
而受限于技术水平,科斯认为企业是唯一降低交易费用的方式,因为企业替代了市场的作用,企业的本质就是对价格机制的替代。价格机制的运行本身也是有成本的,市场运行本身也存在费用,企业的存在就是通过管理协调替市场降低成本的必然结果。
而张五常在「经济的解释」中则更进一步地提出,市场只要合约就可以了,企业只是合约的特殊表现形式。是用一种叫“企业”的长期合约替代了“市场”的一系列短期合约的方式来节省交易费用的结果。
很显然,基于区块链和智能合约,已经发展除了初级的DAO组织,这些DAO就是以一种「新的合约」代替「企业」这种合约。在某种程度上已经实现了松散的协调自制;未来DAO在市场资源配置上,是否可以既代替企业实现更有效率的资源分配,在网络价值传递中,又可以超越企业的科层制的传播实现更广泛更高效的价值互联呢?
期待更多像bancor.network这样优秀的项目,帮助我们在实现去中心化价值传递的道路上走的更远。