网络部分:
主要()
{
应用程序().set_version (eosio:: nodeos::配置::版本),
应用程序().register_plugin
根=fc:汽车:app_path ();//设定数据和配置路径
应用程序()。set_default_data_dir(根/癳osio/nodeos/data");
应用程序()。set_default_config_dir(根/癳osio/nodeos/config");
//应用程序初始化部分:1、输入参数处理,2,插件的初始化和安装
如果(http_plugin !应用().initialize
返回INITIALIZE_FAIL;
initialize_logging ();
<代码>应用程序()();//启动插件 应用().exec ();//网络服务器启动代码>
}
1, P2P通信构建
1.1初始化构建网络
http-server-address=172.26.247.122:8886//HTTP服务器
p2p-listen-endpoint=172.26.247.122:9006//节点服务器
p2p-server-address=172.26.247.122:9006
#这里我们同步9004年和9005年的数据
p2p-peer-address=172.26.247.122:9004
p2p-peer-address=172.26.247.122:9005
因为只有21个节点,所以,就可以直接设定了,无需太多动态需求。
接收网络信息
我→start_listen_loop ();进入监听循环
汽车插座=std:: make_shared
受体→async_accept (插座,插座,这](boost::系统::error_code ec)
//从上面看的到,都是异步通信机制。
连接。插入(c);
start_session (c);//111年开始处理
start_read_message (con);//111读取消息
康涅狄格州→process_next_message处理消息
msgHandler m (impl, shared_from_this ());//111处理不同的消息的函数
中间注册很多信号函数,网络线程通过push_transaction之发出函数发送信号到注册点,做发送操作。这个操作是信号注册的响应函数。
1接收交易
空白net_plugin_impl:: handle_message (connection_ptr c, const packed_transaction, msg) {
//存储在received_transactions列表里
调度员→recv_transaction (c, tid);
//received_transactions.emplace_back ((transaction_origin) c {id});
chain_plug→accept_transaction ();
on_incoming_transaction_async ();//Productor初始化时候注册
{
send_response()//错误则返回响应
chain.push_transaction (std:: make_shared
}
2接收握手信息
Handle_message ()
1消息正确
2节点ID重复(不要自己链接自己)
3链ID一样
4协议版本是否一样
所有错误都发送:go_away_message(错误类型)
5如果(! authenticate_peer(味精)){//认证对方
elog(“对等不是身份验证。关闭连接!”);
c→排队(go_away_message(身份验证),
返回;
}
6 sync_master→recv_handshake (c,味精);//互相检测各自链的状态,并开始同步区块数据
//同步需要检查;(自由==最后不可逆转的块)
//
//0。我的头块id==同行头id意味着我们都caugnt块智慧
//1。我的头块num & lt;同伴自由——开始同步本地
//2。我自由的在同行头num -发送一个last_irr_catch_up注意如果不是第一代
//
//3我的头块num & lt;=同伴的头块num -更新同步状态和发送一个酱请求
//4我的头块num祝辞同行块num ssend通知酱如果不是第一代
点击关注: