filecoin开源已经有一段时间,一直没下下来玩,这几天趁着有时间,集中精力钻研下。
测试网络已经运行很久了,近期开发网络更是被人劫持,处于瘫痪状态,于是我想搭建filecoin的私有链。
关于私有链的搭建,filecoin wiki上的资料不够详细,网上基本没有资料,很多是自己摸索出来的。
这篇文章是《搭建双节点挖矿的filecoin私有链》的姐妹篇,《搭建双节点挖矿的filecoin私有链》讲的是两台机器都挖矿,两台机器都作为客户端;本文讲的是一台机器挖矿,另一台作为客户端。
本人有两台机器,IP分别为:10.10.1.107和192.168.50.35,其中,107机器作为客户端,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的可执行文件,以及fixtures目录下生成启动配置文件。
将fixtures文件夹压缩后发到35机器,后面会用到
tar cvzf fixtures.tar.gz fixtures/
scp fixtures.tar.gz [email protected]:/root/
go run ./build install
下载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/test/genesis.car
初始化完之后,会在$HOME下生成 .filecoin文件,如果文件原来已经存在,需要删除后,重新初始化。
./go-filecoin daemon
$ ./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"
./go-filecoin init --genesisfile=./fixtures/test/genesis.car
初始化完之后,会在$HOME下生成 .filecoin文件,如果文件原来已经存在,需要删除后,重新初始化。
修改 ~/.filecoin/config.json,在"addresses"那里添加107机器节点的地址
"bootstrap": {
"addresses": [ //^^^^ add peer's address
"/ip4/10.10.1.107/tcp/6000/ipfs/Qme75CfRTkK9Kw2etBL1TZujnw5Vh1yaDK1r3HrsRuzDa7"
],
"minPeerThreshold": 0,
"period": "1m"
},
./go-filecoin daemon
$ ./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"
修改 ~/.filecoin/config.json,在"addresses"那里添加107机器节点的地址
"bootstrap": {
"addresses": [ //^^^^ add peer's address
"/ip4/192.168.50.35/tcp/6000/ipfs/QmPJGwgnVZkDPUJYyASqb1KucwC4gaPwmGnuKLUMME4hKG"
],
"minPeerThreshold": 0,
"period": "1m"
},
./go-filecoin daemon
$ ./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
只要一边通了,另外一边秒通。
如果一切顺利,此时两台机器已经连在一起。
获取挖矿地址、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
}
果然,供应存储成功了。
获取钱包地址,请注意,和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存储和市场这块基本可用,整条私有链跑通了。