Bancor的原理及智能合约实现

写在前面

  1. 本文涉及到bancor名词可能会让部分不熟悉bancor的同窗看着有些confuse,先把区别写在前面:
bancor plan: 能够理解为凯恩斯提出的“国际清算同盟计划”

bancor protocol / bancor协议: 能够理解成bancor机制的核心算法git

bancor.network:基于bancor协议的智能合约实现的去中心化交易所github

  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市场的长尾潜力。ui

bancor协议中的名词解释

bancor协议的白皮书中涉及到不少名词,先作一下解释:spa

  • 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 = \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,还有一个颇有趣的视角:

bancor-cw图

即图中紫色部分的面积除以灰色部分的面积刚好等于CW。有兴趣的同窗能够自行验证一下。这里贴出原贴地址:

https://forum.evolution.land/...

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,用于实现特定币种之间的兑换行为。

github地址:https://github.com/evolutionl...

在readme里列出了系列合约的kovan地址,你们能够自行测试。固然若是想亲手部署一个bancor网络的同窗,咱们也给出了详细的部署步骤,网址以下:

https://github.com/evolutionl...

写在最后

bancor plan是一个很棒的去中心化货币解决方案,虽然在几十年前就被凯恩斯提出,可是由于中心化(政治)的缘由被废弃。感谢区块链的兴起,又把bancor带回了大众的视野,并在区块链的技术支持下,获得了彻底实现。

那么像bancor这样曾经由于技术水平或者中心化组织出于自身利益被废弃却很棒的提议,是否均可以随着区块链的普及而复活,从而为整个世界带来更有效率地运行方式?

笔者这里想抛砖引玉,就拿咱们目前最熟悉的DAO来讲,就是区块链世界中代替企业的一种存在。

科斯在「社会成本问题」中曾经探讨过产权界定和资源配置有效性的问题,他认为:

  • 在交易费用为0时,无论产权属于谁,资源都会落到最有价值的用途上;
  • 在交易费用大于0时,产权的界定有利于提高效率;

而受限于技术水平,科斯认为企业是惟一下降交易费用的方式,由于企业替代了市场的做用,企业的本质就是对价格机制的替代。价格机制的运行自己也是有成本的,市场运行自己也存在费用,企业的存在就是经过管理协调替市场下降成本的必然结果。

而张五常在「经济的解释」中则更进一步地提出,市场只要合约就能够了,企业只是合约的特殊表现形式。是用一种叫“企业”的长期合约替代了“市场”的一系列短时间合约的方式来节省交易费用的结果。

很显然,基于区块链和智能合约,已经发展除了初级的DAO组织,这些DAO就是以一种「新的合约」代替「企业」这种合约。在某种程度上已经实现了松散的协调自制;将来DAO在市场资源配置上,是否能够既代替企业实现更有效率的资源分配,在网络价值传递中,又能够超越企业的科层制的传播实现更普遍更高效的价值互联呢?

期待更多像bancor.network这样优秀的项目,帮助咱们在实现去中心化价值传递的道路上走的更远。

相关文章
相关标签/搜索