搭建filecoin私有链

前言

filecoin开源已经有一段时间,一直没下下来玩,这几天趁着有时间,集中精力钻研下。
测试网络已经运行很久了,近期开发网络更是被人劫持,处于瘫痪状态,于是我想搭建filecoin的私有链。
关于私有链的搭建,filecoin wiki上的资料不够详细,网上基本没有资料,很多是自己摸索出来的。
这篇文章是《搭建双节点挖矿的filecoin私有链》的姐妹篇,《搭建双节点挖矿的filecoin私有链》讲的是两台机器都挖矿,两台机器都作为客户端;本文讲的是一台机器挖矿,另一台作为客户端。

使用环境

本人有两台机器,IP分别为:10.10.1.107和192.168.50.35,其中,107机器作为客户端,35机器挖矿(读者朋友也可以使用同一台机器,客户端和挖矿都在同一台机器)。
本文使用的环境是ubuntu16.04,代码版本是0.2.2。

一、下载代码

在107那台机器操作:

1、下载源代码

mkdir -p ${GOPATH}/src/github.com/filecoin-project
git clone  --recursive https://github.com/filecoin-project/go-filecoin.git ${GOPATH}/src/github.com/filecoin-project/go-filecoin
git checkout fcf56acdc98a2ea4fc4d0b62878a9302f51af869

2、安装依赖

(1) golang 1.12.1
(2) Rust >= v1.36.0 and cargo
(3) pkg-config
(4) jq
(5) clang (export CC=clang)
该部分可参考README

3、编译工具和依赖文件

该过程会花费很多时间

cd ${GOPATH}/src/github.com/filecoin-project/go-filecoin
FILECOIN_USE_PRECOMPILED_RUST_PROOFS=true go run ./build deps

4、编译代码

该过程会花费较多时间

go run ./build build

编译完成后,会在go-filecoin目录下生成一个go-filecoin的可执行文件,以及fixtures目录下生成启动配置文件。
将fixtures文件夹压缩后发到35机器,后面会用到

tar cvzf fixtures.tar.gz fixtures/
scp fixtures.tar.gz [email protected]:/root/

5、安装go-filecoin

go run ./build install

在35那台机器操作:

1、下载二进制版本

下载release 0.2.2linux版本的二进制文件

2、解压

tar xvzf  filecoin-0.2.2-Linux.tar.gz
cd filecoin

3、拷贝并解压fixtures包

mv /root/fixtures.tar.gz ./
tar xvzf fixtures.tar.gz

二、节点互联

在107那台机器操作

1、初始化

./go-filecoin init --genesisfile=./fixtures/test/genesis.car

初始化完之后,会在$HOME下生成 .filecoin文件,如果文件原来已经存在,需要删除后,重新初始化。

2、启动

./go-filecoin daemon

3、获取节点地址

$ ./go-filecoin id
{
	"Addresses": [
		"/ip4/127.0.0.1/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7",
		"/ip4/10.10.1.107/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7",
		"/ip4/172.17.0.1/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7",
		"/ip4/172.18.0.1/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7",
		"/ip4/172.20.0.1/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7"
	],
	"ID": "Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7"
}

节点地址为:"/ip4/10.10.1.107/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7"

现在我们在35那台机器操作

1、初始化

./go-filecoin init --genesisfile=./fixtures/test/genesis.car

初始化完之后,会在$HOME下生成 .filecoin文件,如果文件原来已经存在,需要删除后,重新初始化。

2、修改配置

修改 ~/.filecoin/config.json,在"addresses"那里添加107机器节点的地址

"bootstrap": {
		"addresses": [    //^^^^ add peer's address
			"/ip4/10.10.1.107/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7"
		],
		"minPeerThreshold": 0,
		"period": "1m"
	},

3、启动

./go-filecoin daemon

4、获取节点地址

$ ./go-filecoin id
{
        "Addresses": [
                "/ip4/127.0.0.1/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG",
                "/ip4/192.168.50.35/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG",
                "/ip4/172.28.0.1/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG",
                "/ip4/172.17.0.1/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG",
                "/ip4/172.18.0.1/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG",
                "/ip4/172.19.0.1/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG"
        ],
        "ID": "QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG"
}

节点地址为:"/ip4/192.168.50.35/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG"

现在我们折回到107那台机器,修改配置

1、停下go-filecoin daemon

2、修改配置

修改 ~/.filecoin/config.json,在"addresses"那里添加107机器节点的地址

"bootstrap": {
		"addresses": [    //^^^^ add peer's address
			"/ip4/192.168.50.35/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG"
		],
		"minPeerThreshold": 0,
		"period": "1m"
	},

3、启动

./go-filecoin daemon

4、连接

$ ./go-filecoin swarm connect /ip4/192.168.50.35/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG
connect QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG success

如果连接失败,试过几次。

同样的,在35那台机器连接:

$ ./go-filecoin swarm connect /ip4/10.10.1.107/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7
connect Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7 success

只要一边通了,另外一边秒通。
如果一切顺利,此时两台机器已经连在一起。

三、挖矿

在filecoin中,由矿工提供存储,我们在35那台机器挖矿。

获取挖矿地址、peerID和钱包地址,并且存到相应的变量

$ mineraddr=$(jq -r '.Miners[0].Address' ./fixtures/test/gen.json)

$ peerid=$(./go-filecoin --enc=json id | jq -r '.ID')

$ walletaddr=$(./go-filecoin --enc=json wallet import ./fixtures/test/0.key | jq -r '.Addresses[0]')

设置默认的挖矿地址和钱包地址

