一行代码改动缓解 EOS 主网资源短缺问题!

in #eos3 years ago

背景

随着 EOS dapp 的日益流行,EOS 主网资源(CPU,NET,RAM)短缺的问题也日益凸显。

这也是 EOSLaoMao 团队很早就立项 Bank of Staked 项目的原因。我们希望通过该项目,释放更多的 EOS 用于租赁,从而降低开发者和用户的资源成本。

在开发 Bank of Staked 的过程中,我们对 EOS 系统合约做了大量的研究和测试,积累了一定的经验。比如我们将系统合约的解除抵押到账时间从默认的 3 天改成了 1 分钟,从而可以更方便地测试 Bank of Staked 的自动解抵押功能。

解抵押中的 EOS 的再利用

在测试系统合约的过程中,我们(以及很多其他开发者)发现了系统合约的一个特殊的行为,或者说功能:

当用户给自己的账户抵押的时候,系统合约会优先使用解抵押中的 EOS(unstaking EOS)。只有当解抵押中的 EOS 不够的时候,才会使用余额中的 EOS 进行补足。

让我们看一个例子:

假设我们有一个账户 eoslaomaocom,该账户的可用余额有 200 EOS,同时还有一笔解抵押中的 300 EOS:

$ cleos get account eoslaomaocom

EOS balances:
     liquid:     200.0000 EOS
     staked:     0.0000 EOS
     unstaking:  300.0000 EOS
     total:      500.0000 EOS

我们用该账户给自己抵押 400 EOS 的 CPU:

cleos system delegatebw eoslaomaocom eoslaomaocom "0 EOS" "400 EOS"

抵押成功之后,我们会看到如下的输出:

executed transaction: xxxxxxxxxxxxxxxx  144 bytes  893 us
#         eosio <= eosio::delegatebw            {"from":"eoslaomaocom","receiver":"eoslaomaocom","stake_net_quantity":"0.0000 EOS","stake_cpu_quantity":"400.0000 EOS", "transfer": 0}
#   eosio.token <= eosio.token::transfer        {"from":"eoslaomaocom","to":"eosio.stake","quantity":"100.0000 EOS","memo":"stake bandwidth"}
#        voter1 <= eosio.token::transfer        {"from":"eoslaomaocom","to":"eosio.stake","quantity":"100.0000 EOS","memo":"stake bandwidth"}
#   eosio.stake <= eosio.token::transfer        {"from":"eoslaomaocom","to":"eosio.stake","quantity":"100.0000 EOS","memo":"stake bandwidth"}

下面是 eoslaomaocom 账户最终的状态:

$ cleos get account eoslaomaocom

EOS balances:
     liquid:     100.0000 EOS
     staked:     400.0000 EOS
     unstaking:  0.0000 EOS
     total:      500.0000 EOS

我们可以看到,这笔 400 EOS 的抵押操作,由解抵押中的 300 EOS 和余额中的 100 EOS 构成。也就是说,系统合约会优先利用解抵押中的 EOS 给自身账户做抵押。

这个功能对用户来说非常棒,因为当他们给自己做抵押的时候,账户中解抵押中的 EOS 可以直接使用,而不会受到 3 天的回款期的限制。

可惜的是,这个功能只有在账户给自己做抵押的时候才有效。在我们的例子中,当 eoslaomaocom 给其他账户抵押的时候,系统合约将只从 eoslaomaocom 的账户余额中扣除全部的抵押金额。

这里是这个功能的代码实现:eosio.system/src/delegate_bandwidth.cpp

在给其他账户抵押的时候,也想优先使用解抵押中的 EOS?只要一行代码改动!

为了让在给其他账户抵押的时候也能使用解抵押中的 EOS,我们深入研究了系统合约代码,发现只需要一行代码改动,就可以实现这个目的。

这里是代码改动的截图和 diff:

Screenshot 2018-12-12 at 5.18.05 PM.png

eosio.system/src/delegate_bandwidth.cpp code diff

针对改动之后的系统合约,我们在本地测试网络做了详尽的测试,功能完全符合我们的预期。

近期我们将推动这一改动在麒麟测试网络上的部署和测试。我们也希望社区的开发者们也都来参与测试,并提供测试结果和反馈。

如果未来的测试没有问题,我们将发起 proposal 将这个惠及所有 EOS 账户的改动部署到 EOS 主网上。

我们相信这个改动,可以让 EOS 主网释放更多的资源,进而最终降低开发者和用户的资源成本。

By EOSLaoMao 团队