Skip to content

Commit

Permalink
Merge pull request #11592 from filecoin-project/snadrus/multiaddr
Browse files Browse the repository at this point in the history
feat: lp: support multiple SP IDs
  • Loading branch information
magik6k authored Feb 15, 2024
2 parents 080baf4 + 846daa1 commit acdc198
Show file tree
Hide file tree
Showing 25 changed files with 184 additions and 91 deletions.
3 changes: 1 addition & 2 deletions cmd/lotus-provider/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"path"
"strings"

"github.com/BurntSushi/toml"
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"

Expand Down Expand Up @@ -103,7 +102,7 @@ var configSetCmd = &cli.Command{
}

lp := config.DefaultLotusProvider() // ensure it's toml
_, err = toml.Decode(string(bytes), lp)
_, err = deps.LoadConfigWithUpgrades(string(bytes), lp)
if err != nil {
return fmt.Errorf("cannot decode file: %w", err)
}
Expand Down
34 changes: 23 additions & 11 deletions cmd/lotus-provider/deps/deps.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net"
"net/http"
"os"
"regexp"
"strings"

"github.com/BurntSushi/toml"
Expand All @@ -34,7 +35,7 @@ import (
"github.com/filecoin-project/lotus/node/modules/dtypes"
"github.com/filecoin-project/lotus/node/repo"
"github.com/filecoin-project/lotus/provider"
"github.com/filecoin-project/lotus/storage/ctladdr"
"github.com/filecoin-project/lotus/provider/multictladdr"
"github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer"
"github.com/filecoin-project/lotus/storage/sealer/ffiwrapper"
Expand Down Expand Up @@ -95,8 +96,8 @@ type Deps struct {
Full api.FullNode
Verif storiface.Verifier
LW *sealer.LocalWorker
As *ctladdr.AddressSelector
Maddrs []dtypes.MinerAddress
As *multictladdr.MultiAddressSelector
Maddrs map[dtypes.MinerAddress]bool
Stor *paths.Remote
Si *paths.DBIndex
LocalStore *paths.Local
Expand Down Expand Up @@ -151,7 +152,7 @@ func (deps *Deps) PopulateRemainingDeps(ctx context.Context, cctx *cli.Context,
}

if deps.As == nil {
deps.As, err = provider.AddressSelector(&deps.Cfg.Addresses)()
deps.As, err = provider.AddressSelector(deps.Cfg.Addresses)()
if err != nil {
return err
}
Expand Down Expand Up @@ -236,18 +237,28 @@ Get it with: jq .PrivateKey ~/.lotus-miner/keystore/MF2XI2BNNJ3XILLQOJUXMYLUMU`,
deps.LW = sealer.NewLocalWorker(sealer.WorkerConfig{}, deps.Stor, deps.LocalStore, deps.Si, nil, wstates)
}
if len(deps.Maddrs) == 0 {
for _, s := range deps.Cfg.Addresses.MinerAddresses {
addr, err := address.NewFromString(s)
if err != nil {
return err
for _, s := range deps.Cfg.Addresses {
for _, s := range s.MinerAddresses {
addr, err := address.NewFromString(s)
if err != nil {
return err
}
deps.Maddrs[dtypes.MinerAddress(addr)] = true
}
deps.Maddrs = append(deps.Maddrs, dtypes.MinerAddress(addr))
}
}
fmt.Println("last line of populate")
return nil
}

var oldAddresses = regexp.MustCompile("(?i)^[addresses]$")

func LoadConfigWithUpgrades(text string, lp *config.LotusProviderConfig) (toml.MetaData, error) {
// allow migration from old config format that was limited to 1 wallet setup.
newText := oldAddresses.ReplaceAllString(text, "[[addresses]]")
meta, err := toml.Decode(newText, &lp)
return meta, err
}
func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.LotusProviderConfig, error) {
lp := config.DefaultLotusProvider()
have := []string{}
Expand All @@ -265,9 +276,10 @@ func GetConfig(cctx *cli.Context, db *harmonydb.DB) (*config.LotusProviderConfig
}
return nil, fmt.Errorf("could not read layer '%s': %w", layer, err)
}
meta, err := toml.Decode(text, &lp)

meta, err := LoadConfigWithUpgrades(text, lp)
if err != nil {
return nil, fmt.Errorf("could not read layer, bad toml %s: %w", layer, err)
return lp, fmt.Errorf("could not read layer, bad toml %s: %w", layer, err)
}
for _, k := range meta.Keys() {
have = append(have, strings.Join(k, " "))
Expand Down
7 changes: 5 additions & 2 deletions cmd/lotus-provider/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"github.com/filecoin-project/go-address"

cliutil "github.com/filecoin-project/lotus/cli/util"
"github.com/filecoin-project/lotus/cmd/lotus-provider/deps"
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
"github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/node/modules"
Expand Down Expand Up @@ -124,7 +125,7 @@ func fromMiner(cctx *cli.Context) (err error) {
return fmt.Errorf("could not read config.toml: %w", err)
}
var lpCfg config.LotusProviderConfig
_, err = toml.Decode(string(buf), &lpCfg)
_, err = deps.LoadConfigWithUpgrades(string(buf), &lpCfg)
if err != nil {
return fmt.Errorf("could not decode toml: %w", err)
}
Expand All @@ -148,7 +149,9 @@ func fromMiner(cctx *cli.Context) (err error) {
return xerrors.Errorf("parsing miner actor address: %w", err)
}

lpCfg.Addresses.MinerAddresses = []string{addr.String()}
lpCfg.Addresses = []config.LotusProviderAddresses{{
MinerAddresses: []string{addr.String()},
}}

ks, err := lr.KeyStore()
if err != nil {
Expand Down
5 changes: 3 additions & 2 deletions cmd/lotus-provider/proving.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ var wdPostTaskCmd = &cli.Command{
}
ht := ts.Height()

addr, err := address.NewFromString(deps.Cfg.Addresses.MinerAddresses[0])
// It's not important to be super-accurate as it's only for basic testing.
addr, err := address.NewFromString(deps.Cfg.Addresses[0].MinerAddresses[0])
if err != nil {
return xerrors.Errorf("cannot get miner address %w", err)
}
Expand Down Expand Up @@ -188,7 +189,7 @@ It will not send any messages to the chain. Since it can compute any deadline, o

di := dline.NewInfo(head.Height(), cctx.Uint64("deadline"), 0, 0, 0, 10 /*challenge window*/, 0, 0)

for _, maddr := range deps.Maddrs {
for maddr := range deps.Maddrs {
out, err := wdPostTask.DoPartition(ctx, head, address.Address(maddr), di, cctx.Uint64("partition"))
if err != nil {
fmt.Println("Error computing WindowPoSt for miner", maddr, err)
Expand Down
19 changes: 1 addition & 18 deletions documentation/en/default-lotus-provider-config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,32 +56,15 @@
#PerSector = "0.03 FIL"


[Addresses]
# Addresses to send PreCommit messages from
#
# type: []string
[[Addresses]]
#PreCommitControl = []

# Addresses to send Commit messages from
#
# type: []string
#CommitControl = []

# type: []string
#TerminateControl = []

# DisableOwnerFallback disables usage of the owner address for messages
# sent automatically
#
# type: bool
#DisableOwnerFallback = false

# DisableWorkerFallback disables usage of the worker address for messages
# sent automatically, if control addresses are configured.
# A control address that doesn't have enough funds will still be chosen
# over the worker address if this flag is set.
#
# type: bool
#DisableWorkerFallback = false


Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
4 changes: 2 additions & 2 deletions node/config/def.go
Original file line number Diff line number Diff line change
Expand Up @@ -349,11 +349,11 @@ func DefaultLotusProvider() *LotusProviderConfig {
MaxWindowPoStGasFee: types.MustParseFIL("5"),
MaxPublishDealsFee: types.MustParseFIL("0.05"),
},
Addresses: LotusProviderAddresses{
Addresses: []LotusProviderAddresses{{
PreCommitControl: []string{},
CommitControl: []string{},
TerminateControl: []string{},
},
}},
Proving: ProvingConfig{
ParallelCheckLimit: 32,
PartitionCheckTimeout: Duration(20 * time.Minute),
Expand Down
4 changes: 2 additions & 2 deletions node/config/doc_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions node/config/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,10 @@ type StorageMiner struct {
type LotusProviderConfig struct {
Subsystems ProviderSubsystemsConfig

Fees LotusProviderFees
Addresses LotusProviderAddresses
Fees LotusProviderFees

// Addresses of wallets per MinerAddress (one of the fields).
Addresses []LotusProviderAddresses
Proving ProvingConfig
Journal JournalConfig
Apis ApisConfig
Expand Down
67 changes: 40 additions & 27 deletions provider/address.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,47 +5,60 @@ import (

"github.com/filecoin-project/go-address"

"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/node/config"
"github.com/filecoin-project/lotus/storage/ctladdr"
"github.com/filecoin-project/lotus/provider/multictladdr"
)

func AddressSelector(addrConf *config.LotusProviderAddresses) func() (*ctladdr.AddressSelector, error) {
return func() (*ctladdr.AddressSelector, error) {
as := &ctladdr.AddressSelector{}
func AddressSelector(addrConf []config.LotusProviderAddresses) func() (*multictladdr.MultiAddressSelector, error) {
return func() (*multictladdr.MultiAddressSelector, error) {
as := &multictladdr.MultiAddressSelector{
MinerMap: make(map[address.Address]api.AddressConfig),
}
if addrConf == nil {
return as, nil
}

as.DisableOwnerFallback = addrConf.DisableOwnerFallback
as.DisableWorkerFallback = addrConf.DisableWorkerFallback
for _, addrConf := range addrConf {
for _, minerID := range addrConf.MinerAddresses {
tmp := api.AddressConfig{
DisableOwnerFallback: addrConf.DisableOwnerFallback,
DisableWorkerFallback: addrConf.DisableWorkerFallback,
}

for _, s := range addrConf.PreCommitControl {
addr, err := address.NewFromString(s)
if err != nil {
return nil, xerrors.Errorf("parsing precommit control address: %w", err)
}
for _, s := range addrConf.PreCommitControl {
addr, err := address.NewFromString(s)
if err != nil {
return nil, xerrors.Errorf("parsing precommit control address: %w", err)
}

as.PreCommitControl = append(as.PreCommitControl, addr)
}
tmp.PreCommitControl = append(tmp.PreCommitControl, addr)
}

for _, s := range addrConf.CommitControl {
addr, err := address.NewFromString(s)
if err != nil {
return nil, xerrors.Errorf("parsing commit control address: %w", err)
}
for _, s := range addrConf.CommitControl {
addr, err := address.NewFromString(s)
if err != nil {
return nil, xerrors.Errorf("parsing commit control address: %w", err)
}

as.CommitControl = append(as.CommitControl, addr)
}
tmp.CommitControl = append(tmp.CommitControl, addr)
}

for _, s := range addrConf.TerminateControl {
addr, err := address.NewFromString(s)
if err != nil {
return nil, xerrors.Errorf("parsing terminate control address: %w", err)
}
for _, s := range addrConf.TerminateControl {
addr, err := address.NewFromString(s)
if err != nil {
return nil, xerrors.Errorf("parsing terminate control address: %w", err)
}

as.TerminateControl = append(as.TerminateControl, addr)
tmp.TerminateControl = append(tmp.TerminateControl, addr)
}
a, err := address.NewFromString(minerID)
if err != nil {
return nil, xerrors.Errorf("parsing miner address %s: %w", minerID, err)
}
as.MinerMap[a] = tmp
}
}

return as, nil
}
}
4 changes: 2 additions & 2 deletions provider/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/filecoin-project/lotus/provider/chainsched"
"github.com/filecoin-project/lotus/provider/lpmessage"
"github.com/filecoin-project/lotus/provider/lpwindow"
"github.com/filecoin-project/lotus/storage/ctladdr"
"github.com/filecoin-project/lotus/provider/multictladdr"
"github.com/filecoin-project/lotus/storage/paths"
"github.com/filecoin-project/lotus/storage/sealer"
"github.com/filecoin-project/lotus/storage/sealer/storiface"
Expand All @@ -21,7 +21,7 @@ import (

func WindowPostScheduler(ctx context.Context, fc config.LotusProviderFees, pc config.ProvingConfig,
api api.FullNode, verif storiface.Verifier, lw *sealer.LocalWorker, sender *lpmessage.Sender,
as *ctladdr.AddressSelector, addresses []dtypes.MinerAddress, db *harmonydb.DB,
as *multictladdr.MultiAddressSelector, addresses map[dtypes.MinerAddress]bool, db *harmonydb.DB,
stor paths.Store, idx paths.SectorIndex, max int) (*lpwindow.WdPostTask, *lpwindow.WdPostSubmitTask, *lpwindow.WdPostRecoverDeclareTask, error) {

chainSched := chainsched.New(api)
Expand Down
7 changes: 3 additions & 4 deletions provider/lpwindow/compute_task.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ type WdPostTask struct {

windowPoStTF promise.Promise[harmonytask.AddTaskFunc]

actors []dtypes.MinerAddress
actors map[dtypes.MinerAddress]bool
max int
}

Expand All @@ -86,9 +86,8 @@ func NewWdPostTask(db *harmonydb.DB,
faultTracker sealer.FaultTracker,
prover ProverPoSt,
verifier storiface.Verifier,

pcs *chainsched.ProviderChainSched,
actors []dtypes.MinerAddress,
actors map[dtypes.MinerAddress]bool,
max int,
) (*WdPostTask, error) {
t := &WdPostTask{
Expand Down Expand Up @@ -356,7 +355,7 @@ func (t *WdPostTask) Adder(taskFunc harmonytask.AddTaskFunc) {
}

func (t *WdPostTask) processHeadChange(ctx context.Context, revert, apply *types.TipSet) error {
for _, act := range t.actors {
for act := range t.actors {
maddr := address.Address(act)

aid, err := address.IDFromAddress(maddr)
Expand Down
2 changes: 1 addition & 1 deletion provider/lpwindow/faults_simple.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func (m *SimpleFaultTracker) CheckProvable(ctx context.Context, pp abi.Registere

if !locked {
log.Warnw("CheckProvable Sector FAULT: can't acquire read lock", "sector", sector)
addBad(sector.ID, fmt.Sprint("can't acquire read lock"))
addBad(sector.ID, "can't acquire read lock")
return
}

Expand Down
Loading

0 comments on commit acdc198

Please sign in to comment.