Tor-DHT-PoC实验运行记录


1. 前言

新年伊始,做好2019年最后的码字:)

Tor-DHT-PoC是一个通过Go来广播隐藏服务,并通过Go或JS来查找隐藏服务的实验。

由于该Project已经一年多未更新,与libp2p等库的latest版本存在诸多兼容问题,这也是撰写本文的起因。

2. 安装Golang环境

Golang的安装过程十分简单,不过多阐述,仅简单记录Ubuntu 18.04的安装过程。

  • 官网下载安装包,如go1.13.5.linux-amd64.tar.gz

  • 解压至/usr/local/

    tar -zxvf go1.13.5.linux-amd64.tar.gz
    sudo cp -rf go /usr/local
    cd /usr/local
    sudo chmod 777 go
  • 配置环境变量,此处GOROOT是Golang软件安装的位置,GOPATH是工作目录,修改完毕请source ~/.bashrc

    # ubuntu在~/.bashrc下
    export GOROOT=/usr/local/go
    export GOPATH=/root/go
    export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
  • 通过go env可以校验配置是否成功

    运行go env

3. 编译go-tor-dht-poc

Go+Tor+DHT Proof of Concept简介如下

This is a proof of concept showing how to build a DHT over Tor with v3 onion services. This was accomplished with the Tor client library bine and go-libp2p (specifically the DHT lib).

Basically, the goal was to be able to build an onion service, connect to onion service peers, and once a DHT is formed, be able to signal that some onion services are providers for certain hashes

首先确保vps下已装好较新版本的Tor,并将其路径放置在$PATH

export PATH=$GOPATH/bin:$GOROOT/bin:/root/tor/src/app:$PATH

克隆tor-dht-poc并对go-tor-dht-poc进行编译

git clone https://github.com/cretz/tor-dht-poc.git
cd go-tor-dht-poc
# 仅需要get下面的包,即可完成所有依赖的安装
go get github.com/cretz/bine
go get github.com/cretz/tor-dht-poc/go-tor-dht-poc
go get github.com/opentracing/opentracing-go
# 编译
go build

此时将产生一系列错误,debug流程如下

3.1 “log.Warningf undefined”等未定义错误

查看错误消息栈,问题均指向ipfs/go-log这个包,在其Github的issues里发现:

所以我猜测在v2.0.1及之后的版本,均会产生此错误,因为方法已经被移除了。

所以我们只要回滚到v2.0.0版本即可。

cd ~/go/src/github.com/ipfs/go-log/
git checkout v2.0.0

通过git log确认版本即可。

git log查看go-log版本为v2.0.0

3.2 函数传参错误

解决完3.1的错误继续编译,会提示如下错误:

1) ~/go/src/github.com/cretz/tor-dht-poc/go-tor-dht-poc/tordht/ipfs/dht.goProvideFindProviders函数传参错误,具体报错行如下:

Provide以及FindProviders函数中传参错误

2) ~/go/src/github.com/cretz/tor-dht-poc/go-tor-dht-poc/tordht/ipfs/impl.go中的hashedCID函数出现返回值错误,具体报错行如下:

hashedCID函数返回值错误


其实看完这两个问题,可以发现出错问题均来自hashedCID,因为第一个错误中cid值也来自该函数。

查看t.ipfsDHT.Provide()以及t.ipfsDHT.FindProvidersAsync(),其中传入的cid均为cid Cid格式,而hashedCID()函数返回的却是*cid.Cid,是一个指针,难怪会报错。

所以要解决问题1),如下修改即可:

修改传入的参数为指针取值

再看问题2)cid.NewCid(...)函数的返回值类型是Cid而不是*Cid,所以只需将返回值取地址即可赋值给指针变量。

修改hashedCID的返回值

3.3 编译成功

再次运行go build,发现编译成功了,且在根目录下生成了go-tor-dht-poc可执行文件。:)

4. 运行go-tor-dht-poc

运行如下命令

./go-tor-dht-poc provide

会发现又报错了…

Expected at most 1 listen onion address错误

查看源码部分

返回listenAddrs数组错误

可以发现希望返回的数组中只有一个监听地址,实际数组大小却大于1。

listenAddrs就是就是上面的[/p2p-circuit /dns4/diwtavocj42mho3xyujpkvdpkkzjl6x6x6ct7mjevaj4uggbbx2fclyd.onion/tcp/32789/ws]

可以看到数组长度为2

所以此处我们需要对listenAddrs进行数组切片

对listenAddrs进行数组切片

然后,再次编译,并运行,终于成功运行了!

成功运行go-tor-dht-poc

然后我们尝试find操作,因为peer #1和peer #5是provider,所以我们查找peer #3:

通过find查询peer #3

可以看到data ID在peer #1和peer #5上找到。

在解决了诸多BUG后,实验成功。:)

后续还有js-tor-dht-poc的实验过程,待补充。


评论
 本篇
Tor-DHT-PoC实验运行记录 Tor-DHT-PoC实验运行记录
主要记录运行”tor-dht-poc“隐藏服务仿真实验中遇到的诸多问题及解决方法。
2019-12-31
下一篇 
解决VMware中共享文件夹hgfs的权限问题 解决VMware中共享文件夹hgfs的权限问题
1. 前言以前都是在Mac下的Parallels Desktop中安Ubuntu用,其“共享文件夹”很方便,也没出现过什么问题。 最近换了Windows下VMware中弄了个Ubuntu跑暗网爬虫,为了方便编码我想弄个共享文件夹,但却出现了
2019-12-09
  目录