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

in eos •  6 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 团队

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!