bitshares基本概念详解【vesting balance】

in #bitshares6 years ago

接触Bitshares一段时间后,就经常看到vesting balance这个词,来看看这个是干嘛的。

什么是Vesting Balances?

在Bitshares钱包菜单中有一项是"Vesting balances",打开看看它的说明,如下:

Vesting balances contain any fees earned through the referral program or from worker pay, for example. They have a certain vesting period and are continually unlocked during that vesting period until all of the balances are available

看起来与公司授予股份类似,这个是授予的资金(可能是worker付费、引荐费用、燃料费用等),但这些资金需要满足一定的条件(到达一定时间等)才能真正提取出来。

都有哪些Vesting Balances?

因为自己帐户没有这项数据,我们直接找个见证人看一下,通过cli_wallet可以取到帐户的vesting balances数据,如下:

unlocked >>> get_vesting_balances fox
get_vesting_balances fox
[{
    "id": "1.13.16",
    "owner": "1.2.167",
    "balance": {
      "amount": 5117015,
      "asset_id": "1.3.0"
    },
    "policy": [
      1,{
        "vesting_seconds": 7776000,
        "start_claim": "1970-01-01T00:00:00",
        "coin_seconds_earned": "39789908640000",
        "coin_seconds_earned_last_update": "2018-06-22T06:00:00"
      }
    ],
    "allowed_withdraw": {
      "amount": 5117015,
      "asset_id": "1.3.0"
    },
    "allowed_withdraw_time": "2018-06-22T06:57:00"
  },{
    "id": "1.13.32",
    "owner": "1.2.167",
    "balance": {
      "amount": "8049800000",
      "asset_id": "1.3.0"
    },
    "policy": [
      1,{
        "vesting_seconds": 86400,
        "start_claim": "1970-01-01T00:00:00",
        "coin_seconds_earned": "695494080000000",
        "coin_seconds_earned_last_update": "2018-06-22T06:57:00"
      }
    ],
    "allowed_withdraw": {
      "amount": "8049700000",
      "asset_id": "1.3.0"
    },
    "allowed_withdraw_time": "2018-06-22T06:57:00"
  }
]

allowed_withdraw就是可以提取的资金,让我先感叹一下好有钱!

相应的数据结构定义为vesting_balance_object,在vesting_balance_object.hpp中可以查看,不再列出。但可以通过代码查一下都有哪些对象使用了vesting_balance,很简单查到有以下几个地方:

account_object
witness_object
worker_object

基本上确定就是帐户的现金返还、见证人工资、工人工资这几项了。

看看"fox"的vesting balances都是哪来的?用get_account fox可以看到,其中一个是cashback,如下:

  "cashback_vb": "1.13.16",

用get_witness fox查看,另一项是见证人工资了,如下:

  "pay_vb": "1.13.32",

怎么获得Vesting Balances

从上面可知有这几种Vesting Balances,那都有哪些你怎么获得呢?

帐户的cashback

account_object.cpp -> process_fees

         d.deposit_cashback(d.get(account.lifetime_referrer), lifetime_cut, require_vesting);
         d.deposit_cashback(d.get(account.referrer), referrer_cut, require_vesting);
         d.deposit_cashback(d.get(account.registrar), registrar_cut, require_vesting);

在这个函数中有以上几处存取现金返还,终身会员引荐人、引荐人、注册人都有现金返还。

见证人的pay_vb

db_update.cpp

void database::update_signing_witness(const witness_object& signing_witness, const signed_block& new_block)
{
   const global_property_object& gpo = get_global_properties();
   const dynamic_global_property_object& dpo = get_dynamic_global_properties();
   uint64_t new_block_aslot = dpo.current_aslot + get_slot_at_time( new_block.timestamp );

   share_type witness_pay = std::min( gpo.parameters.witness_pay_per_block, dpo.witness_budget );

   modify( dpo, [&]( dynamic_global_property_object& _dpo )
   {
      _dpo.witness_budget -= witness_pay;
   } );

   deposit_witness_pay( signing_witness, witness_pay );

   modify( signing_witness, [&]( witness_object& _wit )
   {
      _wit.last_aslot = new_block_aslot;
      _wit.last_confirmed_block_num = new_block.block_num();
   } );
}

打包见证人会得到vesting balances

worker balance

db_main.cpp

struct worker_pay_visitor
{
   private:
      share_type pay;
      database& db;

   public:
      worker_pay_visitor(share_type pay, database& db)
         : pay(pay), db(db) {}

      typedef void result_type;
      template<typename W>
      void operator()(W& worker)const
      {
         worker.pay_worker(pay, db);
      }
};

每个worker类型都有balance对象,通过pay_worker()可以给工人付费。

从以上分析看来,要获得Vesting balances,可以成为其他帐户的推荐人、引荐人、终身引荐人,或者做打包见证人,或者做工人(worker)完成一定工作任务,暂时看大概就这几种途径了。

Vesting Balances相关操作

有两个相关的operation可以操作Vesting Balances,如下:

1、vesting_balance_create_operation

一般情况下会自动创建vesting balance对象,但是也可以手动创建一个vesting balance对象。翻译不好,直接看英文注释...

Manual creation of vesting balances can be used by a stakeholder
to publicly demonstrate that they are committed to the chain.
It can also be used as a building block to create transactions
that function like public debt. Finally, it is useful for
testing vesting balance functionality.

2、vesting_balance_withdraw_operation

提取vesting balance,当然需要满足一定的条件,如下:

void_result vesting_balance_withdraw_evaluator::do_evaluate( const vesting_balance_withdraw_operation& op )
{ try {
   const database& d = db();
   const time_point_sec now = d.head_block_time();

   const vesting_balance_object& vbo = op.vesting_balance( d );
   FC_ASSERT( op.owner == vbo.owner, "", ("op.owner", op.owner)("vbo.owner", vbo.owner) );
   FC_ASSERT( vbo.is_withdraw_allowed( now, op.amount ), "", ("now", now)("op", op)("vbo", vbo) );
   assert( op.amount <= vbo.balance );      // is_withdraw_allowed should fail before this check is reached

   /* const account_object& owner_account = */ op.owner( d );
   // TODO: Check asset authorizations and withdrawals
   return void_result();
} FC_CAPTURE_AND_RETHROW( (op) ) }

这个条件在is_withdraw_allowed()中进行判断,是否到达时间、币数量是否够等。

文章名字都叫基本概念详解,不再细化了,各种费用的具体分配等再研究。


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

Sort:  

恭喜你!您的这篇文章入选 @justyy 今日 (2018-06-24) 榜单 【优秀被错过的文章】, 回复本条评论24小时内领赏,点赞本评论将支持 @dailychina 并增加将来您的奖赏。

Congratulations! This post has been selected by @justyy as today's (2018-06-24) 【Good Posts You May Miss】, Steem On! Reply to this message in 24 hours to get rewards. Upvote this comment to support the @dailychina and increase your future rewards! ^_^

I like you

你那里天气如何?请支持中文区的见证人, @abit @bobdos @ety001 @justyy @skenan (首字母顺序),全投,一个都不要漏。假如我的留言打扰到你,请回复“取消”。

Thanks for sharing this work and explaining it very helpful for the community :)

You are welcome!

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.027
BTC 60147.92
ETH 2613.63
USDT 1.00
SBD 2.55