背景
随着 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:
eosio.system/src/delegate_bandwidth.cpp code diff
针对改动之后的系统合约,我们在本地测试网络做了详尽的测试,功能完全符合我们的预期。
近期我们将推动这一改动在麒麟测试网络上的部署和测试。我们也希望社区的开发者们也都来参与测试,并提供测试结果和反馈。
如果未来的测试没有问题,我们将发起 proposal 将这个惠及所有 EOS 账户的改动部署到 EOS 主网上。
我们相信这个改动,可以让 EOS 主网释放更多的资源,进而最终降低开发者和用户的资源成本。
By EOSLaoMao 团队