搭建filecoin私链 - okblockchainlab/lotus GitHub Wiki

filecoin有四种实现:

  • go-filecoin(Go)
  • lotus(Go)
  • fuhon(C++)
  • forest(Rust)

filecoin节点类型及功能

使用lotus搭建filecoin私链(MAC)

1. 安装依赖

brew install go bzr jq pkg-config rustup

2. 下载代码

git clone https://github.com/filecoin-project/lotus.git
cd lotus/

3. 编译

make clean && make all
sudo make install

至此,本地源码编译成功

4. 启动本地私链

本地私链中存储矿工采用2个sector、每个sector 2KB的模式

  1. 为2KB sector编译对应的可执行程序
make 2k
  1. 下载复制证明所需的对应(2KB)参数,用于零知识证明算法Groth
./lotus fetch-params 2048
  1. pre-seal sector
./lotus-seed pre-seal --sector-size 2KiB --num-sectors 2
  1. 创建genesis block并启动client node
./lotus-seed genesis new localnet.json
./lotus-seed genesis add-miner localnet.json ~/.genesis-sectors/pre-seal-t01000.json
./lotus daemon --lotus-make-genesis=dev.gen --genesis-template=localnet.json --bootstrap=false
  1. 在另一个终端执行,导入miner key
./lotus wallet import ~/.genesis-sectors/pre-seal-t01000.key
  1. 初始化存储矿工
./lotus-storage-miner init --genesis-miner --actor=t01000 --sector-size=2KiB --pre-sealed-sectors=~/.genesis-sectors --pre-sealed-metadata=~/.genesis-sectors/pre-seal-t01000.json --nosync
  1. 启动存储矿工
./lotus-storage-miner run --nosync

5. 存取文件

  1. 创建一个文件(比如example.txt),不要超过2KB
  2. 将文件导入本地client node,生成文件CID
./lotus client import example.txt

查看client node导入的文件

./lotus client local
  1. 查找合适的存储矿工及报价(该私链上只有一个存储矿工) 查看存储矿工列表
./lotus state list-miners

查看某个存储矿工deal

./lotus client query-ask  t01000
  1. 创建一个新账户并给其转账
# 新建账户
./lotus wallet new
# 查看钱包账户列表
./lotus wallet list
# 转账
./lotus send --source=t3weytekfbhjwq2txzrj5ervupjfdmwm6hg6mhzlcvh64qwey4oqwosznwibspp54ukqvq5opycy62rromhkoq t1gywhrmvyjaaodroyjycx37umoqaw5oie3mpcnza 10000000

其中,--source为from地址,t1gywhrmvyjaaodroyjycx37umoqaw5oie3mpcnza为新建账户地址

  1. 完成deal,将文件给存储矿工
./lotus client deal --from=t1gywhrmvyjaaodroyjycx37umoqaw5oie3mpcnza bafkreiayciipr6ohphbg3iozwidvxxqbe4yc5yhd7sryzgud6wy53ds5hm t01000 0.0000000005 100
  • --from为新增账户地址
  • bafkreiayciipr6ohphbg3iozwidvxxqbe4yc5yhd7sryzgud6wy53ds5hm为import后返回的CID
  • t01000为选择存储文件的矿工
  • 0.0000000005为存储价格
  • 100为存储时长(block?epoch?)

查看deal状态

./lotus client list-deals
  1. 获取文件
./lotus client retrieve --from=t3vcezgebcviucat5uwnpxp5d4dlc2ggvoxlssk3twktgf3sfvl54g2pen5o3rnckhmafzeims3znfaei6b2zq --miner=t01000 bafkreiayciipr6ohphbg3iozwidvxxqbe4yc5yhd7sryzgud6wy53ds5hm output.txt

参数说明同上

  1. 查询账户余额
./lotus wallet  balance t3vcezgebcviucat5uwnpxp5d4dlc2ggvoxlssk3twktgf3sfvl54g2pen5o3rnckhmafzeims3znfaei6b2zq

6. 加入新节点(client node)

1. 获取已有网络的创世文件,在另一台机器启动本地节点

rm -r ~/.lotus
./lotus daemon --genesis=dev.gen --bootstrap=false

其中dev.gen为创世文件,在上面步骤4.4中由--lotus-make-genesis=dev.gen参数指定生成,需要复制到本地

2. 将节点连接已有网络

本地节点启动后,并没有跟原私链没有网络联系,需要手动设置连接 首先,获取原私链节点监听地址。在原私链节点机器执行

./lotus net listen

# 返回
/ip4/127.0.0.1/tcp/34313/p2p/12D3KooWSKqoCW56rMN25gZvEaaH4SEq4sgYC39P8ocQSLvEURkW
/ip4/192.168.13.130/tcp/34313/p2p/12D3KooWSKqoCW56rMN25gZvEaaH4SEq4sgYC39P8ocQSLvEURkW
/ip6/::1/tcp/44953/p2p/12D3KooWSKqoCW56rMN25gZvEaaH4SEq4sgYC39P8ocQSLvEURkW

选择其中一个本地节点可连通的地址,如/ip4/192.168.13.130/tcp/34313/p2p/12D3KooWSKqoCW56rMN25gZvEaaH4SEq4sgYC39P8ocQSLvEURkW

然后,本地节点执行

./lotus net connect /ip4/192.168.13.130/tcp/34313/p2p/12D3KooWSKqoCW56rMN25gZvEaaH4SEq4sgYC39P8ocQSLvEURkW

连接成功后,lotus daemon开始同步区块.

可以执行./lotus net peers查看连接节点 也可以./lotus sync status查看同步状态

7. 加入新节点(storage miner node)

