bitshares研究系列【问题集四】

in #bitshares6 years ago

在bitshares学习过程中,有一些零散问题整理在一块,互相之间并不一定存在关联性,可能也会穿插一些非bitshares的内容,计划每几个问题做一集发表。

1、Bitshares的cheap name和premium name

以前一直以为cheap name是必须带数字或者"-",后来有人问起查代码才发现不完全如此,只要不含"aeiouy"字母即是cheap name。

bool is_cheap_name( const string& n )
{
   bool v = false;
   for( auto c : n )
   {
      if( c >= '0' && c <= '9' ) return true;
      if( c == '.' || c == '-' || c == '/' ) return true;
      switch( c )
      {
         case 'a':
         case 'e':
         case 'i':
         case 'o':
         case 'u':
         case 'y':
            v = true;
      }
   }
   if( !v )
      return true;
   return false;
}

当然含"aeiouy"并且不含数字和"-"的帐号就是premium name了。

官方“水龙头(faucet)”只能注册cheap name,要注册premium name只能通过cli_wallet,并且需要有终身会员帐号做注册人。

注册帐号费用可以通过 get_global_properties 取到,如下:

          5,{
            "basic_fee": 500000,
            "premium_fee": 200000000,
            "price_per_kbyte": 100000
          }

2、什么是lifetime_referrer

account_create_evaluator操作时会将“引荐人的终身会员引荐人”设为“帐户的终身会员引荐人”,也就是终身会员引荐人是可以一级级传递的,代码如下:

         obj.lifetime_referrer = o.referrer(db()).lifetime_referrer;

升级到终身会员,引荐人、注册人、终身会员引荐人都会设为自己。代码如下:

      if( o.upgrade_to_lifetime_member )
      {
         a.membership_expiration_date = time_point_sec::maximum();
         a.referrer = a.registrar = a.lifetime_referrer = a.get_id();

而引荐人可以是终身会员和年度会员,一旦引荐人变为普通用户,他所引荐的帐户的引荐人都会改变,如下:

void account_statistics_object::process_fees(const account_object& a, database& d) const
{
    ...
         // Check the referrer -- if he's no longer a member, pay to the lifetime referrer instead.
         // No need to check the registrar; registrars are required to be lifetime members.
         if( account.referrer(d).is_basic_account(d.head_block_time()) )
            d.modify(account, [](account_object& a) {
               a.referrer = a.lifetime_referrer;
            });

帐户一旦有了终身会员引荐人,只有自己成为终身会员才能被修改。

3、proxy-to-self 是什么

proxy-to-self就是一个帐户,只是内置帐户,在init_genesis()函数中创建。

同时创建的还有committee-account、witness-account、relaxed-committee-account、null-account、temp-account等帐户。

4、Bitshares官方水龙头的注册人是谁?

这个直接注册一个帐号,取帐号数据就能看到了,现在是“onboarding.bitshares.foundation”

get_object 1.2.450921
[{
    "id": "1.2.450921",
    "membership_expiration_date": "1969-12-31T23:59:59",
    "registrar": "1.2.450921",
    "referrer": "1.2.450921",
    "lifetime_referrer": "1.2.450921",
    "network_fee_percentage": 2000,
    "lifetime_referrer_fee_percentage": 8000,
    "referrer_rewards_percentage": 0,
    "name": "onboarding.bitshares.foundation",

5、get_chain_properties取到哪些数据?

{'method': 'call', 'params': [0, 'get_chain_properties', []], 'jsonrpc': '2.0', 'id': 5}
{'id': '2.11.0', 'chain_id': '20ed9d14ffef020d766d60de277a726f2cd5f8eb0a5bc72cdbff3cab17312e61', 'immutable_parameters': {'min_committee_member_count': 11, 'min_witness_count': 11, 'num_special_accounts': 0, 'num_special_assets': 0}}

可以取到链ID、最小理事会成员个数、最小见证人个数、专用帐号个数、专用资产个数(在初始化链时建立)。

6、发行资产时什么资产可以用来抵押?

   if( op.bitasset_opts )
   {
      const asset_object& backing = op.bitasset_opts->short_backing_asset(d);
      if( backing.is_market_issued() )
      {
         const asset_bitasset_data_object& backing_bitasset_data = backing.bitasset_data(d);
         const asset_object& backing_backing = backing_bitasset_data.options.short_backing_asset(d);
         FC_ASSERT( !backing_backing.is_market_issued(),
                    "May not create a bitasset backed by a bitasset backed by a bitasset." );
         FC_ASSERT( op.issuer != GRAPHENE_COMMITTEE_ACCOUNT || backing_backing.get_id() == asset_id_type(),
                    "May not create a blockchain-controlled market asset which is not backed by CORE.");
      } else
         FC_ASSERT( op.issuer != GRAPHENE_COMMITTEE_ACCOUNT || backing.get_id() == asset_id_type(),
                    "May not create a blockchain-controlled market asset which is not backed by CORE.");
      FC_ASSERT( op.bitasset_opts->feed_lifetime_sec > chain_parameters.block_interval &&
                 op.bitasset_opts->force_settlement_delay_sec > chain_parameters.block_interval );
   }

从代码中可以看出,如果不是市场发行资产则需要是核心资产BTS,如果是市场发行的资产则需要抵押资产的抵押资产(short_backing_asset)是核心资产BTS。

7、怎么设置投票代理?

每个帐号都有“options”项,其中有一项是“voting_account”指定了代理人。

会在每次维护时间计票,根据每个帐号的“voting_account”把票计到自己或是代理人头上。

更多见bitshares研究系列【见证人选择机制】

通过cli_wallet的 set_voting_proxy 命令可以修改,其实就是改下帐号的options字段。

8、什么是votes对象?

格式:type:instance

type如下定义:

   enum vote_type
   {
      committee,
      witness,
      worker,
      VOTE_TYPE_COUNT
   };

instance是vote对象id,例如见证人对象“witness_object”的“vote_id”。

9、什么是市场发行资产(market-issued asset)?

         /// @return true if this is a market-issued asset; false otherwise.
         bool is_market_issued()const { return bitasset_data_id.valid(); }

看起来只要是智能资产,也就是能抵押的才能市场化,才是market-issued。

10、什么是null-account?

get_object 1.2.3
[{
    "id": "1.2.3",
    "membership_expiration_date": "1969-12-31T23:59:59",
    "registrar": "1.2.3",
    "referrer": "1.2.3",
    "lifetime_referrer": "1.2.3",
    "network_fee_percentage": 0,
    "lifetime_referrer_fee_percentage": 10000,
    "referrer_rewards_percentage": 0,
    "name": "null-account",
    "owner": {
      "weight_threshold": 1,
      "account_auths": [],
      "key_auths": [],
      "address_auths": []
    },
    "active": {
      "weight_threshold": 1,
      "account_auths": [],
      "key_auths": [],
      "address_auths": []
    },

null-account用来初始创建资产BTS或者做初始帐号的注册人,由于没有owner key、active key,此帐号资金无法外部操作。


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

Sort:  

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

Congratulations! This post has been selected by @justyy as today's (2018-07-08) 【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! ^_^

你好!听说有才的人都去参加 “三个一” 活动了呢,你要不要去耍耍?如果我打扰到你,请回复“取消”。

Coin Marketplace

STEEM 0.32
TRX 0.12
JST 0.033
BTC 64647.16
ETH 3160.49
USDT 1.00
SBD 4.13