问题

如果我要加入一个EOS网络并且要参与出块,那么我的config.ini中p2p-peer-address配置了目前出块节点的p2p-listen-endpoint地址中的至少一个,此时我还是无法出块,必须在目前出块节点中至少一个config.ini中添加我的p2p-listen-endpoint才可以。这个和ETH的P2P貌似不太一样,麻烦大佬解释一下这个原理,谢谢!

解答

经过测试,EOS的节点连接都走 P2P为双向,不存在单独的处理方式

主要代码在net_plugin插件中

https://github.com/EOSIO/eos/blob/master/plugins/net_plugin/net_plugin.cpp

代码分析就不细说了,之前有相关发帖

https://www.bcskill.com/index.php/archives/625.html

https://my.oschina.net/u/4069047/blog/3005068

目前涉及 4个参数

  • p2p-server-address
  • p2p-listen-endpoint
  • p2p-peer-address
  • p2p-max-nodes-per-host 限制来自相同IP的P2P连接数

参数讲解参考
https://developers.eos.io/eosio-nodeos/docs/net_plugin

https://techterms.com/definition/p2p

虽然P2P对等网络,最终实现还是socket

客户端connect

https://github.com/EOSIO/eos/blob/5082391c60b0fa5e68157c385cd402bf25aea934/plugins/net_plugin/net_plugin.cpp#L1847

服务端listen

https://github.com/EOSIO/eos/blob/5082391c60b0fa5e68157c385cd402bf25aea934/plugins/net_plugin/net_plugin.cpp#L1901

p2p-peer-address 为connect 使用
p2p-listen-endpoint为 listen使用
p2p-server-address 同上,并且优先覆盖

https://github.com/EOSIO/eos/blob/5082391c60b0fa5e68157c385cd402bf25aea934/plugins/net_plugin/net_plugin.cpp#L2995

只要同时有一个连接存在,则能正常工作。
比如节点A (BP)设置了p2p-listen-endpoint(作为P2P Server),并且开放链接,节点B(同步)只要设置 p2p-peer-address(作为P2P Client) 就可以完成链接。A,B反过来也一样。
但对于P2P既是客户端,也是服务端,所以可以的话,互相加下最稳妥。

小白的主要问题在,他在同一台机器上跑了多个节点,但p2p-max-nodes-per-host用的默认值1,BP节点的p2p-listen-endpoint已经被占用了,然后测试节点再连接,由于IP相同,导致无法通过。

先粗略写下,不清楚再补充把

问题转载自:http://wiki.bcskill.com/?thread-21.htm