1. 前言
新年伊始,做好2019年最后的码字:)
Tor-DHT-PoC是一个通过Go来广播隐藏服务,并通过Go或JS来查找隐藏服务的实验。
由于该项目已经一年多未更新,与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
可以校验配置是否成功
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
确认版本即可。
3.2 函数传参错误
解决完3.1的错误继续编译,会提示如下错误:
1) ~/go/src/github.com/cretz/tor-dht-poc/go-tor-dht-poc/tordht/ipfs/dht.go
中Provide
、FindProviders
函数传参错误,具体报错行如下:
2) ~/go/src/github.com/cretz/tor-dht-poc/go-tor-dht-poc/tordht/ipfs/impl.go
中的hashedCID
函数出现返回值错误,具体报错行如下:
其实看完这两个问题,可以发现出错问题均来自hashedCID
,因为第一个错误中cid
值也来自该函数。
查看t.ipfsDHT.Provide()
以及t.ipfsDHT.FindProvidersAsync()
,其中传入的cid均为cid Cid
格式,而hashedCID()
函数返回的却是*cid.Cid
,是一个指针,难怪会报错。
所以要解决问题1),如下修改即可:
再看问题2),cid.NewCid(...)
函数的返回值类型是Cid
而不是*Cid
,所以只需将返回值取地址即可赋值给指针变量。
3.3 编译成功
再次运行go build
,发现编译成功了,且在根目录下生成了go-tor-dht-poc
可执行文件。:)
4. 运行go-tor-dht-poc
运行如下命令
./go-tor-dht-poc provide
会发现又报错了…
查看源码部分
可以发现希望返回的数组中只有一个监听地址,实际数组大小却大于1。
listenAddrs
就是上面的
[/p2p-circuit, /dns4/diwtavocj42mho3xyujpkvdpkkzjl6x6x6ct7mjevaj4uggbbx2fclyd.onion/tcp/32789/ws]
可以看到数组长度为2
所以此处我们需要对listenAddrs
进行数组切片
然后,再次编译,并运行,终于成功运行了!
然后我们尝试find
操作,因为peer #1和peer #5是provider,所以我们查找peer #3:
可以看到data ID在peer #1和peer #5上找到。
在解决了诸多BUG后,实验成功。:)
后续还有js-tor-dht-poc
的实验过程,待补充。
发表评论