$ ./go-filecoin config mining.minerAddress $mineraddr
"t22eqxefnl6znkylw4hsyn7u47u7crh7fcif43yxy"

$ ./go-filecoin config wallet.defaultAddress $walletaddr
"t1si3uh2q64wvymvkiiweyuo3s2agpomul6rbox2q"

查询钱包余额

$ ./go-filecoin wallet balance $walletaddr
1000000000000

更新矿工的网络(libp2p)ID


$ ./go-filecoin miner update-peerid --from $walletaddr --gas-price 0.001 --gas-limit=300 $mineraddr $peerid
zDPWYqFD4V4nwsKrbK5HGxKVPFPSnzoGW5RC56YYyULQp9WiAAbk

开始挖矿

$ ./go-filecoin mining start
Started mining

设置存储价格为0.000000001 FIL/byte/block,在2880个区块内有效

$ ./go-filecoin miner set-price --gas-price=0.001 --gas-limit=1000 0.000000001 2880
Set price for miner t22eqxefnl6znkylw4hsyn7u47u7crh7fcif43yxy to 0.000000001.
        Published ask, cid: zDPWYqFCvDprtvQQyq9Z1oYLYLB8pRV992kZktA4hVj8tbxxkymM.
        Ask confirmed on chain in block: zDPWYqFCrMWyX7mX98thX1RzYy8oasiPG63ExBH2P3Xw6P1ViMpo

供应存储的交易已经发出,查询当前的供应

$ ./go-filecoin client list-asks --enc=json | jq 
{
  "Miner": "t22eqxefnl6znkylw4hsyn7u47u7crh7fcif43yxy",
  "Price": "0.000000001",
  "Expiry": 2897,
  "ID": 0,
  "Error": null
}

果然,供应存储成功了。

有了供应,我们现在来做需求。107机器作为客户端,执行操作

获取钱包地址,请注意,和35不同的是,这次使用的是1.key

$ walletaddr=$(./go-filecoin --enc=json wallet import ./fixtures/test/1.key | jq -r '.Addresses[0]')

查询钱包余额

$ ./go-filecoin wallet balance $walletaddr
1000000000000

查询当前的存储供应

$ ./go-filecoin client list-asks --enc=json | jq 
{
  "Miner": "t22eqxefnl6znkylw4hsyn7u47u7crh7fcif43yxy",
  "Price": "0.000000001",
  "Expiry": 2897,
  "ID": 0,
  "Error": null
}

如果查询不到,重新connect一下35机器

$ ./go-filecoin swarm connect /ip4/192.168.50.35/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG
connect QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG success

新建hello.txt文件,导入到client

# Start by creating a simple .txt file
$ echo "Hi my name is $USER"> hello.txt

# Import the created file into go-filecoin.
# RETURN VAL: Content ID (CID) of this file.
# You'll need this CID for future commands to
# view, store, or retrieve this data.
$ export CID=`go-filecoin client import ./hello.txt`

#echo CID of hello.txt
$ echo $CID
Qmb66CCFxQVvJGDck7QTir5NHqC7fySq4h9cHg8daYTQ9Y

# View the imported file
# RETURN VAL: "Hi my name is user1"
$ go-filecoin client cat $CID
Hi my name is ubuntu

将hello.txt指定存到35机器上

$ ./go-filecoin client propose-storage-deal t22eqxefnl6znkylw4hsyn7u47u7crh7fcif43yxy $CID  0 10
State:   accepted
Message: 
DealID:  zDPWYqFD3kD9hSwF1sEYrQHeNqeCn4mNLD9ZHWxPXBgeaCkfipaf

上述打印表明,deal is accepted。

查询这笔订单的花费

$ ./go-filecoin client payments zDPWYqFD3kD9hSwF1sEYrQHeNqeCn4mNLD9ZHWxPXBgeaCkfipaf
Channel Amount  ValidAt Encoded Voucher
0    0.00000021 121     z2P729JDGqP3ATnwpiDLFTE1mEFC1Ka7spEyowB2q2FK3cF3Y5Ljxuhgm54K3eHi4RnVzTkkny9s1t38Drcncde7F96N5DTVe9NxmdAsxSZuVZHKRpPVe3K88fk8JABd1SzYrhuzQHtvqGmFPpaC8HHHSDAzeziMTERZKUwrPGy3BueyUamocwnikQF5bPdRNSXJBJwQTUTaFpbGTzd2AcrdUmqetHNk5ioZShmv6QqYKqExSj6XhT3KM

hello.txt大小是21BYTE,存储单位价格为0.000000001 FIL/byte/block,我们存10个block time,因此总共花费0.00000021FIL

查询钱包余额
···bash
$ ./go-filecoin wallet balance $walletaddr
999999999999.9999997899999999
···
花去的大部分作为存储费用,很小的部分作为gas费用

查询当前订单的状态

$ ./go-filecoin client query-storage-deal zDPWYqFD3kD9hSwF1sEYrQHeNqeCn4mNLD9ZHWxPXBgeaCkfipaf
Status: staged
Message: 

需要等到status为posted,才能检索文件

$ ./go-filecoin client query-storage-deal zDPWYqFD3kD9hSwF1sEYrQHeNqeCn4mNLD9ZHWxPXBgeaCkfipaf
Status: posted
Message: 

检索文件

$ ./go-filecoin retrieval-client retrieve-piece t22eqxefnl6znkylw4hsyn7u47u7crh7fcif43yxy $CID
Hi my name is ubuntu

矿工(35机器)

$ ./go-filecoin wallet balance $walletaddr
1000000112000.0000000000000001

后话

filecoin存储和市场这块基本可用,整条私有链跑通了。

你可能感兴趣的:(ipfs)