EOS-REX 是如何工作的

注意之前 BM 提案中的 SEOS 在实际实现中并未出现。

简单的业务步骤:

  1. 出借方向 REX 账户存入一定数量的 EOS(比如 1000 个 EOS),同时指定好投票对象或代理
  2. 使用 REX 账户的余额购买 REX 代币,比如 1000 个 REX 代币作为凭证,持有时间需要大于4天,才可以赎回。
  3. 承借方向 REX 账户支付一定数量的 EOS(比如 10 个 EOS)作为租金,来获取相应数量的CPU资源。
  4. 租赁期(最少30天)满后,承借方对 CPU 的使用权限到期,出借者通过将 1000 个 REX 代币归还 REX 账户,拿到本金与利息—— 1010 个 EOS。

主要解决如下问题:

  1. 建立一个市场,可以通过支付一小部分 EOS 价格来租赁相关的资源。
  2. 返还租赁费用,以及网络费用(例如:eosio.ramfee,eosio.names)给出租者
  3. 保护那些在价格波动时需要使用网络资源的账户
  4. 通过投票或者参与到资源市场来提高网络安全

核心是去掉 EOS 随意抵押和不理性抵押行为,只保留那些真正需要使用 CPU 的 EOS 抵押行为,
这样全网 CPU 的 EOS 抵押量就可以真实反映当前 CPU 的需求量,这样反映出的 CPU 价格才是真实的合理的

fa6d33f2.png 1597d2c5.png

原文
原文中的引用

下面是对原文的主要内容的翻译。

先来看一下整个流程图

c6cb394a.png

购买 REX 出租资源

d7e83976.png

EOS 持有者可以转账 EOS 到 REX 账户购买 REX 代币来出租 CPU/NET 资源。
也可以使用已经质押的 EOS 直接购买 REX 代币,不需要先做取消质押的操作。当购买 REX 代币的时候,EOS 会存入 REX 账户。
获得的 REX 数量取决于当前的 EOS 和 REX 的汇率。REX 的发行数量的计算方法是 EOS/REX 的汇率在购买前和购买后是一致的。
为了购买 REX 用户需要投票给代理或者至少 21 个生产者。当用户购买 REX 时,支付的 EOS 数量会计算到用户的投票上,并且更新投票数,这样允许用户出租资源的同时不丧失投票的权利。

租借 CPU/NET

825a0505.png

REX 账户里面的 EOS 是用来出借给租赁者抵押 CPU/NET 资源的,使用少量的 EOS 租金租期 30 天。
租金会存入可借出 EOS 的 REX 账户,租借的数量是通过类似 RAM Bancor 算法计算的,使用未借出的 EOS 和收到的租金作为 Bancor 的输入参数。
租借者账户会收到租借的抵押 CPU/NET 资源。

赎回 EOS

6e5db072.png

用户可以卖出 REX 代币给 REX 账户,赎回 EOS,计算方法和购买 REX 一样。如果资金池没有可流通的 EOS(都借出去了),那么赎回订单会添加到队列中,直到满足条件。为了防止价格操纵,用户只能在购买 REX 代币 4 天后赎回 EOS。用户在赎回的时候会获得额外的 EOS 作为出租的利息。因为租金加入到 REX 账户后会改变 EOS/REX 的汇率,使 REX 比 EOS 更有价值。将来其他的 EOS 收入也可能加入 REX 账户,例如:RAM 费用,优质账户名拍卖等。

相关接口简要介绍

github

// 把 EOS 存入 REX 基金
void deposit( const name& owner, const asset& amount );

// 从 REX 基金赎回 EOS
void withdraw( const name& owner, const asset& amount );

// 使用 REX 基金中的 EOS 购买交易所中的 REX 代币, 需要投票
void buyrex( const name& from, const asset& amount );

// 使用质押的 EOS 购买 REX 代币,需要投票 购买成REX后,这些EOS对应的CPU或者NET减少, 但投票权重不变。
void unstaketorex( const name& owner, const name& receiver, const asset& from_net, const asset& from_cpu );

// 按照当前汇率卖出 REX 代币,获取 EOS
void sellrex( const name& from, const asset& rex );

// 使用基金账户的 EOS 租赁 CPU/NET
void rentcpu( const name& from, const name& receiver, const asset& loan_payment, const asset& loan_fund );
void rentnet( const name& from, const name& receiver, const asset& loan_payment, const asset& loan_fund );