这里是从一系列关于libp2p的go实现教程开始,go-libp2p

  我们会讲述go的安装,go模块的设置,启动libp2p节点,并在它们之间发送消息。

安装go

  go-libp2p推荐使用包含 modules feature的go版本,也就意味着你必须使用1.11或以上版本。

  你可以按照 official installation instructions安装go的最新版本。

  安装成功后,你应该能够运行go version 并且能够看到版本>= 1.11,例如:

创建go模块

  我们将要创建一个可以在命令中运行的go模块。

  我们首先创建一个目录,然后再用go mod 初始化它成为一个go 模块。我们将在/tmp目录中创建这个新目录, 你可以在文件系统的任何目录创建它都是可以的(但是我们建议你不要在GOPATH目录创建这个新目录)。我们使用模块名github.com/user/go-libp2p-tutorial来初始化它。但是你也可能想用你自己的代码库相应的名字去初始化,以方便你想发布你自己的代码版本。

  在当前目录,你应该有一个叫做go.mod的文件,这个文件的内容包括你初始化模块的名字和你当前使用的go 的版本。

启动libp2p节点

  我们将添加一些代码到我们的模块,并启动一个libp2p节点。

  我们首先添加一个叫main.go的文件, 使用默认设置来启动一个libp2p节点,功能是打印这个节点的监听地址,然后关闭它。

  我们现在可以使用go build编译这段代码,然后在命令行运行:

  这个监听地址被使用multiaddr 格式化了,go-libp2p在默认情况下会监听所有可用的IPv4和IPv6网络。

配置节点

  通过向 libp2p.New传递参数可以修改节点的默认设置。让我们使用libp2p.ListenAddrStrings来配置节点IPv4回环地址的监听端口为2000。

  现在重新编译并运行可执行程序,可以看到现在打印的是我们配置的地址:

  Libp2p.New 可以接收各种大量的不同方面的节点配置参数。详细请看options.go 。

信号等待

  一个立即对出的节点没有什么用处。让我们在main函数的结尾添加一个等待操作系统信号的代码块,用于阻塞程序防止其在我们关闭节点前退出:

  我们也需要更新引用的程序包,需要增加我们现在使用的osos/signal 和 syscall

  再次运行这段代码,它会一直运行直到收到SIGINT或SIGTERM信号为止。

Ping协议

  现在我们有能力配置和启动libp2p节点,可以开始讲它们之间的通讯了。

设置流处理器

  以go-libp2p实现的节点,默认是运行它自己内部的ping协议,但是现在让我们禁止使用它的内部ping协议,然后通过手工注册字节流句柄的方式设置它,用于方便展示运行协议的过程。

libp2p.New返回的对象实现了Host interface,我们将使用SetStreamHandler方法为我们的ping协议设置句柄。

首先,让我们在我们的程序中引用github.com/libp2p/go-libp2p/p2p/protocol/ping程序包:

  现在我们将向libp2p.New传递一个参数,用于禁止内建的ping协议, 让后通过使用ping 包里的PingService类型来手工设置流句柄(注意我们通过配置让节点监听随机的本地TCP端口,而不是硬编码一个端口,这就意味着我们可以在一台机器上运行多个节点,且这些节点不会试着去监听相同的端口):

连接对等节点

  配置好ping协议,我们需要一个方法来实现节点之间的互联,然后发送ping消息。

  我们首先扩展一下我们启动节点后打印的日志,让它能够打印节点PeerId的值,然后我们要使其他节点连接到本节点。我们需要引入github.com/libp2p/go-libp2p-core/peer程序包,然后使用它来代替“Listen addresses”日志信息,用于打印地址和PeerId:

  现在运行这个节点,然后打印出这个节点地址信息,可以使用这些信息连接到它。

  节点需要接收一个命令行参数,这个参数是我们需要向其他节点发送ping消息的节点的地址,我们可以运行一个等待信号的监听节点,或者运行一个在关闭之前向其他节点发送多次ping消息的节点(我们使用github.com/multiformats/go-multiaddr程序包解析来自命令行参数的节点地址):

发送ping、pong消息

  我们终于可以运行两个节点了,为它们运行一个协议,使一个节点连接另一个节点。

  简要概括,这里是我们写的一个完整的程序:

  我们在一个终端窗口启动一个监听节点(i.e. 不要传递任何命令行参数):

  在另一个终端, 让我们运行第二个节点,但是要转入第一个节点的地址,我们应该能够看到一些ping消息的响应日志:

  成功了!我们使用go-libp2p的两个节点现在可以通讯了!确实,它们现在只能说“ping”, 但是现在只是开始!

