filecoin开源已经有一段时间,一直没下下来玩,这几天趁着有时间,集中精力钻研下。
测试网络已经运行很久了,近期开发网络更是被人劫持,处于瘫痪状态,于是我想搭建filecoin的私有链。
关于私有链的搭建,filecoin wiki上的资料不够详细,网上基本没有资料,很多是自己摸索出来的。
这篇文章是《搭建filecoin私有链》的姐妹篇,《搭建filecoin私有链》讲的是一台机器挖矿,另一台作为客户端;本文讲的是两台机器都挖矿,两台机器都作为客户端。
本人有两台机器,IP分别为:10.10.1.107和192.168.50.35。
本文使用的环境是ubuntu16.04,代码版本是0.2.2。
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
(1) golang 1.12.1
(2) Rust >= v1.36.0 and cargo
(3) pkg-config
(4) jq
(5) clang (export CC=clang)
该部分可参考README
该过程会花费很多时间
cd ${GOPATH}/src/github.com/filecoin-project/go-filecoin
FILECOIN_USE_PRECOMPILED_RUST_PROOFS=true go run ./build deps
该过程会花费较多时间
go run ./build build
编译完成后,会在go-filecoin目录下生成一个go-filecoin的可执行文件。
go run ./build install
修改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/
下载release 0.2.2linux版本的二进制文件
tar xvzf filecoin-0.2.2-Linux.tar.gz
cd filecoin
mv /root/fixtures.tar.gz ./
tar xvzf fixtures.tar.gz
./go-filecoin init --genesisfile=./fixtures/user/genesis.car
初始化完之后,会在$HOME下生成 .filecoin文件,如果文件原来已经存在,需要删除后,重新初始化。
./go-filecoin daemon
$ ./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"
./go-filecoin init --genesisfile=./fixtures/user/genesis.car
初始化完之后,会在$HOME下生成 .filecoin文件,如果文件原来已经存在,需要删除后,重新初始化。
修改 ~/.filecoin/config.json,在"addresses"那里添加107机器节点的地址
"bootstrap": {
"addresses": [ //^^^^ add peer's address
"/ip4/10.10.1.107/tcp/6000/ipfs/QmQMLHFoG3Tauvpz6ej7SRsh77y4nudKajLQGQ9MTtVU49"
],
"minPeerThreshold": 0,
"period": "1m"
},
./go-filecoin daemon
# ./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"
修改 ~/.filecoin/config.json,在"addresses"那里添加107机器节点的地址
"bootstrap": {
"addresses": [ //^^^^ add peer's address
"/ip4/192.168.50.35/tcp/6000/ipfs/QmZNmr7avbeo4NfkEQsXExwA1pTgJA1nqn2NuBw2u6P3WB"
],
"minPeerThreshold": 0,
"period": "1m"
},
./go-filecoin daemon
$ ./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
只要一边通了,另外一边秒通。
如果一切顺利,此时两台机器已经连在一起。
获取挖矿地址、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
}
果然,供应存储成功了。
获取挖矿地址、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
少的那部分应该是挖矿抵押金额。
两台机器同步挖矿,CPU立马涨到100%,我生怕电脑自动关机,没有继续下去,想要存储东西的同学可参考《搭建filecoin私有链》
由上可知,filecoin存储和市场这块基本可用,双节点挖矿私有链跑通了。