IMT星际源码 2018-10-30

序言

梁川,资深架构师,拥有10年以上一线技术从业经验。梁先生精通Erlang、python、Golang、java; 擅长各种平台高并发大流量架构设计与实施; 精通Ethereum区块链以及相关技术; 通读Go-Ethereum源码。

我们开辟《星际源码》专栏,请梁先生为我们讲讲高深的架构技术。梁先生将会不定期的随时分享他在工作中的感想与新知,希望与感兴趣的开发者朋友们一同学习成长!

go-libp2p-host Connect 源码分析

Connect 过程解析

•      go-libp2p-host中定义了Host接口,它有几个实现都在go-libp2p包中,我们关注basic包中的BasicHost实现,因为IPFS用了这个实现

•      Connect主要是dial peer并完成握手,再去交换Identify信息,Identify信息后文有提到,文中反复提到的ID是指Identify协议的名称

•      发起连接一端我们称为 from ,被连接一端成为 to ,则有如下过程在两端建立连接,这个时序图只为理解交互过程,对于阅读代码并无实际参考价值;

1、2是指from和to要先启动libp2p的host再做后续操作,在这一步已经执行了Swarm.Listen并启动了handlencoming线程来accept连接,并且为ID协议注册了StreamHandler,为通道上的连接注册了ConnHandler;

3 from端通过Connect来dial to端;

4、to端的newConnHandler被触发,这个方法调用了IdentifyConn;

5、于此同时from端发起连接请求成功后会去调用IdentifyConn;

6~14双方行为一致,握手成功后激活ID协议的StreamHandler触发requestHandler来向对方发送Identify消息,两端用各自的responseHandler来处理Identify消息,并将Identify信息放入peerstore中。

看代码,简单看一下 Connect 过程

首先看看接口怎么定义的,因为所有的逻辑都要建立在 Connect 的基础上,所以以 Connect 为入口来欣赏 BasicHost 的实现过程

Host 是什么以及 Connect 要做的事情通过注视都能看出来,只是看到 TODO 时感到有些遗憾,这个 Relay 足足耽误我几天时间,看来读代码应该先读接口.

From 端 Connect 的实现过程

注视跟接口描述的差不多,如果没有可用连接就会去尝试 dial 这个 peer 并且把它加入到 peerstore 中

dialPeer虽然很复杂但最终是调用到IdentifyConn方法上,我们直接看重点

To Listen 的实现过程

·BasicHost.NewHost

·Swarm.Listen

创建BasicHost时的net参数是Network接口的Swarm实现,那么启动过程中会调用Listen方法,下面代码贴出了关键部分,AddListenAddr方法的list.Accept()对上文提到的握手信息进行了处理,然后要upgrade这个连接,再去触发BasicHost中指定的net.SetConnHandler(h.newConnHandler)

Accept是Listener接口的方法

接口定义在go-libp2p-transport/transport.go中

实现定义在go-libp2p-transport-upgrader/listener.go中,我们看看如何实现

这个实现太简单了,只是在读incoming channel,所以线索是谁在往incoming chainnel中写数据,于是找到了handleIncoming()方法,以TcpTransport实现为例,可以看到是在UpgradeListener时启动的handleIncoming

以上已经把关键点都列出来了,略去了细节,如果想去扩展 go-libp2p 包调整握手协议组建私网等掌握这些内容应该已经够了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容