搭建双节点挖矿的filecoin私有链

前言

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

使用环境

本人有两台机器,IP分别为:10.10.1.107和192.168.50.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的可执行文件。

5、安装go-filecoin

go run ./build install

6、修改配置

修改fixtures/setup.json

{
  "keys": 5,
  "preAlloc": [
    "1000000000000",
    "1000000000000",
    "1000000000000",
    "1000000000000",
    "1000000000000"
  ],
  "miners": [{
    "owner": 0,		// 0.key
    "power": 1
  },{		//^^^^ add antoher miner
    "owner": 1,		// 1.key
    "power": 1
  }]
}

生成密钥对和创世块

mkdir fixtures/user
./gengen/gengen --keypath fixtures/user --out-car fixtures/user/genesis.car --out-json fixtures/user/gen.json --config fixtures/setup.json

将fixtures文件夹压缩后发到35机器,后面会用到

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

在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/user/genesis.car

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

2、启动

./go-filecoin daemon

3、获取节点地址

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

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

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

1、初始化

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

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

2、修改配置

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

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

3、启动

./go-filecoin daemon

4、获取节点地址

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

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

现在我们折回到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/QmZNmr7avbeo4NfkEQsXExwA1pTgJA1nqn2NuBw2u6P3WB"
		],
		"minPeerThreshold": 0,
		"period": "1m"
	},

3、启动

./go-filecoin daemon

4、连接

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

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

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

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

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

三、挖矿

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

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

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

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

$ walletaddr=$(./go-filecoin --enc=json wallet import ./fixtures/user/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
zDPWYqFD5Aydz16wTZ9BJyUEzt7ZvknoLzU7UpPME2Ts9AEvLH3N

开始挖矿

$ ./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 t2pa5c7e6rfz6qcdybs4midx3e3i4f7gtdzcixpqi to 0.000000001.
        Published ask, cid: zDPWYqFCroLct1hm2bHaE9LF42tvgiXcCmppLRm1gsVpY3tMc2w9.
        Ask confirmed on chain in block: zDPWYqFCz97A2UMZUr3vTukVEMUnVtRvTBpUFyBrgrvx1eHyedxH.

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

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

果然,供应存储成功了。

同样的,启动107机器的挖矿程序

获取挖矿地址、peerID和钱包地址,并且存到相应的变量(请注意,和35不同的是,这次使用的是Miners[1]和1.key)

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

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

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

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

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

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

查询钱包余额

$ ./go-filecoin wallet balance $walletaddr
1000000000000

更新矿工的网络(libp2p)ID


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

开始挖矿

$ ./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.000000002 2880
Set price for miner t2vkliyrc76grvxz7pvng23vzo5gxvrzhobbebvqi to 0.000000002.
        Published ask, cid: zDPWYqFD4TtBb6LWyhKs5haQAdkQJHY8MdsqGoJ6ihVxtxjKhFPm.
        Ask confirmed on chain in block: zDPWYqFD8qecYYibxbkaCHDV2kridgh3hMu8n1s1HvDdcaQF1U2M.

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

$ ./go-filecoin client list-asks --enc=json | jq 
{
  "Miner": "t2vkliyrc76grvxz7pvng23vzo5gxvrzhobbebvqi",
  "Price": "0.000000002",
  "Expiry": 2893,
  "ID": 0,
  "Error": null
}
{
  "Miner": "t2pa5c7e6rfz6qcdybs4midx3e3i4f7gtdzcixpqi",
  "Price": "0.000000001",
  "Expiry": 2892,
  "ID": 0,
  "Error": null

果然,供应存储成功了。

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

查询钱包余额

$ ./go-filecoin wallet balance $walletaddr
999999999999.9

少的那部分应该是挖矿抵押金额。

tips

两台机器同步挖矿,CPU立马涨到100%,我生怕电脑自动关机,没有继续下去,想要存储东西的同学可参考《搭建filecoin私有链》

后话

由上可知,filecoin存储和市场这块基本可用,双节点挖矿私有链跑通了。

你可能感兴趣的:(ipfs)