RAM的Bancor协议详解

in #bancor6 years ago (edited)

概念

本段文字是摘抄来的,先大概了解下Bancor

最近几年我们见证了大量新加密货币的出现和发展,不过它们大部分在获得区块链社区认可前都面临着相同的挑战——流动性。没有足够的交易量,新加密货币不能加入多个交易所,因此它们对持有人来说是无法流通的。虽然很多加密货币可能对用户或投资者来说是有真实价值的,不过他们也不愿意支持不能最终兑换为比特币、以太币或法币的加密货币。

Bancor协议引入了一种技术解决方案,通过使用以区块链为基础的智能合约和储备货币来解决这个问题。这个协议可以让所有人创建代币,这种代币以预先设置的比率来持有一种或几种其它代币作为自己的储备金。这些储备代币可以是法币、数字化资产(如黄金)或其它加密货币(如比特币、以太币或其它)。通过使用这些储备金,新创建的代币直接获得价值,不管交易量怎样。它还直接获得了它本身和储备代币之间的汇率,因此不管什么时候它都能兑换回它的储备代币,不管有没有买家。

这样的“本质可交易代币”使用了简单的数学公式,这个数学公式中有一个常量,它是在发行者创建他们新货币时定义的——恒定储备金比例,或称为CRR。

CRR规定了代币的一部分(0%到100%之间)会被作为储备金持有,以此来为新创建的代币背书。

如果CRR设置为0%,这意味着新创建的代币没有任何储备代币背书(正如目前所有新创建的加密货币面临的情况那样)。

如果CRR设置为100%,这意味着这个新创建的代币只是储备代币的一个“贴牌”代币,就像数字化美元、ETF或赌场的筹码等,如果这个比率设置在0%到100%之间,这意味着新创建的代币的一部分是由储备代币背书的——这就出现了“信用扩张”,意味着新货币被创建出(就像当今的部分储备金系统一样)。

这个公式计算储备代币和新创建代币之间的关系来为新代币制定单价。这是一种新价格发现方式,它不依赖交易第二方的参与,也不依赖第三方作为经纪人来进行交易。取而代之的是它利用了智能合约中的透明的数学公式。这样就会产生及时的流动性,不管交易量有多少。

Bancor协议的最大创新在于,数字货币在传统交易所的价值发现基于买单(BID)和卖单(ASK)的实时同步(Synchronous)匹配,然而基于Bancor协议,数字货币的价格取决于储备金余额和代币的流通量,价值发现的过程是异步的(Asynchronous)。

EOS的爱西欧基于bancor协议算法是非常可行的,但是有一个前提,爱西欧的项目必须是刚需,就如RAM似的,如果RAM不是刚需,采用bancor协议进行定价,一旦大家都认为项目没有前景,同时抛售,那么币价就会直接归零,这也可以解答为什么外面的bancor协议项目由于没有庄家而导致币价一落千丈甚至归零。如果项目标的是刚需,会给bancor的定价提供坚实的支撑。

Bancor实现

先来看几个术语,为了易于理解,就用买卖RAM来分析:

1、 Smart Token’s total value(智能代币总值)

发行代币总值,这个值是如下公式计算来的,应该很好理解:

Smart Token’s total value(智能代币总值) = price(智能代币价格) × Smart Token supply(智能代币供应量,这里指的是流通量,也是已发行的量)

ram总数量用eos数量计算所得值(ram以k为单位,每单位值多少个eos)

2、 connector balance(储备代币余额)

智能代币发行时储备代币余额

买入的eos总数量

3、 CW(connector weight)(储备金比重)

CW(储备金比重) = connector balance(储备金余额) / Smart Token’s total value(智能代币总值)

从上面两个公式,我们可以得出智能代币价格公式,如下:

