EOCS中继网络实现了两种模式,分别是eoc模式和icp模式,今天先介绍eoc模式。
eoc_relay_plugin 源码剖析
在eoc_relay_plugin.cpp中
1 | static appbase::abstract_plugin& _eoc_relay_plugin = app().register_plugin<eoc_relay_plugin>(); |
向appbase中注册了eoc_relay_plugin插件。
1 | void eoc_relay_plugin::set_program_options(options_description&, options_description& cfg); |
该函数将config中配置的参数设置导入eoc_relay_plugin中,内部调用了plugin_initialize和init_eoc_relay_plugin函数,设置eoc_relay_plugin必备的参数。
接着调用
1 | void eoc_relay_plugin::plugin_startup() |
该函数主要是实现插件的启动,内部绑定了controller的applied_transaction,accepted_block_with_action_digests,irreversible_block信号,当收到这些信号,就会自动调用relay的三个函数。
上面就是eoc_relay_plugin的核心通信代码,内部的网络消息流程和net_plugin类似,通过icp_relay类完成网络消息的控制,以及回调函数的逻辑处理。
1 | void relay::start_monitors( ) |
该函数设置了定时器,检测连接是否成功,不成功则定时重连。
1 | void relay::start() { |
该函数启动了eoc插件的网络监听事件,start_listen_loop就是控制的网络事件循环监听。
1 | void relay::send_icp_net_msg(const icp_net_message& msg) |
中继间通信是通过网络tcp点对点发送的,该函数就是封装了icp_net_message发送的功能。
1 | void relay::on_applied_transaction(const transaction_trace_ptr& t) { |
该函数是跨链交易处理的核心逻辑,分别处理了不同类型的action,如ACTION_ADDBLOCKS,ACTION_OPENCHANNEL等。
同样,由于eoc_relay既要发送消息,也要接收消息,所以封装了几个消息处理函数如
1 | void relay::handle_message( icp_connection_ptr c, const icp_notice_message & msg) |
该函数处理icp_notice_message。详细细节,读者可以下载源码仔细读一读,eoc_relay_plugin核心代码剖析就介绍这些了。