从go-libp2p开始的更多相关文章

  1. Libp2p学习(一)

    Libp2p学习 参考资料:libp2p-specifications : https://github.com/libp2p/specs 持续更新ing 1. 介绍 Libp2p的实现目标是: 支持 ...

  2. Libp2p 简介

    这是一个翻译的系列文章,原文参考:Introduction :: libp2p Documentation 欢迎来阅读libp2p相关文档,不论你是刚开始学习如何用libp2p来搭建P2P系统, 还是 ...

  3. Filecoin2017年Q4进度更新(完整版)

    亲爱的Filecoin支持者.矿工.用户.投资者和广大的社区朋友们, 自从Token销售完成以后,我们便开始集中精力把Filecoin项目从设想变为现实-从实现Filecoin协议的核心代码到打造我们 ...

  4. IPFS家族(二)

    go-ipfs IPFS协议的go语言实现,ipfs的核心协议,最新版是v0.4.13 下载地址:https://dist.ipfs.io/#go-ipfs 源代码地址:https://github. ...

  5. IPFS家族(一)

    IPFS这个项目其实很大,并不像大家想象的是一个东西,IPFS是由很多模块组成,每一个模块现在都已经独立成项目了,并且有自己的主页.让我们来简单看一下IPFS家族成员. 协议实验室的主页:https: ...

  6. Filecoin官方更新: Q4工作进展和2018年工作计划

    ICO过后,Filecoin团队一直没有对外更新过工作计划(很多投资人都等待的不耐烦了).经过漫长的等待,在新年的第一个工作日,我们终于等来了来自于filecoin团队的声音, 这次更新真是出乎小编的 ...

  7. P2P综述

    原文参见:http://www.lotushy.com/?p=113 [TOC] 什么是P2P P2P全称是Peer-to-peer.P2P计算或P2P网络是一种分布式应用架构.它将任务或负载分发给P ...

  8. 使用Go语言编写区块链P2P网络(译)(转)

    转自:https://mp.weixin.qq.com/s/2daFH9Ej5fVlWmpsN5HZzw 外文链接: https://medium.com/coinmonks/code-a-simpl ...

  9. IPFS初探

    背景:听说IPFS=bittorrent+bitcoin+git+afs,有可能取代http,好像厉害的不行,所以要研究一下. 编译参考:https://github.com/ipfs/go-ipfs ...

  10. go for cryptocurrency

    https://blog.conformal.com/category/btcd/ https://github.com/btcsuite/btcd/tree/master/docs https:// ...

随机推荐

  1. 14flask 渲染富文本编辑器

    转载一个flask 渲染富文本编辑器: https://blog.csdn.net/qq_32198277/article/details/53355249 这里会产生一个问题: 通过富文本编辑器的数 ...

  2. vue+echarts+datav大屏数据展示及实现中国地图省市县下钻

    随着前端技术的飞速发展,大数据时代的来临,我们在开发项目时越来越多的客户会要求我们做一个数据展示的大屏,可以直观的展示用户想要的数据,同时炫酷的界面也会深受客户的喜欢. 大屏展示其实就是一堆的图表能够 ...

  3. UNP——第二章,端口号,套接字对,TCP,UDP输出

    1.端口号 端口号用于区分使用相同协议的进程. TCP69 与 UDP69 是不同的. 端口号范围 0 - 65535, 其中 0- 1023 是保留端口. 2.套接字对 TCP服务通过套接字对,唯一 ...

  4. 三:登录功能实现,servlet

    1)servlet 2)request 请求对象 3)response响应对象 4)转发 5)重定向 1.servlet就是用来处理客户端的请求的 1.1去官网下载 1.2 在STS上添加该包ctrl ...

  5. Check Host:实时监控网站或者服务器是否可以访问

    如果你拥有一个网站,那么最重要的事情就是要保证它24小时都能够访问.不过国内的虚拟主机服务非常糟糕,经常会出现各种状况,所以我们需要一个软件,可以让我们第一时间知道网站出现了无法访问的情况,从而通知售 ...

  6. Python_迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  7. PHP反序列化漏洞-CVE-2016-7124(绕过__wakeup)复现

    前言 最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异....  其他设备电脑都OK唯独我的电脑 时好时坏 我仿佛摸清了我电脑断网的时间段所以作息时间都改变了  今天12点多断网刷了会手 ...

  8. Markdown进阶

    ### 事项清单 - [x] 拖地 - [x] 擦窗 - [ ] 写作业 - [ ] 交资料 效果 事项清单 [x] 拖地 [x] 擦窗 [ ] 写作业 [ ] 交资料 流程图 graph LR A[ ...

  9. JS获取当前日期及 js获取当前时间和一星期前的时间

    var myDate = new Date();     new Date() 代表当前 年 月 日 时 分 秒: myDate.getYear();        //获取当前年份(2位),getY ...

  10. Java蓝桥杯——递归练习题:走台阶(偶数版)

    递归练习题:走台阶(偶数版) 小明刚刚看完电影<第39级台阶>.离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个 ...