bitshares研究系列【问题集四】
在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”把票计到自己或是代理人头上。
通过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 的帖子,期待您能留言交流!
恭喜你!您的这篇文章入选 @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! ^_^
Thanks
你好!听说有才的人都去参加 “三个一” 活动了呢,你要不要去耍耍?如果我打扰到你,请回复“取消”。