price = connector balance / (Smart Token's outstanding supply × CW)

中文公式:

智能代币价格 = 储备金余额 / (智能代币供应量 × 储备金比重)

注意这个储备金余额和智能代币供应量是会随着买卖发生变化的。

买入的eos总数量 / ram总数量用eos数量计算所得值

继续看另外三个公式:

4、tokens issued(智能代币发行量)

这个智能代币发行量不是总发行量,在前面概念中知道要得到智能代币就需要有储备金,这是指用储备金买入的智能代币数量。

tokens issued = supply × ((1 + connected tokens paid / balance )^CW − 1)

从这公式可以看出,随着储备金余额balance的增加,同样数量的储备金得到的代币数量会减少。

这就是为什么买的人越多,储备金余额越多,能得到的代币越少,代币价格就会越高。

用eos买入ram,connected tokens paid则为eos数量,tokens issued则为买到的ram数量

5、connected tokens paid out(卖出智能代币所得储备金)

卖出ram得到eos,tokens destroyed则为卖出的ram,connected tokens paid out则为得到的eos

6、 effective price(有效价格)

effective price(代币有效价格) = connected tokens exchanged(买入时的储备金数量) / smart tokens exchanged(买到的智能代币数量)

用eos买ram时,connected tokens exchanged为eos数量,smart tokens exchanged为实际得到的ram数量

简单示例

还是先来看看Bancor白皮书的例子,数量简单比较好理解。

假设A币现有流通量为1000个,储备金有250个B币,CW定义为50%。

price = 250 / (1000 * 50%) = 0.5(B)

就是说A币的价格为0.5个B币。

现在买家张三想用10个B币买入A币(也就是发行了A币),那能买几个呢?

tokens issues = 1000 x ((1+10/250)^50% - 1) ≈ 19.8

按照公式买到的A币是19.8个而不是20个,那有效价格也不是报价0.5而是按以下公式算出:

effective price = 10 / 19.8 ≈ 0.5051(B)

这个价格比报价0.5要稍高,这是因为储备金B增加10个引起的。

一开始有个supply没明白指的到底是哪个量,后来看代码都知道是流通量,补充下官方的例子,注意supply、balance的数值变化

在刚才张三买了10个B币的基础上,现在又有买家李四想用50个B币买入A币,那能买几个呢?

tokens issues = 1019.8 x ((1+50/260)^50% - 1) ≈ 93.75

effective price = 50 / 93.75 ≈ 0.53(B)

ram示例

CW = 0.0005 这个CW怎么来的见BM的文章

先看看怎么计算报价,可以通过cleos命令取到以下数据:

(env3) Chaim:cleos Chaim$ ./cleos -u http://nodes.get-scatter.com:80 get table eosio eosio rammarket
{
  "rows": [{
      "supply": "10000000000.0000 RAMCORE",
      "base": {
        "balance": "14547313323 RAM",
        "weight": "0.50000000000000000"
      },
      "quote": {
        "balance": "4723938.3429 EOS",
        "weight": "0.50000000000000000"
      }
    }
  ],
  "more": false
}

实际这处直接计算的价格才是正解的,如下:

price = 4723938.3429 / (14547313323/1024) ≈ 0.3325(EOS)

总内存为6410241024=67108864K,当前流通量52902503K,大概为50.45G。

由公式3我们可以算出已储备的eos数量,如下:

connector balance = price * (Smart Token supply × CW) = 0.3325 * 52902503 * 0.0005 ≈ 8795

储备金这么少吗?不到1万个EOS!

buyrambytes

假设现在我需要买1M的RAM,那需要多少EOS呢?用公式4如下:

tokens issued = supply × ((1 + connected tokens paid / balance )^CW − 1)

代入已知数得:

1024 = 52902503 × ((1 + connected tokens paid / 8795)^0.0005 - 1)

求出connected tokens paid结果为:347.15(EOS),也就是需要347.15个EOS就能买到1024K RAM。

每K RAM的有效价格为:347.15 / 1024 ≈ 0.339(EOS/K)

从理论知道这个算法在资源稀缺时,越到后来价格会越贵,那现在假设买1个G,需要多少EOS,有效价格又是多少呢?

1024*1024 = 52902503 × ((1 + connected tokens paid / 8795)^0.0005 - 1)

求出connected tokens paid结果为:9.82e20!假设买10个G,计算器说不是数字!!!

还是看买10M吧,算出connected tokens paid为4157.30,有效价格为0.41;买100M算出connected tokens paid为411818.32,有效价格为4.02。

buyram

假设现在我花费1000EOS买RAM,能得到多少RAM呢?同样用公式4如下:

tokens issued = supply × ((1 + connected tokens paid / balance )^CW − 1)

代入已知数得:

tokens issued = 52902503 × ((1 + 1000 / 8795)^0.0005 - 1)

求出tokens issued为2848.58K RAM。

每K RAM的有效价格为:1000 / 2848.58 = 0.35(EOS/K)

假设买8795 EOS,则issued为18337.79,有效价格为0.48(EOS/K)。

EOS代码分析

   asset exchange_state::convert_to_exchange( connector& c, asset in ) {

      real_type R(supply.amount);
      real_type C(c.balance.amount+in.amount);
      real_type F(c.weight/1000.0);
      real_type T(in.amount);
      real_type ONE(1.0);

      real_type E = -R * (ONE - std::pow( ONE + T / C, F) );
      //print( "E: ", E, "\n");
      int64_t issued = int64_t(E);

      supply.amount += issued;
      c.balance.amount += in.amount;

      return asset( issued, supply.symbol );
   }

   asset exchange_state::convert_from_exchange( connector& c, asset in ) {
      eosio_assert( in.symbol== supply.symbol, "unexpected asset symbol input" );

      real_type R(supply.amount - in.amount);
      real_type C(c.balance.amount);
      real_type F(1000.0/c.weight);
      real_type E(in.amount);
      real_type ONE(1.0);


     // potentially more accurate: 
     // The functions std::expm1 and std::log1p are useful for financial calculations, for example, 
     // when calculating small daily interest rates: (1+x)n
     // -1 can be expressed as std::expm1(n * std::log1p(x)). 
     // real_type T = C * std::expm1( F * std::log1p(E/R) );
      
      real_type T = C * (std::pow( ONE + E/R, F) - ONE);
      //print( "T: ", T, "\n");
      int64_t out = int64_t(T);

      supply.amount -= in.amount;
      c.balance.amount -= out;

      return asset( out, c.balance.symbol );
   }

注意eos代码与前面分析的有点不一样,买入时(convert_to_exchange)balance用的是当前储备金eos余额加上本次买入的eos数量,而卖出时(convert_from_exchange)balance用的是当前ram流通量减去本次卖掉的ram数量。

这种方式保证买入时的价格实际是买入后的价格,卖出时的价格实际是卖出后的价格,能防止按前述方式快速买入卖出的套利行为。

参考

这篇图文讲解比较清晰
http://www.btb8.com/eos/1807/7802.html

Bancor白皮书
https://storage.googleapis.com/website-bancor/2018/04/01ba8253-bancor_protocol_whitepaper_en.pdf

https://medium.com/@bytemaster/eosio-ram-market-bancor-algorithm-b8e8d4e20c73

http://8btc.com/thread-49136-1-1.html

https://www.jinse.com/news/blockchain/23277.html

https://www.eosrp.io/

https://github.com/EOSIO/eos/issues/3032

https://github.com/EOSIO/eos/issues/4515?ref=tokendaily


感谢您阅读 @chaimyu 的帖子,期待您能留言交流!

Sort:  

你今天过的开心吗?小可可,淘气包帅还是我帅? 小可可,啥星座的? 小可可,你有半块橡皮吗?假如我的留言打扰到你,请回复“取消”。

学习了!感谢分享!

我开始看了半天没明白,还是看代码靠谱

@chaimyu you were flagged by a worthless gang of trolls, so, I gave you an upvote to counteract it! Enjoy!!

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.032
BTC 62841.54
ETH 3040.07
USDT 1.00
SBD 3.92