1. 启动一个client node

2. 创建矿工账户

# 创建矿工账户
./lotus wallet new bls

# 给矿工账户转账
./lotus send --source=t3qzsmjiz2wfsxdifo6se4coee2onwd4dgeh463nu45cgc5inxhdets2tw5r4lzuej5f3wiromkgufbxdyrrna t3xauazd7rdxbhdihn4vbqck5f3ojqkytpkvzyb2mvvvkgzvi4dqkgyrkkrqmd5ne2ytdjeh2nopvlo6wpk7ha 10000
  • 注意--source为转账from地址,t3xauazd7rdxbhdihn4vbqck5f3ojqkytpkvzyb2mvvvkgzvi4dqkgyrkkrqmd5ne2ytdjeh2nopvlo6wpk7ha为新建矿工账户地址

3. 初始化矿工

rm -r ~/.lotusstorage
./lotus-storage-miner init  --owner=t3xauazd7rdxbhdihn4vbqck5f3ojqkytpkvzyb2mvvvkgzvi4dqkgyrkkrqmd5ne2ytdjeh2nopvlo6wpk7ha --sector-size=2KiB --nosync
  • 注意--owner为新创建的矿工账户地址

4. 启动矿工节点

./lotus-storage-miner run --nosync

5. 检查状态和给该矿工存储文件(否则没有算力不能出块)

./lotus state list-miner
./lotus-storage-miner info
./lotus client deal ...

8. 加入新节点(seal worker node)

注意:storage miner启动时会默认启动localworker处理task,所以应避免新增worker与storage miner在同一机器运行,否则可能会导致处理过程冲突。

如果新增worker有必要与miner在同一机器运行,或者需要关闭localworker的某些task,可以修改miner配置文件将task设为false:

[Storage]
#  AllowPreCommit1 = true
#  AllowPreCommit2 = true
#  AllowCommit = true
#  AllowUnseal = true

1. 修改storage miner ListenAddress并启动

修改矿工~/.lotusstorage/config.toml配置文件中的ListenAddress的IP为新增worker可连接的地址

[API]
  ListenAddress = "/ip4/127.0.0.1/tcp/2345/http"
#  RemoteListenAddress = "127.0.0.1:2345"
#  Timeout = "30s"
#

比如内网地址/ip4/192.168.13.130/tcp/2345/http,或者直接用0.0.0.0

2. 生成auth token并设置worker环境变量

  • 在矿工节点,生成api token
./lotus-storage-miner auth create-token --perm admin

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.Qo29Qq6qBjrxMmcCvWYcq9SNZ-DVE9H6DbkMIoUrAZc

  • 查看矿工API path
cat ~/.lotusstorage/api

/ip4/192.168.13.130/tcp/2345/http

  • 在新增worker环境,设置环境变量STORAGE_API_INFO
# 格式为 TOKEN:STORAGE_NODE_MULTIADDR
export STORAGE_API_INFO=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.Qo29Qq6qBjrxMmcCvWYcq9SNZ-DVE9H6DbkMIoUrAZc:/ip4/192.168.13.130/tcp/2345/http

3. 启动worker

./lotus-seal-worker run --address 10.0.66.14:2347

其中--address必须是矿工可连接到的地址

9. cli远程连接节点(remote API)

9.1 使用lotus cli连接远程client node

  1. 修改client node ListenAddress

修改~/.lotus/config.toml配置文件中的ListenAddress的IP为cli端可连接的地址

[API]
  ListenAddress = "/ip4/127.0.0.1/tcp/2345/http"
#  RemoteListenAddress = "127.0.0.1:2345"
#  Timeout = "30s"
#

比如内网地址/ip4/192.168.13.130/tcp/2345/http,或者直接用0.0.0.0

  1. 生成 auth token
./lotus auth api-info --perm admin
FULLNODE_API_INFO=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.RXfzsWGl2QjQfQ73y2mO8aXUU0opUjzt1UVuzD1UdjI:/ip4/192.168.13.130/tcp/1234/http
  1. 设置cli端环境变量FULLNODE_API_INFO
 export FULLNODE_API_INFO=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.RXfzsWGl2QjQfQ73y2mO8aXUU0opUjzt1UVuzD1UdjI:/ip4/192.168.13.130/tcp/1234/http

然后使用lotus先关命令即可操作远程client node,如./lotus daemon stop

9.2 使用lotus-storage-miner cli连接远程storage miner node

  1. 修改miner node ListenAddress

修改~/.lotusstorage/config.toml配置文件中的ListenAddress的IP为cli端可连接的地址

[API]
  ListenAddress = "/ip4/127.0.0.1/tcp/2345/http"
#  RemoteListenAddress = "127.0.0.1:2345"
#  Timeout = "30s"
#

比如内网地址/ip4/192.168.13.130/tcp/2345/http,或者直接用0.0.0.0

  1. 生成 auth token
./lotus-storage-miner auth create-token --perm admin
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.2mkieMGKBDkH6vZtanxKQ5W4B_b_Uz0Lz7IGxGBJ-Ts

cat ~/.lotusstorage/api
/ip4/192.168.13.130/tcp/2345/http
  1. 设置cli端环境变量STORAGE_API_INFO
export STORAGE_API_INFO=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBbGxvdyI6WyJyZWFkIiwid3JpdGUiLCJzaWduIiwiYWRtaW4iXX0.2mkieMGKBDkH6vZtanxKQ5W4B_b_Uz0Lz7IGxGBJ-Ts:/ip4/192.168.13.130/tcp/2345/http

然后使用lotus-storage-miner先关命令即可操作远程miner node,如./lotus-storage-miner stop