graphene-从创世区块配置信息说起

从创世区块配置说起

我们在进行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对这些操作进行了定义。这些操作主要分为五类,分别为普通操作类、资产相关、市场相关、账户相关和业务管理。


graphene-从创世区块配置信息说起_第1张图片
graphene-从创世区块配置信息说起_第2张图片
graphene-从创世区块配置信息说起_第3张图片
graphene-从创世区块配置信息说起_第4张图片

上面系列图中分别为这五类操作的手续费情况。

"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过程进行分析。

你可能感兴趣的:(graphene-从创世区块配置信息说起)