bitshares-witness节点结构之入口

入口分成三个部分

  • main函数入口

  • 主循环入口

  • 网络消息入口

main函数入口

  • 成员结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
main
1. app:application - 应用
1. map<string, app::abstract_plugin> - 所有插件, 分激活的和能够支持的
1. witness_plugin::witness_plugin - 见证人
1. witness private_keys - 见证人私钥
2. witness ids - 见证人ids
3. witness block schedule - 区块产生调度器
2. debug_witness_plugin::debug_witness_plugin - 见证人调试,监听区块链事件
3. account_history::account_history_plugin - 账号历史事件,监听区块链事件,并记录到object_database中
4. elasticsearch::elasticsearch_plugin - ES插件
5. market_history::market_history_plugin - 市场历史
6. delayed_node::delayed_node_plugin - 延时节点
7. snapshot_plugin::snapshot_plugin - 快照
8. es_objects::es_objects_plugin - ES对象
9. grouped_orders::grouped_orders_plugin - 命令组
2. chain::database - 区块链
1. object_database - 对象索引管理,chain::database继承自object_database
1. index[256][256] - 对象索引
1. index = primary_index<witness_index> - 以下为举例
1. witness_index = generic_index<witness_object, witness_multi_index_type>;
1. witness_object = multi_index_container<witness_object,
indexed_by<
ordered_unique< tag<by_id>,member<object, object_id_type, &object::id>>,
ordered_unique< tag<by_account>,member<witness_object, account_id_type, &witness_object::witness_account>>,
ordered_unique< tag<by_vote_id>,member<witness_object, vote_id_type, &witness_object::vote_id>>
> >;
2. block_database - 区块数据库
1. _blocks - 实际区块数据
2. _block_num_to_pos - 区块索引数据
3. net::node - p2p节点
4. websocket_server - ws连接,api再连接里面
5. websocket_tls_server - wss连接,api再连接里面
1. websocket_connection_ptr
1. websocket_api_connection
1. app::login_api
6. api_access - api接口控制
2. bpo::variables_map - 配置
1. bpo::options_description - 入口配置:argc,argv
2. bpo::options_description - 文件配置:data/config.ini
3. exit signal - 退出信号
  • 启动顺序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
main
1. app:register_plugin<>*9 - 注册9个插件
2. app_options:read - 读取入口函数配置参数
3. cfg_options:read - 读取配置文件参数
4. app:initialize - 初始化
5. app:initialize_plugins - 初始化插件
6. app:startup - 启动
1. chain::database:open - 启动区块链
1. db version check - 链版本检查
2. object_database:open - 对象数据读取,对应本地的object_database目录
3. block_database::open - 区块数据读取,对应本地的database目录
4. init_genesis - 初始化创世数据
5. reindex - 索引检查
2. set allowed_apis - ws/wss等api权限设置
3. reset_p2p_node - 启动p2p网络
4. reset_websocket_server - 启动ws网络
5. reset_websocket_tls_server - 启动wss网络
7. app:startup_plugins - 启动插件
1. witness_plugin::plugin_startup - 启动witness插件
1. dschedule_production_loop - 启动区块产生的循环
1. witness_plugin::maybe_produce_block - 根据条件来确认是否产生区块
8. wait exit signal - 等待退出信息,如ctrl+c
9. app:shutdown_plugins - 关闭所有插件
10. app:shutdown - 关闭

主循环入口

  • 见证人插件,内部循环会调用函数,条件是node为见证人节点、时序轮到自己等

    • witness_plugin::maybe_produce_block
  • Delay节点插件,定时从见证人节点获取已经落地的数据

    • delayed_node_plugin::mainloop

网络消息入口

  • p2p网络消息接收点

    • 有20多个协议,但业务主要用到trx_message_type,其下面有47个操作类型,如transfer_operation,limit_order_create_operation,limit_order_cancel_operation等
    • application下的application_impl::handle_transaction 为trx_message_type类消息的接受点
    • 此消息的处理在witness_plugin::maybe_produce_block中
  • ws/wss, http/https网络消息接收点

    • login_api - websocket_api_connection 注册 login_api和database_api 接口
      • block_api
      • database_api - 默认
      • network_broadcast_api - 默认
      • network_node_api
      • history_api - 默认
      • crypto_api - 默认
      • asset_api
      • orders_api - 默认
      • graphene::debug_witness::debug_api