# Pre-requisites
Before diving into deployment of your mining operation, please make sure you go through the following steps.
WARNING
It is recommended that you test your setup in calibration
network before deploying on mainnet
.
# Setup your permanent storage
Choose a network file system that you are familiar with (NFS
for example) and deploy your storage cluster.
# Get your account setup in Sophon service
There are two ways to have your account setup.
# For miners connecting to Sophon service
If you are trying to connect to a hosted Sophon service, contact admin of said service and have them set it up for you.
TIP
venus-wallet can be deployed as either a Sophon service or a local component depend on your security requirement.
# For admins of Sophon service
If you are an admin hosting Sophon service, use the following command to create an account for your sealer clusters.
# create user, default state=1
$ ./sophon-auth user add <ACCOUNT_NAME>
# bind miner to user
$ ./sophon-auth user miner add <ACCOUNT_NAME> <MINER_ID>
# The returned token is what miner have to add into their config file in order to gain access to your shared modules
$ ./sophon-auth token gen --perm write <ACCOUNT_NAME>
<AUTH_TOKEN_FOR_ACCOUNT_NAME>
Update user information if necessary.
./sophon-auth user update --user=<ACCOUNT_NAME> --help
# Software dependencies
You will need to install these software dependencies (opens new window) (same as Lotus) before running venus.
# Install venus-wallet
Download and compile the source code of venus-wallet.
$ git clone https://github.com/filecoin-project/venus-wallet.git
# change directory to venus-wallet
$ cd venus-wallet
$ git checkout <RELEASE_TAG>
$ make
Run venus-wallet module in background.
$ nohup ./venus-wallet run > wallet.log 2>&1 &
TIP
Use tail -f wallet.log
to monitor wallet log.
Setup a password for your venus-wallet.
$ ./venus-wallet setpwd
Password:******
Enter Password again:******
Password set successfully
WARNING
Please keep backups of your password and store them properly or you will lose contorl of your wallet.
WARNING
When restarting your wallet, manuually unlock your wallet or you wallet won't be able to sign any messages during sealing or other tasks.
$ ./venus-wallet unlock
Password:
Use --password
for auto unlocking after running.
$ ./venus-wallet run --password
Check current state your wallet.
$ ./venus-wallet lock-state
wallet state: unlocked
Generate owner and worker addresses. (If you don't have an existing miner id)
$ ./venus-wallet new bls
<OWNER_ADDRESS>
$ ./venus-wallet new bls
<WORKER_ADDRESS>
TIP
If you are testing on Calibration
, you have to fund all your addresses with test coins from faucets. For calibration, use this faucet (opens new window).
TIP
Use ./venus-wallet import
command for importing addresses from private keys.
Change [APIRegisterHub]
section of ~/.venus_wallet/config.toml
using the credential you get from Sophon service admin.
[APIRegisterHub]
RegisterAPI = ["/ip4/<IP_ADDRESS_OF_VENUS_GATEWAY>/tcp/45132"]
Token = "<AUTH_TOKEN_FOR_VENUS_WALLET>"
SupportAccounts = ["<ACCOUNT_NAME>"]
WARNING
Make sure above 3 params are correctly set, or connection to Sophon service will fail.
Restart venus-wallet so that the changes takes into effect.
# grep [PID] of venus-wallet process
$ ps -ef | grep wallet
root 6704 2.3 0.0 2361236 43148 pts/2 Sl 17:33 0:18 ./venus-wallet run
root 8029 0.0 0.0 112828 952 pts/2 S+ 17:46 0:00 grep --color=auto venus-wallet
# kill the process and restart
$ kill -9 [PID]
$ nohup ./venus-wallet run > wallet.log 2>&1 &
You should see logs close to the following indicating successful connection to sophon-gateway
.
2021-07-12T15:14:12.457+0800 INFO wallet_event wallet_event/listenevent.go:197 connect to server fcf714b2-eeb6-498b-aafc-5e58eccd9d0f {"api hub": "/ip4/<IP_ADDRESS>/tcp/45132"}
TIP
Using process controll like systemmd
or supervisord
is recommended.
WARNING
Pls keep the wallet unlock state. If the state is locked , it will block sealer "Waiting for confirmation".
# Install damocles
Download source code.
$ git clone https://github.com/ipfs-force-community/damocles.git
Compile damocles
.
$ cd damocles
$ git checkout <LATEST_RELEASE>
$ make all
TIP
After compilation, two executable, damocles-worker
and damocles-manager
, will be generated under ./dist/bin
.
# damocles-manager
Initialize work space.
./dist/bin/damocles-manager daemon init
# Create a miner-id (optional)
Skip this step if you already have a miner-id.
$ ./damocles-manager util miner create
--from=<OWNER_ADDRESS>
--owner=<OWNER_ADDRESS>
--worker=<WORKER_ADDRESS>
--sector-size=32GiB
TIP
Use --net
param for different network options. Default is mainnet.
TIP
You will see logs similar to the following once successfully created new miner-id.
2022-05-09T07:29:51.325Z INFO cmd internal/util_miner.go:242 miner actor: t01219 (t2z4nnndtt2iuu57lq3ivor7xdvqwivwb5renrh3a)
{"size": "512MiB", "from": "t3wultr2i47m24ew2p3bskclnb4rtgmuwb6cwjleqbeu4ndqocx67635dibpsq3ugpbv5y7fpjlpxlmkqcgnva",
"actor": "t01166", "owner": "t3wultr2i47m24ew2p3bskclnb4rtgmuwb6cwjleqbeu4ndqocx67635dibpsq3ugpbv5y7fpjlpxlmkqcgnva",
"worker": "t3wultr2i47m24ew2p3bskclnb4rtgmuwb6cwjleqbeu4ndqocx67635dibpsq3ugpbv5y7fpjlpxlmkqcgnva"}
# damocles-manager configurations
Tailor ~/.damocles-manager/sector-manager.cfg
to your own hardware. Detailed instructions on each configurations could be found here (opens new window).
[Common]
[Common.API]
# Gateway service infos, required, string type
# Fill in according to the actual situation of the service used
# If a token is supplied in the format of "{token}:{multiaddr}", then the token supplied would be used to construct the RPC client instead of the common token generated by sophon-auth from Token configuration item.
Gateway = ["/ip4/{api_host}/tcp/{api_port}"]
# common token for services, required, string type
# Fill in according to the actual situation of the service used
Token = "{some token}"
# Chain service info, optional, string type
# Fill in according to the actual situation of the service used
# If a token is supplied in the format of "{token}:{multiaddr}", then the token supplied would be used to construct the RPC client instead of the common token generated by sophon-auth from Token configuration item.
# If not set, use value of Gateway as default
Chain = "/ip4/{api_host}/tcp/{api_port}"
# Message service info, optional, string type
# Fill in according to the actual situation of the service used
# If a token is supplied in the format of "{token}:{multiaddr}", then the token supplied would be used to construct the RPC client instead of the common token generated by sophon-auth from Token configuration item.
# If not set, use value of Gateway as default
Messager = "/ip4/{api_host}/tcp/{api_port}"
# Market service info, optional, string type
# Fill in according to the actual situation of the service used
# If a token is supplied in the format of "{token}:{multiaddr}", then the token supplied would be used to construct the RPC client instead of the common token generated by sophon-auth from Token configuration item.
# If not set, use value of Gateway as default
Market = "/ip4/{api_host}/tcp/{api_port}"
[[Common.PieceStores]]
# *mandatory*
#Path = "{store_path}"
[[Common.PersistStores]]
# optional
Name = "{store_name1}"
# *mandatory* use of absolute path is recommended
Path = "{store_path1}"
[[Common.PersistStores]]
Name = "{store_name2}"
Path = "{store_path2}"
[[Miners]]
# *mandatory* `SP` actor id (Remove the "t0" or "f0" at the beginning)
Actor = 33680
[Miners.Sector]
# oprional, pledge new sector from InitNumber
InitNumber = 0
# oprional, stop pledging new sector at MaxNumber
MaxNumber = 1000000
# Enable sealing
Enabled = true
# Enable storage deals
EnableDeals = true
[Miners.Commitment.Pre]
# address for sending out pre messages
Sender = "t3vi4amwofexsfpontn5g722psgikzochthhhu3ptvofzrqmgajs67gt5n2ririlc4hj667dvfsn3kmxiwgtya"
#GasOverEstimation = 1.2
# FeeCap limit for single pre message
#MaxFeeCap = "5 nanoFIL"
[Miners.Commitment.Pre.Batch]
# if bacth pre is enabled?
Enabled = true
# Minimum number of messages for one batch
#Threshold = 16
# Max wait time before batch pre
#MaxWait = "1h0m0s"
# How often it checks the threshold is met
#CheckInterval = "1m0s"
#GasOverEstimation = 1.2
#MaxFeeCap = "5 nanoFIL"
# Same set of config for ProveCommit as for pre above
[Miners.Commitment.Prove]
Sender = "t3vi4amwofexsfpontn5g722psgikzochthhhu3ptvofzrqmgajs67gt5n2ririlc4hj667dvfsn3kmxiwgtya"
#GasOverEstimation = 1.2
#MaxFeeCap = "5 nanoFIL"
[Miners.Commitment.Prove.Batch]
Enabled = true
#Threshold = 16
#MaxWait = "1h0m0s"
#CheckInterval = "1m0s"
#GasOverEstimation = 1.2
#MaxFeeCap = "5 nanoFIL"
[Miners.PoSt]
# address for sending out Post messages
Sender = "t3vi4amwofexsfpontn5g722psgikzochthhhu3ptvofzrqmgajs67gt5n2ririlc4hj667dvfsn3kmxiwgtya"
Enabled = true
#StrictCheck = true
#GasOverEstimation = 1.2
# FeeCap limit for single post message
#MaxFeeCap = "5 nanoFIL"
#Confidence = 10
[Miners.Proof]
Enabled = true
[Miners.Deal]
Enabled = true
Start damocles-manager
.
$ ./dist/bin/damocles-manager --net=cali daemon run --poster --miner --listen 0.0.0.0:1789
TIP
Again, use --net
param for different network options. Default is mainnet.
# damocles-worker
Plan your sealing storage and init directories.
$ ./dist/bin/damocles-worker store sealing-init -l <dir1> <dir2> <dir3> <...>
Attach permanent storage and init directories.
$ ./dist/bin/damocles-worker store file-init -l <dir1>
Plan CPU cores, numa, etc for eahc sealing tasks and tailor your configuration file to it. The following is an example configuration for damocles-worker
. More detailed instructions on each configurations could be found here (opens new window)
[worker]
# optional, instance name of damocles-manager
# name = "bytest"
# rpc_server.host = "0.0.0.0"
# rpc_server.port = 17890
[sector_manager]
rpc_client.addr = "/ip4/{some_ip}/tcp/1789"
# rpc_client.headers = { User-Agent = "jsonrpc-core-client" }
# piece_token = "{auth token}"
[sealing]
# miner IDs that this damocles-worker can serve; Ex: [22908, 11034, 191107]
allowed_miners = [33680]
allowed_sizes = ["32GiB","64GiB"]
# When set to ture, you will need to configure `piece_token` in `sector_manager`
# enable_deals = true
# Max number of retries when errors of temp type encountred during sealing
# max_retries = 3
# Time intervals between retires when errors of temp type encountred during sealing
# seal_interval = "30s"
# Time interval between idle `sealing_store`s to start pledging
# recover_interval = "30s"
# Used to reduce network congestion during sealing for rpc polling non-time sensitive informations
# rpc_polling_interval = "30s"
# wether to skip local proof check
# ignore_proof_check = false
# Plan out your sealing pipeline based on your hardware specs
[[sealing_thread]]
# Number of sealing_thread corresponds to number of working directories you configured for sealing storage; Absolute path is preferred
location = "{path to sealing store1}"
# Each sealing thread then can be further customized
# sealing.allowed_miners = [10123, 10124, 10125]
# sealing.allowed_sizes = ["32GiB", "64GiB"]
# sealing.enable_deals = true
# sealing.max_retries = 3
# sealing.seal_interval = "30s"
# sealing.recover_interval = "30s"
# sealing.rpc_polling_interval = "30s"
# sealing.ignore_proof_check = false
[[sealing_thread]]
location = "{path to sealing store2}"
[[sealing_thread]]
location = "{path to sealing store3}"
[[sealing_thread]]
location = "{path to sealing store4}"
[[sealing_thread]]
location = "{path to sealing store5}"
[[sealing_thread]]
location = "{path to sealing store6}"
[[sealing_thread]]
location = "{path to sealing store7}"
[[sealing_thread]]
location = "{path to sealing store8}"
# You can have multiple [[attached]] path for permanent storage of sealed sectors
[[attached]]
# optional
name = "bytest"
# Absolute path is preferred
location = "/xx/xx/xxx"
#readonly = false
[processors.static_tree_d]
32GiB = "{path to static tree_d for 32GiB}"
64GiB = "{path to static tree_d for 64GiB}"
[processors.limit]
# Number of concurrent pc1
pc1 = 4
# Number of concurrent pc2
pc2 = 2
# Number of concurrent c2
c2 = 1
# fields for pc1 processors
[[processors.pc1]]
# optional
numa_preferred = 0
# follows cgroup.cpuset format
cgroup.cpuset = "0-7"
# max concurrency
concurrent = 2
# Any external environment variable when executing this particular pc1 task
envs = { FIL_PROOFS_USE_MULTICORE_SDR = "1" }
[[processors.pc1]]
numa_preferred = 1
cgroup.cpuset = "12-19"
concurrent = 2
envs = { FIL_PROOFS_USE_MULTICORE_SDR = "1" }
[[processors.pc2]]
cgroup.cpuset = "8-11,24-27"
envs = { FIL_PROOFS_USE_GPU_COLUMN_BUILDER = "1", FIL_PROOFS_USE_GPU_TREE_BUILDER = "1", CUDA_VISIBLE_DEVICES = "0" }
[[processors.pc2]]
cgroup.cpuset = "20-23,36-39"
envs = { FIL_PROOFS_USE_GPU_COLUMN_BUILDER = "1", FIL_PROOFS_USE_GPU_TREE_BUILDER = "1", CUDA_VISIBLE_DEVICES = "1" }
[[processors.c2]]
cgroup.cpuset = "28-35"
envs = { CUDA_VISIBLE_DEVICES = "2,3" }
[[processors.tree_d]]
cgroup.cpuset = "40-45"
TIP
You can also reference the configurations in damocles
community test (opens new window).
Start damocles-worker
.
$ /path/to/damocles-worker daemon -c /path/to/damocles-worker.toml
TIP
The above sector-manager.cfg
and damocles-worker.toml
are just minimal to get you to start pledging sectors. More detailed information on configurations could be found here.
TIP
Note that name = "xxx"
under [[attached]]
in damocles-worker.toml
must be the same Name = "xxx"
under [[Common.PersistStores]]
in sector-manager.cfg
.
# Questions?
Find us on Slack (opens new window)!