从创世区块配置说起
我们在进行bitshares私链搭建时,需要首先生成创世区块,创世区块的生成则有创世区块配置决定。
使用witness_node
–create-genesis-json可以创建一个系统默认参数的创世区块配置文件。
大概梳理一下:
"initial_timestamp":"2017-08-25T02:59:45",创世区块配置文件创建的时间
"max_core_supply":"1000000000000000",BTS的最大供给量,1单位为0.00001BTS。这里最大供给量为1000000000000000*0.00001
BTS。
“initial_parameter”:是区块链的参数,包括各种操作的手续费。在chain/protocol/operations.hpp对这些操作进行了定义。这些操作主要分为五类,分别为普通操作类、资产相关、市场相关、账户相关和业务管理。
上面系列图中分别为这五类操作的手续费情况。
"block_interval": 5,区块链出块的间隔时间,单位是秒。
"maintenance_interval": 86400,维护一次事件的时间间隔,一般为1天维护一次。主要维护投票数据和其它一些动态参数。
"maintenance_skip_slots": 3,当进行事件维护时,允许不写区块的次数。
"committee_proposal_review_period":1209600,
"maximum_transaction_size": 2048,一笔交易的最大容量,字节为单位
"maximum_block_size": 2048000000,一个区块的最大容量,字节为单位
"maximum_time_until_expiration":86400,一笔交易的生命周期,秒为单位
"maximum_proposal_lifetime":2419200,一个提议交易的生命周期
"maximum_asset_whitelist_authorities":10,发行资产的接受方黑白名单的最大限制数量(发行一份资产,允许或者禁止哪些账户购买)
"maximum_asset_feed_publishers":10,
"maximum_witness_count": 1001,活跃见证人的最大数量
"maximum_committee_count": 1001,活跃理事会成员的最大数量
"maximum_authority_membership":10,
"reserve_percent_of_fee": 2000,
"network_percent_of_fee":2000,每笔交易网络抽取的费用比例
"lifetime_referrer_percent_of_fee":3000,每笔交易,该交易账号的推荐人抽取的费用比例
"cashback_vesting_period_seconds":31536000,
"cashback_vesting_threshold":10000000,
"count_non_member_votes": true,设置为false则限制成员投票的权利
"allow_non_member_whitelists":false,设置为true则没有成员能够设置黑白名单
"witness_pay_per_block": 1000000,每产生一个区块分配给见证人的奖励
"worker_budget_per_day":"50000000000",每天能分配出来的项目运算
"max_predicate_opcode": 1,
"fee_liquidation_threshold":10000000,
"accounts_per_fee_scale": 1000,
"account_fee_scale_bitshifts": 4,
"max_authority_depth": 2,
“initial_accounts”是初始化的一些账号,默认11个账号。这11个账号估计正好与11个最少见证人对应。每个账号信息如下:
{
"name": "nathan",名称
"owner_key":"BTS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",账号拥有权限的公钥
"active_key":"BTS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",账号活跃权限的公钥
"is_lifetime_member": falsetrue为终身会员
}
“initial_assets”:初始发布的数字资产,这里没有。
”initial_balances”:
"initial_balances": [初始化发布的资产。
{
"owner": "BTSFAbAx7yuxt725qSZvfwWqkdCwp9ZnUama",资产发布的用户地址
"asset_symbol": "BTS",资产的标记符合
"amount": "1000000000000000"资产发布的总量
}
],
"initial_witness_candidates": [初始的候选见证人
{
"owner_name": "init0",名称
"block_signing_key":"BTS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"每个区块签名对应的公钥
}
…
]
"initial_committee_candidates":[{初始的理事会成员候选人
"owner_name": "init0"名称
},
…
]
"initial_worker_candidates": [],初始的项目预算候选
"initial_chain_id":"aa34045518f1469a28fa4578240d5f039afa9959c0b95ce3b39674efa691fb21",
"immutable_parameters": {不可更改的链参数
"min_committee_member_count": 11,最小11个理事会成员
"min_witness_count": 11,最小11个见证人节点
"num_special_accounts": 0,
"num_special_assets": 0
}
上面这些创世区块配置信息,由genesis_state_type数据结构进行表达,Genesis_state_type定义在chain/genesis_state.hpp中。可以使用create_example_genesis()函数创建样本genesis信息,Create_example_genesis()实现在app/application.cpp中。
genesis_state_type create_example_genesis(){
auto nathan_key =fc::ecc::private_key::regenerate(fc::sha256::hash(string("nathan")));
dlog("Allocating all stake to${key}", ("key", utilities::key_to_wif(nathan_key)));
genesis_state_type initial_state;
initial_state.initial_parameters.current_fees =fee_schedule::get_default();//->set_all_fees(GRAPHENE_BLOCKCHAIN_PRECISION);
initial_state.initial_active_witnesses =GRAPHENE_DEFAULT_MIN_WITNESS_COUNT;
initial_state.initial_timestamp =time_point_sec(time_point::now().sec_since_epoch() /
initial_state.initial_parameters.block_interval *
initial_state.initial_parameters.block_interval);
for( uint64_t i = 0; i
{
auto name ="init"+fc::to_string(i);
initial_state.initial_accounts.emplace_back(name,
nathan_key.get_public_key(),
nathan_key.get_public_key(),
true);
initial_state.initial_committee_candidates.push_back({name});
initial_state.initial_witness_candidates.push_back({name,nathan_key.get_public_key()});
}
initial_state.initial_accounts.emplace_back("nathan",nathan_key.get_public_key());
initial_state.initial_balances.push_back({nathan_key.get_public_key(),
GRAPHENE_SYMBOL,
GRAPHENE_MAX_SHARE_SUPPLY});
initial_state.initial_chain_id =fc::sha256::hash( "BOGUS" );
return initial_state;
}
通过调用create_example_genesis()函数,在使用fc::json::to_iso_string()就生成了前面的创世区块配置配置信息。
之后我们就可以使用generate_block()函数创建创世区块了。后续对generate_block过程进行分析。