From 1449644c343340a60d80688931cd709d85220686 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 4 Nov 2021 15:59:29 +0000 Subject: [PATCH 001/157] Integrate v7 actors --- build/openrpc/full.json.gz | Bin 25453 -> 25453 bytes build/params_2k.go | 2 + build/params_butterfly.go | 1 + build/params_calibnet.go | 2 + build/params_interop.go | 1 + build/params_mainnet.go | 10 +- build/params_shared_vals.go | 2 +- build/params_testground.go | 1 + chain/actors/builtin/account/account.go | 15 + chain/actors/builtin/account/v7.go | 40 ++ chain/actors/builtin/builtin.go | 60 +- chain/actors/builtin/cron/cron.go | 12 +- chain/actors/builtin/cron/v7.go | 35 ++ chain/actors/builtin/init/init.go | 19 +- chain/actors/builtin/init/v7.go | 114 ++++ chain/actors/builtin/market/market.go | 22 +- chain/actors/builtin/market/v7.go | 252 ++++++++ chain/actors/builtin/miner/miner.go | 17 +- chain/actors/builtin/miner/v7.go | 570 ++++++++++++++++++ chain/actors/builtin/multisig/message7.go | 71 +++ chain/actors/builtin/multisig/multisig.go | 32 +- chain/actors/builtin/multisig/v7.go | 119 ++++ chain/actors/builtin/paych/message7.go | 74 +++ chain/actors/builtin/paych/paych.go | 20 +- chain/actors/builtin/paych/v7.go | 114 ++++ chain/actors/builtin/power/power.go | 19 +- chain/actors/builtin/power/v7.go | 187 ++++++ chain/actors/builtin/reward/reward.go | 19 +- chain/actors/builtin/reward/v7.go | 98 +++ chain/actors/builtin/system/system.go | 10 +- chain/actors/builtin/system/v7.go | 35 ++ chain/actors/builtin/verifreg/v7.go | 75 +++ chain/actors/builtin/verifreg/verifreg.go | 19 +- chain/actors/policy/policy.go | 84 ++- chain/actors/version.go | 7 +- chain/consensus/filcns/compute_state.go | 2 + chain/consensus/filcns/upgrades.go | 108 +++- chain/gen/gen.go | 6 + chain/gen/genesis/miners.go | 7 +- chain/state/statetree.go | 2 +- chain/vm/gas.go | 31 +- chain/vm/gas_v0.go | 15 +- chain/vm/invoker.go | 2 +- chain/vm/mkactor.go | 3 + chain/vm/runtime.go | 8 +- chain/vm/syscalls.go | 40 +- cmd/lotus-bench/caching_verifier.go | 9 +- cmd/lotus-sim/simulation/mock/mock.go | 8 + documentation/en/api-v0-methods.md | 2 +- documentation/en/api-v1-unstable-methods.md | 2 +- extern/sector-storage/ffiwrapper/types.go | 3 + .../sector-storage/ffiwrapper/verifier_cgo.go | 7 + extern/sector-storage/mock/mock.go | 7 + gen/inlinegen-data.json | 8 +- go.mod | 1 + go.sum | 5 + itests/kit/ensemble_opts_nv.go | 6 +- lotuspond/front/src/chain/methods.json | 107 ++++ storage/wdpost_run_test.go | 18 +- testplans/lotus-soup/go.mod | 20 +- testplans/lotus-soup/go.sum | 131 ++++ 61 files changed, 2595 insertions(+), 121 deletions(-) create mode 100644 chain/actors/builtin/account/v7.go create mode 100644 chain/actors/builtin/cron/v7.go create mode 100644 chain/actors/builtin/init/v7.go create mode 100644 chain/actors/builtin/market/v7.go create mode 100644 chain/actors/builtin/miner/v7.go create mode 100644 chain/actors/builtin/multisig/message7.go create mode 100644 chain/actors/builtin/multisig/v7.go create mode 100644 chain/actors/builtin/paych/message7.go create mode 100644 chain/actors/builtin/paych/v7.go create mode 100644 chain/actors/builtin/power/v7.go create mode 100644 chain/actors/builtin/reward/v7.go create mode 100644 chain/actors/builtin/system/v7.go create mode 100644 chain/actors/builtin/verifreg/v7.go diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1578d746536613ea03a22c6165e5561d65e3df7a..8f71ee8a973b9f29d91d16893c3cbe8bf3db8356 100644 GIT binary patch delta 5087 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 B;#2?t delta 5127 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 diff --git a/build/params_2k.go b/build/params_2k.go index b9db0a467..84023c38c 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -47,6 +47,8 @@ var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) +var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) + var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, } diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 9a0018e73..e26fd78fa 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -41,6 +41,7 @@ const UpgradeNorwegianHeight = -14 const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 const UpgradeChocolateHeight = 6360 +const UpgradeSnapDealsHeight = 99999999 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 8cd99d642..16d77c7e6 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -54,6 +54,8 @@ const UpgradeHyperdriveHeight = 420 const UpgradeChocolateHeight = 312746 +const UpgradeSnapDealsHeight = 99999999 + func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(32 << 30)) policy.SetSupportedProofTypes( diff --git a/build/params_interop.go b/build/params_interop.go index de5ee9a12..66033937c 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -47,6 +47,7 @@ var UpgradeTurboHeight = abi.ChainEpoch(-15) var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) +var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/build/params_mainnet.go b/build/params_mainnet.go index 0c8c53ba8..a4781f1ff 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -62,18 +62,20 @@ const UpgradeNorwegianHeight = 665280 const UpgradeTurboHeight = 712320 // 2021-06-30T22:00:00Z -var UpgradeHyperdriveHeight = abi.ChainEpoch(892800) +const UpgradeHyperdriveHeight = 892800 // 2021-10-26T13:30:00Z -var UpgradeChocolateHeight = abi.ChainEpoch(1231620) +const UpgradeChocolateHeight = 1231620 + +var UpgradeSnapDealsHeight = abi.ChainEpoch(999999999999) func init() { if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" { SetAddressNetwork(address.Mainnet) } - if os.Getenv("LOTUS_DISABLE_CHOCOLATE") == "1" { - UpgradeChocolateHeight = math.MaxInt64 + if os.Getenv("LOTUS_DISABLE_SNAPDEALS") == "1" { + UpgradeSnapDealsHeight = math.MaxInt64 } Devnet = false diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 0a242f6f2..704c84639 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -34,7 +34,7 @@ const NewestNetworkVersion = network.Version{{.latestNetworkVersion}} /* inline-gen start */ -const NewestNetworkVersion = network.Version14 +const NewestNetworkVersion = network.Version15 /* inline-gen end */ diff --git a/build/params_testground.go b/build/params_testground.go index 48b76f82c..539e06b45 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -99,6 +99,7 @@ var ( UpgradeTurboHeight abi.ChainEpoch = -14 UpgradeHyperdriveHeight abi.ChainEpoch = -15 UpgradeChocolateHeight abi.ChainEpoch = -16 + UpgradeSnapDealsHeight abi.ChainEpoch = -17 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/chain/actors/builtin/account/account.go b/chain/actors/builtin/account/account.go index 249ce133f..57ea510bb 100644 --- a/chain/actors/builtin/account/account.go +++ b/chain/actors/builtin/account/account.go @@ -23,6 +23,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -50,6 +52,10 @@ func init() { builtin.RegisterActorState(builtin6.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.AccountActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var Methods = builtin4.MethodsAccount @@ -75,6 +81,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.AccountActorCodeID: return load6(store, act.Head) + case builtin7.AccountActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -100,6 +109,9 @@ func MakeState(store adt.Store, av actors.Version, addr address.Address) (State, case actors.Version6: return make6(store, addr) + case actors.Version7: + return make7(store, addr) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -125,6 +137,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.AccountActorCodeID, nil + case actors.Version7: + return builtin7.AccountActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/account/v7.go b/chain/actors/builtin/account/v7.go new file mode 100644 index 000000000..883776cf8 --- /dev/null +++ b/chain/actors/builtin/account/v7.go @@ -0,0 +1,40 @@ +package account + +import ( + "github.com/filecoin-project/go-address" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + account7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/account" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, addr address.Address) (State, error) { + out := state7{store: store} + out.State = account7.State{Address: addr} + return &out, nil +} + +type state7 struct { + account7.State + store adt.Store +} + +func (s *state7) PubkeyAddress() (address.Address, error) { + return s.Address, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index ebfe2df2e..d93732999 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -23,46 +23,49 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" smoothing6 "github.com/filecoin-project/specs-actors/v6/actors/util/smoothing" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/types" - miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" - proof6 "github.com/filecoin-project/specs-actors/v6/actors/runtime/proof" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) -var SystemActorAddr = builtin6.SystemActorAddr -var BurntFundsActorAddr = builtin6.BurntFundsActorAddr -var CronActorAddr = builtin6.CronActorAddr +var SystemActorAddr = builtin7.SystemActorAddr +var BurntFundsActorAddr = builtin7.BurntFundsActorAddr +var CronActorAddr = builtin7.CronActorAddr var SaftAddress = makeAddress("t0122") var ReserveAddress = makeAddress("t090") var RootVerifierAddress = makeAddress("t080") var ( - ExpectedLeadersPerEpoch = builtin6.ExpectedLeadersPerEpoch + ExpectedLeadersPerEpoch = builtin7.ExpectedLeadersPerEpoch ) const ( - EpochDurationSeconds = builtin6.EpochDurationSeconds - EpochsInDay = builtin6.EpochsInDay - SecondsInDay = builtin6.SecondsInDay + EpochDurationSeconds = builtin7.EpochDurationSeconds + EpochsInDay = builtin7.EpochsInDay + SecondsInDay = builtin7.SecondsInDay ) const ( - MethodSend = builtin6.MethodSend - MethodConstructor = builtin6.MethodConstructor + MethodSend = builtin7.MethodSend + MethodConstructor = builtin7.MethodConstructor ) // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. -type SectorInfo = proof6.SectorInfo -type PoStProof = proof6.PoStProof +type SectorInfo = proof7.SectorInfo +type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower { - return miner6.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) + return miner7.QAPowerForWeight(size, duration, dealWeight, verifiedWeight) } func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { @@ -101,6 +104,12 @@ func FromV6FilterEstimate(v6 smoothing6.FilterEstimate) FilterEstimate { } +func FromV7FilterEstimate(v7 smoothing7.FilterEstimate) FilterEstimate { + + return (FilterEstimate)(v7) + +} + type ActorStateLoader func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) var ActorStateLoaders = make(map[cid.Cid]ActorStateLoader) @@ -138,6 +147,9 @@ func ActorNameByCode(c cid.Cid) string { case builtin6.IsBuiltinActor(c): return builtin6.ActorNameByCode(c) + case builtin7.IsBuiltinActor(c): + return builtin7.ActorNameByCode(c) + default: return "" } @@ -169,6 +181,10 @@ func IsBuiltinActor(c cid.Cid) bool { return true } + if builtin7.IsBuiltinActor(c) { + return true + } + return false } @@ -198,6 +214,10 @@ func IsAccountActor(c cid.Cid) bool { return true } + if c == builtin7.AccountActorCodeID { + return true + } + return false } @@ -227,6 +247,10 @@ func IsStorageMinerActor(c cid.Cid) bool { return true } + if c == builtin7.StorageMinerActorCodeID { + return true + } + return false } @@ -256,6 +280,10 @@ func IsMultisigActor(c cid.Cid) bool { return true } + if c == builtin7.MultisigActorCodeID { + return true + } + return false } @@ -285,6 +313,10 @@ func IsPaymentChannelActor(c cid.Cid) bool { return true } + if c == builtin7.PaymentChannelActorCodeID { + return true + } + return false } diff --git a/chain/actors/builtin/cron/cron.go b/chain/actors/builtin/cron/cron.go index 9178a44ab..f27a14ac7 100644 --- a/chain/actors/builtin/cron/cron.go +++ b/chain/actors/builtin/cron/cron.go @@ -17,6 +17,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -40,6 +42,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -65,14 +70,17 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.CronActorCodeID, nil + case actors.Version7: + return builtin7.CronActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } var ( - Address = builtin6.CronActorAddr - Methods = builtin6.MethodsCron + Address = builtin7.CronActorAddr + Methods = builtin7.MethodsCron ) type State interface { diff --git a/chain/actors/builtin/cron/v7.go b/chain/actors/builtin/cron/v7.go new file mode 100644 index 000000000..e5538c89f --- /dev/null +++ b/chain/actors/builtin/cron/v7.go @@ -0,0 +1,35 @@ +package cron + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + cron7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/cron" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = *cron7.ConstructState(cron7.BuiltInEntries()) + return &out, nil +} + +type state7 struct { + cron7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/init/init.go b/chain/actors/builtin/init/init.go index ee06eeab7..737241ffe 100644 --- a/chain/actors/builtin/init/init.go +++ b/chain/actors/builtin/init/init.go @@ -25,6 +25,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -52,11 +54,15 @@ func init() { builtin.RegisterActorState(builtin6.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.InitActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.InitActorAddr - Methods = builtin6.MethodsInit + Address = builtin7.InitActorAddr + Methods = builtin7.MethodsInit ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -80,6 +86,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.InitActorCodeID: return load6(store, act.Head) + case builtin7.InitActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -105,6 +114,9 @@ func MakeState(store adt.Store, av actors.Version, networkName string) (State, e case actors.Version6: return make6(store, networkName) + case actors.Version7: + return make7(store, networkName) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -130,6 +142,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.InitActorCodeID, nil + case actors.Version7: + return builtin7.InitActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/init/v7.go b/chain/actors/builtin/init/v7.go new file mode 100644 index 000000000..341aa52cd --- /dev/null +++ b/chain/actors/builtin/init/v7.go @@ -0,0 +1,114 @@ +package init + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/node/modules/dtypes" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, networkName string) (State, error) { + out := state7{store: store} + + s, err := init7.ConstructState(store, networkName) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + init7.State + store adt.Store +} + +func (s *state7) ResolveAddress(address address.Address) (address.Address, bool, error) { + return s.State.ResolveAddress(s.store, address) +} + +func (s *state7) MapAddressToNewID(address address.Address) (address.Address, error) { + return s.State.MapAddressToNewID(s.store, address) +} + +func (s *state7) ForEachActor(cb func(id abi.ActorID, address address.Address) error) error { + addrs, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + var actorID cbg.CborInt + return addrs.ForEach(&actorID, func(key string) error { + addr, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(abi.ActorID(actorID), addr) + }) +} + +func (s *state7) NetworkName() (dtypes.NetworkName, error) { + return dtypes.NetworkName(s.State.NetworkName), nil +} + +func (s *state7) SetNetworkName(name string) error { + s.State.NetworkName = name + return nil +} + +func (s *state7) SetNextID(id abi.ActorID) error { + s.State.NextID = id + return nil +} + +func (s *state7) Remove(addrs ...address.Address) (err error) { + m, err := adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + for _, addr := range addrs { + if err = m.Delete(abi.AddrKey(addr)); err != nil { + return xerrors.Errorf("failed to delete entry for address: %s; err: %w", addr, err) + } + } + amr, err := m.Root() + if err != nil { + return xerrors.Errorf("failed to get address map root: %w", err) + } + s.State.AddressMap = amr + return nil +} + +func (s *state7) SetAddressMap(mcid cid.Cid) error { + s.State.AddressMap = mcid + return nil +} + +func (s *state7) AddressMap() (adt.Map, error) { + return adt7.AsMap(s.store, s.State.AddressMap, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 7e35f3919..6781b55e3 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -25,6 +25,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -56,11 +58,15 @@ func init() { builtin.RegisterActorState(builtin6.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StorageMarketActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StorageMarketActorAddr - Methods = builtin6.MethodsMarket + Address = builtin7.StorageMarketActorAddr + Methods = builtin7.MethodsMarket ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -84,6 +90,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StorageMarketActorCodeID: return load6(store, act.Head) + case builtin7.StorageMarketActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -109,6 +118,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -134,6 +146,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StorageMarketActorCodeID, nil + case actors.Version7: + return builtin7.StorageMarketActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -211,6 +226,9 @@ func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStora case actors.Version6: return decodePublishStorageDealsReturn6(b) + case actors.Version7: + return decodePublishStorageDealsReturn7(b) + } return nil, xerrors.Errorf("unknown actor version %d", av) } diff --git a/chain/actors/builtin/market/v7.go b/chain/actors/builtin/market/v7.go new file mode 100644 index 000000000..553913146 --- /dev/null +++ b/chain/actors/builtin/market/v7.go @@ -0,0 +1,252 @@ +package market + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/types" + + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := market7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + market7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + fml := types.BigAdd(s.TotalClientLockedCollateral, s.TotalProviderLockedCollateral) + fml = types.BigAdd(fml, s.TotalClientStorageFee) + return fml, nil +} + +func (s *state7) BalancesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.EscrowTable.Equals(otherState7.State.EscrowTable) || !s.State.LockedTable.Equals(otherState7.State.LockedTable), nil +} + +func (s *state7) StatesChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.States.Equals(otherState7.State.States), nil +} + +func (s *state7) States() (DealStates, error) { + stateArray, err := adt7.AsArray(s.store, s.State.States, market7.StatesAmtBitwidth) + if err != nil { + return nil, err + } + return &dealStates7{stateArray}, nil +} + +func (s *state7) ProposalsChanged(otherState State) (bool, error) { + otherState7, ok := otherState.(*state7) + if !ok { + // there's no way to compare different versions of the state, so let's + // just say that means the state of balances has changed + return true, nil + } + return !s.State.Proposals.Equals(otherState7.State.Proposals), nil +} + +func (s *state7) Proposals() (DealProposals, error) { + proposalArray, err := adt7.AsArray(s.store, s.State.Proposals, market7.ProposalsAmtBitwidth) + if err != nil { + return nil, err + } + return &dealProposals7{proposalArray}, nil +} + +func (s *state7) EscrowTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.EscrowTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) LockedTable() (BalanceTable, error) { + bt, err := adt7.AsBalanceTable(s.store, s.State.LockedTable) + if err != nil { + return nil, err + } + return &balanceTable7{bt}, nil +} + +func (s *state7) VerifyDealsForActivation( + minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch, +) (weight, verifiedWeight abi.DealWeight, err error) { + w, vw, _, err := market7.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch) + return w, vw, err +} + +func (s *state7) NextID() (abi.DealID, error) { + return s.State.NextID, nil +} + +type balanceTable7 struct { + *adt7.BalanceTable +} + +func (bt *balanceTable7) ForEach(cb func(address.Address, abi.TokenAmount) error) error { + asMap := (*adt7.Map)(bt.BalanceTable) + var ta abi.TokenAmount + return asMap.ForEach(&ta, func(key string) error { + a, err := address.NewFromBytes([]byte(key)) + if err != nil { + return err + } + return cb(a, ta) + }) +} + +type dealStates7 struct { + adt.Array +} + +func (s *dealStates7) Get(dealID abi.DealID) (*DealState, bool, error) { + var deal7 market7.DealState + found, err := s.Array.Get(uint64(dealID), &deal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + deal := fromV7DealState(deal7) + return &deal, true, nil +} + +func (s *dealStates7) ForEach(cb func(dealID abi.DealID, ds DealState) error) error { + var ds7 market7.DealState + return s.Array.ForEach(&ds7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealState(ds7)) + }) +} + +func (s *dealStates7) decode(val *cbg.Deferred) (*DealState, error) { + var ds7 market7.DealState + if err := ds7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + ds := fromV7DealState(ds7) + return &ds, nil +} + +func (s *dealStates7) array() adt.Array { + return s.Array +} + +func fromV7DealState(v7 market7.DealState) DealState { + return (DealState)(v7) +} + +type dealProposals7 struct { + adt.Array +} + +func (s *dealProposals7) Get(dealID abi.DealID) (*DealProposal, bool, error) { + var proposal7 market7.DealProposal + found, err := s.Array.Get(uint64(dealID), &proposal7) + if err != nil { + return nil, false, err + } + if !found { + return nil, false, nil + } + proposal := fromV7DealProposal(proposal7) + return &proposal, true, nil +} + +func (s *dealProposals7) ForEach(cb func(dealID abi.DealID, dp DealProposal) error) error { + var dp7 market7.DealProposal + return s.Array.ForEach(&dp7, func(idx int64) error { + return cb(abi.DealID(idx), fromV7DealProposal(dp7)) + }) +} + +func (s *dealProposals7) decode(val *cbg.Deferred) (*DealProposal, error) { + var dp7 market7.DealProposal + if err := dp7.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return nil, err + } + dp := fromV7DealProposal(dp7) + return &dp, nil +} + +func (s *dealProposals7) array() adt.Array { + return s.Array +} + +func fromV7DealProposal(v7 market7.DealProposal) DealProposal { + return (DealProposal)(v7) +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +var _ PublishStorageDealsReturn = (*publishStorageDealsReturn7)(nil) + +func decodePublishStorageDealsReturn7(b []byte) (PublishStorageDealsReturn, error) { + var retval market7.PublishStorageDealsReturn + if err := retval.UnmarshalCBOR(bytes.NewReader(b)); err != nil { + return nil, xerrors.Errorf("failed to unmarshal PublishStorageDealsReturn: %w", err) + } + + return &publishStorageDealsReturn7{retval}, nil +} + +type publishStorageDealsReturn7 struct { + market7.PublishStorageDealsReturn +} + +func (r *publishStorageDealsReturn7) IsDealValid(index uint64) (bool, error) { + + return r.ValidDeals.IsSet(index) + +} + +func (r *publishStorageDealsReturn7) DealIDs() ([]abi.DealID, error) { + return r.IDs, nil +} diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index 1c7f47e11..f6d633880 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -35,6 +35,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -63,9 +65,13 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.StorageMinerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } -var Methods = builtin6.MethodsMiner +var Methods = builtin7.MethodsMiner // Unchanged between v0, v2, v3, v4, and v5 actors var WPoStProvingPeriod = miner0.WPoStProvingPeriod @@ -102,6 +108,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StorageMinerActorCodeID: return load6(store, act.Head) + case builtin7.StorageMinerActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -127,6 +136,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -152,6 +164,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StorageMinerActorCodeID, nil + case actors.Version7: + return builtin7.StorageMinerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go new file mode 100644 index 000000000..c7096a781 --- /dev/null +++ b/chain/actors/builtin/miner/v7.go @@ -0,0 +1,570 @@ +package miner + +import ( + "bytes" + "errors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + rle "github.com/filecoin-project/go-bitfield/rle" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = miner7.State{} + return &out, nil +} + +type state7 struct { + miner7.State + store adt.Store +} + +type deadline7 struct { + miner7.Deadline + store adt.Store +} + +type partition7 struct { + miner7.Partition + store adt.Store +} + +func (s *state7) AvailableBalance(bal abi.TokenAmount) (available abi.TokenAmount, err error) { + defer func() { + if r := recover(); r != nil { + err = xerrors.Errorf("failed to get available balance: %w", r) + available = abi.NewTokenAmount(0) + } + }() + // this panics if the miner doesnt have enough funds to cover their locked pledge + available, err = s.GetAvailableBalance(bal) + return available, err +} + +func (s *state7) VestedFunds(epoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.CheckVestedFunds(s.store, epoch) +} + +func (s *state7) LockedFunds() (LockedFunds, error) { + return LockedFunds{ + VestingFunds: s.State.LockedFunds, + InitialPledgeRequirement: s.State.InitialPledge, + PreCommitDeposits: s.State.PreCommitDeposits, + }, nil +} + +func (s *state7) FeeDebt() (abi.TokenAmount, error) { + return s.State.FeeDebt, nil +} + +func (s *state7) InitialPledge() (abi.TokenAmount, error) { + return s.State.InitialPledge, nil +} + +func (s *state7) PreCommitDeposits() (abi.TokenAmount, error) { + return s.State.PreCommitDeposits, nil +} + +func (s *state7) GetSector(num abi.SectorNumber) (*SectorOnChainInfo, error) { + info, ok, err := s.State.GetSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorOnChainInfo(*info) + return &ret, nil +} + +func (s *state7) FindSector(num abi.SectorNumber) (*SectorLocation, error) { + dlIdx, partIdx, err := s.State.FindSector(s.store, num) + if err != nil { + return nil, err + } + return &SectorLocation{ + Deadline: dlIdx, + Partition: partIdx, + }, nil +} + +func (s *state7) NumLiveSectors() (uint64, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return 0, err + } + var total uint64 + if err := dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { + total += dl.LiveSectors + return nil + }); err != nil { + return 0, err + } + return total, nil +} + +// GetSectorExpiration returns the effective expiration of the given sector. +// +// If the sector does not expire early, the Early expiration field is 0. +func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + // NOTE: this can be optimized significantly. + // 1. If the sector is non-faulty, it will either expire on-time (can be + // learned from the sector info), or in the next quantized expiration + // epoch (i.e., the first element in the partition's expiration queue. + // 2. If it's faulty, it will expire early within the first 14 entries + // of the expiration queue. + stopErr := errors.New("stop") + out := SectorExpiration{} + err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { + partitions, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + quant := s.State.QuantSpecForDeadline(dlIdx) + var part miner7.Partition + return partitions.ForEach(&part, func(partIdx int64) error { + if found, err := part.Sectors.IsSet(uint64(num)); err != nil { + return err + } else if !found { + return nil + } + if found, err := part.Terminated.IsSet(uint64(num)); err != nil { + return err + } else if found { + // already terminated + return stopErr + } + + q, err := miner7.LoadExpirationQueue(s.store, part.ExpirationsEpochs, quant, miner7.PartitionExpirationAmtBitwidth) + if err != nil { + return err + } + var exp miner7.ExpirationSet + return q.ForEach(&exp, func(epoch int64) error { + if early, err := exp.EarlySectors.IsSet(uint64(num)); err != nil { + return err + } else if early { + out.Early = abi.ChainEpoch(epoch) + return nil + } + if onTime, err := exp.OnTimeSectors.IsSet(uint64(num)); err != nil { + return err + } else if onTime { + out.OnTime = abi.ChainEpoch(epoch) + return stopErr + } + return nil + }) + }) + }) + if err == stopErr { + err = nil + } + if err != nil { + return nil, err + } + if out.Early == 0 && out.OnTime == 0 { + return nil, xerrors.Errorf("failed to find sector %d", num) + } + return &out, nil +} + +func (s *state7) GetPrecommittedSector(num abi.SectorNumber) (*SectorPreCommitOnChainInfo, error) { + info, ok, err := s.State.GetPrecommittedSector(s.store, num) + if !ok || err != nil { + return nil, err + } + + ret := fromV7SectorPreCommitOnChainInfo(*info) + + return &ret, nil +} + +func (s *state7) ForEachPrecommittedSector(cb func(SectorPreCommitOnChainInfo) error) error { + precommitted, err := adt7.AsMap(s.store, s.State.PreCommittedSectors, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + + var info miner7.SectorPreCommitOnChainInfo + if err := precommitted.ForEach(&info, func(_ string) error { + return cb(fromV7SectorPreCommitOnChainInfo(info)) + }); err != nil { + return err + } + + return nil +} + +func (s *state7) LoadSectors(snos *bitfield.BitField) ([]*SectorOnChainInfo, error) { + sectors, err := miner7.LoadSectors(s.store, s.State.Sectors) + if err != nil { + return nil, err + } + + // If no sector numbers are specified, load all. + if snos == nil { + infos := make([]*SectorOnChainInfo, 0, sectors.Length()) + var info7 miner7.SectorOnChainInfo + if err := sectors.ForEach(&info7, func(_ int64) error { + info := fromV7SectorOnChainInfo(info7) + infos = append(infos, &info) + return nil + }); err != nil { + return nil, err + } + return infos, nil + } + + // Otherwise, load selected. + infos7, err := sectors.Load(*snos) + if err != nil { + return nil, err + } + infos := make([]*SectorOnChainInfo, len(infos7)) + for i, info7 := range infos7 { + info := fromV7SectorOnChainInfo(*info7) + infos[i] = &info + } + return infos, nil +} + +func (s *state7) loadAllocatedSectorNumbers() (bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors) + return allocatedSectors, err +} + +func (s *state7) IsAllocated(num abi.SectorNumber) (bool, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return false, err + } + + return allocatedSectors.IsSet(uint64(num)) +} + +func (s *state7) GetProvingPeriodStart() (abi.ChainEpoch, error) { + return s.State.ProvingPeriodStart, nil +} + +func (s *state7) UnallocatedSectorNumbers(count int) ([]abi.SectorNumber, error) { + allocatedSectors, err := s.loadAllocatedSectorNumbers() + if err != nil { + return nil, err + } + + allocatedRuns, err := allocatedSectors.RunIterator() + if err != nil { + return nil, err + } + + unallocatedRuns, err := rle.Subtract( + &rle.RunSliceIterator{Runs: []rle.Run{{Val: true, Len: abi.MaxSectorNumber}}}, + allocatedRuns, + ) + if err != nil { + return nil, err + } + + iter, err := rle.BitsFromRuns(unallocatedRuns) + if err != nil { + return nil, err + } + + sectors := make([]abi.SectorNumber, 0, count) + for iter.HasNext() && len(sectors) < count { + nextNo, err := iter.Next() + if err != nil { + return nil, err + } + sectors = append(sectors, abi.SectorNumber(nextNo)) + } + + return sectors, nil +} + +func (s *state7) GetAllocatedSectors() (*bitfield.BitField, error) { + var allocatedSectors bitfield.BitField + if err := s.store.Get(s.store.Context(), s.State.AllocatedSectors, &allocatedSectors); err != nil { + return nil, err + } + + return &allocatedSectors, nil +} + +func (s *state7) LoadDeadline(idx uint64) (Deadline, error) { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return nil, err + } + dl, err := dls.LoadDeadline(s.store, idx) + if err != nil { + return nil, err + } + return &deadline7{*dl, s.store}, nil +} + +func (s *state7) ForEachDeadline(cb func(uint64, Deadline) error) error { + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + return dls.ForEach(s.store, func(i uint64, dl *miner7.Deadline) error { + return cb(i, &deadline7{*dl, s.store}) + }) +} + +func (s *state7) NumDeadlines() (uint64, error) { + return miner7.WPoStPeriodDeadlines, nil +} + +func (s *state7) DeadlinesChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !s.State.Deadlines.Equals(other7.Deadlines), nil +} + +func (s *state7) MinerInfoChanged(other State) (bool, error) { + other0, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Info.Equals(other0.State.Info), nil +} + +func (s *state7) Info() (MinerInfo, error) { + info, err := s.State.GetInfo(s.store) + if err != nil { + return MinerInfo{}, err + } + + var pid *peer.ID + if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { + pid = &peerID + } + + mi := MinerInfo{ + Owner: info.Owner, + Worker: info.Worker, + ControlAddresses: info.ControlAddresses, + + NewWorker: address.Undef, + WorkerChangeEpoch: -1, + + PeerId: pid, + Multiaddrs: info.Multiaddrs, + WindowPoStProofType: info.WindowPoStProofType, + SectorSize: info.SectorSize, + WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, + ConsensusFaultElapsed: info.ConsensusFaultElapsed, + } + + if info.PendingWorkerKey != nil { + mi.NewWorker = info.PendingWorkerKey.NewWorker + mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt + } + + return mi, nil +} + +func (s *state7) DeadlineInfo(epoch abi.ChainEpoch) (*dline.Info, error) { + return s.State.RecordedDeadlineInfo(epoch), nil +} + +func (s *state7) DeadlineCronActive() (bool, error) { + return s.State.DeadlineCronActive, nil +} + +func (s *state7) sectors() (adt.Array, error) { + return adt7.AsArray(s.store, s.Sectors, miner7.SectorsAmtBitwidth) +} + +func (s *state7) decodeSectorOnChainInfo(val *cbg.Deferred) (SectorOnChainInfo, error) { + var si miner7.SectorOnChainInfo + err := si.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorOnChainInfo{}, err + } + + return fromV7SectorOnChainInfo(si), nil +} + +func (s *state7) precommits() (adt.Map, error) { + return adt7.AsMap(s.store, s.PreCommittedSectors, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeSectorPreCommitOnChainInfo(val *cbg.Deferred) (SectorPreCommitOnChainInfo, error) { + var sp miner7.SectorPreCommitOnChainInfo + err := sp.UnmarshalCBOR(bytes.NewReader(val.Raw)) + if err != nil { + return SectorPreCommitOnChainInfo{}, err + } + + return fromV7SectorPreCommitOnChainInfo(sp), nil +} + +func (s *state7) EraseAllUnproven() error { + + dls, err := s.State.LoadDeadlines(s.store) + if err != nil { + return err + } + + err = dls.ForEach(s.store, func(dindx uint64, dl *miner7.Deadline) error { + ps, err := dl.PartitionsArray(s.store) + if err != nil { + return err + } + + var part miner7.Partition + err = ps.ForEach(&part, func(pindx int64) error { + _ = part.ActivateUnproven() + err = ps.Set(uint64(pindx), &part) + return nil + }) + + if err != nil { + return err + } + + dl.Partitions, err = ps.Root() + if err != nil { + return err + } + + return dls.UpdateDeadline(s.store, dindx, dl) + }) + if err != nil { + return err + } + + return s.State.SaveDeadlines(s.store, dls) + +} + +func (d *deadline7) LoadPartition(idx uint64) (Partition, error) { + p, err := d.Deadline.LoadPartition(d.store, idx) + if err != nil { + return nil, err + } + return &partition7{*p, d.store}, nil +} + +func (d *deadline7) ForEachPartition(cb func(uint64, Partition) error) error { + ps, err := d.Deadline.PartitionsArray(d.store) + if err != nil { + return err + } + var part miner7.Partition + return ps.ForEach(&part, func(i int64) error { + return cb(uint64(i), &partition7{part, d.store}) + }) +} + +func (d *deadline7) PartitionsChanged(other Deadline) (bool, error) { + other7, ok := other.(*deadline7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + + return !d.Deadline.Partitions.Equals(other7.Deadline.Partitions), nil +} + +func (d *deadline7) PartitionsPoSted() (bitfield.BitField, error) { + return d.Deadline.PartitionsPoSted, nil +} + +func (d *deadline7) DisputableProofCount() (uint64, error) { + + ops, err := d.OptimisticProofsSnapshotArray(d.store) + if err != nil { + return 0, err + } + + return ops.Length(), nil + +} + +func (p *partition7) AllSectors() (bitfield.BitField, error) { + return p.Partition.Sectors, nil +} + +func (p *partition7) FaultySectors() (bitfield.BitField, error) { + return p.Partition.Faults, nil +} + +func (p *partition7) RecoveringSectors() (bitfield.BitField, error) { + return p.Partition.Recoveries, nil +} + +func (p *partition7) UnprovenSectors() (bitfield.BitField, error) { + return p.Partition.Unproven, nil +} + +func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { + + return SectorOnChainInfo{ + SectorNumber: v7.SectorNumber, + SealProof: v7.SealProof, + SealedCID: v7.SealedCID, + DealIDs: v7.DealIDs, + Activation: v7.Activation, + Expiration: v7.Expiration, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + InitialPledge: v7.InitialPledge, + ExpectedDayReward: v7.ExpectedDayReward, + ExpectedStoragePledge: v7.ExpectedStoragePledge, + } + +} + +func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { + + return SectorPreCommitOnChainInfo{ + Info: (SectorPreCommitInfo)(v7.Info), + PreCommitDeposit: v7.PreCommitDeposit, + PreCommitEpoch: v7.PreCommitEpoch, + DealWeight: v7.DealWeight, + VerifiedDealWeight: v7.VerifiedDealWeight, + } + +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/multisig/message7.go b/chain/actors/builtin/multisig/message7.go new file mode 100644 index 000000000..e7fb83e9b --- /dev/null +++ b/chain/actors/builtin/multisig/message7.go @@ -0,0 +1,71 @@ +package multisig + +import ( + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + multisig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" + + "github.com/filecoin-project/lotus/chain/actors" + init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" + "github.com/filecoin-project/lotus/chain/types" +) + +type message7 struct{ message0 } + +func (m message7) Create( + signers []address.Address, threshold uint64, + unlockStart, unlockDuration abi.ChainEpoch, + initialAmount abi.TokenAmount, +) (*types.Message, error) { + + lenAddrs := uint64(len(signers)) + + if lenAddrs < threshold { + return nil, xerrors.Errorf("cannot require signing of more addresses than provided for multisig") + } + + if threshold == 0 { + threshold = lenAddrs + } + + if m.from == address.Undef { + return nil, xerrors.Errorf("must provide source address") + } + + // Set up constructor parameters for multisig + msigParams := &multisig7.ConstructorParams{ + Signers: signers, + NumApprovalsThreshold: threshold, + UnlockDuration: unlockDuration, + StartEpoch: unlockStart, + } + + enc, actErr := actors.SerializeParams(msigParams) + if actErr != nil { + return nil, actErr + } + + // new actors are created by invoking 'exec' on the init actor with the constructor params + execParams := &init7.ExecParams{ + CodeCID: builtin7.MultisigActorCodeID, + ConstructorParams: enc, + } + + enc, actErr = actors.SerializeParams(execParams) + if actErr != nil { + return nil, actErr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Method: builtin7.MethodsInit.Exec, + Params: enc, + Value: initialAmount, + }, nil +} diff --git a/chain/actors/builtin/multisig/multisig.go b/chain/actors/builtin/multisig/multisig.go index ee725f7e5..f1b50475a 100644 --- a/chain/actors/builtin/multisig/multisig.go +++ b/chain/actors/builtin/multisig/multisig.go @@ -13,7 +13,7 @@ import ( "github.com/ipfs/go-cid" msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - msig6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/multisig" + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -27,6 +27,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -58,6 +60,10 @@ func init() { builtin.RegisterActorState(builtin6.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.MultisigActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.MultisigActorCodeID: return load6(store, act.Head) + case builtin7.MultisigActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version, signers []address.Address, th case actors.Version6: return make6(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + case actors.Version7: + return make7(store, signers, threshold, startEpoch, unlockDuration, initialBalance) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.MultisigActorCodeID, nil + case actors.Version7: + return builtin7.MultisigActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -156,7 +171,7 @@ type State interface { type Transaction = msig0.Transaction -var Methods = builtin6.MethodsMultisig +var Methods = builtin7.MethodsMultisig func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -178,6 +193,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version6: return message6{message0{from}} + + case actors.Version7: + return message7{message0{from}} default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } @@ -201,13 +219,13 @@ type MessageBuilder interface { } // this type is the same between v0 and v2 -type ProposalHashData = msig6.ProposalHashData -type ProposeReturn = msig6.ProposeReturn -type ProposeParams = msig6.ProposeParams -type ApproveReturn = msig6.ApproveReturn +type ProposalHashData = msig7.ProposalHashData +type ProposeReturn = msig7.ProposeReturn +type ProposeParams = msig7.ProposeParams +type ApproveReturn = msig7.ApproveReturn func txnParams(id uint64, data *ProposalHashData) ([]byte, error) { - params := msig6.TxnIDParams{ID: msig6.TxnID(id)} + params := msig7.TxnIDParams{ID: msig7.TxnID(id)} if data != nil { if data.Requester.Protocol() != address.ID { return nil, xerrors.Errorf("proposer address must be an ID address, was %s", data.Requester) diff --git a/chain/actors/builtin/multisig/v7.go b/chain/actors/builtin/multisig/v7.go new file mode 100644 index 000000000..bbe41f3db --- /dev/null +++ b/chain/actors/builtin/multisig/v7.go @@ -0,0 +1,119 @@ +package multisig + +import ( + "bytes" + "encoding/binary" + + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + msig7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/multisig" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, signers []address.Address, threshold uint64, startEpoch abi.ChainEpoch, unlockDuration abi.ChainEpoch, initialBalance abi.TokenAmount) (State, error) { + out := state7{store: store} + out.State = msig7.State{} + out.State.Signers = signers + out.State.NumApprovalsThreshold = threshold + out.State.StartEpoch = startEpoch + out.State.UnlockDuration = unlockDuration + out.State.InitialBalance = initialBalance + + em, err := adt7.StoreEmptyMap(store, builtin7.DefaultHamtBitwidth) + if err != nil { + return nil, err + } + + out.State.PendingTxns = em + + return &out, nil +} + +type state7 struct { + msig7.State + store adt.Store +} + +func (s *state7) LockedBalance(currEpoch abi.ChainEpoch) (abi.TokenAmount, error) { + return s.State.AmountLocked(currEpoch - s.State.StartEpoch), nil +} + +func (s *state7) StartEpoch() (abi.ChainEpoch, error) { + return s.State.StartEpoch, nil +} + +func (s *state7) UnlockDuration() (abi.ChainEpoch, error) { + return s.State.UnlockDuration, nil +} + +func (s *state7) InitialBalance() (abi.TokenAmount, error) { + return s.State.InitialBalance, nil +} + +func (s *state7) Threshold() (uint64, error) { + return s.State.NumApprovalsThreshold, nil +} + +func (s *state7) Signers() ([]address.Address, error) { + return s.State.Signers, nil +} + +func (s *state7) ForEachPendingTxn(cb func(id int64, txn Transaction) error) error { + arr, err := adt7.AsMap(s.store, s.State.PendingTxns, builtin7.DefaultHamtBitwidth) + if err != nil { + return err + } + var out msig7.Transaction + return arr.ForEach(&out, func(key string) error { + txid, n := binary.Varint([]byte(key)) + if n <= 0 { + return xerrors.Errorf("invalid pending transaction key: %v", key) + } + return cb(txid, (Transaction)(out)) //nolint:unconvert + }) +} + +func (s *state7) PendingTxnChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.PendingTxns.Equals(other7.PendingTxns), nil +} + +func (s *state7) transactions() (adt.Map, error) { + return adt7.AsMap(s.store, s.PendingTxns, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeTransaction(val *cbg.Deferred) (Transaction, error) { + var tx msig7.Transaction + if err := tx.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Transaction{}, err + } + return tx, nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go new file mode 100644 index 000000000..41dfa1bdd --- /dev/null +++ b/chain/actors/builtin/paych/message7.go @@ -0,0 +1,74 @@ +package paych + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + init7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/init" + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + + "github.com/filecoin-project/lotus/chain/actors" + init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" + "github.com/filecoin-project/lotus/chain/types" +) + +type message7 struct{ from address.Address } + +func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.ConstructorParams{From: m.from, To: to}) + if aerr != nil { + return nil, aerr + } + enc, aerr := actors.SerializeParams(&init7.ExecParams{ + CodeCID: builtin7.PaymentChannelActorCodeID, + ConstructorParams: params, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: init_.Address, + From: m.from, + Value: initialAmount, + Method: builtin7.MethodsInit.Exec, + Params: enc, + }, nil +} + +func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { + params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ + Sv: *sv, + Secret: secret, + }) + if aerr != nil { + return nil, aerr + } + + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.UpdateChannelState, + Params: params, + }, nil +} + +func (m message7) Settle(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Settle, + }, nil +} + +func (m message7) Collect(paych address.Address) (*types.Message, error) { + return &types.Message{ + To: paych, + From: m.from, + Value: abi.NewTokenAmount(0), + Method: builtin7.MethodsPaych.Collect, + }, nil +} diff --git a/chain/actors/builtin/paych/paych.go b/chain/actors/builtin/paych/paych.go index eea3659f8..f807b33ed 100644 --- a/chain/actors/builtin/paych/paych.go +++ b/chain/actors/builtin/paych/paych.go @@ -27,6 +27,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -58,6 +60,10 @@ func init() { builtin.RegisterActorState(builtin6.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.PaymentChannelActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } // Load returns an abstract copy of payment channel state, irregardless of actor version @@ -82,6 +88,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.PaymentChannelActorCodeID: return load6(store, act.Head) + case builtin7.PaymentChannelActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -107,6 +116,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -132,6 +144,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.PaymentChannelActorCodeID, nil + case actors.Version7: + return builtin7.PaymentChannelActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) @@ -185,7 +200,7 @@ func DecodeSignedVoucher(s string) (*SignedVoucher, error) { return &sv, nil } -var Methods = builtin6.MethodsPaych +var Methods = builtin7.MethodsPaych func Message(version actors.Version, from address.Address) MessageBuilder { switch version { @@ -208,6 +223,9 @@ func Message(version actors.Version, from address.Address) MessageBuilder { case actors.Version6: return message6{from} + case actors.Version7: + return message7{from} + default: panic(fmt.Sprintf("unsupported actors version: %d", version)) } diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go new file mode 100644 index 000000000..ce09ea2e4 --- /dev/null +++ b/chain/actors/builtin/paych/v7.go @@ -0,0 +1,114 @@ +package paych + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = paych7.State{} + return &out, nil +} + +type state7 struct { + paych7.State + store adt.Store + lsAmt *adt7.Array +} + +// Channel owner, who has funded the actor +func (s *state7) From() (address.Address, error) { + return s.State.From, nil +} + +// Recipient of payouts from channel +func (s *state7) To() (address.Address, error) { + return s.State.To, nil +} + +// Height at which the channel can be `Collected` +func (s *state7) SettlingAt() (abi.ChainEpoch, error) { + return s.State.SettlingAt, nil +} + +// Amount successfully redeemed through the payment channel, paid out on `Collect()` +func (s *state7) ToSend() (abi.TokenAmount, error) { + return s.State.ToSend, nil +} + +func (s *state7) getOrLoadLsAmt() (*adt7.Array, error) { + if s.lsAmt != nil { + return s.lsAmt, nil + } + + // Get the lane state from the chain + lsamt, err := adt7.AsArray(s.store, s.State.LaneStates, paych7.LaneStatesAmtBitwidth) + if err != nil { + return nil, err + } + + s.lsAmt = lsamt + return lsamt, nil +} + +// Get total number of lanes +func (s *state7) LaneCount() (uint64, error) { + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return 0, err + } + return lsamt.Length(), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +// Iterate lane states +func (s *state7) ForEachLaneState(cb func(idx uint64, dl LaneState) error) error { + // Get the lane state from the chain + lsamt, err := s.getOrLoadLsAmt() + if err != nil { + return err + } + + // Note: we use a map instead of an array to store laneStates because the + // client sets the lane ID (the index) and potentially they could use a + // very large index. + var ls paych7.LaneState + return lsamt.ForEach(&ls, func(i int64) error { + return cb(uint64(i), &laneState7{ls}) + }) +} + +type laneState7 struct { + paych7.LaneState +} + +func (ls *laneState7) Redeemed() (big.Int, error) { + return ls.LaneState.Redeemed, nil +} + +func (ls *laneState7) Nonce() (uint64, error) { + return ls.LaneState.Nonce, nil +} diff --git a/chain/actors/builtin/power/power.go b/chain/actors/builtin/power/power.go index 84bd6948a..9b73cdd60 100644 --- a/chain/actors/builtin/power/power.go +++ b/chain/actors/builtin/power/power.go @@ -26,6 +26,8 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) func init() { @@ -53,11 +55,15 @@ func init() { builtin.RegisterActorState(builtin6.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.StoragePowerActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.StoragePowerActorAddr - Methods = builtin6.MethodsPower + Address = builtin7.StoragePowerActorAddr + Methods = builtin7.MethodsPower ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.StoragePowerActorCodeID: return load6(store, act.Head) + case builtin7.StoragePowerActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.StoragePowerActorCodeID, nil + case actors.Version7: + return builtin7.StoragePowerActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/power/v7.go b/chain/actors/builtin/power/v7.go new file mode 100644 index 000000000..af1761cb2 --- /dev/null +++ b/chain/actors/builtin/power/v7.go @@ -0,0 +1,187 @@ +package power + +import ( + "bytes" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + + power7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/power" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + + s, err := power7.ConstructState(store) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + power7.State + store adt.Store +} + +func (s *state7) TotalLocked() (abi.TokenAmount, error) { + return s.TotalPledgeCollateral, nil +} + +func (s *state7) TotalPower() (Claim, error) { + return Claim{ + RawBytePower: s.TotalRawBytePower, + QualityAdjPower: s.TotalQualityAdjPower, + }, nil +} + +// Committed power to the network. Includes miners below the minimum threshold. +func (s *state7) TotalCommitted() (Claim, error) { + return Claim{ + RawBytePower: s.TotalBytesCommitted, + QualityAdjPower: s.TotalQABytesCommitted, + }, nil +} + +func (s *state7) MinerPower(addr address.Address) (Claim, bool, error) { + claims, err := s.claims() + if err != nil { + return Claim{}, false, err + } + var claim power7.Claim + ok, err := claims.Get(abi.AddrKey(addr), &claim) + if err != nil { + return Claim{}, false, err + } + return Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }, ok, nil +} + +func (s *state7) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { + return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) +} + +func (s *state7) TotalPowerSmoothed() (builtin.FilterEstimate, error) { + return builtin.FromV7FilterEstimate(s.State.ThisEpochQAPowerSmoothed), nil +} + +func (s *state7) MinerCounts() (uint64, uint64, error) { + return uint64(s.State.MinerAboveMinPowerCount), uint64(s.State.MinerCount), nil +} + +func (s *state7) ListAllMiners() ([]address.Address, error) { + claims, err := s.claims() + if err != nil { + return nil, err + } + + var miners []address.Address + err = claims.ForEach(nil, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + miners = append(miners, a) + return nil + }) + if err != nil { + return nil, err + } + + return miners, nil +} + +func (s *state7) ForEachClaim(cb func(miner address.Address, claim Claim) error) error { + claims, err := s.claims() + if err != nil { + return err + } + + var claim power7.Claim + return claims.ForEach(&claim, func(k string) error { + a, err := address.NewFromBytes([]byte(k)) + if err != nil { + return err + } + return cb(a, Claim{ + RawBytePower: claim.RawBytePower, + QualityAdjPower: claim.QualityAdjPower, + }) + }) +} + +func (s *state7) ClaimsChanged(other State) (bool, error) { + other7, ok := other.(*state7) + if !ok { + // treat an upgrade as a change, always + return true, nil + } + return !s.State.Claims.Equals(other7.State.Claims), nil +} + +func (s *state7) SetTotalQualityAdjPower(p abi.StoragePower) error { + s.State.TotalQualityAdjPower = p + return nil +} + +func (s *state7) SetTotalRawBytePower(p abi.StoragePower) error { + s.State.TotalRawBytePower = p + return nil +} + +func (s *state7) SetThisEpochQualityAdjPower(p abi.StoragePower) error { + s.State.ThisEpochQualityAdjPower = p + return nil +} + +func (s *state7) SetThisEpochRawBytePower(p abi.StoragePower) error { + s.State.ThisEpochRawBytePower = p + return nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} + +func (s *state7) claims() (adt.Map, error) { + return adt7.AsMap(s.store, s.Claims, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) decodeClaim(val *cbg.Deferred) (Claim, error) { + var ci power7.Claim + if err := ci.UnmarshalCBOR(bytes.NewReader(val.Raw)); err != nil { + return Claim{}, err + } + return fromV7Claim(ci), nil +} + +func fromV7Claim(v7 power7.Claim) Claim { + return Claim{ + RawBytePower: v7.RawBytePower, + QualityAdjPower: v7.QualityAdjPower, + } +} diff --git a/chain/actors/builtin/reward/reward.go b/chain/actors/builtin/reward/reward.go index 38d5b5b87..b6ee2f146 100644 --- a/chain/actors/builtin/reward/reward.go +++ b/chain/actors/builtin/reward/reward.go @@ -21,6 +21,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" @@ -51,11 +53,15 @@ func init() { builtin.RegisterActorState(builtin6.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { return load6(store, root) }) + + builtin.RegisterActorState(builtin7.RewardActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) } var ( - Address = builtin6.RewardActorAddr - Methods = builtin6.MethodsReward + Address = builtin7.RewardActorAddr + Methods = builtin7.MethodsReward ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -79,6 +85,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.RewardActorCodeID: return load6(store, act.Head) + case builtin7.RewardActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -104,6 +113,9 @@ func MakeState(store adt.Store, av actors.Version, currRealizedPower abi.Storage case actors.Version6: return make6(store, currRealizedPower) + case actors.Version7: + return make7(store, currRealizedPower) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -129,6 +141,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.RewardActorCodeID, nil + case actors.Version7: + return builtin7.RewardActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/reward/v7.go b/chain/actors/builtin/reward/v7.go new file mode 100644 index 000000000..368bb3abd --- /dev/null +++ b/chain/actors/builtin/reward/v7.go @@ -0,0 +1,98 @@ +package reward + +import ( + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + reward7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/reward" + smoothing7 "github.com/filecoin-project/specs-actors/v7/actors/util/smoothing" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, currRealizedPower abi.StoragePower) (State, error) { + out := state7{store: store} + out.State = *reward7.ConstructState(currRealizedPower) + return &out, nil +} + +type state7 struct { + reward7.State + store adt.Store +} + +func (s *state7) ThisEpochReward() (abi.TokenAmount, error) { + return s.State.ThisEpochReward, nil +} + +func (s *state7) ThisEpochRewardSmoothed() (builtin.FilterEstimate, error) { + + return builtin.FilterEstimate{ + PositionEstimate: s.State.ThisEpochRewardSmoothed.PositionEstimate, + VelocityEstimate: s.State.ThisEpochRewardSmoothed.VelocityEstimate, + }, nil + +} + +func (s *state7) ThisEpochBaselinePower() (abi.StoragePower, error) { + return s.State.ThisEpochBaselinePower, nil +} + +func (s *state7) TotalStoragePowerReward() (abi.TokenAmount, error) { + return s.State.TotalStoragePowerReward, nil +} + +func (s *state7) EffectiveBaselinePower() (abi.StoragePower, error) { + return s.State.EffectiveBaselinePower, nil +} + +func (s *state7) EffectiveNetworkTime() (abi.ChainEpoch, error) { + return s.State.EffectiveNetworkTime, nil +} + +func (s *state7) CumsumBaseline() (reward7.Spacetime, error) { + return s.State.CumsumBaseline, nil +} + +func (s *state7) CumsumRealized() (reward7.Spacetime, error) { + return s.State.CumsumRealized, nil +} + +func (s *state7) InitialPledgeForPower(qaPower abi.StoragePower, networkTotalPledge abi.TokenAmount, networkQAPower *builtin.FilterEstimate, circSupply abi.TokenAmount) (abi.TokenAmount, error) { + return miner7.InitialPledgeForPower( + qaPower, + s.State.ThisEpochBaselinePower, + s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + circSupply, + ), nil +} + +func (s *state7) PreCommitDepositForPower(networkQAPower builtin.FilterEstimate, sectorWeight abi.StoragePower) (abi.TokenAmount, error) { + return miner7.PreCommitDepositForPower(s.State.ThisEpochRewardSmoothed, + smoothing7.FilterEstimate{ + PositionEstimate: networkQAPower.PositionEstimate, + VelocityEstimate: networkQAPower.VelocityEstimate, + }, + sectorWeight), nil +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/system/system.go b/chain/actors/builtin/system/system.go index 3d6105c38..fb7515f35 100644 --- a/chain/actors/builtin/system/system.go +++ b/chain/actors/builtin/system/system.go @@ -17,10 +17,12 @@ import ( builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" ) var ( - Address = builtin6.SystemActorAddr + Address = builtin7.SystemActorAddr ) func MakeState(store adt.Store, av actors.Version) (State, error) { @@ -44,6 +46,9 @@ func MakeState(store adt.Store, av actors.Version) (State, error) { case actors.Version6: return make6(store) + case actors.Version7: + return make7(store) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -69,6 +74,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.SystemActorCodeID, nil + case actors.Version7: + return builtin7.SystemActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/builtin/system/v7.go b/chain/actors/builtin/system/v7.go new file mode 100644 index 000000000..813add5fb --- /dev/null +++ b/chain/actors/builtin/system/v7.go @@ -0,0 +1,35 @@ +package system + +import ( + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors/adt" + + system7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/system" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store) (State, error) { + out := state7{store: store} + out.State = system7.State{} + return &out, nil +} + +type state7 struct { + system7.State + store adt.Store +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/verifreg/v7.go b/chain/actors/builtin/verifreg/v7.go new file mode 100644 index 000000000..9b2ca928a --- /dev/null +++ b/chain/actors/builtin/verifreg/v7.go @@ -0,0 +1,75 @@ +package verifreg + +import ( + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" + + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + adt7 "github.com/filecoin-project/specs-actors/v7/actors/util/adt" +) + +var _ State = (*state7)(nil) + +func load7(store adt.Store, root cid.Cid) (State, error) { + out := state7{store: store} + err := store.Get(store.Context(), root, &out) + if err != nil { + return nil, err + } + return &out, nil +} + +func make7(store adt.Store, rootKeyAddress address.Address) (State, error) { + out := state7{store: store} + + s, err := verifreg7.ConstructState(store, rootKeyAddress) + if err != nil { + return nil, err + } + + out.State = *s + + return &out, nil +} + +type state7 struct { + verifreg7.State + store adt.Store +} + +func (s *state7) RootKey() (address.Address, error) { + return s.State.RootKey, nil +} + +func (s *state7) VerifiedClientDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiedClients, addr) +} + +func (s *state7) VerifierDataCap(addr address.Address) (bool, abi.StoragePower, error) { + return getDataCap(s.store, actors.Version7, s.verifiers, addr) +} + +func (s *state7) ForEachVerifier(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiers, cb) +} + +func (s *state7) ForEachClient(cb func(addr address.Address, dcap abi.StoragePower) error) error { + return forEachCap(s.store, actors.Version7, s.verifiedClients, cb) +} + +func (s *state7) verifiedClients() (adt.Map, error) { + return adt7.AsMap(s.store, s.VerifiedClients, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) verifiers() (adt.Map, error) { + return adt7.AsMap(s.store, s.Verifiers, builtin7.DefaultHamtBitwidth) +} + +func (s *state7) GetState() interface{} { + return &s.State +} diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index 31e8e5a08..f6281334d 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -21,6 +21,8 @@ import ( builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -53,11 +55,15 @@ func init() { return load6(store, root) }) + builtin.RegisterActorState(builtin7.VerifiedRegistryActorCodeID, func(store adt.Store, root cid.Cid) (cbor.Marshaler, error) { + return load7(store, root) + }) + } var ( - Address = builtin6.VerifiedRegistryActorAddr - Methods = builtin6.MethodsVerifiedRegistry + Address = builtin7.VerifiedRegistryActorAddr + Methods = builtin7.MethodsVerifiedRegistry ) func Load(store adt.Store, act *types.Actor) (State, error) { @@ -81,6 +87,9 @@ func Load(store adt.Store, act *types.Actor) (State, error) { case builtin6.VerifiedRegistryActorCodeID: return load6(store, act.Head) + case builtin7.VerifiedRegistryActorCodeID: + return load7(store, act.Head) + } return nil, xerrors.Errorf("unknown actor code %s", act.Code) } @@ -106,6 +115,9 @@ func MakeState(store adt.Store, av actors.Version, rootKeyAddress address.Addres case actors.Version6: return make6(store, rootKeyAddress) + case actors.Version7: + return make7(store, rootKeyAddress) + } return nil, xerrors.Errorf("unknown actor version %d", av) } @@ -131,6 +143,9 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { case actors.Version6: return builtin6.VerifiedRegistryActorCodeID, nil + case actors.Version7: + return builtin7.VerifiedRegistryActorCodeID, nil + } return cid.Undef, xerrors.Errorf("unknown actor version %d", av) diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index e00a6ae10..f51da7aa7 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -40,14 +40,19 @@ import ( miner6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/miner" verifreg6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/verifreg" - paych6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/paych" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" + verifreg7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/verifreg" + + paych7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/paych" ) const ( - ChainFinality = miner6.ChainFinality + ChainFinality = miner7.ChainFinality SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych6.SettleDelay - MaxPreCommitRandomnessLookback = builtin6.EpochsInDay + SealRandomnessLookback + PaychSettleDelay = paych7.SettleDelay + MaxPreCommitRandomnessLookback = builtin7.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. @@ -72,6 +77,8 @@ func SetSupportedProofTypes(types ...abi.RegisteredSealProof) { miner6.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + miner7.PreCommitSealProofTypesV8 = make(map[abi.RegisteredSealProof]struct{}, len(types)) + AddSupportedProofTypes(types...) } @@ -119,6 +126,15 @@ func AddSupportedProofTypes(types ...abi.RegisteredSealProof) { miner6.WindowPoStProofTypes[wpp] = struct{}{} + miner7.PreCommitSealProofTypesV8[t+abi.RegisteredSealProof_StackedDrg2KiBV1_1] = struct{}{} + wpp, err = t.RegisteredWindowPoStProof() + if err != nil { + // Fine to panic, this is a test-only method + panic(err) + } + + miner7.WindowPoStProofTypes[wpp] = struct{}{} + } } @@ -139,11 +155,13 @@ func SetPreCommitChallengeDelay(delay abi.ChainEpoch) { miner6.PreCommitChallengeDelay = delay + miner7.PreCommitChallengeDelay = delay + } // TODO: this function shouldn't really exist. Instead, the API should expose the precommit delay. func GetPreCommitChallengeDelay() abi.ChainEpoch { - return miner6.PreCommitChallengeDelay + return miner7.PreCommitChallengeDelay } // SetConsensusMinerMinPower sets the minimum power of an individual miner must @@ -173,6 +191,10 @@ func SetConsensusMinerMinPower(p abi.StoragePower) { policy.ConsensusMinerMinPower = p } + for _, policy := range builtin7.PoStProofPolicies { + policy.ConsensusMinerMinPower = p + } + } // SetMinVerifiedDealSize sets the minimum size of a verified deal. This should @@ -191,6 +213,8 @@ func SetMinVerifiedDealSize(size abi.StoragePower) { verifreg6.MinVerifiedDealSize = size + verifreg7.MinVerifiedDealSize = size + } func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (abi.ChainEpoch, error) { @@ -220,6 +244,10 @@ func GetMaxProveCommitDuration(ver actors.Version, t abi.RegisteredSealProof) (a return miner6.MaxProveCommitDuration[t], nil + case actors.Version7: + + return miner7.MaxProveCommitDuration[t], nil + default: return 0, xerrors.Errorf("unsupported actors version") } @@ -255,6 +283,11 @@ func SetProviderCollateralSupplyTarget(num, denom big.Int) { Denominator: denom, } + market7.ProviderCollateralSupplyTarget = builtin7.BigFrac{ + Numerator: num, + Denominator: denom, + } + } func DealProviderCollateralBounds( @@ -298,13 +331,18 @@ func DealProviderCollateralBounds( min, max := market6.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) return min, max, nil + case actors.Version7: + + min, max := market7.DealProviderCollateralBounds(size, verified, rawBytePower, qaPower, baselinePower, circulatingFil) + return min, max, nil + default: return big.Zero(), big.Zero(), xerrors.Errorf("unsupported actors version") } } func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { - return market6.DealDurationBounds(pieceSize) + return market7.DealDurationBounds(pieceSize) } // Sets the challenge window and scales the proving period to match (such that @@ -345,6 +383,13 @@ func SetWPoStChallengeWindow(period abi.ChainEpoch) { // scale it if we're scaling the challenge period. miner6.WPoStDisputeWindow = period * 30 + miner7.WPoStChallengeWindow = period + miner7.WPoStProvingPeriod = period * abi.ChainEpoch(miner7.WPoStPeriodDeadlines) + + // by default, this is 2x finality which is 30 periods. + // scale it if we're scaling the challenge period. + miner7.WPoStDisputeWindow = period * 30 + } func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { @@ -357,15 +402,15 @@ func GetWinningPoStSectorSetLookback(nwVer network.Version) abi.ChainEpoch { } func GetMaxSectorExpirationExtension() abi.ChainEpoch { - return miner6.MaxSectorExpirationExtension + return miner7.MaxSectorExpirationExtension } func GetMinSectorExpiration() abi.ChainEpoch { - return miner6.MinSectorExpiration + return miner7.MinSectorExpiration } func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, error) { - sectorsPerPart, err := builtin6.PoStProofWindowPoStPartitionSectors(p) + sectorsPerPart, err := builtin7.PoStProofWindowPoStPartitionSectors(p) if err != nil { return 0, err } @@ -378,8 +423,8 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e func GetDefaultSectorSize() abi.SectorSize { // supported sector sizes are the same across versions. - szs := make([]abi.SectorSize, 0, len(miner6.PreCommitSealProofTypesV8)) - for spt := range miner6.PreCommitSealProofTypesV8 { + szs := make([]abi.SectorSize, 0, len(miner7.PreCommitSealProofTypesV8)) + for spt := range miner7.PreCommitSealProofTypesV8 { ss, err := spt.SectorSize() if err != nil { panic(err) @@ -404,7 +449,7 @@ func GetSectorMaxLifetime(proof abi.RegisteredSealProof, nwVer network.Version) return builtin4.SealProofPoliciesV0[proof].SectorMaxLifetime } - return builtin6.SealProofPoliciesV11[proof].SectorMaxLifetime + return builtin7.SealProofPoliciesV11[proof].SectorMaxLifetime } func GetAddressedSectorsMax(nwVer network.Version) (int, error) { @@ -432,6 +477,9 @@ func GetAddressedSectorsMax(nwVer network.Version) (int, error) { case actors.Version6: return miner6.AddressedSectorsMax, nil + case actors.Version7: + return miner7.AddressedSectorsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -469,6 +517,10 @@ func GetDeclarationsMax(nwVer network.Version) (int, error) { return miner6.DeclarationsMax, nil + case actors.Version7: + + return miner7.DeclarationsMax, nil + default: return 0, xerrors.Errorf("unsupported network version") } @@ -505,6 +557,10 @@ func AggregateProveCommitNetworkFee(nwVer network.Version, aggregateSize int, ba return miner6.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version7: + + return miner7.AggregateProveCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } @@ -541,6 +597,10 @@ func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, base return miner6.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + case actors.Version7: + + return miner7.AggregatePreCommitNetworkFee(aggregateSize, baseFee), nil + default: return big.Zero(), xerrors.Errorf("unsupported network version") } diff --git a/chain/actors/version.go b/chain/actors/version.go index 7b7a6393a..af51161c9 100644 --- a/chain/actors/version.go +++ b/chain/actors/version.go @@ -20,9 +20,9 @@ const ({{range .actorVersions}} /* inline-gen start */ -var LatestVersion = 6 +var LatestVersion = 7 -var Versions = []int{0, 2, 3, 4, 5, 6} +var Versions = []int{0, 2, 3, 4, 5, 6, 7} const ( Version0 Version = 0 @@ -31,6 +31,7 @@ const ( Version4 Version = 4 Version5 Version = 5 Version6 Version = 6 + Version7 Version = 7 ) /* inline-gen end */ @@ -50,6 +51,8 @@ func VersionForNetwork(version network.Version) (Version, error) { return Version5, nil case network.Version14: return Version6, nil + case network.Version15: + return Version7, nil default: return -1, fmt.Errorf("unsupported network version %d", version) } diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 3c333298e..847d41d47 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -28,6 +28,7 @@ import ( exported4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/exported" exported5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/exported" exported6 "github.com/filecoin-project/specs-actors/v6/actors/builtin/exported" + exported7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/exported" /* inline-gen end */ @@ -59,6 +60,7 @@ func NewActorRegistry() *vm.ActorRegistry { inv.Register(vm.ActorsVersionPredicate(actors.Version4), exported4.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version5), exported5.BuiltinActors()...) inv.Register(vm.ActorsVersionPredicate(actors.Version6), exported6.BuiltinActors()...) + inv.Register(vm.ActorsVersionPredicate(actors.Version7), exported7.BuiltinActors()...) /* inline-gen end */ diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index cf4c62bf3..43f50311f 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -156,6 +156,22 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { StopWithin: 5, }}, Expensive: true, + }, { + Height: build.UpgradeSnapDealsHeight, + Network: network.Version15, + Migration: UpgradeActorsV7, + PreMigrations: []stmgr.PreMigration{{ + PreMigration: PreUpgradeActorsV7, + StartWithin: 120, + DontStartWithin: 60, + StopWithin: 35, + }, { + PreMigration: PreUpgradeActorsV7, + StartWithin: 30, + DontStartWithin: 15, + StopWithin: 5, + }}, + Expensive: true, }, } @@ -1170,7 +1186,97 @@ func upgradeActorsV6Common( // Perform the migration newHamtRoot, err := nv14.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) if err != nil { - return cid.Undef, xerrors.Errorf("upgrading to actors v5: %w", err) + return cid.Undef, xerrors.Errorf("upgrading to actors v6: %w", err) + } + + // Persist the result. + newRoot, err := store.Put(ctx, &types.StateRoot{ + Version: types.StateTreeVersion4, + Actors: newHamtRoot, + Info: stateRoot.Info, + }) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) + } + + // Persist the new tree. + + { + from := buf + to := buf.Read() + + if err := vm.Copy(ctx, from, to, newRoot); err != nil { + return cid.Undef, xerrors.Errorf("copying migrated tree: %w", err) + } + } + + return newRoot, nil +} + +func UpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, cb stmgr.ExecMonitor, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) (cid.Cid, error) { + // Use all the CPUs except 3. + workerCount := runtime.NumCPU() - 3 + if workerCount <= 0 { + workerCount = 1 + } + + config := nv14.Config{ + MaxWorkers: uint(workerCount), + JobQueueSize: 1000, + ResultQueueSize: 100, + ProgressLogPeriod: 10 * time.Second, + } + + newRoot, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) + if err != nil { + return cid.Undef, xerrors.Errorf("migrating actors v6 state: %w", err) + } + + return newRoot, nil +} + +func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet) error { + // Use half the CPUs for pre-migration, but leave at least 3. + workerCount := runtime.NumCPU() + if workerCount <= 4 { + workerCount = 1 + } else { + workerCount /= 2 + } + + //TODO: nv15 + config := nv14.Config{MaxWorkers: uint(workerCount)} + _, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) + return err +} + +func upgradeActorsV7Common( + ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, + root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, + //TODO: nv15 + config nv14.Config, +) (cid.Cid, error) { + buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) + store := store.ActorStore(ctx, buf) + + // Load the state root. + var stateRoot types.StateRoot + if err := store.Get(ctx, root, &stateRoot); err != nil { + return cid.Undef, xerrors.Errorf("failed to decode state root: %w", err) + } + + if stateRoot.Version != types.StateTreeVersion4 { + return cid.Undef, xerrors.Errorf( + "expected state root version 4 for actors v7 upgrade, got %d", + stateRoot.Version, + ) + } + + // Perform the migration + //TODO: nv15 + newHamtRoot, err := nv14.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) + if err != nil { + return cid.Undef, xerrors.Errorf("upgrading to actors v7: %w", err) } // Persist the result. diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 69ab32d58..60dd142e9 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -9,6 +9,8 @@ import ( "sync/atomic" "time" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/go-state-types/network" @@ -686,6 +688,10 @@ func (m genFakeVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri panic("not supported") } +func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + panic("not supported") +} + func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index edacfe304..666912058 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -6,6 +6,8 @@ import ( "fmt" "math/rand" + runtime7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" "github.com/ipfs/go-cid" @@ -29,7 +31,6 @@ import ( market4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" power4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" reward4 "github.com/filecoin-project/specs-actors/v4/actors/builtin/reward" - runtime5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" @@ -57,7 +58,7 @@ func MinerAddress(genesisIndex uint64) address.Address { } type fakedSigSyscalls struct { - runtime5.Syscalls + runtime7.Syscalls } func (fss *fakedSigSyscalls) VerifySignature(signature crypto.Signature, signer address.Address, plaintext []byte) error { @@ -65,7 +66,7 @@ func (fss *fakedSigSyscalls) VerifySignature(signature crypto.Signature, signer } func mkFakedSigSyscalls(base vm.SyscallBuilder) vm.SyscallBuilder { - return func(ctx context.Context, rt *vm.Runtime) runtime5.Syscalls { + return func(ctx context.Context, rt *vm.Runtime) runtime7.Syscalls { return &fakedSigSyscalls{ base(ctx, rt), } diff --git a/chain/state/statetree.go b/chain/state/statetree.go index f230f7faa..9a518a622 100644 --- a/chain/state/statetree.go +++ b/chain/state/statetree.go @@ -159,7 +159,7 @@ func VersionForNetwork(ver network.Version) (types.StateTreeVersion, error) { /* inline-gen start */ - case network.Version13, network.Version14: + case network.Version13, network.Version14, network.Version15: /* inline-gen end */ return types.StateTreeVersion4, nil diff --git a/chain/vm/gas.go b/chain/vm/gas.go index 206a55d36..27d9c8d94 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -3,13 +3,14 @@ package vm import ( "fmt" + vmr "github.com/filecoin-project/specs-actors/v7/actors/runtime" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-address" addr "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/build" - vmr5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/ipfs/go-cid" ) @@ -73,9 +74,10 @@ type Pricelist interface { OnVerifySignature(sigType crypto.SigType, planTextSize int) (GasCharge, error) OnHashing(dataSize int) GasCharge OnComputeUnsealedSectorCid(proofType abi.RegisteredSealProof, pieces []abi.PieceInfo) GasCharge - OnVerifySeal(info proof5.SealVerifyInfo) GasCharge - OnVerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) GasCharge - OnVerifyPost(info proof5.WindowPoStVerifyInfo) GasCharge + OnVerifySeal(info proof7.SealVerifyInfo) GasCharge + OnVerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) GasCharge + OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge + OnVerifyPost(info proof7.WindowPoStVerifyInfo) GasCharge OnVerifyConsensusFault() GasCharge } @@ -227,7 +229,7 @@ func PricelistByEpoch(epoch abi.ChainEpoch) Pricelist { } type pricedSyscalls struct { - under vmr5.Syscalls + under vmr.Syscalls pl Pricelist chargeGas func(GasCharge) } @@ -261,7 +263,7 @@ func (ps pricedSyscalls) ComputeUnsealedSectorCID(reg abi.RegisteredSealProof, p } // Verifies a sector seal proof. -func (ps pricedSyscalls) VerifySeal(vi proof5.SealVerifyInfo) error { +func (ps pricedSyscalls) VerifySeal(vi proof7.SealVerifyInfo) error { ps.chargeGas(ps.pl.OnVerifySeal(vi)) defer ps.chargeGas(gasOnActorExec) @@ -269,7 +271,7 @@ func (ps pricedSyscalls) VerifySeal(vi proof5.SealVerifyInfo) error { } // Verifies a proof of spacetime. -func (ps pricedSyscalls) VerifyPoSt(vi proof5.WindowPoStVerifyInfo) error { +func (ps pricedSyscalls) VerifyPoSt(vi proof7.WindowPoStVerifyInfo) error { ps.chargeGas(ps.pl.OnVerifyPost(vi)) defer ps.chargeGas(gasOnActorExec) @@ -286,14 +288,14 @@ func (ps pricedSyscalls) VerifyPoSt(vi proof5.WindowPoStVerifyInfo) error { // the "parent grinding fault", in which case it must be the sibling of h1 (same parent tipset) and one of the // blocks in the parent of h2 (i.e. h2's grandparent). // Returns nil and an error if the headers don't prove a fault. -func (ps pricedSyscalls) VerifyConsensusFault(h1 []byte, h2 []byte, extra []byte) (*vmr5.ConsensusFault, error) { +func (ps pricedSyscalls) VerifyConsensusFault(h1 []byte, h2 []byte, extra []byte) (*vmr.ConsensusFault, error) { ps.chargeGas(ps.pl.OnVerifyConsensusFault()) defer ps.chargeGas(gasOnActorExec) return ps.under.VerifyConsensusFault(h1, h2, extra) } -func (ps pricedSyscalls) BatchVerifySeals(inp map[address.Address][]proof5.SealVerifyInfo) (map[address.Address][]bool, error) { +func (ps pricedSyscalls) BatchVerifySeals(inp map[address.Address][]proof7.SealVerifyInfo) (map[address.Address][]bool, error) { count := int64(0) for _, svis := range inp { count += int64(len(svis)) @@ -307,9 +309,16 @@ func (ps pricedSyscalls) BatchVerifySeals(inp map[address.Address][]proof5.SealV return ps.under.BatchVerifySeals(inp) } -func (ps pricedSyscalls) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) error { +func (ps pricedSyscalls) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) error { ps.chargeGas(ps.pl.OnVerifyAggregateSeals(aggregate)) defer ps.chargeGas(gasOnActorExec) return ps.under.VerifyAggregateSeals(aggregate) } + +func (ps pricedSyscalls) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) error { + ps.chargeGas(ps.pl.OnVerifyReplicaUpdate(update)) + defer ps.chargeGas(gasOnActorExec) + + return ps.under.VerifyReplicaUpdate(update) +} diff --git a/chain/vm/gas_v0.go b/chain/vm/gas_v0.go index 13c5fdd86..548227a33 100644 --- a/chain/vm/gas_v0.go +++ b/chain/vm/gas_v0.go @@ -3,8 +3,7 @@ package vm import ( "fmt" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" @@ -206,14 +205,14 @@ func (pl *pricelistV0) OnComputeUnsealedSectorCid(proofType abi.RegisteredSealPr } // OnVerifySeal -func (pl *pricelistV0) OnVerifySeal(info proof2.SealVerifyInfo) GasCharge { +func (pl *pricelistV0) OnVerifySeal(info proof7.SealVerifyInfo) GasCharge { // TODO: this needs more cost tunning, check with @lotus // this is not used return newGasCharge("OnVerifySeal", pl.verifySealBase, 0) } // OnVerifyAggregateSeals -func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) GasCharge { +func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) GasCharge { proofType := aggregate.SealProof perProof, ok := pl.verifyAggregateSealPer[proofType] if !ok { @@ -228,8 +227,14 @@ func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof5.AggregateSealVeri return newGasCharge("OnVerifyAggregateSeals", perProof*num+step.Lookup(num), 0) } +// OnVerifyReplicaUpdate +func (pl *pricelistV0) OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge { + // TODO: do the thing + return GasCharge{} +} + // OnVerifyPost -func (pl *pricelistV0) OnVerifyPost(info proof2.WindowPoStVerifyInfo) GasCharge { +func (pl *pricelistV0) OnVerifyPost(info proof7.WindowPoStVerifyInfo) GasCharge { sectorSize := "unknown" var proofType abi.RegisteredPoStProof diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index 85357e51b..8a7a4c8c9 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -16,7 +16,7 @@ import ( cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" - vmr "github.com/filecoin-project/specs-actors/v5/actors/runtime" + vmr "github.com/filecoin-project/specs-actors/v7/actors/runtime" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" diff --git a/chain/vm/mkactor.go b/chain/vm/mkactor.go index ea49abff3..5716b5006 100644 --- a/chain/vm/mkactor.go +++ b/chain/vm/mkactor.go @@ -26,6 +26,7 @@ import ( builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin" builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin" + builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin" /* inline-gen end */ @@ -130,6 +131,8 @@ func newAccountActor(ver actors.Version) *types.Actor { code = builtin5.AccountActorCodeID case actors.Version6: code = builtin6.AccountActorCodeID + case actors.Version7: + code = builtin7.AccountActorCodeID /* inline-gen end */ default: panic("unsupported actors version") diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 6e94030bd..583c99593 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -17,7 +17,7 @@ import ( rtt "github.com/filecoin-project/go-state-types/rt" rt0 "github.com/filecoin-project/specs-actors/actors/runtime" rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" + rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" "go.opencensus.io/trace" @@ -55,8 +55,8 @@ func (m *Message) ValueReceived() abi.TokenAmount { var EnableGasTracing = false type Runtime struct { - rt5.Message - rt5.Syscalls + rt7.Message + rt7.Syscalls ctx context.Context @@ -142,7 +142,7 @@ func (rt *Runtime) StorePut(x cbor.Marshaler) cid.Cid { var _ rt0.Runtime = (*Runtime)(nil) var _ rt5.Runtime = (*Runtime)(nil) -var _ rt6.Runtime = (*Runtime)(nil) +var _ rt7.Runtime = (*Runtime)(nil) func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.ActorError) { defer func() { diff --git a/chain/vm/syscalls.go b/chain/vm/syscalls.go index 0cbefd1fd..b8c027bd7 100644 --- a/chain/vm/syscalls.go +++ b/chain/vm/syscalls.go @@ -7,6 +7,8 @@ import ( goruntime "runtime" "sync" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/minio/blake2b-simd" @@ -26,8 +28,8 @@ import ( "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" "github.com/filecoin-project/lotus/lib/sigs" - runtime5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + runtime7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" ) func init() { @@ -36,10 +38,10 @@ func init() { // Actual type is defined in chain/types/vmcontext.go because the VMContext interface is there -type SyscallBuilder func(ctx context.Context, rt *Runtime) runtime5.Syscalls +type SyscallBuilder func(ctx context.Context, rt *Runtime) runtime7.Syscalls func Syscalls(verifier ffiwrapper.Verifier) SyscallBuilder { - return func(ctx context.Context, rt *Runtime) runtime5.Syscalls { + return func(ctx context.Context, rt *Runtime) runtime7.Syscalls { return &syscallShim{ ctx: ctx, @@ -90,7 +92,7 @@ func (ss *syscallShim) HashBlake2b(data []byte) [32]byte { // Checks validity of the submitted consensus fault with the two block headers needed to prove the fault // and an optional extra one to check common ancestry (as needed). // Note that the blocks are ordered: the method requires a.Epoch() <= b.Epoch(). -func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.ConsensusFault, error) { +func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime7.ConsensusFault, error) { // Note that block syntax is not validated. Any validly signed block will be accepted pursuant to the below conditions. // Whether or not it could ever have been accepted in a chain is not checked/does not matter here. // for that reason when checking block parent relationships, rather than instantiating a Tipset to do so @@ -133,14 +135,14 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.Conse } // (2) check for the consensus faults themselves - var consensusFault *runtime5.ConsensusFault + var consensusFault *runtime7.ConsensusFault // (a) double-fork mining fault if blockA.Height == blockB.Height { - consensusFault = &runtime5.ConsensusFault{ + consensusFault = &runtime7.ConsensusFault{ Target: blockA.Miner, Epoch: blockB.Height, - Type: runtime5.ConsensusFaultDoubleForkMining, + Type: runtime7.ConsensusFaultDoubleForkMining, } } @@ -148,10 +150,10 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.Conse // strictly speaking no need to compare heights based on double fork mining check above, // but at same height this would be a different fault. if types.CidArrsEqual(blockA.Parents, blockB.Parents) && blockA.Height != blockB.Height { - consensusFault = &runtime5.ConsensusFault{ + consensusFault = &runtime7.ConsensusFault{ Target: blockA.Miner, Epoch: blockB.Height, - Type: runtime5.ConsensusFaultTimeOffsetMining, + Type: runtime7.ConsensusFaultTimeOffsetMining, } } @@ -171,10 +173,10 @@ func (ss *syscallShim) VerifyConsensusFault(a, b, extra []byte) (*runtime5.Conse if types.CidArrsEqual(blockA.Parents, blockC.Parents) && blockA.Height == blockC.Height && types.CidArrsContains(blockB.Parents, blockC.Cid()) && !types.CidArrsContains(blockB.Parents, blockA.Cid()) { - consensusFault = &runtime5.ConsensusFault{ + consensusFault = &runtime7.ConsensusFault{ Target: blockA.Miner, Epoch: blockB.Height, - Type: runtime5.ConsensusFaultParentGrinding, + Type: runtime7.ConsensusFaultParentGrinding, } } } @@ -286,6 +288,7 @@ func (ss *syscallShim) VerifyAggregateSeals(aggregate proof5.AggregateSealVerify if err != nil { return xerrors.Errorf("failed to verify aggregated PoRep: %w", err) } + if !ok { return fmt.Errorf("invalid aggregate proof") } @@ -293,6 +296,19 @@ func (ss *syscallShim) VerifyAggregateSeals(aggregate proof5.AggregateSealVerify return nil } +func (ss *syscallShim) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) error { + ok, err := ss.verifier.VerifyReplicaUpdate(update) + if err != nil { + return xerrors.Errorf("failed to verify replica update: %w", err) + } + + if !ok { + return fmt.Errorf("invalid replica update") + } + + return nil +} + func (ss *syscallShim) VerifySignature(sig crypto.Signature, addr address.Address, input []byte) error { // TODO: in genesis setup, we are currently faking signatures diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index f4cc0f837..7d5e993a0 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -5,10 +5,11 @@ import ( "context" "errors" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/ipfs/go-datastore" "github.com/minio/blake2b-simd" cbg "github.com/whyrusleeping/cbor-gen" @@ -97,8 +98,12 @@ func (cv *cachingVerifier) GenerateWinningPoStSectorChallenge(ctx context.Contex return cv.backend.GenerateWinningPoStSectorChallenge(ctx, proofType, a, rnd, u) } -func (cv cachingVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (cv cachingVerifier) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) (bool, error) { return cv.backend.VerifyAggregateSeals(aggregate) } +func (cv cachingVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return cv.backend.VerifyReplicaUpdate(update) +} + var _ ffiwrapper.Verifier = (*cachingVerifier)(nil) diff --git a/cmd/lotus-sim/simulation/mock/mock.go b/cmd/lotus-sim/simulation/mock/mock.go index 38648f758..7656aaa28 100644 --- a/cmd/lotus-sim/simulation/mock/mock.go +++ b/cmd/lotus-sim/simulation/mock/mock.go @@ -6,6 +6,8 @@ import ( "encoding/binary" "fmt" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" @@ -70,6 +72,12 @@ func (mockVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPro ) return false, nil } + +// TODO: do the thing +func (mockVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return false, nil +} + func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { panic("should not be called") } diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 4d9530821..42bb945d0 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -4698,7 +4698,7 @@ Inputs: ] ``` -Response: `14` +Response: `15` ### StateReadState StateReadState returns the indicated actor's state. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index b03f75e9d..3578a4492 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -4948,7 +4948,7 @@ Inputs: ] ``` -Response: `14` +Response: `15` ### StateReadState StateReadState returns the indicated actor's state. diff --git a/extern/sector-storage/ffiwrapper/types.go b/extern/sector-storage/ffiwrapper/types.go index a5b2fdf1f..1da7ea832 100644 --- a/extern/sector-storage/ffiwrapper/types.go +++ b/extern/sector-storage/ffiwrapper/types.go @@ -4,6 +4,8 @@ import ( "context" "io" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/ipfs/go-cid" @@ -36,6 +38,7 @@ type Storage interface { type Verifier interface { VerifySeal(proof5.SealVerifyInfo) (bool, error) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) + VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index ff35ddc1f..37256b26f 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -6,6 +6,8 @@ package ffiwrapper import ( "context" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "go.opencensus.io/trace" "golang.org/x/xerrors" @@ -120,6 +122,11 @@ func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPr return ffi.VerifyAggregateSeals(aggregate) } +func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + //TODO: do the thing + return false, nil +} + func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 273f0928e..8fb356d0b 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -10,6 +10,8 @@ import ( "math/rand" "sync" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" @@ -547,6 +549,11 @@ func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri return ok, nil } +// TODO: do the thing +func (m mockVerifProver) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { + return false, nil +} + func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { out := make([]byte, m.aggLen(len(aggregateInfo.Infos))) // todo: figure out more real length for pi, proof := range proofs { diff --git a/gen/inlinegen-data.json b/gen/inlinegen-data.json index e26b1b28f..ef97db651 100644 --- a/gen/inlinegen-data.json +++ b/gen/inlinegen-data.json @@ -1,7 +1,7 @@ { - "actorVersions": [0, 2, 3, 4, 5, 6], - "latestActorsVersion": 6, + "actorVersions": [0, 2, 3, 4, 5, 6, 7], + "latestActorsVersion": 7, - "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], - "latestNetworkVersion": 14 + "networkVersions": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + "latestNetworkVersion": 15 } diff --git a/go.mod b/go.mod index 37e6bb916..fd898ab5f 100644 --- a/go.mod +++ b/go.mod @@ -50,6 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index 6019140fc..c9f2d33cb 100644 --- a/go.sum +++ b/go.sum @@ -391,8 +391,13 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5 h1:8SCNu2TkLCfsS8BpRfeOVt5e4pw2Ej3GInDlFEWqKHo= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 h1:5sswsw6rhw/JFG5+xU4En5na4K5QPf3jZ33zvAzGrY8= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/itests/kit/ensemble_opts_nv.go b/itests/kit/ensemble_opts_nv.go index 0d7d87e6a..45ed51443 100644 --- a/itests/kit/ensemble_opts_nv.go +++ b/itests/kit/ensemble_opts_nv.go @@ -49,12 +49,12 @@ func LatestActorsAt(upgradeHeight abi.ChainEpoch) EnsembleOpt { }) /* inline-gen start */ return UpgradeSchedule(stmgr.Upgrade{ - Network: network.Version13, + Network: network.Version14, Height: -1, }, stmgr.Upgrade{ - Network: network.Version14, + Network: network.Version15, Height: upgradeHeight, - Migration: filcns.UpgradeActorsV6, + Migration: filcns.UpgradeActorsV7, }) /* inline-gen end */ } diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json index c0f69d58c..1f6191a94 100644 --- a/lotuspond/front/src/chain/methods.json +++ b/lotuspond/front/src/chain/methods.json @@ -622,5 +622,112 @@ "AddVerifiedClient", "UseBytes", "RestoreBytes" + ], + "fil/7/account": [ + "Send", + "Constructor", + "PubkeyAddress" + ], + "fil/7/cron": [ + "Send", + "Constructor", + "EpochTick" + ], + "fil/7/init": [ + "Send", + "Constructor", + "Exec" + ], + "fil/7/multisig": [ + "Send", + "Constructor", + "Propose", + "Approve", + "Cancel", + "AddSigner", + "RemoveSigner", + "SwapSigner", + "ChangeNumApprovalsThreshold", + "LockBalance" + ], + "fil/7/paymentchannel": [ + "Send", + "Constructor", + "UpdateChannelState", + "Settle", + "Collect" + ], + "fil/7/reward": [ + "Send", + "Constructor", + "AwardBlockReward", + "ThisEpochReward", + "UpdateNetworkKPI" + ], + "fil/7/storagemarket": [ + "Send", + "Constructor", + "AddBalance", + "WithdrawBalance", + "PublishStorageDeals", + "VerifyDealsForActivation", + "ActivateDeals", + "OnMinerSectorsTerminate", + "ComputeDataCommitment", + "CronTick" + ], + "fil/7/storageminer": [ + "Send", + "Constructor", + "ControlAddresses", + "ChangeWorkerAddress", + "ChangePeerID", + "SubmitWindowedPoSt", + "PreCommitSector", + "ProveCommitSector", + "ExtendSectorExpiration", + "TerminateSectors", + "DeclareFaults", + "DeclareFaultsRecovered", + "OnDeferredCronEvent", + "CheckSectorProven", + "ApplyRewards", + "ReportConsensusFault", + "WithdrawBalance", + "ConfirmSectorProofsValid", + "ChangeMultiaddrs", + "CompactPartitions", + "CompactSectorNumbers", + "ConfirmUpdateWorkerKey", + "RepayDebt", + "ChangeOwnerAddress", + "DisputeWindowedPoSt", + "PreCommitSectorBatch", + "ProveCommitAggregate", + "ProveReplicaUpdates" + ], + "fil/7/storagepower": [ + "Send", + "Constructor", + "CreateMiner", + "UpdateClaimedPower", + "EnrollCronEvent", + "OnEpochTickEnd", + "UpdatePledgeTotal", + "SubmitPoRepForBulkVerify", + "CurrentTotalPower" + ], + "fil/7/system": [ + "Send", + "Constructor" + ], + "fil/7/verifiedregistry": [ + "Send", + "Constructor", + "AddVerifier", + "RemoveVerifier", + "AddVerifiedClient", + "UseBytes", + "RestoreBytes" ] } \ No newline at end of file diff --git a/storage/wdpost_run_test.go b/storage/wdpost_run_test.go index 78d9431d4..9ece295ca 100644 --- a/storage/wdpost_run_test.go +++ b/storage/wdpost_run_test.go @@ -5,6 +5,8 @@ import ( "context" "testing" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" @@ -22,12 +24,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/go-state-types/network" - builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" - miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" - tutils "github.com/filecoin-project/specs-actors/v2/support/testing" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -35,6 +31,10 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" "github.com/filecoin-project/lotus/journal" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" + miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" + proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + tutils "github.com/filecoin-project/specs-actors/v2/support/testing" ) type mockStorageMinerAPI struct { @@ -149,7 +149,11 @@ func (m mockVerif) VerifyWindowPoSt(ctx context.Context, info proof2.WindowPoStV return true, nil } -func (m mockVerif) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (m mockVerif) VerifyAggregateSeals(aggregate proof7.AggregateSealVerifyProofAndInfos) (bool, error) { + panic("implement me") +} + +func (m mockVerif) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { panic("implement me") } diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 7f4a53630..fdf53cfc2 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -3,15 +3,15 @@ module github.com/filecoin-project/lotus/testplans/lotus-soup go 1.16 require ( - contrib.go.opencensus.io/exporter/prometheus v0.1.0 + contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.2.1 - github.com/filecoin-project/go-address v0.0.5 - github.com/filecoin-project/go-data-transfer v1.10.1 - github.com/filecoin-project/go-fil-markets v1.12.0 - github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec - github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 + github.com/filecoin-project/go-address v0.0.6 + github.com/filecoin-project/go-data-transfer v1.11.4 + github.com/filecoin-project/go-fil-markets v1.13.3 + github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/specs-actors v0.9.14 @@ -21,17 +21,17 @@ require ( github.com/influxdata/influxdb v1.9.4 // indirect github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-datastore v0.4.6 - github.com/ipfs/go-ipfs-files v0.0.8 + github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.3.2 + github.com/ipfs/go-merkledag v0.4.1 github.com/ipfs/go-unixfs v0.2.6 - github.com/ipld/go-car v0.3.1-null-padded-files + github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c github.com/libp2p/go-libp2p v0.15.0 github.com/libp2p/go-libp2p-core v0.9.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 - github.com/multiformats/go-multiaddr v0.4.0 + github.com/multiformats/go-multiaddr v0.4.1 github.com/testground/sdk-go v0.2.6 go.opencensus.io v0.23.0 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index b6246d634..b31a93753 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -38,8 +38,10 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= +contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -80,6 +82,7 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -90,10 +93,12 @@ github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/ github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Kubuxu/imtui v0.0.0-20210401140320-41663d68d0fa h1:1PPxEyGdIGVkX/kqMvLJ95a1dGS1Sz7tpNEgehEYYt0= @@ -115,6 +120,7 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -146,7 +152,9 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= @@ -159,12 +167,15 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.29.16/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.32.11/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.1.5/go.mod h1:P3F1hku7qzC81txjwXnwOM6Ex6ezkU6+/557Teyb64E= github.com/aws/aws-sdk-go-v2/credentials v1.1.5/go.mod h1:Ir1R6tPiR1/2y1hes8yOijFMz54hzSmgcmCDo6F45Qc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.6/go.mod h1:0+fWMitrmIpENiY8/1DyhdYPUCAPvd9UNz9mtCsEoLQ= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.1.2/go.mod h1:Azf567f5wBUfUbwpyJJnLM/geFFIzEulGR30L+nQZOE= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.0.4/go.mod h1:BCfU3Uo2fhKcMZFp9zU5QQGQxqWCOYmZ/27Dju3S/do= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.6/go.mod h1:L0KWr0ASo83PRZu9NaZaDsw3koS6PspKv137DMDZjHo= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.2.2/go.mod h1:nnutjMLuna0s3GVY/MAkpLX03thyNER06gXvnMAPj5g= @@ -172,6 +183,7 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.5.0/go.mod h1:uwA7gs93Qcss43astPUb1eq github.com/aws/aws-sdk-go-v2/service/sso v1.1.5/go.mod h1:bpGz0tidC4y39sZkQSkpO/J0tzWCMXHbw6FZ0j1GkWM= github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7ypfil/BIlgmQnCSW4DistU= github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= @@ -214,10 +226,12 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4= github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cactus/go-statsd-client/statsd v0.0.0-20191106001114-12b4e2b38748/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -228,6 +242,7 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= @@ -239,6 +254,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -271,6 +287,7 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pq github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4PxnR5lg= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= @@ -346,10 +363,12 @@ github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7j github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/go-sysinfo v1.3.0 h1:eb2XFGTMlSwG/yyU9Y8jVAYLIzU2sFzWXwo2gmetyrE= github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/gosigar v0.12.0 h1:AsdhYCJlTudhfOYQyFNgx+fIVTfrDO0V1ST0vHgiapU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -358,6 +377,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etclabscore/go-jsonschema-walk v0.0.6/go.mod h1:VdfDY72AFAiUhy0ZXEaWSpveGjMT5JcDIm903NGqFwQ= @@ -369,12 +389,15 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5 h1:SSaFT/5aLfPXycUlFyemoHYhRgdyXClXCyDdNJKPlDM= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= +github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= @@ -386,14 +409,18 @@ github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= github.com/filecoin-project/go-data-transfer v1.10.1 h1:YQNLwhizxkdfFxegAyrnn3l7WjgMjqDlqFzr18iWiYI= github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= +github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -405,6 +432,7 @@ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0 github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.12.0 h1:RpU5bLaMADVrU4CgLxKMGHC2ZUocNV35uINxogQCf00= github.com/filecoin-project/go-fil-markets v1.12.0/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= +github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -414,10 +442,12 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AG github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= @@ -428,6 +458,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e h1:XAgb6HmgXaGRklNjhZoNMSIYriKLqjWXIqYMotg6iSs= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -454,6 +486,9 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= +github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211104150953-8bd473fc487a/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= @@ -467,6 +502,7 @@ github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= @@ -475,6 +511,7 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= +github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= @@ -500,15 +537,19 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -581,6 +622,7 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -609,6 +651,7 @@ github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQn github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -627,6 +670,7 @@ github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRs github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= @@ -637,6 +681,7 @@ github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -670,6 +715,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws= github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -687,6 +733,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -759,16 +806,21 @@ github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4n github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= @@ -796,12 +848,15 @@ github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -810,6 +865,8 @@ github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0 github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= +github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= +github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -823,6 +880,7 @@ github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3 h1:k3/6a1Shi7GGCp9QpyYuXsMM6ncTOjCzOE9Fd6CDA+Q= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= @@ -852,6 +910,7 @@ github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYI github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5 h1:euqZu96CCbToPyYVwVshu8ENURi8BhFd7FUFfTLi+fQ= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= +github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -910,10 +969,13 @@ github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqis github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= github.com/ipfs/go-graphsync v0.9.1 h1:jo7ZaAZ3lal89RhKxKoRkPzIO8lmOY6KUWA1mDRZ2+U= github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= +github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= @@ -943,6 +1005,7 @@ github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjN github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= +github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= @@ -966,6 +1029,7 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -993,6 +1057,7 @@ github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2 h1:MRqj40QkrWkvPswXs4EfSslhZ4RVPRbxwX11js0t1xY= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= @@ -1003,6 +1068,7 @@ github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3 github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0 h1:2cSr7exUGKYyDeUyQ7P/nHPs9P7Ht/B+ROrpN1EJOjc= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= @@ -1022,6 +1088,7 @@ github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6 github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= github.com/ipld/go-car v0.3.1-null-padded-files h1:FMD0Ce4tAM9P5aq7yklw2jnVK3ZuoJ4xK6vkL9VLmxs= github.com/ipld/go-car v0.3.1-null-padded-files/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= +github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= @@ -1034,13 +1101,18 @@ github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVI github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= +github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1086,6 +1158,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= @@ -1117,6 +1190,8 @@ github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -1324,6 +1399,7 @@ github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= github.com/libp2p/go-libp2p-peerstore v0.2.9 h1:tVa7siDymmzOl3b3+SxPYpQUCnicmK13y6Re1PqWK+g= github.com/libp2p/go-libp2p-peerstore v0.2.9/go.mod h1:zhBaLzxiWpNGQ3+uI17G/OIjmOD8GxKyFuHbrZbgs0w= +github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= @@ -1333,6 +1409,7 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1507,6 +1584,7 @@ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1542,6 +1620,7 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1553,6 +1632,7 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1590,6 +1670,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4S github.com/mileusna/useragent v0.0.0-20190129205925-3e331f0949a5/go.mod h1:JWhYAp2EXqUtsxTKdeGlY8Wp44M7VxThC9FEoNGi2IE= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1598,6 +1680,7 @@ github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1608,10 +1691,12 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= @@ -1622,6 +1707,7 @@ github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1637,6 +1723,7 @@ github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWz github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0 h1:hL/K4ZJhJ5PTw3nwylq9lGU5yArzcAroZmex1ghSEkQ= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= +github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1673,6 +1760,7 @@ github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUj github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1692,10 +1780,16 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= @@ -1705,6 +1799,7 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -1758,6 +1853,7 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -1766,6 +1862,7 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -1789,6 +1886,7 @@ github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1825,6 +1923,7 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= @@ -1845,6 +1944,7 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= +github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= @@ -1957,7 +2057,9 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1993,6 +2095,7 @@ github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixU github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.28.0+incompatible h1:G4QSBfvPKvg5ZM2j9MrJFdfI5iSljY/WnJqOGFao6HI= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= @@ -2045,6 +2148,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= @@ -2103,6 +2207,10 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -2140,6 +2248,7 @@ go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2155,9 +2264,11 @@ go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= @@ -2187,6 +2298,7 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2195,6 +2307,7 @@ golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2206,12 +2319,15 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e h1:VvfwVmMH40bpMeizC9/K7ipM5Qjucuu16RWfneFPyhQ= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2247,6 +2363,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= @@ -2329,8 +2446,10 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2367,6 +2486,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2399,6 +2519,7 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2454,6 +2575,8 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2465,6 +2588,7 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2486,6 +2610,7 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2518,6 +2643,7 @@ golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2566,6 +2692,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2651,6 +2778,8 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -2678,6 +2807,7 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -2774,6 +2904,7 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From 07f1be0ff6634d9329f1736e5a8162fd18e51a4b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 16 Nov 2021 19:09:10 -0500 Subject: [PATCH 002/157] Plug in the FFI call --- extern/filecoin-ffi | 2 +- extern/sector-storage/ffiwrapper/verifier_cgo.go | 4 ++-- go.mod | 2 +- go.sum | 7 +++---- itests/ccupgrade_test.go | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 791238933..e8857b32c 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 7912389334e347bbb2eac0520c836830875c39de +Subproject commit e8857b32c348d92258d1452f1e8738ff03d72c6d diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 37256b26f..5d537870d 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -123,8 +123,8 @@ func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPr } func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { - //TODO: do the thing - return false, nil + v := ffi.FunctionsSectorUpdate{} + return v.VerifyUpdateProof(update.UpdateProof, update.Proof, update.OldSealedSectorCID, update.NewSealedSectorCID, update.NewUnsealedSectorCID) } func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { diff --git a/go.mod b/go.mod index fd898ab5f..1202fd200 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index c9f2d33cb..7747074b9 100644 --- a/go.sum +++ b/go.sum @@ -363,6 +363,7 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20211102152656-6027e22b77fd/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= @@ -394,10 +395,8 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5 h1:8SCNu2TkLCfsS8BpRfeOVt5e4pw2Ej3GInDlFEWqKHo= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211109185520-8807da1012c5/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4 h1:5sswsw6rhw/JFG5+xU4En5na4K5QPf3jZ33zvAzGrY8= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211110223913-e2abd33b42d4/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad h1:uUl9I4MCOAkbrY/JI3y6Php3t5c3tu1nux5VkCBwO4E= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index c5b380835..12bc1fc86 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -32,7 +32,7 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { ctx := context.Background() blockTime := 5 * time.Millisecond - client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.LatestActorsAt(upgradeHeight)) + client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.TurboUpgradeAt(upgradeHeight)) ens.InterconnectAll().BeginMining(blockTime) maddr, err := miner.ActorAddress(ctx) From 8665e32221cd1e73435d8a62f9718a655590ea4c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 12:41:42 -0500 Subject: [PATCH 003/157] Update deps --- chain/consensus/filcns/upgrades.go | 12 +++++------- extern/filecoin-ffi | 2 +- extern/sector-storage/ffiwrapper/verifier_cgo.go | 3 +-- extern/sector-storage/mock/mock.go | 3 +-- go.mod | 2 +- go.sum | 6 ++---- itests/ccupgrade_test.go | 1 + itests/wdpost_test.go | 2 +- 8 files changed, 13 insertions(+), 18 deletions(-) diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 43f50311f..a8e85d78f 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -6,6 +6,7 @@ import ( "time" "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" @@ -1220,7 +1221,7 @@ func UpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr.Mi workerCount = 1 } - config := nv14.Config{ + config := nv15.Config{ MaxWorkers: uint(workerCount), JobQueueSize: 1000, ResultQueueSize: 100, @@ -1244,8 +1245,7 @@ func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr workerCount /= 2 } - //TODO: nv15 - config := nv14.Config{MaxWorkers: uint(workerCount)} + config := nv15.Config{MaxWorkers: uint(workerCount)} _, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) return err } @@ -1253,8 +1253,7 @@ func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr func upgradeActorsV7Common( ctx context.Context, sm *stmgr.StateManager, cache stmgr.MigrationCache, root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, - //TODO: nv15 - config nv14.Config, + config nv15.Config, ) (cid.Cid, error) { buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) store := store.ActorStore(ctx, buf) @@ -1273,8 +1272,7 @@ func upgradeActorsV7Common( } // Perform the migration - //TODO: nv15 - newHamtRoot, err := nv14.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) + newHamtRoot, err := nv15.MigrateStateTree(ctx, store, stateRoot.Actors, epoch, config, migrationLogger{}, cache) if err != nil { return cid.Undef, xerrors.Errorf("upgrading to actors v7: %w", err) } diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index e8857b32c..fe2a31757 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit e8857b32c348d92258d1452f1e8738ff03d72c6d +Subproject commit fe2a317571931b31fb1ca6dd2adf1414e375b902 diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 5d537870d..94e04f26a 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -123,8 +123,7 @@ func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyPr } func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { - v := ffi.FunctionsSectorUpdate{} - return v.VerifyUpdateProof(update.UpdateProof, update.Proof, update.OldSealedSectorCID, update.NewSealedSectorCID, update.NewUnsealedSectorCID) + return ffi.SectorUpdate.VerifyUpdateProof(update) } func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 8fb356d0b..64568dc2d 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -549,9 +549,8 @@ func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri return ok, nil } -// TODO: do the thing func (m mockVerifProver) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { - return false, nil + return true, nil } func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { diff --git a/go.mod b/go.mod index 1202fd200..e0dc40583 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index 7747074b9..b91544f8d 100644 --- a/go.sum +++ b/go.sum @@ -363,7 +363,6 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20211102152656-6027e22b77fd/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= @@ -389,14 +388,13 @@ github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008 github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad h1:uUl9I4MCOAkbrY/JI3y6Php3t5c3tu1nux5VkCBwO4E= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211116235548-301b685341ad/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 h1:H10WnEAJQH3JwHyaHwMEgaaj00z+/QMCb9Sjd/SUW1w= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 12bc1fc86..b5ca41416 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/require" ) +// TODO: This needs to be repurposed into a SnapDeals test suite func TestCCUpgrade(t *testing.T) { kit.QuietMiningLogs() diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index d87059bb4..b1420e6a3 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -23,7 +23,7 @@ import ( ) func TestWindowedPost(t *testing.T) { - kit.Expensive(t) + //kit.Expensive(t) kit.QuietMiningLogs() From 91fb1114624e56f5d4fd86e29998ae509c0a1ff1 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 17:50:36 -0500 Subject: [PATCH 004/157] Update FFI --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index fe2a31757..58c014a42 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit fe2a317571931b31fb1ca6dd2adf1414e375b902 +Subproject commit 58c014a42b7a21e73560879841a71e679126a852 From a5847fd06f34325d240fda97f4c758a94957873e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 20:33:18 -0500 Subject: [PATCH 005/157] Update actors --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index e0dc40583..ce52b7975 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 diff --git a/go.sum b/go.sum index b91544f8d..06341ce01 100644 --- a/go.sum +++ b/go.sum @@ -393,8 +393,9 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4U github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9 h1:H10WnEAJQH3JwHyaHwMEgaaj00z+/QMCb9Sjd/SUW1w= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= From 5f1783c9a5965f1820e568a66da6200e9cbadc17 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 18 Nov 2021 18:35:06 -0500 Subject: [PATCH 006/157] Address review --- build/openrpc/full.json.gz | Bin 25453 -> 25465 bytes chain/actors/builtin/miner/actor.go.template | 1 + chain/actors/builtin/miner/miner.go | 1 + chain/actors/builtin/miner/state.go.template | 23 ++++++++++++++----- chain/actors/builtin/miner/v0.go | 18 ++++++++++++--- chain/actors/builtin/miner/v2.go | 6 ++--- chain/actors/builtin/miner/v3.go | 6 ++--- chain/actors/builtin/miner/v4.go | 6 ++--- chain/actors/builtin/miner/v5.go | 6 ++--- chain/actors/builtin/miner/v6.go | 8 +++---- chain/actors/builtin/miner/v7.go | 15 ++++++------ chain/vm/runtime.go | 9 ++++++++ documentation/en/api-v0-methods.md | 3 ++- documentation/en/api-v1-unstable-methods.md | 3 ++- itests/wdpost_test.go | 2 +- 15 files changed, 72 insertions(+), 35 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8f71ee8a973b9f29d91d16893c3cbe8bf3db8356..8719b71713e8587d8e7ec8ea03f23b0d6486fd6c 100644 GIT binary patch delta 24728 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 D;PdR} delta 24759 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 Nw@J1LHh4gQ`9C{nHm3jp diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 2669a05a6..2b6b78ebc 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -177,6 +177,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index f6d633880..e60ff8da8 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -266,6 +266,7 @@ type SectorOnChainInfo struct { InitialPledge abi.TokenAmount ExpectedDayReward abi.TokenAmount ExpectedStoragePledge abi.TokenAmount + SectorKeyCID *cid.Cid } type SectorPreCommitInfo = miner0.SectorPreCommitInfo diff --git a/chain/actors/builtin/miner/state.go.template b/chain/actors/builtin/miner/state.go.template index 2ea6a905e..775631961 100644 --- a/chain/actors/builtin/miner/state.go.template +++ b/chain/actors/builtin/miner/state.go.template @@ -138,11 +138,22 @@ func (s *state{{.v}}) GetSectorExpiration(num abi.SectorNumber) (*SectorExpirati return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be +{{if (ge .v 7) -}} + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). +{{- else -}} + // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. +{{- end}} +{{if (ge .v 6) -}} + // 2. If it's faulty, it will expire early within the first 42 entries + // of the expiration queue. +{{- else -}} // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. +{{- end}} + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner{{.v}}.Deadline) error { @@ -554,8 +565,7 @@ func (p *partition{{.v}}) UnprovenSectors() (bitfield.BitField, error) { } func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorOnChainInfo { -{{if (ge .v 2)}} - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v{{.v}}.SectorNumber, SealProof: v{{.v}}.SealProof, SealedCID: v{{.v}}.SealedCID, @@ -567,10 +577,11 @@ func fromV{{.v}}SectorOnChainInfo(v{{.v}} miner{{.v}}.SectorOnChainInfo) SectorO InitialPledge: v{{.v}}.InitialPledge, ExpectedDayReward: v{{.v}}.ExpectedDayReward, ExpectedStoragePledge: v{{.v}}.ExpectedStoragePledge, + {{if (ge .v 7)}} + SectorKeyCID: v{{.v}}.SectorKeyCID, + {{end}} } -{{else}} - return (SectorOnChainInfo)(v0) -{{end}} + return info } func fromV{{.v}}SectorPreCommitOnChainInfo(v{{.v}} miner{{.v}}.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v0.go b/chain/actors/builtin/miner/v0.go index 564bcbbc2..8bde8bf73 100644 --- a/chain/actors/builtin/miner/v0.go +++ b/chain/actors/builtin/miner/v0.go @@ -140,6 +140,7 @@ func (s *state0) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner0.Deadline) error { @@ -505,9 +506,20 @@ func (p *partition0) UnprovenSectors() (bitfield.BitField, error) { } func fromV0SectorOnChainInfo(v0 miner0.SectorOnChainInfo) SectorOnChainInfo { - - return (SectorOnChainInfo)(v0) - + info := SectorOnChainInfo{ + SectorNumber: v0.SectorNumber, + SealProof: v0.SealProof, + SealedCID: v0.SealedCID, + DealIDs: v0.DealIDs, + Activation: v0.Activation, + Expiration: v0.Expiration, + DealWeight: v0.DealWeight, + VerifiedDealWeight: v0.VerifiedDealWeight, + InitialPledge: v0.InitialPledge, + ExpectedDayReward: v0.ExpectedDayReward, + ExpectedStoragePledge: v0.ExpectedStoragePledge, + } + return info } func fromV0SectorPreCommitOnChainInfo(v0 miner0.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v2.go b/chain/actors/builtin/miner/v2.go index fe0863111..bbfdd403e 100644 --- a/chain/actors/builtin/miner/v2.go +++ b/chain/actors/builtin/miner/v2.go @@ -138,6 +138,7 @@ func (s *state2) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner2.Deadline) error { @@ -535,8 +536,7 @@ func (p *partition2) UnprovenSectors() (bitfield.BitField, error) { } func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v2.SectorNumber, SealProof: v2.SealProof, SealedCID: v2.SealedCID, @@ -549,7 +549,7 @@ func fromV2SectorOnChainInfo(v2 miner2.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v2.ExpectedDayReward, ExpectedStoragePledge: v2.ExpectedStoragePledge, } - + return info } func fromV2SectorPreCommitOnChainInfo(v2 miner2.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v3.go b/chain/actors/builtin/miner/v3.go index b0d5429ea..68505918a 100644 --- a/chain/actors/builtin/miner/v3.go +++ b/chain/actors/builtin/miner/v3.go @@ -140,6 +140,7 @@ func (s *state3) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner3.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition3) UnprovenSectors() (bitfield.BitField, error) { } func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v3.SectorNumber, SealProof: v3.SealProof, SealedCID: v3.SealedCID, @@ -550,7 +550,7 @@ func fromV3SectorOnChainInfo(v3 miner3.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v3.ExpectedDayReward, ExpectedStoragePledge: v3.ExpectedStoragePledge, } - + return info } func fromV3SectorPreCommitOnChainInfo(v3 miner3.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v4.go b/chain/actors/builtin/miner/v4.go index 7e5a9761a..5c40d4189 100644 --- a/chain/actors/builtin/miner/v4.go +++ b/chain/actors/builtin/miner/v4.go @@ -140,6 +140,7 @@ func (s *state4) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner4.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition4) UnprovenSectors() (bitfield.BitField, error) { } func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v4.SectorNumber, SealProof: v4.SealProof, SealedCID: v4.SealedCID, @@ -550,7 +550,7 @@ func fromV4SectorOnChainInfo(v4 miner4.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v4.ExpectedDayReward, ExpectedStoragePledge: v4.ExpectedStoragePledge, } - + return info } func fromV4SectorPreCommitOnChainInfo(v4 miner4.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v5.go b/chain/actors/builtin/miner/v5.go index 7f4aaf168..f717934f4 100644 --- a/chain/actors/builtin/miner/v5.go +++ b/chain/actors/builtin/miner/v5.go @@ -140,6 +140,7 @@ func (s *state5) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // epoch (i.e., the first element in the partition's expiration queue. // 2. If it's faulty, it will expire early within the first 14 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner5.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition5) UnprovenSectors() (bitfield.BitField, error) { } func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v5.SectorNumber, SealProof: v5.SealProof, SealedCID: v5.SealedCID, @@ -550,7 +550,7 @@ func fromV5SectorOnChainInfo(v5 miner5.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v5.ExpectedDayReward, ExpectedStoragePledge: v5.ExpectedStoragePledge, } - + return info } func fromV5SectorPreCommitOnChainInfo(v5 miner5.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v6.go b/chain/actors/builtin/miner/v6.go index de5a22a10..7a9dfb0df 100644 --- a/chain/actors/builtin/miner/v6.go +++ b/chain/actors/builtin/miner/v6.go @@ -138,8 +138,9 @@ func (s *state6) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e // 1. If the sector is non-faulty, it will either expire on-time (can be // learned from the sector info), or in the next quantized expiration // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner6.Deadline) error { @@ -536,8 +537,7 @@ func (p *partition6) UnprovenSectors() (bitfield.BitField, error) { } func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v6.SectorNumber, SealProof: v6.SealProof, SealedCID: v6.SealedCID, @@ -550,7 +550,7 @@ func fromV6SectorOnChainInfo(v6 miner6.SectorOnChainInfo) SectorOnChainInfo { ExpectedDayReward: v6.ExpectedDayReward, ExpectedStoragePledge: v6.ExpectedStoragePledge, } - + return info } func fromV6SectorPreCommitOnChainInfo(v6 miner6.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/actors/builtin/miner/v7.go b/chain/actors/builtin/miner/v7.go index c7096a781..e1b2520e4 100644 --- a/chain/actors/builtin/miner/v7.go +++ b/chain/actors/builtin/miner/v7.go @@ -135,11 +135,11 @@ func (s *state7) GetSectorExpiration(num abi.SectorNumber) (*SectorExpiration, e return nil, err } // NOTE: this can be optimized significantly. - // 1. If the sector is non-faulty, it will either expire on-time (can be - // learned from the sector info), or in the next quantized expiration - // epoch (i.e., the first element in the partition's expiration queue. - // 2. If it's faulty, it will expire early within the first 14 entries + // 1. If the sector is non-faulty, it will expire on-time (can be + // learned from the sector info). + // 2. If it's faulty, it will expire early within the first 42 entries // of the expiration queue. + stopErr := errors.New("stop") out := SectorExpiration{} err = dls.ForEach(s.store, func(dlIdx uint64, dl *miner7.Deadline) error { @@ -536,8 +536,7 @@ func (p *partition7) UnprovenSectors() (bitfield.BitField, error) { } func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { - - return SectorOnChainInfo{ + info := SectorOnChainInfo{ SectorNumber: v7.SectorNumber, SealProof: v7.SealProof, SealedCID: v7.SealedCID, @@ -549,8 +548,10 @@ func fromV7SectorOnChainInfo(v7 miner7.SectorOnChainInfo) SectorOnChainInfo { InitialPledge: v7.InitialPledge, ExpectedDayReward: v7.ExpectedDayReward, ExpectedStoragePledge: v7.ExpectedStoragePledge, - } + SectorKeyCID: v7.SectorKeyCID, + } + return info } func fromV7SectorPreCommitOnChainInfo(v7 miner7.SectorPreCommitOnChainInfo) SectorPreCommitOnChainInfo { diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 583c99593..0dbe98224 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -16,7 +16,11 @@ import ( "github.com/filecoin-project/go-state-types/network" rtt "github.com/filecoin-project/go-state-types/rt" rt0 "github.com/filecoin-project/specs-actors/actors/runtime" + rt2 "github.com/filecoin-project/specs-actors/v2/actors/runtime" + rt3 "github.com/filecoin-project/specs-actors/v3/actors/runtime" + rt4 "github.com/filecoin-project/specs-actors/v4/actors/runtime" rt5 "github.com/filecoin-project/specs-actors/v5/actors/runtime" + rt6 "github.com/filecoin-project/specs-actors/v6/actors/runtime" rt7 "github.com/filecoin-project/specs-actors/v7/actors/runtime" "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" @@ -142,6 +146,11 @@ func (rt *Runtime) StorePut(x cbor.Marshaler) cid.Cid { var _ rt0.Runtime = (*Runtime)(nil) var _ rt5.Runtime = (*Runtime)(nil) +var _ rt2.Runtime = (*Runtime)(nil) +var _ rt3.Runtime = (*Runtime)(nil) +var _ rt4.Runtime = (*Runtime)(nil) +var _ rt5.Runtime = (*Runtime)(nil) +var _ rt6.Runtime = (*Runtime)(nil) var _ rt7.Runtime = (*Runtime)(nil) func (rt *Runtime) shimCall(f func() interface{}) (rval []byte, aerr aerrors.ActorError) { diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 42bb945d0..09c3d1c34 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -5016,7 +5016,8 @@ Response: "VerifiedDealWeight": "0", "InitialPledge": "0", "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0" + "ExpectedStoragePledge": "0", + "SectorKeyCID": null } ``` diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 3578a4492..91baffdc6 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -5223,7 +5223,8 @@ Response: "VerifiedDealWeight": "0", "InitialPledge": "0", "ExpectedDayReward": "0", - "ExpectedStoragePledge": "0" + "ExpectedStoragePledge": "0", + "SectorKeyCID": null } ``` diff --git a/itests/wdpost_test.go b/itests/wdpost_test.go index b1420e6a3..d87059bb4 100644 --- a/itests/wdpost_test.go +++ b/itests/wdpost_test.go @@ -23,7 +23,7 @@ import ( ) func TestWindowedPost(t *testing.T) { - //kit.Expensive(t) + kit.Expensive(t) kit.QuietMiningLogs() From 7d2b3f05db38cee481c4b91e628b53bb460bdadc Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 10 Nov 2021 13:53:00 -0500 Subject: [PATCH 007/157] WIP sector storage and integration test --- api/api_storage.go | 25 +-- api/api_worker.go | 3 + api/proxy_gen.go | 78 +++++++++ build/openrpc/full.json.gz | Bin 25465 -> 25466 bytes build/openrpc/miner.json.gz | Bin 10467 -> 10672 bytes build/openrpc/worker.json.gz | Bin 2713 -> 2940 bytes documentation/en/api-v0-methods-miner.md | 85 +++++++++ documentation/en/api-v0-methods-worker.md | 118 +++++++++++++ extern/filecoin-ffi | 2 +- .../sector-storage/ffiwrapper/sealer_cgo.go | 83 +++++++++ .../sector-storage/ffiwrapper/verifier_cgo.go | 3 +- extern/sector-storage/manager.go | 161 ++++++++++++++++++ extern/sector-storage/manager_calltracker.go | 1 - extern/sector-storage/manager_test.go | 139 ++++++++++++++- extern/sector-storage/mock/mock.go | 32 ++++ extern/sector-storage/sched_test.go | 12 ++ extern/sector-storage/sealtasks/task.go | 27 ++- extern/sector-storage/storiface/filetype.go | 42 +++-- extern/sector-storage/storiface/worker.go | 6 + extern/sector-storage/teststorage_test.go | 16 ++ extern/sector-storage/testworker_test.go | 28 +++ extern/sector-storage/worker_local.go | 85 ++++++--- extern/sector-storage/worker_tracked.go | 19 ++- go.mod | 4 +- go.sum | 10 +- 25 files changed, 911 insertions(+), 68 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 8cca2aa5b..bf7520d09 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -118,17 +118,20 @@ type StorageMiner interface { WorkerJobs(context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) //perm:admin //storiface.WorkerReturn - ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true - ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storage.PreCommit1Out, err *storiface.CallError) error //perm:admin retry:true - ReturnSealPreCommit2(ctx context.Context, callID storiface.CallID, sealed storage.SectorCids, err *storiface.CallError) error //perm:admin retry:true - ReturnSealCommit1(ctx context.Context, callID storiface.CallID, out storage.Commit1Out, err *storiface.CallError) error //perm:admin retry:true - ReturnSealCommit2(ctx context.Context, callID storiface.CallID, proof storage.Proof, err *storiface.CallError) error //perm:admin retry:true - ReturnFinalizeSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true - ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true - ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true - ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true - ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error //perm:admin retry:true - ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error //perm:admin retry:true + ReturnSealPreCommit1(ctx context.Context, callID storiface.CallID, p1o storage.PreCommit1Out, err *storiface.CallError) error //perm:admin retry:true + ReturnSealPreCommit2(ctx context.Context, callID storiface.CallID, sealed storage.SectorCids, err *storiface.CallError) error //perm:admin retry:true + ReturnSealCommit1(ctx context.Context, callID storiface.CallID, out storage.Commit1Out, err *storiface.CallError) error //perm:admin retry:true + ReturnSealCommit2(ctx context.Context, callID storiface.CallID, proof storage.Proof, err *storiface.CallError) error //perm:admin retry:true + ReturnFinalizeSector(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnReplicaUpdate(ctx context.Context, callID storiface.CallID, out storage.ReplicaUpdateOut, err *storiface.CallError) error //perm:admin retry:true + ReturnProveReplicaUpdate1(ctx context.Context, callID storiface.CallID, vanillaProofs storage.ReplicaVanillaProofs, err *storiface.CallError) error //perm:admin retry:true + ReturnProveReplicaUpdate2(ctx context.Context, callID storiface.CallID, proof storage.ReplicaUpdateProof, err *storiface.CallError) error //perm:admin retry:true + ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true + ReturnReadPiece(ctx context.Context, callID storiface.CallID, ok bool, err *storiface.CallError) error //perm:admin retry:true + ReturnFetch(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true // SealingSchedDiag dumps internal sealing scheduler state SealingSchedDiag(ctx context.Context, doSched bool) (interface{}, error) //perm:admin diff --git a/api/api_worker.go b/api/api_worker.go index 4553c30e0..5e0b4f8c6 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -39,6 +39,9 @@ type Worker interface { SealCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, seed abi.InteractiveSealRandomness, pieces []abi.PieceInfo, cids storage.SectorCids) (storiface.CallID, error) //perm:admin SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (storiface.CallID, error) //perm:admin FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) //perm:admin + ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin + ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin + ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) //perm:admin MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin UnsealPiece(context.Context, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index b36f19a7e..b78b40959 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -709,10 +709,16 @@ type StorageMinerStruct struct { ReturnMoveStorage func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnProveReplicaUpdate1 func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error `perm:"admin"` + + ReturnProveReplicaUpdate2 func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateProof, p3 *storiface.CallError) error `perm:"admin"` + ReturnReadPiece func(p0 context.Context, p1 storiface.CallID, p2 bool, p3 *storiface.CallError) error `perm:"admin"` ReturnReleaseUnsealed func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnReplicaUpdate func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateOut, p3 *storiface.CallError) error `perm:"admin"` + ReturnSealCommit1 func(p0 context.Context, p1 storiface.CallID, p2 storage.Commit1Out, p3 *storiface.CallError) error `perm:"admin"` ReturnSealCommit2 func(p0 context.Context, p1 storiface.CallID, p2 storage.Proof, p3 *storiface.CallError) error `perm:"admin"` @@ -852,10 +858,16 @@ type WorkerStruct struct { ProcessSession func(p0 context.Context) (uuid.UUID, error) `perm:"admin"` + ProveReplicaUpdate1 func(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid) (storiface.CallID, error) `perm:"admin"` + + ProveReplicaUpdate2 func(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid, p5 storage.ReplicaVanillaProofs) (storiface.CallID, error) `perm:"admin"` + ReleaseUnsealed func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` Remove func(p0 context.Context, p1 abi.SectorID) error `perm:"admin"` + ReplicaUpdate func(p0 context.Context, p1 storage.SectorRef, p2 []abi.PieceInfo) (storiface.CallID, error) `perm:"admin"` + SealCommit1 func(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 abi.InteractiveSealRandomness, p4 []abi.PieceInfo, p5 storage.SectorCids) (storiface.CallID, error) `perm:"admin"` SealCommit2 func(p0 context.Context, p1 storage.SectorRef, p2 storage.Commit1Out) (storiface.CallID, error) `perm:"admin"` @@ -4165,6 +4177,28 @@ func (s *StorageMinerStub) ReturnMoveStorage(p0 context.Context, p1 storiface.Ca return ErrNotSupported } +func (s *StorageMinerStruct) ReturnProveReplicaUpdate1(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error { + if s.Internal.ReturnProveReplicaUpdate1 == nil { + return ErrNotSupported + } + return s.Internal.ReturnProveReplicaUpdate1(p0, p1, p2, p3) +} + +func (s *StorageMinerStub) ReturnProveReplicaUpdate1(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error { + return ErrNotSupported +} + +func (s *StorageMinerStruct) ReturnProveReplicaUpdate2(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateProof, p3 *storiface.CallError) error { + if s.Internal.ReturnProveReplicaUpdate2 == nil { + return ErrNotSupported + } + return s.Internal.ReturnProveReplicaUpdate2(p0, p1, p2, p3) +} + +func (s *StorageMinerStub) ReturnProveReplicaUpdate2(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateProof, p3 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnReadPiece(p0 context.Context, p1 storiface.CallID, p2 bool, p3 *storiface.CallError) error { if s.Internal.ReturnReadPiece == nil { return ErrNotSupported @@ -4187,6 +4221,17 @@ func (s *StorageMinerStub) ReturnReleaseUnsealed(p0 context.Context, p1 storifac return ErrNotSupported } +func (s *StorageMinerStruct) ReturnReplicaUpdate(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateOut, p3 *storiface.CallError) error { + if s.Internal.ReturnReplicaUpdate == nil { + return ErrNotSupported + } + return s.Internal.ReturnReplicaUpdate(p0, p1, p2, p3) +} + +func (s *StorageMinerStub) ReturnReplicaUpdate(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaUpdateOut, p3 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnSealCommit1(p0 context.Context, p1 storiface.CallID, p2 storage.Commit1Out, p3 *storiface.CallError) error { if s.Internal.ReturnSealCommit1 == nil { return ErrNotSupported @@ -4858,6 +4903,28 @@ func (s *WorkerStub) ProcessSession(p0 context.Context) (uuid.UUID, error) { return *new(uuid.UUID), ErrNotSupported } +func (s *WorkerStruct) ProveReplicaUpdate1(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid) (storiface.CallID, error) { + if s.Internal.ProveReplicaUpdate1 == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.ProveReplicaUpdate1(p0, p1, p2, p3, p4) +} + +func (s *WorkerStub) ProveReplicaUpdate1(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + +func (s *WorkerStruct) ProveReplicaUpdate2(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid, p5 storage.ReplicaVanillaProofs) (storiface.CallID, error) { + if s.Internal.ProveReplicaUpdate2 == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.ProveReplicaUpdate2(p0, p1, p2, p3, p4, p5) +} + +func (s *WorkerStub) ProveReplicaUpdate2(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid, p3 cid.Cid, p4 cid.Cid, p5 storage.ReplicaVanillaProofs) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) ReleaseUnsealed(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) { if s.Internal.ReleaseUnsealed == nil { return *new(storiface.CallID), ErrNotSupported @@ -4880,6 +4947,17 @@ func (s *WorkerStub) Remove(p0 context.Context, p1 abi.SectorID) error { return ErrNotSupported } +func (s *WorkerStruct) ReplicaUpdate(p0 context.Context, p1 storage.SectorRef, p2 []abi.PieceInfo) (storiface.CallID, error) { + if s.Internal.ReplicaUpdate == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.ReplicaUpdate(p0, p1, p2) +} + +func (s *WorkerStub) ReplicaUpdate(p0 context.Context, p1 storage.SectorRef, p2 []abi.PieceInfo) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) SealCommit1(p0 context.Context, p1 storage.SectorRef, p2 abi.SealRandomness, p3 abi.InteractiveSealRandomness, p4 []abi.PieceInfo, p5 storage.SectorCids) (storiface.CallID, error) { if s.Internal.SealCommit1 == nil { return *new(storiface.CallID), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8719b71713e8587d8e7ec8ea03f23b0d6486fd6c..a5816ef4f3d57f10df36cc9e5a911257fb47e0e6 100644 GIT binary patch delta 25088 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 WJUo1P`2PU_0RR7TD+|HU^Z@`4(25@b delta 10388 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 literal 2713 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", t) } @@ -104,9 +116,11 @@ func (t SectorFileType) All() [FileTypes]bool { type SectorPaths struct { ID abi.SectorID - Unsealed string - Sealed string - Cache string + Unsealed string + Sealed string + Cache string + Update string + UpdateCache string } func ParseSectorID(baseName string) (abi.SectorID, error) { @@ -139,6 +153,10 @@ func PathByType(sps SectorPaths, fileType SectorFileType) string { return sps.Sealed case FTCache: return sps.Cache + case FTUpdate: + return sps.Update + case FTUpdateCache: + return sps.UpdateCache } panic("requested unknown path type") @@ -152,5 +170,9 @@ func SetPathByType(sps *SectorPaths, fileType SectorFileType, p string) { sps.Sealed = p case FTCache: sps.Cache = p + case FTUpdate: + sps.Update = p + case FTUpdateCache: + sps.UpdateCache = p } } diff --git a/extern/sector-storage/storiface/worker.go b/extern/sector-storage/storiface/worker.go index e3374d6cf..970e0ec33 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -92,6 +92,9 @@ type WorkerCalls interface { SealCommit2(ctx context.Context, sector storage.SectorRef, c1o storage.Commit1Out) (CallID, error) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (CallID, error) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (CallID, error) + ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (CallID, error) + ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (CallID, error) + ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (CallID, error) MoveStorage(ctx context.Context, sector storage.SectorRef, types SectorFileType) (CallID, error) UnsealPiece(context.Context, storage.SectorRef, UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (CallID, error) Fetch(context.Context, storage.SectorRef, SectorFileType, PathType, AcquireMode) (CallID, error) @@ -145,6 +148,9 @@ type WorkerReturn interface { ReturnSealCommit2(ctx context.Context, callID CallID, proof storage.Proof, err *CallError) error ReturnFinalizeSector(ctx context.Context, callID CallID, err *CallError) error ReturnReleaseUnsealed(ctx context.Context, callID CallID, err *CallError) error + ReturnReplicaUpdate(ctx context.Context, callID CallID, out storage.ReplicaUpdateOut, err *CallError) error + ReturnProveReplicaUpdate1(ctx context.Context, callID CallID, proofs storage.ReplicaVanillaProofs, err *CallError) error + ReturnProveReplicaUpdate2(ctx context.Context, callID CallID, proof storage.ReplicaUpdateProof, err *CallError) error ReturnMoveStorage(ctx context.Context, callID CallID, err *CallError) error ReturnUnsealPiece(ctx context.Context, callID CallID, err *CallError) error ReturnReadPiece(ctx context.Context, callID CallID, ok bool, err *CallError) error diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index 72b27b154..4061b48d9 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -55,10 +55,26 @@ func (t *testExec) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef panic("implement me") } +func (t *testExec) ReleaseSealed(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + func (t *testExec) Remove(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } +func (t *testExec) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storage.ReplicaUpdateOut, error) { + panic("implement me") +} + +func (t *testExec) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storage.ReplicaVanillaProofs, error) { + panic("implement me") +} + +func (t *testExec) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storage.ReplicaUpdateProof, error) { + panic("implement me") +} + func (t *testExec) NewSector(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } diff --git a/extern/sector-storage/testworker_test.go b/extern/sector-storage/testworker_test.go index 2fe99f3d4..a5c678415 100644 --- a/extern/sector-storage/testworker_test.go +++ b/extern/sector-storage/testworker_test.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" "github.com/google/uuid" + cid "github.com/ipfs/go-cid" "github.com/filecoin-project/lotus/extern/sector-storage/mock" "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" @@ -67,6 +68,33 @@ func (t *testWorker) AddPiece(ctx context.Context, sector storage.SectorRef, pie }) } +func (t *testWorker) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) { + return t.asyncCall(sector, func(ci storiface.CallID) { + out, err := t.mockSeal.ReplicaUpdate(ctx, sector, pieces) + if err := t.ret.ReturnReplicaUpdate(ctx, ci, out, toCallError(err)); err != nil { + log.Error(err) + } + }) +} + +func (t *testWorker) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) { + return t.asyncCall(sector, func(ci storiface.CallID) { + vanillaProofs, err := t.mockSeal.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed) + if err := t.ret.ReturnProveReplicaUpdate1(ctx, ci, vanillaProofs, toCallError(err)); err != nil { + log.Error(err) + } + }) +} + +func (t *testWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) { + return t.asyncCall(sector, func(ci storiface.CallID) { + proof, err := t.mockSeal.ProveReplicaUpdate2(ctx, sector, sectorKey, newSealed, newUnsealed, vanillaProofs) + if err := t.ret.ReturnProveReplicaUpdate2(ctx, ci, proof, toCallError(err)); err != nil { + log.Error(err) + } + }) +} + func (t *testWorker) SealPreCommit1(ctx context.Context, sector storage.SectorRef, ticket abi.SealRandomness, pieces []abi.PieceInfo) (storiface.CallID, error) { return t.asyncCall(sector, func(ci storiface.CallID) { t.pc1s++ diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index d45d140f8..cc41e916e 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -28,7 +28,7 @@ import ( "github.com/filecoin-project/lotus/extern/sector-storage/storiface" ) -var pathTypes = []storiface.SectorFileType{storiface.FTUnsealed, storiface.FTSealed, storiface.FTCache} +var pathTypes = []storiface.SectorFileType{storiface.FTUnsealed, storiface.FTSealed, storiface.FTCache, storiface.FTUpdate, storiface.FTUpdateCache} type WorkerConfig struct { TaskTypes []sealtasks.TaskType @@ -145,7 +145,6 @@ func (l *localWorkerPathProvider) AcquireSector(ctx context.Context, sector stor } sid := storiface.PathByType(storageIDs, fileType) - if err := l.w.sindex.StorageDeclareSector(ctx, stores.ID(sid), sector.ID, fileType, l.op == storiface.AcquireMove); err != nil { log.Errorf("declare sector error: %+v", err) } @@ -160,16 +159,19 @@ func (l *LocalWorker) ffiExec() (ffiwrapper.Storage, error) { type ReturnType string const ( - AddPiece ReturnType = "AddPiece" - SealPreCommit1 ReturnType = "SealPreCommit1" - SealPreCommit2 ReturnType = "SealPreCommit2" - SealCommit1 ReturnType = "SealCommit1" - SealCommit2 ReturnType = "SealCommit2" - FinalizeSector ReturnType = "FinalizeSector" - ReleaseUnsealed ReturnType = "ReleaseUnsealed" - MoveStorage ReturnType = "MoveStorage" - UnsealPiece ReturnType = "UnsealPiece" - Fetch ReturnType = "Fetch" + AddPiece ReturnType = "AddPiece" + SealPreCommit1 ReturnType = "SealPreCommit1" + SealPreCommit2 ReturnType = "SealPreCommit2" + SealCommit1 ReturnType = "SealCommit1" + SealCommit2 ReturnType = "SealCommit2" + FinalizeSector ReturnType = "FinalizeSector" + ReplicaUpdate ReturnType = "ReplicaUpdate" + ProveReplicaUpdate1 ReturnType = "ProveReplicaUpdate1" + ProveReplicaUpdate2 ReturnType = "ProveReplicaUpdate2" + ReleaseUnsealed ReturnType = "ReleaseUnsealed" + MoveStorage ReturnType = "MoveStorage" + UnsealPiece ReturnType = "UnsealPiece" + Fetch ReturnType = "Fetch" ) // in: func(WorkerReturn, context.Context, CallID, err string) @@ -207,16 +209,19 @@ func rfunc(in interface{}) func(context.Context, storiface.CallID, storiface.Wor } var returnFunc = map[ReturnType]func(context.Context, storiface.CallID, storiface.WorkerReturn, interface{}, *storiface.CallError) error{ - AddPiece: rfunc(storiface.WorkerReturn.ReturnAddPiece), - SealPreCommit1: rfunc(storiface.WorkerReturn.ReturnSealPreCommit1), - SealPreCommit2: rfunc(storiface.WorkerReturn.ReturnSealPreCommit2), - SealCommit1: rfunc(storiface.WorkerReturn.ReturnSealCommit1), - SealCommit2: rfunc(storiface.WorkerReturn.ReturnSealCommit2), - FinalizeSector: rfunc(storiface.WorkerReturn.ReturnFinalizeSector), - ReleaseUnsealed: rfunc(storiface.WorkerReturn.ReturnReleaseUnsealed), - MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), - UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), - Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), + AddPiece: rfunc(storiface.WorkerReturn.ReturnAddPiece), + SealPreCommit1: rfunc(storiface.WorkerReturn.ReturnSealPreCommit1), + SealPreCommit2: rfunc(storiface.WorkerReturn.ReturnSealPreCommit2), + SealCommit1: rfunc(storiface.WorkerReturn.ReturnSealCommit1), + SealCommit2: rfunc(storiface.WorkerReturn.ReturnSealCommit2), + FinalizeSector: rfunc(storiface.WorkerReturn.ReturnFinalizeSector), + ReleaseUnsealed: rfunc(storiface.WorkerReturn.ReturnReleaseUnsealed), + ReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnReplicaUpdate), + ProveReplicaUpdate1: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate1), + ProveReplicaUpdate2: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate2), + MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), + UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), + Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), } func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, rt ReturnType, work func(ctx context.Context, ci storiface.CallID) (interface{}, error)) (storiface.CallID, error) { @@ -240,7 +245,6 @@ func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, r } res, err := work(ctx, ci) - if err != nil { rb, err := json.Marshal(res) if err != nil { @@ -258,7 +262,6 @@ func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, r } } }() - return ci, nil } @@ -382,6 +385,40 @@ func (l *LocalWorker) SealCommit2(ctx context.Context, sector storage.SectorRef, }) } +func (l *LocalWorker) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, ReplicaUpdate, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + sealerOut, err := sb.ReplicaUpdate(ctx, sector, pieces) + return sealerOut, err + }) +} + +func (l *LocalWorker) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, ProveReplicaUpdate1, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + return sb.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed) + }) +} + +func (l *LocalWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, ProveReplicaUpdate2, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + return sb.ProveReplicaUpdate2(ctx, sector, sectorKey, newSealed, newUnsealed, vanillaProofs) + }) +} + func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { sb, err := l.executor() if err != nil { diff --git a/extern/sector-storage/worker_tracked.go b/extern/sector-storage/worker_tracked.go index 5702426c3..b87abed06 100644 --- a/extern/sector-storage/worker_tracked.go +++ b/extern/sector-storage/worker_tracked.go @@ -98,7 +98,6 @@ func (wt *workTracker) track(ctx context.Context, ready chan struct{}, wid Worke wt.lk.Lock() delete(wt.prepared, prepID) } - callID, err := cb() if err != nil { return callID, err @@ -198,4 +197,22 @@ func (t *trackedWorker) UnsealPiece(ctx context.Context, id storage.SectorRef, i return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, id, sealtasks.TTUnseal, func() (storiface.CallID, error) { return t.Worker.UnsealPiece(ctx, id, index, size, randomness, cid) }) } +func (t *trackedWorker) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) { + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTReplicaUpdate, func() (storiface.CallID, error) { + return t.Worker.ReplicaUpdate(ctx, sector, pieces) + }) +} + +func (t *trackedWorker) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) { + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTProveReplicaUpdate1, func() (storiface.CallID, error) { + return t.Worker.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed) + }) +} + +func (t *trackedWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) { + return t.tracker.track(ctx, t.execute, t.wid, t.workerInfo, sector, sealtasks.TTProveReplicaUpdate2, func() (storiface.CallID, error) { + return t.Worker.ProveReplicaUpdate2(ctx, sector, sectorKey, newSealed, newUnsealed, vanillaProofs) + }) +} + var _ Worker = &trackedWorker{} diff --git a/go.mod b/go.mod index ce52b7975..e0823094d 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 + github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 @@ -156,7 +156,7 @@ require ( golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac - golang.org/x/tools v0.1.5 + golang.org/x/tools v0.1.7 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible diff --git a/go.sum b/go.sum index 06341ce01..e404ca72e 100644 --- a/go.sum +++ b/go.sum @@ -396,8 +396,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 h1:FLPxD2ksWwGc/sbnFLWep2p8ViP93VCAwFaVxrtVCyo= +github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -1872,6 +1872,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= @@ -2104,6 +2105,7 @@ golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2227,6 +2229,7 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2318,8 +2321,9 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From e16e9ad34393c5c97f18d895749ffc3a1c70a8c8 Mon Sep 17 00:00:00 2001 From: c r Date: Mon, 29 Nov 2021 17:26:47 -0500 Subject: [PATCH 008/157] reorder `transfer` checks so as to ensure sending more money than you have to yourself fails with an error (fixing issue 7596) PR #7637, also adds tests to make sure behavior is correct across versions. --- .circleci/config.yml | 5 ++ chain/vm/runtime.go | 2 +- chain/vm/vm.go | 93 ++++++++++++++++++++++---------- itests/self_sent_txn_test.go | 102 +++++++++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+), 28 deletions(-) create mode 100644 itests/self_sent_txn_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 30f2d5c01..d747e2cab 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -890,6 +890,11 @@ workflows: suite: itest-sector_terminate target: "./itests/sector_terminate_test.go" + - test: + name: test-itest-self_sent_txn + suite: itest-self_sent_txn + target: "./itests/self_sent_txn_test.go" + - test: name: test-itest-tape suite: itest-tape diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 0dbe98224..548b09028 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -332,7 +332,7 @@ func (rt *Runtime) DeleteActor(beneficiary address.Address) { } // Transfer the executing actor's balance to the beneficiary - if err := rt.vm.transfer(rt.Receiver(), beneficiary, act.Balance); err != nil { + if err := rt.vm.transfer(rt.Receiver(), beneficiary, act.Balance, rt.NetworkVersion()); err != nil { panic(aerrors.Fatalf("failed to transfer balance to beneficiary actor: %s", err)) } } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 36308fe03..16ad5e2a4 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -339,7 +339,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, defer rt.chargeGasSafe(newGasCharge("OnMethodInvocationDone", 0, 0)) if types.BigCmp(msg.Value, types.NewInt(0)) != 0 { - if err := vm.transfer(msg.From, msg.To, msg.Value); err != nil { + if err := vm.transfer(msg.From, msg.To, msg.Value, vm.ntwkVersion(ctx, vm.blockHeight)); err != nil { return nil, aerrors.Wrap(err, "failed to transfer funds") } } @@ -869,32 +869,71 @@ func (vm *VM) incrementNonce(addr address.Address) error { }) } -func (vm *VM) transfer(from, to address.Address, amt types.BigInt) aerrors.ActorError { - if from == to { - return nil - } +func (vm *VM) transfer(from, to address.Address, amt types.BigInt, networkVersion network.Version) aerrors.ActorError { + var f *types.Actor + var fromID, toID address.Address + var err error + // switching the order around so that transactions for more than the balance sent to self fail + if networkVersion >= network.Version15 { + if amt.LessThan(types.NewInt(0)) { + return aerrors.Newf(exitcode.SysErrForbidden, "attempted to transfer negative value: %s", amt) + } - fromID, err := vm.cstate.LookupID(from) - if err != nil { - return aerrors.Fatalf("transfer failed when resolving sender address: %s", err) - } + fromID, err = vm.cstate.LookupID(from) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving sender address: %s", err) + } - toID, err := vm.cstate.LookupID(to) - if err != nil { - return aerrors.Fatalf("transfer failed when resolving receiver address: %s", err) - } + f, err = vm.cstate.GetActor(fromID) + if err != nil { + return aerrors.Fatalf("transfer failed when retrieving sender actor: %s", err) + } - if fromID == toID { - return nil - } + if f.Balance.LessThan(amt) { + return aerrors.Newf(exitcode.SysErrInsufficientFunds, "transfer failed, insufficient balance in sender actor: %v", f.Balance) + } - if amt.LessThan(types.NewInt(0)) { - return aerrors.Newf(exitcode.SysErrForbidden, "attempted to transfer negative value: %s", amt) - } + if from == to { + log.Infow("sending to same address: noop", "from/to addr", from) + return nil + } - f, err := vm.cstate.GetActor(fromID) - if err != nil { - return aerrors.Fatalf("transfer failed when retrieving sender actor: %s", err) + toID, err = vm.cstate.LookupID(to) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving receiver address: %s", err) + } + + if fromID == toID { + log.Infow("sending to same actor ID: noop", "from/to actor", fromID) + return nil + } + } else { + if from == to { + return nil + } + + fromID, err = vm.cstate.LookupID(from) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving sender address: %s", err) + } + + toID, err = vm.cstate.LookupID(to) + if err != nil { + return aerrors.Fatalf("transfer failed when resolving receiver address: %s", err) + } + + if fromID == toID { + return nil + } + + if amt.LessThan(types.NewInt(0)) { + return aerrors.Newf(exitcode.SysErrForbidden, "attempted to transfer negative value: %s", amt) + } + + f, err = vm.cstate.GetActor(fromID) + if err != nil { + return aerrors.Fatalf("transfer failed when retrieving sender actor: %s", err) + } } t, err := vm.cstate.GetActor(toID) @@ -902,17 +941,17 @@ func (vm *VM) transfer(from, to address.Address, amt types.BigInt) aerrors.Actor return aerrors.Fatalf("transfer failed when retrieving receiver actor: %s", err) } - if err := deductFunds(f, amt); err != nil { + if err = deductFunds(f, amt); err != nil { return aerrors.Newf(exitcode.SysErrInsufficientFunds, "transfer failed when deducting funds (%s): %s", types.FIL(amt), err) } depositFunds(t, amt) - if err := vm.cstate.SetActor(fromID, f); err != nil { - return aerrors.Fatalf("transfer failed when setting receiver actor: %s", err) + if err = vm.cstate.SetActor(fromID, f); err != nil { + return aerrors.Fatalf("transfer failed when setting sender actor: %s", err) } - if err := vm.cstate.SetActor(toID, t); err != nil { - return aerrors.Fatalf("transfer failed when setting sender actor: %s", err) + if err = vm.cstate.SetActor(toID, t); err != nil { + return aerrors.Fatalf("transfer failed when setting receiver actor: %s", err) } return nil diff --git a/itests/self_sent_txn_test.go b/itests/self_sent_txn_test.go new file mode 100644 index 000000000..846bcff05 --- /dev/null +++ b/itests/self_sent_txn_test.go @@ -0,0 +1,102 @@ +package itests + +import ( + "context" + "testing" + "time" + + "github.com/filecoin-project/go-state-types/network" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/itests/kit" + "github.com/stretchr/testify/require" +) + + +// these tests check that the versioned code in vm.transfer is functioning correctly across versions! +// we reordered the checks to make sure that a transaction with too much money in it sent to yourself will fail instead of succeeding as a noop +// more info in this PR! https://github.com/filecoin-project/lotus/pull/7637 +func TestSelfSentTxnV15(t *testing.T) { + ctx := context.Background() + + kit.QuietMiningLogs() + + client15, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + bal, err := client15.WalletBalance(ctx, client15.DefaultKey.Address) + require.NoError(t, err) + + // send self half of account balance + msgHalfBal := &types.Message{ + From: client15.DefaultKey.Address, + To: client15.DefaultKey.Address, + Value: big.Div(bal, big.NewInt(2)), + } + smHalfBal, err := client15.MpoolPushMessage(ctx, msgHalfBal, nil) + require.NoError(t, err) + mLookup, err := client15.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + + msgOverBal := &types.Message{ + From: client15.DefaultKey.Address, + To: client15.DefaultKey.Address, + Value: big.Mul(big.NewInt(2), bal), + GasLimit: 10000000000, + GasPremium: big.NewInt(10000000000), + GasFeeCap: big.NewInt(100000000000), + Nonce: 1, + } + smOverBal, err := client15.WalletSignMessage(ctx, client15.DefaultKey.Address, msgOverBal) + require.NoError(t, err) + smcid, err := client15.MpoolPush(ctx, smOverBal) + require.NoError(t, err) + mLookup, err = client15.StateWaitMsg(ctx, smcid, 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.SysErrInsufficientFunds, mLookup.Receipt.ExitCode) +} + +func TestSelfSentTxnV14(t *testing.T) { + ctx := context.Background() + + kit.QuietMiningLogs() + + client14, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.GenesisNetworkVersion(network.Version14)) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + bal, err := client14.WalletBalance(ctx, client14.DefaultKey.Address) + require.NoError(t, err) + + // send self half of account balance + msgHalfBal := &types.Message{ + From: client14.DefaultKey.Address, + To: client14.DefaultKey.Address, + Value: big.Div(bal, big.NewInt(2)), + } + smHalfBal, err := client14.MpoolPushMessage(ctx, msgHalfBal, nil) + require.NoError(t, err) + mLookup, err := client14.StateWaitMsg(ctx, smHalfBal.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + + msgOverBal := &types.Message{ + From: client14.DefaultKey.Address, + To: client14.DefaultKey.Address, + Value: big.Mul(big.NewInt(2), bal), + GasLimit: 10000000000, + GasPremium: big.NewInt(10000000000), + GasFeeCap: big.NewInt(100000000000), + Nonce: 1, + } + smOverBal, err := client14.WalletSignMessage(ctx, client14.DefaultKey.Address, msgOverBal) + require.NoError(t, err) + smcid, err := client14.MpoolPush(ctx, smOverBal) + require.NoError(t, err) + mLookup, err = client14.StateWaitMsg(ctx, smcid, 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) +} From f88fcdbcfc5c238f8bc6545a39c78c2e9a1df7d4 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 30 Nov 2021 12:40:14 -0500 Subject: [PATCH 009/157] WIP --- extern/sector-storage/ffiwrapper/sealer_cgo.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 81dbfb426..b9fad3a04 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -628,9 +628,9 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p } // XXX: we want to keep the stuff at the end - if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { - return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) - } + // if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { + // return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) + // } sealed, unsealed, err := ffi.SectorUpdate.EncodeInto(updateProofType, paths.Update, paths.UpdateCache, paths.Sealed, paths.Cache, paths.Unsealed, pieces) if err != nil { From 40d16a8f880395c7ce2b8cc62a2e4605e95e2c5d Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 30 Nov 2021 13:53:37 -0500 Subject: [PATCH 010/157] Review Response --- extern/filecoin-ffi | 2 +- extern/sector-storage/ffiwrapper/sealer_cgo.go | 6 +++--- extern/sector-storage/manager_test.go | 15 ++++++++++----- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index b1a66cfd1..ce7083b3d 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit b1a66cfd12686a8af6030fccace49916849b1954 +Subproject commit ce7083b3d187ec3bc41a68ab66567bd4f3be6dfc diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index b9fad3a04..81dbfb426 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -628,9 +628,9 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p } // XXX: we want to keep the stuff at the end - // if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { - // return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) - // } + if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { + return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) + } sealed, unsealed, err := ffi.SectorUpdate.EncodeInto(updateProofType, paths.Update, paths.UpdateCache, paths.Sealed, paths.Cache, paths.Unsealed, pieces) if err != nil { diff --git a/extern/sector-storage/manager_test.go b/extern/sector-storage/manager_test.go index e4ca35560..77e185b93 100644 --- a/extern/sector-storage/manager_test.go +++ b/extern/sector-storage/manager_test.go @@ -68,11 +68,16 @@ func newTestStorage(t *testing.T) *testStorage { } func (t testStorage) cleanup() { - // for _, path := range t.StoragePaths { - // if err := os.RemoveAll(path.Path); err != nil { - // fmt.Println("Cleanup error:", err) - // } - // } + noCleanup := os.Getenv("LOTUS_TEST_NO_CLEANUP") != "" + for _, path := range t.StoragePaths { + if noCleanup { + fmt.Printf("Not cleaning up test storage at %s\n", path) + continue + } + if err := os.RemoveAll(path.Path); err != nil { + fmt.Println("Cleanup error:", err) + } + } } func (t testStorage) GetStorage() (stores.StorageConfig, error) { From a09aa0aa72604f4e3c9eb8e0fb55de1883e30ec4 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 30 Nov 2021 18:24:34 -0500 Subject: [PATCH 011/157] Bump the master version to v1.13.3-dev --- build/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/version.go b/build/version.go index cf1cd9a52..3656dc9ad 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.13.2-dev" +const BuildVersion = "1.13.3-dev" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { From c3ecf8355d02a1d88ebb2e83ddc5bf66f668c989 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 30 Nov 2021 18:29:13 -0500 Subject: [PATCH 012/157] docs gen --- build/openrpc/full.json.gz | Bin 25688 -> 25688 bytes build/openrpc/miner.json.gz | Bin 11151 -> 11151 bytes build/openrpc/worker.json.gz | Bin 3401 -> 3401 bytes documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 2e99a20e4253d51c68ce7090516a0d25c1fc2897..7d44a46a09de7e2f745e52919599de204a92b3a6 100644 GIT binary patch delta 25568 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 F{{t1e!yy0w delta 25569 zcmZUaQ*dQn8?9s8>e#luV>=z&wzFe*td4DWY}>YNtAo>D{pVbrS~sIsty(v8R?T;g zXN=WR(A81U_(aoYIwBktRq=gS55>3SgZ0r5&+#w{Olau)j5S4G@Sz1Vd!}}5#^(Mc7x?@xfTd8% zoc@C3-L|c+gK!HA26%%belr#We{+m+Km{ce=mUu)aR^+P<3M##UxPIbP(nJ62qqDQ zcm;I>Km*(S)9>CsUl*q785T5vGDza0S$A=E;LD4vP z(MP2yx(Z=ctAwb%VyVx$jyw`4A84PB&u!SlI*-}ETzAdiE?(?Tqd@st;P-`rfC##) z9?#M&A97h7Sgg38v~$l%DdFer)W@lOLi7<4K+cdEC`oW`%!-wZ#M;DZ>LsNXgaZ z&xFvqE#lDMHiP8<=|&%I%j5cP)5xR$4vOjec@C@ad@)-%U{D(Ggz*9A_fbhS+wu1O z3v~@|;rqtc!l#aGSnbfrxr;C|yPq3z7FceWB#)~ljZd+8$>Yfx`o;Cc&~4HuFEJ}3 z?8oIL(xCYh3HBeioV8RPror#D8DS38fb8RrAl9gn0qV7L_A~@g}A26g>M>Qgx0F3dMjpuzDVx00{nITZJrXVOYd9 z7iN*!1N7YpyZ|(cO>z7lRwOTX@W_0L$DlpkRK&<=Fo)PN9K-t9(g?>k*p}37$6UY+ z9qPutk<8@C{n`WJ+qyqTnbro?C=fv4hx@f;uRgL=iBcE5Rc&&~sJ-FDmtA$vuD3K{s*4*`|2 zjta1ST1?A^(J?w_C%l4)VloQJZEpvk!Y$x7&RiUj^fl`NFgyL32;y;3toX7vASKi3&6h#sr^b8AO?o&V~WeOIY~sr ze!qhjJ@J1A8BaCUbpnBp%#y0^xr9?cX!JfQoti)}{e(^Pk04emov zvFmghCioVc>h{l@7+Tj_V2KphBEUqO)Xx=9ApTe#+tAEUo~E>5eVL<;GM7dYde@a4 z4g#hZgr?-cCm~d0F)Y9&mt-3{{kuOP+##OoQD^i>WQ-%yM~$ilrZxXYn)4WL`vo3+ z)&%1~wk$cfAiiS8L)6B#Wz|2~{l9|Oj#J`kV^fkVm&2XZ(@CK?&s+`9rx z8r2B<=qL8`J40!o#?3bb9IFL3XRJHrSa84>jGq?}1J2mC`{2opM1jyjjY6cX6nhYXb81_WJz% z@d5hwZ0qP~FWe(-_mPboBJJcRR&ghnFu3p!(@0MwmST6nj6sc9m)svs12Oos^%0An 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

KB$Sd7U5LC7{>sC`yPDEiy&nLG)X9@XM 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 G^?v{mWpU^L diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index f02a58bec816a99be0c2ecb0df65dbffb92dce48..571159054d990e6f92087e375288003ed9e7a893 100644 GIT binary patch delta 21 ccmeAV?+>5Q%6NEV8>2SIqwGbdo7tHd0AlS2@c;k- delta 21 ccmeAV?+>5Q%GkWIjZvG!jPGmoW_Bh909rB!ApigX diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c6640c1404d5b2c9b33a424be1d53ce9d07fb007..83d951047168368962397ea15eb0ea4bc68c1800 100644 GIT binary patch delta 22 ecmX>pby8|VBhy8_jm`UbI6l;Vcpby8|VBU7OM#^!xI9N8@#-3|*G7yx7o2g3jW diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 9ae36b617..b448689ed 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.13.2-dev + 1.13.3-dev COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 09a93f091..ac133f908 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.13.2-dev + 1.13.3-dev COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index f3d2d6a06..eaefe25ce 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.13.2-dev + 1.13.3-dev COMMANDS: daemon Start a lotus daemon process From 66c8c66f402a4b05d7de75fdf54c624da9c7a844 Mon Sep 17 00:00:00 2001 From: Travis Person Date: Mon, 29 Nov 2021 20:51:37 +0000 Subject: [PATCH 013/157] disable building of appimage on release appimage testing is currently broken due to a requirement to have access to /dev/snd, which is not present on the image we are using in circleci. --- .circleci/config.yml | 9 --------- .circleci/template.yml | 9 --------- 2 files changed, 18 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e74cb7736..a4a88a090 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -976,19 +976,10 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - build-appimage: - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: requires: - build-all - build-macos - - build-appimage filters: branches: ignore: diff --git a/.circleci/template.yml b/.circleci/template.yml index 4b954391b..666ad39f5 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -816,19 +816,10 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - build-appimage: - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: requires: - build-all - build-macos - - build-appimage filters: branches: ignore: From f3b691d6186e055714484bf0faa239bb618fb1ef Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 1 Dec 2021 16:07:56 -0800 Subject: [PATCH 014/157] feat(tracing): switch to OpenTelemetry Switch the underlying tracing library to OpenTelemetry, with a bridge to OpenCensus for compatibility --- cmd/lotus-miner/main.go | 6 +-- cmd/lotus/main.go | 4 +- go.mod | 6 ++- go.sum | 27 ++++++++++-- lib/tracing/setup.go | 91 +++++++++++++++++++++++------------------ 5 files changed, 84 insertions(+), 50 deletions(-) diff --git a/cmd/lotus-miner/main.go b/cmd/lotus-miner/main.go index 110748f48..497a9e9fb 100644 --- a/cmd/lotus-miner/main.go +++ b/cmd/lotus-miner/main.go @@ -7,7 +7,6 @@ import ( "github.com/fatih/color" logging "github.com/ipfs/go-log/v2" "github.com/urfave/cli/v2" - "go.opencensus.io/trace" "golang.org/x/xerrors" cliutil "github.com/filecoin-project/lotus/cli/util" @@ -55,10 +54,11 @@ func main() { lcli.WithCategory("storage", sealingCmd), lcli.WithCategory("retrieval", piecesCmd), } + jaeger := tracing.SetupJaegerTracing("lotus") defer func() { if jaeger != nil { - jaeger.Flush() + _ = jaeger.ForceFlush(context.Background()) } }() @@ -66,7 +66,7 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - trace.UnregisterExporter(jaeger) + _ = jaeger.Shutdown(cctx.Context) jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if cctx.IsSet("color") { diff --git a/cmd/lotus/main.go b/cmd/lotus/main.go index 7aa2e704e..ddd695e68 100644 --- a/cmd/lotus/main.go +++ b/cmd/lotus/main.go @@ -39,7 +39,7 @@ func main() { jaeger := tracing.SetupJaegerTracing("lotus") defer func() { if jaeger != nil { - jaeger.Flush() + _ = jaeger.ForceFlush(context.Background()) } }() @@ -47,7 +47,7 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - trace.UnregisterExporter(jaeger) + _ = jaeger.Shutdown(cctx.Context) jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if originBefore != nil { diff --git a/go.mod b/go.mod index ba29f8cdf..cf234250a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/filecoin-project/lotus go 1.16 require ( - contrib.go.opencensus.io/exporter/jaeger v0.2.1 contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/BurntSushi/toml v0.4.1 github.com/GeertJohan/go.rice v1.0.2 @@ -139,6 +138,7 @@ require ( github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 + github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 @@ -147,6 +147,10 @@ require ( github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 go.opencensus.io v0.23.0 + go.opentelemetry.io/otel v1.2.0 + go.opentelemetry.io/otel/bridge/opencensus v0.25.0 + go.opentelemetry.io/otel/exporters/jaeger v1.2.0 + go.opentelemetry.io/otel/sdk v1.2.0 go.uber.org/dig v1.10.0 // indirect go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 diff --git a/go.sum b/go.sum index c0ceb01ae..905a758d8 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -120,8 +118,9 @@ github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NR github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= +github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -1758,6 +1757,7 @@ github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5J github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1899,13 +1899,32 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.2.0 h1:YOQDvxO1FayUcT9MIhJhgMyNO1WqoduiyvQHzGN0kUQ= +go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +go.opentelemetry.io/otel/bridge/opencensus v0.25.0 h1:18Ww8TpCEGes12HZJzB2nEbUglvMLzPxqgZypsrKiNc= +go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= +go.opentelemetry.io/otel/exporters/jaeger v1.2.0 h1:C/5Egj3MJBXRJi22cSl07suqPqtZLnLFmH//OxETUEc= +go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= +go.opentelemetry.io/otel/internal/metric v0.25.0 h1:w/7RXe16WdPylaIXDgcYM6t/q0K5lXgSdZOEbIEyliE= +go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.25.0 h1:7cXOnCADUsR3+EOqxPaSKwhEuNu0gz/56dRN1hpIdKw= +go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0 h1:6UjAFmVB5Fza3K5qUJpYWGrk8QMPIqlSnya5FI46VBY= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +go.opentelemetry.io/otel/sdk/metric v0.25.0 h1:J+Ta+4IAA5W9AdWhGQLfciEpavBqqSkBzTDeYvJLFNU= +go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.2.0 h1:Ys3iqbqZhcf28hHzrm5WAquMkDHNZTUkw7KHbuNjej0= +go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2218,6 +2237,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2346,7 +2366,6 @@ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/lib/tracing/setup.go b/lib/tracing/setup.go index b8c0399ad..1a2d8128e 100644 --- a/lib/tracing/setup.go +++ b/lib/tracing/setup.go @@ -4,9 +4,15 @@ import ( "os" "strings" - "contrib.go.opencensus.io/exporter/jaeger" + octrace "go.opencensus.io/trace" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/bridge/opencensus" + "go.opentelemetry.io/otel/exporters/jaeger" + "go.opentelemetry.io/otel/sdk/resource" + tracesdk "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.7.0" + logging "github.com/ipfs/go-log/v2" - "go.opencensus.io/trace" ) var log = logging.Logger("tracing") @@ -14,7 +20,6 @@ var log = logging.Logger("tracing") const ( // environment variable names envCollectorEndpoint = "LOTUS_JAEGER_COLLECTOR_ENDPOINT" - envAgentEndpoint = "LOTUS_JAEGER_AGENT_ENDPOINT" envAgentHost = "LOTUS_JAEGER_AGENT_HOST" envAgentPort = "LOTUS_JAEGER_AGENT_PORT" envJaegerUser = "LOTUS_JAEGER_USERNAME" @@ -26,54 +31,60 @@ const ( // The agent endpoint is a thrift/udp protocol and should be given // as a string like "hostname:port". The agent can also be configured // with separate host and port variables. -func jaegerOptsFromEnv(opts *jaeger.Options) bool { +func jaegerOptsFromEnv() jaeger.EndpointOption { var e string var ok bool - if e, ok = os.LookupEnv(envJaegerUser); ok { - if p, ok := os.LookupEnv(envJaegerCred); ok { - opts.Username = e - opts.Password = p - } else { - log.Warn("jaeger username supplied with no password. authentication will not be used.") - } - } + if e, ok = os.LookupEnv(envCollectorEndpoint); ok { - opts.CollectorEndpoint = e - log.Infof("jaeger tracess will send to collector %s", e) - return true - } - if e, ok = os.LookupEnv(envAgentEndpoint); ok { - log.Infof("jaeger traces will be sent to agent %s", e) - opts.AgentEndpoint = e - return true - } - if e, ok = os.LookupEnv(envAgentHost); ok { - if p, ok := os.LookupEnv(envAgentPort); ok { - opts.AgentEndpoint = strings.Join([]string{e, p}, ":") - } else { - opts.AgentEndpoint = strings.Join([]string{e, "6831"}, ":") + options := []jaeger.CollectorEndpointOption{jaeger.WithEndpoint(e)} + if u, ok := os.LookupEnv(envJaegerUser); ok { + if p, ok := os.LookupEnv(envJaegerCred); ok { + options = append(options, jaeger.WithUsername(u)) + options = append(options, jaeger.WithPassword(p)) + } else { + log.Warn("jaeger username supplied with no password. authentication will not be used.") + } } - log.Infof("jaeger traces will be sent to agent %s", opts.AgentEndpoint) - return true + log.Infof("jaeger tracess will send to collector %s", e) + return jaeger.WithCollectorEndpoint(options...) } - return false + + if e, ok = os.LookupEnv(envAgentHost); ok { + options := []jaeger.AgentEndpointOption{jaeger.WithAgentHost(e)} + var ep string + if p, ok := os.LookupEnv(envAgentPort); ok { + options = append(options, jaeger.WithAgentPort(p)) + ep = strings.Join([]string{e, p}, ":") + } else { + ep = strings.Join([]string{e, "6831"}, ":") + } + log.Infof("jaeger traces will be sent to agent %s", ep) + return jaeger.WithAgentEndpoint(options...) + } + return nil } -func SetupJaegerTracing(serviceName string) *jaeger.Exporter { - opts := jaeger.Options{} - if !jaegerOptsFromEnv(&opts) { +func SetupJaegerTracing(serviceName string) *tracesdk.TracerProvider { + jaegerEndpoint := jaegerOptsFromEnv() + if jaegerEndpoint == nil { return nil } - opts.ServiceName = serviceName - je, err := jaeger.NewExporter(opts) + je, err := jaeger.New(jaegerEndpoint) if err != nil { log.Errorw("failed to create the jaeger exporter", "error", err) return nil } - - trace.RegisterExporter(je) - trace.ApplyConfig(trace.Config{ - DefaultSampler: trace.AlwaysSample(), - }) - return je + tp := tracesdk.NewTracerProvider( + // Always be sure to batch in production. + tracesdk.WithBatcher(je), + // Record information about this application in an Resource. + tracesdk.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(serviceName), + )), + ) + otel.SetTracerProvider(tp) + tracer := tp.Tracer(serviceName) + octrace.DefaultTracer = opencensus.NewTracer(tracer) + return tp } From bfd1099ef3ff724bd1f68db591438f07953d9a80 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Wed, 1 Dec 2021 18:53:00 -0800 Subject: [PATCH 015/157] fix(main): fix bug in startup when tracing is not present --- cmd/lotus-miner/main.go | 4 +++- cmd/lotus/main.go | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/main.go b/cmd/lotus-miner/main.go index 497a9e9fb..57b5d8a3e 100644 --- a/cmd/lotus-miner/main.go +++ b/cmd/lotus-miner/main.go @@ -66,7 +66,9 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - _ = jaeger.Shutdown(cctx.Context) + if jaeger != nil { + _ = jaeger.Shutdown(cctx.Context) + } jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if cctx.IsSet("color") { diff --git a/cmd/lotus/main.go b/cmd/lotus/main.go index ddd695e68..c19b9fce4 100644 --- a/cmd/lotus/main.go +++ b/cmd/lotus/main.go @@ -47,7 +47,9 @@ func main() { cmd := cmd originBefore := cmd.Before cmd.Before = func(cctx *cli.Context) error { - _ = jaeger.Shutdown(cctx.Context) + if jaeger != nil { + _ = jaeger.Shutdown(cctx.Context) + } jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) if originBefore != nil { From c2437b7bf2a24d4244a00945d9ebfe304cf05cb6 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Wed, 1 Dec 2021 22:37:22 -0500 Subject: [PATCH 016/157] Create pull_request_template.md This is the very first iteration of the lotus PR template. The goal of adding PR template is to standardize PR requests and encourage contributors to: - come up with good PR descriptions to give code reviewers a clear overview of what's in the PR - have a clear PR title as lotus generates a change log based on it - check that tests and documentation for the codes that changed are icnluded The PR type follows the https://www.conventionalcommits.org/en/v1.0.0-beta.2/. The [contribution guideline](https://github.com/filecoin-project/lotus#contribute) should be updated with how to create a pr after the template is accepted. --- .github/pull_request_template.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..6984f6ffd --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ +## Related Issues + + +## Proposed Changes + + + +## Additional Info + + +## Checklist + +Before you mark the PR ready for review, please make sure that: +- [ ] The PR title is in the form of of `: <#issue number> : ` + - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` + - `PR type`: _fix_, _feat_, _BREAKING CHANGE_, _build_, _chore_, _ci_, _docs_, _perf_, _refactor_, _revert_, _style_, _test_ + - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ +- [ ] This PR has tests for new functionality or change in behaviour +- [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) +- [ ] CI is green From 05c132588519be2ac190a3f74ea6584c04945dca Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 11:50:35 +0200 Subject: [PATCH 017/157] add logic for supressing compaction near upgrade boundaries --- blockstore/splitstore/splitstore.go | 32 ++++++++++++++++++++- blockstore/splitstore/splitstore_compact.go | 16 +++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 0e34fe952..e0366512f 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -18,6 +18,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" bstore "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/metrics" @@ -47,6 +49,9 @@ var ( enableDebugLog = false // set this to true if you want to track origin stack traces in the write log enableDebugLogWriteTraces = false + + // upgradeBoundary is the boundary before and after an upgrade where we supress compaction + upgradeBoundary = build.Finality ) func init() { @@ -98,6 +103,12 @@ type ChainAccessor interface { SubscribeHeadChanges(change func(revert []*types.TipSet, apply []*types.TipSet) error) } +// upgradeRange is a precomputed epoch range during which we shouldn't compact so as to not +// interfere with an upgrade +type upgradeRange struct { + start, end abi.ChainEpoch +} + // hotstore is the interface that must be satisfied by the hot blockstore; it is an extension // of the Blockstore interface with the traits we need for compaction. type hotstore interface { @@ -125,6 +136,8 @@ type SplitStore struct { cold bstore.Blockstore hot hotstore + upgrades []upgradeRange + markSetEnv MarkSetEnv markSetSize int64 @@ -463,10 +476,27 @@ func (s *SplitStore) isWarm() bool { } // State tracking -func (s *SplitStore) Start(chain ChainAccessor) error { +func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error { s.chain = chain curTs := chain.GetHeaviestTipSet() + // precompute the upgrade boundaries + s.upgrades = make([]upgradeRange, 0, len(us)) + for _, upgrade := range us { + boundary := upgrade.Height + for _, pre := range upgrade.PreMigrations { + preMigrationBoundary := upgrade.Height - pre.StartWithin + if preMigrationBoundary < boundary { + boundary = preMigrationBoundary + } + } + + upgradeStart := boundary - upgradeBoundary + upgradeEnd := upgrade.Height + upgradeBoundary + + s.upgrades = append(s.upgrades, upgradeRange{start: upgradeStart, end: upgradeEnd}) + } + // should we warmup warmup := false diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 4ff38a5fb..3a1fda202 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -99,6 +99,12 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error { return nil } + if s.isNearUpgrade(epoch) { + // we are near an upgrade epoch, supress compaction + atomic.StoreInt32(&s.compacting, 0) + return nil + } + if epoch-s.baseEpoch > CompactionThreshold { // it's time to compact -- prepare the transaction and go! s.beginTxnProtect() @@ -121,6 +127,16 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error { return nil } +func (s *SplitStore) isNearUpgrade(epoch abi.ChainEpoch) bool { + for _, upgrade := range s.upgrades { + if epoch >= upgrade.start && epoch <= upgrade.end { + return true + } + } + + return false +} + // transactionally protect incoming tipsets func (s *SplitStore) protectTipSets(apply []*types.TipSet) { s.txnLk.RLock() From 6ce5879071a5f206623c4e822acab4ad69a8561f Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:05:15 +0200 Subject: [PATCH 018/157] add unit test for compaction supression --- blockstore/splitstore/splitstore_test.go | 137 ++++++++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index df9984d41..6d8ff465f 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/mock" @@ -90,7 +91,7 @@ func testSplitStore(t *testing.T, cfg *Config) { return protect(protected.Cid()) }) - err = ss.Start(chain) + err = ss.Start(chain, nil) if err != nil { t.Fatal(err) } @@ -220,6 +221,140 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) { testSplitStore(t, &Config{MarkSetType: "badger"}) } +func TestSplitStoreSupressCompactionNearUpgrade(t *testing.T) { + chain := &mockChain{t: t} + + // the myriads of stores + ds := dssync.MutexWrap(datastore.NewMapDatastore()) + hot := newMockStore() + cold := newMockStore() + + // this is necessary to avoid the garbage mock puts in the blocks + garbage := blocks.NewBlock([]byte{1, 2, 3}) + err := cold.Put(garbage) + if err != nil { + t.Fatal(err) + } + + // genesis + genBlock := mock.MkBlock(nil, 0, 0) + genBlock.Messages = garbage.Cid() + genBlock.ParentMessageReceipts = garbage.Cid() + genBlock.ParentStateRoot = garbage.Cid() + genBlock.Timestamp = uint64(time.Now().Unix()) + + genTs := mock.TipSet(genBlock) + chain.push(genTs) + + // put the genesis block to cold store + blk, err := genBlock.ToStorageBlock() + if err != nil { + t.Fatal(err) + } + + err = cold.Put(blk) + if err != nil { + t.Fatal(err) + } + + // open the splitstore + ss, err := Open("", ds, hot, cold, &Config{MarkSetType: "map"}) + if err != nil { + t.Fatal(err) + } + defer ss.Close() //nolint + + // create an upgrade schedule that will supress compaction during the test + upgradeBoundary = 0 + upgrade := stmgr.Upgrade{ + Height: 10, + PreMigrations: []stmgr.PreMigration{{StartWithin: 10}}, + } + + err = ss.Start(chain, []stmgr.Upgrade{upgrade}) + if err != nil { + t.Fatal(err) + } + + mkBlock := func(curTs *types.TipSet, i int, stateRoot blocks.Block) *types.TipSet { + blk := mock.MkBlock(curTs, uint64(i), uint64(i)) + + blk.Messages = garbage.Cid() + blk.ParentMessageReceipts = garbage.Cid() + blk.ParentStateRoot = stateRoot.Cid() + blk.Timestamp = uint64(time.Now().Unix()) + + sblk, err := blk.ToStorageBlock() + if err != nil { + t.Fatal(err) + } + err = ss.Put(stateRoot) + if err != nil { + t.Fatal(err) + } + err = ss.Put(sblk) + if err != nil { + t.Fatal(err) + } + ts := mock.TipSet(blk) + chain.push(ts) + + return ts + } + + waitForCompaction := func() { + for atomic.LoadInt32(&ss.compacting) == 1 { + time.Sleep(100 * time.Millisecond) + } + } + + curTs := genTs + for i := 1; i < 10; i++ { + stateRoot := blocks.NewBlock([]byte{byte(i), 3, 3, 7}) + curTs = mkBlock(curTs, i, stateRoot) + waitForCompaction() + } + + countBlocks := func(bs blockstore.Blockstore) int { + count := 0 + _ = bs.(blockstore.BlockstoreIterator).ForEachKey(func(_ cid.Cid) error { + count++ + return nil + }) + return count + } + + // we should not have compacted due to suppression and everything should still be hot + hotCnt := countBlocks(hot) + coldCnt := countBlocks(cold) + + if hotCnt != 20 { + t.Errorf("expected %d blocks, but got %d", 20, hotCnt) + } + + if coldCnt != 2 { + t.Errorf("expected %d blocks, but got %d", 2, coldCnt) + } + + // put some more blocks, now we should compact + for i := 10; i < 20; i++ { + stateRoot := blocks.NewBlock([]byte{byte(i), 3, 3, 7}) + curTs = mkBlock(curTs, i, stateRoot) + waitForCompaction() + } + + hotCnt = countBlocks(hot) + coldCnt = countBlocks(cold) + + if hotCnt != 24 { + t.Errorf("expected %d blocks, but got %d", 24, hotCnt) + } + + if coldCnt != 18 { + t.Errorf("expected %d blocks, but got %d", 18, coldCnt) + } +} + type mockChain struct { t testing.TB From 5d6398f20e901657b3244c90e7465173f04484ec Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:11:54 +0200 Subject: [PATCH 019/157] hook the upgrade schedule to splitstore start --- node/modules/chain.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/node/modules/chain.go b/node/modules/chain.go index 3518c3b29..b5be24d5d 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -78,6 +78,7 @@ func ChainStore(lc fx.Lifecycle, ds dtypes.MetadataDS, basebs dtypes.BaseBlockstore, weight store.WeightFunc, + us stmgr.UpgradeSchedule, j journal.Journal) *store.ChainStore { chain := store.NewChainStore(cbs, sbs, ds, weight, j) @@ -89,7 +90,7 @@ func ChainStore(lc fx.Lifecycle, var startHook func(context.Context) error if ss, ok := basebs.(*splitstore.SplitStore); ok { startHook = func(_ context.Context) error { - err := ss.Start(chain) + err := ss.Start(chain, us) if err != nil { err = xerrors.Errorf("error starting splitstore: %w", err) } From 489782e21bfac677377329dce1bbf4b42a396b0b Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:15:28 +0200 Subject: [PATCH 020/157] satisfy the spellchecker that masquarades as a linter --- blockstore/splitstore/splitstore.go | 2 +- blockstore/splitstore/splitstore_compact.go | 2 +- blockstore/splitstore/splitstore_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index e0366512f..145e31d7a 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -50,7 +50,7 @@ var ( // set this to true if you want to track origin stack traces in the write log enableDebugLogWriteTraces = false - // upgradeBoundary is the boundary before and after an upgrade where we supress compaction + // upgradeBoundary is the boundary before and after an upgrade where we suppress compaction upgradeBoundary = build.Finality ) diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 3a1fda202..04c2562fa 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -100,7 +100,7 @@ func (s *SplitStore) HeadChange(_, apply []*types.TipSet) error { } if s.isNearUpgrade(epoch) { - // we are near an upgrade epoch, supress compaction + // we are near an upgrade epoch, suppress compaction atomic.StoreInt32(&s.compacting, 0) return nil } diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index 6d8ff465f..f9111a979 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -221,7 +221,7 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) { testSplitStore(t, &Config{MarkSetType: "badger"}) } -func TestSplitStoreSupressCompactionNearUpgrade(t *testing.T) { +func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { chain := &mockChain{t: t} // the myriads of stores @@ -264,7 +264,7 @@ func TestSplitStoreSupressCompactionNearUpgrade(t *testing.T) { } defer ss.Close() //nolint - // create an upgrade schedule that will supress compaction during the test + // create an upgrade schedule that will suppress compaction during the test upgradeBoundary = 0 upgrade := stmgr.Upgrade{ Height: 10, From 727765b248ad0a07e42892f80cfbcb8b5a99db44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Dec 2021 12:33:23 +0100 Subject: [PATCH 021/157] Command to list active sector locks --- api/api_storage.go | 1 + api/docgen/docgen.go | 7 ++++ api/proxy_gen.go | 13 +++++++ build/openrpc/full.json.gz | Bin 25688 -> 25690 bytes build/openrpc/miner.json.gz | Bin 11151 -> 11267 bytes build/openrpc/worker.json.gz | Bin 3401 -> 3402 bytes cmd/lotus-miner/storage.go | 41 ++++++++++++++++++++ documentation/en/api-v0-methods-miner.md | 32 +++++++++++++++ documentation/en/cli-lotus-miner.md | 14 +++++++ extern/sector-storage/stores/index.go | 1 + extern/sector-storage/stores/index_locks.go | 30 ++++++++++++++ extern/sector-storage/stores/mocks/index.go | 15 +++++++ extern/sector-storage/storiface/storage.go | 16 ++++++++ 13 files changed, 170 insertions(+) diff --git a/api/api_storage.go b/api/api_storage.go index 8cca2aa5b..4e09ecfa5 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -145,6 +145,7 @@ type StorageMiner interface { StorageLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) error //perm:admin StorageTryLock(ctx context.Context, sector abi.SectorID, read storiface.SectorFileType, write storiface.SectorFileType) (bool, error) //perm:admin StorageList(ctx context.Context) (map[stores.ID][]stores.Decl, error) //perm:admin + StorageGetLocks(ctx context.Context) (storiface.SectorLocks, error) //perm:admin StorageLocal(ctx context.Context) (map[stores.ID]string, error) //perm:admin StorageStat(ctx context.Context, id stores.ID) (fsutil.FsStat, error) //perm:admin diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 5478e5ea6..5d87e9d20 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -254,6 +254,13 @@ func init() { api.SectorState(sealing.Proving): 120, }) addExample([]abi.SectorNumber{123, 124}) + addExample([]storiface.SectorLock{ + { + Sector: abi.SectorID{Number: 123, Miner: 1000}, + Write: [storiface.FileTypes]uint{0, 0, 1}, + Read: [storiface.FileTypes]uint{2, 3, 0}, + }, + }) // worker specific addExample(storiface.AcquireMove) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index feb08531f..88ff4cd15 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -794,6 +794,8 @@ type StorageMinerStruct struct { StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]stores.SectorStorageInfo, error) `perm:"admin"` + StorageGetLocks func(p0 context.Context) (storiface.SectorLocks, error) `perm:"admin"` + StorageInfo func(p0 context.Context, p1 stores.ID) (stores.StorageInfo, error) `perm:"admin"` StorageList func(p0 context.Context) (map[stores.ID][]stores.Decl, error) `perm:"admin"` @@ -4647,6 +4649,17 @@ func (s *StorageMinerStub) StorageFindSector(p0 context.Context, p1 abi.SectorID return *new([]stores.SectorStorageInfo), ErrNotSupported } +func (s *StorageMinerStruct) StorageGetLocks(p0 context.Context) (storiface.SectorLocks, error) { + if s.Internal.StorageGetLocks == nil { + return *new(storiface.SectorLocks), ErrNotSupported + } + return s.Internal.StorageGetLocks(p0) +} + +func (s *StorageMinerStub) StorageGetLocks(p0 context.Context) (storiface.SectorLocks, error) { + return *new(storiface.SectorLocks), ErrNotSupported +} + func (s *StorageMinerStruct) StorageInfo(p0 context.Context, p1 stores.ID) (stores.StorageInfo, error) { if s.Internal.StorageInfo == nil { return *new(stores.StorageInfo), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 7d44a46a09de7e2f745e52919599de204a92b3a6..e39ebc6a20737848c433d295d93d694532317089 100644 GIT binary patch delta 19509 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 P00960TAg5rWeNoVQ2FDC diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 571159054d990e6f92087e375288003ed9e7a893..e09ecdcb519a2a7f9579555b217e97820ce46dd6 100644 GIT binary patch delta 11261 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 delta 11144 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 a;oGCB_W1ba@&5+^0RR8uYoax?2Lb?bU%HO~ diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 83d951047168368962397ea15eb0ea4bc68c1800..f5cbf4b84c5eca57fffa63a1e3f4e858babdd5a0 100644 GIT binary patch delta 1321 zcmV+^1=jk>8p;~53IhXCUlEfH13`a-UcM;(fw-}(C`f*rYG^hxv_ZL`F93xPXQPKx z$d_TU9xHxl_|yK$F;PWO>$BPvqTS3xIXK(m)}Ii!7Rh~cpsof)mj$L-4J{>g5<}3! zWFf_vVx0OV^}x)GeJID5?L45pnQD<{i!@&w(j2M<@BkBN;U6emi;6fQ(YTY%13dzc zw6hEZJp+HN=V#-7avsoikcwY1DL2-#o(GFnMJ@ZLIY3ecBZAC9CMo{5JV#OoFp&h;>3&Agb;kg+gLF zHV}k>GY8-OQ3DpVm%#!NM8yh+6|EKczCy@r3EPnHRfmMysK|f%cUx6;o1#&Xw}dks+Wo8dZvzjQ?*K(7`F^j8e+yX=r1M?c zW-qi0{^U!6B5U$-@o|>a_5vNRrnb#$Kt+Ff&$E@EJu7>iW>^^8@Y|wU%X;C;rH}KK zOGM?DeuiCEdUk7AtYtM&8VDt{zWDJIL5yv0fcJF<8XP~MObtD}Ki!L0qAD6;}zZrU#RCVdaT*|JX02{@un3;9CU|p38r_@3NR#t)6!yN<$d=r^ok(xoYz;S8exj&rLVa z0orDT_~pU9*3Y$m?zQ>3VZnz~gh8KDwEy-{)VP)%qEs}shX;%pYSIZNh8^GTX?@{Y z=jjE4`Ea3N(LewcvQ-Uy$9u4{TpWiH@}_lx74i zVGx;5Cb+_)P_kqF9V*pH)|!{-%rMJ;Dexxt-0LRK3n&+b%x@wxRnqyYP3+Z~e616&P=O-Vqu<(|x6YIX;qn zMc63R02jBOqG$*N7Z)5H2tPB5%!)i;zs!bP{;kb^%Im(@r@iW}qrTFU*9+v@}00960R+AgLK%oEtq7{$A delta 1320 zcmV+@1=sq@8p#^43IhX?HWZT$13`cKC|{KRK-^eX6ePb*H8dL;+Mry}7l6Wtv(dvT zn5ZJC^;vBS(Qf9U9Gq=&>raSVi{!pJP*($@%L3D^hL(~#i6LlV zvXEj-F;4xGdSGV8K9u9jb{^2)Otna}MVhY-Y4*nj@BkBN;U6emi;6fQ(YTY%13dx` zm9q>4Jp+H#%g@IBf-l{2Fn$LXA3mOXNLLo67 z8wf(cnS<~Cr~wPw%V2>BqGE-^iq;BzUm_CLyCrTw4=@fXuXeXzo=R^AomrmvlM?qs zlyZOAjoc~sybFFEYSz>9)$9wh5M=1a-)OIV#Z{{HF|Qm*k!~td%Z{*(*3Jrhoa%qEn zGI^4^!eGMrN}c_H27=mm zW-bRS4Qc~E)7U+--G7|Ne_e0o*zP|wdyZCfO`l`UTMax9>FR?X!~k{nSJ6~P#H+1m zd>X2>tP^Cl0cjhMzGTd-7ksNA!gGIF_gxk^k|Md9YFjs9J=Bn);?z!pa zIY8U25WhUQ*ZR5E&%HK3*Dv^xiZJL?iuT_giW=9lLzIf9_V9oaLrprt#IWPrJ*_W1 z3;jI@U-;^`dD^Xy7Dcou;wM58gM#m^Bs}6i0dv%NznD34$NPoN5&ffphBkkAK08%C z2f&ak%`Xo#w4Sf^e6P*(jS9Y&vR`8T;TiQ!rP4o_L;n%qqtv+o8O%Hmw#oG*%(aST z%nL0rG4ns3+h)uEJlXQ&ffq3fzXU5gvi>51Hl+6q z@Fm)41!MpP&$=7!=zz}-2YfmS#XpzhPqt%M&S;cCIjK(QtP0@y>qgNC)qchFrO z;=N_8mF}NHy0wCHJDWABdY!|zU495`L-%WT;qRE=`f0r@Fy8jOBQ$=d`$_?Gd?fjb zuqdekE^a+V(GUnOE;u+4er6Pz6?wjXnGLu6Tbuoq*L|-~d(~S 0 { + lockstr += fmt.Sprintf("%s(%s) ", storiface.SectorFileType(1< 0 { + lockstr += fmt.Sprintf("%s(%s:%d) ", storiface.SectorFileType(1< Date: Fri, 3 Dec 2021 17:07:14 +0100 Subject: [PATCH 022/157] Add metrics to dagstore piecereader --- markets/dagstore/piecereader.go | 14 +++++++++ metrics/metrics.go | 50 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/markets/dagstore/piecereader.go b/markets/dagstore/piecereader.go index 6ef69dfbe..f9ba881f5 100644 --- a/markets/dagstore/piecereader.go +++ b/markets/dagstore/piecereader.go @@ -2,6 +2,8 @@ package dagstore import ( "context" + "github.com/filecoin-project/lotus/metrics" + "go.opencensus.io/stats" "io" "github.com/ipfs/go-cid" @@ -29,6 +31,8 @@ type pieceReader struct { } func (p *pieceReader) init() (_ *pieceReader, err error) { + stats.Record(p.ctx, metrics.DagStorePRInitCount.M(1)) + p.rAt = 0 p.r, p.len, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) if err != nil { @@ -95,6 +99,8 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { return 0, err } + stats.Record(p.ctx, metrics.DagStorePRBytesRequested.M(int64(len(b)))) + // 1. Get the backing reader into the correct position // if the backing reader is ahead of the offset we want, or more than @@ -109,6 +115,12 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { log.Debugw("pieceReader new stream", "piece", p.pieceCid, "at", p.rAt, "off", off-p.rAt) + if off > p.rAt { + stats.Record(p.ctx, metrics.DagStorePRSeekForwardBytes.M(off-p.rAt), metrics.DagStorePRSeekForwardCount.M(1)) + } else { + stats.Record(p.ctx, metrics.DagStorePRSeekBackBytes.M(p.rAt-off), metrics.DagStorePRSeekBackCount.M(1)) + } + p.rAt = off p.r, _, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) if err != nil { @@ -118,6 +130,8 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { // 2. Check if we need to burn some bytes if off > p.rAt { + stats.Record(p.ctx, metrics.DagStorePRBytesDiscarded.M(off-p.rAt), metrics.DagStorePRDiscardCount.M(1)) + n, err := io.CopyN(io.Discard, p.r, off-p.rAt) p.rAt += n if err != nil { diff --git a/metrics/metrics.go b/metrics/metrics.go index ddd149d8d..b4032bb1d 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -128,6 +128,15 @@ var ( StorageLimitUsedBytes = stats.Int64("storage/path_limit_used_bytes", "used optional storage limit bytes", stats.UnitBytes) StorageLimitMaxBytes = stats.Int64("storage/path_limit_max_bytes", "optional storage limit", stats.UnitBytes) + DagStorePRInitCount = stats.Int64("dagstore/pr_init_count", "PieceReader init count", stats.UnitDimensionless) + DagStorePRBytesRequested = stats.Int64("dagstore/pr_requested_bytes", "PieceReader requested bytes", stats.UnitBytes) + DagStorePRBytesDiscarded = stats.Int64("dagstore/pr_discarded_bytes", "PieceReader discarded bytes", stats.UnitBytes) + DagStorePRDiscardCount = stats.Int64("dagstore/pr_discard_count", "PieceReader discard count", stats.UnitDimensionless) + DagStorePRSeekBackCount = stats.Int64("dagstore/pr_seek_back_count", "PieceReader seek back count", stats.UnitDimensionless) + DagStorePRSeekForwardCount = stats.Int64("dagstore/pr_seek_forward_count", "PieceReader seek forward count", stats.UnitDimensionless) + DagStorePRSeekBackBytes = stats.Int64("dagstore/pr_seek_back_bytes", "PieceReader seek back bytes", stats.UnitBytes) + DagStorePRSeekForwardBytes = stats.Int64("dagstore/pr_seek_forward_bytes", "PieceReader seek forward bytes", stats.UnitBytes) + // splitstore SplitstoreMiss = stats.Int64("splitstore/miss", "Number of misses in hotstre access", stats.UnitDimensionless) SplitstoreCompactionTimeSeconds = stats.Float64("splitstore/compaction_time", "Compaction time in seconds", stats.UnitSeconds) @@ -383,6 +392,39 @@ var ( TagKeys: []tag.Key{StorageID}, } + DagStorePRInitCountView = &view.View{ + Measure: DagStorePRInitCount, + Aggregation: view.Count(), + } + DagStorePRBytesRequestedView = &view.View{ + Measure: DagStorePRBytesRequested, + Aggregation: view.Sum(), + } + DagStorePRBytesDiscardedView = &view.View{ + Measure: DagStorePRBytesDiscarded, + Aggregation: view.Sum(), + } + DagStorePRDiscardCountView = &view.View{ + Measure: DagStorePRDiscardCount, + Aggregation: view.Count(), + } + DagStorePRSeekBackCountView = &view.View{ + Measure: DagStorePRSeekBackCount, + Aggregation: view.Count(), + } + DagStorePRSeekForwardCountView = &view.View{ + Measure: DagStorePRSeekForwardCount, + Aggregation: view.Count(), + } + DagStorePRSeekBackBytesView = &view.View{ + Measure: DagStorePRSeekBackBytes, + Aggregation: view.Sum(), + } + DagStorePRSeekForwardBytesView = &view.View{ + Measure: DagStorePRSeekForwardBytes, + Aggregation: view.Sum(), + } + // splitstore SplitstoreMissView = &view.View{ Measure: SplitstoreMiss, @@ -539,6 +581,14 @@ var MinerNodeViews = append([]*view.View{ StorageReservedBytesView, StorageLimitUsedBytesView, StorageLimitMaxBytesView, + DagStorePRInitCountView, + DagStorePRBytesRequestedView, + DagStorePRBytesDiscardedView, + DagStorePRDiscardCountView, + DagStorePRSeekBackCountView, + DagStorePRSeekForwardCountView, + DagStorePRSeekBackBytesView, + DagStorePRSeekForwardBytesView, }, DefaultViews...) // SinceInMilliseconds returns the duration of time since the provide time as a float64. From 3969d6b767f0282f71ec69bd2ae40a60b8edc106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Dec 2021 20:11:52 +0100 Subject: [PATCH 023/157] dagstore pieceReader: Always read full in ReadAt --- markets/dagstore/piecereader.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/markets/dagstore/piecereader.go b/markets/dagstore/piecereader.go index f9ba881f5..14a027bd1 100644 --- a/markets/dagstore/piecereader.go +++ b/markets/dagstore/piecereader.go @@ -1,21 +1,23 @@ package dagstore import ( + "bufio" "context" - "github.com/filecoin-project/lotus/metrics" - "go.opencensus.io/stats" "io" "github.com/ipfs/go-cid" + "go.opencensus.io/stats" "golang.org/x/xerrors" "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/metrics" ) // For small read skips, it's faster to "burn" some bytes than to setup new sector reader. // Assuming 1ms stream seek latency, and 1G/s stream rate, we're willing to discard up to 1 MiB. var MaxPieceReaderBurnBytes int64 = 1 << 20 // 1M +var ReadBuf = 128 * (127 * 8) // unpadded(128k) type pieceReader struct { ctx context.Context @@ -27,6 +29,7 @@ type pieceReader struct { seqAt int64 // next byte to be read by io.Reader r io.ReadCloser + br *bufio.Reader rAt int64 } @@ -38,6 +41,7 @@ func (p *pieceReader) init() (_ *pieceReader, err error) { if err != nil { return nil, err } + p.br = bufio.NewReaderSize(p.r, ReadBuf) return p, nil } @@ -111,9 +115,10 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { return 0, xerrors.Errorf("closing backing reader: %w", err) } p.r = nil + p.br = nil } - log.Debugw("pieceReader new stream", "piece", p.pieceCid, "at", p.rAt, "off", off-p.rAt) + log.Debugw("pieceReader new stream", "piece", p.pieceCid, "at", p.rAt, "off", off-p.rAt, "n", len(b)) if off > p.rAt { stats.Record(p.ctx, metrics.DagStorePRSeekForwardBytes.M(off-p.rAt), metrics.DagStorePRSeekForwardCount.M(1)) @@ -123,6 +128,7 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { p.rAt = off p.r, _, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) + p.br = bufio.NewReaderSize(p.r, ReadBuf) if err != nil { return 0, xerrors.Errorf("getting backing reader: %w", err) } @@ -132,7 +138,7 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { if off > p.rAt { stats.Record(p.ctx, metrics.DagStorePRBytesDiscarded.M(off-p.rAt), metrics.DagStorePRDiscardCount.M(1)) - n, err := io.CopyN(io.Discard, p.r, off-p.rAt) + n, err := io.CopyN(io.Discard, p.br, off-p.rAt) p.rAt += n if err != nil { return 0, xerrors.Errorf("discarding read gap: %w", err) @@ -145,7 +151,11 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { } // 4. Read! - n, err = p.r.Read(b) + n, err = io.ReadFull(p.br, b) + if n < len(b) { + log.Debugw("pieceReader short read", "piece", p.pieceCid, "at", p.rAt, "toEnd", int64(p.len)-p.rAt, "n", len(b), "read", n, "err", err) + } + p.rAt += int64(n) return n, err } From a5be80828a28908b665b9f5b5a647b084c2bc6ba Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 1 Dec 2021 14:01:55 -0500 Subject: [PATCH 024/157] RemoveData and Decode - Unsealing replica update with sector key works and tested - Sector key generation added and tested --- api/api_storage.go | 1 + api/api_worker.go | 1 + api/proxy_gen.go | 26 +++++++ build/openrpc/full.json.gz | Bin 25466 -> 25465 bytes build/openrpc/miner.json.gz | Bin 10672 -> 10724 bytes build/openrpc/worker.json.gz | Bin 2940 -> 3000 bytes documentation/en/api-v0-methods-miner.md | 25 ++++++ documentation/en/api-v0-methods-worker.md | 37 +++++++++ extern/filecoin-ffi | 2 +- .../sector-storage/ffiwrapper/sealer_cgo.go | 60 ++++++++++++-- extern/sector-storage/manager.go | 73 +++++++++++++++++- extern/sector-storage/manager_test.go | 36 ++++++--- extern/sector-storage/mock/mock.go | 8 ++ extern/sector-storage/sched_test.go | 4 + extern/sector-storage/sealtasks/task.go | 5 +- extern/sector-storage/storiface/worker.go | 2 + extern/sector-storage/teststorage_test.go | 4 + extern/sector-storage/worker_local.go | 13 ++++ go.mod | 2 +- go.sum | 4 +- itests/self_sent_txn_test.go | 3 +- 21 files changed, 281 insertions(+), 25 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index bf7520d09..92117d2fb 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -127,6 +127,7 @@ type StorageMiner interface { ReturnReplicaUpdate(ctx context.Context, callID storiface.CallID, out storage.ReplicaUpdateOut, err *storiface.CallError) error //perm:admin retry:true ReturnProveReplicaUpdate1(ctx context.Context, callID storiface.CallID, vanillaProofs storage.ReplicaVanillaProofs, err *storiface.CallError) error //perm:admin retry:true ReturnProveReplicaUpdate2(ctx context.Context, callID storiface.CallID, proof storage.ReplicaUpdateProof, err *storiface.CallError) error //perm:admin retry:true + ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnReleaseUnsealed(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true ReturnUnsealPiece(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error //perm:admin retry:true diff --git a/api/api_worker.go b/api/api_worker.go index 5e0b4f8c6..68d8e7baf 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -42,6 +42,7 @@ type Worker interface { ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storiface.CallID, error) //perm:admin ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) //perm:admin ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storiface.CallID, error) //perm:admin + GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (storiface.CallID, error) //perm:admin ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, safeToFree []storage.Range) (storiface.CallID, error) //perm:admin MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) //perm:admin UnsealPiece(context.Context, storage.SectorRef, storiface.UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (storiface.CallID, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index b78b40959..5733c3cc8 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -707,6 +707,8 @@ type StorageMinerStruct struct { ReturnFinalizeSector func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnGenerateSectorKeyFromData func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` + ReturnMoveStorage func(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error `perm:"admin"` ReturnProveReplicaUpdate1 func(p0 context.Context, p1 storiface.CallID, p2 storage.ReplicaVanillaProofs, p3 *storiface.CallError) error `perm:"admin"` @@ -850,6 +852,8 @@ type WorkerStruct struct { FinalizeSector func(p0 context.Context, p1 storage.SectorRef, p2 []storage.Range) (storiface.CallID, error) `perm:"admin"` + GenerateSectorKeyFromData func(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid) (storiface.CallID, error) `perm:"admin"` + Info func(p0 context.Context) (storiface.WorkerInfo, error) `perm:"admin"` MoveStorage func(p0 context.Context, p1 storage.SectorRef, p2 storiface.SectorFileType) (storiface.CallID, error) `perm:"admin"` @@ -4166,6 +4170,17 @@ func (s *StorageMinerStub) ReturnFinalizeSector(p0 context.Context, p1 storiface return ErrNotSupported } +func (s *StorageMinerStruct) ReturnGenerateSectorKeyFromData(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + if s.Internal.ReturnGenerateSectorKeyFromData == nil { + return ErrNotSupported + } + return s.Internal.ReturnGenerateSectorKeyFromData(p0, p1, p2) +} + +func (s *StorageMinerStub) ReturnGenerateSectorKeyFromData(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) ReturnMoveStorage(p0 context.Context, p1 storiface.CallID, p2 *storiface.CallError) error { if s.Internal.ReturnMoveStorage == nil { return ErrNotSupported @@ -4859,6 +4874,17 @@ func (s *WorkerStub) FinalizeSector(p0 context.Context, p1 storage.SectorRef, p2 return *new(storiface.CallID), ErrNotSupported } +func (s *WorkerStruct) GenerateSectorKeyFromData(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid) (storiface.CallID, error) { + if s.Internal.GenerateSectorKeyFromData == nil { + return *new(storiface.CallID), ErrNotSupported + } + return s.Internal.GenerateSectorKeyFromData(p0, p1, p2) +} + +func (s *WorkerStub) GenerateSectorKeyFromData(p0 context.Context, p1 storage.SectorRef, p2 cid.Cid) (storiface.CallID, error) { + return *new(storiface.CallID), ErrNotSupported +} + func (s *WorkerStruct) Info(p0 context.Context) (storiface.WorkerInfo, error) { if s.Internal.Info == nil { return *new(storiface.WorkerInfo), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index a5816ef4f3d57f10df36cc9e5a911257fb47e0e6..839e95e61f36b78820c1705ba99bb12de914ce52 100644 GIT binary patch delta 24891 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0c176bbef0d3f369e719e67fffeed4443dd180b3..f0eaa49ec9bd976dc3f27084730e55661bfeaf14 100644 GIT binary patch delta 10012 zcmV+%C*#<#Q{+>SNCI$pkxDjy9)r>TaL+<_#zW6oBetTJXB>b2W)QgMUEgCHnG}=# z6O&Q*#IjuEc}CB$kY~EsVG_(=fBm(jH)OFPCV1t6pJt4@aEU%*g4`K%Hzs=x;s9Pb zePB|;&{wv9D*yW$yn^!OzTc<^kn2+SHTZTzZWvwwZ~vSy`^2X`bA{HB z!$V);+OZM;j~xA>2YL|WB7pCYBL8eT2qFAjmfRiGd8Ym z92+af9Pjweo26*7Z_@Rfg->sLj!QXSZ){GxZ{{|gzga_%A@>b`bnqL;rC+!IULvx; zr2p??H0ckFhlgH1)t*waz{|$8E5WEKIMJjm{mRxkRGes6n}$QYcS6bebDVx#OvT@f zOBbEe^%^riy)LzlW3sXBo}qkrjodXRkfGG`GX(9+&D_S`D*Xm~aBidD?+J3>L))H1 z^ERM+|J|R|y-mM=d?;coC-&%D8rg3KW@s(ml;F*PH6OwU&~@RK|5lBwJ>bfz`4+UB zQ)(kfVlC4XrD~d8&erhFE`Cd(A6}T091L@$_1ZKNXA^v;>xOjgJUag_?Ia+_YgkL=7Vv=hECD6)Y z<{a>qI6FOm4Sd*qczh_k}GaIwkV?%Y1`vhKawp=VU>J2I1??1>Y4U7F`o*`9-Z` z>Ly2D#1P0)7YeA=)I@TeftJ{*hEUDh&V}m?iAHo$PG0in$U2oGIcP2xpD=K4A;Rzi z$GZl99LBpwoc{gfWmctSsj}Xr*U{G*1zmH1Dru}>fgF-6VUV;$anYAbQJiS{cFSbv zHL|ckW{wGTx9^BaElyv@#vFQRGLCKE^JIHnI(nkwete)2_b!4Ay@lrO#;GUnV*qsG z-Z#Rf%vOr*7!b9{t{|6_24GZ1O}K0963XXzLSRqD1Rnu=01Z=btTpz z&oYYu=GtWnsFf_U1m0@ik743&hzFL?ox>#pCbey3@;L%j^2piA2Oyg6S7H*ix>bx! zp>Wl$cB^vV@kLW?dwRyNXsdia+n6S|gcM%Bu(rF z1*@8rc-UhepbM}-%v^E3BJ?)z@jo80AcNqQg`f=_xV0&?UW0{8*HU}>{wm;Y=HAw0 zXx#%#M34&^hXV<~#6n-C&UKK>KNWnFp9UCz(en*;xe9mWVI2Q6pkmH>6!+%2En z|85X)FftK1JwNM7ljS}*Cmuu4@}UdhF~B!OSThUkdJI4za*)OG!5;99uLb4P z7oU-UFz6y2_k4RpWOt4MW@0ttNV~{J(0}Q}#~#>tXtA;Ri0+}g1{+5jZzeQX2qc%C zlMnjuhA&QP?Ri6=qEJLO$PtwWlyw<>B_Kx}&eFCyCJD9V)pf`Minli$!i z@c1A5H{_gwxlPSm4{Qj-c6x#qm|$-uXs@#XpRqcc9_6c}3+ypLAoXIhvS3PCgwm~7 zY!60Y%iDz5BKDclu8{Nd8oIZLd65=s-Qe`Sg}LVDqj(f+7@J(2mGsKLEKBpS-_K|5 zD`e6;=E95|A;pc9_Tc)0Hm(6e=}gTGms!f}%MbjoS4; zxQ!GpIA6q`3M_iuEC~dS5FuiJnmgV6ycu|)i8(z((DqLG*2O~Z?~8?v3AzdlNAa>A zI~Rgg>u$b#&sEliaMgS+7orNgml?oLf>Zr-@$Ye1{#1!~s0jsBEs{@-?UHUBXnTYk zhq^dq3!^hufzG8ujLtJus)eaFm%p96I=VI*b;%e#g4%w z%*H;!42q8ufa?#rI3+`W8St8fb&4(Ea@z6`Vd8)m*^52dW{$~H&N*R0E*!D|4x#OX za|W;n7SvrM3(U6wfu*u)Jh0z8ct%f`s#e2$Pt~W8ey8cmX~3$+5WPtTINKqg-`nZ0M~@ zx6h972RP0?(nYFpc`6wWTW@V@-r9}SM+THmmxNYqfg;I&0L;}YKGf?g<83XZUG39iii!tF8IYVqmr_@D|bsJAvPauD*Sp>V44QPo0?7S+- z_eo_1R;m>O+Nk#~Lq(H4gG(Ut)yNb~HgD=$2Td zN>D+4Hqj2DW0jY~DwDjZn;0>)8@EsZxFt3zAHGnZNi^tpEb?+#57mWS>C>uU$yIg@S6z zu)7YJj@vEBAoJVo2aV6qM8K4Tkh?Gb9u=ub-DjK1gPh?M*SystWr|0fCq&haVEkd_ zE3m|Oh(yoN&jfQ&wnDC$mDbW7HPgSlqSHI6r|T0+xyYu$@ND!erGI|-`|IDo{_CH2 z=$HS0W6p=kiRXU$$6NEyufM!~KO6qyy`vwlzq%hU?tcA0wx}He^+apT{&2GINE3u5 zS@Z*9C*ExXc_#s=kI#SdYv;(~1^Y9+B%xV-;@##Qs>gw=B^kkXmE-diwmUgAFBorT zmW$h$sbkDria0E6awPgj6g?Av_7Rg<+|i(aKN|LokML{unJj)CTn*4OuJIaq46YsC zV$dJ-jCWrh%#rec&d`57@(ZFZ-%UFJ?t4G*7(@?C$angn!R0_8W#V&^vr(!?Vopo;s29j37P4~emRy-Kh{aa9O!E|lRYOdF z8N3xIoC*spNvl?2*Pc&3V_vpzFhQdeAHDXXkvnYYD&2mA|l3`1ANINezpyQcJ0I>6`)qKi&TKy z*&b(*?edJeJfkkp=#eGUfhKN3^5_NjSlkCy?~qFaOJC_QYIM4SgrMAHBn|X}f`^$; zR0=59k7!2`esvT9kAo#7e*_uWC}?$W=O;50hLEaDVpe?5ECtdK&gqK#8?v(Fz<6p`_M05fWhz)ouo^YJkRX7%A;A@qL%)#ll&2TYd3& zRF20uA$bl>IUe;>_ygF}Q%%T!WFxkaa;yWUv!>H$`GJ(>odn61v#ZM_9{Xl>;eQuv z8rY9h6ubof3QN08pWWKrfh;(C2C|@MoNipVa*T#=kD3VAvqwvg^a3rRxxI8LqbAju z#(Bo;rM%#=p0V}#u`A6CLvdYK#m$wFeKikas%&vC5LvR4+V}Ux!b7ZzL#iAWWlnkO zE`i#tY!Zs(GneK(5ZPkj6<6#E-hbEJN;f@+nu!Zu%N{~e2JKnkPAF{Na?sWbvxJUv zlc6pV;Y;7t28x4GTR*WDMK?iaLFU*vDY!N4nH26jv1C$MW@bA3zD$ItFTJ^`67EAU zk&CG%_TI*^(eL*Md*Yw#e*akf^DiUS);ON@!~a!`?`)($o~d83^ILU(tAD59w<=}M zBpJQbZ&tV*|a22^=zS|CAss~gyWnG0<@@`=9zRO?l^4Gik z^+yqgquk8IE5zKbuZxs{7JpSFVG>k9>QM;^mxR}rc*|h9^XfcZzR`EgH|m7I#kfD# z)Yg_fF>6}HVx}u%AsC*|qqqMSFV6`R#!l+N2*5esKV3mg#9prloUwRx2`vj*;a;}~ zoCDSKLP;{qDT7f}euP7fTSOdVj@?eBNPO1H>HEG>?&&Sz(0>p;T0L9Lgwy;u04% zG(rmDog0*05sQ~z#G(^97vug!mzRzSCd;>c^=rwQu)C&wjs56d3O$Mv5aJ&zQot~d5 zPpr#OZW>6Ti{;f%j_AUui}w9ac@&-gKr3{uz`Ap}{Aey01tDeykg`oFF(ePs+ZeQe zxGsd*1vN#+k}uRMnmP4P_R}A)7YsL-L7hg;*8M^*R(YaKIOuD_`y*G%5`By6p zDF50a`-Ql6%zxK0-%gotpotK^w2`$$((b6ocrgHKrh{|59~d^dd>4b1!*g+P)z~hH zshZ`k(b@sf!JOs*LmtCqSt&A7#fWi~m1niFmt|~jzmCbE-|zQ~pt`_OMPoTChEiyj zmM>uN!VJg3P!sTcC8+DflIQES7$*rr=UL#JGQ5B$+J8TVw(Z9>i{t&sx!{bzPsw)g zB$H_mZIj<_dRm(qNpVbbgzlfzy+y7B(OL*{de%zv)hx_Z)o_?h2RHhM^8b5^e+BivE?fYAqcqKGTi@4KRL`n>soT*=fik4cW=+PFDM}`aqNB;7cw{ zppE}-;zm#bdIag6_+Cq5JUxa^o_F%Rljog0e}78ye4@!YkRt2@BFKfz7h%7m?R%H5 zYu}z%0CV?JUi;~G1b*JgI@#aJ{!aFHvi~W`{zFajhm>X?=^gT=cmru4gR*=19{X53 z5`@wd-rK@SE-Eu7CItI*rw7tS6(f9;c{sr%O6rQbv~yGjA8bphq({-6=X7f2NvM@hrgt*km+3=IdTt=YVmswV z5MZ?+?n5i_`+wvx zCI(e4i7|!zqZBvl_Gg_gFQLmvxiteg!JpFg8nY%b88Ile^tj)*kp_?9(2o924yx1M zo%Vim+B@Q#?yRcQUoTUC9pvWaM?$(uOhyb!E&bIn{37=GwpCXbZqcc(C#kx+2#Zc@ zyIP<9`e8T(i}dO3-G7mwK~3`~LYzV_^ zG~3L*ttVKgmJClrQD2-Q`-F}1?oP=-%(*}%1-8;1Dk{v?ayyHWgysRZLcoh2vlV0j zx(FZw=QjU3CV;K52Qcv%BqrK#d;v>p$eBgUzAt9_&xX8K+>qvT@E4bvQT?os(7i>> zGrl|>@6*%dxKUqI5x}3@lYcpNvlpwEVYWDcvbIu=NfZay)EY{mw)5**J0qwwf;tT^ z<;_5ok?r&3%v>Ss48vs;nG*uh$(=c+_G|D8bAiD5^4mk6l21cz<)UZ>s(Lw;!NA(A z9j>S)FyP7efK!aMv5^Zr1{rGYUZ=-N#8vS}Y>6^hCEt~hsCpSFQGcqpwRxh9Hq@l6 zO351B8g@-j$hIc0W#H)84bJiYC*nZMLbCM?|BVtS8E23|afTsYiz}hYg1!c?O{x1*QW3~c_(9LoM zJO`Rc80ox2?}i}ERtL!CY8T!6J(CX^A%DTwOh{sVt6BVc5<|JSFna4PL&>xP! zC~WoC&IWBM`NRBT)OlQTii~Io?XB>veSN^o-t$4WqFo&7BW7#`Zw?=NVNQ!iZB{8En-YQ1z=x=6?-mKd|-`Tc#|(RG`LcG*N9zRH!DoG&{UrLZCj* zA*jkWj$1JqJ&}4@#out$GyHx+SXUHLLDy1i74GtXunUeyBTeA}KPW*&&b+rbUcIXr zGf;Hb@{5h5^h}AyZy_^RS18x#odKSEQNQjBHO%hhcyv4EG;(;oMizz)*?(K$A!2#r z27CSq7EmPirq#WE>CDmavbz{VZ} zbO9XyjW3%5al|O!pL6K~#Q7Wo1bt?>ePixTj6AcR>9@P_!cF?&|7ttqo+w)#YO>ry0uT$2Y}mw? z9tYDF1BC#0%QbPl3s@z>DC7^p7BU_M5Oi;E_k4e}&m}kH9%AMR&RJ6z0SiIf19PIRU zGGoirPbn-_zN4^-+I=+VnEJk>u<3VjA7!R4*Mp>L{k@z>ole*1dy1TKUlW3zVvy#J zpERg;d_QTZyLA63Mo>z)6gz<;AyeQ765^)w0d+p07zYouA>Dl8uF#s^HLoG492s*U99r`G}an`eTT*I?`*Kj>PEbtB2V7@qxB{(iZze+o~IbEB(7gkY3A zTAL?hU|O?=<3L+t%OskGY#B!&$PR$EjVwS(Xrf{Q-mM+B1=Iz9Ld?zt7mB1K?}ji6 zn2VQ7BTIu+3lF~$70UI+(@C2 z7MmU|B>|~@yg!-P+CRlsv3EBKt))aGKOT;zGk0yu;we_U@^*!gQ@f%z6d@CR}| z5%&VYDYcLZUP3Q?{G&gi9B<1GkIcZSsoadyW?(#fGF@jQJp!hr|@DxR?-ks=lCpx8h_$W7G z%Dcc`-5Nb%fB#}`l`B%ru>xF4Hua72>Z}^ztmaRF0kmztBVC5RBd=9%`b}-LDw~w3 zYBd;+dV}G(D_B*)3kUt&kSIYH=VT^45lwj_fTP=7e*O~rOc-jyEy0H#g==D?((gzG z2gSTS4s;ndH#T%bFHcL`#l$4myj37=uhk^^j^&>wf6EVYLz28Jv}nZYyuVugt)cT- z64e(@rqD*#68r8K%(S*ynVj>ZX}{l(WuKp)i86Qb z4D|8z;BeCK8A16F@%up#c}{w17zMb~)b+BpILg+OP-VduM<70D-X7)#D|uWiY#MR5 zgizK$e=Mp}`Q_pKB_<16g5%|93TsY@vQ{E5F*uq|=X+=|>hF!ML$o&^A#?8tPKJkz z@f;q&snIh&U0sA>9f5yzJnR`C;n(0QW%2tIl3DzoE=c%mRO^2Rs}PpTVH-hKz4iV3 znbYYQwq-WGa?~+rbp~Sk*d+2Df0tcuf)mPKj1L`XVzw1QK__<*+i=b?Kk6CpXUX4J z$V2WO$K^;&rugqCPdum^t`Y$*6|E8?S*CRY?^1X4^Rbj^7|lQ_`ti!O?5+uJpp%Yt zS&Nd>-y)Bl*fxJPo2aD_Nb&XLQp9sCuD6c7x-{BG`0mtEtoI}ycqnYMl@dUA4i=kD6cb}UH-J41dn9vvJVj;5o@bSIw2Ea{fC z!u>KjZ5rSzvQ||uu4f`O$zT2PjF*>{Ni^x}5^3ccoFRYHhAxu)+(fk`02OR}&d*Z% zL_8SfX`iv5qENIcN}$ow-Y7k^^by_8m4=wIa?+{PKB#uVhjMD6B(B=S!)g}zqh;8) zsBxZ={?DFueZL%%A8k)C8R#;BRI2rZNtGMN}@t05qpCQvOA%D#ZDo^GBuOrrSOHj5_ zdrOI`rT~|&Z5iQFN^WR(4WeFG%B(&f?xaH3qvf_}a!+3fdmrc$+I+%p8p^7RW6dzQ zl)Ys*TOZM?U~NBCwhmAGm_GtjhrzCS+*~0dwk#VPZ!E~*8wawLQNW_Q@(3@44JNuQ zjF1*?8*;&IJAXd1`ezCphn7wg{NX&>IYQ^u`azsp&u19jDZ|Bha+seAbA`A-`2|6n zHA)(Y!zp(Z>;IBnWcOkL8UIX6f-;5qqa?LGCD%ux%t|d%**cdDGU-WZC$zn1C@M!* z)D^lad;zXq?0m!6`NoxaI+1-bo*d<8c=>rHwM8}WUw_6!ok(OUvFYQ@a`t@546z!U zJs z`B{c+TYp~DOsItbqkJs#4F&h2sRynuPg^Vv&=tved|nu8k`E*?{DaQxT~ZTu*B_T{ zHrU$#^eH^sl`=N$nP*Bw;0w;q3cgWkca<2^&JNNFFjk(c756D)ouI|kIy!>Gy~%WP zus0q|kM^dE1>8GYphbT%?N1Owv7(TE$hEFK=c3zM>v8c5<#CeMI3*t6Tw7c4)U4^%{OX zmwx~Ulb*50B=##EHx#YUlQCCw%fyG&P`=js(;Qq#%-@U!b=Q!SwFMd4V|a~JCG91X z)VPi0rR}aqn$!^~8)po%Ci+eEFQeenLRoYyR&b(OX$`0RNDU1ajOr0ooD$^%6{qXd zo{IZs1efHbl|;`tUlQt~E9B9QYsTb4?0?BO<0D#MuC^XFp=}%w569EP!=wJ>Xgu!m zSF?NQ7{`O*bUHrj52n*;Up$W7Wy8Vva6BDN#?zj0dilvSjwj=u@j?9c*?=D|KY_t$ zbZC5e5O>$WxgD|QN3{OrA?qV1LJ0;x;aBnVgR_x-HXrL#@!L4=KNKjxDiN_h%vn+w zOa;iR;$uT(mBF*suQAG3#_4rceKhg9%9MzuD>ES<{Fdc|c@wl&%6}UtwUQkq$+o4J m<3w2!fsm#j^Nj7ODz))}@$m5F;r|B!0RR8?t&^Y3`T+pO)UG%H delta 9959 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 literal 2940 zcmV-?3xo6@iwFP!00000|Lk3FZ`-!k|0)EZH_f2fj_stWfxYOHZo2{6E;m`W7fo^5$&wt=v3ebc7|_KO4|xuG{``1EQjeI2z(nZc0X}MVTPN7T zl#MtZJYq$a4|sq-aurE*d2xo`Uz}qH--D2pvzX$j*Xka6aF1sW4nR$~C-LCRBW5Jf zq`y)hTuxc*z2{v}Z~;5m1L+DHs-%gpU%!s|4I4$wMQPdgm z)(4`<0eYi<(h+f?bw+&u{DXr)2rdrL;|;q}bcAH~9Y%Qb~Mzeiz!)7<^>({T?!7>U0 zBBpqNm%Sz9sr!^S3_Ca^f&|I%MnX@~aC#VWN#p5AALphpJSxmtVbpVd>mTj}0-|*Y zzL6mGA!+gagD(0+83;T$>U25|{u~8E{p;P#!54z_(I3+g@ZfZI>tNz}Fh1bQ+;0WMLxBo=PwEN81*n5_zHs5NIS^8H%}Qw6C~6eP&^m5ddl5)rf_ zyDQ~O(s+7}}3Uz!y;xpFz0d35<^EUbKu;icle|RG=kt*|JE!BO}I|St0dD7s~ ziGu^mGQZNwiH^^ljO@GTsWx^!#WHOvN#Odx-I9_1jjBmBL;?b?0Qr>NVFyRT#{)c3 zDwKnEdmLA3xjbl(QV4Mv3a=R6zo_YeuotdM-FM}x^eZTLVyH+ljTxF`OUqBz;rH+#08lt5nA^{EJJq=t={BbWi+9`{wg8 z;{q;0@<_Pz^s|FA1&{a>1Q(O3q%QICpxv)9U(wYmOS73D2N96{xP8Yectx1r~ zjCE7})01wwoBG7>;VQu>hTbYext(mFAh^rrJmdc+dUZH?VKXRA&G4Ewh{{lLm)JmpoF-5YgwszXDurVfhx7#*$ z5~J?IsxH;&rx$Ut(J+P1Jz$ECXo-hAqaG5vdkIWwHz&a#9VT^#l#LSuWC{__6Cfpc zh%Q=dp>w63!$e>gKXxnq+%dzRdJ z*Ey++go^>(6bW~?ii8~$9xo``9xxh)akMxtfMeO;i;v$&jXg|NO&2 z5&_Etpl+l*?wQ25loj1|c}Sb@{cWS))da-Wu7=9WS<~7pY~0Ljo3#K#eJ}HspCi9` zuSQy!S-38CZ}|QTH?CgAtr@ulsj-b^Xg9eNF1{HmKCoj7Ofwxf2TSwPSx~wQw!dSb zG^fRlgVMOCvvdRKx};iR|EGnh7NS~+`s^rrTyeR?6%hZ72LV;4TNyKyW)U=jcErDo zcil3Oa&e(*9KwjJ=sgr_^jAY~?hS9!#ToTX-|J??Xeu7(N6Nm(wUK#EWG-6A9$v6o zY3DCm*5V6B3$vd40&wZqYkIB4%ZkBvUTBQ=vXCvRfMZR|x zx3X<^9ozHoVQcCFwx@1h`$+F#>X>b<&L%E zPN(9IwJT7YeOhrzSOpV@ocn9`%r6^w?!NgPD{J=7FFOo~xRXdtU~UyeB1oRK=ho3e zpSeP6Li9gWA_+=SHojp2nIc8*01-5T2PDDe%#%oQq}@9i69xK*BJvJtb@w8Fi#zpy z%r_nFR``#{oui7|Skgln?>#TROV!kH^3>IfEJ4|Lo&Dt7dA1Q1*s8Xqt*waSoKU^b z>Se!LvCS)^UY%BVD^4H(LFCoV9aXwtI+O##R0wf zoS1$DU_n>D1P(~}r8x1oGNyir`T3)j>exiA!1#?!CazmKcK!-O`r_%$JTzCKM zh42$n6lUb<`gIa+bGy=7IybGsW4z@xBuWp;MK0ge`sv98)n2ELjyoq6$8wVGyYV|s zL+i;g;cK#Qk>faFsWvG%1x>BXAOnxoMo}2s1_Ft}k%dUn#ckd*Mn4&&X6A*xi0K}5F mbP|b(vH0EIGd1?rC8OT;@N9NF`)>dM0RR8#PS8G&m;eBTe!1}g diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index c037a0af6..a498cddff 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -94,6 +94,7 @@ * [ReturnAddPiece](#ReturnAddPiece) * [ReturnFetch](#ReturnFetch) * [ReturnFinalizeSector](#ReturnFinalizeSector) + * [ReturnGenerateSectorKeyFromData](#ReturnGenerateSectorKeyFromData) * [ReturnMoveStorage](#ReturnMoveStorage) * [ReturnProveReplicaUpdate1](#ReturnProveReplicaUpdate1) * [ReturnProveReplicaUpdate2](#ReturnProveReplicaUpdate2) @@ -1443,6 +1444,30 @@ Response: `{}` ### ReturnFinalizeSector +Perms: admin + +Inputs: +```json +[ + { + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" + }, + { + "Code": 0, + "Message": "string value" + } +] +``` + +Response: `{}` + +### ReturnGenerateSectorKeyFromData + + Perms: admin Inputs: diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 7aee91d52..5d4b33a52 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -11,6 +11,8 @@ * [AddPiece](#AddPiece) * [Finalize](#Finalize) * [FinalizeSector](#FinalizeSector) +* [Generate](#Generate) + * [GenerateSectorKeyFromData](#GenerateSectorKeyFromData) * [Move](#Move) * [MoveStorage](#MoveStorage) * [Process](#Process) @@ -220,6 +222,41 @@ Response: } ``` +## Generate + + +### GenerateSectorKeyFromData + + +Perms: admin + +Inputs: +```json +[ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" +} +``` + ## Move diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index ce7083b3d..428503c87 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit ce7083b3d187ec3bc41a68ab66567bd4f3be6dfc +Subproject commit 428503c87d917cc5e3e637983b43b4c260863bf0 diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 81dbfb426..65c6762fa 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -251,6 +251,23 @@ func (sb *Sealer) pieceCid(spt abi.RegisteredSealProof, in []byte) (cid.Cid, err return pieceCID, werr() } +func (sb *Sealer) tryDecodeUpdatedReplica(ctx context.Context, sector storage.SectorRef, commD cid.Cid, unsealedPath string) (bool, error) { + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUpdate|storiface.FTSealed|storiface.FTCache, storiface.FTNone, storiface.PathStorage) + if xerrors.Is(err, storiface.ErrSectorNotFound) { + return false, nil + } else if err != nil { + return false, xerrors.Errorf("reading updated replica: %w", err) + } + defer done() + + // Sector data stored in replica update + updateProof, err := sector.ProofType.RegisteredUpdateProof() + if err != nil { + return false, err + } + return true, ffi.SectorUpdate.DecodeFrom(updateProof, unsealedPath, paths.Update, paths.Sealed, paths.Cache, commD) +} + func (sb *Sealer) UnsealPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, randomness abi.SealRandomness, commd cid.Cid) error { ssize, err := sector.ProofType.SectorSize() if err != nil { @@ -301,6 +318,16 @@ func (sb *Sealer) UnsealPiece(ctx context.Context, sector storage.SectorRef, off return nil } + // If piece data stored in updated replica decode whole sector + decoded, err := sb.tryDecodeUpdatedReplica(ctx, sector, commd, unsealedPath.Unsealed) + if err != nil { + return xerrors.Errorf("decoding sector from replica: %w", err) + } + if decoded { + return pf.MarkAllocated(0, maxPieceSize) + } + + // Piece data sealed in sector srcPaths, srcDone, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTCache|storiface.FTSealed, storiface.FTNone, storiface.PathStorage) if err != nil { return xerrors.Errorf("acquire sealed sector paths: %w", err) @@ -626,12 +653,6 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p return empty, err } } - - // XXX: we want to keep the stuff at the end - if err := os.Truncate(paths.Unsealed, sealedSize); err != nil { - return empty, xerrors.Errorf("failed to truncate unsealed data file: %w", err) - } - sealed, unsealed, err := ffi.SectorUpdate.EncodeInto(updateProofType, paths.Update, paths.UpdateCache, paths.Sealed, paths.Cache, paths.Unsealed, pieces) if err != nil { return empty, xerrors.Errorf("failed to update replica %d with new deal data: %w", sector.ID.Number, err) @@ -661,6 +682,33 @@ func (sb *Sealer) ProveReplicaUpdate2(ctx context.Context, sector storage.Sector return ffi.SectorUpdate.GenerateUpdateProofWithVanilla(updateProofType, sectorKey, newSealed, newUnsealed, vanillaProofs) } +func (sb *Sealer) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTUnsealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTSealed, storiface.PathSealing) + defer done() + if err != nil { + return xerrors.Errorf("failed to acquire sector paths: %w", err) + } + + s, err := os.Stat(paths.Update) + if err != nil { + return xerrors.Errorf("measuring update file size: %w", err) + } + sealedSize := s.Size() + e, err := os.OpenFile(paths.Sealed, os.O_RDWR|os.O_CREATE, 0644) // nolint:gosec + if err != nil { + return xerrors.Errorf("ensuring sector key file exists: %w", err) + } + if err := fallocate.Fallocate(e, 0, sealedSize); err != nil { + return xerrors.Errorf("allocating space for sector key file: %w", err) + } + if err := e.Close(); err != nil { + return err + } + + updateProofType := abi.SealProofInfos[sector.ProofType].UpdateProof + return ffi.SectorUpdate.RemoveData(updateProofType, paths.Sealed, paths.Cache, paths.Update, paths.UpdateCache, paths.Unsealed, commD) +} + func (sb *Sealer) ReleaseSealed(ctx context.Context, sector storage.SectorRef) error { return xerrors.Errorf("not supported at this layer") } diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index e0abf1773..3deff4d6b 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -578,15 +578,72 @@ func (m *Manager) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, return nil } -func (m *Manager) ReleaseSealed(ctx context.Context, sector storage.SectorRef) error { - return nil +func (m *Manager) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + return m.storage.Remove(ctx, sector.ID, storiface.FTSealed, true, nil) +} + +func (m *Manager) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTRegenSectorKey, sector, commD) + if err != nil { + return xerrors.Errorf("getWork: %w", err) + } + defer cancel() + + var waitErr error + waitRes := func() { + _, werr := m.waitWork(ctx, wk) + if werr != nil { + waitErr = werr + return + } + } + + if wait { // already in progress + waitRes() + return waitErr + } + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTUnsealed|storiface.FTUpdate|storiface.FTUpdateCache, storiface.FTSealed|storiface.FTCache); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + // NOTE: We set allowFetch to false in so that we always execute on a worker + // with direct access to the data. We want to do that because this step is + // generally very cheap / fast, and transferring data is not worth the effort + selector := newExistingSelector(m.index, sector.ID, storiface.FTUnsealed|storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTCache, true) + + err = m.sched.Schedule(ctx, sector, sealtasks.TTRegenSectorKey, selector, m.schedFetch(sector, storiface.FTUpdate|storiface.FTUnsealed, storiface.PathSealing, storiface.AcquireMove), func(ctx context.Context, w Worker) error { + err := m.startWork(ctx, w, wk)(w.GenerateSectorKeyFromData(ctx, sector, commD)) + if err != nil { + return err + } + + waitRes() + return nil + }) + if err != nil { + return err + } + + return waitErr } func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { ctx, cancel := context.WithCancel(ctx) defer cancel() - if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache); err != nil { + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache|storiface.FTUpdate|storiface.FTUpdateCache); err != nil { return xerrors.Errorf("acquiring sector lock: %w", err) } @@ -601,6 +658,12 @@ func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUnsealed, true, nil); rerr != nil { err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) } + if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUpdate, true, nil); rerr != nil { + err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) + } + if rerr := m.storage.Remove(ctx, sector.ID, storiface.FTUpdateCache, true, nil); rerr != nil { + err = multierror.Append(err, xerrors.Errorf("removing sector (unsealed): %w", rerr)) + } return err } @@ -790,6 +853,10 @@ func (m *Manager) ReturnProveReplicaUpdate2(ctx context.Context, callID storifac return m.returnResult(ctx, callID, proof, err) } +func (m *Manager) ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { + return m.returnResult(ctx, callID, nil, err) +} + func (m *Manager) ReturnMoveStorage(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { return m.returnResult(ctx, callID, nil, err) } diff --git a/extern/sector-storage/manager_test.go b/extern/sector-storage/manager_test.go index 77e185b93..cf54ccbf2 100644 --- a/extern/sector-storage/manager_test.go +++ b/extern/sector-storage/manager_test.go @@ -199,7 +199,8 @@ func TestSnapDeals(t *testing.T) { localTasks := []sealtasks.TaskType{ sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit1, sealtasks.TTCommit2, sealtasks.TTFinalize, - sealtasks.TTFetch, sealtasks.TTReplicaUpdate, sealtasks.TTProveReplicaUpdate1, sealtasks.TTProveReplicaUpdate2, + sealtasks.TTFetch, sealtasks.TTReplicaUpdate, sealtasks.TTProveReplicaUpdate1, sealtasks.TTProveReplicaUpdate2, sealtasks.TTUnseal, + sealtasks.TTRegenSectorKey, } wds := datastore.NewMapDatastore() @@ -245,14 +246,6 @@ func TestSnapDeals(t *testing.T) { require.NoError(t, err) fmt.Printf("PC2\n") pc2Out, err := m.SealPreCommit2(ctx, sid, pc1Out) - - require.NoError(t, err) - seed := abi.InteractiveSealRandomness{1, 1, 1, 1, 1, 1, 1} - fmt.Printf("C1\n") - c1Out, err := m.SealCommit1(ctx, sid, ticket, seed, nil, pc2Out) - require.NoError(t, err) - fmt.Printf("C2\n") - _, err = m.SealCommit2(ctx, sid, c1Out) require.NoError(t, err) // Now do a snap deals replica update @@ -270,19 +263,26 @@ func TestSnapDeals(t *testing.T) { pieces := []abi.PieceInfo{p1, p2} fmt.Printf("RU\n") + startRU := time.Now() out, err := m.ReplicaUpdate(ctx, sid, pieces) require.NoError(t, err) + fmt.Printf("RU duration (%s): %s\n", ss.ShortString(), time.Since(startRU)) + updateProofType, err := sid.ProofType.RegisteredUpdateProof() require.NoError(t, err) require.NotNil(t, out) fmt.Printf("PR1\n") + startPR1 := time.Now() vanillaProofs, err := m.ProveReplicaUpdate1(ctx, sid, sectorKey, out.NewSealed, out.NewUnsealed) require.NoError(t, err) require.NotNil(t, vanillaProofs) + fmt.Printf("PR1 duration (%s): %s\n", ss.ShortString(), time.Since(startPR1)) fmt.Printf("PR2\n") + startPR2 := time.Now() proof, err := m.ProveReplicaUpdate2(ctx, sid, sectorKey, out.NewSealed, out.NewUnsealed, vanillaProofs) require.NoError(t, err) require.NotNil(t, proof) + fmt.Printf("PR2 duration (%s): %s\n", ss.ShortString(), time.Since(startPR2)) vInfo := proof7.ReplicaUpdateInfo{ Proof: proof, @@ -294,6 +294,24 @@ func TestSnapDeals(t *testing.T) { pass, err := ffiwrapper.ProofVerifier.VerifyReplicaUpdate(vInfo) require.NoError(t, err) assert.True(t, pass) + + fmt.Printf("Decode\n") + // Remove unsealed data and decode for retrieval + require.NoError(t, m.FinalizeSector(ctx, sid, nil)) + startDecode := time.Now() + require.NoError(t, m.SectorsUnsealPiece(ctx, sid, 0, p1.Size.Unpadded(), ticket, &out.NewUnsealed)) + fmt.Printf("Decode duration (%s): %s\n", ss.ShortString(), time.Since(startDecode)) + + // Remove just the first piece and decode for retrieval + require.NoError(t, m.FinalizeSector(ctx, sid, []storage.Range{{Offset: p1.Size.Unpadded(), Size: p2.Size.Unpadded()}})) + require.NoError(t, m.SectorsUnsealPiece(ctx, sid, 0, p1.Size.Unpadded(), ticket, &out.NewUnsealed)) + + fmt.Printf("GSK\n") + require.NoError(t, m.ReleaseSectorKey(ctx, sid)) + startGSK := time.Now() + require.NoError(t, m.GenerateSectorKeyFromData(ctx, sid, out.NewUnsealed)) + fmt.Printf("GSK duration (%s): %s\n", ss.ShortString(), time.Since(startGSK)) + } func TestRedoPC1(t *testing.T) { diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 023904984..95b11c004 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -277,6 +277,10 @@ func (mgr *SectorMgr) ProveReplicaUpdate2(ctx context.Context, sector storage.Se return make([]byte, 0), nil } +func (mgr *SectorMgr) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + return nil +} + func (mgr *SectorMgr) ReleaseSealed(ctx context.Context, sid storage.SectorRef) error { return nil } @@ -534,6 +538,10 @@ func (mgr *SectorMgr) ReturnProveReplicaUpdate2(ctx context.Context, callID stor panic("not supported") } +func (mgr *SectorMgr) ReturnGenerateSectorKeyFromData(ctx context.Context, callID storiface.CallID, err *storiface.CallError) error { + panic("not supported") +} + func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { plen, err := svi.SealProof.ProofSize() if err != nil { diff --git a/extern/sector-storage/sched_test.go b/extern/sector-storage/sched_test.go index fd3c90295..a41e7c855 100644 --- a/extern/sector-storage/sched_test.go +++ b/extern/sector-storage/sched_test.go @@ -112,6 +112,10 @@ func (s *schedTestWorker) ProveReplicaUpdate2(ctx context.Context, sector storag panic("implement me") } +func (s *schedTestWorker) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (storiface.CallID, error) { + panic("implement me") +} + func (s *schedTestWorker) MoveStorage(ctx context.Context, sector storage.SectorRef, types storiface.SectorFileType) (storiface.CallID, error) { panic("implement me") } diff --git a/extern/sector-storage/sealtasks/task.go b/extern/sector-storage/sealtasks/task.go index 3f2a9701f..f6104878b 100644 --- a/extern/sector-storage/sealtasks/task.go +++ b/extern/sector-storage/sealtasks/task.go @@ -17,10 +17,12 @@ const ( TTReplicaUpdate TaskType = "seal/v0/replicaupdate" TTProveReplicaUpdate1 TaskType = "seal/v0/provereplicaupdate/1" TTProveReplicaUpdate2 TaskType = "seal/v0/provereplicaupdate/2" + TTRegenSectorKey TaskType = "seal/v0/regensectorkey" ) var order = map[TaskType]int{ - TTAddPiece: 9, // least priority + TTRegenSectorKey: 10, // least priority + TTAddPiece: 9, TTReplicaUpdate: 8, TTProveReplicaUpdate2: 7, TTProveReplicaUpdate1: 6, @@ -49,6 +51,7 @@ var shortNames = map[TaskType]string{ TTReplicaUpdate: "RU", TTProveReplicaUpdate1: "PR1", TTProveReplicaUpdate2: "PR2", + TTRegenSectorKey: "GSK", } func (a TaskType) MuchLess(b TaskType) (bool, bool) { diff --git a/extern/sector-storage/storiface/worker.go b/extern/sector-storage/storiface/worker.go index 970e0ec33..ab8c484e6 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -95,6 +95,7 @@ type WorkerCalls interface { ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (CallID, error) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (CallID, error) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (CallID, error) + GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (CallID, error) MoveStorage(ctx context.Context, sector storage.SectorRef, types SectorFileType) (CallID, error) UnsealPiece(context.Context, storage.SectorRef, UnpaddedByteIndex, abi.UnpaddedPieceSize, abi.SealRandomness, cid.Cid) (CallID, error) Fetch(context.Context, storage.SectorRef, SectorFileType, PathType, AcquireMode) (CallID, error) @@ -151,6 +152,7 @@ type WorkerReturn interface { ReturnReplicaUpdate(ctx context.Context, callID CallID, out storage.ReplicaUpdateOut, err *CallError) error ReturnProveReplicaUpdate1(ctx context.Context, callID CallID, proofs storage.ReplicaVanillaProofs, err *CallError) error ReturnProveReplicaUpdate2(ctx context.Context, callID CallID, proof storage.ReplicaUpdateProof, err *CallError) error + ReturnGenerateSectorKeyFromData(ctx context.Context, callID CallID, err *CallError) error ReturnMoveStorage(ctx context.Context, callID CallID, err *CallError) error ReturnUnsealPiece(ctx context.Context, callID CallID, err *CallError) error ReturnReadPiece(ctx context.Context, callID CallID, ok bool, err *CallError) error diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index 4061b48d9..9fdb3a913 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -75,6 +75,10 @@ func (t *testExec) ProveReplicaUpdate2(ctx context.Context, sector storage.Secto panic("implement me") } +func (t *testExec) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { + panic("implement me") +} + func (t *testExec) NewSector(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index cc41e916e..387a47f8f 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -168,6 +168,7 @@ const ( ReplicaUpdate ReturnType = "ReplicaUpdate" ProveReplicaUpdate1 ReturnType = "ProveReplicaUpdate1" ProveReplicaUpdate2 ReturnType = "ProveReplicaUpdate2" + GenerateSectorKey ReturnType = "GenerateSectorKey" ReleaseUnsealed ReturnType = "ReleaseUnsealed" MoveStorage ReturnType = "MoveStorage" UnsealPiece ReturnType = "UnsealPiece" @@ -219,6 +220,7 @@ var returnFunc = map[ReturnType]func(context.Context, storiface.CallID, storifac ReplicaUpdate: rfunc(storiface.WorkerReturn.ReturnReplicaUpdate), ProveReplicaUpdate1: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate1), ProveReplicaUpdate2: rfunc(storiface.WorkerReturn.ReturnProveReplicaUpdate2), + GenerateSectorKey: rfunc(storiface.WorkerReturn.ReturnGenerateSectorKeyFromData), MoveStorage: rfunc(storiface.WorkerReturn.ReturnMoveStorage), UnsealPiece: rfunc(storiface.WorkerReturn.ReturnUnsealPiece), Fetch: rfunc(storiface.WorkerReturn.ReturnFetch), @@ -419,6 +421,17 @@ func (l *LocalWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.Se }) } +func (l *LocalWorker) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) (storiface.CallID, error) { + sb, err := l.executor() + if err != nil { + return storiface.UndefCall, err + } + + return l.asyncCall(ctx, sector, GenerateSectorKey, func(ctx context.Context, ci storiface.CallID) (interface{}, error) { + return nil, sb.GenerateSectorKeyFromData(ctx, sector, commD) + }) +} + func (l *LocalWorker) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) (storiface.CallID, error) { sb, err := l.executor() if err != nil { diff --git a/go.mod b/go.mod index e0823094d..95618417b 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 + github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 diff --git a/go.sum b/go.sum index e404ca72e..38f772025 100644 --- a/go.sum +++ b/go.sum @@ -396,8 +396,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3 h1:FLPxD2ksWwGc/sbnFLWep2p8ViP93VCAwFaVxrtVCyo= -github.com/filecoin-project/specs-storage v0.1.1-0.20211123153428-712cb8da07a3/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454 h1:9II9Xf+jq5xAPQiS4rVoKIiALINa3loMC+ghyFYIrqQ= +github.com/filecoin-project/specs-storage v0.1.1-0.20211202151826-2e51da61d454/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= diff --git a/itests/self_sent_txn_test.go b/itests/self_sent_txn_test.go index 846bcff05..b5ec2c0dc 100644 --- a/itests/self_sent_txn_test.go +++ b/itests/self_sent_txn_test.go @@ -15,8 +15,7 @@ import ( "github.com/stretchr/testify/require" ) - -// these tests check that the versioned code in vm.transfer is functioning correctly across versions! +// these tests check that the versioned code in vm.transfer is functioning correctly across versions! // we reordered the checks to make sure that a transaction with too much money in it sent to yourself will fail instead of succeeding as a noop // more info in this PR! https://github.com/filecoin-project/lotus/pull/7637 func TestSelfSentTxnV15(t *testing.T) { From 9f6265e0b43b95d891b6cee283ebf9cfeb7d429c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 3 Dec 2021 23:36:36 +0100 Subject: [PATCH 025/157] dagstore pieceReader: Fix wrong ErrUnexpectedEOF return in ReadAt --- markets/dagstore/mount_test.go | 1 - markets/dagstore/piecereader.go | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/markets/dagstore/mount_test.go b/markets/dagstore/mount_test.go index ec5e8a086..820058786 100644 --- a/markets/dagstore/mount_test.go +++ b/markets/dagstore/mount_test.go @@ -30,7 +30,6 @@ func TestLotusMount(t *testing.T) { mockLotusMountAPI := mock_dagstore.NewMockMinerAPI(mockCtrl) mockLotusMountAPI.EXPECT().IsUnsealed(gomock.Any(), cid).Return(true, nil).Times(1) - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) mockLotusMountAPI.EXPECT().GetUnpaddedCARSize(ctx, cid).Return(uint64(100), nil).Times(1) diff --git a/markets/dagstore/piecereader.go b/markets/dagstore/piecereader.go index 14a027bd1..67cd10c27 100644 --- a/markets/dagstore/piecereader.go +++ b/markets/dagstore/piecereader.go @@ -155,6 +155,9 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { if n < len(b) { log.Debugw("pieceReader short read", "piece", p.pieceCid, "at", p.rAt, "toEnd", int64(p.len)-p.rAt, "n", len(b), "read", n, "err", err) } + if err == io.ErrUnexpectedEOF { + err = io.EOF + } p.rAt += int64(n) return n, err From 84c48de5d9b0087fedcd6e8d6f15b324711d49c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 6 Dec 2021 15:38:45 +0100 Subject: [PATCH 026/157] CARv2 v2.1.0 --- go.mod | 4 ++-- go.sum | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index cf234250a..a9b0bee9d 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.11.4 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.3 + github.com/filecoin-project/go-fil-markets v1.13.4 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 @@ -98,7 +98,7 @@ require ( github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 - github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 + github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.12.3 github.com/ipld/go-ipld-selector-text-lite v0.0.1 diff --git a/go.sum b/go.sum index 905a758d8..241b98887 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= +github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -865,8 +865,8 @@ github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrp github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= +github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -1482,8 +1482,9 @@ github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPw github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= From fcb7cd0eb08f45ba84e543a60571951d5f069e5f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 22 Nov 2021 19:49:38 -0500 Subject: [PATCH 027/157] Shed: Add a util to send a batch of messages --- chain/messagepool/messagepool.go | 6 +- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/send-csv.go | 104 +++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 cmd/lotus-shed/send-csv.go diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 06343e9c9..e97dfea7b 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -196,10 +196,10 @@ func ComputeMinRBF(curPrem abi.TokenAmount) abi.TokenAmount { return types.BigAdd(minPrice, types.NewInt(1)) } -func CapGasFee(mff dtypes.DefaultMaxFeeFunc, msg *types.Message, sendSepc *api.MessageSendSpec) { +func CapGasFee(mff dtypes.DefaultMaxFeeFunc, msg *types.Message, sendSpec *api.MessageSendSpec) { var maxFee abi.TokenAmount - if sendSepc != nil { - maxFee = sendSepc.MaxFee + if sendSpec != nil { + maxFee = sendSpec.MaxFee } if maxFee.Int == nil || maxFee.Equals(big.Zero()) { mf, err := mff() diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index d35fb56dd..f4e6627cb 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -65,6 +65,7 @@ func main() { fr32Cmd, chainCmd, balancerCmd, + sendCsvCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go new file mode 100644 index 000000000..072605b8d --- /dev/null +++ b/cmd/lotus-shed/send-csv.go @@ -0,0 +1,104 @@ +package main + +import ( + "encoding/csv" + "fmt" + "os" + "strings" + + "github.com/ipfs/go-cid" + "github.com/urfave/cli/v2" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/exitcode" + + lapi "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/types" + lcli "github.com/filecoin-project/lotus/cli" +) + +var sendCsvCmd = &cli.Command{ + Name: "send-csv", + Usage: "Utility for sending a batch of balance transfers", + ArgsUsage: "[sender] [csvfile]", + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 2 { + return xerrors.New("must supply sender and path to csv file") + } + + api, closer, err := lcli.GetFullNodeAPIV1(cctx) + if err != nil { + return err + } + + defer closer() + ctx := lcli.ReqContext(cctx) + + sender, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return err + } + + fileReader, err := os.Open(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("read csv: %w", err) + } + + defer fileReader.Close() //nolint:errcheck + r := csv.NewReader(fileReader) + records, err := r.ReadAll() + if err != nil { + return xerrors.Errorf("read csv: %w", err) + } + + var msgCids []cid.Cid + for i, e := range records[1:] { + addr, err := address.NewFromString(e[0]) + if err != nil { + return xerrors.Errorf("failed to parse address in row %d: %w", i, err) + } + + value, err := types.ParseFIL(strings.TrimSpace(e[1])) + if err != nil { + return xerrors.Errorf("failed to parse value balance: %w", err) + } + + smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + To: addr, + From: sender, + Value: abi.TokenAmount(value), + }, nil) + if err != nil { + return err + } + + fmt.Printf("sending %s to %s in msg %s\n", value.String(), addr, smsg.Cid()) + + if i > 0 && i%100 == 0 { + fmt.Printf("catching up until latest message lands") + _, err := api.StateWaitMsg(ctx, smsg.Cid(), 1, lapi.LookbackNoLimit, true) + if err != nil { + return err + } + } + + msgCids = append(msgCids, smsg.Cid()) + } + + fmt.Println("waiting on messages") + + for _, msgCid := range msgCids { + ml, err := api.StateWaitMsg(ctx, msgCid, 5, lapi.LookbackNoLimit, true) + if err != nil { + return err + } + if ml.Receipt.ExitCode != exitcode.Ok { + fmt.Printf("MSG %s NON-ZERO EXITCODE: %s\n", msgCid, ml.Receipt.ExitCode) + } + } + + return nil + }, +} From c9a557e0d97a5240d022573da3f498cbcaef642d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 24 Nov 2021 14:34:28 -0500 Subject: [PATCH 028/157] Address review --- cmd/lotus-shed/send-csv.go | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go index 072605b8d..2ecd6345b 100644 --- a/cmd/lotus-shed/send-csv.go +++ b/cmd/lotus-shed/send-csv.go @@ -20,12 +20,19 @@ import ( ) var sendCsvCmd = &cli.Command{ - Name: "send-csv", - Usage: "Utility for sending a batch of balance transfers", - ArgsUsage: "[sender] [csvfile]", + Name: "send-csv", + Usage: "Utility for sending a batch of balance transfers", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "from", + Usage: "specify the account to send funds from", + Required: true, + }, + }, + ArgsUsage: "[csvfile]", Action: func(cctx *cli.Context) error { - if cctx.NArg() != 2 { - return xerrors.New("must supply sender and path to csv file") + if cctx.NArg() != 1 { + return xerrors.New("must supply path to csv file") } api, closer, err := lcli.GetFullNodeAPIV1(cctx) @@ -36,12 +43,12 @@ var sendCsvCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - sender, err := address.NewFromString(cctx.Args().Get(0)) + sender, err := address.NewFromString(cctx.String("from")) if err != nil { return err } - fileReader, err := os.Open(cctx.Args().Get(1)) + fileReader, err := os.Open(cctx.Args().First()) if err != nil { return xerrors.Errorf("read csv: %w", err) } @@ -53,7 +60,11 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("read csv: %w", err) } - var msgCids []cid.Cid + if strings.TrimSpace(records[0][0]) != "Recipient" || strings.TrimSpace(records[0][1]) != "FIL" { + return xerrors.Errorf("expected header row to be \"Recipient, FIL\"") + } + + var msgs []*types.Message for i, e := range records[1:] { addr, err := address.NewFromString(e[0]) if err != nil { @@ -65,16 +76,21 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("failed to parse value balance: %w", err) } - smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + msgs = append(msgs, &types.Message{ To: addr, From: sender, Value: abi.TokenAmount(value), - }, nil) + }) + } + + var msgCids []cid.Cid + for i, msg := range msgs { + smsg, err := api.MpoolPushMessage(ctx, msg, nil) if err != nil { return err } - fmt.Printf("sending %s to %s in msg %s\n", value.String(), addr, smsg.Cid()) + fmt.Printf("sending %s to %s in msg %s\n", msg.Value.String(), msg.To, smsg.Cid()) if i > 0 && i%100 == 0 { fmt.Printf("catching up until latest message lands") From b0a9a272880b7e72cca5d5b33b9f9ff654e0a883 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 25 Nov 2021 17:21:50 -0500 Subject: [PATCH 029/157] Shed: Allow send-csv to specify params and method --- cmd/lotus-shed/send-csv.go | 48 +++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/cmd/lotus-shed/send-csv.go b/cmd/lotus-shed/send-csv.go index 2ecd6345b..ce1c8b68a 100644 --- a/cmd/lotus-shed/send-csv.go +++ b/cmd/lotus-shed/send-csv.go @@ -2,8 +2,10 @@ package main import ( "encoding/csv" + "encoding/hex" "fmt" "os" + "strconv" "strings" "github.com/ipfs/go-cid" @@ -43,6 +45,12 @@ var sendCsvCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) + srv, err := lcli.GetFullNodeServices(cctx) + if err != nil { + return err + } + defer srv.Close() //nolint:errcheck + sender, err := address.NewFromString(cctx.String("from")) if err != nil { return err @@ -60,8 +68,11 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("read csv: %w", err) } - if strings.TrimSpace(records[0][0]) != "Recipient" || strings.TrimSpace(records[0][1]) != "FIL" { - return xerrors.Errorf("expected header row to be \"Recipient, FIL\"") + if strings.TrimSpace(records[0][0]) != "Recipient" || + strings.TrimSpace(records[0][1]) != "FIL" || + strings.TrimSpace(records[0][2]) != "Method" || + strings.TrimSpace(records[0][3]) != "Params" { + return xerrors.Errorf("expected header row to be \"Recipient, FIL, Method, Params\"") } var msgs []*types.Message @@ -76,21 +87,41 @@ var sendCsvCmd = &cli.Command{ return xerrors.Errorf("failed to parse value balance: %w", err) } + method, err := strconv.Atoi(strings.TrimSpace(e[2])) + if err != nil { + return xerrors.Errorf("failed to parse method number: %w", err) + } + + var params []byte + if strings.TrimSpace(e[3]) != "nil" { + params, err = hex.DecodeString(strings.TrimSpace(e[3])) + if err != nil { + return xerrors.Errorf("failed to parse hexparams: %w", err) + } + } + msgs = append(msgs, &types.Message{ - To: addr, - From: sender, - Value: abi.TokenAmount(value), + To: addr, + From: sender, + Value: abi.TokenAmount(value), + Method: abi.MethodNum(method), + Params: params, }) } + if len(msgs) == 0 { + return nil + } + var msgCids []cid.Cid for i, msg := range msgs { smsg, err := api.MpoolPushMessage(ctx, msg, nil) if err != nil { - return err + fmt.Printf("%d, ERROR %s\n", i, err) + continue } - fmt.Printf("sending %s to %s in msg %s\n", msg.Value.String(), msg.To, smsg.Cid()) + fmt.Printf("%d, %s\n", i, smsg.Cid()) if i > 0 && i%100 == 0 { fmt.Printf("catching up until latest message lands") @@ -103,7 +134,7 @@ var sendCsvCmd = &cli.Command{ msgCids = append(msgCids, smsg.Cid()) } - fmt.Println("waiting on messages") + fmt.Println("waiting on messages...") for _, msgCid := range msgCids { ml, err := api.StateWaitMsg(ctx, msgCid, 5, lapi.LookbackNoLimit, true) @@ -115,6 +146,7 @@ var sendCsvCmd = &cli.Command{ } } + fmt.Println("all sent messages succeeded") return nil }, } From 13b260e7f7380e889d8d4fffaefec495f38d93e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 8 Dec 2021 23:16:27 +0100 Subject: [PATCH 030/157] piecereader: Move closer to storage --- extern/sector-storage/mock/mock.go | 13 ++- extern/sector-storage/piece_provider.go | 102 +++++++++--------- extern/sector-storage/piece_provider_test.go | 2 +- .../sector-storage/piece_reader.go | 25 +++-- markets/dagstore/miner_api.go | 31 +++--- markets/dagstore/miner_api_test.go | 17 ++- markets/dagstore/mocks/mock_lotus_accessor.go | 18 ++-- markets/dagstore/mount.go | 6 +- markets/dagstore/mount_test.go | 27 ++++- markets/dagstore/wrapper_migration_test.go | 19 ++-- markets/dagstore/wrapper_test.go | 5 +- markets/sectoraccessor/sectoraccessor.go | 24 ++--- 12 files changed, 167 insertions(+), 122 deletions(-) rename markets/dagstore/piecereader.go => extern/sector-storage/piece_reader.go (90%) diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index eeb1404ad..4d0592d36 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -12,6 +12,7 @@ import ( proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/dagstore/mount" ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" @@ -384,12 +385,20 @@ func generateFakePoSt(sectorInfo []proof5.SectorInfo, rpt func(abi.RegisteredSea } } -func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, startOffset uint64, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (io.ReadCloser, bool, error) { +func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) { if uint64(offset) != 0 { panic("implme") } - return ioutil.NopCloser(bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][startOffset:size])), false, nil + return struct { + io.ReadCloser + io.Seeker + io.ReaderAt + }{ + ReadCloser: ioutil.NopCloser(bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][:size])), + Seeker: nil, + ReaderAt: nil, + }, false, nil } func (mgr *SectorMgr) StageFakeData(mid abi.ActorID, spt abi.RegisteredSealProof) (storage.SectorRef, []abi.PieceInfo, error) { diff --git a/extern/sector-storage/piece_provider.go b/extern/sector-storage/piece_provider.go index aa2ef0d0d..c500b4e30 100644 --- a/extern/sector-storage/piece_provider.go +++ b/extern/sector-storage/piece_provider.go @@ -8,6 +8,7 @@ import ( "github.com/ipfs/go-cid" "golang.org/x/xerrors" + "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" @@ -27,7 +28,7 @@ type PieceProvider interface { // default in most cases, but this might matter with future PoRep) // startOffset is added to the pieceOffset to get the starting reader offset. // The number of bytes that can be read is pieceSize-startOffset - ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, startOffset uint64, pieceSize abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (io.ReadCloser, bool, error) + ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, pieceSize abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) IsUnsealed(ctx context.Context, sector storage.SectorRef, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (bool, error) } @@ -71,28 +72,62 @@ func (p *pieceProvider) IsUnsealed(ctx context.Context, sector storage.SectorRef // It will NOT try to schedule an Unseal of a sealed sector file for the read. // // Returns a nil reader if the piece does NOT exist in any unsealed file or there is no unsealed file for the given sector on any of the workers. -func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, sector storage.SectorRef, pieceOffset, startOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (io.ReadCloser, context.CancelFunc, error) { +func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize) (mount.Reader, error) { // acquire a lock purely for reading unsealed sectors ctx, cancel := context.WithCancel(ctx) if err := p.index.StorageLock(ctx, sector.ID, storiface.FTUnsealed, storiface.FTNone); err != nil { cancel() - return nil, nil, xerrors.Errorf("acquiring read sector lock: %w", err) + return nil, xerrors.Errorf("acquiring read sector lock: %w", err) } - // Reader returns a reader for an unsealed piece at the given offset in the given sector. - // The returned reader will be nil if none of the workers has an unsealed sector file containing - // the unsealed piece. - r, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()+startOffset.Padded()), size.Padded()-abi.PaddedPieceSize(startOffset.Padded())) - if err != nil { - log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) - cancel() - return nil, nil, err - } - if r == nil { + pr, err := (&pieceReader{ + ctx: ctx, + getReader: func(ctx context.Context, startOffset uint64) (io.ReadCloser, error) { + startOffsetAligned := storiface.UnpaddedByteIndex(startOffset / 127 * 127) // floor to multiple of 127 + + // Reader returns a reader for an unsealed piece at the given offset in the given sector. + // The returned reader will be nil if none of the workers has an unsealed sector file containing + // the unsealed piece. + r, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()+startOffsetAligned.Padded()), size.Padded()-abi.PaddedPieceSize(startOffsetAligned.Padded())) + if err != nil { + log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) + return nil, err + } + if r == nil { + return nil, nil + } + + upr, err := fr32.NewUnpadReader(r, size.Padded()) + if err != nil { + r.Close() // nolint + return nil, xerrors.Errorf("creating unpadded reader: %w", err) + } + + bir := bufio.NewReaderSize(upr, 127) + if startOffset > uint64(startOffsetAligned) { + if _, err := bir.Discard(int(startOffset - uint64(startOffsetAligned))); err != nil { + return nil, xerrors.Errorf("discarding bytes for startOffset: %w", err) + } + } + + return struct { + io.Reader + io.Closer + }{ + Reader: bir, + Closer: r, + }, nil + }, + len: size, + onClose: cancel, + pieceCid: pc, + }).init() + if err != nil || pr == nil { // pr == nil to make sure we don't return typed nil cancel() + return nil, err } - return r, cancel, nil + return pr, err } // ReadPiece is used to read an Unsealed piece at the given offset and of the given size from a Sector @@ -101,7 +136,7 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, sector storage // If we do NOT have an existing unsealed file containing the given piece thus causing us to schedule an Unseal, // the returned boolean parameter will be set to true. // If we have an existing unsealed file containing the given piece, the returned boolean will be set to false. -func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, startOffset uint64, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (io.ReadCloser, bool, error) { +func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, pieceOffset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, ticket abi.SealRandomness, unsealed cid.Cid) (mount.Reader, bool, error) { if err := pieceOffset.Valid(); err != nil { return nil, false, xerrors.Errorf("pieceOffset is not valid: %w", err) } @@ -109,9 +144,7 @@ func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, return nil, false, xerrors.Errorf("size is not a valid piece size: %w", err) } - startOffsetAligned := storiface.UnpaddedByteIndex(startOffset / 127 * 127) // floor to multiple of 127 - - r, unlock, err := p.tryReadUnsealedPiece(ctx, sector, pieceOffset, startOffsetAligned, size) + r, err := p.tryReadUnsealedPiece(ctx, unsealed, sector, pieceOffset, size) log.Debugf("result of first tryReadUnsealedPiece: r=%+v, err=%s", r, err) @@ -142,7 +175,7 @@ func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, log.Debugf("unsealed a sector file to read the piece, sector=%+v, pieceOffset=%d, size=%d", sector, pieceOffset, size) - r, unlock, err = p.tryReadUnsealedPiece(ctx, sector, pieceOffset, startOffsetAligned, size) + r, err = p.tryReadUnsealedPiece(ctx, unsealed, sector, pieceOffset, size) if err != nil { log.Errorf("failed to tryReadUnsealedPiece after SectorsUnsealPiece: %s", err) return nil, true, xerrors.Errorf("read after unsealing: %w", err) @@ -156,34 +189,7 @@ func (p *pieceProvider) ReadPiece(ctx context.Context, sector storage.SectorRef, log.Debugf("unsealed piece already exists, no need to unseal, sector=%+v, pieceOffset=%d, size=%d", sector, pieceOffset, size) } - upr, err := fr32.NewUnpadReader(r, size.Padded()) - if err != nil { - unlock() - return nil, uns, xerrors.Errorf("creating unpadded reader: %w", err) - } + log.Debugf("returning reader to read unsealed piece, sector=%+v, pieceOffset=%d, size=%d", sector, pieceOffset, size) - log.Debugf("returning reader to read unsealed piece, sector=%+v, pieceOffset=%d, startOffset=%d, size=%d", sector, pieceOffset, startOffset, size) - - bir := bufio.NewReaderSize(upr, 127) - if startOffset > uint64(startOffsetAligned) { - if _, err := bir.Discard(int(startOffset - uint64(startOffsetAligned))); err != nil { - return nil, false, xerrors.Errorf("discarding bytes for startOffset: %w", err) - } - } - - return &funcCloser{ - Reader: bir, - close: func() error { - err = r.Close() - unlock() - return err - }, - }, uns, nil + return r, uns, nil } - -type funcCloser struct { - io.Reader - close func() error -} - -func (fc *funcCloser) Close() error { return fc.close() } diff --git a/extern/sector-storage/piece_provider_test.go b/extern/sector-storage/piece_provider_test.go index 1aad3d2d2..3ace2916e 100644 --- a/extern/sector-storage/piece_provider_test.go +++ b/extern/sector-storage/piece_provider_test.go @@ -338,7 +338,7 @@ func (p *pieceProviderTestHarness) isUnsealed(t *testing.T, offset storiface.Unp func (p *pieceProviderTestHarness) readPiece(t *testing.T, offset storiface.UnpaddedByteIndex, size abi.UnpaddedPieceSize, expectedHadToUnseal bool, expectedBytes []byte) { - rd, isUnsealed, err := p.pp.ReadPiece(p.ctx, p.sector, offset, 0, size, p.ticket, p.commD) + rd, isUnsealed, err := p.pp.ReadPiece(p.ctx, p.sector, offset, size, p.ticket, p.commD) require.NoError(t, err) require.NotNil(t, rd) require.Equal(t, expectedHadToUnseal, isUnsealed) diff --git a/markets/dagstore/piecereader.go b/extern/sector-storage/piece_reader.go similarity index 90% rename from markets/dagstore/piecereader.go rename to extern/sector-storage/piece_reader.go index 67cd10c27..14f13f017 100644 --- a/markets/dagstore/piecereader.go +++ b/extern/sector-storage/piece_reader.go @@ -1,4 +1,4 @@ -package dagstore +package sectorstorage import ( "bufio" @@ -19,11 +19,14 @@ import ( var MaxPieceReaderBurnBytes int64 = 1 << 20 // 1M var ReadBuf = 128 * (127 * 8) // unpadded(128k) +type pieceGetter func(ctx context.Context, offset uint64) (io.ReadCloser, error) + type pieceReader struct { - ctx context.Context - api MinerAPI - pieceCid cid.Cid - len abi.UnpaddedPieceSize + ctx context.Context + getReader pieceGetter + pieceCid cid.Cid + len abi.UnpaddedPieceSize + onClose context.CancelFunc closed bool seqAt int64 // next byte to be read by io.Reader @@ -37,10 +40,14 @@ func (p *pieceReader) init() (_ *pieceReader, err error) { stats.Record(p.ctx, metrics.DagStorePRInitCount.M(1)) p.rAt = 0 - p.r, p.len, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) + p.r, err = p.getReader(p.ctx, uint64(p.rAt)) if err != nil { return nil, err } + if p.r == nil { + return nil, nil + } + p.br = bufio.NewReaderSize(p.r, ReadBuf) return p, nil @@ -66,6 +73,10 @@ func (p *pieceReader) Close() error { p.r = nil } + p.onClose() + + p.closed = true + return nil } @@ -127,7 +138,7 @@ func (p *pieceReader) ReadAt(b []byte, off int64) (n int, err error) { } p.rAt = off - p.r, _, err = p.api.FetchUnsealedPiece(p.ctx, p.pieceCid, uint64(p.rAt)) + p.r, err = p.getReader(p.ctx, uint64(p.rAt)) p.br = bufio.NewReaderSize(p.r, ReadBuf) if err != nil { return 0, xerrors.Errorf("getting backing reader: %w", err) diff --git a/markets/dagstore/miner_api.go b/markets/dagstore/miner_api.go index d59a05846..7f59162f0 100644 --- a/markets/dagstore/miner_api.go +++ b/markets/dagstore/miner_api.go @@ -3,22 +3,21 @@ package dagstore import ( "context" "fmt" - "io" - - "github.com/filecoin-project/dagstore/throttle" - "github.com/filecoin-project/go-state-types/abi" "github.com/ipfs/go-cid" "golang.org/x/xerrors" + "github.com/filecoin-project/dagstore/mount" + "github.com/filecoin-project/dagstore/throttle" "github.com/filecoin-project/go-fil-markets/piecestore" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/shared" + "github.com/filecoin-project/go-state-types/abi" ) //go:generate go run github.com/golang/mock/mockgen -destination=mocks/mock_lotus_accessor.go -package=mock_dagstore . MinerAPI type MinerAPI interface { - FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, offset uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) + FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid) (mount.Reader, error) GetUnpaddedCARSize(ctx context.Context, pieceCid cid.Cid) (uint64, error) IsUnsealed(ctx context.Context, pieceCid cid.Cid) (bool, error) Start(ctx context.Context) error @@ -27,7 +26,7 @@ type MinerAPI interface { type SectorAccessor interface { retrievalmarket.SectorAccessor - UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) + UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) } type minerAPI struct { @@ -100,10 +99,10 @@ func (m *minerAPI) IsUnsealed(ctx context.Context, pieceCid cid.Cid) (bool, erro return false, nil } -func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, offset uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) { +func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid) (mount.Reader, error) { err := m.readyMgr.AwaitReady() if err != nil { - return nil, 0, err + return nil, err } // Throttle this path to avoid flooding the storage subsystem. @@ -114,11 +113,11 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off }) if err != nil { - return nil, 0, xerrors.Errorf("failed to fetch pieceInfo for piece %s: %w", pieceCid, err) + return nil, xerrors.Errorf("failed to fetch pieceInfo for piece %s: %w", pieceCid, err) } if len(pieceInfo.Deals) == 0 { - return nil, 0, xerrors.Errorf("no storage deals found for piece %s", pieceCid) + return nil, xerrors.Errorf("no storage deals found for piece %s", pieceCid) } // prefer an unsealed sector containing the piece if one exists @@ -126,7 +125,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off deal := deal // Throttle this path to avoid flooding the storage subsystem. - var reader io.ReadCloser + var reader mount.Reader err := m.throttle.Do(ctx, func(ctx context.Context) (err error) { isUnsealed, err := m.sa.IsUnsealed(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) if err != nil { @@ -136,7 +135,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off return nil } // Because we know we have an unsealed copy, this UnsealSector call will actually not perform any unsealing. - reader, err = m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), offset, deal.Length.Unpadded()) + reader, err = m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) return err }) @@ -147,7 +146,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off if reader != nil { // we were able to obtain a reader for an already unsealed piece - return reader, deal.Length.Unpadded(), nil + return reader, nil } } @@ -158,7 +157,7 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off // block for a long time with the current PoRep // // This path is unthrottled. - reader, err := m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), offset, deal.Length.Unpadded()) + reader, err := m.sa.UnsealSectorAt(ctx, deal.SectorID, deal.Offset.Unpadded(), deal.Length.Unpadded()) if err != nil { lastErr = xerrors.Errorf("failed to unseal deal %d: %w", deal.DealID, err) log.Warn(lastErr.Error()) @@ -166,10 +165,10 @@ func (m *minerAPI) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, off } // Successfully fetched the deal data so return a reader over the data - return reader, deal.Length.Unpadded(), nil + return reader, nil } - return nil, 0, lastErr + return nil, lastErr } func (m *minerAPI) GetUnpaddedCARSize(ctx context.Context, pieceCid cid.Cid) (uint64, error) { diff --git a/markets/dagstore/miner_api_test.go b/markets/dagstore/miner_api_test.go index 38c3a4fc3..45cbf2461 100644 --- a/markets/dagstore/miner_api_test.go +++ b/markets/dagstore/miner_api_test.go @@ -15,6 +15,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" + "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-actors/actors/builtin/paych" @@ -87,7 +88,7 @@ func TestLotusAccessorFetchUnsealedPiece(t *testing.T) { } // Fetch the piece - r, _, err := api.FetchUnsealedPiece(ctx, cid1, 0) + r, err := api.FetchUnsealedPiece(ctx, cid1) if tc.expectErr { require.Error(t, err) return @@ -159,7 +160,7 @@ func TestThrottle(t *testing.T) { errgrp, ctx := errgroup.WithContext(context.Background()) for i := 0; i < 10; i++ { errgrp.Go(func() error { - r, _, err := api.FetchUnsealedPiece(ctx, cid1, 0) + r, err := api.FetchUnsealedPiece(ctx, cid1) if err == nil { _ = r.Close() } @@ -203,10 +204,10 @@ type mockRPN struct { } func (m *mockRPN) UnsealSector(ctx context.Context, sectorID abi.SectorNumber, offset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { - return m.UnsealSectorAt(ctx, sectorID, offset, 0, length) + return m.UnsealSectorAt(ctx, sectorID, offset, length) } -func (m *mockRPN) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { +func (m *mockRPN) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { atomic.AddInt32(&m.calls, 1) m.lk.RLock() defer m.lk.RUnlock() @@ -215,7 +216,13 @@ func (m *mockRPN) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, if !ok { panic("sector not found") } - return io.NopCloser(bytes.NewBuffer([]byte(data[startOffset:]))), nil + return struct { + io.ReadCloser + io.ReaderAt + io.Seeker + }{ + ReadCloser: io.NopCloser(bytes.NewBuffer([]byte(data[:]))), + }, nil } func (m *mockRPN) IsUnsealed(ctx context.Context, sectorID abi.SectorNumber, offset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (bool, error) { diff --git a/markets/dagstore/mocks/mock_lotus_accessor.go b/markets/dagstore/mocks/mock_lotus_accessor.go index e10a1b053..19923cc2a 100644 --- a/markets/dagstore/mocks/mock_lotus_accessor.go +++ b/markets/dagstore/mocks/mock_lotus_accessor.go @@ -6,10 +6,9 @@ package mock_dagstore import ( context "context" - io "io" reflect "reflect" - abi "github.com/filecoin-project/go-state-types/abi" + mount "github.com/filecoin-project/dagstore/mount" gomock "github.com/golang/mock/gomock" cid "github.com/ipfs/go-cid" ) @@ -38,19 +37,18 @@ func (m *MockMinerAPI) EXPECT() *MockMinerAPIMockRecorder { } // FetchUnsealedPiece mocks base method. -func (m *MockMinerAPI) FetchUnsealedPiece(arg0 context.Context, arg1 cid.Cid, arg2 uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) { +func (m *MockMinerAPI) FetchUnsealedPiece(arg0 context.Context, arg1 cid.Cid) (mount.Reader, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchUnsealedPiece", arg0, arg1, arg2) - ret0, _ := ret[0].(io.ReadCloser) - ret1, _ := ret[1].(abi.UnpaddedPieceSize) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 + ret := m.ctrl.Call(m, "FetchUnsealedPiece", arg0, arg1) + ret0, _ := ret[0].(mount.Reader) + ret1, _ := ret[1].(error) + return ret0, ret1 } // FetchUnsealedPiece indicates an expected call of FetchUnsealedPiece. -func (mr *MockMinerAPIMockRecorder) FetchUnsealedPiece(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockMinerAPIMockRecorder) FetchUnsealedPiece(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchUnsealedPiece", reflect.TypeOf((*MockMinerAPI)(nil).FetchUnsealedPiece), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchUnsealedPiece", reflect.TypeOf((*MockMinerAPI)(nil).FetchUnsealedPiece), arg0, arg1) } // GetUnpaddedCARSize mocks base method. diff --git a/markets/dagstore/mount.go b/markets/dagstore/mount.go index e4e6242d7..0ecdc9808 100644 --- a/markets/dagstore/mount.go +++ b/markets/dagstore/mount.go @@ -56,11 +56,7 @@ func (l *LotusMount) Deserialize(u *url.URL) error { } func (l *LotusMount) Fetch(ctx context.Context) (mount.Reader, error) { - return (&pieceReader{ - ctx: ctx, - api: l.API, - pieceCid: l.PieceCid, - }).init() + return l.API.FetchUnsealedPiece(ctx, l.PieceCid) } func (l *LotusMount) Info() mount.Info { diff --git a/markets/dagstore/mount_test.go b/markets/dagstore/mount_test.go index 820058786..d6ea54964 100644 --- a/markets/dagstore/mount_test.go +++ b/markets/dagstore/mount_test.go @@ -2,6 +2,7 @@ package dagstore import ( "context" + "io" "io/ioutil" "net/url" "strings" @@ -12,8 +13,6 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/dagstore/mount" - "github.com/filecoin-project/go-state-types/abi" - mock_dagstore "github.com/filecoin-project/lotus/markets/dagstore/mocks" ) @@ -30,8 +29,28 @@ func TestLotusMount(t *testing.T) { mockLotusMountAPI := mock_dagstore.NewMockMinerAPI(mockCtrl) mockLotusMountAPI.EXPECT().IsUnsealed(gomock.Any(), cid).Return(true, nil).Times(1) - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) - mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid, uint64(0)).Return(ioutil.NopCloser(strings.NewReader("testing")), abi.UnpaddedPieceSize(7), nil).Times(1) + + mr1 := struct { + io.ReadCloser + io.ReaderAt + io.Seeker + }{ + ReadCloser: ioutil.NopCloser(strings.NewReader("testing")), + ReaderAt: nil, + Seeker: nil, + } + mr2 := struct { + io.ReadCloser + io.ReaderAt + io.Seeker + }{ + ReadCloser: ioutil.NopCloser(strings.NewReader("testing")), + ReaderAt: nil, + Seeker: nil, + } + + mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid).Return(mr1, nil).Times(1) + mockLotusMountAPI.EXPECT().FetchUnsealedPiece(gomock.Any(), cid).Return(mr2, nil).Times(1) mockLotusMountAPI.EXPECT().GetUnpaddedCARSize(ctx, cid).Return(uint64(100), nil).Times(1) mnt, err := NewLotusMount(cid, mockLotusMountAPI) diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index 502105499..e46f8779b 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -6,9 +6,9 @@ import ( "testing" "github.com/stretchr/testify/require" - "golang.org/x/xerrors" "github.com/filecoin-project/dagstore" + "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-fil-markets/retrievalmarket" @@ -127,17 +127,20 @@ type wrappedSA struct { retrievalmarket.SectorAccessor } -func (w *wrappedSA) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { +func (w *wrappedSA) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { r, err := w.UnsealSector(ctx, sectorID, pieceOffset, length) if err != nil { return nil, err } - if startOffset > 0 { - if _, err := io.CopyN(io.Discard, r, int64(startOffset)); err != nil { - return nil, xerrors.Errorf("discard start off: %w", err) - } - } - return r, err + return struct { + io.ReadCloser + io.Seeker + io.ReaderAt + }{ + ReadCloser: r, + Seeker: nil, + ReaderAt: nil, + }, err } var _ SectorAccessor = &wrappedSA{} diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go index a4a6215e1..48e01100b 100644 --- a/markets/dagstore/wrapper_test.go +++ b/markets/dagstore/wrapper_test.go @@ -3,7 +3,6 @@ package dagstore import ( "bytes" "context" - "io" "os" "testing" "time" @@ -12,8 +11,6 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/xerrors" - "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/dagstore" "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/dagstore/shard" @@ -192,7 +189,7 @@ func (m mockLotusMount) Start(ctx context.Context) error { return nil } -func (m mockLotusMount) FetchUnsealedPiece(ctx context.Context, pieceCid cid.Cid, offset uint64) (io.ReadCloser, abi.UnpaddedPieceSize, error) { +func (m mockLotusMount) FetchUnsealedPiece(context.Context, cid.Cid) (mount.Reader, error) { panic("implement me") } diff --git a/markets/sectoraccessor/sectoraccessor.go b/markets/sectoraccessor/sectoraccessor.go index f70aca103..4320e3fb1 100644 --- a/markets/sectoraccessor/sectoraccessor.go +++ b/markets/sectoraccessor/sectoraccessor.go @@ -4,8 +4,16 @@ import ( "context" "io" + "github.com/ipfs/go-cid" + logging "github.com/ipfs/go-log/v2" "golang.org/x/xerrors" + "github.com/filecoin-project/dagstore/mount" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/filecoin-project/go-state-types/abi" + specstorage "github.com/filecoin-project/specs-storage/storage" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/chain/types" @@ -14,14 +22,6 @@ import ( "github.com/filecoin-project/lotus/markets/dagstore" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/storage/sectorblocks" - - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/retrievalmarket" - "github.com/filecoin-project/go-state-types/abi" - specstorage "github.com/filecoin-project/specs-storage/storage" - - "github.com/ipfs/go-cid" - logging "github.com/ipfs/go-log/v2" ) var log = logging.Logger("sectoraccessor") @@ -40,10 +40,10 @@ func NewSectorAccessor(maddr dtypes.MinerAddress, secb sectorblocks.SectorBuilde } func (sa *sectorAccessor) UnsealSector(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { - return sa.UnsealSectorAt(ctx, sectorID, pieceOffset, 0, length) + return sa.UnsealSectorAt(ctx, sectorID, pieceOffset, length) } -func (sa *sectorAccessor) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, startOffset uint64, length abi.UnpaddedPieceSize) (io.ReadCloser, error) { +func (sa *sectorAccessor) UnsealSectorAt(ctx context.Context, sectorID abi.SectorNumber, pieceOffset abi.UnpaddedPieceSize, length abi.UnpaddedPieceSize) (mount.Reader, error) { log.Debugf("get sector %d, pieceOffset %d, length %d", sectorID, pieceOffset, length) si, err := sa.sectorsStatus(ctx, sectorID, false) if err != nil { @@ -69,8 +69,8 @@ func (sa *sectorAccessor) UnsealSectorAt(ctx context.Context, sectorID abi.Secto } // Get a reader for the piece, unsealing the piece if necessary - log.Debugf("read piece in sector %d, pieceOffset %d, startOffset %d, length %d from miner %d", sectorID, pieceOffset, startOffset, length, mid) - r, unsealed, err := sa.pp.ReadPiece(ctx, ref, storiface.UnpaddedByteIndex(pieceOffset), startOffset, length, si.Ticket.Value, commD) + log.Debugf("read piece in sector %d, pieceOffset %d, length %d from miner %d", sectorID, pieceOffset, length, mid) + r, unsealed, err := sa.pp.ReadPiece(ctx, ref, storiface.UnpaddedByteIndex(pieceOffset), length, si.Ticket.Value, commD) if err != nil { return nil, xerrors.Errorf("failed to unseal piece from sector %d: %w", sectorID, err) } From 072297e6617209d7d008412755671f183511968c Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Thu, 18 Nov 2021 17:50:25 -0800 Subject: [PATCH 031/157] WIP: updating to new datastore/blockstore code with contexts --- blockstore/api.go | 20 +- blockstore/badger/blockstore.go | 18 +- blockstore/badger/blockstore_test.go | 14 +- blockstore/badger/blockstore_test_suite.go | 58 +-- blockstore/blockstore.go | 12 +- blockstore/buffered.go | 52 +-- blockstore/discard.go | 28 +- blockstore/fallback.go | 10 +- blockstore/idstore.go | 36 +- blockstore/ipfs.go | 24 +- blockstore/mem.go | 20 +- blockstore/sync.go | 34 +- blockstore/timed.go | 42 +- blockstore/timed_test.go | 24 +- blockstore/union.go | 36 +- blockstore/union_test.go | 40 +- extern/filecoin-ffi | 2 +- go.mod | 38 +- go.sum | 426 +++++++-------------- lib/backupds/backupds_test.go | 7 +- lib/backupds/datastore.go | 49 +-- lib/backupds/log.go | 10 +- lib/backupds/read.go | 7 +- 23 files changed, 452 insertions(+), 555 deletions(-) diff --git a/blockstore/api.go b/blockstore/api.go index 6715b4766..348c0f84e 100644 --- a/blockstore/api.go +++ b/blockstore/api.go @@ -25,35 +25,35 @@ func NewAPIBlockstore(cio ChainIO) Blockstore { return Adapt(bs) // return an adapted blockstore. } -func (a *apiBlockstore) DeleteBlock(cid.Cid) error { +func (a *apiBlockstore) DeleteBlock(context.Context, cid.Cid) error { return xerrors.New("not supported") } -func (a *apiBlockstore) Has(c cid.Cid) (bool, error) { - return a.api.ChainHasObj(context.TODO(), c) +func (a *apiBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + return a.api.ChainHasObj(ctx, c) } -func (a *apiBlockstore) Get(c cid.Cid) (blocks.Block, error) { - bb, err := a.api.ChainReadObj(context.TODO(), c) +func (a *apiBlockstore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + bb, err := a.api.ChainReadObj(ctx, c) if err != nil { return nil, err } return blocks.NewBlockWithCid(bb, c) } -func (a *apiBlockstore) GetSize(c cid.Cid) (int, error) { - bb, err := a.api.ChainReadObj(context.TODO(), c) +func (a *apiBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + bb, err := a.api.ChainReadObj(ctx, c) if err != nil { return 0, err } return len(bb), nil } -func (a *apiBlockstore) Put(blocks.Block) error { +func (a *apiBlockstore) Put(context.Context, blocks.Block) error { return xerrors.New("not supported") } -func (a *apiBlockstore) PutMany([]blocks.Block) error { +func (a *apiBlockstore) PutMany(context.Context, []blocks.Block) error { return xerrors.New("not supported") } @@ -61,6 +61,6 @@ func (a *apiBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) return nil, xerrors.New("not supported") } -func (a *apiBlockstore) HashOnRead(enabled bool) { +func (a *apiBlockstore) HashOnRead(ctx context.Context, enabled bool) { return } diff --git a/blockstore/badger/blockstore.go b/blockstore/badger/blockstore.go index a0b51d8df..e81e5838c 100644 --- a/blockstore/badger/blockstore.go +++ b/blockstore/badger/blockstore.go @@ -525,7 +525,7 @@ func (b *Blockstore) Size() (int64, error) { // View implements blockstore.Viewer, which leverages zero-copy read-only // access to values. -func (b *Blockstore) View(cid cid.Cid, fn func([]byte) error) error { +func (b *Blockstore) View(ctx context.Context, cid cid.Cid, fn func([]byte) error) error { if err := b.access(); err != nil { return err } @@ -552,7 +552,7 @@ func (b *Blockstore) View(cid cid.Cid, fn func([]byte) error) error { } // Has implements Blockstore.Has. -func (b *Blockstore) Has(cid cid.Cid) (bool, error) { +func (b *Blockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { if err := b.access(); err != nil { return false, err } @@ -582,7 +582,7 @@ func (b *Blockstore) Has(cid cid.Cid) (bool, error) { } // Get implements Blockstore.Get. -func (b *Blockstore) Get(cid cid.Cid) (blocks.Block, error) { +func (b *Blockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { if !cid.Defined() { return nil, blockstore.ErrNotFound } @@ -619,7 +619,7 @@ func (b *Blockstore) Get(cid cid.Cid) (blocks.Block, error) { } // GetSize implements Blockstore.GetSize. -func (b *Blockstore) GetSize(cid cid.Cid) (int, error) { +func (b *Blockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { if err := b.access(); err != nil { return 0, err } @@ -652,7 +652,7 @@ func (b *Blockstore) GetSize(cid cid.Cid) (int, error) { } // Put implements Blockstore.Put. -func (b *Blockstore) Put(block blocks.Block) error { +func (b *Blockstore) Put(ctx context.Context, block blocks.Block) error { if err := b.access(); err != nil { return err } @@ -691,7 +691,7 @@ func (b *Blockstore) Put(block blocks.Block) error { } // PutMany implements Blockstore.PutMany. -func (b *Blockstore) PutMany(blocks []blocks.Block) error { +func (b *Blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { if err := b.access(); err != nil { return err } @@ -755,7 +755,7 @@ func (b *Blockstore) PutMany(blocks []blocks.Block) error { } // DeleteBlock implements Blockstore.DeleteBlock. -func (b *Blockstore) DeleteBlock(cid cid.Cid) error { +func (b *Blockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { if err := b.access(); err != nil { return err } @@ -774,7 +774,7 @@ func (b *Blockstore) DeleteBlock(cid cid.Cid) error { }) } -func (b *Blockstore) DeleteMany(cids []cid.Cid) error { +func (b *Blockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { if err := b.access(); err != nil { return err } @@ -927,7 +927,7 @@ func (b *Blockstore) ForEachKey(f func(cid.Cid) error) error { // HashOnRead implements Blockstore.HashOnRead. It is not supported by this // blockstore. -func (b *Blockstore) HashOnRead(_ bool) { +func (b *Blockstore) HashOnRead(ctx context.Context, _ bool) { log.Warnf("called HashOnRead on badger blockstore; function not supported; ignoring") } diff --git a/blockstore/badger/blockstore_test.go b/blockstore/badger/blockstore_test.go index d8ef5241b..db87262d4 100644 --- a/blockstore/badger/blockstore_test.go +++ b/blockstore/badger/blockstore_test.go @@ -2,6 +2,7 @@ package badgerbs import ( "bytes" + "context" "fmt" "io/ioutil" "os" @@ -98,6 +99,7 @@ func openBlockstore(optsSupplier func(path string) Options) func(tb testing.TB, } func testMove(t *testing.T, optsF func(string) Options) { + ctx := context.TODO() basePath, err := ioutil.TempDir("", "") if err != nil { t.Fatal(err) @@ -122,7 +124,7 @@ func testMove(t *testing.T, optsF func(string) Options) { // add some blocks for i := 0; i < 10; i++ { blk := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) - err := db.Put(blk) + err := db.Put(ctx, blk) if err != nil { t.Fatal(err) } @@ -132,7 +134,7 @@ func testMove(t *testing.T, optsF func(string) Options) { // delete some of them for i := 5; i < 10; i++ { c := have[i].Cid() - err := db.DeleteBlock(c) + err := db.DeleteBlock(ctx, c) if err != nil { t.Fatal(err) } @@ -145,7 +147,7 @@ func testMove(t *testing.T, optsF func(string) Options) { g.Go(func() error { for i := 10; i < 1000; i++ { blk := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) - err := db.Put(blk) + err := db.Put(ctx, blk) if err != nil { return err } @@ -165,7 +167,7 @@ func testMove(t *testing.T, optsF func(string) Options) { // now check that we have all the blocks in have and none in the deleted lists checkBlocks := func() { for _, blk := range have { - has, err := db.Has(blk.Cid()) + has, err := db.Has(ctx, blk.Cid()) if err != nil { t.Fatal(err) } @@ -174,7 +176,7 @@ func testMove(t *testing.T, optsF func(string) Options) { t.Fatal("missing block") } - blk2, err := db.Get(blk.Cid()) + blk2, err := db.Get(ctx, blk.Cid()) if err != nil { t.Fatal(err) } @@ -185,7 +187,7 @@ func testMove(t *testing.T, optsF func(string) Options) { } for _, c := range deleted { - has, err := db.Has(c) + has, err := db.Has(ctx, c) if err != nil { t.Fatal(err) } diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index 93be82ac8..b155f479a 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -44,28 +44,31 @@ func (s *Suite) RunTests(t *testing.T, prefix string) { } func (s *Suite) TestGetWhenKeyNotPresent(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() } c := cid.NewCidV0(u.Hash([]byte("stuff"))) - bl, err := bs.Get(c) + bl, err := bs.Get(ctx, c) require.Nil(t, bl) require.Equal(t, blockstore.ErrNotFound, err) } func (s *Suite) TestGetWhenKeyIsNil(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() } - _, err := bs.Get(cid.Undef) + _, err := bs.Get(ctx, cid.Undef) require.Equal(t, blockstore.ErrNotFound, err) } func (s *Suite) TestPutThenGetBlock(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -73,15 +76,16 @@ func (s *Suite) TestPutThenGetBlock(t *testing.T) { orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) - fetched, err := bs.Get(orig.Cid()) + fetched, err := bs.Get(ctx, orig.Cid()) require.NoError(t, err) require.Equal(t, orig.RawData(), fetched.RawData()) } func (s *Suite) TestHas(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -89,19 +93,20 @@ func (s *Suite) TestHas(t *testing.T) { orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) - ok, err := bs.Has(orig.Cid()) + ok, err := bs.Has(ctx, orig.Cid()) require.NoError(t, err) require.True(t, ok) - ok, err = bs.Has(blocks.NewBlock([]byte("another thing")).Cid()) + ok, err = bs.Has(ctx, blocks.NewBlock([]byte("another thing")).Cid()) require.NoError(t, err) require.False(t, ok) } func (s *Suite) TestCidv0v1(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -109,15 +114,17 @@ func (s *Suite) TestCidv0v1(t *testing.T) { orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) - fetched, err := bs.Get(cid.NewCidV1(cid.DagProtobuf, orig.Cid().Hash())) + fetched, err := bs.Get(ctx, cid.NewCidV1(cid.DagProtobuf, orig.Cid().Hash())) require.NoError(t, err) require.Equal(t, orig.RawData(), fetched.RawData()) } func (s *Suite) TestPutThenGetSizeBlock(t *testing.T) { + ctx := context.TODO() + bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -127,21 +134,21 @@ func (s *Suite) TestPutThenGetSizeBlock(t *testing.T) { missingBlock := blocks.NewBlock([]byte("missingBlock")) emptyBlock := blocks.NewBlock([]byte{}) - err := bs.Put(block) + err := bs.Put(ctx, block) require.NoError(t, err) - blockSize, err := bs.GetSize(block.Cid()) + blockSize, err := bs.GetSize(ctx, block.Cid()) require.NoError(t, err) require.Len(t, block.RawData(), blockSize) - err = bs.Put(emptyBlock) + err = bs.Put(ctx, emptyBlock) require.NoError(t, err) - emptySize, err := bs.GetSize(emptyBlock.Cid()) + emptySize, err := bs.GetSize(ctx, emptyBlock.Cid()) require.NoError(t, err) require.Zero(t, emptySize) - missingSize, err := bs.GetSize(missingBlock.Cid()) + missingSize, err := bs.GetSize(ctx, missingBlock.Cid()) require.Equal(t, blockstore.ErrNotFound, err) require.Equal(t, -1, missingSize) } @@ -203,6 +210,7 @@ func (s *Suite) TestDoubleClose(t *testing.T) { } func (s *Suite) TestReopenPutGet(t *testing.T) { + ctx := context.TODO() bs, path := s.NewBlockstore(t) c, ok := bs.(io.Closer) if !ok { @@ -210,7 +218,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { } orig := blocks.NewBlock([]byte("some data")) - err := bs.Put(orig) + err := bs.Put(ctx, orig) require.NoError(t, err) err = c.Close() @@ -219,7 +227,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { bs, err = s.OpenBlockstore(t, path) require.NoError(t, err) - fetched, err := bs.Get(orig.Cid()) + fetched, err := bs.Get(ctx, orig.Cid()) require.NoError(t, err) require.Equal(t, orig.RawData(), fetched.RawData()) @@ -228,6 +236,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { } func (s *Suite) TestPutMany(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -238,15 +247,15 @@ func (s *Suite) TestPutMany(t *testing.T) { blocks.NewBlock([]byte("foo2")), blocks.NewBlock([]byte("foo3")), } - err := bs.PutMany(blks) + err := bs.PutMany(ctx, blks) require.NoError(t, err) for _, blk := range blks { - fetched, err := bs.Get(blk.Cid()) + fetched, err := bs.Get(ctx, blk.Cid()) require.NoError(t, err) require.Equal(t, blk.RawData(), fetched.RawData()) - ok, err := bs.Has(blk.Cid()) + ok, err := bs.Has(ctx, blk.Cid()) require.NoError(t, err) require.True(t, ok) } @@ -259,6 +268,7 @@ func (s *Suite) TestPutMany(t *testing.T) { } func (s *Suite) TestDelete(t *testing.T) { + ctx := context.TODO() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -269,10 +279,10 @@ func (s *Suite) TestDelete(t *testing.T) { blocks.NewBlock([]byte("foo2")), blocks.NewBlock([]byte("foo3")), } - err := bs.PutMany(blks) + err := bs.PutMany(ctx, blks) require.NoError(t, err) - err = bs.DeleteBlock(blks[1].Cid()) + err = bs.DeleteBlock(ctx, blks[1].Cid()) require.NoError(t, err) ch, err := bs.AllKeysChan(context.Background()) @@ -285,17 +295,17 @@ func (s *Suite) TestDelete(t *testing.T) { cid.NewCidV1(cid.Raw, blks[2].Cid().Hash()), }) - has, err := bs.Has(blks[1].Cid()) + has, err := bs.Has(ctx, blks[1].Cid()) require.NoError(t, err) require.False(t, has) - } func insertBlocks(t *testing.T, bs blockstore.BasicBlockstore, count int) []cid.Cid { + ctx := context.TODO() keys := make([]cid.Cid, count) for i := 0; i < count; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) - err := bs.Put(block) + err := bs.Put(ctx, block) require.NoError(t, err) // NewBlock assigns a CIDv0; we convert it to CIDv1 because that's what // the store returns. diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 8ede31eb9..409c100cf 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -1,6 +1,8 @@ package blockstore import ( + "context" + cid "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" @@ -27,7 +29,7 @@ type BasicBlockstore = blockstore.Blockstore type Viewer = blockstore.Viewer type BatchDeleter interface { - DeleteMany(cids []cid.Cid) error + DeleteMany(ctx context.Context, cids []cid.Cid) error } // BlockstoreIterator is a trait for efficient iteration @@ -93,17 +95,17 @@ type adaptedBlockstore struct { var _ Blockstore = (*adaptedBlockstore)(nil) -func (a *adaptedBlockstore) View(cid cid.Cid, callback func([]byte) error) error { - blk, err := a.Get(cid) +func (a *adaptedBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { + blk, err := a.Get(ctx, cid) if err != nil { return err } return callback(blk.RawData()) } -func (a *adaptedBlockstore) DeleteMany(cids []cid.Cid) error { +func (a *adaptedBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { for _, cid := range cids { - err := a.DeleteBlock(cid) + err := a.DeleteBlock(ctx, cid) if err != nil { return err } diff --git a/blockstore/buffered.go b/blockstore/buffered.go index 5d3d38f78..846156fc8 100644 --- a/blockstore/buffered.go +++ b/blockstore/buffered.go @@ -88,34 +88,34 @@ func (bs *BufferedBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, return out, nil } -func (bs *BufferedBlockstore) DeleteBlock(c cid.Cid) error { - if err := bs.read.DeleteBlock(c); err != nil { +func (bs *BufferedBlockstore) DeleteBlock(ctx context.Context, c cid.Cid) error { + if err := bs.read.DeleteBlock(ctx, c); err != nil { return err } - return bs.write.DeleteBlock(c) + return bs.write.DeleteBlock(ctx, c) } -func (bs *BufferedBlockstore) DeleteMany(cids []cid.Cid) error { - if err := bs.read.DeleteMany(cids); err != nil { +func (bs *BufferedBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { + if err := bs.read.DeleteMany(ctx, cids); err != nil { return err } - return bs.write.DeleteMany(cids) + return bs.write.DeleteMany(ctx, cids) } -func (bs *BufferedBlockstore) View(c cid.Cid, callback func([]byte) error) error { +func (bs *BufferedBlockstore) View(ctx context.Context, c cid.Cid, callback func([]byte) error) error { // both stores are viewable. - if err := bs.write.View(c, callback); err == ErrNotFound { + if err := bs.write.View(ctx, c, callback); err == ErrNotFound { // not found in write blockstore; fall through. } else { return err // propagate errors, or nil, i.e. found. } - return bs.read.View(c, callback) + return bs.read.View(ctx, c, callback) } -func (bs *BufferedBlockstore) Get(c cid.Cid) (block.Block, error) { - if out, err := bs.write.Get(c); err != nil { +func (bs *BufferedBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + if out, err := bs.write.Get(ctx, c); err != nil { if err != ErrNotFound { return nil, err } @@ -123,20 +123,20 @@ func (bs *BufferedBlockstore) Get(c cid.Cid) (block.Block, error) { return out, nil } - return bs.read.Get(c) + return bs.read.Get(ctx, c) } -func (bs *BufferedBlockstore) GetSize(c cid.Cid) (int, error) { - s, err := bs.read.GetSize(c) +func (bs *BufferedBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + s, err := bs.read.GetSize(ctx, c) if err == ErrNotFound || s == 0 { - return bs.write.GetSize(c) + return bs.write.GetSize(ctx, c) } return s, err } -func (bs *BufferedBlockstore) Put(blk block.Block) error { - has, err := bs.read.Has(blk.Cid()) // TODO: consider dropping this check +func (bs *BufferedBlockstore) Put(ctx context.Context, blk block.Block) error { + has, err := bs.read.Has(ctx, blk.Cid()) // TODO: consider dropping this check if err != nil { return err } @@ -145,11 +145,11 @@ func (bs *BufferedBlockstore) Put(blk block.Block) error { return nil } - return bs.write.Put(blk) + return bs.write.Put(ctx, blk) } -func (bs *BufferedBlockstore) Has(c cid.Cid) (bool, error) { - has, err := bs.write.Has(c) +func (bs *BufferedBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + has, err := bs.write.Has(ctx, c) if err != nil { return false, err } @@ -157,16 +157,16 @@ func (bs *BufferedBlockstore) Has(c cid.Cid) (bool, error) { return true, nil } - return bs.read.Has(c) + return bs.read.Has(ctx, c) } -func (bs *BufferedBlockstore) HashOnRead(hor bool) { - bs.read.HashOnRead(hor) - bs.write.HashOnRead(hor) +func (bs *BufferedBlockstore) HashOnRead(ctx context.Context, hor bool) { + bs.read.HashOnRead(ctx, hor) + bs.write.HashOnRead(ctx, hor) } -func (bs *BufferedBlockstore) PutMany(blks []block.Block) error { - return bs.write.PutMany(blks) +func (bs *BufferedBlockstore) PutMany(ctx context.Context, blks []block.Block) error { + return bs.write.PutMany(ctx, blks) } func (bs *BufferedBlockstore) Read() Blockstore { diff --git a/blockstore/discard.go b/blockstore/discard.go index afd0651bc..e377d427b 100644 --- a/blockstore/discard.go +++ b/blockstore/discard.go @@ -18,39 +18,39 @@ func NewDiscardStore(bs Blockstore) Blockstore { return &discardstore{bs: bs} } -func (b *discardstore) Has(cid cid.Cid) (bool, error) { - return b.bs.Has(cid) +func (b *discardstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { + return b.bs.Has(ctx, cid) } -func (b *discardstore) HashOnRead(hor bool) { - b.bs.HashOnRead(hor) +func (b *discardstore) HashOnRead(ctx context.Context, hor bool) { + b.bs.HashOnRead(ctx, hor) } -func (b *discardstore) Get(cid cid.Cid) (blocks.Block, error) { - return b.bs.Get(cid) +func (b *discardstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { + return b.bs.Get(ctx, cid) } -func (b *discardstore) GetSize(cid cid.Cid) (int, error) { - return b.bs.GetSize(cid) +func (b *discardstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { + return b.bs.GetSize(ctx, cid) } -func (b *discardstore) View(cid cid.Cid, f func([]byte) error) error { - return b.bs.View(cid, f) +func (b *discardstore) View(ctx context.Context, cid cid.Cid, f func([]byte) error) error { + return b.bs.View(ctx, cid, f) } -func (b *discardstore) Put(blk blocks.Block) error { +func (b *discardstore) Put(ctx context.Context, blk blocks.Block) error { return nil } -func (b *discardstore) PutMany(blks []blocks.Block) error { +func (b *discardstore) PutMany(ctx context.Context, blks []blocks.Block) error { return nil } -func (b *discardstore) DeleteBlock(cid cid.Cid) error { +func (b *discardstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { return nil } -func (b *discardstore) DeleteMany(cids []cid.Cid) error { +func (b *discardstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { return nil } diff --git a/blockstore/fallback.go b/blockstore/fallback.go index 5f220f941..3d0acd36d 100644 --- a/blockstore/fallback.go +++ b/blockstore/fallback.go @@ -71,14 +71,14 @@ func (fbs *FallbackStore) getFallback(c cid.Cid) (blocks.Block, error) { // chain bitswap puts blocks in temp blockstore which is cleaned up // every few min (to drop any messages we fetched but don't want) // in this case we want to keep this block around - if err := fbs.Put(b); err != nil { + if err := fbs.Put(ctx, b); err != nil { return nil, xerrors.Errorf("persisting fallback-fetched block: %w", err) } return b, nil } -func (fbs *FallbackStore) Get(c cid.Cid) (blocks.Block, error) { - b, err := fbs.Blockstore.Get(c) +func (fbs *FallbackStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { + b, err := fbs.Blockstore.Get(ctx, c) switch err { case nil: return b, nil @@ -89,8 +89,8 @@ func (fbs *FallbackStore) Get(c cid.Cid) (blocks.Block, error) { } } -func (fbs *FallbackStore) GetSize(c cid.Cid) (int, error) { - sz, err := fbs.Blockstore.GetSize(c) +func (fbs *FallbackStore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + sz, err := fbs.Blockstore.GetSize(ctx, c) switch err { case nil: return sz, nil diff --git a/blockstore/idstore.go b/blockstore/idstore.go index e6148ff04..d0553158b 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -38,7 +38,7 @@ func decodeCid(cid cid.Cid) (inline bool, data []byte, err error) { return false, nil, err } -func (b *idstore) Has(cid cid.Cid) (bool, error) { +func (b *idstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { inline, _, err := decodeCid(cid) if err != nil { return false, xerrors.Errorf("error decoding Cid: %w", err) @@ -48,10 +48,10 @@ func (b *idstore) Has(cid cid.Cid) (bool, error) { return true, nil } - return b.bs.Has(cid) + return b.bs.Has(ctx, cid) } -func (b *idstore) Get(cid cid.Cid) (blocks.Block, error) { +func (b *idstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { inline, data, err := decodeCid(cid) if err != nil { return nil, xerrors.Errorf("error decoding Cid: %w", err) @@ -61,10 +61,10 @@ func (b *idstore) Get(cid cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(data, cid) } - return b.bs.Get(cid) + return b.bs.Get(ctx, cid) } -func (b *idstore) GetSize(cid cid.Cid) (int, error) { +func (b *idstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { inline, data, err := decodeCid(cid) if err != nil { return 0, xerrors.Errorf("error decoding Cid: %w", err) @@ -74,10 +74,10 @@ func (b *idstore) GetSize(cid cid.Cid) (int, error) { return len(data), err } - return b.bs.GetSize(cid) + return b.bs.GetSize(ctx, cid) } -func (b *idstore) View(cid cid.Cid, cb func([]byte) error) error { +func (b *idstore) View(ctx context.Context, cid cid.Cid, cb func([]byte) error) error { inline, data, err := decodeCid(cid) if err != nil { return xerrors.Errorf("error decoding Cid: %w", err) @@ -87,10 +87,10 @@ func (b *idstore) View(cid cid.Cid, cb func([]byte) error) error { return cb(data) } - return b.bs.View(cid, cb) + return b.bs.View(ctx, cid, cb) } -func (b *idstore) Put(blk blocks.Block) error { +func (b *idstore) Put(ctx context.Context, blk blocks.Block) error { inline, _, err := decodeCid(blk.Cid()) if err != nil { return xerrors.Errorf("error decoding Cid: %w", err) @@ -100,10 +100,10 @@ func (b *idstore) Put(blk blocks.Block) error { return nil } - return b.bs.Put(blk) + return b.bs.Put(ctx, blk) } -func (b *idstore) PutMany(blks []blocks.Block) error { +func (b *idstore) PutMany(ctx context.Context, blks []blocks.Block) error { toPut := make([]blocks.Block, 0, len(blks)) for _, blk := range blks { inline, _, err := decodeCid(blk.Cid()) @@ -118,13 +118,13 @@ func (b *idstore) PutMany(blks []blocks.Block) error { } if len(toPut) > 0 { - return b.bs.PutMany(toPut) + return b.bs.PutMany(ctx, toPut) } return nil } -func (b *idstore) DeleteBlock(cid cid.Cid) error { +func (b *idstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { inline, _, err := decodeCid(cid) if err != nil { return xerrors.Errorf("error decoding Cid: %w", err) @@ -134,10 +134,10 @@ func (b *idstore) DeleteBlock(cid cid.Cid) error { return nil } - return b.bs.DeleteBlock(cid) + return b.bs.DeleteBlock(ctx, cid) } -func (b *idstore) DeleteMany(cids []cid.Cid) error { +func (b *idstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { toDelete := make([]cid.Cid, 0, len(cids)) for _, cid := range cids { inline, _, err := decodeCid(cid) @@ -152,7 +152,7 @@ func (b *idstore) DeleteMany(cids []cid.Cid) error { } if len(toDelete) > 0 { - return b.bs.DeleteMany(toDelete) + return b.bs.DeleteMany(ctx, toDelete) } return nil @@ -162,8 +162,8 @@ func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.bs.AllKeysChan(ctx) } -func (b *idstore) HashOnRead(enabled bool) { - b.bs.HashOnRead(enabled) +func (b *idstore) HashOnRead(ctx context.Context, enabled bool) { + b.bs.HashOnRead(ctx, enabled) } func (b *idstore) Close() error { diff --git a/blockstore/ipfs.go b/blockstore/ipfs.go index 51b4bd951..47662c651 100644 --- a/blockstore/ipfs.go +++ b/blockstore/ipfs.go @@ -79,12 +79,12 @@ func NewRemoteIPFSBlockstore(ctx context.Context, maddr multiaddr.Multiaddr, onl return Adapt(bs), nil } -func (i *IPFSBlockstore) DeleteBlock(cid cid.Cid) error { +func (i *IPFSBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) error { return xerrors.Errorf("not supported") } -func (i *IPFSBlockstore) Has(cid cid.Cid) (bool, error) { - _, err := i.offlineAPI.Block().Stat(i.ctx, path.IpldPath(cid)) +func (i *IPFSBlockstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { + _, err := i.offlineAPI.Block().Stat(ctx, path.IpldPath(cid)) if err != nil { // The underlying client is running in Offline mode. // Stat() will fail with an err if the block isn't in the @@ -99,8 +99,8 @@ func (i *IPFSBlockstore) Has(cid cid.Cid) (bool, error) { return true, nil } -func (i *IPFSBlockstore) Get(cid cid.Cid) (blocks.Block, error) { - rd, err := i.api.Block().Get(i.ctx, path.IpldPath(cid)) +func (i *IPFSBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { + rd, err := i.api.Block().Get(ctx, path.IpldPath(cid)) if err != nil { return nil, xerrors.Errorf("getting ipfs block: %w", err) } @@ -113,8 +113,8 @@ func (i *IPFSBlockstore) Get(cid cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(data, cid) } -func (i *IPFSBlockstore) GetSize(cid cid.Cid) (int, error) { - st, err := i.api.Block().Stat(i.ctx, path.IpldPath(cid)) +func (i *IPFSBlockstore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { + st, err := i.api.Block().Stat(ctx, path.IpldPath(cid)) if err != nil { return 0, xerrors.Errorf("getting ipfs block: %w", err) } @@ -122,23 +122,23 @@ func (i *IPFSBlockstore) GetSize(cid cid.Cid) (int, error) { return st.Size(), nil } -func (i *IPFSBlockstore) Put(block blocks.Block) error { +func (i *IPFSBlockstore) Put(ctx context.Context, block blocks.Block) error { mhd, err := multihash.Decode(block.Cid().Hash()) if err != nil { return err } - _, err = i.api.Block().Put(i.ctx, bytes.NewReader(block.RawData()), + _, err = i.api.Block().Put(ctx, bytes.NewReader(block.RawData()), options.Block.Hash(mhd.Code, mhd.Length), options.Block.Format(cid.CodecToStr[block.Cid().Type()])) return err } -func (i *IPFSBlockstore) PutMany(blocks []blocks.Block) error { +func (i *IPFSBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { // TODO: could be done in parallel for _, block := range blocks { - if err := i.Put(block); err != nil { + if err := i.Put(ctx, block); err != nil { return err } } @@ -150,6 +150,6 @@ func (i *IPFSBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return nil, xerrors.Errorf("not supported") } -func (i *IPFSBlockstore) HashOnRead(enabled bool) { +func (i *IPFSBlockstore) HashOnRead(ctx context.Context, enabled bool) { return // TODO: We could technically support this, but.. } diff --git a/blockstore/mem.go b/blockstore/mem.go index 8ea69d46a..a2655148f 100644 --- a/blockstore/mem.go +++ b/blockstore/mem.go @@ -15,24 +15,24 @@ func NewMemory() MemBlockstore { // MemBlockstore is a terminal blockstore that keeps blocks in memory. type MemBlockstore map[cid.Cid]blocks.Block -func (m MemBlockstore) DeleteBlock(k cid.Cid) error { +func (m MemBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { delete(m, k) return nil } -func (m MemBlockstore) DeleteMany(ks []cid.Cid) error { +func (m MemBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error { for _, k := range ks { delete(m, k) } return nil } -func (m MemBlockstore) Has(k cid.Cid) (bool, error) { +func (m MemBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { _, ok := m[k] return ok, nil } -func (m MemBlockstore) View(k cid.Cid, callback func([]byte) error) error { +func (m MemBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { b, ok := m[k] if !ok { return ErrNotFound @@ -40,7 +40,7 @@ func (m MemBlockstore) View(k cid.Cid, callback func([]byte) error) error { return callback(b.RawData()) } -func (m MemBlockstore) Get(k cid.Cid) (blocks.Block, error) { +func (m MemBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { b, ok := m[k] if !ok { return nil, ErrNotFound @@ -49,7 +49,7 @@ func (m MemBlockstore) Get(k cid.Cid) (blocks.Block, error) { } // GetSize returns the CIDs mapped BlockSize -func (m MemBlockstore) GetSize(k cid.Cid) (int, error) { +func (m MemBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { b, ok := m[k] if !ok { return 0, ErrNotFound @@ -58,7 +58,7 @@ func (m MemBlockstore) GetSize(k cid.Cid) (int, error) { } // Put puts a given block to the underlying datastore -func (m MemBlockstore) Put(b blocks.Block) error { +func (m MemBlockstore) Put(ctx context.Context, b blocks.Block) error { // Convert to a basic block for safety, but try to reuse the existing // block if it's already a basic block. k := b.Cid() @@ -76,9 +76,9 @@ func (m MemBlockstore) Put(b blocks.Block) error { // PutMany puts a slice of blocks at the same time using batching // capabilities of the underlying datastore whenever possible. -func (m MemBlockstore) PutMany(bs []blocks.Block) error { +func (m MemBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error { for _, b := range bs { - _ = m.Put(b) // can't fail + _ = m.Put(ctx, b) // can't fail } return nil } @@ -97,6 +97,6 @@ func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. -func (m MemBlockstore) HashOnRead(enabled bool) { +func (m MemBlockstore) HashOnRead(ctx context.Context, enabled bool) { // no-op } diff --git a/blockstore/sync.go b/blockstore/sync.go index 848ccd19d..11a92359d 100644 --- a/blockstore/sync.go +++ b/blockstore/sync.go @@ -20,53 +20,53 @@ type SyncBlockstore struct { bs MemBlockstore // specifically use a memStore to save indirection overhead. } -func (m *SyncBlockstore) DeleteBlock(k cid.Cid) error { +func (m *SyncBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.DeleteBlock(k) + return m.bs.DeleteBlock(ctx, k) } -func (m *SyncBlockstore) DeleteMany(ks []cid.Cid) error { +func (m *SyncBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.DeleteMany(ks) + return m.bs.DeleteMany(ctx, ks) } -func (m *SyncBlockstore) Has(k cid.Cid) (bool, error) { +func (m *SyncBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.Has(k) + return m.bs.Has(ctx, k) } -func (m *SyncBlockstore) View(k cid.Cid, callback func([]byte) error) error { +func (m *SyncBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.View(k, callback) + return m.bs.View(ctx, k, callback) } -func (m *SyncBlockstore) Get(k cid.Cid) (blocks.Block, error) { +func (m *SyncBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.Get(k) + return m.bs.Get(ctx, k) } -func (m *SyncBlockstore) GetSize(k cid.Cid) (int, error) { +func (m *SyncBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { m.mu.RLock() defer m.mu.RUnlock() - return m.bs.GetSize(k) + return m.bs.GetSize(ctx, k) } -func (m *SyncBlockstore) Put(b blocks.Block) error { +func (m *SyncBlockstore) Put(ctx context.Context, b blocks.Block) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.Put(b) + return m.bs.Put(ctx, b) } -func (m *SyncBlockstore) PutMany(bs []blocks.Block) error { +func (m *SyncBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error { m.mu.Lock() defer m.mu.Unlock() - return m.bs.PutMany(bs) + return m.bs.PutMany(ctx, bs) } func (m *SyncBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { @@ -76,6 +76,6 @@ func (m *SyncBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return m.bs.AllKeysChan(ctx) } -func (m *SyncBlockstore) HashOnRead(enabled bool) { +func (m *SyncBlockstore) HashOnRead(ctx context.Context, enabled bool) { // noop } diff --git a/blockstore/timed.go b/blockstore/timed.go index b279943b6..4fee6b6dd 100644 --- a/blockstore/timed.go +++ b/blockstore/timed.go @@ -92,28 +92,28 @@ func (t *TimedCacheBlockstore) rotate() { t.mu.Unlock() } -func (t *TimedCacheBlockstore) Put(b blocks.Block) error { +func (t *TimedCacheBlockstore) Put(ctx context.Context, b blocks.Block) error { // Don't check the inactive set here. We want to keep this block for at // least one interval. t.mu.Lock() defer t.mu.Unlock() - return t.active.Put(b) + return t.active.Put(ctx, b) } -func (t *TimedCacheBlockstore) PutMany(bs []blocks.Block) error { +func (t *TimedCacheBlockstore) PutMany(ctx context.Context, bs []blocks.Block) error { t.mu.Lock() defer t.mu.Unlock() - return t.active.PutMany(bs) + return t.active.PutMany(ctx, bs) } -func (t *TimedCacheBlockstore) View(k cid.Cid, callback func([]byte) error) error { +func (t *TimedCacheBlockstore) View(ctx context.Context, k cid.Cid, callback func([]byte) error) error { // The underlying blockstore is always a "mem" blockstore so there's no difference, // from a performance perspective, between view & get. So we call Get to avoid // calling an arbitrary callback while holding a lock. t.mu.RLock() - block, err := t.active.Get(k) + block, err := t.active.Get(ctx, k) if err == ErrNotFound { - block, err = t.inactive.Get(k) + block, err = t.inactive.Get(ctx, k) } t.mu.RUnlock() @@ -123,51 +123,51 @@ func (t *TimedCacheBlockstore) View(k cid.Cid, callback func([]byte) error) erro return callback(block.RawData()) } -func (t *TimedCacheBlockstore) Get(k cid.Cid) (blocks.Block, error) { +func (t *TimedCacheBlockstore) Get(ctx context.Context, k cid.Cid) (blocks.Block, error) { t.mu.RLock() defer t.mu.RUnlock() - b, err := t.active.Get(k) + b, err := t.active.Get(ctx, k) if err == ErrNotFound { - b, err = t.inactive.Get(k) + b, err = t.inactive.Get(ctx, k) } return b, err } -func (t *TimedCacheBlockstore) GetSize(k cid.Cid) (int, error) { +func (t *TimedCacheBlockstore) GetSize(ctx context.Context, k cid.Cid) (int, error) { t.mu.RLock() defer t.mu.RUnlock() - size, err := t.active.GetSize(k) + size, err := t.active.GetSize(ctx, k) if err == ErrNotFound { - size, err = t.inactive.GetSize(k) + size, err = t.inactive.GetSize(ctx, k) } return size, err } -func (t *TimedCacheBlockstore) Has(k cid.Cid) (bool, error) { +func (t *TimedCacheBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) { t.mu.RLock() defer t.mu.RUnlock() - if has, err := t.active.Has(k); err != nil { + if has, err := t.active.Has(ctx, k); err != nil { return false, err } else if has { return true, nil } - return t.inactive.Has(k) + return t.inactive.Has(ctx, k) } -func (t *TimedCacheBlockstore) HashOnRead(_ bool) { +func (t *TimedCacheBlockstore) HashOnRead(ctx context.Context, _ bool) { // no-op } -func (t *TimedCacheBlockstore) DeleteBlock(k cid.Cid) error { +func (t *TimedCacheBlockstore) DeleteBlock(ctx context.Context, k cid.Cid) error { t.mu.Lock() defer t.mu.Unlock() - return multierr.Combine(t.active.DeleteBlock(k), t.inactive.DeleteBlock(k)) + return multierr.Combine(t.active.DeleteBlock(ctx, k), t.inactive.DeleteBlock(ctx, k)) } -func (t *TimedCacheBlockstore) DeleteMany(ks []cid.Cid) error { +func (t *TimedCacheBlockstore) DeleteMany(ctx context.Context, ks []cid.Cid) error { t.mu.Lock() defer t.mu.Unlock() - return multierr.Combine(t.active.DeleteMany(ks), t.inactive.DeleteMany(ks)) + return multierr.Combine(t.active.DeleteMany(ctx, ks), t.inactive.DeleteMany(ctx, ks)) } func (t *TimedCacheBlockstore) AllKeysChan(_ context.Context) (<-chan cid.Cid, error) { diff --git a/blockstore/timed_test.go b/blockstore/timed_test.go index d5fefff94..16795f047 100644 --- a/blockstore/timed_test.go +++ b/blockstore/timed_test.go @@ -19,6 +19,8 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { tc.clock = mClock tc.doneRotatingCh = make(chan struct{}) + ctx := context.Background() + _ = tc.Start(context.Background()) mClock.Add(1) // IDK why it is needed but it makes it work @@ -27,18 +29,18 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { }() b1 := blocks.NewBlock([]byte("foo")) - require.NoError(t, tc.Put(b1)) + require.NoError(t, tc.Put(ctx, b1)) b2 := blocks.NewBlock([]byte("bar")) - require.NoError(t, tc.Put(b2)) + require.NoError(t, tc.Put(ctx, b2)) b3 := blocks.NewBlock([]byte("baz")) - b1out, err := tc.Get(b1.Cid()) + b1out, err := tc.Get(ctx, b1.Cid()) require.NoError(t, err) require.Equal(t, b1.RawData(), b1out.RawData()) - has, err := tc.Has(b1.Cid()) + has, err := tc.Has(ctx, b1.Cid()) require.NoError(t, err) require.True(t, has) @@ -46,17 +48,17 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { <-tc.doneRotatingCh // We should still have everything. - has, err = tc.Has(b1.Cid()) + has, err = tc.Has(ctx, b1.Cid()) require.NoError(t, err) require.True(t, has) - has, err = tc.Has(b2.Cid()) + has, err = tc.Has(ctx, b2.Cid()) require.NoError(t, err) require.True(t, has) // extend b2, add b3. - require.NoError(t, tc.Put(b2)) - require.NoError(t, tc.Put(b3)) + require.NoError(t, tc.Put(ctx, b2)) + require.NoError(t, tc.Put(ctx, b3)) // all keys once. allKeys, err := tc.AllKeysChan(context.Background()) @@ -71,15 +73,15 @@ func TestTimedCacheBlockstoreSimple(t *testing.T) { <-tc.doneRotatingCh // should still have b2, and b3, but not b1 - has, err = tc.Has(b1.Cid()) + has, err = tc.Has(ctx, b1.Cid()) require.NoError(t, err) require.False(t, has) - has, err = tc.Has(b2.Cid()) + has, err = tc.Has(ctx, b2.Cid()) require.NoError(t, err) require.True(t, has) - has, err = tc.Has(b3.Cid()) + has, err = tc.Has(ctx, b3.Cid()) require.NoError(t, err) require.True(t, has) } diff --git a/blockstore/union.go b/blockstore/union.go index a99ba2591..e115458c2 100644 --- a/blockstore/union.go +++ b/blockstore/union.go @@ -19,72 +19,72 @@ func Union(stores ...Blockstore) Blockstore { return unionBlockstore(stores) } -func (m unionBlockstore) Has(cid cid.Cid) (has bool, err error) { +func (m unionBlockstore) Has(ctx context.Context, cid cid.Cid) (has bool, err error) { for _, bs := range m { - if has, err = bs.Has(cid); has || err != nil { + if has, err = bs.Has(ctx, cid); has || err != nil { break } } return has, err } -func (m unionBlockstore) Get(cid cid.Cid) (blk blocks.Block, err error) { +func (m unionBlockstore) Get(ctx context.Context, cid cid.Cid) (blk blocks.Block, err error) { for _, bs := range m { - if blk, err = bs.Get(cid); err == nil || err != ErrNotFound { + if blk, err = bs.Get(ctx, cid); err == nil || err != ErrNotFound { break } } return blk, err } -func (m unionBlockstore) View(cid cid.Cid, callback func([]byte) error) (err error) { +func (m unionBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) (err error) { for _, bs := range m { - if err = bs.View(cid, callback); err == nil || err != ErrNotFound { + if err = bs.View(ctx, cid, callback); err == nil || err != ErrNotFound { break } } return err } -func (m unionBlockstore) GetSize(cid cid.Cid) (size int, err error) { +func (m unionBlockstore) GetSize(ctx context.Context, cid cid.Cid) (size int, err error) { for _, bs := range m { - if size, err = bs.GetSize(cid); err == nil || err != ErrNotFound { + if size, err = bs.GetSize(ctx, cid); err == nil || err != ErrNotFound { break } } return size, err } -func (m unionBlockstore) Put(block blocks.Block) (err error) { +func (m unionBlockstore) Put(ctx context.Context, block blocks.Block) (err error) { for _, bs := range m { - if err = bs.Put(block); err != nil { + if err = bs.Put(ctx, block); err != nil { break } } return err } -func (m unionBlockstore) PutMany(blks []blocks.Block) (err error) { +func (m unionBlockstore) PutMany(ctx context.Context, blks []blocks.Block) (err error) { for _, bs := range m { - if err = bs.PutMany(blks); err != nil { + if err = bs.PutMany(ctx, blks); err != nil { break } } return err } -func (m unionBlockstore) DeleteBlock(cid cid.Cid) (err error) { +func (m unionBlockstore) DeleteBlock(ctx context.Context, cid cid.Cid) (err error) { for _, bs := range m { - if err = bs.DeleteBlock(cid); err != nil { + if err = bs.DeleteBlock(ctx, cid); err != nil { break } } return err } -func (m unionBlockstore) DeleteMany(cids []cid.Cid) (err error) { +func (m unionBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) (err error) { for _, bs := range m { - if err = bs.DeleteMany(cids); err != nil { + if err = bs.DeleteMany(ctx, cids); err != nil { break } } @@ -112,8 +112,8 @@ func (m unionBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return outCh, nil } -func (m unionBlockstore) HashOnRead(enabled bool) { +func (m unionBlockstore) HashOnRead(ctx context.Context, enabled bool) { for _, bs := range m { - bs.HashOnRead(enabled) + bs.HashOnRead(ctx, enabled) } } diff --git a/blockstore/union_test.go b/blockstore/union_test.go index b62026892..3ae8c1d49 100644 --- a/blockstore/union_test.go +++ b/blockstore/union_test.go @@ -15,79 +15,81 @@ var ( ) func TestUnionBlockstore_Get(t *testing.T) { + ctx := context.Background() m1 := NewMemory() m2 := NewMemory() - _ = m1.Put(b1) - _ = m2.Put(b2) + _ = m1.Put(ctx, b1) + _ = m2.Put(ctx, b2) u := Union(m1, m2) - v1, err := u.Get(b1.Cid()) + v1, err := u.Get(ctx, b1.Cid()) require.NoError(t, err) require.Equal(t, b1.RawData(), v1.RawData()) - v2, err := u.Get(b2.Cid()) + v2, err := u.Get(ctx, b2.Cid()) require.NoError(t, err) require.Equal(t, b2.RawData(), v2.RawData()) } func TestUnionBlockstore_Put_PutMany_Delete_AllKeysChan(t *testing.T) { + ctx := context.Background() m1 := NewMemory() m2 := NewMemory() u := Union(m1, m2) - err := u.Put(b0) + err := u.Put(ctx, b0) require.NoError(t, err) var has bool // write was broadcasted to all stores. - has, _ = m1.Has(b0.Cid()) + has, _ = m1.Has(ctx, b0.Cid()) require.True(t, has) - has, _ = m2.Has(b0.Cid()) + has, _ = m2.Has(ctx, b0.Cid()) require.True(t, has) - has, _ = u.Has(b0.Cid()) + has, _ = u.Has(ctx, b0.Cid()) require.True(t, has) // put many. - err = u.PutMany([]blocks.Block{b1, b2}) + err = u.PutMany(ctx, []blocks.Block{b1, b2}) require.NoError(t, err) // write was broadcasted to all stores. - has, _ = m1.Has(b1.Cid()) + has, _ = m1.Has(ctx, b1.Cid()) require.True(t, has) - has, _ = m1.Has(b2.Cid()) + has, _ = m1.Has(ctx, b2.Cid()) require.True(t, has) - has, _ = m2.Has(b1.Cid()) + has, _ = m2.Has(ctx, b1.Cid()) require.True(t, has) - has, _ = m2.Has(b2.Cid()) + has, _ = m2.Has(ctx, b2.Cid()) require.True(t, has) // also in the union store. - has, _ = u.Has(b1.Cid()) + has, _ = u.Has(ctx, b1.Cid()) require.True(t, has) - has, _ = u.Has(b2.Cid()) + has, _ = u.Has(ctx, b2.Cid()) require.True(t, has) // deleted from all stores. - err = u.DeleteBlock(b1.Cid()) + err = u.DeleteBlock(ctx, b1.Cid()) require.NoError(t, err) - has, _ = u.Has(b1.Cid()) + has, _ = u.Has(ctx, b1.Cid()) require.False(t, has) - has, _ = m1.Has(b1.Cid()) + has, _ = m1.Has(ctx, b1.Cid()) require.False(t, has) - has, _ = m2.Has(b1.Cid()) + has, _ = m2.Has(ctx, b1.Cid()) require.False(t, has) // check that AllKeysChan returns b0 and b2, twice (once per backing store) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 791238933..a7b3c2e69 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 7912389334e347bbb2eac0520c836830875c39de +Subproject commit a7b3c2e695393fd716e9265ff8cba932a3e38dd4 diff --git a/go.mod b/go.mod index a9b0bee9d..af9864d1b 100644 --- a/go.mod +++ b/go.mod @@ -11,13 +11,14 @@ require ( github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 + github.com/bep/debounce v1.2.0 // indirect github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 github.com/coreos/go-systemd/v22 v22.3.2 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e - github.com/dgraph-io/badger/v2 v2.2007.2 + github.com/dgraph-io/badger/v2 v2.2007.3 github.com/docker/go-units v0.4.0 github.com/drand/drand v1.2.1 github.com/drand/kyber v1.1.4 @@ -26,14 +27,13 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.3 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 - github.com/filecoin-project/go-commp-utils v0.1.2 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.4 + github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d + github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.13.4 @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 - github.com/filecoin-project/go-statestore v0.1.1 + github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 @@ -66,32 +66,33 @@ require ( github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/go-bitswap v0.3.4 + github.com/ipfs/go-bitswap v0.5.1 github.com/ipfs/go-block-format v0.0.3 - github.com/ipfs/go-blockservice v0.1.7 + github.com/ipfs/go-blockservice v0.2.1 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 - github.com/ipfs/go-datastore v0.4.6 - github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e - github.com/ipfs/go-ds-leveldb v0.4.2 + github.com/ipfs/go-datastore v0.5.0 + github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 + github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 + github.com/ipfs/go-filestore v0.0.3 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.10.6 - github.com/ipfs/go-ipfs-blockstore v1.0.4 + github.com/ipfs/go-ipfs-blockstore v1.1.0 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 - github.com/ipfs/go-ipfs-ds-help v1.0.0 - github.com/ipfs/go-ipfs-exchange-interface v0.0.1 - github.com/ipfs/go-ipfs-exchange-offline v0.0.1 + github.com/ipfs/go-ipfs-ds-help v1.1.0 + github.com/ipfs/go-ipfs-exchange-interface v0.1.0 + github.com/ipfs/go-ipfs-exchange-offline v0.1.1 github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipfs-http-client v0.0.6 - github.com/ipfs/go-ipfs-routing v0.1.0 + github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.4.1 + github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-path v0.0.7 @@ -111,7 +112,7 @@ require ( github.com/libp2p/go-libp2p-discovery v0.5.1 github.com/libp2p/go-libp2p-kad-dht v0.13.0 github.com/libp2p/go-libp2p-noise v0.2.2 - github.com/libp2p/go-libp2p-peerstore v0.3.0 + github.com/libp2p/go-libp2p-peerstore v0.4.0 github.com/libp2p/go-libp2p-pubsub v0.5.6 github.com/libp2p/go-libp2p-quic-transport v0.11.2 github.com/libp2p/go-libp2p-record v0.1.3 @@ -131,6 +132,7 @@ require ( github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 + github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 @@ -141,6 +143,7 @@ require ( github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba + github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 @@ -155,6 +158,7 @@ require ( go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 + golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 // indirect golang.org/x/net v0.0.0-20210917221730-978cfadd31cf golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 diff --git a/go.sum b/go.sum index 241b98887..469b791cc 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,10 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= +contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= +contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -54,6 +58,7 @@ github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= @@ -75,6 +80,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= @@ -133,6 +139,7 @@ github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= @@ -208,6 +215,7 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -243,9 +251,10 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/badger/v2 v2.0.1-rc1.0.20200120142413-c3333a5a830e/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= @@ -273,6 +282,7 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= @@ -301,18 +311,28 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= +github.com/filecoin-project/chain-validation v0.0.3/go.mod h1:NCEGFjcWRjb8akWFSOXvU6n2efkWIqAeOKU6o5WBGQw= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/go-address v0.0.0-20191219011437-af739c490b4f/go.mod h1:rCbpXPva2NKF9/J4X6sr7hbKBgQCxyFtRj7KOZqoIms= +github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= +github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= +github.com/filecoin-project/go-amt-ipld v0.0.0-20191205011053-79efc22d6cdc/go.mod h1:KsFPWjF+UUYl6n9A+qbg4bjFgAOneicFZtDH/LQEX2U= +github.com/filecoin-project/go-amt-ipld/v2 v2.0.0/go.mod h1:PAZ5tvSfMfWE327osqFXKm7cBpCpBk2Nh0qKsJUmjjk= +github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= +github.com/filecoin-project/go-bitfield v0.0.0-20200309034705-8c7ac40bd550/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= +github.com/filecoin-project/go-bitfield v0.0.0-20200416002808-b3ee67ec9060/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -326,17 +346,26 @@ github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce/go.mod h1:b14UWxhxVCAjrQUYvVGrQRRsjAh79wXYejw9RbUcAww= +github.com/filecoin-project/go-data-transfer v0.2.1/go.mod h1:+0weLKevhT3EKyan4QzUSMlQOPgLNgT2j0CfEA1NLqI= +github.com/filecoin-project/go-data-transfer v0.5.3/go.mod h1:30ROzlBS8tbTkszmW9a6/N4oD5bIh6QRBCXC6lORuI8= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d h1:otSEh99T0inzVe6pblKBG5tSeSqbQq4BCi5GKoh1J7I= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d/go.mod h1:Qj+yDFsualZ4c7Ndh5Cl1SJK46QeVzNMdRnfAJdDuhw= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211119000042-d0cf38743fe7/go.mod h1:BVGOwN2WSCRKV3CDLFJ9u0L9M17WxHqw1KLA0l5ATnk= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-fil-commcid v0.0.0-20200208005934-2b8bd03caca5/go.mod h1:JbkIgFF/Z9BDlvrJO1FuKkaWsH673/UdFaiVS6uIHlA= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= +github.com/filecoin-project/go-fil-markets v0.0.0-20200114015428-74d100f305f8/go.mod h1:c8NTjvFVy1Ud02mmGDjOiMeawY2t6ALfrrdvAB01FQc= +github.com/filecoin-project/go-fil-markets v0.1.3 h1:RSPSNJbrJ1limTXtlWEDKEgZVcFmbPCV48hM1Cm6F7U= +github.com/filecoin-project/go-fil-markets v0.1.3/go.mod h1:ByBBn4/X216eAmbYb/Pg1sKjfc5W6iIJXrArqznJ1Z8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= @@ -350,12 +379,17 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= +github.com/filecoin-project/go-padreader v0.0.0-20200210211231-548257017ca6/go.mod h1:0HgYnrkeSU4lu1p+LEOeDpFsNBssa0OGGriWdA4hvaE= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878/go.mod h1:40kI2Gv16mwcRsHptI3OAV4nlOEU7wVDc4RgMylNFjU= +github.com/filecoin-project/go-paramfetch v0.0.1/go.mod h1:fZzmf4tftbwf9S37XRifoJlz7nCjRdIrMGLR07dKLCc= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-sectorbuilder v0.0.1/go.mod h1:3OZ4E3B2OuwhJjtxR4r7hPU9bCfB+A+hm4alLEsaeDc= +github.com/filecoin-project/go-sectorbuilder v0.0.2-0.20200203173614-42d67726bb62/go.mod h1:jNGVCDihkMFnraYVLH1xl4ceZQVxx/u4dOORrTKeRi0= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -365,14 +399,22 @@ github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/ github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-statemachine v0.0.0-20200226041606-2074af6d51d9/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= +github.com/filecoin-project/go-statemachine v0.0.0-20200714194326-a77c3ae20989/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= +github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 h1:xH09S8C+VhZCTmTkdudGm/cN5a8teKE+PXXvbPsXTO0= +github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/lotus v0.2.10/go.mod h1:om5PQA9ZT0lf16qI7Fz/ZGLn4LDCMqPC8ntZA9uncRE= +github.com/filecoin-project/sector-storage v0.0.0-20200411000242-61616264b16d/go.mod h1:/yueJueMh0Yc+0G1adS0lhnedcSnjY86EjKsA20+DVY= +github.com/filecoin-project/specs-actors v0.0.0-20200210130641-2d1fbd8672cf/go.mod h1:xtDZUB6pe4Pksa/bAJbJ693OilaC5Wbot9jMhLm3cZA= +github.com/filecoin-project/specs-actors v0.0.0-20200409043918-e569f4a2f504/go.mod h1:mdJraXq5vMy0+/FqVQIrnNlpQ/Em6zeu06G/ltQ0/lA= +github.com/filecoin-project/specs-actors v0.3.0/go.mod h1:nQYnFbQ7Y0bHZyq6HDEuVlCPR+U3z5Q3wMOQ+2aiV+Y= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -393,6 +435,7 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNP github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-storage v0.0.0-20200410185809-9fbaaa08f275/go.mod h1:xJ1/xl9+8zZeSSSFmDC3Wr6uusCTxyYPI0VeNVSFmPE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -412,6 +455,7 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -442,6 +486,7 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -599,8 +644,11 @@ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= +github.com/hannahhoward/cbor-gen-for v0.0.0-20191216214420-3e450425c40c/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= +github.com/hannahhoward/cbor-gen-for v0.0.0-20191218204337-9ab7b1bcc099/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= @@ -649,6 +697,7 @@ github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -663,6 +712,7 @@ github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1C github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -672,20 +722,25 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= +github.com/ipfs/go-blockservice v0.1.3-0.20190908200855-f22eea50656c/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= +github.com/ipfs/go-car v0.0.3-0.20191203022317-23b0a85fd1b1/go.mod h1:rmd887mJxQRDfndfDEY3Liyx8gQVyfFFRSHdsnDSAlk= +github.com/ipfs/go-car v0.0.3-0.20200121013634-f188c0e24291/go.mod h1:AG6sBpd2PWMccpAG7XLFBBQ/4rfBEtzUNeO2GSMesYk= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -711,8 +766,10 @@ github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -721,91 +778,85 @@ github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9 github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-badger2 v0.0.0-20200123200730-d75eb2678a5d/go.mod h1:sTQFaWUoW0OvhXzfHnQ9j39L6fdlqDkptDYcpC1XrYE= github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 h1:/8az/zYn1icEwiHAmpR11Io+8hrlICU10J+Ft0zSiog= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= +github.com/ipfs/go-filestore v0.0.2/go.mod h1:KnZ41qJsCt2OX2mxZS0xsK3Psr0/oB93HMMssLujjVc= +github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-fs-lock v0.0.1/go.mod h1:DNBekbboPKcxs1aukPSaOtFA3QfSdi5C855v0i9XJ8Y= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= +github.com/ipfs/go-graphsync v0.0.4/go.mod h1:6UACBjfOXEa8rQL3Q/JpZpWS0nZDCLx134WUkjrmFpQ= +github.com/ipfs/go-graphsync v0.0.6-0.20200504202014-9d5f2c26a103/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.6 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= +github.com/ipfs/go-graphsync v0.10.6-0.20211119000532-c416dad3bd56/go.mod h1:/wC15/mR2JyjVrO86tfZLLuhyvop0fLU+ewhYLkdgLM= github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +github.com/ipfs/go-hamt-ipld v0.0.14-0.20191218031521-b2c774a54db1/go.mod h1:8yRx0xLUps1Xq8ZDnIwIVdQRp7JjA55gGvCiRHT91Vk= +github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= +github.com/ipfs/go-ipfs-blockstore v0.1.1/go.mod h1:8gZOgIN5e+Xdg2YSGdwTTRbguSVjYyosIDRQCY8E9QM= github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= -github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= +github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= -github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= +github.com/ipfs/go-ipfs-files v0.0.7/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= -github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= +github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= -github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= -github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -813,7 +864,6 @@ github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMR github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= @@ -821,42 +871,32 @@ github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBW github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= -github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= +github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= -github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= -github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= -github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= -github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= @@ -868,59 +908,42 @@ github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXg github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= -github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= +github.com/ipld/go-ipld-prime v0.0.1/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= +github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= @@ -936,18 +959,15 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= -github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= -github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA= github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -956,57 +976,49 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= +github.com/libp2p/go-eventbus v0.0.3/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= +github.com/libp2p/go-libp2p v0.2.1/go.mod h1:HZbtEOrgZN4F1fGZVvkV+930Wx3DkqlpBlO8dIoZWds= +github.com/libp2p/go-libp2p v0.3.0/go.mod h1:J7DPB1+zB5VLc8v/kKSD8+u2cbyIGI0Dh/Pf3Wprt+0= github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= +github.com/libp2p/go-libp2p v0.4.2/go.mod h1:MNmgUxUw5pMsdOzMlT0EE7oKjRasl+WyVwM0IBlpKgQ= github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= @@ -1014,13 +1026,10 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= +github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1030,7 +1039,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRk github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= @@ -1038,7 +1046,6 @@ github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMz github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= @@ -1047,18 +1054,17 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= +github.com/libp2p/go-libp2p-connmgr v0.1.0/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= +github.com/libp2p/go-libp2p-core v0.0.9/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A= @@ -1083,7 +1089,6 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= @@ -1095,7 +1100,6 @@ github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfx github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= @@ -1103,15 +1107,14 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= +github.com/libp2p/go-libp2p-kad-dht v0.1.1/go.mod h1:1kj2Rk5pX3/0RwqMm9AMNCT7DzcMHYhgDN5VTi+cY0M= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +github.com/libp2p/go-libp2p-kbucket v0.2.0/go.mod h1:JNymBToym3QXKBMKGy3m29+xprg0EVr/GJFHxFEdgh8= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= -github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= -github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= @@ -1120,20 +1123,16 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= -github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= @@ -1141,6 +1140,7 @@ github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMg github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-peerstore v0.1.2/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= @@ -1151,48 +1151,44 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= -github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= -github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= +github.com/libp2p/go-libp2p-pubsub v0.2.6/go.mod h1:5jEp7R3ItQ0pgcEMrPZYE9DQTg/H3CTc7Mu1j2G4Y5o= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= -github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= -github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= -github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= +github.com/libp2p/go-libp2p-routing-helpers v0.1.0/go.mod h1:oUs0h39vNwYtYXnQWOTU5BaafbedSyWCCal3gqHuoOQ= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-secio v0.1.1/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-swarm v0.1.1/go.mod h1:4NVJaLwq/dr5kEq79Jo6pMin7ZFwLx73ln1FTefR91Q= +github.com/libp2p/go-libp2p-swarm v0.2.0/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1203,12 +1199,12 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-tls v0.1.0/go.mod h1:VZdoSWQDeNpIIAFJFv+6uqTqpnIIDHcqZQSTC/A1TT0= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= +github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= @@ -1217,7 +1213,6 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -1231,13 +1226,10 @@ github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2Ez github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= -github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= @@ -1245,54 +1237,45 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.3.0 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= @@ -1303,7 +1286,6 @@ github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzl github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= -github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1314,26 +1296,19 @@ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= -github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1341,22 +1316,15 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1364,24 +1332,21 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1397,15 +1362,10 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= @@ -1414,12 +1374,10 @@ github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+ github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -1436,12 +1394,9 @@ github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= -github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1455,17 +1410,14 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= @@ -1477,7 +1429,6 @@ github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= @@ -1487,13 +1438,13 @@ github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:Zr github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multihash v0.0.6/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1501,12 +1452,10 @@ github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wS github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1527,12 +1476,10 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= -github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -1540,38 +1487,31 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 h1:CznVS40zms0Dj5he4ERo+fRPtO0qxUk8lA8Xu3ddet0= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= -github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= -github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= @@ -1579,6 +1519,9 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -1586,22 +1529,18 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= -github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= @@ -1618,14 +1557,12 @@ github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83A github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1639,7 +1576,6 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1655,39 +1591,28 @@ github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= -github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= -github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= @@ -1709,7 +1634,6 @@ github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= @@ -1718,16 +1642,14 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1736,10 +1658,8 @@ github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFC github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1755,7 +1675,6 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= @@ -1765,63 +1684,50 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= -github.com/tidwall/gjson v1.6.0 h1:9VEQWz6LLMUsUl6PueE49ir4Ka6CzLymOAZDxpFsTDc= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5fLEAMMkida1BVgxVXE4LfZv/XV+znU= github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5/go.mod h1:c98fKi5B9u8OsKGiWHLRKus6ToQ1Tubeow44ECO1uxY= -github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= -github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba h1:X4n8JG2e2biEZZXdBKt9HX7DN3bYGFUqljqqy0DqgnY= github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba/go.mod h1:CHQnYnQUEPydYCwuy8lmTHfGmdw9TKrhWV0xLx8l0oM= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20190910031516-c1cbffdb01bb/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20190917003517-d78d67427694/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20191116002219-891f55cd449d/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20191212224538-d370462a7e8a/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= +github.com/whyrusleeping/cbor-gen v0.0.0-20200121162646-b63bacf5eaf8/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= +github.com/whyrusleeping/cbor-gen v0.0.0-20200206220010-03c9665e2a66/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= @@ -1835,35 +1741,30 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY= +github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= +github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= +github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 h1:++Zf4xQ7YrkE81gNHIjVqx5JZsn0nbMeHOkY1ILAIME= +github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= -github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= +github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= -github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= -github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1871,20 +1772,15 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= -go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= -go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= @@ -1933,22 +1829,19 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= +go.uber.org/dig v1.7.0/go.mod h1:z+dSd2TP9Usi48jL8M3v63iSBVkiwtVyMKxMZYYauPg= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= +go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -1959,10 +1852,10 @@ go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= +go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org v0.0.0-20190313082347-94abd6928b1d/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2004,11 +1897,8 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2026,9 +1916,6 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= -golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -2044,7 +1931,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2057,8 +1943,8 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2074,7 +1960,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2123,7 +2008,6 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2144,7 +2028,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2182,6 +2065,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2197,9 +2081,11 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2242,16 +2128,13 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2260,14 +2143,12 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2307,6 +2188,7 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108195415-316d2f248479/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -2329,7 +2211,6 @@ golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2337,12 +2218,11 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -2352,6 +2232,7 @@ google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+ google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2414,7 +2295,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2442,7 +2322,6 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2456,17 +2335,14 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2475,8 +2351,8 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v2 v2.0.0-20180128182452-d3ae77c26ac8/go.mod h1:cKXr3E0k4aosgycml1b5z33BVV6hai1Kh7uDgFOkbcs= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2486,12 +2362,9 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2503,21 +2376,16 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/golex v1.0.1 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= -modernc.org/mathutil v1.1.1 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/lib/backupds/backupds_test.go b/lib/backupds/backupds_test.go index f7bc36e22..c681491e3 100644 --- a/lib/backupds/backupds_test.go +++ b/lib/backupds/backupds_test.go @@ -2,6 +2,7 @@ package backupds import ( "bytes" + "context" "fmt" "io/ioutil" "os" @@ -17,14 +18,14 @@ const valSize = 512 << 10 func putVals(t *testing.T, ds datastore.Datastore, start, end int) { for i := start; i < end; i++ { - err := ds.Put(datastore.NewKey(fmt.Sprintf("%d", i)), []byte(fmt.Sprintf("%d-%s", i, strings.Repeat("~", valSize)))) + err := ds.Put(context.TODO(), datastore.NewKey(fmt.Sprintf("%d", i)), []byte(fmt.Sprintf("%d-%s", i, strings.Repeat("~", valSize)))) require.NoError(t, err) } } func checkVals(t *testing.T, ds datastore.Datastore, start, end int, exist bool) { for i := start; i < end; i++ { - v, err := ds.Get(datastore.NewKey(fmt.Sprintf("%d", i))) + v, err := ds.Get(context.TODO(), datastore.NewKey(fmt.Sprintf("%d", i))) if exist { require.NoError(t, err) expect := []byte(fmt.Sprintf("%d-%s", i, strings.Repeat("~", valSize))) @@ -44,7 +45,7 @@ func TestNoLogRestore(t *testing.T) { require.NoError(t, err) var bup bytes.Buffer - require.NoError(t, bds.Backup(&bup)) + require.NoError(t, bds.Backup(context.TODO(), &bup)) putVals(t, ds1, 10, 20) diff --git a/lib/backupds/datastore.go b/lib/backupds/datastore.go index 350988a50..f0ece10ba 100644 --- a/lib/backupds/datastore.go +++ b/lib/backupds/datastore.go @@ -1,6 +1,7 @@ package backupds import ( + "context" "crypto/sha256" "io" "sync" @@ -52,7 +53,7 @@ func Wrap(child datastore.Batching, logdir string) (*Datastore, error) { // Writes a datastore dump into the provided writer as // [array(*) of [key, value] tuples, checksum] -func (d *Datastore) Backup(out io.Writer) error { +func (d *Datastore) Backup(ctx context.Context, out io.Writer) error { scratch := make([]byte, 9) if err := cbg.WriteMajorTypeHeaderBuf(scratch, out, cbg.MajArray, 2); err != nil { @@ -75,7 +76,7 @@ func (d *Datastore) Backup(out io.Writer) error { log.Info("Starting datastore backup") defer log.Info("Datastore backup done") - qr, err := d.child.Query(query.Query{}) + qr, err := d.child.Query(ctx, query.Query{}) if err != nil { return xerrors.Errorf("query: %w", err) } @@ -132,23 +133,23 @@ func (d *Datastore) Backup(out io.Writer) error { // proxy -func (d *Datastore) Get(key datastore.Key) (value []byte, err error) { - return d.child.Get(key) +func (d *Datastore) Get(ctx context.Context, key datastore.Key) (value []byte, err error) { + return d.child.Get(ctx, key) } -func (d *Datastore) Has(key datastore.Key) (exists bool, err error) { - return d.child.Has(key) +func (d *Datastore) Has(ctx context.Context, key datastore.Key) (exists bool, err error) { + return d.child.Has(ctx, key) } -func (d *Datastore) GetSize(key datastore.Key) (size int, err error) { - return d.child.GetSize(key) +func (d *Datastore) GetSize(ctx context.Context, key datastore.Key) (size int, err error) { + return d.child.GetSize(ctx, key) } -func (d *Datastore) Query(q query.Query) (query.Results, error) { - return d.child.Query(q) +func (d *Datastore) Query(ctx context.Context, q query.Query) (query.Results, error) { + return d.child.Query(ctx, q) } -func (d *Datastore) Put(key datastore.Key, value []byte) error { +func (d *Datastore) Put(ctx context.Context, key datastore.Key, value []byte) error { d.backupLk.RLock() defer d.backupLk.RUnlock() @@ -160,21 +161,21 @@ func (d *Datastore) Put(key datastore.Key, value []byte) error { } } - return d.child.Put(key, value) + return d.child.Put(ctx, key, value) } -func (d *Datastore) Delete(key datastore.Key) error { +func (d *Datastore) Delete(ctx context.Context, key datastore.Key) error { d.backupLk.RLock() defer d.backupLk.RUnlock() - return d.child.Delete(key) + return d.child.Delete(ctx, key) } -func (d *Datastore) Sync(prefix datastore.Key) error { +func (d *Datastore) Sync(ctx context.Context, prefix datastore.Key) error { d.backupLk.RLock() defer d.backupLk.RUnlock() - return d.child.Sync(prefix) + return d.child.Sync(ctx, prefix) } func (d *Datastore) CloseLog() error { @@ -196,8 +197,8 @@ func (d *Datastore) Close() error { ) } -func (d *Datastore) Batch() (datastore.Batch, error) { - b, err := d.child.Batch() +func (d *Datastore) Batch(ctx context.Context) (datastore.Batch, error) { + b, err := d.child.Batch(ctx) if err != nil { return nil, err } @@ -215,7 +216,7 @@ type bbatch struct { rlk sync.Locker } -func (b *bbatch) Put(key datastore.Key, value []byte) error { +func (b *bbatch) Put(ctx context.Context, key datastore.Key, value []byte) error { if b.d.log != nil { b.d.log <- Entry{ Key: []byte(key.String()), @@ -224,18 +225,18 @@ func (b *bbatch) Put(key datastore.Key, value []byte) error { } } - return b.b.Put(key, value) + return b.b.Put(ctx, key, value) } -func (b *bbatch) Delete(key datastore.Key) error { - return b.b.Delete(key) +func (b *bbatch) Delete(ctx context.Context, key datastore.Key) error { + return b.b.Delete(ctx, key) } -func (b *bbatch) Commit() error { +func (b *bbatch) Commit(ctx context.Context) error { b.rlk.Lock() defer b.rlk.Unlock() - return b.b.Commit() + return b.b.Commit(ctx) } var _ datastore.Batch = &bbatch{} diff --git a/lib/backupds/log.go b/lib/backupds/log.go index b76dfbfe6..b89f410f0 100644 --- a/lib/backupds/log.go +++ b/lib/backupds/log.go @@ -1,6 +1,7 @@ package backupds import ( + "context" "fmt" "io" "io/ioutil" @@ -100,6 +101,7 @@ type logfile struct { var compactThresh = 2 func (d *Datastore) createLog(logdir string) (*logfile, string, error) { + ctx := context.TODO() p := filepath.Join(logdir, strconv.FormatInt(time.Now().Unix(), 10)+".log.cbor") log.Infow("creating log", "file", p) @@ -108,7 +110,7 @@ func (d *Datastore) createLog(logdir string) (*logfile, string, error) { return nil, "", err } - if err := d.Backup(f); err != nil { + if err := d.Backup(ctx, f); err != nil { return nil, "", xerrors.Errorf("writing log base: %w", err) } if err := f.Sync(); err != nil { @@ -122,8 +124,9 @@ func (d *Datastore) createLog(logdir string) (*logfile, string, error) { } func (d *Datastore) openLog(p string) (*logfile, string, error) { + ctx := context.TODO() log.Infow("opening log", "file", p) - lh, err := d.child.Get(loghead) + lh, err := d.child.Get(ctx, loghead) if err != nil { return nil, "", xerrors.Errorf("checking log head (logfile '%s'): %w", p, err) } @@ -212,6 +215,7 @@ func (d *Datastore) openLog(p string) (*logfile, string, error) { } func (l *logfile) writeLogHead(logname string, ds datastore.Batching) error { + ctx := context.TODO() lval := []byte(fmt.Sprintf("%s;%s;%d", logname, uuid.New(), time.Now().Unix())) err := l.writeEntry(&Entry{ @@ -223,7 +227,7 @@ func (l *logfile) writeLogHead(logname string, ds datastore.Batching) error { return xerrors.Errorf("writing loghead to the log: %w", err) } - if err := ds.Put(loghead, lval); err != nil { + if err := ds.Put(ctx, loghead, lval); err != nil { return xerrors.Errorf("writing loghead to the datastore: %w", err) } diff --git a/lib/backupds/read.go b/lib/backupds/read.go index a44442af1..af4f30888 100644 --- a/lib/backupds/read.go +++ b/lib/backupds/read.go @@ -2,6 +2,7 @@ package backupds import ( "bytes" + "context" "crypto/sha256" "io" "os" @@ -117,13 +118,13 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) } func RestoreInto(r io.Reader, dest datastore.Batching) error { - batch, err := dest.Batch() + batch, err := dest.Batch(context.TODO()) if err != nil { return xerrors.Errorf("creating batch: %w", err) } _, err = ReadBackup(r, func(key datastore.Key, value []byte, _ bool) error { - if err := batch.Put(key, value); err != nil { + if err := batch.Put(context.TODO(), key, value); err != nil { return xerrors.Errorf("put key: %w", err) } @@ -133,7 +134,7 @@ func RestoreInto(r io.Reader, dest datastore.Batching) error { return xerrors.Errorf("reading backup: %w", err) } - if err := batch.Commit(); err != nil { + if err := batch.Commit(context.TODO()); err != nil { return xerrors.Errorf("committing batch: %w", err) } From b9b4a2659d99b4c720866e5c9a13297194fe97a4 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 7 Dec 2021 17:24:58 -0500 Subject: [PATCH 032/157] Update go-data-transfer --- go.mod | 24 +++++++++++----------- go.sum | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index af9864d1b..e5277fc00 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d + github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 @@ -42,7 +42,7 @@ require ( github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 - github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 + github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 @@ -71,14 +71,14 @@ require ( github.com/ipfs/go-blockservice v0.2.1 github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 - github.com/ipfs/go-datastore v0.5.0 + github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-filestore v0.0.3 // indirect github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.10.6 + github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.0 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 @@ -106,20 +106,20 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.15.0 + github.com/libp2p/go-libp2p v0.16.0 github.com/libp2p/go-libp2p-connmgr v0.2.4 - github.com/libp2p/go-libp2p-core v0.9.0 - github.com/libp2p/go-libp2p-discovery v0.5.1 + github.com/libp2p/go-libp2p-core v0.11.0 + github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.13.0 - github.com/libp2p/go-libp2p-noise v0.2.2 + github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.4.0 github.com/libp2p/go-libp2p-pubsub v0.5.6 - github.com/libp2p/go-libp2p-quic-transport v0.11.2 + github.com/libp2p/go-libp2p-quic-transport v0.15.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.5.3 - github.com/libp2p/go-libp2p-tls v0.2.0 - github.com/libp2p/go-libp2p-yamux v0.5.4 + github.com/libp2p/go-libp2p-swarm v0.8.0 + github.com/libp2p/go-libp2p-tls v0.3.1 + github.com/libp2p/go-libp2p-yamux v0.6.0 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-isatty v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 diff --git a/go.sum b/go.sum index 469b791cc..76755f63e 100644 --- a/go.sum +++ b/go.sum @@ -353,7 +353,10 @@ github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BS github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d h1:otSEh99T0inzVe6pblKBG5tSeSqbQq4BCi5GKoh1J7I= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d/go.mod h1:Qj+yDFsualZ4c7Ndh5Cl1SJK46QeVzNMdRnfAJdDuhw= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a h1:eSKovm26xNSTE/OFc+9zkt7sotMb0ixumKAO11BNMbs= +github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= github.com/filecoin-project/go-ds-versioning v0.0.0-20211119000042-d0cf38743fe7/go.mod h1:BVGOwN2WSCRKV3CDLFJ9u0L9M17WxHqw1KLA0l5ATnk= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200208005934-2b8bd03caca5/go.mod h1:JbkIgFF/Z9BDlvrJO1FuKkaWsH673/UdFaiVS6uIHlA= @@ -408,6 +411,7 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 h1:xH09S8C+VhZCTmTkdudGm/cN5a8teKE+PXXvbPsXTO0= github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/lotus v0.2.10/go.mod h1:om5PQA9ZT0lf16qI7Fz/ZGLn4LDCMqPC8ntZA9uncRE= @@ -770,6 +774,7 @@ github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7fr github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -810,6 +815,7 @@ github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqis github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.6-0.20211119000532-c416dad3bd56/go.mod h1:/wC15/mR2JyjVrO86tfZLLuhyvop0fLU+ewhYLkdgLM= github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.0.14-0.20191218031521-b2c774a54db1/go.mod h1:8yRx0xLUps1Xq8ZDnIwIVdQRp7JjA55gGvCiRHT91Vk= github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= @@ -848,13 +854,16 @@ github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhc github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= +github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= +github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= @@ -916,6 +925,7 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= @@ -978,6 +988,7 @@ github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -997,6 +1008,7 @@ github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpz github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= @@ -1004,6 +1016,7 @@ github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0 github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.0.3/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= @@ -1030,7 +1043,9 @@ github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1040,6 +1055,7 @@ github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/ github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= @@ -1090,6 +1106,9 @@ github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1101,6 +1120,7 @@ github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQO github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1127,6 +1147,7 @@ github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryD github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= @@ -1134,6 +1155,7 @@ github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCTh github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1162,6 +1184,8 @@ github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQ github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -1190,6 +1214,7 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1200,9 +1225,12 @@ github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.0/go.mod h1:VZdoSWQDeNpIIAFJFv+6uqTqpnIIDHcqZQSTC/A1TT0= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= @@ -1214,6 +1242,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1227,6 +1256,7 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1242,9 +1272,11 @@ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+ github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -1253,13 +1285,16 @@ github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIY github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= @@ -1277,6 +1312,7 @@ github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyP github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1299,12 +1335,16 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -1325,6 +1365,7 @@ github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1j github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1366,6 +1407,7 @@ github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0 github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= @@ -1374,6 +1416,7 @@ github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+ github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= @@ -1394,9 +1437,12 @@ github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVq github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= +github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= @@ -1410,6 +1456,7 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= +github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1429,6 +1476,7 @@ github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= @@ -1445,6 +1493,7 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1456,6 +1505,7 @@ github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+ github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1541,6 +1591,7 @@ github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= @@ -1604,7 +1655,9 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -1634,6 +1687,7 @@ github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= @@ -1658,6 +1712,7 @@ github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFC github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1703,8 +1758,10 @@ github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -1741,6 +1798,7 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -1899,6 +1957,7 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1943,6 +2002,7 @@ golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2132,6 +2192,7 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2218,11 +2279,13 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= From a9e22df76561730dab6c5bbe45a328ad597796e5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 9 Dec 2021 15:14:48 +0200 Subject: [PATCH 033/157] update deps --- go.mod | 10 +- go.sum | 372 ++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 240 insertions(+), 142 deletions(-) diff --git a/go.mod b/go.mod index e5277fc00..656bbaabb 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/StackExchange/wmi v1.2.1 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 - github.com/bep/debounce v1.2.0 // indirect github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 @@ -27,13 +26,14 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 + github.com/filecoin-project/dagstore v0.4.2 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 + github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a - github.com/filecoin-project/go-ds-versioning v0.1.0 // indirect github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.13.4 @@ -76,10 +76,9 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.1.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 - github.com/ipfs/go-filestore v0.0.3 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 - github.com/ipfs/go-ipfs-blockstore v1.1.0 + github.com/ipfs/go-ipfs-blockstore v1.1.1 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-ds-help v1.1.0 @@ -132,7 +131,6 @@ require ( github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 - github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 @@ -143,7 +141,6 @@ require ( github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.2.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 @@ -158,7 +155,6 @@ require ( go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 - golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 // indirect golang.org/x/net v0.0.0-20210917221730-978cfadd31cf golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 diff --git a/go.sum b/go.sum index 76755f63e..28900d545 100644 --- a/go.sum +++ b/go.sum @@ -32,10 +32,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= -contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -58,7 +54,6 @@ github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= @@ -80,7 +75,6 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= @@ -139,7 +133,6 @@ github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= @@ -215,7 +208,6 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -251,7 +243,6 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.1-rc1.0.20200120142413-c3333a5a830e/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= @@ -282,7 +273,6 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= @@ -311,28 +301,17 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E= -github.com/filecoin-project/chain-validation v0.0.3/go.mod h1:NCEGFjcWRjb8akWFSOXvU6n2efkWIqAeOKU6o5WBGQw= +github.com/filecoin-project/dagstore v0.4.2 h1:Ae2+O1DhKCI1JbOZCBkqUksKYofdbRbjkS7OF0A6Jw0= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= -github.com/filecoin-project/go-address v0.0.0-20191219011437-af739c490b4f/go.mod h1:rCbpXPva2NKF9/J4X6sr7hbKBgQCxyFtRj7KOZqoIms= -github.com/filecoin-project/go-address v0.0.0-20200107215422-da8eea2842b5/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= -github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be/go.mod h1:SAOwJoakQ8EPjwNIsiakIQKsoKdkcbx8U3IapgCg9R0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= -github.com/filecoin-project/go-amt-ipld v0.0.0-20191205011053-79efc22d6cdc/go.mod h1:KsFPWjF+UUYl6n9A+qbg4bjFgAOneicFZtDH/LQEX2U= -github.com/filecoin-project/go-amt-ipld/v2 v2.0.0/go.mod h1:PAZ5tvSfMfWE327osqFXKm7cBpCpBk2Nh0qKsJUmjjk= -github.com/filecoin-project/go-amt-ipld/v2 v2.0.1-0.20200131012142-05d80eeccc5e/go.mod h1:boRtQhzmxNocrMxOXo1NYn4oUc1NGvR8tEa79wApNXg= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38aAC1ptBnJfPma1R/zZsKmx4o= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0 h1:ZNJ9tEG5bE72vBWYiuh5bkxJVM3ViHNOmQ7qew9n6RE= github.com/filecoin-project/go-amt-ipld/v3 v3.1.0/go.mod h1:UjM2QhDFrrjD5s1CdnkJkat4ga+LqZBZgTMniypABRo= -github.com/filecoin-project/go-bitfield v0.0.0-20200309034705-8c7ac40bd550/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= -github.com/filecoin-project/go-bitfield v0.0.0-20200416002808-b3ee67ec9060/go.mod h1:iodsLxOFZnqKtjj2zkgqzoGNrv6vUqj69AT/J8DKXEw= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= @@ -340,35 +319,24 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= +github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v0.0.0-20191219005021-4accf56bd2ce/go.mod h1:b14UWxhxVCAjrQUYvVGrQRRsjAh79wXYejw9RbUcAww= -github.com/filecoin-project/go-data-transfer v0.2.1/go.mod h1:+0weLKevhT3EKyan4QzUSMlQOPgLNgT2j0CfEA1NLqI= -github.com/filecoin-project/go-data-transfer v0.5.3/go.mod h1:30ROzlBS8tbTkszmW9a6/N4oD5bIh6QRBCXC6lORuI8= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d h1:otSEh99T0inzVe6pblKBG5tSeSqbQq4BCi5GKoh1J7I= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d/go.mod h1:Qj+yDFsualZ4c7Ndh5Cl1SJK46QeVzNMdRnfAJdDuhw= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a h1:eSKovm26xNSTE/OFc+9zkt7sotMb0ixumKAO11BNMbs= github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211119000042-d0cf38743fe7/go.mod h1:BVGOwN2WSCRKV3CDLFJ9u0L9M17WxHqw1KLA0l5ATnk= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= -github.com/filecoin-project/go-fil-commcid v0.0.0-20200208005934-2b8bd03caca5/go.mod h1:JbkIgFF/Z9BDlvrJO1FuKkaWsH673/UdFaiVS6uIHlA= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v0.0.0-20200114015428-74d100f305f8/go.mod h1:c8NTjvFVy1Ud02mmGDjOiMeawY2t6ALfrrdvAB01FQc= -github.com/filecoin-project/go-fil-markets v0.1.3 h1:RSPSNJbrJ1limTXtlWEDKEgZVcFmbPCV48hM1Cm6F7U= -github.com/filecoin-project/go-fil-markets v0.1.3/go.mod h1:ByBBn4/X216eAmbYb/Pg1sKjfc5W6iIJXrArqznJ1Z8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= @@ -382,17 +350,12 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= -github.com/filecoin-project/go-padreader v0.0.0-20200210211231-548257017ca6/go.mod h1:0HgYnrkeSU4lu1p+LEOeDpFsNBssa0OGGriWdA4hvaE= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878/go.mod h1:40kI2Gv16mwcRsHptI3OAV4nlOEU7wVDc4RgMylNFjU= -github.com/filecoin-project/go-paramfetch v0.0.1/go.mod h1:fZzmf4tftbwf9S37XRifoJlz7nCjRdIrMGLR07dKLCc= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= -github.com/filecoin-project/go-sectorbuilder v0.0.1/go.mod h1:3OZ4E3B2OuwhJjtxR4r7hPU9bCfB+A+hm4alLEsaeDc= -github.com/filecoin-project/go-sectorbuilder v0.0.2-0.20200203173614-42d67726bb62/go.mod h1:jNGVCDihkMFnraYVLH1xl4ceZQVxx/u4dOORrTKeRi0= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -402,23 +365,15 @@ github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/ github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-statemachine v0.0.0-20200226041606-2074af6d51d9/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v0.0.0-20200714194326-a77c3ae20989/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5 h1:xH09S8C+VhZCTmTkdudGm/cN5a8teKE+PXXvbPsXTO0= -github.com/filecoin-project/go-statestore v0.1.2-0.20211118230537-43557b6c5ce5/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= -github.com/filecoin-project/lotus v0.2.10/go.mod h1:om5PQA9ZT0lf16qI7Fz/ZGLn4LDCMqPC8ntZA9uncRE= -github.com/filecoin-project/sector-storage v0.0.0-20200411000242-61616264b16d/go.mod h1:/yueJueMh0Yc+0G1adS0lhnedcSnjY86EjKsA20+DVY= -github.com/filecoin-project/specs-actors v0.0.0-20200210130641-2d1fbd8672cf/go.mod h1:xtDZUB6pe4Pksa/bAJbJ693OilaC5Wbot9jMhLm3cZA= -github.com/filecoin-project/specs-actors v0.0.0-20200409043918-e569f4a2f504/go.mod h1:mdJraXq5vMy0+/FqVQIrnNlpQ/Em6zeu06G/ltQ0/lA= -github.com/filecoin-project/specs-actors v0.3.0/go.mod h1:nQYnFbQ7Y0bHZyq6HDEuVlCPR+U3z5Q3wMOQ+2aiV+Y= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -439,7 +394,6 @@ github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNP github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-storage v0.0.0-20200410185809-9fbaaa08f275/go.mod h1:xJ1/xl9+8zZeSSSFmDC3Wr6uusCTxyYPI0VeNVSFmPE= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -459,7 +413,6 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -490,7 +443,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -648,11 +600,8 @@ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= -github.com/hannahhoward/cbor-gen-for v0.0.0-20191216214420-3e450425c40c/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= -github.com/hannahhoward/cbor-gen-for v0.0.0-20191218204337-9ab7b1bcc099/go.mod h1:WVPCl0HO/0RAL5+vBH2GMxBomlxBF70MAS78+Lu1//k= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 h1:F9k+7wv5OIk1zcq23QpdiL0hfDuXPjuOmMNaC6fgQ0Q= github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1/go.mod h1:jvfsLIxk0fY/2BKSQ1xf2406AKA5dwMmKKv0ADcOfN8= github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= @@ -701,7 +650,6 @@ github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/huin/goupnp v0.0.0-20180415215157-1395d1447324/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= @@ -716,7 +664,6 @@ github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1C github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= @@ -726,7 +673,6 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= @@ -737,14 +683,11 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3-0.20190908200855-f22eea50656c/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-car v0.0.3-0.20191203022317-23b0a85fd1b1/go.mod h1:rmd887mJxQRDfndfDEY3Liyx8gQVyfFFRSHdsnDSAlk= -github.com/ipfs/go-car v0.0.3-0.20200121013634-f188c0e24291/go.mod h1:AG6sBpd2PWMccpAG7XLFBBQ/4rfBEtzUNeO2GSMesYk= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -770,10 +713,9 @@ github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.5.0 h1:rQicVCEacWyk4JZ6G5bD9TKR7lZEG1MWcG7UdWYrFAU= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= @@ -786,7 +728,6 @@ github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6 github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.0.0-20200123200730-d75eb2678a5d/go.mod h1:sTQFaWUoW0OvhXzfHnQ9j39L6fdlqDkptDYcpC1XrYE= github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 h1:/8az/zYn1icEwiHAmpR11Io+8hrlICU10J+Ft0zSiog= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= @@ -800,58 +741,66 @@ github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvV github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v0.0.2/go.mod h1:KnZ41qJsCt2OX2mxZS0xsK3Psr0/oB93HMMssLujjVc= -github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= -github.com/ipfs/go-fs-lock v0.0.1/go.mod h1:DNBekbboPKcxs1aukPSaOtFA3QfSdi5C855v0i9XJ8Y= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.0.4/go.mod h1:6UACBjfOXEa8rQL3Q/JpZpWS0nZDCLx134WUkjrmFpQ= -github.com/ipfs/go-graphsync v0.0.6-0.20200504202014-9d5f2c26a103/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.6-0.20211119000532-c416dad3bd56/go.mod h1:/wC15/mR2JyjVrO86tfZLLuhyvop0fLU+ewhYLkdgLM= -github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-hamt-ipld v0.0.14-0.20191218031521-b2c774a54db1/go.mod h1:8yRx0xLUps1Xq8ZDnIwIVdQRp7JjA55gGvCiRHT91Vk= -github.com/ipfs/go-hamt-ipld v0.0.15-0.20200131012125-dd88a59d3f2e/go.mod h1:9aQJu/i/TaRDW6jqB5U217dLIDopn50wxLdHXM2CTfE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.1/go.mod h1:8gZOgIN5e+Xdg2YSGdwTTRbguSVjYyosIDRQCY8E9QM= github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= +github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1 h1:a4koS3l+Fzl43LAAn51/N+Yn4AjCX4AGvoZLqqkrD/g= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= +github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= +github.com/ipfs/go-ipfs-cmds v0.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= +github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= +github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-files v0.0.7/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= +github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= -github.com/ipfs/go-ipfs-flags v0.0.1/go.mod h1:RnXBb9WV53GSfTrSDVK61NLTFKvWc60n+K9EgCDh+rA= +github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= +github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= @@ -859,13 +808,16 @@ github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdr github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= +github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -873,6 +825,7 @@ github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMR github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= +github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.1/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= @@ -880,32 +833,42 @@ github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBW github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.0.8/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= +github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= +github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= -github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= +github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= +github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= +github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= +github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= +github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= +github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= +github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= @@ -913,47 +876,61 @@ github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6 github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= +github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= -github.com/ipld/go-ipld-prime v0.0.1/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= +github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= +github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= +github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= +github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= -github.com/jackpal/gateway v1.0.4/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= @@ -969,15 +946,18 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3/go.mod h1:BYpt4ufZiIGv2nXn4gMxnfKV306n3mWXgNu/d2TqdTU= github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= +github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA= github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -986,52 +966,58 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= +github.com/koron/go-ssdp v0.0.2 h1:fL3wAoyT6hXHQlORyXUW4Q23kkQpJRgEAYcZB5BR71o= github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= +github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40JQWnayTvNMgD/vyk= github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= -github.com/libp2p/go-eventbus v0.0.3/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= +github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/libp2p/go-flow-metrics v0.0.3 h1:8tAs/hSdNvUiLgtlSy3mxwxWP4I9y/jlkPFT7epKdeM= github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-libp2p v0.0.30/go.mod h1:XWT8FGHlhptAv1+3V/+J5mEpzyui/5bvFsNuWYs611A= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.2.1/go.mod h1:HZbtEOrgZN4F1fGZVvkV+930Wx3DkqlpBlO8dIoZWds= -github.com/libp2p/go-libp2p v0.3.0/go.mod h1:J7DPB1+zB5VLc8v/kKSD8+u2cbyIGI0Dh/Pf3Wprt+0= github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= -github.com/libp2p/go-libp2p v0.4.2/go.mod h1:MNmgUxUw5pMsdOzMlT0EE7oKjRasl+WyVwM0IBlpKgQ= github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= @@ -1039,12 +1025,15 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= +github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= +github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= +github.com/libp2p/go-libp2p v0.16.0 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -1055,6 +1044,7 @@ github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/ github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.6.0 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= @@ -1062,6 +1052,7 @@ github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMz github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= +github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= @@ -1070,17 +1061,18 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= +github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= +github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-connmgr v0.1.0/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= +github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= -github.com/libp2p/go-libp2p-core v0.0.9/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A= @@ -1120,6 +1112,7 @@ github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQO github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= @@ -1127,14 +1120,15 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= -github.com/libp2p/go-libp2p-kad-dht v0.1.1/go.mod h1:1kj2Rk5pX3/0RwqMm9AMNCT7DzcMHYhgDN5VTi+cY0M= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= +github.com/libp2p/go-libp2p-kad-dht v0.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= -github.com/libp2p/go-libp2p-kbucket v0.2.0/go.mod h1:JNymBToym3QXKBMKGy3m29+xprg0EVr/GJFHxFEdgh8= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= +github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= github.com/libp2p/go-libp2p-metrics v0.0.1/go.mod h1:jQJ95SXXA/K1VZi13h52WZMa9ja78zjyy5rspMsC/08= github.com/libp2p/go-libp2p-mplex v0.1.1/go.mod h1:KUQWpGkCzfV7UIpi8SKsAVxyBgz1c9R5EvxgnwLsb/I= @@ -1143,18 +1137,21 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= +github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= +github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= @@ -1162,7 +1159,6 @@ github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMg github.com/libp2p/go-libp2p-peerstore v0.0.1/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.0.6/go.mod h1:RabLyPVJLuNQ+GFyoEkfi8H4Ti6k/HtZJ7YKgtSq+20= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.2/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= @@ -1173,47 +1169,51 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= +github.com/libp2p/go-libp2p-peerstore v0.4.0 h1:DOhRJLnM9Dc9lIXi3rPDZBf789LXy1BrzwIs7Tj0cKA= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.2.6/go.mod h1:5jEp7R3ItQ0pgcEMrPZYE9DQTg/H3CTc7Mu1j2G4Y5o= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= +github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= +github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.15.0 h1:DR0mP6kcieowikBprWkcNtbquRKOPWb5dLZ4ahDZujk= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= +github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= -github.com/libp2p/go-libp2p-routing-helpers v0.1.0/go.mod h1:oUs0h39vNwYtYXnQWOTU5BaafbedSyWCCal3gqHuoOQ= +github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= github.com/libp2p/go-libp2p-secio v0.0.3/go.mod h1:hS7HQ00MgLhRO/Wyu1bTX6ctJKhVpm+j2/S2A5UqYb0= github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.1.1/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= github.com/libp2p/go-libp2p-swarm v0.0.6/go.mod h1:s5GZvzg9xXe8sbeESuFpjt8CJPTCa8mhEusweJqyFy8= github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.1.1/go.mod h1:4NVJaLwq/dr5kEq79Jo6pMin7ZFwLx73ln1FTefR91Q= -github.com/libp2p/go-libp2p-swarm v0.2.0/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= +github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0 h1:nRHNRhi86L7jhka02N4MoV+PSFFPoJFkHNQwCTFxNhw= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1225,14 +1225,13 @@ github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0 h1:bTjC29TTQ/ODq0ld3+0KLq3irdA5cAH3OMbRi0/QsvE= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-tls v0.1.0/go.mod h1:VZdoSWQDeNpIIAFJFv+6uqTqpnIIDHcqZQSTC/A1TT0= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= -github.com/libp2p/go-libp2p-transport v0.0.4/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= @@ -1242,6 +1241,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0 h1:7SDl3O2+AYOgfE40Mis83ClpfGNkNA6m4FwhbOHs+iI= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= @@ -1255,11 +1255,14 @@ github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2Ez github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= +github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0 h1:TKayW983n92JhCGdCo7ej7eEb+DQ0VYfKNOxlN/1kNQ= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= +github.com/libp2p/go-maddr-filter v0.1.0 h1:4ACqZKw8AqiuJfwFGq1CYDFugfXTOos+qQ3DETkhtCE= github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= github.com/libp2p/go-mplex v0.0.4/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= @@ -1267,19 +1270,23 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.3.0 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= +github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= @@ -1289,19 +1296,23 @@ github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGN github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= @@ -1311,7 +1322,7 @@ github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1 github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= @@ -1322,6 +1333,7 @@ github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzl github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= +github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1332,23 +1344,29 @@ github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= +github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= +github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1356,16 +1374,22 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1373,21 +1397,24 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -1403,9 +1430,13 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= @@ -1421,6 +1452,7 @@ github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -1463,8 +1495,10 @@ github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/94 github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= @@ -1486,7 +1520,6 @@ github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:Zr github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.6/go.mod h1:XuKXPp8VHcTygube3OWZC+aZrA+H1IhmjoCDtJc7PXM= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1501,6 +1534,7 @@ github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wS github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= +github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= @@ -1526,10 +1560,12 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -1537,31 +1573,38 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 h1:CznVS40zms0Dj5he4ERo+fRPtO0qxUk8lA8Xu3ddet0= github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333/go.mod h1:Ag6rSXkHIckQmjFBCweJEEt1mrTPBv8b9W4aU/NQWfI= +github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= +github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df h1:vdYtBU6zvL7v+Tr+0xFM/qhahw/EvY8DMMunZHKH6eE= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= +github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= @@ -1569,9 +1612,6 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= -github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -1579,13 +1619,16 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= @@ -1608,12 +1651,14 @@ github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83A github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -1627,6 +1672,7 @@ github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16 github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0 h1:JEkYlQnpzrzQFxi6gnukFPdQ+ac82oRhzMcIduJu/Ug= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1642,16 +1688,23 @@ github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= +github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= +github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= @@ -1664,8 +1717,10 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= +github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= @@ -1696,14 +1751,16 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1715,6 +1772,7 @@ github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7A github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1730,6 +1788,7 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= @@ -1739,21 +1798,30 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= +github.com/tidwall/gjson v1.6.0 h1:9VEQWz6LLMUsUl6PueE49ir4Ka6CzLymOAZDxpFsTDc= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -1763,28 +1831,30 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= +github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= +github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5 h1:EYxr08r8x6r/5fLEAMMkida1BVgxVXE4LfZv/XV+znU= github.com/weaveworks/common v0.0.0-20200512154658-384f10054ec5/go.mod h1:c98fKi5B9u8OsKGiWHLRKus6ToQ1Tubeow44ECO1uxY= +github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= +github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba h1:X4n8JG2e2biEZZXdBKt9HX7DN3bYGFUqljqqy0DqgnY= github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba/go.mod h1:CHQnYnQUEPydYCwuy8lmTHfGmdw9TKrhWV0xLx8l0oM= +github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20190910031516-c1cbffdb01bb/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20190917003517-d78d67427694/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20191116002219-891f55cd449d/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20191212224538-d370462a7e8a/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= -github.com/whyrusleeping/cbor-gen v0.0.0-20200121162646-b63bacf5eaf8/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200206220010-03c9665e2a66/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= @@ -1800,29 +1870,33 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-smux-multiplex v3.0.16+incompatible/go.mod h1:34LEDbeKFZInPUrAG+bjuJmUXONGdEFW7XL0SpTY1y4= -github.com/whyrusleeping/go-smux-multistream v2.0.2+incompatible/go.mod h1:dRWHHvc4HDQSHh9gbKEBbUZ+f2Q8iZTPG3UOGYODxSQ= -github.com/whyrusleeping/go-smux-yamux v2.0.8+incompatible/go.mod h1:6qHUzBXUbB9MXmw3AUdB52L8sEb/hScCqOdW2kj/wuI= +github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/whyrusleeping/pubsub v0.0.0-20131020042734-02de8aa2db3d/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= +github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 h1:++Zf4xQ7YrkE81gNHIjVqx5JZsn0nbMeHOkY1ILAIME= github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325/go.mod h1:g7ckxrjiFh8mi1AY7ox23PZD0g6QU/TxW3U3unX7I3A= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSvJi5zk5GLKVuid9TVjS9a0OmLIDKTfoZBL6Ow= github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= -github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb h1:/7/dQyiKnxAOj9L69FhST7uMe17U015XPzX7cy+5ykM= github.com/xlab/c-for-go v0.0.0-20201112171043-ea6dce5809cb/go.mod h1:pbNsDSxn1ICiNn9Ct4ZGNrwzfkkwYbx/lw8VuyutFIg= +github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245 h1:Sw125DKxZhPUI4JLlWugkzsrlB50jR9v2khiD9FxuSo= github.com/xlab/pkgconfig v0.0.0-20170226114623-cea12a0fd245/go.mod h1:C+diUUz7pxhNY6KAoLgrTYARGWnt82zWTylZlxT92vk= github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= +github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1830,15 +1904,20 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= github.com/zondax/ledger-go v0.12.1/go.mod h1:KatxXrVDzgWwbssUWsF5+cOJHXPvzQ09YSlzGNuhOEo= +go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= +go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= @@ -1887,19 +1966,22 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.7.0/go.mod h1:z+dSd2TP9Usi48jL8M3v63iSBVkiwtVyMKxMZYYauPg= +go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= -go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -1910,10 +1992,10 @@ go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20190313082347-94abd6928b1d/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1955,7 +2037,9 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1975,6 +2059,9 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -1990,6 +2077,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2004,7 +2092,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2020,6 +2107,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2068,6 +2156,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2088,6 +2177,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2125,7 +2215,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2141,11 +2230,9 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2188,6 +2275,7 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2196,6 +2284,7 @@ golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10Hp golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2204,12 +2293,14 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2249,7 +2340,6 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108195415-316d2f248479/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -2272,6 +2362,7 @@ golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2281,7 +2372,6 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2295,7 +2385,6 @@ google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+ google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2358,6 +2447,7 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -2385,6 +2475,7 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2398,14 +2489,17 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -2414,8 +2508,8 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v2 v2.0.0-20180128182452-d3ae77c26ac8/go.mod h1:cKXr3E0k4aosgycml1b5z33BVV6hai1Kh7uDgFOkbcs= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2425,9 +2519,12 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2439,16 +2536,21 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/golex v1.0.1 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= +modernc.org/mathutil v1.1.1 h1:FeylZSVX8S+58VsyJlkEj2bcpdytmp9MmDKZkKx8OIE= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From a3d8494a04727e9d2f072791dbd9ec0daf04020d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 14:52:33 +0100 Subject: [PATCH 034/157] piecereader: Avoid redundant roundtrips when seeking --- extern/sector-storage/piece_provider.go | 25 ++++--- extern/sector-storage/piece_reader.go | 3 + extern/sector-storage/stores/remote.go | 80 +++++++++++++++++---- extern/sector-storage/stores/remote_test.go | 22 ++++-- 4 files changed, 104 insertions(+), 26 deletions(-) diff --git a/extern/sector-storage/piece_provider.go b/extern/sector-storage/piece_provider.go index c500b4e30..2d9ca33be 100644 --- a/extern/sector-storage/piece_provider.go +++ b/extern/sector-storage/piece_provider.go @@ -80,21 +80,28 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return nil, xerrors.Errorf("acquiring read sector lock: %w", err) } + // Reader returns a reader getter for an unsealed piece at the given offset in the given sector. + // The returned reader will be nil if none of the workers has an unsealed sector file containing + // the unsealed piece. + rg, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()), size.Padded()) + if err != nil { + cancel() + log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) + return nil, err + } + if rg == nil { + cancel() + return nil, nil + } + pr, err := (&pieceReader{ ctx: ctx, getReader: func(ctx context.Context, startOffset uint64) (io.ReadCloser, error) { startOffsetAligned := storiface.UnpaddedByteIndex(startOffset / 127 * 127) // floor to multiple of 127 - // Reader returns a reader for an unsealed piece at the given offset in the given sector. - // The returned reader will be nil if none of the workers has an unsealed sector file containing - // the unsealed piece. - r, err := p.storage.Reader(ctx, sector, abi.PaddedPieceSize(pieceOffset.Padded()+startOffsetAligned.Padded()), size.Padded()-abi.PaddedPieceSize(startOffsetAligned.Padded())) + r, err := rg(startOffsetAligned.Padded()) if err != nil { - log.Debugf("did not get storage reader;sector=%+v, err:%s", sector.ID, err) - return nil, err - } - if r == nil { - return nil, nil + return nil, xerrors.Errorf("getting reader at +%d: %w", startOffsetAligned, err) } upr, err := fr32.NewUnpadReader(r, size.Padded()) diff --git a/extern/sector-storage/piece_reader.go b/extern/sector-storage/piece_reader.go index 14f13f017..d7a3f4e98 100644 --- a/extern/sector-storage/piece_reader.go +++ b/extern/sector-storage/piece_reader.go @@ -67,6 +67,9 @@ func (p *pieceReader) Close() error { } if p.r != nil { + if err := p.r.Close(); err != nil { + return err + } if err := p.r.Close(); err != nil { return err } diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index 7935556a9..0681026c9 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -585,7 +585,7 @@ func (r *Remote) CheckIsUnsealed(ctx context.Context, s storage.SectorRef, offse // 1. no worker(local worker included) has an unsealed file for the given sector OR // 2. no worker(local worker included) has the unsealed piece in their unsealed sector file. // Will return a nil reader and a nil error in such a case. -func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size abi.PaddedPieceSize) (io.ReadCloser, error) { +func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size abi.PaddedPieceSize) (func(startOffsetAligned storiface.PaddedByteIndex) (io.ReadCloser, error), error) { ft := storiface.FTUnsealed // check if we have the unsealed sector file locally @@ -623,7 +623,52 @@ func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size a if has { log.Infof("returning piece reader for local unsealed piece sector=%+v, (offset=%d, size=%d)", s.ID, offset, size) - return r.pfHandler.Reader(pf, storiface.PaddedByteIndex(offset), size) + + return func(startOffsetAligned storiface.PaddedByteIndex) (io.ReadCloser, error) { + // don't reuse between readers unless closed + f := pf + pf = nil + + if f == nil { + f, err = r.pfHandler.OpenPartialFile(abi.PaddedPieceSize(ssize), path) + if err != nil { + return nil, xerrors.Errorf("opening partial file: %w", err) + } + log.Debugf("local partial file (re)opened %s (+%d,%d)", path, offset, size) + } + + r, err := r.pfHandler.Reader(f, storiface.PaddedByteIndex(offset)+startOffsetAligned, size-abi.PaddedPieceSize(startOffsetAligned)) + if err != nil { + return nil, err + } + + return struct { + io.Reader + io.Closer + }{ + Reader: r, + Closer: funcCloser(func() error { + // if we already have a reader cached, close this one + if pf != nil { + if f == nil { + return nil + } + if pf == f { + pf = nil + } + + tmp := f + f = nil + return tmp.Close() + } + + // otherwise stash it away for reuse + pf = f + return nil + }), + }, nil + }, nil + } log.Debugf("miner has unsealed file but not unseal piece, %s (+%d,%d)", path, offset, size) @@ -666,16 +711,19 @@ func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size a continue } - // readRemote fetches a reader that we can use to read the unsealed piece from the remote worker. - // It uses a ranged HTTP query to ensure we ONLY read the unsealed piece and not the entire unsealed file. - rd, err := r.readRemote(ctx, url, offset, size) - if err != nil { - log.Warnw("reading from remote", "url", url, "error", err) - lastErr = err - continue - } - log.Infof("Read remote %s (+%d,%d)", url, offset, size) - return rd, nil + return func(startOffsetAligned storiface.PaddedByteIndex) (io.ReadCloser, error) { + // readRemote fetches a reader that we can use to read the unsealed piece from the remote worker. + // It uses a ranged HTTP query to ensure we ONLY read the unsealed piece and not the entire unsealed file. + rd, err := r.readRemote(ctx, url, offset+abi.PaddedPieceSize(startOffsetAligned), size) + if err != nil { + log.Warnw("reading from remote", "url", url, "error", err) + return nil, err + } + log.Infof("Read remote %s (+%d,%d)", url, offset, size) + + return rd, err + }, nil + } } @@ -692,3 +740,11 @@ func (r *Remote) Reserve(ctx context.Context, sid storage.SectorRef, ft storifac } var _ Store = &Remote{} + +type funcCloser func() error + +func (f funcCloser) Close() error { + return f() +} + +var _ io.Closer = funcCloser(nil) diff --git a/extern/sector-storage/stores/remote_test.go b/extern/sector-storage/stores/remote_test.go index ea9179655..0bc439dee 100644 --- a/extern/sector-storage/stores/remote_test.go +++ b/extern/sector-storage/stores/remote_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "io" "io/ioutil" "net/http" "net/http/httptest" @@ -470,12 +471,20 @@ func TestReader(t *testing.T) { remoteStore := stores.NewRemote(lstore, index, nil, 6000, pfhandler) - rd, err := remoteStore.Reader(ctx, sectorRef, offset, size) + rdg, err := remoteStore.Reader(ctx, sectorRef, offset, size) + var rd io.ReadCloser if tc.errStr != "" { - require.Error(t, err) - require.Nil(t, rd) - require.Contains(t, err.Error(), tc.errStr) + if rdg == nil { + require.Error(t, err) + require.Nil(t, rdg) + require.Contains(t, err.Error(), tc.errStr) + } else { + rd, err = rdg(0) + require.Error(t, err) + require.Nil(t, rd) + require.Contains(t, err.Error(), tc.errStr) + } } else { require.NoError(t, err) } @@ -483,7 +492,10 @@ func TestReader(t *testing.T) { if !tc.expectedNonNilReader { require.Nil(t, rd) } else { - require.NotNil(t, rd) + require.NotNil(t, rdg) + rd, err := rdg(0) + require.NoError(t, err) + defer func() { require.NoError(t, rd.Close()) }() From 9c75a3aaa8d5295c55c7db398c9e3aff0831bd1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 15:49:37 +0100 Subject: [PATCH 035/157] piecereader: Avoid allocating 1024MB slices per read --- extern/sector-storage/fr32/readers.go | 12 ++++++++++-- extern/sector-storage/piece_provider.go | 17 +++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/extern/sector-storage/fr32/readers.go b/extern/sector-storage/fr32/readers.go index f14d5bf1c..163c520aa 100644 --- a/extern/sector-storage/fr32/readers.go +++ b/extern/sector-storage/fr32/readers.go @@ -16,13 +16,21 @@ type unpadReader struct { work []byte } +func BufSize(sz abi.PaddedPieceSize) int { + return int(MTTresh * mtChunkCount(sz)) +} + func NewUnpadReader(src io.Reader, sz abi.PaddedPieceSize) (io.Reader, error) { + buf := make([]byte, BufSize(sz)) + + return NewUnpadReaderBuf(src, sz, buf) +} + +func NewUnpadReaderBuf(src io.Reader, sz abi.PaddedPieceSize, buf []byte) (io.Reader, error) { if err := sz.Validate(); err != nil { return nil, xerrors.Errorf("bad piece size: %w", err) } - buf := make([]byte, MTTresh*mtChunkCount(sz)) - return &unpadReader{ src: src, diff --git a/extern/sector-storage/piece_provider.go b/extern/sector-storage/piece_provider.go index 2d9ca33be..4622289e8 100644 --- a/extern/sector-storage/piece_provider.go +++ b/extern/sector-storage/piece_provider.go @@ -94,6 +94,8 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return nil, nil } + buf := make([]byte, fr32.BufSize(size.Padded())) + pr, err := (&pieceReader{ ctx: ctx, getReader: func(ctx context.Context, startOffset uint64) (io.ReadCloser, error) { @@ -104,7 +106,7 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return nil, xerrors.Errorf("getting reader at +%d: %w", startOffsetAligned, err) } - upr, err := fr32.NewUnpadReader(r, size.Padded()) + upr, err := fr32.NewUnpadReaderBuf(r, size.Padded(), buf) if err != nil { r.Close() // nolint return nil, xerrors.Errorf("creating unpadded reader: %w", err) @@ -113,6 +115,7 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se bir := bufio.NewReaderSize(upr, 127) if startOffset > uint64(startOffsetAligned) { if _, err := bir.Discard(int(startOffset - uint64(startOffsetAligned))); err != nil { + r.Close() // nolint return nil, xerrors.Errorf("discarding bytes for startOffset: %w", err) } } @@ -122,7 +125,9 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se io.Closer }{ Reader: bir, - Closer: r, + Closer: funcCloser(func() error { + return r.Close() + }), }, nil }, len: size, @@ -137,6 +142,14 @@ func (p *pieceProvider) tryReadUnsealedPiece(ctx context.Context, pc cid.Cid, se return pr, err } +type funcCloser func() error + +func (f funcCloser) Close() error { + return f() +} + +var _ io.Closer = funcCloser(nil) + // ReadPiece is used to read an Unsealed piece at the given offset and of the given size from a Sector // If an Unsealed sector file exists with the Piece Unsealed in it, we'll use that for the read. // Otherwise, we will Unseal a Sealed sector file for the given sector and read the Unsealed piece from it. From 6fd160941019c29e2cbe7ade719b21d643ef74f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 16:14:47 +0100 Subject: [PATCH 036/157] fr32: Reduce MTTresh from 32M to 512k per core This results in 64x less bytes allocated when spawning new readers for larger pieces. Results in about 30% speedup in 1G unpad benchmark on AMD TR 2950x --- extern/sector-storage/fr32/fr32.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/sector-storage/fr32/fr32.go b/extern/sector-storage/fr32/fr32.go index 17e6a1142..24175719c 100644 --- a/extern/sector-storage/fr32/fr32.go +++ b/extern/sector-storage/fr32/fr32.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" ) -var MTTresh = uint64(32 << 20) +var MTTresh = uint64(512 << 10) func mtChunkCount(usz abi.PaddedPieceSize) uint64 { threads := (uint64(usz)) / MTTresh From c31f4de7d5560d7e0667fde6abcef5bf4dcbcd5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 16:26:59 +0100 Subject: [PATCH 037/157] Fix mock ReadPiece --- extern/sector-storage/mock/mock.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 4d0592d36..8eaed54f6 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -390,14 +390,16 @@ func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storage.SectorRef, o panic("implme") } + br := bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][:size]) + return struct { io.ReadCloser io.Seeker io.ReaderAt }{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(mgr.pieces[mgr.sectors[sector.ID].pieces[0]][:size])), - Seeker: nil, - ReaderAt: nil, + ReadCloser: ioutil.NopCloser(br), + Seeker: br, + ReaderAt: br, }, false, nil } From 74d3ba6b5e5ef5f09f9a062434bbd14f15e9bb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 9 Dec 2021 18:10:34 +0100 Subject: [PATCH 038/157] fix lint --- markets/dagstore/miner_api.go | 1 + 1 file changed, 1 insertion(+) diff --git a/markets/dagstore/miner_api.go b/markets/dagstore/miner_api.go index 7f59162f0..77b4b97bf 100644 --- a/markets/dagstore/miner_api.go +++ b/markets/dagstore/miner_api.go @@ -3,6 +3,7 @@ package dagstore import ( "context" "fmt" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" From 21e6c963ab26d29ccbd1ab01151e37712786c688 Mon Sep 17 00:00:00 2001 From: gstuart Date: Thu, 9 Dec 2021 19:51:22 -0500 Subject: [PATCH 039/157] Sort lotus-miner retrieval-deals by dealId --- cmd/lotus-miner/retrieval-deals.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/lotus-miner/retrieval-deals.go b/cmd/lotus-miner/retrieval-deals.go index 1ce1f6593..bd5d30a4e 100644 --- a/cmd/lotus-miner/retrieval-deals.go +++ b/cmd/lotus-miner/retrieval-deals.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os" + "sort" "text/tabwriter" "github.com/docker/go-units" @@ -137,6 +138,10 @@ var retrievalDealsListCmd = &cli.Command{ return err } + sort.Slice(deals, func(i, j int) bool { + return deals[i].ID < deals[j].ID + }) + w := tabwriter.NewWriter(os.Stdout, 2, 4, 2, ' ', 0) _, _ = fmt.Fprintf(w, "Receiver\tDealID\tPayload\tState\tPricePerByte\tBytesSent\tMessage\n") From f7a49e7be7566ed07d3676a6115d414e861cf827 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Dec 2021 21:01:20 -0500 Subject: [PATCH 040/157] update to ipld-legacy to v0.1.1 --- go.mod | 11 +++++++---- go.sum | 30 +++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index a9b0bee9d..43b007a76 100644 --- a/go.mod +++ b/go.mod @@ -90,6 +90,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.5 github.com/ipfs/go-ipld-format v0.2.0 + github.com/ipfs/go-ipld-legacy v0.1.1 // indirect github.com/ipfs/go-log/v2 v2.3.0 github.com/ipfs/go-merkledag v0.4.1 github.com/ipfs/go-metrics-interface v0.0.1 @@ -100,7 +101,7 @@ require ( github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.12.3 + github.com/ipld/go-ipld-prime v0.14.2 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 @@ -127,7 +128,7 @@ require ( github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.16 + github.com/multiformats/go-multihash v0.1.0 github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 @@ -155,14 +156,16 @@ require ( go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 - golang.org/x/net v0.0.0-20210917221730-978cfadd31cf + golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 + golang.org/x/sys v0.0.0-20211209171907-798191bca915 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.5 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible + lukechampine.com/blake3 v1.1.7 // indirect ) replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi diff --git a/go.sum b/go.sum index 241b98887..245a03caa 100644 --- a/go.sum +++ b/go.sum @@ -407,8 +407,9 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -803,8 +804,9 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= +github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= +github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -879,8 +881,9 @@ github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvB github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.2 h1:P5fO2usnisXwrN/1sR5exCgEvINg/w/27EuYPKB/zx8= +github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= @@ -972,8 +975,9 @@ github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1493,8 +1497,8 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= -github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1671,6 +1675,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -2008,8 +2014,9 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2123,8 +2130,9 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2247,8 +2255,9 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2505,6 +2514,9 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From 276eabd4e51170ac0c1e25d14139617505f2ca8f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Dec 2021 22:31:46 -0500 Subject: [PATCH 041/157] Update go-storedcounter and go-ds-versioning --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 656bbaabb..e274b2a0b 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 - github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 + github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a github.com/filecoin-project/go-fil-commcid v0.1.0 @@ -43,7 +43,7 @@ require ( github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 - github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b + github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 28900d545..2c6c36b2b 100644 --- a/go.sum +++ b/go.sum @@ -319,8 +319,9 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= +github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= @@ -372,8 +373,9 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= From 702a7815b92535a6adaa7d632da50bc23752ee79 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Dec 2021 22:46:30 -0500 Subject: [PATCH 042/157] Update go-car --- go.mod | 8 ++++---- go.sum | 24 ++++++++++++++++-------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index e274b2a0b..6a70a137a 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 - github.com/ipfs/go-ipfs-blockstore v1.1.1 + github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-ds-help v1.1.0 @@ -97,10 +97,10 @@ require ( github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 - github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 + github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.12.3 + github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 @@ -127,7 +127,7 @@ require ( github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.16 + github.com/multiformats/go-multihash v0.1.0 github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 diff --git a/go.sum b/go.sum index 2c6c36b2b..e3d35d47a 100644 --- a/go.sum +++ b/go.sum @@ -410,8 +410,9 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -763,8 +764,8 @@ github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= -github.com/ipfs/go-ipfs-blockstore v1.1.1 h1:a4koS3l+Fzl43LAAn51/N+Yn4AjCX4AGvoZLqqkrD/g= -github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -875,8 +876,9 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= @@ -892,8 +894,9 @@ github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvB github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= @@ -984,8 +987,9 @@ github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1528,8 +1532,8 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= -github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1706,6 +1710,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -2540,6 +2546,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From e8ef39e734175cad5633a0a7bac69285874a5979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 10 Dec 2021 11:28:04 +0100 Subject: [PATCH 043/157] stores: Reduce log spam during retrievals --- extern/sector-storage/stores/http_handler.go | 1 - extern/sector-storage/stores/remote.go | 1 - 2 files changed, 2 deletions(-) diff --git a/extern/sector-storage/stores/http_handler.go b/extern/sector-storage/stores/http_handler.go index 5996392d8..771a9a3a1 100644 --- a/extern/sector-storage/stores/http_handler.go +++ b/extern/sector-storage/stores/http_handler.go @@ -84,7 +84,6 @@ func (handler *FetchHandler) remoteStatFs(w http.ResponseWriter, r *http.Request // remoteGetSector returns the sector file/tared directory byte stream for the sectorID and sector file type sent in the request. // returns an error if it does NOT have the required sector file/dir. func (handler *FetchHandler) remoteGetSector(w http.ResponseWriter, r *http.Request) { - log.Infof("SERVE GET %s", r.URL) vars := mux.Vars(r) id, err := storiface.ParseSectorID(vars["id"]) diff --git a/extern/sector-storage/stores/remote.go b/extern/sector-storage/stores/remote.go index 0681026c9..bd6b34be3 100644 --- a/extern/sector-storage/stores/remote.go +++ b/extern/sector-storage/stores/remote.go @@ -719,7 +719,6 @@ func (r *Remote) Reader(ctx context.Context, s storage.SectorRef, offset, size a log.Warnw("reading from remote", "url", url, "error", err) return nil, err } - log.Infof("Read remote %s (+%d,%d)", url, offset, size) return rd, err }, nil From 8e376c84cf47b808595545f7ad099b6e78c5e280 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 2 Dec 2021 05:44:59 -0800 Subject: [PATCH 044/157] feat(tracing): setup logging --- lib/tracing/setup.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/tracing/setup.go b/lib/tracing/setup.go index 1a2d8128e..d90099f79 100644 --- a/lib/tracing/setup.go +++ b/lib/tracing/setup.go @@ -11,6 +11,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" tracesdk "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.7.0" + "go.uber.org/zap" logging "github.com/ipfs/go-log/v2" ) @@ -50,7 +51,7 @@ func jaegerOptsFromEnv() jaeger.EndpointOption { } if e, ok = os.LookupEnv(envAgentHost); ok { - options := []jaeger.AgentEndpointOption{jaeger.WithAgentHost(e)} + options := []jaeger.AgentEndpointOption{jaeger.WithAgentHost(e), jaeger.WithLogger(zap.NewStdLog(log.Desugar()))} var ep string if p, ok := os.LookupEnv(envAgentPort); ok { options = append(options, jaeger.WithAgentPort(p)) @@ -82,6 +83,7 @@ func SetupJaegerTracing(serviceName string) *tracesdk.TracerProvider { semconv.SchemaURL, semconv.ServiceNameKey.String(serviceName), )), + tracesdk.WithSampler(tracesdk.AlwaysSample()), ) otel.SetTracerProvider(tp) tracer := tp.Tracer(serviceName) From 9108828aeb0888f71aae6fd9be92e32ab05c3bdb Mon Sep 17 00:00:00 2001 From: gstuart Date: Fri, 10 Dec 2021 17:27:44 -0500 Subject: [PATCH 045/157] Make Lotus vm gas tracing an env var --- chain/vm/runtime.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 6e94030bd..72f4daab8 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -5,6 +5,7 @@ import ( "context" "encoding/binary" "fmt" + "os" gruntime "runtime" "time" @@ -52,7 +53,7 @@ func (m *Message) ValueReceived() abi.TokenAmount { } // EnableGasTracing, if true, outputs gas tracing in execution traces. -var EnableGasTracing = false +var EnableGasTracing = os.Getenv("LOTUS_VM_ENABLE_GAS_TRACING_VERY_SLOW") == "1" type Runtime struct { rt5.Message From 095361beade24dc795981c88dc817c492538227c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Dec 2021 19:15:53 -0500 Subject: [PATCH 046/157] Update carv2 --- go.mod | 2 +- go.sum | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6a70a137a..34ddb4288 100644 --- a/go.mod +++ b/go.mod @@ -98,7 +98,7 @@ require ( github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 - github.com/ipld/go-car/v2 v2.1.0 + github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 github.com/ipld/go-ipld-selector-text-lite v0.0.1 diff --git a/go.sum b/go.sum index e3d35d47a..b282a127a 100644 --- a/go.sum +++ b/go.sum @@ -880,8 +880,9 @@ github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -895,12 +896,15 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= From 6c31cecc7d46821fff75210d9437e355dc5d3ad7 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 14:37:37 -0500 Subject: [PATCH 047/157] Update markets --- go.mod | 6 ++-- go.sum | 94 +++++++--------------------------------------------------- 2 files changed, 13 insertions(+), 87 deletions(-) diff --git a/go.mod b/go.mod index 34ddb4288..0b689b6a6 100644 --- a/go.mod +++ b/go.mod @@ -26,17 +26,17 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.2 + github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a + github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.4 + github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index b282a127a..b48bcc812 100644 --- a/go.sum +++ b/go.sum @@ -301,8 +301,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.2 h1:Ae2+O1DhKCI1JbOZCBkqUksKYofdbRbjkS7OF0A6Jw0= -github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -319,28 +319,23 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a h1:eSKovm26xNSTE/OFc+9zkt7sotMb0ixumKAO11BNMbs= -github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.4 h1:NAu+ACelR2mYsj+yJ4iLu8FGqWK50OnU5VF8axkLsSc= -github.com/filecoin-project/go-fil-markets v1.13.4/go.mod h1:aANjXD2XMHWnT2zWpyGWLsWLC24C4mHm0gRm85OpPWE= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969 h1:5N/aEyr+uuJC1dd+rdFgV+RQT7o6LqfkshSh8en3YiI= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -350,7 +345,6 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AG github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -370,18 +364,14 @@ github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/g github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= @@ -676,8 +666,6 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -686,9 +674,6 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -700,7 +685,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -713,7 +697,6 @@ github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRV github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= @@ -727,7 +710,6 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= @@ -744,26 +726,18 @@ github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvV github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -811,7 +785,6 @@ github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdr github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= @@ -844,7 +817,6 @@ github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72g github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= @@ -856,8 +828,6 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= @@ -874,35 +844,23 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= -github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= @@ -979,7 +937,6 @@ github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1028,16 +985,12 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= -github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= @@ -1052,7 +1005,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= @@ -1071,7 +1023,6 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= @@ -1190,7 +1141,6 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= @@ -1217,10 +1167,8 @@ github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0 h1:nRHNRhi86L7jhka02N4MoV+PSFFPoJFkHNQwCTFxNhw= @@ -1247,7 +1195,6 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2 github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= @@ -1264,8 +1211,6 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0 h1:TKayW983n92JhCGdCo7ej7eEb+DQ0VYfKNOxlN/1kNQ= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= @@ -1328,7 +1273,6 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= @@ -1356,8 +1300,6 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= @@ -1365,7 +1307,6 @@ github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0 github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= @@ -1386,10 +1327,8 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= @@ -1438,7 +1377,6 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1523,8 +1461,6 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= @@ -1542,7 +1478,6 @@ github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wS github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1583,7 +1518,6 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= @@ -1594,7 +1528,6 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= @@ -1810,7 +1743,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1867,7 +1799,6 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIf github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2034,7 +1965,6 @@ golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2101,7 +2031,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2119,7 +2048,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2374,12 +2302,10 @@ golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= From dfb65ed89f67c7d4adc2cc1f00a10b2b345d9926 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 16:03:00 -0500 Subject: [PATCH 048/157] Plumb contexts through --- blockstore/api.go | 2 +- blockstore/badger/blockstore.go | 2 +- blockstore/buffered.go | 6 +- blockstore/discard.go | 4 +- blockstore/idstore.go | 4 +- blockstore/ipfs.go | 2 +- blockstore/mem.go | 2 +- blockstore/splitstore/splitstore.go | 46 +++--- blockstore/splitstore/splitstore_check.go | 4 +- blockstore/splitstore/splitstore_compact.go | 20 +-- blockstore/splitstore/splitstore_expose.go | 36 ++--- blockstore/splitstore/splitstore_warmup.go | 14 +- blockstore/sync.go | 2 +- blockstore/union.go | 4 +- chain/checkpoint.go | 8 +- chain/consensus/filcns/compute_state.go | 2 +- chain/consensus/filcns/filecoin.go | 4 +- chain/consensus/filcns/mine.go | 2 +- chain/consensus/filcns/upgrades.go | 2 +- chain/exchange/server.go | 6 +- chain/gen/gen.go | 4 +- chain/gen/genesis/genesis.go | 6 +- chain/gen/slashfilter/slashfilter.go | 21 +-- chain/market/fundmanager.go | 4 +- chain/market/store.go | 13 +- chain/messagepool/config.go | 15 +- chain/messagepool/messagepool.go | 16 +- chain/messagepool/provider.go | 6 +- chain/messagepool/pruning.go | 2 +- chain/messagepool/selection.go | 8 +- chain/messagesigner/messagesigner.go | 8 +- chain/rand/rand.go | 10 +- chain/stmgr/actors.go | 5 +- chain/stmgr/call.go | 8 +- chain/stmgr/read.go | 8 +- chain/stmgr/searchwait.go | 14 +- chain/stmgr/stmgr.go | 6 +- chain/stmgr/supply.go | 2 +- chain/stmgr/utils.go | 2 +- chain/store/index.go | 32 ++-- chain/store/messages.go | 6 +- chain/store/snapshot.go | 19 +-- chain/store/store.go | 160 ++++++++++---------- chain/sync.go | 32 ++-- chain/vm/vm.go | 26 ++-- chain/wallet/ledger/ledger.go | 22 +-- cli/backup.go | 2 +- go.mod | 8 +- go.sum | 16 +- markets/dagstore/blockstore.go | 7 +- markets/storageadapter/provider.go | 2 +- miner/miner.go | 2 +- node/hello/hello.go | 2 +- node/impl/backup.go | 5 +- node/impl/client/client.go | 8 +- node/impl/full.go | 2 +- node/impl/full/chain.go | 42 ++--- node/impl/full/gas.go | 14 +- node/impl/full/mpool.go | 8 +- node/impl/full/state.go | 76 +++++----- node/impl/full/sync.go | 6 +- node/impl/paych/paych.go | 12 +- node/impl/storminer.go | 6 +- node/modules/lp2p/host.go | 4 +- node/repo/imports/manager.go | 24 ++- paychmgr/accessorcache.go | 10 +- paychmgr/manager.go | 52 +++---- paychmgr/paych.go | 38 ++--- paychmgr/simple.go | 90 +++++------ paychmgr/store.go | 85 ++++++----- storage/sectorblocks/blocks.go | 24 +-- 71 files changed, 595 insertions(+), 577 deletions(-) diff --git a/blockstore/api.go b/blockstore/api.go index 348c0f84e..dc4c03452 100644 --- a/blockstore/api.go +++ b/blockstore/api.go @@ -61,6 +61,6 @@ func (a *apiBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) return nil, xerrors.New("not supported") } -func (a *apiBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (a *apiBlockstore) HashOnRead(enabled bool) { return } diff --git a/blockstore/badger/blockstore.go b/blockstore/badger/blockstore.go index e81e5838c..270e5b820 100644 --- a/blockstore/badger/blockstore.go +++ b/blockstore/badger/blockstore.go @@ -927,7 +927,7 @@ func (b *Blockstore) ForEachKey(f func(cid.Cid) error) error { // HashOnRead implements Blockstore.HashOnRead. It is not supported by this // blockstore. -func (b *Blockstore) HashOnRead(ctx context.Context, _ bool) { +func (b *Blockstore) HashOnRead(_ bool) { log.Warnf("called HashOnRead on badger blockstore; function not supported; ignoring") } diff --git a/blockstore/buffered.go b/blockstore/buffered.go index 846156fc8..8e23b5362 100644 --- a/blockstore/buffered.go +++ b/blockstore/buffered.go @@ -160,9 +160,9 @@ func (bs *BufferedBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) return bs.read.Has(ctx, c) } -func (bs *BufferedBlockstore) HashOnRead(ctx context.Context, hor bool) { - bs.read.HashOnRead(ctx, hor) - bs.write.HashOnRead(ctx, hor) +func (bs *BufferedBlockstore) HashOnRead(hor bool) { + bs.read.HashOnRead(hor) + bs.write.HashOnRead(hor) } func (bs *BufferedBlockstore) PutMany(ctx context.Context, blks []block.Block) error { diff --git a/blockstore/discard.go b/blockstore/discard.go index e377d427b..575c752d4 100644 --- a/blockstore/discard.go +++ b/blockstore/discard.go @@ -22,8 +22,8 @@ func (b *discardstore) Has(ctx context.Context, cid cid.Cid) (bool, error) { return b.bs.Has(ctx, cid) } -func (b *discardstore) HashOnRead(ctx context.Context, hor bool) { - b.bs.HashOnRead(ctx, hor) +func (b *discardstore) HashOnRead(hor bool) { + b.bs.HashOnRead(hor) } func (b *discardstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { diff --git a/blockstore/idstore.go b/blockstore/idstore.go index d0553158b..c6281998a 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -162,8 +162,8 @@ func (b *idstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { return b.bs.AllKeysChan(ctx) } -func (b *idstore) HashOnRead(ctx context.Context, enabled bool) { - b.bs.HashOnRead(ctx, enabled) +func (b *idstore) HashOnRead(enabled bool) { + b.bs.HashOnRead(enabled) } func (b *idstore) Close() error { diff --git a/blockstore/ipfs.go b/blockstore/ipfs.go index 47662c651..787c71d7d 100644 --- a/blockstore/ipfs.go +++ b/blockstore/ipfs.go @@ -150,6 +150,6 @@ func (i *IPFSBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return nil, xerrors.Errorf("not supported") } -func (i *IPFSBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (i *IPFSBlockstore) HashOnRead(enabled bool) { return // TODO: We could technically support this, but.. } diff --git a/blockstore/mem.go b/blockstore/mem.go index a2655148f..d6b14f002 100644 --- a/blockstore/mem.go +++ b/blockstore/mem.go @@ -97,6 +97,6 @@ func (m MemBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) // HashOnRead specifies if every read block should be // rehashed to make sure it matches its CID. -func (m MemBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (m MemBlockstore) HashOnRead(enabled bool) { // no-op } diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index 145e31d7a..f6715ea33 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -216,17 +216,17 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co } // Blockstore interface -func (s *SplitStore) DeleteBlock(_ cid.Cid) error { +func (s *SplitStore) DeleteBlock(_ context.Context, _ cid.Cid) error { // afaict we don't seem to be using this method, so it's not implemented return errors.New("DeleteBlock not implemented on SplitStore; don't do this Luke!") //nolint } -func (s *SplitStore) DeleteMany(_ []cid.Cid) error { +func (s *SplitStore) DeleteMany(_ context.Context, _ []cid.Cid) error { // afaict we don't seem to be using this method, so it's not implemented return errors.New("DeleteMany not implemented on SplitStore; don't do this Luke!") //nolint } -func (s *SplitStore) Has(cid cid.Cid) (bool, error) { +func (s *SplitStore) Has(ctx context.Context, cid cid.Cid) (bool, error) { if isIdentiyCid(cid) { return true, nil } @@ -234,7 +234,7 @@ func (s *SplitStore) Has(cid cid.Cid) (bool, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() - has, err := s.hot.Has(cid) + has, err := s.hot.Has(ctx, cid) if err != nil { return has, err @@ -245,10 +245,10 @@ func (s *SplitStore) Has(cid cid.Cid) (bool, error) { return true, nil } - return s.cold.Has(cid) + return s.cold.Has(ctx, cid) } -func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { +func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { if isIdentiyCid(cid) { data, err := decodeIdentityCid(cid) if err != nil { @@ -261,7 +261,7 @@ func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() - blk, err := s.hot.Get(cid) + blk, err := s.hot.Get(ctx, cid) switch err { case nil: @@ -273,7 +273,7 @@ func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { s.debug.LogReadMiss(cid) } - blk, err = s.cold.Get(cid) + blk, err = s.cold.Get(ctx, cid) if err == nil { stats.Record(s.ctx, metrics.SplitstoreMiss.M(1)) @@ -285,7 +285,7 @@ func (s *SplitStore) Get(cid cid.Cid) (blocks.Block, error) { } } -func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { +func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { if isIdentiyCid(cid) { data, err := decodeIdentityCid(cid) if err != nil { @@ -298,7 +298,7 @@ func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { s.txnLk.RLock() defer s.txnLk.RUnlock() - size, err := s.hot.GetSize(cid) + size, err := s.hot.GetSize(ctx, cid) switch err { case nil: @@ -310,7 +310,7 @@ func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { s.debug.LogReadMiss(cid) } - size, err = s.cold.GetSize(cid) + size, err = s.cold.GetSize(ctx, cid) if err == nil { stats.Record(s.ctx, metrics.SplitstoreMiss.M(1)) } @@ -321,7 +321,7 @@ func (s *SplitStore) GetSize(cid cid.Cid) (int, error) { } } -func (s *SplitStore) Put(blk blocks.Block) error { +func (s *SplitStore) Put(ctx context.Context, blk blocks.Block) error { if isIdentiyCid(blk.Cid()) { return nil } @@ -329,7 +329,7 @@ func (s *SplitStore) Put(blk blocks.Block) error { s.txnLk.RLock() defer s.txnLk.RUnlock() - err := s.hot.Put(blk) + err := s.hot.Put(ctx, blk) if err != nil { return err } @@ -340,7 +340,7 @@ func (s *SplitStore) Put(blk blocks.Block) error { return nil } -func (s *SplitStore) PutMany(blks []blocks.Block) error { +func (s *SplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { // filter identites idcids := 0 for _, blk := range blks { @@ -374,7 +374,7 @@ func (s *SplitStore) PutMany(blks []blocks.Block) error { s.txnLk.RLock() defer s.txnLk.RUnlock() - err := s.hot.PutMany(blks) + err := s.hot.PutMany(ctx, blks) if err != nil { return err } @@ -430,7 +430,7 @@ func (s *SplitStore) HashOnRead(enabled bool) { s.cold.HashOnRead(enabled) } -func (s *SplitStore) View(cid cid.Cid, cb func([]byte) error) error { +func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) error) error { if isIdentiyCid(cid) { data, err := decodeIdentityCid(cid) if err != nil { @@ -451,14 +451,14 @@ func (s *SplitStore) View(cid cid.Cid, cb func([]byte) error) error { s.protectView(cid) defer s.viewDone() - err := s.hot.View(cid, cb) + err := s.hot.View(ctx, cid, cb) switch err { case bstore.ErrNotFound: if s.isWarm() { s.debug.LogReadMiss(cid) } - err = s.cold.View(cid, cb) + err = s.cold.View(ctx, cid, cb) if err == nil { stats.Record(s.ctx, metrics.SplitstoreMiss.M(1)) } @@ -502,7 +502,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error // load base epoch from metadata ds // if none, then use current epoch because it's a fresh start - bs, err := s.ds.Get(baseEpochKey) + bs, err := s.ds.Get(s.ctx, baseEpochKey) switch err { case nil: s.baseEpoch = bytesToEpoch(bs) @@ -523,7 +523,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error } // load warmup epoch from metadata ds - bs, err = s.ds.Get(warmupEpochKey) + bs, err = s.ds.Get(s.ctx, warmupEpochKey) switch err { case nil: s.warmupEpoch = bytesToEpoch(bs) @@ -536,7 +536,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error } // load markSetSize from metadata ds to provide a size hint for marksets - bs, err = s.ds.Get(markSetSizeKey) + bs, err = s.ds.Get(s.ctx, markSetSizeKey) switch err { case nil: s.markSetSize = bytesToInt64(bs) @@ -547,7 +547,7 @@ func (s *SplitStore) Start(chain ChainAccessor, us stmgr.UpgradeSchedule) error } // load compactionIndex from metadata ds to provide a hint as to when to perform moving gc - bs, err = s.ds.Get(compactionIndexKey) + bs, err = s.ds.Get(s.ctx, compactionIndexKey) switch err { case nil: s.compactionIndex = bytesToInt64(bs) @@ -609,5 +609,5 @@ func (s *SplitStore) checkClosing() error { func (s *SplitStore) setBaseEpoch(epoch abi.ChainEpoch) error { s.baseEpoch = epoch - return s.ds.Put(baseEpochKey, epochToBytes(epoch)) + return s.ds.Put(s.ctx, baseEpochKey, epochToBytes(epoch)) } diff --git a/blockstore/splitstore/splitstore_check.go b/blockstore/splitstore/splitstore_check.go index 8907abf9e..c83ed7b28 100644 --- a/blockstore/splitstore/splitstore_check.go +++ b/blockstore/splitstore/splitstore_check.go @@ -96,7 +96,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { return errStopWalk } - has, err := s.hot.Has(c) + has, err := s.hot.Has(s.ctx, c) if err != nil { return xerrors.Errorf("error checking hotstore: %w", err) } @@ -105,7 +105,7 @@ func (s *SplitStore) doCheck(curTs *types.TipSet) error { return nil } - has, err = s.cold.Has(c) + has, err = s.cold.Has(s.ctx, c) if err != nil { return xerrors.Errorf("error checking coldstore: %w", err) } diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 04c2562fa..13ab90ac0 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -577,13 +577,13 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error { return xerrors.Errorf("error saving base epoch: %w", err) } - err = s.ds.Put(markSetSizeKey, int64ToBytes(s.markSetSize)) + err = s.ds.Put(s.ctx, markSetSizeKey, int64ToBytes(s.markSetSize)) if err != nil { return xerrors.Errorf("error saving mark set size: %w", err) } s.compactionIndex++ - err = s.ds.Put(compactionIndexKey, int64ToBytes(s.compactionIndex)) + err = s.ds.Put(s.ctx, compactionIndexKey, int64ToBytes(s.compactionIndex)) if err != nil { return xerrors.Errorf("error saving compaction index: %w", err) } @@ -835,10 +835,10 @@ func (s *SplitStore) view(c cid.Cid, cb func([]byte) error) error { return cb(data) } - err := s.hot.View(c, cb) + err := s.hot.View(s.ctx, c, cb) switch err { case bstore.ErrNotFound: - return s.cold.View(c, cb) + return s.cold.View(s.ctx, c, cb) default: return err @@ -850,13 +850,13 @@ func (s *SplitStore) has(c cid.Cid) (bool, error) { return true, nil } - has, err := s.hot.Has(c) + has, err := s.hot.Has(s.ctx, c) if has || err != nil { return has, err } - return s.cold.Has(c) + return s.cold.Has(s.ctx, c) } func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { @@ -867,7 +867,7 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { return err } - blk, err := s.hot.Get(c) + blk, err := s.hot.Get(s.ctx, c) if err != nil { if err == bstore.ErrNotFound { log.Warnf("hotstore missing block %s", c) @@ -879,7 +879,7 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { batch = append(batch, blk) if len(batch) == batchSize { - err = s.cold.PutMany(batch) + err = s.cold.PutMany(s.ctx, batch) if err != nil { return xerrors.Errorf("error putting batch to coldstore: %w", err) } @@ -888,7 +888,7 @@ func (s *SplitStore) moveColdBlocks(cold []cid.Cid) error { } if len(batch) > 0 { - err := s.cold.PutMany(batch) + err := s.cold.PutMany(s.ctx, batch) if err != nil { return xerrors.Errorf("error putting batch to coldstore: %w", err) } @@ -1058,7 +1058,7 @@ func (s *SplitStore) purge(cids []cid.Cid, markSet MarkSetVisitor) error { deadCids = append(deadCids, c) } - err := s.hot.DeleteMany(deadCids) + err := s.hot.DeleteMany(s.ctx, deadCids) if err != nil { return xerrors.Errorf("error purging cold objects: %w", err) } diff --git a/blockstore/splitstore/splitstore_expose.go b/blockstore/splitstore/splitstore_expose.go index 1065e460c..6f838229d 100644 --- a/blockstore/splitstore/splitstore_expose.go +++ b/blockstore/splitstore/splitstore_expose.go @@ -20,28 +20,28 @@ func (s *SplitStore) Expose() bstore.Blockstore { return &exposedSplitStore{s: s} } -func (es *exposedSplitStore) DeleteBlock(_ cid.Cid) error { +func (es *exposedSplitStore) DeleteBlock(_ context.Context, _ cid.Cid) error { return errors.New("DeleteBlock: operation not supported") } -func (es *exposedSplitStore) DeleteMany(_ []cid.Cid) error { +func (es *exposedSplitStore) DeleteMany(_ context.Context, _ []cid.Cid) error { return errors.New("DeleteMany: operation not supported") } -func (es *exposedSplitStore) Has(c cid.Cid) (bool, error) { +func (es *exposedSplitStore) Has(ctx context.Context, c cid.Cid) (bool, error) { if isIdentiyCid(c) { return true, nil } - has, err := es.s.hot.Has(c) + has, err := es.s.hot.Has(ctx, c) if has || err != nil { return has, err } - return es.s.cold.Has(c) + return es.s.cold.Has(ctx, c) } -func (es *exposedSplitStore) Get(c cid.Cid) (blocks.Block, error) { +func (es *exposedSplitStore) Get(ctx context.Context, c cid.Cid) (blocks.Block, error) { if isIdentiyCid(c) { data, err := decodeIdentityCid(c) if err != nil { @@ -51,16 +51,16 @@ func (es *exposedSplitStore) Get(c cid.Cid) (blocks.Block, error) { return blocks.NewBlockWithCid(data, c) } - blk, err := es.s.hot.Get(c) + blk, err := es.s.hot.Get(ctx, c) switch err { case bstore.ErrNotFound: - return es.s.cold.Get(c) + return es.s.cold.Get(ctx, c) default: return blk, err } } -func (es *exposedSplitStore) GetSize(c cid.Cid) (int, error) { +func (es *exposedSplitStore) GetSize(ctx context.Context, c cid.Cid) (int, error) { if isIdentiyCid(c) { data, err := decodeIdentityCid(c) if err != nil { @@ -70,21 +70,21 @@ func (es *exposedSplitStore) GetSize(c cid.Cid) (int, error) { return len(data), nil } - size, err := es.s.hot.GetSize(c) + size, err := es.s.hot.GetSize(ctx, c) switch err { case bstore.ErrNotFound: - return es.s.cold.GetSize(c) + return es.s.cold.GetSize(ctx, c) default: return size, err } } -func (es *exposedSplitStore) Put(blk blocks.Block) error { - return es.s.Put(blk) +func (es *exposedSplitStore) Put(ctx context.Context, blk blocks.Block) error { + return es.s.Put(ctx, blk) } -func (es *exposedSplitStore) PutMany(blks []blocks.Block) error { - return es.s.PutMany(blks) +func (es *exposedSplitStore) PutMany(ctx context.Context, blks []blocks.Block) error { + return es.s.PutMany(ctx, blks) } func (es *exposedSplitStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { @@ -93,7 +93,7 @@ func (es *exposedSplitStore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, e func (es *exposedSplitStore) HashOnRead(enabled bool) {} -func (es *exposedSplitStore) View(c cid.Cid, f func([]byte) error) error { +func (es *exposedSplitStore) View(ctx context.Context, c cid.Cid, f func([]byte) error) error { if isIdentiyCid(c) { data, err := decodeIdentityCid(c) if err != nil { @@ -103,10 +103,10 @@ func (es *exposedSplitStore) View(c cid.Cid, f func([]byte) error) error { return f(data) } - err := es.s.hot.View(c, f) + err := es.s.hot.View(ctx, c, f) switch err { case bstore.ErrNotFound: - return es.s.cold.View(c, f) + return es.s.cold.View(ctx, c, f) default: return err diff --git a/blockstore/splitstore/splitstore_warmup.go b/blockstore/splitstore/splitstore_warmup.go index 216de571a..2a39f6c9d 100644 --- a/blockstore/splitstore/splitstore_warmup.go +++ b/blockstore/splitstore/splitstore_warmup.go @@ -75,7 +75,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { count++ - has, err := s.hot.Has(c) + has, err := s.hot.Has(s.ctx, c) if err != nil { return err } @@ -84,7 +84,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { return nil } - blk, err := s.cold.Get(c) + blk, err := s.cold.Get(s.ctx, c) if err != nil { if err == bstore.ErrNotFound { missing++ @@ -97,7 +97,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { batchHot = append(batchHot, blk) if len(batchHot) == batchSize { - err = s.hot.PutMany(batchHot) + err = s.hot.PutMany(s.ctx, batchHot) if err != nil { return err } @@ -112,7 +112,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { } if len(batchHot) > 0 { - err = s.hot.PutMany(batchHot) + err = s.hot.PutMany(s.ctx, batchHot) if err != nil { return err } @@ -121,13 +121,13 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { log.Infow("warmup stats", "visited", count, "warm", xcount, "missing", missing) s.markSetSize = count + count>>2 // overestimate a bit - err = s.ds.Put(markSetSizeKey, int64ToBytes(s.markSetSize)) + err = s.ds.Put(s.ctx, markSetSizeKey, int64ToBytes(s.markSetSize)) if err != nil { log.Warnf("error saving mark set size: %s", err) } // save the warmup epoch - err = s.ds.Put(warmupEpochKey, epochToBytes(epoch)) + err = s.ds.Put(s.ctx, warmupEpochKey, epochToBytes(epoch)) if err != nil { return xerrors.Errorf("error saving warm up epoch: %w", err) } @@ -136,7 +136,7 @@ func (s *SplitStore) doWarmup(curTs *types.TipSet) error { s.mx.Unlock() // also save the compactionIndex, as this is used as an indicator of warmup for upgraded nodes - err = s.ds.Put(compactionIndexKey, int64ToBytes(s.compactionIndex)) + err = s.ds.Put(s.ctx, compactionIndexKey, int64ToBytes(s.compactionIndex)) if err != nil { return xerrors.Errorf("error saving compaction index: %w", err) } diff --git a/blockstore/sync.go b/blockstore/sync.go index 11a92359d..1b4ad8297 100644 --- a/blockstore/sync.go +++ b/blockstore/sync.go @@ -76,6 +76,6 @@ func (m *SyncBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return m.bs.AllKeysChan(ctx) } -func (m *SyncBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (m *SyncBlockstore) HashOnRead(enabled bool) { // noop } diff --git a/blockstore/union.go b/blockstore/union.go index e115458c2..f54a86590 100644 --- a/blockstore/union.go +++ b/blockstore/union.go @@ -112,8 +112,8 @@ func (m unionBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error return outCh, nil } -func (m unionBlockstore) HashOnRead(ctx context.Context, enabled bool) { +func (m unionBlockstore) HashOnRead(enabled bool) { for _, bs := range m { - bs.HashOnRead(ctx, enabled) + bs.HashOnRead(enabled) } } diff --git a/chain/checkpoint.go b/chain/checkpoint.go index a3660a45c..4f8310593 100644 --- a/chain/checkpoint.go +++ b/chain/checkpoint.go @@ -13,7 +13,7 @@ func (syncer *Syncer) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) e return xerrors.Errorf("called with empty tsk") } - ts, err := syncer.ChainStore().LoadTipSet(tsk) + ts, err := syncer.ChainStore().LoadTipSet(ctx, tsk) if err != nil { tss, err := syncer.Exchange.GetBlocks(ctx, tsk, 1) if err != nil { @@ -28,7 +28,7 @@ func (syncer *Syncer) SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) e return xerrors.Errorf("failed to switch chain when syncing checkpoint: %w", err) } - if err := syncer.ChainStore().SetCheckpoint(ts); err != nil { + if err := syncer.ChainStore().SetCheckpoint(ctx, ts); err != nil { return xerrors.Errorf("failed to set the chain checkpoint: %w", err) } @@ -41,7 +41,7 @@ func (syncer *Syncer) switchChain(ctx context.Context, ts *types.TipSet) error { return nil } - if anc, err := syncer.store.IsAncestorOf(ts, hts); err == nil && anc { + if anc, err := syncer.store.IsAncestorOf(ctx, ts, hts); err == nil && anc { return nil } @@ -50,7 +50,7 @@ func (syncer *Syncer) switchChain(ctx context.Context, ts *types.TipSet) error { return xerrors.Errorf("failed to collect chain for checkpoint: %w", err) } - if err := syncer.ChainStore().SetHead(ts); err != nil { + if err := syncer.ChainStore().SetHead(ctx, ts); err != nil { return xerrors.Errorf("failed to set the chain head: %w", err) } return nil diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 3c333298e..1bc5763b2 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -289,7 +289,7 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, sm *stmgr.StateManag var parentEpoch abi.ChainEpoch pstate := blks[0].ParentStateRoot if blks[0].Height > 0 { - parent, err := sm.ChainStore().GetBlock(blks[0].Parents[0]) + parent, err := sm.ChainStore().GetBlock(ctx, blks[0].Parents[0]) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("getting parent block: %w", err) } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 883edd9a1..7f2eaa273 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -90,7 +90,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) h := b.Header - baseTs, err := filec.store.LoadTipSet(types.NewTipSetKey(h.Parents...)) + baseTs, err := filec.store.LoadTipSet(ctx, types.NewTipSetKey(h.Parents...)) if err != nil { return xerrors.Errorf("load parent tipset failed (%s): %w", h.Parents, err) } @@ -102,7 +102,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) return xerrors.Errorf("failed to get lookback tipset for block: %w", err) } - prevBeacon, err := filec.store.GetLatestBeaconEntry(baseTs) + prevBeacon, err := filec.store.GetLatestBeaconEntry(ctx, baseTs) if err != nil { return xerrors.Errorf("failed to get latest beacon entry: %w", err) } diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index bbda35fcf..bb4931297 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -15,7 +15,7 @@ import ( ) func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api.BlockTemplate) (*types.FullBlock, error) { - pts, err := filec.sm.ChainStore().LoadTipSet(bt.Parents) + pts, err := filec.sm.ChainStore().LoadTipSet(ctx, bt.Parents) if err != nil { return nil, xerrors.Errorf("failed to load parent tipset: %w", err) } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index cf4c62bf3..546c491a9 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -625,7 +625,7 @@ func splitGenesisMultisig0(ctx context.Context, em stmgr.ExecMonitor, addr addre // TODO: After the Liftoff epoch, refactor this to use resetMultisigVesting func resetGenesisMsigs0(ctx context.Context, sm *stmgr.StateManager, store adt0.Store, tree *state.StateTree, startEpoch abi.ChainEpoch) error { - gb, err := sm.ChainStore().GetGenesis() + gb, err := sm.ChainStore().GetGenesis(ctx) if err != nil { return xerrors.Errorf("getting genesis block: %w", err) } diff --git a/chain/exchange/server.go b/chain/exchange/server.go index 7c1624e57..b4519ba70 100644 --- a/chain/exchange/server.go +++ b/chain/exchange/server.go @@ -136,7 +136,7 @@ func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Re _, span := trace.StartSpan(ctx, "chainxchg.ServiceRequest") defer span.End() - chain, err := collectChainSegment(s.cs, req) + chain, err := collectChainSegment(ctx, s.cs, req) if err != nil { log.Warn("block sync request: collectChainSegment failed: ", err) return &Response{ @@ -156,13 +156,13 @@ func (s *server) serviceRequest(ctx context.Context, req *validatedRequest) (*Re }, nil } -func collectChainSegment(cs *store.ChainStore, req *validatedRequest) ([]*BSTipSet, error) { +func collectChainSegment(ctx context.Context, cs *store.ChainStore, req *validatedRequest) ([]*BSTipSet, error) { var bstips []*BSTipSet cur := req.head for { var bst BSTipSet - ts, err := cs.LoadTipSet(cur) + ts, err := cs.LoadTipSet(ctx, cur) if err != nil { return nil, xerrors.Errorf("failed loading tipset %s: %w", cur, err) } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 69ab32d58..122e55fa8 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -239,7 +239,7 @@ func NewGeneratorWithSectorsAndUpgradeSchedule(numSectors int, us stmgr.UpgradeS genfb := &types.FullBlock{Header: genb.Genesis} gents := store.NewFullTipSet([]*types.FullBlock{genfb}) - if err := cs.SetGenesis(genb.Genesis); err != nil { + if err := cs.SetGenesis(context.TODO(), genb.Genesis); err != nil { return nil, xerrors.Errorf("set genesis failed: %w", err) } @@ -469,7 +469,7 @@ func (cg *ChainGen) NextTipSetFromMinersWithMessagesAndNulls(base *types.TipSet, return nil, xerrors.Errorf("making a block for next tipset failed: %w", err) } - if err := cg.cs.PersistBlockHeaders(fblk.Header); err != nil { + if err := cg.cs.PersistBlockHeaders(context.TODO(), fblk.Header); err != nil { return nil, xerrors.Errorf("chainstore AddBlock: %w", err) } diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 29f03e2af..00f350ff1 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -591,7 +591,7 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto if err != nil { return nil, xerrors.Errorf("serializing msgmeta failed: %w", err) } - if err := bs.Put(mmb); err != nil { + if err := bs.Put(ctx, mmb); err != nil { return nil, xerrors.Errorf("putting msgmeta block to blockstore: %w", err) } @@ -621,7 +621,7 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto return nil, xerrors.Errorf("filecoinGenesisCid != gblk.Cid") } - if err := bs.Put(gblk); err != nil { + if err := bs.Put(ctx, gblk); err != nil { return nil, xerrors.Errorf("failed writing filecoin genesis block to blockstore: %w", err) } @@ -652,7 +652,7 @@ func MakeGenesisBlock(ctx context.Context, j journal.Journal, bs bstore.Blocksto return nil, xerrors.Errorf("serializing block header failed: %w", err) } - if err := bs.Put(sb); err != nil { + if err := bs.Put(ctx, sb); err != nil { return nil, xerrors.Errorf("putting header to blockstore: %w", err) } diff --git a/chain/gen/slashfilter/slashfilter.go b/chain/gen/slashfilter/slashfilter.go index 5edcd5439..de3af5825 100644 --- a/chain/gen/slashfilter/slashfilter.go +++ b/chain/gen/slashfilter/slashfilter.go @@ -1,6 +1,7 @@ package slashfilter import ( + "context" "fmt" "github.com/filecoin-project/lotus/build" @@ -27,7 +28,7 @@ func New(dstore ds.Batching) *SlashFilter { } } -func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { +func (f *SlashFilter) MinedBlock(ctx context.Context, bh *types.BlockHeader, parentEpoch abi.ChainEpoch) error { if build.IsNearUpgrade(bh.Height, build.UpgradeOrangeHeight) { return nil } @@ -35,7 +36,7 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo epochKey := ds.NewKey(fmt.Sprintf("/%s/%d", bh.Miner, bh.Height)) { // double-fork mining (2 blocks at one epoch) - if err := checkFault(f.byEpoch, epochKey, bh, "double-fork mining faults"); err != nil { + if err := checkFault(ctx, f.byEpoch, epochKey, bh, "double-fork mining faults"); err != nil { return err } } @@ -43,7 +44,7 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo parentsKey := ds.NewKey(fmt.Sprintf("/%s/%x", bh.Miner, types.NewTipSetKey(bh.Parents...).Bytes())) { // time-offset mining faults (2 blocks with the same parents) - if err := checkFault(f.byParents, parentsKey, bh, "time-offset mining faults"); err != nil { + if err := checkFault(ctx, f.byParents, parentsKey, bh, "time-offset mining faults"); err != nil { return err } } @@ -53,14 +54,14 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo // First check if we have mined a block on the parent epoch parentEpochKey := ds.NewKey(fmt.Sprintf("/%s/%d", bh.Miner, parentEpoch)) - have, err := f.byEpoch.Has(parentEpochKey) + have, err := f.byEpoch.Has(ctx, parentEpochKey) if err != nil { return err } if have { // If we had, make sure it's in our parent tipset - cidb, err := f.byEpoch.Get(parentEpochKey) + cidb, err := f.byEpoch.Get(ctx, parentEpochKey) if err != nil { return xerrors.Errorf("getting other block cid: %w", err) } @@ -83,25 +84,25 @@ func (f *SlashFilter) MinedBlock(bh *types.BlockHeader, parentEpoch abi.ChainEpo } } - if err := f.byParents.Put(parentsKey, bh.Cid().Bytes()); err != nil { + if err := f.byParents.Put(ctx, parentsKey, bh.Cid().Bytes()); err != nil { return xerrors.Errorf("putting byEpoch entry: %w", err) } - if err := f.byEpoch.Put(epochKey, bh.Cid().Bytes()); err != nil { + if err := f.byEpoch.Put(ctx, epochKey, bh.Cid().Bytes()); err != nil { return xerrors.Errorf("putting byEpoch entry: %w", err) } return nil } -func checkFault(t ds.Datastore, key ds.Key, bh *types.BlockHeader, faultType string) error { - fault, err := t.Has(key) +func checkFault(ctx context.Context, t ds.Datastore, key ds.Key, bh *types.BlockHeader, faultType string) error { + fault, err := t.Has(ctx, key) if err != nil { return err } if fault { - cidb, err := t.Get(key) + cidb, err := t.Get(ctx, key) if err != nil { return xerrors.Errorf("getting other block cid: %w", err) } diff --git a/chain/market/fundmanager.go b/chain/market/fundmanager.go index 5becfdfa7..e934201d7 100644 --- a/chain/market/fundmanager.go +++ b/chain/market/fundmanager.go @@ -89,7 +89,7 @@ func (fm *FundManager) Start() error { // - in State() only load addresses with in-progress messages // - load the others just-in-time from getFundedAddress // - delete(fm.fundedAddrs, addr) when the queue has been processed - return fm.str.forEach(func(state *FundedAddressState) { + return fm.str.forEach(fm.ctx, func(state *FundedAddressState) { fa := newFundedAddress(fm, state.Addr) fa.state = state fm.fundedAddrs[fa.state.Addr] = fa @@ -322,7 +322,7 @@ func (a *fundedAddress) clearWaitState() { // Save state to datastore func (a *fundedAddress) saveState() { // Not much we can do if saving to the datastore fails, just log - err := a.str.save(a.state) + err := a.str.save(a.ctx, a.state) if err != nil { log.Errorf("saving state to store for addr %s: %v", a.state.Addr, err) } diff --git a/chain/market/store.go b/chain/market/store.go index e0d0e10be..9818b1d80 100644 --- a/chain/market/store.go +++ b/chain/market/store.go @@ -2,6 +2,7 @@ package market import ( "bytes" + "context" cborrpc "github.com/filecoin-project/go-cbor-util" "github.com/ipfs/go-datastore" @@ -27,7 +28,7 @@ func newStore(ds dtypes.MetadataDS) *Store { } // save the state to the datastore -func (ps *Store) save(state *FundedAddressState) error { +func (ps *Store) save(ctx context.Context, state *FundedAddressState) error { k := dskeyForAddr(state.Addr) b, err := cborrpc.Dump(state) @@ -35,14 +36,14 @@ func (ps *Store) save(state *FundedAddressState) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // get the state for the given address -func (ps *Store) get(addr address.Address) (*FundedAddressState, error) { +func (ps *Store) get(ctx context.Context, addr address.Address) (*FundedAddressState, error) { k := dskeyForAddr(addr) - data, err := ps.ds.Get(k) + data, err := ps.ds.Get(ctx, k) if err != nil { return nil, err } @@ -56,8 +57,8 @@ func (ps *Store) get(addr address.Address) (*FundedAddressState, error) { } // forEach calls iter with each address in the datastore -func (ps *Store) forEach(iter func(*FundedAddressState)) error { - res, err := ps.ds.Query(dsq.Query{Prefix: dsKeyAddr}) +func (ps *Store) forEach(ctx context.Context, iter func(*FundedAddressState)) error { + res, err := ps.ds.Query(ctx, dsq.Query{Prefix: dsKeyAddr}) if err != nil { return err } diff --git a/chain/messagepool/config.go b/chain/messagepool/config.go index a511f84b7..3c07a8a0f 100644 --- a/chain/messagepool/config.go +++ b/chain/messagepool/config.go @@ -1,6 +1,7 @@ package messagepool import ( + "context" "encoding/json" "fmt" "time" @@ -20,8 +21,8 @@ var ( ConfigKey = datastore.NewKey("/mpool/config") ) -func loadConfig(ds dtypes.MetadataDS) (*types.MpoolConfig, error) { - haveCfg, err := ds.Has(ConfigKey) +func loadConfig(ctx context.Context, ds dtypes.MetadataDS) (*types.MpoolConfig, error) { + haveCfg, err := ds.Has(ctx, ConfigKey) if err != nil { return nil, err } @@ -30,7 +31,7 @@ func loadConfig(ds dtypes.MetadataDS) (*types.MpoolConfig, error) { return DefaultConfig(), nil } - cfgBytes, err := ds.Get(ConfigKey) + cfgBytes, err := ds.Get(ctx, ConfigKey) if err != nil { return nil, err } @@ -39,12 +40,12 @@ func loadConfig(ds dtypes.MetadataDS) (*types.MpoolConfig, error) { return cfg, err } -func saveConfig(cfg *types.MpoolConfig, ds dtypes.MetadataDS) error { +func saveConfig(ctx context.Context, cfg *types.MpoolConfig, ds dtypes.MetadataDS) error { cfgBytes, err := json.Marshal(cfg) if err != nil { return err } - return ds.Put(ConfigKey, cfgBytes) + return ds.Put(ctx, ConfigKey, cfgBytes) } func (mp *MessagePool) GetConfig() *types.MpoolConfig { @@ -68,7 +69,7 @@ func validateConfg(cfg *types.MpoolConfig) error { return nil } -func (mp *MessagePool) SetConfig(cfg *types.MpoolConfig) error { +func (mp *MessagePool) SetConfig(ctx context.Context, cfg *types.MpoolConfig) error { if err := validateConfg(cfg); err != nil { return err } @@ -76,7 +77,7 @@ func (mp *MessagePool) SetConfig(cfg *types.MpoolConfig) error { mp.cfgLk.Lock() mp.cfg = cfg - err := saveConfig(cfg, mp.ds) + err := saveConfig(ctx, cfg, mp.ds) if err != nil { log.Warnf("error persisting mpool config: %s", err) } diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 06343e9c9..c8b4931f0 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -358,11 +358,11 @@ func (ms *msgSet) toSlice() []*types.SignedMessage { return set } -func New(api Provider, ds dtypes.MetadataDS, us stmgr.UpgradeSchedule, netName dtypes.NetworkName, j journal.Journal) (*MessagePool, error) { +func New(ctx context.Context, api Provider, ds dtypes.MetadataDS, us stmgr.UpgradeSchedule, netName dtypes.NetworkName, j journal.Journal) (*MessagePool, error) { cache, _ := lru.New2Q(build.BlsSignatureCacheSize) verifcache, _ := lru.New2Q(build.VerifSigCacheSize) - cfg, err := loadConfig(ds) + cfg, err := loadConfig(ctx, ds) if err != nil { return nil, xerrors.Errorf("error loading mpool config: %w", err) } @@ -601,7 +601,7 @@ func (mp *MessagePool) addLocal(ctx context.Context, m *types.SignedMessage) err return xerrors.Errorf("error serializing message: %w", err) } - if err := mp.localMsgs.Put(datastore.NewKey(string(m.Cid().Bytes())), msgb); err != nil { + if err := mp.localMsgs.Put(ctx, datastore.NewKey(string(m.Cid().Bytes())), msgb); err != nil { return xerrors.Errorf("persisting local message: %w", err) } @@ -1207,7 +1207,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a var merr error for _, ts := range revert { - pts, err := mp.api.LoadTipSet(ts.Parents()) + pts, err := mp.api.LoadTipSet(ctx, ts.Parents()) if err != nil { log.Errorf("error loading reverted tipset parent: %s", err) merr = multierror.Append(merr, err) @@ -1338,7 +1338,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a return merr } -func (mp *MessagePool) runHeadChange(from *types.TipSet, to *types.TipSet, rmsgs map[address.Address]map[uint64]*types.SignedMessage) error { +func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to *types.TipSet, rmsgs map[address.Address]map[uint64]*types.SignedMessage) error { add := func(m *types.SignedMessage) { s, ok := rmsgs[m.Message.From] if !ok { @@ -1360,7 +1360,7 @@ func (mp *MessagePool) runHeadChange(from *types.TipSet, to *types.TipSet, rmsgs } - revert, apply, err := store.ReorgOps(mp.api.LoadTipSet, from, to) + revert, apply, err := store.ReorgOps(ctx, mp.api.LoadTipSet, from, to) if err != nil { return xerrors.Errorf("failed to compute reorg ops for mpool pending messages: %w", err) } @@ -1477,7 +1477,7 @@ func (mp *MessagePool) Updates(ctx context.Context) (<-chan api.MpoolUpdate, err } func (mp *MessagePool) loadLocal(ctx context.Context) error { - res, err := mp.localMsgs.Query(query.Query{}) + res, err := mp.localMsgs.Query(ctx, query.Query{}) if err != nil { return xerrors.Errorf("query local messages: %w", err) } @@ -1525,7 +1525,7 @@ func (mp *MessagePool) Clear(ctx context.Context, local bool) { if ok { for _, m := range mset.msgs { - err := mp.localMsgs.Delete(datastore.NewKey(string(m.Cid().Bytes()))) + err := mp.localMsgs.Delete(ctx, datastore.NewKey(string(m.Cid().Bytes()))) if err != nil { log.Warnf("error deleting local message: %s", err) } diff --git a/chain/messagepool/provider.go b/chain/messagepool/provider.go index 0f904c52c..5a3a2ac22 100644 --- a/chain/messagepool/provider.go +++ b/chain/messagepool/provider.go @@ -29,7 +29,7 @@ type Provider interface { StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error) MessagesForBlock(*types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) MessagesForTipset(*types.TipSet) ([]types.ChainMsg, error) - LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) + LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error) IsLite() bool } @@ -111,8 +111,8 @@ func (mpp *mpoolProvider) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, return mpp.sm.ChainStore().MessagesForTipset(ts) } -func (mpp *mpoolProvider) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { - return mpp.sm.ChainStore().LoadTipSet(tsk) +func (mpp *mpoolProvider) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { + return mpp.sm.ChainStore().LoadTipSet(ctx, tsk) } func (mpp *mpoolProvider) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error) { diff --git a/chain/messagepool/pruning.go b/chain/messagepool/pruning.go index c10239b8e..d405afb65 100644 --- a/chain/messagepool/pruning.go +++ b/chain/messagepool/pruning.go @@ -49,7 +49,7 @@ func (mp *MessagePool) pruneMessages(ctx context.Context, ts *types.TipSet) erro } baseFeeLowerBound := getBaseFeeLowerBound(baseFee, baseFeeLowerBoundFactor) - pending, _ := mp.getPendingMessages(ts, ts) + pending, _ := mp.getPendingMessages(ctx, ts, ts) // protected actors -- not pruned protected := make(map[address.Address]struct{}) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index acff7c4cf..af6392f7a 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -73,7 +73,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // 0. Load messages from the target tipset; if it is the same as the current tipset in // the mpool, then this is just the pending messages - pending, err := mp.getPendingMessages(curTs, ts) + pending, err := mp.getPendingMessages(ctx, curTs, ts) if err != nil { return nil, err } @@ -397,7 +397,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type // 0. Load messages for the target tipset; if it is the same as the current tipset in the mpool // then this is just the pending messages - pending, err := mp.getPendingMessages(curTs, ts) + pending, err := mp.getPendingMessages(ctx, curTs, ts) if err != nil { return nil, err } @@ -634,7 +634,7 @@ tailLoop: return result, gasLimit } -func (mp *MessagePool) getPendingMessages(curTs, ts *types.TipSet) (map[address.Address]map[uint64]*types.SignedMessage, error) { +func (mp *MessagePool) getPendingMessages(ctx context.Context, curTs, ts *types.TipSet) (map[address.Address]map[uint64]*types.SignedMessage, error) { start := time.Now() result := make(map[address.Address]map[uint64]*types.SignedMessage) @@ -670,7 +670,7 @@ func (mp *MessagePool) getPendingMessages(curTs, ts *types.TipSet) (map[address. return result, nil } - if err := mp.runHeadChange(curTs, ts, result); err != nil { + if err := mp.runHeadChange(ctx, curTs, ts, result); err != nil { return nil, xerrors.Errorf("failed to process difference between mpool head and given head: %w", err) } diff --git a/chain/messagesigner/messagesigner.go b/chain/messagesigner/messagesigner.go index 063d1aa7d..e2229bb51 100644 --- a/chain/messagesigner/messagesigner.go +++ b/chain/messagesigner/messagesigner.go @@ -84,7 +84,7 @@ func (ms *MessageSigner) SignMessage(ctx context.Context, msg *types.Message, cb } // If the callback executed successfully, write the nonce to the datastore - if err := ms.saveNonce(msg.From, nonce); err != nil { + if err := ms.saveNonce(ctx, msg.From, nonce); err != nil { return nil, xerrors.Errorf("failed to save nonce: %w", err) } @@ -105,7 +105,7 @@ func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (u // Get the next nonce for this address from the datastore addrNonceKey := ms.dstoreKey(addr) - dsNonceBytes, err := ms.ds.Get(addrNonceKey) + dsNonceBytes, err := ms.ds.Get(ctx, addrNonceKey) switch { case xerrors.Is(err, datastore.ErrNotFound): @@ -139,7 +139,7 @@ func (ms *MessageSigner) nextNonce(ctx context.Context, addr address.Address) (u // saveNonce increments the nonce for this address and writes it to the // datastore -func (ms *MessageSigner) saveNonce(addr address.Address, nonce uint64) error { +func (ms *MessageSigner) saveNonce(ctx context.Context, addr address.Address, nonce uint64) error { // Increment the nonce nonce++ @@ -150,7 +150,7 @@ func (ms *MessageSigner) saveNonce(addr address.Address, nonce uint64) error { if err != nil { return xerrors.Errorf("failed to marshall nonce: %w", err) } - err = ms.ds.Put(addrNonceKey, buf.Bytes()) + err = ms.ds.Put(ctx, addrNonceKey, buf.Bytes()) if err != nil { return xerrors.Errorf("failed to write nonce to datastore: %w", err) } diff --git a/chain/rand/rand.go b/chain/rand/rand.go index 90e9a514b..10eb0436d 100644 --- a/chain/rand/rand.go +++ b/chain/rand/rand.go @@ -48,7 +48,7 @@ func (sr *stateRand) GetBeaconRandomnessTipset(ctx context.Context, round abi.Ch defer span.End() span.AddAttributes(trace.Int64Attribute("round", int64(round))) - ts, err := sr.cs.LoadTipSet(types.NewTipSetKey(sr.blks...)) + ts, err := sr.cs.LoadTipSet(ctx, types.NewTipSetKey(sr.blks...)) if err != nil { return nil, err } @@ -75,7 +75,7 @@ func (sr *stateRand) GetChainRandomness(ctx context.Context, pers crypto.DomainS defer span.End() span.AddAttributes(trace.Int64Attribute("round", int64(round))) - ts, err := sr.cs.LoadTipSet(types.NewTipSetKey(sr.blks...)) + ts, err := sr.cs.LoadTipSet(ctx, types.NewTipSetKey(sr.blks...)) if err != nil { return nil, err } @@ -132,7 +132,7 @@ func (sr *stateRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.Doma return nil, err } - be, err := sr.cs.GetLatestBeaconEntry(randTs) + be, err := sr.cs.GetLatestBeaconEntry(ctx, randTs) if err != nil { return nil, err } @@ -149,7 +149,7 @@ func (sr *stateRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.Doma return nil, err } - be, err := sr.cs.GetLatestBeaconEntry(randTs) + be, err := sr.cs.GetLatestBeaconEntry(ctx, randTs) if err != nil { return nil, err } @@ -190,7 +190,7 @@ func (sr *stateRand) extractBeaconEntryForEpoch(ctx context.Context, filecoinEpo } } - next, err := sr.cs.LoadTipSet(randTs.Parents()) + next, err := sr.cs.LoadTipSet(ctx, randTs.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for beacon entry: %w", err) } diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index 4d016b7ab..6804b8126 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" cid "github.com/ipfs/go-cid" + "golang.org/x/xerrors" "github.com/filecoin-project/lotus/api" @@ -300,12 +301,12 @@ func ListMinerActors(ctx context.Context, sm *StateManager, ts *types.TipSet) ([ } func MinerGetBaseInfo(ctx context.Context, sm *StateManager, bcs beacon.Schedule, tsk types.TipSetKey, round abi.ChainEpoch, maddr address.Address, pv ffiwrapper.Verifier) (*api.MiningBaseInfo, error) { - ts, err := sm.ChainStore().LoadTipSet(tsk) + ts, err := sm.ChainStore().LoadTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("failed to load tipset for mining base: %w", err) } - prev, err := sm.ChainStore().GetLatestBeaconEntry(ts) + prev, err := sm.ChainStore().GetLatestBeaconEntry(ctx, ts) if err != nil { if os.Getenv("LOTUS_IGNORE_DRAND") != "_yes_" { return nil, xerrors.Errorf("failed to get latest beacon entry: %w", err) diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 7cc50e710..ef29e1659 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -40,7 +40,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. ts = sm.cs.GetHeaviestTipSet() // Search back till we find a height with no fork, or we reach the beginning. for ts.Height() > 0 { - pts, err := sm.cs.GetTipSetFromKey(ts.Parents()) + pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err) } @@ -51,7 +51,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. ts = pts } } else if ts.Height() > 0 { - pts, err := sm.cs.LoadTipSet(ts.Parents()) + pts, err := sm.cs.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parent tipset: %w", err) } @@ -155,7 +155,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri // height to have no fork, because we'll run it inside this // function before executing the given message. for ts.Height() > 0 { - pts, err := sm.cs.GetTipSetFromKey(ts.Parents()) + pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err) } @@ -166,7 +166,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri ts = pts } } else if ts.Height() > 0 { - pts, err := sm.cs.GetTipSetFromKey(ts.Parents()) + pts, err := sm.cs.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("failed to find a non-forking epoch: %w", err) } diff --git a/chain/stmgr/read.go b/chain/stmgr/read.go index bc259f227..bca32429b 100644 --- a/chain/stmgr/read.go +++ b/chain/stmgr/read.go @@ -13,8 +13,8 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -func (sm *StateManager) ParentStateTsk(tsk types.TipSetKey) (*state.StateTree, error) { - ts, err := sm.cs.GetTipSetFromKey(tsk) +func (sm *StateManager) ParentStateTsk(ctx context.Context, tsk types.TipSetKey) (*state.StateTree, error) { + ts, err := sm.cs.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -57,8 +57,8 @@ func (sm *StateManager) LoadActor(_ context.Context, addr address.Address, ts *t return state.GetActor(addr) } -func (sm *StateManager) LoadActorTsk(_ context.Context, addr address.Address, tsk types.TipSetKey) (*types.Actor, error) { - state, err := sm.ParentStateTsk(tsk) +func (sm *StateManager) LoadActorTsk(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*types.Actor, error) { + state, err := sm.ParentStateTsk(ctx, tsk) if err != nil { return nil, err } diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 45c98a855..7d743dd0f 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -40,7 +40,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid return nil, nil, cid.Undef, fmt.Errorf("expected current head on SHC stream (got %s)", head[0].Type) } - r, foundMsg, err := sm.tipsetExecutedMessage(head[0].Val, mcid, msg.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, head[0].Val, mcid, msg.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, err } @@ -93,7 +93,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid if candidateTs != nil && val.Val.Height() >= candidateTs.Height()+abi.ChainEpoch(confidence) { return candidateTs, candidateRcp, candidateFm, nil } - r, foundMsg, err := sm.tipsetExecutedMessage(val.Val, mcid, msg.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, val.Val, mcid, msg.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, err } @@ -135,7 +135,7 @@ func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err) } - r, foundMsg, err := sm.tipsetExecutedMessage(head, mcid, msg.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, head, mcid, msg.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, err } @@ -201,7 +201,7 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet return nil, nil, cid.Undef, nil } - pts, err := sm.cs.LoadTipSet(cur.Parents()) + pts, err := sm.cs.LoadTipSet(ctx, cur.Parents()) if err != nil { return nil, nil, cid.Undef, xerrors.Errorf("failed to load tipset during msg wait searchback: %w", err) } @@ -214,7 +214,7 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet // check that between cur and parent tipset the nonce fell into range of our message if actorNoExist || (curActor.Nonce > mNonce && act.Nonce <= mNonce) { - r, foundMsg, err := sm.tipsetExecutedMessage(cur, m.Cid(), m.VMMessage(), allowReplaced) + r, foundMsg, err := sm.tipsetExecutedMessage(ctx, cur, m.Cid(), m.VMMessage(), allowReplaced) if err != nil { return nil, nil, cid.Undef, xerrors.Errorf("checking for message execution during lookback: %w", err) } @@ -229,13 +229,13 @@ func (sm *StateManager) searchBackForMsg(ctx context.Context, from *types.TipSet } } -func (sm *StateManager) tipsetExecutedMessage(ts *types.TipSet, msg cid.Cid, vmm *types.Message, allowReplaced bool) (*types.MessageReceipt, cid.Cid, error) { +func (sm *StateManager) tipsetExecutedMessage(ctx context.Context, ts *types.TipSet, msg cid.Cid, vmm *types.Message, allowReplaced bool) (*types.MessageReceipt, cid.Cid, error) { // The genesis block did not execute any messages if ts.Height() == 0 { return nil, cid.Undef, nil } - pts, err := sm.cs.LoadTipSet(ts.Parents()) + pts, err := sm.cs.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, cid.Undef, err } diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index 67c0bdb6a..cfd9192f4 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -320,7 +320,7 @@ func (sm *StateManager) LookupID(ctx context.Context, addr address.Address, ts * func (sm *StateManager) ValidateChain(ctx context.Context, ts *types.TipSet) error { tschain := []*types.TipSet{ts} for ts.Height() != 0 { - next, err := sm.cs.LoadTipSet(ts.Parents()) + next, err := sm.cs.LoadTipSet(ctx, ts.Parents()) if err != nil { return err } @@ -372,7 +372,7 @@ func (sm *StateManager) VMSys() vm.SyscallBuilder { } func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) { - pts, err := sm.ChainStore().GetTipSetFromKey(tsk) + pts, err := sm.ChainStore().GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -391,7 +391,7 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza } func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) { - pts, err := sm.ChainStore().LoadTipSet(tsk) + pts, err := sm.ChainStore().LoadTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset key: %w", err) } diff --git a/chain/stmgr/supply.go b/chain/stmgr/supply.go index c9475a51e..0744c02aa 100644 --- a/chain/stmgr/supply.go +++ b/chain/stmgr/supply.go @@ -31,7 +31,7 @@ import ( // sets up information about the vesting schedule func (sm *StateManager) setupGenesisVestingSchedule(ctx context.Context) error { - gb, err := sm.cs.GetGenesis() + gb, err := sm.cs.GetGenesis(ctx) if err != nil { return xerrors.Errorf("getting genesis block: %w", err) } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index ce4f60105..8b0f8daeb 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -155,7 +155,7 @@ func GetLookbackTipSetForRound(ctx context.Context, sm *StateManager, ts *types. } - lbts, err := sm.ChainStore().GetTipSetFromKey(nextTs.Parents()) + lbts, err := sm.ChainStore().GetTipSetFromKey(ctx, nextTs.Parents()) if err != nil { return nil, cid.Undef, xerrors.Errorf("failed to resolve lookback tipset: %w", err) } diff --git a/chain/store/index.go b/chain/store/index.go index 324fb7a63..f5bbbd438 100644 --- a/chain/store/index.go +++ b/chain/store/index.go @@ -31,7 +31,7 @@ type ChainIndex struct { skipLength abi.ChainEpoch } -type loadTipSetFunc func(types.TipSetKey) (*types.TipSet, error) +type loadTipSetFunc func(context.Context, types.TipSetKey) (*types.TipSet, error) func NewChainIndex(lts loadTipSetFunc) *ChainIndex { sc, _ := lru.NewARC(DefaultChainIndexCacheSize) @@ -49,12 +49,12 @@ type lbEntry struct { target types.TipSetKey } -func (ci *ChainIndex) GetTipsetByHeight(_ context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { +func (ci *ChainIndex) GetTipsetByHeight(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { if from.Height()-to <= ci.skipLength { - return ci.walkBack(from, to) + return ci.walkBack(ctx, from, to) } - rounded, err := ci.roundDown(from) + rounded, err := ci.roundDown(ctx, from) if err != nil { return nil, err } @@ -63,7 +63,7 @@ func (ci *ChainIndex) GetTipsetByHeight(_ context.Context, from *types.TipSet, t for { cval, ok := ci.skipCache.Get(cur) if !ok { - fc, err := ci.fillCache(cur) + fc, err := ci.fillCache(ctx, cur) if err != nil { return nil, err } @@ -74,19 +74,19 @@ func (ci *ChainIndex) GetTipsetByHeight(_ context.Context, from *types.TipSet, t if lbe.ts.Height() == to || lbe.parentHeight < to { return lbe.ts, nil } else if to > lbe.targetHeight { - return ci.walkBack(lbe.ts, to) + return ci.walkBack(ctx, lbe.ts, to) } cur = lbe.target } } -func (ci *ChainIndex) GetTipsetByHeightWithoutCache(from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { - return ci.walkBack(from, to) +func (ci *ChainIndex) GetTipsetByHeightWithoutCache(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { + return ci.walkBack(ctx, from, to) } -func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { - ts, err := ci.loadTipSet(tsk) +func (ci *ChainIndex) fillCache(ctx context.Context, tsk types.TipSetKey) (*lbEntry, error) { + ts, err := ci.loadTipSet(ctx, tsk) if err != nil { return nil, err } @@ -101,7 +101,7 @@ func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { // will either be equal to ts.Height, or at least > ts.Parent.Height() rheight := ci.roundHeight(ts.Height()) - parent, err := ci.loadTipSet(ts.Parents()) + parent, err := ci.loadTipSet(ctx, ts.Parents()) if err != nil { return nil, err } @@ -115,7 +115,7 @@ func (ci *ChainIndex) fillCache(tsk types.TipSetKey) (*lbEntry, error) { if parent.Height() < rheight { skipTarget = parent } else { - skipTarget, err = ci.walkBack(parent, rheight) + skipTarget, err = ci.walkBack(ctx, parent, rheight) if err != nil { return nil, xerrors.Errorf("fillCache walkback: %w", err) } @@ -137,10 +137,10 @@ func (ci *ChainIndex) roundHeight(h abi.ChainEpoch) abi.ChainEpoch { return (h / ci.skipLength) * ci.skipLength } -func (ci *ChainIndex) roundDown(ts *types.TipSet) (*types.TipSet, error) { +func (ci *ChainIndex) roundDown(ctx context.Context, ts *types.TipSet) (*types.TipSet, error) { target := ci.roundHeight(ts.Height()) - rounded, err := ci.walkBack(ts, target) + rounded, err := ci.walkBack(ctx, ts, target) if err != nil { return nil, err } @@ -148,7 +148,7 @@ func (ci *ChainIndex) roundDown(ts *types.TipSet) (*types.TipSet, error) { return rounded, nil } -func (ci *ChainIndex) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { +func (ci *ChainIndex) walkBack(ctx context.Context, from *types.TipSet, to abi.ChainEpoch) (*types.TipSet, error) { if to > from.Height() { return nil, xerrors.Errorf("looking for tipset with height greater than start point") } @@ -160,7 +160,7 @@ func (ci *ChainIndex) walkBack(from *types.TipSet, to abi.ChainEpoch) (*types.Ti ts := from for { - pts, err := ci.loadTipSet(ts.Parents()) + pts, err := ci.loadTipSet(ctx, ts.Parents()) if err != nil { return nil, err } diff --git a/chain/store/messages.go b/chain/store/messages.go index 07ce83458..6fc4d76b9 100644 --- a/chain/store/messages.go +++ b/chain/store/messages.go @@ -29,7 +29,7 @@ func PutMessage(bs bstore.Blockstore, m storable) (cid.Cid, error) { return cid.Undef, err } - if err := bs.Put(b); err != nil { + if err := bs.Put(context.TODO(), b); err != nil { return cid.Undef, err } @@ -54,7 +54,7 @@ func (cs *ChainStore) GetCMessage(c cid.Cid) (types.ChainMsg, error) { func (cs *ChainStore) GetMessage(c cid.Cid) (*types.Message, error) { var msg *types.Message - err := cs.chainLocalBlockstore.View(c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { msg, err = types.DecodeMessage(b) return err }) @@ -63,7 +63,7 @@ func (cs *ChainStore) GetMessage(c cid.Cid) (*types.Message, error) { func (cs *ChainStore) GetSignedMessage(c cid.Cid) (*types.SignedMessage, error) { var msg *types.SignedMessage - err := cs.chainLocalBlockstore.View(c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { msg, err = types.DecodeSignedMessage(b) return err }) diff --git a/chain/store/snapshot.go b/chain/store/snapshot.go index 1d4ce3758..a3841389e 100644 --- a/chain/store/snapshot.go +++ b/chain/store/snapshot.go @@ -30,7 +30,7 @@ func (cs *ChainStore) Export(ctx context.Context, ts *types.TipSet, inclRecentRo unionBs := bstore.Union(cs.stateBlockstore, cs.chainBlockstore) return cs.WalkSnapshot(ctx, ts, inclRecentRoots, skipOldMsgs, true, func(c cid.Cid) error { - blk, err := unionBs.Get(c) + blk, err := unionBs.Get(ctx, c) if err != nil { return xerrors.Errorf("writing object to car, bs.Get: %w", err) } @@ -44,17 +44,18 @@ func (cs *ChainStore) Export(ctx context.Context, ts *types.TipSet, inclRecentRo } func (cs *ChainStore) Import(r io.Reader) (*types.TipSet, error) { + ctx := context.TODO() // TODO: writing only to the state blockstore is incorrect. // At this time, both the state and chain blockstores are backed by the // universal store. When we physically segregate the stores, we will need // to route state objects to the state blockstore, and chain objects to // the chain blockstore. - header, err := car.LoadCar(cs.StateBlockstore(), r) + header, err := car.LoadCar(ctx, cs.StateBlockstore(), r) if err != nil { return nil, xerrors.Errorf("loadcar failed: %w", err) } - root, err := cs.LoadTipSet(types.NewTipSetKey(header.Roots...)) + root, err := cs.LoadTipSet(ctx, types.NewTipSetKey(header.Roots...)) if err != nil { return nil, xerrors.Errorf("failed to load root tipset from chainfile: %w", err) } @@ -82,7 +83,7 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe return err } - data, err := cs.chainBlockstore.Get(blk) + data, err := cs.chainBlockstore.Get(ctx, blk) if err != nil { return xerrors.Errorf("getting block: %w", err) } @@ -102,7 +103,7 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe var cids []cid.Cid if !skipOldMsgs || b.Height > ts.Height()-inclRecentRoots { if walked.Visit(b.Messages) { - mcids, err := recurseLinks(cs.chainBlockstore, walked, b.Messages, []cid.Cid{b.Messages}) + mcids, err := recurseLinks(ctx, cs.chainBlockstore, walked, b.Messages, []cid.Cid{b.Messages}) if err != nil { return xerrors.Errorf("recursing messages failed: %w", err) } @@ -123,7 +124,7 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe if b.Height == 0 || b.Height > ts.Height()-inclRecentRoots { if walked.Visit(b.ParentStateRoot) { - cids, err := recurseLinks(cs.stateBlockstore, walked, b.ParentStateRoot, []cid.Cid{b.ParentStateRoot}) + cids, err := recurseLinks(ctx, cs.stateBlockstore, walked, b.ParentStateRoot, []cid.Cid{b.ParentStateRoot}) if err != nil { return xerrors.Errorf("recursing genesis state failed: %w", err) } @@ -168,12 +169,12 @@ func (cs *ChainStore) WalkSnapshot(ctx context.Context, ts *types.TipSet, inclRe return nil } -func recurseLinks(bs bstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid.Cid) ([]cid.Cid, error) { +func recurseLinks(ctx context.Context, bs bstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid.Cid) ([]cid.Cid, error) { if root.Prefix().Codec != cid.DagCBOR { return in, nil } - data, err := bs.Get(root) + data, err := bs.Get(ctx, root) if err != nil { return nil, xerrors.Errorf("recurse links get (%s) failed: %w", root, err) } @@ -192,7 +193,7 @@ func recurseLinks(bs bstore.Blockstore, walked *cid.Set, root cid.Cid, in []cid. in = append(in, c) var err error - in, err = recurseLinks(bs, walked, c, in) + in, err = recurseLinks(ctx, bs, walked, c, in) if err != nil { rerr = err } diff --git a/chain/store/store.go b/chain/store/store.go index f99c7f649..a24737944 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -207,17 +207,17 @@ func (cs *ChainStore) Close() error { return nil } -func (cs *ChainStore) Load() error { - if err := cs.loadHead(); err != nil { +func (cs *ChainStore) Load(ctx context.Context) error { + if err := cs.loadHead(ctx); err != nil { return err } - if err := cs.loadCheckpoint(); err != nil { + if err := cs.loadCheckpoint(ctx); err != nil { return err } return nil } -func (cs *ChainStore) loadHead() error { - head, err := cs.metadataDs.Get(chainHeadKey) +func (cs *ChainStore) loadHead(ctx context.Context) error { + head, err := cs.metadataDs.Get(ctx, chainHeadKey) if err == dstore.ErrNotFound { log.Warn("no previous chain state found") return nil @@ -231,7 +231,7 @@ func (cs *ChainStore) loadHead() error { return xerrors.Errorf("failed to unmarshal stored chain head: %w", err) } - ts, err := cs.LoadTipSet(types.NewTipSetKey(tscids...)) + ts, err := cs.LoadTipSet(ctx, types.NewTipSetKey(tscids...)) if err != nil { return xerrors.Errorf("loading tipset: %w", err) } @@ -241,8 +241,8 @@ func (cs *ChainStore) loadHead() error { return nil } -func (cs *ChainStore) loadCheckpoint() error { - tskBytes, err := cs.metadataDs.Get(checkpointKey) +func (cs *ChainStore) loadCheckpoint(ctx context.Context) error { + tskBytes, err := cs.metadataDs.Get(ctx, checkpointKey) if err == dstore.ErrNotFound { return nil } @@ -256,7 +256,7 @@ func (cs *ChainStore) loadCheckpoint() error { return err } - ts, err := cs.LoadTipSet(tsk) + ts, err := cs.LoadTipSet(ctx, tsk) if err != nil { return xerrors.Errorf("loading tipset: %w", err) } @@ -266,13 +266,13 @@ func (cs *ChainStore) loadCheckpoint() error { return nil } -func (cs *ChainStore) writeHead(ts *types.TipSet) error { +func (cs *ChainStore) writeHead(ctx context.Context, ts *types.TipSet) error { data, err := json.Marshal(ts.Cids()) if err != nil { return xerrors.Errorf("failed to marshal tipset: %w", err) } - if err := cs.metadataDs.Put(chainHeadKey, data); err != nil { + if err := cs.metadataDs.Put(ctx, chainHeadKey, data); err != nil { return xerrors.Errorf("failed to write chain head to datastore: %w", err) } @@ -341,13 +341,13 @@ func (cs *ChainStore) SubscribeHeadChanges(f ReorgNotifee) { func (cs *ChainStore) IsBlockValidated(ctx context.Context, blkid cid.Cid) (bool, error) { key := blockValidationCacheKeyPrefix.Instance(blkid.String()) - return cs.metadataDs.Has(key) + return cs.metadataDs.Has(ctx, key) } func (cs *ChainStore) MarkBlockAsValidated(ctx context.Context, blkid cid.Cid) error { key := blockValidationCacheKeyPrefix.Instance(blkid.String()) - if err := cs.metadataDs.Put(key, []byte{0}); err != nil { + if err := cs.metadataDs.Put(ctx, key, []byte{0}); err != nil { return xerrors.Errorf("cache block validation: %w", err) } @@ -357,34 +357,34 @@ func (cs *ChainStore) MarkBlockAsValidated(ctx context.Context, blkid cid.Cid) e func (cs *ChainStore) UnmarkBlockAsValidated(ctx context.Context, blkid cid.Cid) error { key := blockValidationCacheKeyPrefix.Instance(blkid.String()) - if err := cs.metadataDs.Delete(key); err != nil { + if err := cs.metadataDs.Delete(ctx, key); err != nil { return xerrors.Errorf("removing from valid block cache: %w", err) } return nil } -func (cs *ChainStore) SetGenesis(b *types.BlockHeader) error { +func (cs *ChainStore) SetGenesis(ctx context.Context, b *types.BlockHeader) error { ts, err := types.NewTipSet([]*types.BlockHeader{b}) if err != nil { return err } - if err := cs.PutTipSet(context.TODO(), ts); err != nil { + if err := cs.PutTipSet(ctx, ts); err != nil { return err } - return cs.metadataDs.Put(dstore.NewKey("0"), b.Cid().Bytes()) + return cs.metadataDs.Put(ctx, dstore.NewKey("0"), b.Cid().Bytes()) } func (cs *ChainStore) PutTipSet(ctx context.Context, ts *types.TipSet) error { for _, b := range ts.Blocks() { - if err := cs.PersistBlockHeaders(b); err != nil { + if err := cs.PersistBlockHeaders(ctx, b); err != nil { return err } } - expanded, err := cs.expandTipset(ts.Blocks()[0]) + expanded, err := cs.expandTipset(ctx, ts.Blocks()[0]) if err != nil { return xerrors.Errorf("errored while expanding tipset: %w", err) } @@ -435,7 +435,7 @@ func (cs *ChainStore) MaybeTakeHeavierTipSet(ctx context.Context, ts *types.TipS // difference between 'bootstrap sync' and 'caught up' sync, we need // some other heuristic. - exceeds, err := cs.exceedsForkLength(cs.heaviest, ts) + exceeds, err := cs.exceedsForkLength(ctx, cs.heaviest, ts) if err != nil { return err } @@ -458,7 +458,7 @@ func (cs *ChainStore) MaybeTakeHeavierTipSet(ctx context.Context, ts *types.TipS // FIXME: We may want to replace some of the logic in `syncFork()` with this. // `syncFork()` counts the length on both sides of the fork at the moment (we // need to settle on that) but here we just enforce it on the `synced` side. -func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, error) { +func (cs *ChainStore) exceedsForkLength(ctx context.Context, synced, external *types.TipSet) (bool, error) { if synced == nil || external == nil { // FIXME: If `cs.heaviest` is nil we should just bypass the entire // `MaybeTakeHeavierTipSet` logic (instead of each of the called @@ -482,7 +482,7 @@ func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, e // length). return true, nil } - external, err = cs.LoadTipSet(external.Parents()) + external, err = cs.LoadTipSet(ctx, external.Parents()) if err != nil { return false, xerrors.Errorf("failed to load parent tipset in external chain: %w", err) } @@ -505,7 +505,7 @@ func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, e // there is no common ancestor. return true, nil } - synced, err = cs.LoadTipSet(synced.Parents()) + synced, err = cs.LoadTipSet(ctx, synced.Parents()) if err != nil { return false, xerrors.Errorf("failed to load parent tipset in synced chain: %w", err) } @@ -521,17 +521,17 @@ func (cs *ChainStore) exceedsForkLength(synced, external *types.TipSet) (bool, e // CAUTION: Use it only for testing, such as to teleport the chain to a // particular tipset to carry out a benchmark, verification, etc. on a chain // segment. -func (cs *ChainStore) ForceHeadSilent(_ context.Context, ts *types.TipSet) error { +func (cs *ChainStore) ForceHeadSilent(ctx context.Context, ts *types.TipSet) error { log.Warnf("(!!!) forcing a new head silently; new head: %s", ts) cs.heaviestLk.Lock() defer cs.heaviestLk.Unlock() - if err := cs.removeCheckpoint(); err != nil { + if err := cs.removeCheckpoint(ctx); err != nil { return err } cs.heaviest = ts - err := cs.writeHead(ts) + err := cs.writeHead(ctx, ts) if err != nil { err = xerrors.Errorf("failed to write chain head: %s", err) } @@ -561,7 +561,7 @@ func (cs *ChainStore) reorgWorker(ctx context.Context, initialNotifees []ReorgNo notifees = append(notifees, n) case r := <-out: - revert, apply, err := cs.ReorgOps(r.old, r.new) + revert, apply, err := cs.ReorgOps(ctx, r.old, r.new) if err != nil { log.Error("computing reorg ops failed: ", err) continue @@ -646,7 +646,7 @@ func (cs *ChainStore) takeHeaviestTipSet(ctx context.Context, ts *types.TipSet) log.Infof("New heaviest tipset! %s (height=%d)", ts.Cids(), ts.Height()) cs.heaviest = ts - if err := cs.writeHead(ts); err != nil { + if err := cs.writeHead(ctx, ts); err != nil { log.Errorf("failed to write chain head: %s", err) return nil } @@ -656,14 +656,14 @@ func (cs *ChainStore) takeHeaviestTipSet(ctx context.Context, ts *types.TipSet) // FlushValidationCache removes all results of block validation from the // chain metadata store. Usually the first step after a new chain import. -func (cs *ChainStore) FlushValidationCache() error { - return FlushValidationCache(cs.metadataDs) +func (cs *ChainStore) FlushValidationCache(ctx context.Context) error { + return FlushValidationCache(ctx, cs.metadataDs) } -func FlushValidationCache(ds dstore.Batching) error { +func FlushValidationCache(ctx context.Context, ds dstore.Batching) error { log.Infof("clearing block validation cache...") - dsWalk, err := ds.Query(query.Query{ + dsWalk, err := ds.Query(ctx, query.Query{ // Potential TODO: the validation cache is not a namespace on its own // but is rather constructed as prefixed-key `foo:bar` via .Instance(), which // in turn does not work with the filter, which can match only on `foo/bar` @@ -683,7 +683,7 @@ func FlushValidationCache(ds dstore.Batching) error { return xerrors.Errorf("failed to run key listing query: %w", err) } - batch, err := ds.Batch() + batch, err := ds.Batch(ctx) if err != nil { return xerrors.Errorf("failed to open a DS batch: %w", err) } @@ -692,11 +692,11 @@ func FlushValidationCache(ds dstore.Batching) error { for _, k := range allKeys { if strings.HasPrefix(k.Key, blockValidationCacheKeyPrefix.String()) { delCnt++ - batch.Delete(dstore.RawKey(k.Key)) // nolint:errcheck + batch.Delete(ctx, dstore.RawKey(k.Key)) // nolint:errcheck } } - if err := batch.Commit(); err != nil { + if err := batch.Commit(ctx); err != nil { return xerrors.Errorf("failed to commit the DS batch: %w", err) } @@ -709,24 +709,24 @@ func FlushValidationCache(ds dstore.Batching) error { // This should only be called if something is broken and needs fixing. // // This function will bypass and remove any checkpoints. -func (cs *ChainStore) SetHead(ts *types.TipSet) error { +func (cs *ChainStore) SetHead(ctx context.Context, ts *types.TipSet) error { cs.heaviestLk.Lock() defer cs.heaviestLk.Unlock() - if err := cs.removeCheckpoint(); err != nil { + if err := cs.removeCheckpoint(ctx); err != nil { return err } return cs.takeHeaviestTipSet(context.TODO(), ts) } // RemoveCheckpoint removes the current checkpoint. -func (cs *ChainStore) RemoveCheckpoint() error { +func (cs *ChainStore) RemoveCheckpoint(ctx context.Context) error { cs.heaviestLk.Lock() defer cs.heaviestLk.Unlock() - return cs.removeCheckpoint() + return cs.removeCheckpoint(ctx) } -func (cs *ChainStore) removeCheckpoint() error { - if err := cs.metadataDs.Delete(checkpointKey); err != nil { +func (cs *ChainStore) removeCheckpoint(ctx context.Context) error { + if err := cs.metadataDs.Delete(ctx, checkpointKey); err != nil { return err } cs.checkpoint = nil @@ -736,7 +736,7 @@ func (cs *ChainStore) removeCheckpoint() error { // SetCheckpoint will set a checkpoint past which the chainstore will not allow forks. // // NOTE: Checkpoints cannot be set beyond ForkLengthThreshold epochs in the past. -func (cs *ChainStore) SetCheckpoint(ts *types.TipSet) error { +func (cs *ChainStore) SetCheckpoint(ctx context.Context, ts *types.TipSet) error { tskBytes, err := json.Marshal(ts.Key()) if err != nil { return err @@ -755,7 +755,7 @@ func (cs *ChainStore) SetCheckpoint(ts *types.TipSet) error { } if !ts.Equals(cs.heaviest) { - anc, err := cs.IsAncestorOf(ts, cs.heaviest) + anc, err := cs.IsAncestorOf(ctx, ts, cs.heaviest) if err != nil { return xerrors.Errorf("cannot determine whether checkpoint tipset is in main-chain: %w", err) } @@ -764,7 +764,7 @@ func (cs *ChainStore) SetCheckpoint(ts *types.TipSet) error { return xerrors.Errorf("cannot mark tipset as checkpoint, since it isn't in the main-chain: %w", err) } } - err = cs.metadataDs.Put(checkpointKey, tskBytes) + err = cs.metadataDs.Put(ctx, checkpointKey, tskBytes) if err != nil { return err } @@ -781,9 +781,9 @@ func (cs *ChainStore) GetCheckpoint() *types.TipSet { } // Contains returns whether our BlockStore has all blocks in the supplied TipSet. -func (cs *ChainStore) Contains(ts *types.TipSet) (bool, error) { +func (cs *ChainStore) Contains(ctx context.Context, ts *types.TipSet) (bool, error) { for _, c := range ts.Cids() { - has, err := cs.chainBlockstore.Has(c) + has, err := cs.chainBlockstore.Has(ctx, c) if err != nil { return false, err } @@ -797,16 +797,16 @@ func (cs *ChainStore) Contains(ts *types.TipSet) (bool, error) { // GetBlock fetches a BlockHeader with the supplied CID. It returns // blockstore.ErrNotFound if the block was not found in the BlockStore. -func (cs *ChainStore) GetBlock(c cid.Cid) (*types.BlockHeader, error) { +func (cs *ChainStore) GetBlock(ctx context.Context, c cid.Cid) (*types.BlockHeader, error) { var blk *types.BlockHeader - err := cs.chainLocalBlockstore.View(c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(ctx, c, func(b []byte) (err error) { blk, err = types.DecodeBlock(b) return err }) return blk, err } -func (cs *ChainStore) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { +func (cs *ChainStore) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { v, ok := cs.tsCache.Get(tsk) if ok { return v.(*types.TipSet), nil @@ -819,7 +819,7 @@ func (cs *ChainStore) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { for i, c := range cids { i, c := i, c eg.Go(func() error { - b, err := cs.GetBlock(c) + b, err := cs.GetBlock(ctx, c) if err != nil { return xerrors.Errorf("get block %s: %w", c, err) } @@ -844,14 +844,14 @@ func (cs *ChainStore) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { } // IsAncestorOf returns true if 'a' is an ancestor of 'b' -func (cs *ChainStore) IsAncestorOf(a, b *types.TipSet) (bool, error) { +func (cs *ChainStore) IsAncestorOf(ctx context.Context, a, b *types.TipSet) (bool, error) { if b.Height() <= a.Height() { return false, nil } cur := b for !a.Equals(cur) && cur.Height() > a.Height() { - next, err := cs.LoadTipSet(cur.Parents()) + next, err := cs.LoadTipSet(ctx, cur.Parents()) if err != nil { return false, err } @@ -862,13 +862,13 @@ func (cs *ChainStore) IsAncestorOf(a, b *types.TipSet) (bool, error) { return cur.Equals(a), nil } -func (cs *ChainStore) NearestCommonAncestor(a, b *types.TipSet) (*types.TipSet, error) { - l, _, err := cs.ReorgOps(a, b) +func (cs *ChainStore) NearestCommonAncestor(ctx context.Context, a, b *types.TipSet) (*types.TipSet, error) { + l, _, err := cs.ReorgOps(ctx, a, b) if err != nil { return nil, err } - return cs.LoadTipSet(l[len(l)-1].Parents()) + return cs.LoadTipSet(ctx, l[len(l)-1].Parents()) } // ReorgOps takes two tipsets (which can be at different heights), and walks @@ -879,11 +879,11 @@ func (cs *ChainStore) NearestCommonAncestor(a, b *types.TipSet) (*types.TipSet, // ancestor. // // If an error happens along the way, we return the error with nil slices. -func (cs *ChainStore) ReorgOps(a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { - return ReorgOps(cs.LoadTipSet, a, b) +func (cs *ChainStore) ReorgOps(ctx context.Context, a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { + return ReorgOps(ctx, cs.LoadTipSet, a, b) } -func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { +func ReorgOps(ctx context.Context, lts func(ctx context.Context, _ types.TipSetKey) (*types.TipSet, error), a, b *types.TipSet) ([]*types.TipSet, []*types.TipSet, error) { left := a right := b @@ -891,7 +891,7 @@ func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipS for !left.Equals(right) { if left.Height() > right.Height() { leftChain = append(leftChain, left) - par, err := lts(left.Parents()) + par, err := lts(ctx, left.Parents()) if err != nil { return nil, nil, err } @@ -899,7 +899,7 @@ func ReorgOps(lts func(types.TipSetKey) (*types.TipSet, error), a, b *types.TipS left = par } else { rightChain = append(rightChain, right) - par, err := lts(right.Parents()) + par, err := lts(ctx, right.Parents()) if err != nil { log.Infof("failed to fetch right.Parents: %s", err) return nil, nil, err @@ -921,7 +921,7 @@ func (cs *ChainStore) GetHeaviestTipSet() (ts *types.TipSet) { return } -func (cs *ChainStore) AddToTipSetTracker(b *types.BlockHeader) error { +func (cs *ChainStore) AddToTipSetTracker(ctx context.Context, b *types.BlockHeader) error { cs.tstLk.Lock() defer cs.tstLk.Unlock() @@ -931,7 +931,7 @@ func (cs *ChainStore) AddToTipSetTracker(b *types.BlockHeader) error { log.Debug("tried to add block to tipset tracker that was already there") return nil } - h, err := cs.GetBlock(oc) + h, err := cs.GetBlock(ctx, oc) if err == nil && h != nil { if h.Miner == b.Miner { log.Warnf("Have multiple blocks from miner %s at height %d in our tipset cache %s-%s", b.Miner, b.Height, b.Cid(), h.Cid()) @@ -960,7 +960,7 @@ func (cs *ChainStore) AddToTipSetTracker(b *types.BlockHeader) error { return nil } -func (cs *ChainStore) PersistBlockHeaders(b ...*types.BlockHeader) error { +func (cs *ChainStore) PersistBlockHeaders(ctx context.Context, b ...*types.BlockHeader) error { sbs := make([]block.Block, len(b)) for i, header := range b { @@ -982,13 +982,13 @@ func (cs *ChainStore) PersistBlockHeaders(b ...*types.BlockHeader) error { end = len(b) } - err = multierr.Append(err, cs.chainLocalBlockstore.PutMany(sbs[start:end])) + err = multierr.Append(err, cs.chainLocalBlockstore.PutMany(ctx, sbs[start:end])) } return err } -func (cs *ChainStore) expandTipset(b *types.BlockHeader) (*types.TipSet, error) { +func (cs *ChainStore) expandTipset(ctx context.Context, b *types.BlockHeader) (*types.TipSet, error) { // Hold lock for the whole function for now, if it becomes a problem we can // fix pretty easily cs.tstLk.Lock() @@ -1007,7 +1007,7 @@ func (cs *ChainStore) expandTipset(b *types.BlockHeader) (*types.TipSet, error) continue } - h, err := cs.GetBlock(bhc) + h, err := cs.GetBlock(ctx, bhc) if err != nil { return nil, xerrors.Errorf("failed to load block (%s) for tipset expansion: %w", bhc, err) } @@ -1029,11 +1029,11 @@ func (cs *ChainStore) expandTipset(b *types.BlockHeader) (*types.TipSet, error) } func (cs *ChainStore) AddBlock(ctx context.Context, b *types.BlockHeader) error { - if err := cs.PersistBlockHeaders(b); err != nil { + if err := cs.PersistBlockHeaders(ctx, b); err != nil { return err } - ts, err := cs.expandTipset(b) + ts, err := cs.expandTipset(ctx, b) if err != nil { return err } @@ -1045,8 +1045,8 @@ func (cs *ChainStore) AddBlock(ctx context.Context, b *types.BlockHeader) error return nil } -func (cs *ChainStore) GetGenesis() (*types.BlockHeader, error) { - data, err := cs.metadataDs.Get(dstore.NewKey("0")) +func (cs *ChainStore) GetGenesis(ctx context.Context) (*types.BlockHeader, error) { + data, err := cs.metadataDs.Get(ctx, dstore.NewKey("0")) if err != nil { return nil, err } @@ -1056,22 +1056,22 @@ func (cs *ChainStore) GetGenesis() (*types.BlockHeader, error) { return nil, err } - return cs.GetBlock(c) + return cs.GetBlock(ctx, c) } // GetPath returns the sequence of atomic head change operations that // need to be applied in order to switch the head of the chain from the `from` // tipset to the `to` tipset. func (cs *ChainStore) GetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*api.HeadChange, error) { - fts, err := cs.LoadTipSet(from) + fts, err := cs.LoadTipSet(ctx, from) if err != nil { return nil, xerrors.Errorf("loading from tipset %s: %w", from, err) } - tts, err := cs.LoadTipSet(to) + tts, err := cs.LoadTipSet(ctx, to) if err != nil { return nil, xerrors.Errorf("loading to tipset %s: %w", to, err) } - revert, apply, err := cs.ReorgOps(fts, tts) + revert, apply, err := cs.ReorgOps(ctx, fts, tts) if err != nil { return nil, xerrors.Errorf("error getting tipset branches: %w", err) } @@ -1154,7 +1154,7 @@ func (cs *ChainStore) GetTipsetByHeight(ctx context.Context, h abi.ChainEpoch, t if lbts.Height() < h { log.Warnf("chain index returned the wrong tipset at height %d, using slow retrieval", h) - lbts, err = cs.cindex.GetTipsetByHeightWithoutCache(ts, h) + lbts, err = cs.cindex.GetTipsetByHeightWithoutCache(ctx, ts, h) if err != nil { return nil, err } @@ -1164,7 +1164,7 @@ func (cs *ChainStore) GetTipsetByHeight(ctx context.Context, h abi.ChainEpoch, t return lbts, nil } - return cs.LoadTipSet(lbts.Parents()) + return cs.LoadTipSet(ctx, lbts.Parents()) } func (cs *ChainStore) Weight(ctx context.Context, hts *types.TipSet) (types.BigInt, error) { // todo remove @@ -1190,14 +1190,14 @@ func breakWeightTie(ts1, ts2 *types.TipSet) bool { return false } -func (cs *ChainStore) GetTipSetFromKey(tsk types.TipSetKey) (*types.TipSet, error) { +func (cs *ChainStore) GetTipSetFromKey(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { if tsk.IsEmpty() { return cs.GetHeaviestTipSet(), nil } - return cs.LoadTipSet(tsk) + return cs.LoadTipSet(ctx, tsk) } -func (cs *ChainStore) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry, error) { +func (cs *ChainStore) GetLatestBeaconEntry(ctx context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { cur := ts for i := 0; i < 20; i++ { cbe := cur.Blocks()[0].BeaconEntries @@ -1209,7 +1209,7 @@ func (cs *ChainStore) GetLatestBeaconEntry(ts *types.TipSet) (*types.BeaconEntry return nil, xerrors.Errorf("made it back to genesis block without finding beacon entry") } - next, err := cs.LoadTipSet(cur.Parents()) + next, err := cs.LoadTipSet(ctx, cur.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for latest beacon entry: %w", err) } diff --git a/chain/sync.go b/chain/sync.go index 34867b136..f6824c389 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -119,8 +119,8 @@ type SyncManagerCtor func(syncFn SyncFunc) SyncManager type Genesis *types.TipSet -func LoadGenesis(sm *stmgr.StateManager) (Genesis, error) { - gen, err := sm.ChainStore().GetGenesis() +func LoadGenesis(ctx context.Context, sm *stmgr.StateManager) (Genesis, error) { + gen, err := sm.ChainStore().GetGenesis(ctx) if err != nil { return nil, xerrors.Errorf("getting genesis block: %w", err) } @@ -227,7 +227,7 @@ func (syncer *Syncer) InformNewHead(from peer.ID, fts *store.FullTipSet) bool { // TODO: IMPORTANT(GARBAGE) this needs to be put in the 'temporary' side of // the blockstore - if err := syncer.store.PersistBlockHeaders(fts.TipSet().Blocks()...); err != nil { + if err := syncer.store.PersistBlockHeaders(ctx, fts.TipSet().Blocks()...); err != nil { log.Warn("failed to persist incoming block header: ", err) return false } @@ -360,7 +360,7 @@ func copyBlockstore(ctx context.Context, from, to bstore.Blockstore) error { // TODO: should probably expose better methods on the blockstore for this operation var blks []blocks.Block for c := range cids { - b, err := from.Get(c) + b, err := from.Get(ctx, c) if err != nil { return err } @@ -368,7 +368,7 @@ func copyBlockstore(ctx context.Context, from, to bstore.Blockstore) error { blks = append(blks, b) } - if err := to.PutMany(blks); err != nil { + if err := to.PutMany(ctx, blks); err != nil { return err } @@ -463,7 +463,7 @@ func computeMsgMeta(bs cbor.IpldStore, bmsgCids, smsgCids []cid.Cid) (cid.Cid, e // {hint/usage} This is used from the HELLO protocol, to fetch the greeting // peer's heaviest tipset if we don't have it. func (syncer *Syncer) FetchTipSet(ctx context.Context, p peer.ID, tsk types.TipSetKey) (*store.FullTipSet, error) { - if fts, err := syncer.tryLoadFullTipSet(tsk); err == nil { + if fts, err := syncer.tryLoadFullTipSet(ctx, tsk); err == nil { return fts, nil } @@ -474,8 +474,8 @@ func (syncer *Syncer) FetchTipSet(ctx context.Context, p peer.ID, tsk types.TipS // tryLoadFullTipSet queries the tipset in the ChainStore, and returns a full // representation of it containing FullBlocks. If ALL blocks are not found // locally, it errors entirely with blockstore.ErrNotFound. -func (syncer *Syncer) tryLoadFullTipSet(tsk types.TipSetKey) (*store.FullTipSet, error) { - ts, err := syncer.store.LoadTipSet(tsk) +func (syncer *Syncer) tryLoadFullTipSet(ctx context.Context, tsk types.TipSetKey) (*store.FullTipSet, error) { + ts, err := syncer.store.LoadTipSet(ctx, tsk) if err != nil { return nil, err } @@ -583,7 +583,7 @@ func (syncer *Syncer) ValidateTipSet(ctx context.Context, fts *store.FullTipSet, return xerrors.Errorf("validating block %s: %w", b.Cid(), err) } - if err := syncer.sm.ChainStore().AddToTipSetTracker(b.Header); err != nil { + if err := syncer.sm.ChainStore().AddToTipSetTracker(ctx, b.Header); err != nil { return xerrors.Errorf("failed to add validated header to tipset tracker: %w", err) } return nil @@ -755,7 +755,7 @@ loop: } // If, for some reason, we have a suffix of the chain locally, handle that here - ts, err := syncer.store.LoadTipSet(at) + ts, err := syncer.store.LoadTipSet(ctx, at) if err == nil { acceptedBlocks = append(acceptedBlocks, at.Cids()...) @@ -838,7 +838,7 @@ loop: return blockSet, nil } - knownParent, err := syncer.store.LoadTipSet(known.Parents()) + knownParent, err := syncer.store.LoadTipSet(ctx, known.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load next local tipset: %w", err) } @@ -892,7 +892,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know return nil, err } - nts, err := syncer.store.LoadTipSet(known.Parents()) + nts, err := syncer.store.LoadTipSet(ctx, known.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load next local tipset: %w", err) } @@ -928,7 +928,7 @@ func (syncer *Syncer) syncFork(ctx context.Context, incoming *types.TipSet, know return nil, ErrForkCheckpoint } - nts, err = syncer.store.LoadTipSet(nts.Parents()) + nts, err = syncer.store.LoadTipSet(ctx, nts.Parents()) if err != nil { return nil, xerrors.Errorf("loading next local tipset: %w", err) } @@ -1201,7 +1201,7 @@ func (syncer *Syncer) collectChain(ctx context.Context, ts *types.TipSet, hts *t for _, ts := range headers { toPersist = append(toPersist, ts.Blocks()...) } - if err := syncer.store.PersistBlockHeaders(toPersist...); err != nil { + if err := syncer.store.PersistBlockHeaders(ctx, toPersist...); err != nil { err = xerrors.Errorf("failed to persist synced blocks to the chainstore: %w", err) ss.Error(err) return err @@ -1245,7 +1245,7 @@ func (syncer *Syncer) CheckBadBlockCache(blk cid.Cid) (string, bool) { return bbr.String(), ok } -func (syncer *Syncer) getLatestBeaconEntry(_ context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { +func (syncer *Syncer) getLatestBeaconEntry(ctx context.Context, ts *types.TipSet) (*types.BeaconEntry, error) { cur := ts for i := 0; i < 20; i++ { cbe := cur.Blocks()[0].BeaconEntries @@ -1257,7 +1257,7 @@ func (syncer *Syncer) getLatestBeaconEntry(_ context.Context, ts *types.TipSet) return nil, xerrors.Errorf("made it back to genesis block without finding beacon entry") } - next, err := syncer.store.LoadTipSet(cur.Parents()) + next, err := syncer.store.LoadTipSet(ctx, cur.Parents()) if err != nil { return nil, xerrors.Errorf("failed to load parents when searching back for latest beacon entry: %w", err) } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 36308fe03..5e6291849 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -82,10 +82,10 @@ type gasChargingBlocks struct { under cbor.IpldBlockstore } -func (bs *gasChargingBlocks) View(c cid.Cid, cb func([]byte) error) error { +func (bs *gasChargingBlocks) View(ctx context.Context, c cid.Cid, cb func([]byte) error) error { if v, ok := bs.under.(blockstore.Viewer); ok { bs.chargeGas(bs.pricelist.OnIpldGet()) - return v.View(c, func(b []byte) error { + return v.View(ctx, c, func(b []byte) error { // we have successfully retrieved the value; charge for it, even if the user-provided function fails. bs.chargeGas(newGasCharge("OnIpldViewEnd", 0, 0).WithExtra(len(b))) bs.chargeGas(gasOnActorExec) @@ -93,16 +93,16 @@ func (bs *gasChargingBlocks) View(c cid.Cid, cb func([]byte) error) error { }) } // the underlying blockstore doesn't implement the viewer interface, fall back to normal Get behaviour. - blk, err := bs.Get(c) + blk, err := bs.Get(ctx, c) if err == nil && blk != nil { return cb(blk.RawData()) } return err } -func (bs *gasChargingBlocks) Get(c cid.Cid) (block.Block, error) { +func (bs *gasChargingBlocks) Get(ctx context.Context, c cid.Cid) (block.Block, error) { bs.chargeGas(bs.pricelist.OnIpldGet()) - blk, err := bs.under.Get(c) + blk, err := bs.under.Get(ctx, c) if err != nil { return nil, aerrors.Escalate(err, "failed to get block from blockstore") } @@ -112,10 +112,10 @@ func (bs *gasChargingBlocks) Get(c cid.Cid) (block.Block, error) { return blk, nil } -func (bs *gasChargingBlocks) Put(blk block.Block) error { +func (bs *gasChargingBlocks) Put(ctx context.Context, blk block.Block) error { bs.chargeGas(bs.pricelist.OnIpldPut(len(blk.RawData()))) - if err := bs.under.Put(blk); err != nil { + if err := bs.under.Put(ctx, blk); err != nil { return aerrors.Escalate(err, "failed to write data to disk") } bs.chargeGas(gasOnActorExec) @@ -706,7 +706,7 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err go func() { for b := range toFlush { - if err := to.PutMany(b); err != nil { + if err := to.PutMany(ctx, b); err != nil { close(freeBufs) errFlushChan <- xerrors.Errorf("batch put in copy: %w", err) return @@ -735,7 +735,7 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err return nil } - if err := copyRec(from, to, root, batchCp); err != nil { + if err := copyRec(ctx, from, to, root, batchCp); err != nil { return xerrors.Errorf("copyRec: %w", err) } @@ -760,13 +760,13 @@ func Copy(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid) err return nil } -func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) error) error { +func copyRec(ctx context.Context, from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) error) error { if root.Prefix().MhType == 0 { // identity cid, skip return nil } - blk, err := from.Get(root) + blk, err := from.Get(ctx, root) if err != nil { return xerrors.Errorf("get %s failed: %w", root, err) } @@ -791,7 +791,7 @@ func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) } } else { // If we have an object, we already have its children, skip the object. - has, err := to.Has(link) + has, err := to.Has(ctx, link) if err != nil { lerr = xerrors.Errorf("has: %w", err) return @@ -801,7 +801,7 @@ func copyRec(from, to blockstore.Blockstore, root cid.Cid, cp func(block.Block) } } - if err := copyRec(from, to, link, cp); err != nil { + if err := copyRec(ctx, from, to, link, cp); err != nil { lerr = err return } diff --git a/chain/wallet/ledger/ledger.go b/chain/wallet/ledger/ledger.go index eb16f6460..5279389de 100644 --- a/chain/wallet/ledger/ledger.go +++ b/chain/wallet/ledger/ledger.go @@ -39,7 +39,7 @@ type LedgerKeyInfo struct { var _ api.Wallet = (*LedgerWallet)(nil) func (lw LedgerWallet) WalletSign(ctx context.Context, signer address.Address, toSign []byte, meta api.MsgMeta) (*crypto.Signature, error) { - ki, err := lw.getKeyInfo(signer) + ki, err := lw.getKeyInfo(ctx, signer) if err != nil { return nil, err } @@ -80,8 +80,8 @@ func (lw LedgerWallet) WalletSign(ctx context.Context, signer address.Address, t }, nil } -func (lw LedgerWallet) getKeyInfo(addr address.Address) (*LedgerKeyInfo, error) { - kib, err := lw.ds.Get(keyForAddr(addr)) +func (lw LedgerWallet) getKeyInfo(ctx context.Context, addr address.Address) (*LedgerKeyInfo, error) { + kib, err := lw.ds.Get(ctx, keyForAddr(addr)) if err != nil { return nil, err } @@ -95,7 +95,7 @@ func (lw LedgerWallet) getKeyInfo(addr address.Address) (*LedgerKeyInfo, error) } func (lw LedgerWallet) WalletDelete(ctx context.Context, k address.Address) error { - return lw.ds.Delete(keyForAddr(k)) + return lw.ds.Delete(ctx, keyForAddr(k)) } func (lw LedgerWallet) WalletExport(ctx context.Context, k address.Address) (*types.KeyInfo, error) { @@ -103,7 +103,7 @@ func (lw LedgerWallet) WalletExport(ctx context.Context, k address.Address) (*ty } func (lw LedgerWallet) WalletHas(ctx context.Context, k address.Address) (bool, error) { - _, err := lw.ds.Get(keyForAddr(k)) + _, err := lw.ds.Get(ctx, keyForAddr(k)) if err == nil { return true, nil } @@ -118,10 +118,10 @@ func (lw LedgerWallet) WalletImport(ctx context.Context, kinfo *types.KeyInfo) ( if err := json.Unmarshal(kinfo.PrivateKey, &ki); err != nil { return address.Undef, err } - return lw.importKey(ki) + return lw.importKey(ctx, ki) } -func (lw LedgerWallet) importKey(ki LedgerKeyInfo) (address.Address, error) { +func (lw LedgerWallet) importKey(ctx context.Context, ki LedgerKeyInfo) (address.Address, error) { if ki.Address == address.Undef { return address.Undef, fmt.Errorf("no address given in imported key info") } @@ -133,7 +133,7 @@ func (lw LedgerWallet) importKey(ki LedgerKeyInfo) (address.Address, error) { return address.Undef, xerrors.Errorf("marshaling key info: %w", err) } - if err := lw.ds.Put(keyForAddr(ki.Address), bb); err != nil { + if err := lw.ds.Put(ctx, keyForAddr(ki.Address), bb); err != nil { return address.Undef, err } @@ -141,7 +141,7 @@ func (lw LedgerWallet) importKey(ki LedgerKeyInfo) (address.Address, error) { } func (lw LedgerWallet) WalletList(ctx context.Context) ([]address.Address, error) { - res, err := lw.ds.Query(query.Query{Prefix: dsLedgerPrefix}) + res, err := lw.ds.Query(ctx, query.Query{Prefix: dsLedgerPrefix}) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func (lw LedgerWallet) WalletNew(ctx context.Context, t types.KeyType) (address. t, types.KTSecp256k1Ledger) } - res, err := lw.ds.Query(query.Query{Prefix: dsLedgerPrefix}) + res, err := lw.ds.Query(ctx, query.Query{Prefix: dsLedgerPrefix}) if err != nil { return address.Undef, err } @@ -224,7 +224,7 @@ func (lw LedgerWallet) WalletNew(ctx context.Context, t types.KeyType) (address. lki.Address = a lki.Path = path - return lw.importKey(lki) + return lw.importKey(ctx, lki) } func (lw *LedgerWallet) Get() api.Wallet { diff --git a/cli/backup.go b/cli/backup.go index 856e098dd..4d88d4bbc 100644 --- a/cli/backup.go +++ b/cli/backup.go @@ -66,7 +66,7 @@ func BackupCmd(repoFlag string, rt repo.RepoType, getApi BackupApiFn) *cli.Comma return xerrors.Errorf("opening backup file %s: %w", fpath, err) } - if err := bds.Backup(out); err != nil { + if err := bds.Backup(cctx.Context, out); err != nil { if cerr := out.Close(); cerr != nil { log.Errorw("error closing backup file while handling backup error", "closeErr", cerr, "backupErr", err) } diff --git a/go.mod b/go.mod index 0b689b6a6..5c10d48f5 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969 + github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 @@ -74,7 +74,7 @@ require ( github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 github.com/ipfs/go-ds-leveldb v0.5.0 - github.com/ipfs/go-ds-measure v0.1.0 + github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 @@ -88,7 +88,7 @@ require ( github.com/ipfs/go-ipfs-http-client v0.0.6 github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 - github.com/ipfs/go-ipld-cbor v0.0.5 + github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 github.com/ipfs/go-merkledag v0.5.1 @@ -109,7 +109,7 @@ require ( github.com/libp2p/go-libp2p-connmgr v0.2.4 github.com/libp2p/go-libp2p-core v0.11.0 github.com/libp2p/go-libp2p-discovery v0.6.0 - github.com/libp2p/go-libp2p-kad-dht v0.13.0 + github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.4.0 github.com/libp2p/go-libp2p-pubsub v0.5.6 diff --git a/go.sum b/go.sum index b48bcc812..f8df41b81 100644 --- a/go.sum +++ b/go.sum @@ -334,8 +334,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969 h1:5N/aEyr+uuJC1dd+rdFgV+RQT7o6LqfkshSh8en3YiI= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211193119-ab98aecd0969/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -693,7 +693,6 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= @@ -722,8 +721,8 @@ github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1 github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= +github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= +github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= @@ -785,8 +784,9 @@ github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdr github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 h1:is/7IfZF1xug/95JAvZKTVvJrqnrXpSRNgBQORiqQf4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= @@ -1082,8 +1082,8 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= -github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= +github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= diff --git a/markets/dagstore/blockstore.go b/markets/dagstore/blockstore.go index 8980d40cf..317cb08b9 100644 --- a/markets/dagstore/blockstore.go +++ b/markets/dagstore/blockstore.go @@ -1,6 +1,7 @@ package dagstore import ( + "context" "io" blocks "github.com/ipfs/go-block-format" @@ -20,14 +21,14 @@ type Blockstore struct { var _ bstore.Blockstore = (*Blockstore)(nil) -func (b *Blockstore) DeleteBlock(c cid.Cid) error { +func (b *Blockstore) DeleteBlock(context.Context, cid.Cid) error { return xerrors.Errorf("DeleteBlock called but not implemented") } -func (b *Blockstore) Put(block blocks.Block) error { +func (b *Blockstore) Put(context.Context, blocks.Block) error { return xerrors.Errorf("Put called but not implemented") } -func (b *Blockstore) PutMany(blocks []blocks.Block) error { +func (b *Blockstore) PutMany(context.Context, []blocks.Block) error { return xerrors.Errorf("PutMany called but not implemented") } diff --git a/markets/storageadapter/provider.go b/markets/storageadapter/provider.go index 5c82d0dc8..bb9863bc4 100644 --- a/markets/storageadapter/provider.go +++ b/markets/storageadapter/provider.go @@ -228,7 +228,7 @@ func (n *ProviderNodeAdapter) GetBalance(ctx context.Context, addr address.Addre // TODO: why doesnt this method take in a sector ID? func (n *ProviderNodeAdapter) LocatePieceForDealWithinSector(ctx context.Context, dealID abi.DealID, encodedTs shared.TipSetToken) (sectorID abi.SectorNumber, offset abi.PaddedPieceSize, length abi.PaddedPieceSize, err error) { - refs, err := n.secb.GetRefs(dealID) + refs, err := n.secb.GetRefs(ctx, dealID) if err != nil { return 0, 0, 0, err } diff --git a/miner/miner.go b/miner/miner.go index 582ade723..c5f0a0129 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -325,7 +325,7 @@ minerLoop: "block-time", btime, "time", build.Clock.Now(), "difference", build.Clock.Since(btime)) } - if err := m.sf.MinedBlock(b.Header, base.TipSet.Height()+base.NullRounds); err != nil { + if err := m.sf.MinedBlock(ctx, b.Header, base.TipSet.Height()+base.NullRounds); err != nil { log.Errorf(" SLASH FILTER ERROR: %s", err) if os.Getenv("LOTUS_MINER_NO_SLASHFILTER") != "_yes_i_know_i_can_and_probably_will_lose_all_my_fil_and_power_" { continue diff --git a/node/hello/hello.go b/node/hello/hello.go index 5461dcc87..ac92d5170 100644 --- a/node/hello/hello.go +++ b/node/hello/hello.go @@ -141,7 +141,7 @@ func (hs *Service) SayHello(ctx context.Context, pid peer.ID) error { return err } - gen, err := hs.cs.GetGenesis() + gen, err := hs.cs.GetGenesis(ctx) if err != nil { return err } diff --git a/node/impl/backup.go b/node/impl/backup.go index 10f673a4b..7acc7e018 100644 --- a/node/impl/backup.go +++ b/node/impl/backup.go @@ -1,6 +1,7 @@ package impl import ( + "context" "os" "path/filepath" "strings" @@ -12,7 +13,7 @@ import ( "github.com/filecoin-project/lotus/node/modules/dtypes" ) -func backup(mds dtypes.MetadataDS, fpath string) error { +func backup(ctx context.Context, mds dtypes.MetadataDS, fpath string) error { bb, ok := os.LookupEnv("LOTUS_BACKUP_BASE_PATH") if !ok { return xerrors.Errorf("LOTUS_BACKUP_BASE_PATH env var not set") @@ -52,7 +53,7 @@ func backup(mds dtypes.MetadataDS, fpath string) error { return xerrors.Errorf("open %s: %w", fpath, err) } - if err := bds.Backup(out); err != nil { + if err := bds.Backup(ctx, out); err != nil { if cerr := out.Close(); cerr != nil { log.Errorw("error closing backup file while handling backup error", "closeErr", cerr, "backupErr", err) } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 4b6903d94..e3c365fee 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -150,7 +150,7 @@ func (a *API) dealStarter(ctx context.Context, params *api.StartDealParams, isSt if err != nil { return nil, xerrors.Errorf("failed to find blockstore for root CID: %w", err) } - if has, err := bs.Has(params.Data.Root); err != nil { + if has, err := bs.Has(ctx, params.Data.Root); err != nil { return nil, xerrors.Errorf("failed to query blockstore for root CID: %w", err) } else if !has { return nil, xerrors.Errorf("failed to find root CID in blockstore: %w", err) @@ -520,7 +520,7 @@ func (a *API) ClientImport(ctx context.Context, ref api.FileRef) (res *api.Impor } defer f.Close() //nolint:errcheck - hd, _, err := car.ReadHeader(bufio.NewReader(f)) + hd, err := car.ReadHeader(bufio.NewReader(f)) if err != nil { return nil, xerrors.Errorf("failed to read CAR header: %w", err) } @@ -1028,7 +1028,7 @@ func (a *API) outputCAR(ctx context.Context, ds format.DAGService, bs bstore.Blo } if cs.Visit(c) { - nb, err := bs.Get(c) + nb, err := bs.Get(ctx, c) if err != nil { return xerrors.Errorf("getting block data: %w", err) } @@ -1285,7 +1285,7 @@ func (a *API) ClientCalcCommP(ctx context.Context, inpath string) (*api.CommPRet } // check that the data is a car file; if it's not, retrieval won't work - _, _, err = car.ReadHeader(bufio.NewReader(rdr)) + _, err = car.ReadHeader(bufio.NewReader(rdr)) if err != nil { return nil, xerrors.Errorf("not a car file: %w", err) } diff --git a/node/impl/full.go b/node/impl/full.go index f9c83ded0..a6f61c305 100644 --- a/node/impl/full.go +++ b/node/impl/full.go @@ -42,7 +42,7 @@ type FullNodeAPI struct { } func (n *FullNodeAPI) CreateBackup(ctx context.Context, fpath string) error { - return backup(n.DS, fpath) + return backup(ctx, n.DS, fpath) } func (n *FullNodeAPI) NodeStatus(ctx context.Context, inclChainStatus bool) (status api.NodeStatus, err error) { diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 4ffbe0e63..e37304429 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -99,11 +99,11 @@ func (m *ChainModule) ChainHead(context.Context) (*types.TipSet, error) { } func (a *ChainAPI) ChainGetBlock(ctx context.Context, msg cid.Cid) (*types.BlockHeader, error) { - return a.Chain.GetBlock(msg) + return a.Chain.GetBlock(ctx, msg) } func (m *ChainModule) ChainGetTipSet(ctx context.Context, key types.TipSetKey) (*types.TipSet, error) { - return m.Chain.LoadTipSet(key) + return m.Chain.LoadTipSet(ctx, key) } func (m *ChainModule) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ([]*api.HeadChange, error) { @@ -111,7 +111,7 @@ func (m *ChainModule) ChainGetPath(ctx context.Context, from, to types.TipSetKey } func (m *ChainModule) ChainGetBlockMessages(ctx context.Context, msg cid.Cid) (*api.BlockMessages, error) { - b, err := m.Chain.GetBlock(msg) + b, err := m.Chain.GetBlock(ctx, msg) if err != nil { return nil, err } @@ -143,7 +143,7 @@ func (a *ChainAPI) ChainGetPath(ctx context.Context, from types.TipSetKey, to ty } func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([]api.Message, error) { - b, err := a.Chain.GetBlock(bcid) + b, err := a.Chain.GetBlock(ctx, bcid) if err != nil { return nil, err } @@ -154,7 +154,7 @@ func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([] } // TODO: need to get the number of messages better than this - pts, err := a.Chain.LoadTipSet(types.NewTipSetKey(b.Parents...)) + pts, err := a.Chain.LoadTipSet(ctx, types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } @@ -176,7 +176,7 @@ func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([] } func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([]*types.MessageReceipt, error) { - b, err := a.Chain.GetBlock(bcid) + b, err := a.Chain.GetBlock(ctx, bcid) if err != nil { return nil, err } @@ -186,7 +186,7 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([] } // TODO: need to get the number of messages better than this - pts, err := a.Chain.LoadTipSet(types.NewTipSetKey(b.Parents...)) + pts, err := a.Chain.LoadTipSet(ctx, types.NewTipSetKey(b.Parents...)) if err != nil { return nil, err } @@ -210,7 +210,7 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([] } func (a *ChainAPI) ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSetKey) ([]api.Message, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, err } @@ -237,7 +237,7 @@ func (a *ChainAPI) ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSe } func (m *ChainModule) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -245,7 +245,7 @@ func (m *ChainModule) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpo } func (m *ChainModule) ChainGetTipSetAfterHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -253,7 +253,7 @@ func (m *ChainModule) ChainGetTipSetAfterHeight(ctx context.Context, h abi.Chain } func (m *ChainModule) ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, error) { - blk, err := m.ExposedBlockstore.Get(obj) + blk, err := m.ExposedBlockstore.Get(ctx, obj) if err != nil { return nil, xerrors.Errorf("blockstore get: %w", err) } @@ -262,11 +262,11 @@ func (m *ChainModule) ChainReadObj(ctx context.Context, obj cid.Cid) ([]byte, er } func (a *ChainAPI) ChainDeleteObj(ctx context.Context, obj cid.Cid) error { - return a.ExposedBlockstore.DeleteBlock(obj) + return a.ExposedBlockstore.DeleteBlock(ctx, obj) } func (m *ChainModule) ChainHasObj(ctx context.Context, obj cid.Cid) (bool, error) { - return m.ExposedBlockstore.Has(obj) + return m.ExposedBlockstore.Has(ctx, obj) } func (a *ChainAPI) ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (api.ObjStat, error) { @@ -318,7 +318,7 @@ func (a *ChainAPI) ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) } func (a *ChainAPI) ChainSetHead(ctx context.Context, tsk types.TipSetKey) error { - newHeadTs, err := a.Chain.GetTipSetFromKey(tsk) + newHeadTs, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -342,11 +342,11 @@ func (a *ChainAPI) ChainSetHead(ctx context.Context, tsk types.TipSetKey) error } } - return a.Chain.SetHead(newHeadTs) + return a.Chain.SetHead(ctx, newHeadTs) } func (a *ChainAPI) ChainGetGenesis(ctx context.Context) (*types.TipSet, error) { - genb, err := a.Chain.GetGenesis() + genb, err := a.Chain.GetGenesis(ctx) if err != nil { return nil, err } @@ -355,7 +355,7 @@ func (a *ChainAPI) ChainGetGenesis(ctx context.Context) (*types.TipSet, error) { } func (a *ChainAPI) ChainTipSetWeight(ctx context.Context, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -434,7 +434,7 @@ func resolveOnce(bs blockstore.Blockstore, tse stmgr.Executor) func(ctx context. return nil, nil, err } - if err := bs.Put(n); err != nil { + if err := bs.Put(ctx, n); err != nil { return nil, nil, xerrors.Errorf("put hamt val: %w", err) } @@ -482,7 +482,7 @@ func resolveOnce(bs blockstore.Blockstore, tse stmgr.Executor) func(ctx context. return nil, nil, err } - if err := bs.Put(n); err != nil { + if err := bs.Put(ctx, n); err != nil { return nil, nil, xerrors.Errorf("put amt val: %w", err) } @@ -530,7 +530,7 @@ func resolveOnce(bs blockstore.Blockstore, tse stmgr.Executor) func(ctx context. return nil, nil, err } - if err := bs.Put(n); err != nil { + if err := bs.Put(ctx, n); err != nil { return nil, nil, xerrors.Errorf("put amt val: %w", err) } @@ -586,7 +586,7 @@ func (m *ChainModule) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.M } func (a *ChainAPI) ChainExport(ctx context.Context, nroots abi.ChainEpoch, skipoldmsgs bool, tsk types.TipSetKey) (<-chan []byte, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } diff --git a/node/impl/full/gas.go b/node/impl/full/gas.go index edf53ff63..c4c1bd580 100644 --- a/node/impl/full/gas.go +++ b/node/impl/full/gas.go @@ -173,7 +173,7 @@ func (a *GasAPI) GasEstimateGasPremium( gaslimit int64, _ types.TipSetKey, ) (types.BigInt, error) { - return gasEstimateGasPremium(a.Chain, a.PriceCache, nblocksincl) + return gasEstimateGasPremium(ctx, a.Chain, a.PriceCache, nblocksincl) } func (m *GasModule) GasEstimateGasPremium( ctx context.Context, @@ -182,9 +182,9 @@ func (m *GasModule) GasEstimateGasPremium( gaslimit int64, _ types.TipSetKey, ) (types.BigInt, error) { - return gasEstimateGasPremium(m.Chain, m.PriceCache, nblocksincl) + return gasEstimateGasPremium(ctx, m.Chain, m.PriceCache, nblocksincl) } -func gasEstimateGasPremium(cstore *store.ChainStore, cache *GasPriceCache, nblocksincl uint64) (types.BigInt, error) { +func gasEstimateGasPremium(ctx context.Context, cstore *store.ChainStore, cache *GasPriceCache, nblocksincl uint64) (types.BigInt, error) { if nblocksincl == 0 { nblocksincl = 1 } @@ -198,7 +198,7 @@ func gasEstimateGasPremium(cstore *store.ChainStore, cache *GasPriceCache, nbloc break // genesis } - pts, err := cstore.LoadTipSet(ts.Parents()) + pts, err := cstore.LoadTipSet(ctx, ts.Parents()) if err != nil { return types.BigInt{}, err } @@ -236,14 +236,14 @@ func gasEstimateGasPremium(cstore *store.ChainStore, cache *GasPriceCache, nbloc } func (a *GasAPI) GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return -1, xerrors.Errorf("getting tipset: %w", err) } return gasEstimateGasLimit(ctx, a.Chain, a.Stmgr, a.Mpool, msgIn, ts) } func (m *GasModule) GasEstimateGasLimit(ctx context.Context, msgIn *types.Message, tsk types.TipSetKey) (int64, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return -1, xerrors.Errorf("getting tipset: %w", err) } @@ -283,7 +283,7 @@ func gasEstimateGasLimit( if err != stmgr.ErrExpensiveFork { break } - ts, err = cstore.GetTipSetFromKey(ts.Parents()) + ts, err = cstore.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return -1, xerrors.Errorf("getting parent tipset: %w", err) } diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index f792cdf99..6e1873d5b 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -51,11 +51,11 @@ func (a *MpoolAPI) MpoolGetConfig(context.Context) (*types.MpoolConfig, error) { } func (a *MpoolAPI) MpoolSetConfig(ctx context.Context, cfg *types.MpoolConfig) error { - return a.Mpool.SetConfig(cfg) + return a.Mpool.SetConfig(ctx, cfg) } func (a *MpoolAPI) MpoolSelect(ctx context.Context, tsk types.TipSetKey, ticketQuality float64) ([]*types.SignedMessage, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -64,7 +64,7 @@ func (a *MpoolAPI) MpoolSelect(ctx context.Context, tsk types.TipSetKey, ticketQ } func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*types.SignedMessage, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -115,7 +115,7 @@ func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*ty return pending, nil } - ts, err = a.Chain.LoadTipSet(ts.Parents()) + ts, err = a.Chain.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("loading parent tipset: %w", err) } diff --git a/node/impl/full/state.go b/node/impl/full/state.go index e251fa3d5..7a96af150 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -132,7 +132,7 @@ func (a *StateAPI) StateMinerActiveSectors(ctx context.Context, maddr address.Ad } func (m *StateModule) StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return miner.MinerInfo{}, xerrors.Errorf("failed to load tipset: %w", err) } @@ -250,7 +250,7 @@ func (a *StateAPI) StateMinerPartitions(ctx context.Context, m address.Address, } func (m *StateModule) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -345,7 +345,7 @@ func (a *StateAPI) StateMinerRecoveries(ctx context.Context, addr address.Addres } func (m *StateModule) StateMinerPower(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*api.MinerPower, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -363,7 +363,7 @@ func (m *StateModule) StateMinerPower(ctx context.Context, addr address.Address, } func (a *StateAPI) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (res *api.InvocResult, err error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -372,7 +372,7 @@ func (a *StateAPI) StateCall(ctx context.Context, msg *types.Message, tsk types. if err != stmgr.ErrExpensiveFork { break } - ts, err = a.Chain.GetTipSetFromKey(ts.Parents()) + ts, err = a.Chain.GetTipSetFromKey(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("getting parent tipset: %w", err) } @@ -395,17 +395,17 @@ func (a *StateAPI) StateReplay(ctx context.Context, tsk types.TipSetKey, mc cid. msgToReplay = mlkp.Message - executionTs, err := a.Chain.GetTipSetFromKey(mlkp.TipSet) + executionTs, err := a.Chain.GetTipSetFromKey(ctx, mlkp.TipSet) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", mlkp.TipSet, err) } - ts, err = a.Chain.LoadTipSet(executionTs.Parents()) + ts, err = a.Chain.LoadTipSet(ctx, executionTs.Parents()) if err != nil { return nil, xerrors.Errorf("loading parent tipset %s: %w", mlkp.TipSet, err) } } else { - ts, err = a.Chain.LoadTipSet(tsk) + ts, err = a.Chain.LoadTipSet(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading specified tipset %s: %w", tsk, err) } @@ -433,7 +433,7 @@ func (a *StateAPI) StateReplay(ctx context.Context, tsk types.TipSetKey, mc cid. } func (m *StateModule) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (a *types.Actor, err error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -441,7 +441,7 @@ func (m *StateModule) StateGetActor(ctx context.Context, actor address.Address, } func (m *StateModule) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return address.Undef, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -450,7 +450,7 @@ func (m *StateModule) StateLookupID(ctx context.Context, addr address.Address, t } func (m *StateModule) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return address.Undef, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -459,7 +459,7 @@ func (m *StateModule) StateAccountKey(ctx context.Context, addr address.Address, } func (a *StateAPI) StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*api.ActorState, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -468,7 +468,7 @@ func (a *StateAPI) StateReadState(ctx context.Context, actor address.Address, ts return nil, xerrors.Errorf("getting actor: %w", err) } - blk, err := a.Chain.StateBlockstore().Get(act.Head) + blk, err := a.Chain.StateBlockstore().Get(ctx, act.Head) if err != nil { return nil, xerrors.Errorf("getting actor head: %w", err) } @@ -585,7 +585,7 @@ func (m *StateModule) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence } func (m *StateModule) StateSearchMsg(ctx context.Context, tsk types.TipSetKey, msg cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) { - fromTs, err := m.Chain.GetTipSetFromKey(tsk) + fromTs, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -607,7 +607,7 @@ func (m *StateModule) StateSearchMsg(ctx context.Context, tsk types.TipSetKey, m } func (m *StateModule) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -615,7 +615,7 @@ func (m *StateModule) StateListMiners(ctx context.Context, tsk types.TipSetKey) } func (a *StateAPI) StateListActors(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -623,7 +623,7 @@ func (a *StateAPI) StateListActors(ctx context.Context, tsk types.TipSetKey) ([] } func (m *StateModule) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return api.MarketBalance{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -633,7 +633,7 @@ func (m *StateModule) StateMarketBalance(ctx context.Context, addr address.Addre func (a *StateAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSetKey) (map[string]api.MarketBalance, error) { out := map[string]api.MarketBalance{} - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -673,7 +673,7 @@ func (a *StateAPI) StateMarketParticipants(ctx context.Context, tsk types.TipSet func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (map[string]api.MarketDeal, error) { out := map[string]api.MarketDeal{} - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -712,7 +712,7 @@ func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (m } func (m *StateModule) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -777,7 +777,7 @@ func (a *StateAPI) StateMinerSectorCount(ctx context.Context, addr address.Addre } func (a *StateAPI) StateSectorPreCommitInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return miner.SectorPreCommitOnChainInfo{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -793,7 +793,7 @@ func (a *StateAPI) StateSectorPreCommitInfo(ctx context.Context, maddr address.A } func (m *StateModule) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -825,7 +825,7 @@ func (a *StateAPI) StateSectorPartition(ctx context.Context, maddr address.Addre } func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatch, tsk types.TipSetKey, toheight abi.ChainEpoch) ([]cid.Cid, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -889,7 +889,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc break } - next, err := a.Chain.LoadTipSet(ts.Parents()) + next, err := a.Chain.LoadTipSet(ctx, ts.Parents()) if err != nil { return nil, xerrors.Errorf("loading next tipset: %w", err) } @@ -901,7 +901,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc } func (a *StateAPI) StateCompute(ctx context.Context, height abi.ChainEpoch, msgs []*types.Message, tsk types.TipSetKey) (*api.ComputeStateOutput, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -917,7 +917,7 @@ func (a *StateAPI) StateCompute(ctx context.Context, height abi.ChainEpoch, msgs } func (m *StateModule) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -938,7 +938,7 @@ func (m *StateModule) MsigGetAvailableBalance(ctx context.Context, addr address. } func (a *StateAPI) MsigGetVestingSchedule(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MsigVesting, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return api.EmptyVesting, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -976,12 +976,12 @@ func (a *StateAPI) MsigGetVestingSchedule(ctx context.Context, addr address.Addr } func (m *StateModule) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) { - startTs, err := m.Chain.GetTipSetFromKey(start) + startTs, err := m.Chain.GetTipSetFromKey(ctx, start) if err != nil { return types.EmptyInt, xerrors.Errorf("loading start tipset %s: %w", start, err) } - endTs, err := m.Chain.GetTipSetFromKey(end) + endTs, err := m.Chain.GetTipSetFromKey(ctx, end) if err != nil { return types.EmptyInt, xerrors.Errorf("loading end tipset %s: %w", end, err) } @@ -1016,7 +1016,7 @@ func (m *StateModule) MsigGetVested(ctx context.Context, addr address.Address, s } func (m *StateModule) MsigGetPending(ctx context.Context, addr address.Address, tsk types.TipSetKey) ([]*api.MsigTransaction, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1053,7 +1053,7 @@ var initialPledgeNum = types.NewInt(110) var initialPledgeDen = types.NewInt(100) func (a *StateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1114,7 +1114,7 @@ func (a *StateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr func (a *StateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, maddr address.Address, pci miner.SectorPreCommitInfo, tsk types.TipSetKey) (types.BigInt, error) { // TODO: this repeats a lot of the previous function. Fix that. - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1190,7 +1190,7 @@ func (a *StateAPI) StateMinerInitialPledgeCollateral(ctx context.Context, maddr } func (a *StateAPI) StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tsk types.TipSetKey) (types.BigInt, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1219,7 +1219,7 @@ func (a *StateAPI) StateMinerAvailableBalance(ctx context.Context, maddr address } func (a *StateAPI) StateMinerSectorAllocated(ctx context.Context, maddr address.Address, s abi.SectorNumber, tsk types.TipSetKey) (bool, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return false, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1319,7 +1319,7 @@ var dealProviderCollateralDen = types.NewInt(100) // StateDealProviderCollateralBounds returns the min and max collateral a storage provider // can issue. It takes the deal size and verified status as parameters. func (m *StateModule) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return api.DealCollateralBounds{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1376,7 +1376,7 @@ func (m *StateModule) StateDealProviderCollateralBounds(ctx context.Context, siz } func (a *StateAPI) StateCirculatingSupply(ctx context.Context, tsk types.TipSetKey) (abi.TokenAmount, error) { - ts, err := a.Chain.GetTipSetFromKey(tsk) + ts, err := a.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1397,7 +1397,7 @@ func stateVMCirculatingSupplyInternal( cstore *store.ChainStore, smgr *stmgr.StateManager, ) (api.CirculatingSupply, error) { - ts, err := cstore.GetTipSetFromKey(tsk) + ts, err := cstore.GetTipSetFromKey(ctx, tsk) if err != nil { return api.CirculatingSupply{}, xerrors.Errorf("loading tipset %s: %w", tsk, err) } @@ -1411,7 +1411,7 @@ func stateVMCirculatingSupplyInternal( } func (m *StateModule) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) { - ts, err := m.Chain.GetTipSetFromKey(tsk) + ts, err := m.Chain.GetTipSetFromKey(ctx, tsk) if err != nil { return network.VersionMax, xerrors.Errorf("loading tipset %s: %w", tsk, err) } diff --git a/node/impl/full/sync.go b/node/impl/full/sync.go index 652ae3ecb..25f7c784a 100644 --- a/node/impl/full/sync.go +++ b/node/impl/full/sync.go @@ -51,13 +51,13 @@ func (a *SyncAPI) SyncState(ctx context.Context) (*api.SyncState, error) { } func (a *SyncAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error { - parent, err := a.Syncer.ChainStore().GetBlock(blk.Header.Parents[0]) + parent, err := a.Syncer.ChainStore().GetBlock(ctx, blk.Header.Parents[0]) if err != nil { return xerrors.Errorf("loading parent block: %w", err) } if a.SlashFilter != nil { - if err := a.SlashFilter.MinedBlock(blk.Header, parent.Height); err != nil { + if err := a.SlashFilter.MinedBlock(ctx, blk.Header, parent.Height); err != nil { log.Errorf(" SLASH FILTER ERROR: %s", err) return xerrors.Errorf(" SLASH FILTER ERROR: %w", err) } @@ -137,7 +137,7 @@ func (a *SyncAPI) SyncCheckBad(ctx context.Context, bcid cid.Cid) (string, error } func (a *SyncAPI) SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) (bool, error) { - ts, err := a.Syncer.ChainStore().LoadTipSet(tsk) + ts, err := a.Syncer.ChainStore().LoadTipSet(ctx, tsk) if err != nil { return false, err } diff --git a/node/impl/paych/paych.go b/node/impl/paych/paych.go index 773a5efab..df3b1e3e4 100644 --- a/node/impl/paych/paych.go +++ b/node/impl/paych/paych.go @@ -35,11 +35,11 @@ func (a *PaychAPI) PaychGet(ctx context.Context, from, to address.Address, amt t } func (a *PaychAPI) PaychAvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) { - return a.PaychMgr.AvailableFunds(ch) + return a.PaychMgr.AvailableFunds(ctx, ch) } func (a *PaychAPI) PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*api.ChannelAvailableFunds, error) { - return a.PaychMgr.AvailableFundsByFromTo(from, to) + return a.PaychMgr.AvailableFundsByFromTo(ctx, from, to) } func (a *PaychAPI) PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (address.Address, error) { @@ -47,7 +47,7 @@ func (a *PaychAPI) PaychGetWaitReady(ctx context.Context, sentinel cid.Cid) (add } func (a *PaychAPI) PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) { - return a.PaychMgr.AllocateLane(ch) + return a.PaychMgr.AllocateLane(ctx, ch) } func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []api.VoucherSpec) (*api.PaymentInfo, error) { @@ -60,7 +60,7 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address return nil, err } - lane, err := a.PaychMgr.AllocateLane(ch.Channel) + lane, err := a.PaychMgr.AllocateLane(ctx, ch.Channel) if err != nil { return nil, err } @@ -95,11 +95,11 @@ func (a *PaychAPI) PaychNewPayment(ctx context.Context, from, to address.Address } func (a *PaychAPI) PaychList(ctx context.Context) ([]address.Address, error) { - return a.PaychMgr.ListChannels() + return a.PaychMgr.ListChannels(ctx) } func (a *PaychAPI) PaychStatus(ctx context.Context, pch address.Address) (*api.PaychStatus, error) { - ci, err := a.PaychMgr.GetChannelInfo(pch) + ci, err := a.PaychMgr.GetChannelInfo(ctx, pch) if err != nil { return nil, err } diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 39baa97bf..b94097d39 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -300,11 +300,11 @@ func (sm *StorageMinerAPI) StorageLocal(ctx context.Context) (map[stores.ID]stri return out, nil } -func (sm *StorageMinerAPI) SectorsRefs(context.Context) (map[string][]api.SealedRef, error) { +func (sm *StorageMinerAPI) SectorsRefs(ctx context.Context) (map[string][]api.SealedRef, error) { // json can't handle cids as map keys out := map[string][]api.SealedRef{} - refs, err := sm.SectorBlocks.List() + refs, err := sm.SectorBlocks.List(ctx) if err != nil { return nil, err } @@ -948,7 +948,7 @@ func (sm *StorageMinerAPI) PiecesGetCIDInfo(ctx context.Context, payloadCid cid. } func (sm *StorageMinerAPI) CreateBackup(ctx context.Context, fpath string) error { - return backup(sm.DS, fpath) + return backup(ctx, sm.DS, fpath) } func (sm *StorageMinerAPI) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []sto.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) { diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index b0436e9c9..66c45297a 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -34,8 +34,6 @@ type P2PHostIn struct { type RawHost host.Host func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (RawHost, error) { - ctx := helpers.LifecycleCtx(mctx, lc) - pkey := params.Peerstore.PrivKey(params.ID) if pkey == nil { return nil, fmt.Errorf("missing private key for node ID: %s", params.ID.Pretty()) @@ -52,7 +50,7 @@ func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (RawHost, opts = append(opts, o...) } - h, err := libp2p.New(ctx, opts...) + h, err := libp2p.New(opts...) if err != nil { return nil, err } diff --git a/node/repo/imports/manager.go b/node/repo/imports/manager.go index d972ffb77..2deaa30af 100644 --- a/node/repo/imports/manager.go +++ b/node/repo/imports/manager.go @@ -1,6 +1,7 @@ package imports import ( + "context" "encoding/json" "fmt" "os" @@ -107,6 +108,7 @@ type Meta struct { // CreateImport initializes a new import, returning its ID and optionally a // CAR path where to place the data, if requested. func (m *Manager) CreateImport() (id ID, err error) { + ctx := context.TODO() id = ID(m.counter.Next()) meta := &Meta{Labels: map[LabelKey]LabelValue{ @@ -118,7 +120,7 @@ func (m *Manager) CreateImport() (id ID, err error) { return 0, xerrors.Errorf("marshaling store metadata: %w", err) } - err = m.ds.Put(id.dsKey(), metajson) + err = m.ds.Put(ctx, id.dsKey(), metajson) if err != nil { return 0, xerrors.Errorf("failed to insert import metadata: %w", err) } @@ -129,7 +131,8 @@ func (m *Manager) CreateImport() (id ID, err error) { // AllocateCAR creates a new CAR allocated to the supplied import under the // root directory. func (m *Manager) AllocateCAR(id ID) (path string, err error) { - meta, err := m.ds.Get(id.dsKey()) + ctx := context.TODO() + meta, err := m.ds.Get(ctx, id.dsKey()) if err != nil { return "", xerrors.Errorf("getting metadata form datastore: %w", err) } @@ -163,14 +166,15 @@ func (m *Manager) AllocateCAR(id ID) (path string, err error) { return "", xerrors.Errorf("marshaling store metadata: %w", err) } - err = m.ds.Put(id.dsKey(), meta) + err = m.ds.Put(ctx, id.dsKey(), meta) return path, err } // AddLabel adds a label associated with an import, such as the source, // car path, CID, etc. func (m *Manager) AddLabel(id ID, key LabelKey, value LabelValue) error { - meta, err := m.ds.Get(id.dsKey()) + ctx := context.TODO() + meta, err := m.ds.Get(ctx, id.dsKey()) if err != nil { return xerrors.Errorf("getting metadata form datastore: %w", err) } @@ -187,14 +191,15 @@ func (m *Manager) AddLabel(id ID, key LabelKey, value LabelValue) error { return xerrors.Errorf("marshaling store meta: %w", err) } - return m.ds.Put(id.dsKey(), meta) + return m.ds.Put(ctx, id.dsKey(), meta) } // List returns all import IDs known by this Manager. func (m *Manager) List() ([]ID, error) { + ctx := context.TODO() var keys []ID - qres, err := m.ds.Query(query.Query{KeysOnly: true}) + qres, err := m.ds.Query(ctx, query.Query{KeysOnly: true}) if err != nil { return nil, xerrors.Errorf("query error: %w", err) } @@ -218,7 +223,9 @@ func (m *Manager) List() ([]ID, error) { // Info returns the metadata known to this store for the specified import ID. func (m *Manager) Info(id ID) (*Meta, error) { - meta, err := m.ds.Get(id.dsKey()) + ctx := context.TODO() + + meta, err := m.ds.Get(ctx, id.dsKey()) if err != nil { return nil, xerrors.Errorf("getting metadata form datastore: %w", err) } @@ -233,7 +240,8 @@ func (m *Manager) Info(id ID) (*Meta, error) { // Remove drops all data associated with the supplied import ID. func (m *Manager) Remove(id ID) error { - if err := m.ds.Delete(id.dsKey()); err != nil { + ctx := context.TODO() + if err := m.ds.Delete(ctx, id.dsKey()); err != nil { return xerrors.Errorf("removing import metadata: %w", err) } return nil diff --git a/paychmgr/accessorcache.go b/paychmgr/accessorcache.go index 176fbdd11..358cf7900 100644 --- a/paychmgr/accessorcache.go +++ b/paychmgr/accessorcache.go @@ -1,6 +1,10 @@ package paychmgr -import "github.com/filecoin-project/go-address" +import ( + "context" + + "github.com/filecoin-project/go-address" +) // accessorByFromTo gets a channel accessor for a given from / to pair. // The channel accessor facilitates locking a channel so that operations @@ -36,10 +40,10 @@ func (pm *Manager) accessorByFromTo(from address.Address, to address.Address) (* // The channel accessor facilitates locking a channel so that operations // must be performed sequentially on a channel (but can be performed at // the same time on different channels). -func (pm *Manager) accessorByAddress(ch address.Address) (*channelAccessor, error) { +func (pm *Manager) accessorByAddress(ctx context.Context, ch address.Address) (*channelAccessor, error) { // Get the channel from / to pm.lk.RLock() - channelInfo, err := pm.store.ByAddress(ch) + channelInfo, err := pm.store.ByAddress(ctx, ch) pm.lk.RUnlock() if err != nil { return nil, err diff --git a/paychmgr/manager.go b/paychmgr/manager.go index 460722945..e0fcd7a75 100644 --- a/paychmgr/manager.go +++ b/paychmgr/manager.go @@ -92,7 +92,7 @@ func newManager(pchstore *Store, pchapi managerAPI) (*Manager, error) { // Start restarts tracking of any messages that were sent to chain. func (pm *Manager) Start() error { - return pm.restartPending() + return pm.restartPending(pm.ctx) } // Stop shuts down any processes used by the manager @@ -110,27 +110,27 @@ func (pm *Manager) GetPaych(ctx context.Context, from, to address.Address, amt t return chanAccessor.getPaych(ctx, amt) } -func (pm *Manager) AvailableFunds(ch address.Address) (*api.ChannelAvailableFunds, error) { - ca, err := pm.accessorByAddress(ch) +func (pm *Manager) AvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) { + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } - ci, err := ca.getChannelInfo(ch) + ci, err := ca.getChannelInfo(ctx, ch) if err != nil { return nil, err } - return ca.availableFunds(ci.ChannelID) + return ca.availableFunds(ctx, ci.ChannelID) } -func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Address) (*api.ChannelAvailableFunds, error) { +func (pm *Manager) AvailableFundsByFromTo(ctx context.Context, from address.Address, to address.Address) (*api.ChannelAvailableFunds, error) { ca, err := pm.accessorByFromTo(from, to) if err != nil { return nil, err } - ci, err := ca.outboundActiveByFromTo(from, to) + ci, err := ca.outboundActiveByFromTo(ctx, from, to) if err == ErrChannelNotTracked { // If there is no active channel between from / to we still want to // return an empty ChannelAvailableFunds, so that clients can check @@ -151,7 +151,7 @@ func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Addre return nil, err } - return ca.availableFunds(ci.ChannelID) + return ca.availableFunds(ctx, ci.ChannelID) } // GetPaychWaitReady waits until the create channel / add funds message with the @@ -160,7 +160,7 @@ func (pm *Manager) AvailableFundsByFromTo(from address.Address, to address.Addre func (pm *Manager) GetPaychWaitReady(ctx context.Context, mcid cid.Cid) (address.Address, error) { // Find the channel associated with the message CID pm.lk.Lock() - ci, err := pm.store.ByMessageCid(mcid) + ci, err := pm.store.ByMessageCid(ctx, mcid) pm.lk.Unlock() if err != nil { @@ -178,25 +178,25 @@ func (pm *Manager) GetPaychWaitReady(ctx context.Context, mcid cid.Cid) (address return chanAccessor.getPaychWaitReady(ctx, mcid) } -func (pm *Manager) ListChannels() ([]address.Address, error) { +func (pm *Manager) ListChannels(ctx context.Context) ([]address.Address, error) { // Need to take an exclusive lock here so that channel operations can't run // in parallel (see channelLock) pm.lk.Lock() defer pm.lk.Unlock() - return pm.store.ListChannels() + return pm.store.ListChannels(ctx) } -func (pm *Manager) GetChannelInfo(addr address.Address) (*ChannelInfo, error) { - ca, err := pm.accessorByAddress(addr) +func (pm *Manager) GetChannelInfo(ctx context.Context, addr address.Address) (*ChannelInfo, error) { + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return nil, err } - return ca.getChannelInfo(addr) + return ca.getChannelInfo(ctx, addr) } func (pm *Manager) CreateVoucher(ctx context.Context, ch address.Address, voucher paych.SignedVoucher) (*api.VoucherCreateResult, error) { - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } @@ -223,7 +223,7 @@ func (pm *Manager) CheckVoucherSpendable(ctx context.Context, ch address.Address if len(proof) > 0 { return false, errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return false, err } @@ -237,7 +237,7 @@ func (pm *Manager) AddVoucherOutbound(ctx context.Context, ch address.Address, s if len(proof) > 0 { return types.NewInt(0), errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return types.NewInt(0), err } @@ -283,7 +283,7 @@ func (pm *Manager) trackInboundChannel(ctx context.Context, ch address.Address) defer pm.lk.Unlock() // Check if channel is in store - ci, err := pm.store.ByAddress(ch) + ci, err := pm.store.ByAddress(ctx, ch) if err == nil { // Channel is in store, so it's already being tracked return ci, nil @@ -316,7 +316,7 @@ func (pm *Manager) trackInboundChannel(ctx context.Context, ch address.Address) } // Save channel to store - return pm.store.TrackChannel(stateCi) + return pm.store.TrackChannel(ctx, stateCi) } // TODO: secret vs proof doesn't make sense, there is only one, not two @@ -324,23 +324,23 @@ func (pm *Manager) SubmitVoucher(ctx context.Context, ch address.Address, sv *pa if len(proof) > 0 { return cid.Undef, errProofNotSupported } - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return cid.Undef, err } return ca.submitVoucher(ctx, ch, sv, secret) } -func (pm *Manager) AllocateLane(ch address.Address) (uint64, error) { - ca, err := pm.accessorByAddress(ch) +func (pm *Manager) AllocateLane(ctx context.Context, ch address.Address) (uint64, error) { + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return 0, err } - return ca.allocateLane(ch) + return ca.allocateLane(ctx, ch) } func (pm *Manager) ListVouchers(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { - ca, err := pm.accessorByAddress(ch) + ca, err := pm.accessorByAddress(ctx, ch) if err != nil { return nil, err } @@ -348,7 +348,7 @@ func (pm *Manager) ListVouchers(ctx context.Context, ch address.Address) ([]*Vou } func (pm *Manager) Settle(ctx context.Context, addr address.Address) (cid.Cid, error) { - ca, err := pm.accessorByAddress(addr) + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return cid.Undef, err } @@ -356,7 +356,7 @@ func (pm *Manager) Settle(ctx context.Context, addr address.Address) (cid.Cid, e } func (pm *Manager) Collect(ctx context.Context, addr address.Address) (cid.Cid, error) { - ca, err := pm.accessorByAddress(addr) + ca, err := pm.accessorByAddress(ctx, addr) if err != nil { return cid.Undef, err } diff --git a/paychmgr/paych.go b/paychmgr/paych.go index e5e47dfca..16c6604c6 100644 --- a/paychmgr/paych.go +++ b/paychmgr/paych.go @@ -95,18 +95,18 @@ func (ca *channelAccessor) messageBuilder(ctx context.Context, from address.Addr return paych.Message(av, from), nil } -func (ca *channelAccessor) getChannelInfo(addr address.Address) (*ChannelInfo, error) { +func (ca *channelAccessor) getChannelInfo(ctx context.Context, addr address.Address) (*ChannelInfo, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.ByAddress(addr) + return ca.store.ByAddress(ctx, addr) } -func (ca *channelAccessor) outboundActiveByFromTo(from, to address.Address) (*ChannelInfo, error) { +func (ca *channelAccessor) outboundActiveByFromTo(ctx context.Context, from, to address.Address) (*ChannelInfo, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.OutboundActiveByFromTo(from, to) + return ca.store.OutboundActiveByFromTo(ctx, from, to) } // createVoucher creates a voucher with the given specification, setting its @@ -118,7 +118,7 @@ func (ca *channelAccessor) createVoucher(ctx context.Context, ch address.Address defer ca.lk.Unlock() // Find the channel for the voucher - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return nil, xerrors.Errorf("failed to get channel info by address: %w", err) } @@ -229,7 +229,7 @@ func (ca *channelAccessor) checkVoucherValidUnlocked(ctx context.Context, ch add } // Check the voucher against the highest known voucher nonce / value - laneStates, err := ca.laneState(pchState, ch) + laneStates, err := ca.laneState(ctx, pchState, ch) if err != nil { return nil, err } @@ -298,7 +298,7 @@ func (ca *channelAccessor) checkVoucherSpendable(ctx context.Context, ch address return false, err } - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return false, err } @@ -351,7 +351,7 @@ func (ca *channelAccessor) addVoucher(ctx context.Context, ch address.Address, s } func (ca *channelAccessor) addVoucherUnlocked(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, minDelta types.BigInt) (types.BigInt, error) { - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return types.BigInt{}, err } @@ -400,14 +400,14 @@ func (ca *channelAccessor) addVoucherUnlocked(ctx context.Context, ch address.Ad ci.NextLane = sv.Lane + 1 } - return delta, ca.store.putChannelInfo(ci) + return delta, ca.store.putChannelInfo(ctx, ci) } func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address, sv *paych.SignedVoucher, secret []byte) (cid.Cid, error) { ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } @@ -453,7 +453,7 @@ func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address } // Mark the voucher and any lower-nonce vouchers as having been submitted - err = ca.store.MarkVoucherSubmitted(ci, sv) + err = ca.store.MarkVoucherSubmitted(ctx, ci, sv) if err != nil { return cid.Undef, err } @@ -461,11 +461,11 @@ func (ca *channelAccessor) submitVoucher(ctx context.Context, ch address.Address return smsg.Cid(), nil } -func (ca *channelAccessor) allocateLane(ch address.Address) (uint64, error) { +func (ca *channelAccessor) allocateLane(ctx context.Context, ch address.Address) (uint64, error) { ca.lk.Lock() defer ca.lk.Unlock() - return ca.store.AllocateLane(ch) + return ca.store.AllocateLane(ctx, ch) } func (ca *channelAccessor) listVouchers(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { @@ -474,12 +474,12 @@ func (ca *channelAccessor) listVouchers(ctx context.Context, ch address.Address) // TODO: just having a passthrough method like this feels odd. Seems like // there should be some filtering we're doing here - return ca.store.VouchersForPaych(ch) + return ca.store.VouchersForPaych(ctx, ch) } // laneState gets the LaneStates from chain, then applies all vouchers in // the data store over the chain state -func (ca *channelAccessor) laneState(state paych.State, ch address.Address) (map[uint64]paych.LaneState, error) { +func (ca *channelAccessor) laneState(ctx context.Context, state paych.State, ch address.Address) (map[uint64]paych.LaneState, error) { // TODO: we probably want to call UpdateChannelState with all vouchers to be fully correct // (but technically dont't need to) @@ -501,7 +501,7 @@ func (ca *channelAccessor) laneState(state paych.State, ch address.Address) (map } // Apply locally stored vouchers - vouchers, err := ca.store.VouchersForPaych(ch) + vouchers, err := ca.store.VouchersForPaych(ctx, ch) if err != nil && err != ErrChannelNotTracked { return nil, err } @@ -583,7 +583,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } @@ -602,7 +602,7 @@ func (ca *channelAccessor) settle(ctx context.Context, ch address.Address) (cid. } ci.Settling = true - err = ca.store.putChannelInfo(ci) + err = ca.store.putChannelInfo(ctx, ci) if err != nil { log.Errorf("Error marking channel as settled: %s", err) } @@ -614,7 +614,7 @@ func (ca *channelAccessor) collect(ctx context.Context, ch address.Address) (cid ca.lk.Lock() defer ca.lk.Unlock() - ci, err := ca.store.ByAddress(ch) + ci, err := ca.store.ByAddress(ctx, ch) if err != nil { return cid.Undef, err } diff --git a/paychmgr/simple.go b/paychmgr/simple.go index f93c6d5bd..502338e29 100644 --- a/paychmgr/simple.go +++ b/paychmgr/simple.go @@ -159,7 +159,7 @@ func (m *mergedFundsReq) sum() types.BigInt { func (ca *channelAccessor) getPaych(ctx context.Context, amt types.BigInt) (address.Address, cid.Cid, error) { // Add the request to add funds to a queue and wait for the result freq := newFundsReq(ctx, amt) - ca.enqueue(freq) + ca.enqueue(ctx, freq) select { case res := <-freq.promise: return res.channel, res.mcid, res.err @@ -170,16 +170,16 @@ func (ca *channelAccessor) getPaych(ctx context.Context, amt types.BigInt) (addr } // Queue up an add funds operation -func (ca *channelAccessor) enqueue(task *fundsReq) { +func (ca *channelAccessor) enqueue(ctx context.Context, task *fundsReq) { ca.lk.Lock() defer ca.lk.Unlock() ca.fundsReqQueue = append(ca.fundsReqQueue, task) - go ca.processQueue("") // nolint: errcheck + go ca.processQueue(ctx, "") // nolint: errcheck } // Run the operations in the queue -func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailableFunds, error) { +func (ca *channelAccessor) processQueue(ctx context.Context, channelID string) (*api.ChannelAvailableFunds, error) { ca.lk.Lock() defer ca.lk.Unlock() @@ -188,7 +188,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable // If there's nothing in the queue, bail out if len(ca.fundsReqQueue) == 0 { - return ca.currentAvailableFunds(channelID, types.NewInt(0)) + return ca.currentAvailableFunds(ctx, channelID, types.NewInt(0)) } // Merge all pending requests into one. @@ -199,7 +199,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable if amt.IsZero() { // Note: The amount can be zero if requests are cancelled as we're // building the mergedFundsReq - return ca.currentAvailableFunds(channelID, amt) + return ca.currentAvailableFunds(ctx, channelID, amt) } res := ca.processTask(merged.ctx, amt) @@ -209,7 +209,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable if res == nil { // Stop processing the fundsReqQueue and wait. When the event occurs it will // call processQueue() again - return ca.currentAvailableFunds(channelID, amt) + return ca.currentAvailableFunds(ctx, channelID, amt) } // Finished processing so clear the queue @@ -218,7 +218,7 @@ func (ca *channelAccessor) processQueue(channelID string) (*api.ChannelAvailable // Call the task callback with its results merged.onComplete(res) - return ca.currentAvailableFunds(channelID, types.NewInt(0)) + return ca.currentAvailableFunds(ctx, channelID, types.NewInt(0)) } // filterQueue filters cancelled requests out of the queue @@ -255,12 +255,12 @@ func (ca *channelAccessor) queueSize() int { // msgWaitComplete is called when the message for a previous task is confirmed // or there is an error. -func (ca *channelAccessor) msgWaitComplete(mcid cid.Cid, err error) { +func (ca *channelAccessor) msgWaitComplete(ctx context.Context, mcid cid.Cid, err error) { ca.lk.Lock() defer ca.lk.Unlock() // Save the message result to the store - dserr := ca.store.SaveMessageResult(mcid, err) + dserr := ca.store.SaveMessageResult(ctx, mcid, err) if dserr != nil { log.Errorf("saving message result: %s", dserr) } @@ -271,16 +271,16 @@ func (ca *channelAccessor) msgWaitComplete(mcid cid.Cid, err error) { // The queue may have been waiting for msg completion to proceed, so // process the next queue item if len(ca.fundsReqQueue) > 0 { - go ca.processQueue("") // nolint: errcheck + go ca.processQueue(ctx, "") // nolint: errcheck } } -func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt types.BigInt) (*api.ChannelAvailableFunds, error) { +func (ca *channelAccessor) currentAvailableFunds(ctx context.Context, channelID string, queuedAmt types.BigInt) (*api.ChannelAvailableFunds, error) { if len(channelID) == 0 { return nil, nil } - channelInfo, err := ca.store.ByChannelID(channelID) + channelInfo, err := ca.store.ByChannelID(ctx, channelID) if err != nil { return nil, err } @@ -302,7 +302,7 @@ func (ca *channelAccessor) currentAvailableFunds(channelID string, queuedAmt typ return nil, err } - laneStates, err := ca.laneState(pchState, ch) + laneStates, err := ca.laneState(ctx, pchState, ch) if err != nil { return nil, err } @@ -337,7 +337,7 @@ func (ca *channelAccessor) processTask(ctx context.Context, amt types.BigInt) *p // Get the payment channel for the from/to addresses. // Note: It's ok if we get ErrChannelNotTracked. It just means we need to // create a channel. - channelInfo, err := ca.store.OutboundActiveByFromTo(ca.from, ca.to) + channelInfo, err := ca.store.OutboundActiveByFromTo(ctx, ca.from, ca.to) if err != nil && err != ErrChannelNotTracked { return &paychFundsRes{err: err} } @@ -393,26 +393,26 @@ func (ca *channelAccessor) createPaych(ctx context.Context, amt types.BigInt) (c mcid := smsg.Cid() // Create a new channel in the store - ci, err := ca.store.CreateChannel(ca.from, ca.to, mcid, amt) + ci, err := ca.store.CreateChannel(ctx, ca.from, ca.to, mcid, amt) if err != nil { log.Errorf("creating channel: %s", err) return cid.Undef, err } // Wait for the channel to be created on chain - go ca.waitForPaychCreateMsg(ci.ChannelID, mcid) + go ca.waitForPaychCreateMsg(ctx, ci.ChannelID, mcid) return mcid, nil } // waitForPaychCreateMsg waits for mcid to appear on chain and stores the robust address of the // created payment channel -func (ca *channelAccessor) waitForPaychCreateMsg(channelID string, mcid cid.Cid) { - err := ca.waitPaychCreateMsg(channelID, mcid) - ca.msgWaitComplete(mcid, err) +func (ca *channelAccessor) waitForPaychCreateMsg(ctx context.Context, channelID string, mcid cid.Cid) { + err := ca.waitPaychCreateMsg(ctx, channelID, mcid) + ca.msgWaitComplete(ctx, mcid, err) } -func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) error { +func (ca *channelAccessor) waitPaychCreateMsg(ctx context.Context, channelID string, mcid cid.Cid) error { mwait, err := ca.api.StateWaitMsg(ca.chctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { log.Errorf("wait msg: %v", err) @@ -425,7 +425,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er defer ca.lk.Unlock() // Channel creation failed, so remove the channel from the datastore - dserr := ca.store.RemoveChannel(channelID) + dserr := ca.store.RemoveChannel(ctx, channelID) if dserr != nil { log.Errorf("failed to remove channel %s: %s", channelID, dserr) } @@ -449,7 +449,7 @@ func (ca *channelAccessor) waitPaychCreateMsg(channelID string, mcid cid.Cid) er defer ca.lk.Unlock() // Store robust address of channel - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.Channel = &decodedReturn.RobustAddress channelInfo.Amount = channelInfo.PendingAmount channelInfo.PendingAmount = big.NewInt(0) @@ -475,30 +475,30 @@ func (ca *channelAccessor) addFunds(ctx context.Context, channelInfo *ChannelInf mcid := smsg.Cid() // Store the add funds message CID on the channel - ca.mutateChannelInfo(channelInfo.ChannelID, func(ci *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelInfo.ChannelID, func(ci *ChannelInfo) { ci.PendingAmount = amt ci.AddFundsMsg = &mcid }) // Store a reference from the message CID to the channel, so that we can // look up the channel from the message CID - err = ca.store.SaveNewMessage(channelInfo.ChannelID, mcid) + err = ca.store.SaveNewMessage(ctx, channelInfo.ChannelID, mcid) if err != nil { log.Errorf("saving add funds message CID %s: %s", mcid, err) } - go ca.waitForAddFundsMsg(channelInfo.ChannelID, mcid) + go ca.waitForAddFundsMsg(ctx, channelInfo.ChannelID, mcid) return &mcid, nil } // waitForAddFundsMsg waits for mcid to appear on chain and returns error, if any -func (ca *channelAccessor) waitForAddFundsMsg(channelID string, mcid cid.Cid) { - err := ca.waitAddFundsMsg(channelID, mcid) - ca.msgWaitComplete(mcid, err) +func (ca *channelAccessor) waitForAddFundsMsg(ctx context.Context, channelID string, mcid cid.Cid) { + err := ca.waitAddFundsMsg(ctx, channelID, mcid) + ca.msgWaitComplete(ctx, mcid, err) } -func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error { +func (ca *channelAccessor) waitAddFundsMsg(ctx context.Context, channelID string, mcid cid.Cid) error { mwait, err := ca.api.StateWaitMsg(ca.chctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { log.Error(err) @@ -512,7 +512,7 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error ca.lk.Lock() defer ca.lk.Unlock() - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.PendingAmount = big.NewInt(0) channelInfo.AddFundsMsg = nil }) @@ -524,7 +524,7 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error defer ca.lk.Unlock() // Store updated amount - ca.mutateChannelInfo(channelID, func(channelInfo *ChannelInfo) { + ca.mutateChannelInfo(ctx, channelID, func(channelInfo *ChannelInfo) { channelInfo.Amount = types.BigAdd(channelInfo.Amount, channelInfo.PendingAmount) channelInfo.PendingAmount = big.NewInt(0) channelInfo.AddFundsMsg = nil @@ -534,8 +534,8 @@ func (ca *channelAccessor) waitAddFundsMsg(channelID string, mcid cid.Cid) error } // Change the state of the channel in the store -func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*ChannelInfo)) { - channelInfo, err := ca.store.ByChannelID(channelID) +func (ca *channelAccessor) mutateChannelInfo(ctx context.Context, channelID string, mutate func(*ChannelInfo)) { + channelInfo, err := ca.store.ByChannelID(ctx, channelID) // If there's an error reading or writing to the store just log an error. // For now we're assuming it's unlikely to happen in practice. @@ -549,7 +549,7 @@ func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*Chan mutate(channelInfo) - err = ca.store.putChannelInfo(channelInfo) + err = ca.store.putChannelInfo(ctx, channelInfo) if err != nil { log.Errorf("Error writing channel info to store: %s", err) } @@ -560,8 +560,8 @@ func (ca *channelAccessor) mutateChannelInfo(channelID string, mutate func(*Chan // messages. // Outstanding messages can occur if a create / add funds message was sent and // then the system was shut down or crashed before the result was received. -func (pm *Manager) restartPending() error { - cis, err := pm.store.WithPendingAddFunds() +func (pm *Manager) restartPending(ctx context.Context) error { + cis, err := pm.store.WithPendingAddFunds(ctx) if err != nil { return err } @@ -575,16 +575,16 @@ func (pm *Manager) restartPending() error { if err != nil { return xerrors.Errorf("error initializing payment channel manager %s -> %s: %s", ci.Control, ci.Target, err) } - go ca.waitForPaychCreateMsg(ci.ChannelID, *ci.CreateMsg) + go ca.waitForPaychCreateMsg(ctx, ci.ChannelID, *ci.CreateMsg) return nil }) } else if ci.AddFundsMsg != nil { group.Go(func() error { - ca, err := pm.accessorByAddress(*ci.Channel) + ca, err := pm.accessorByAddress(ctx, *ci.Channel) if err != nil { return xerrors.Errorf("error initializing payment channel manager %s: %s", ci.Channel, err) } - go ca.waitForAddFundsMsg(ci.ChannelID, *ci.AddFundsMsg) + go ca.waitForAddFundsMsg(ctx, ci.ChannelID, *ci.AddFundsMsg) return nil }) } @@ -598,7 +598,7 @@ func (ca *channelAccessor) getPaychWaitReady(ctx context.Context, mcid cid.Cid) ca.lk.Lock() // First check if the message has completed - msgInfo, err := ca.store.GetMessage(mcid) + msgInfo, err := ca.store.GetMessage(ctx, mcid) if err != nil { ca.lk.Unlock() @@ -617,7 +617,7 @@ func (ca *channelAccessor) getPaychWaitReady(ctx context.Context, mcid cid.Cid) ca.lk.Unlock() // Get the channel address - ci, err := ca.store.ByMessageCid(mcid) + ci, err := ca.store.ByMessageCid(ctx, mcid) if err != nil { return address.Undef, err } @@ -660,7 +660,7 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on res := onMsgRes{err: err} if res.err == nil { // Get the channel associated with the message cid - ci, err := ca.store.ByMessageCid(mcid) + ci, err := ca.store.ByMessageCid(ctx, mcid) if err != nil { res.err = err } else { @@ -689,6 +689,6 @@ func (ca *channelAccessor) msgPromise(ctx context.Context, mcid cid.Cid) chan on return promise } -func (ca *channelAccessor) availableFunds(channelID string) (*api.ChannelAvailableFunds, error) { - return ca.processQueue(channelID) +func (ca *channelAccessor) availableFunds(ctx context.Context, channelID string) (*api.ChannelAvailableFunds, error) { + return ca.processQueue(ctx, channelID) } diff --git a/paychmgr/store.go b/paychmgr/store.go index 343149f93..62849e6be 100644 --- a/paychmgr/store.go +++ b/paychmgr/store.go @@ -2,6 +2,7 @@ package paychmgr import ( "bytes" + "context" "errors" "fmt" @@ -157,26 +158,26 @@ func (ci *ChannelInfo) wasVoucherSubmitted(sv *paych.SignedVoucher) (bool, error // TrackChannel stores a channel, returning an error if the channel was already // being tracked -func (ps *Store) TrackChannel(ci *ChannelInfo) (*ChannelInfo, error) { - _, err := ps.ByAddress(*ci.Channel) +func (ps *Store) TrackChannel(ctx context.Context, ci *ChannelInfo) (*ChannelInfo, error) { + _, err := ps.ByAddress(ctx, *ci.Channel) switch err { default: return nil, err case nil: return nil, fmt.Errorf("already tracking channel: %s", ci.Channel) case ErrChannelNotTracked: - err = ps.putChannelInfo(ci) + err = ps.putChannelInfo(ctx, ci) if err != nil { return nil, err } - return ps.ByAddress(*ci.Channel) + return ps.ByAddress(ctx, *ci.Channel) } } // ListChannels returns the addresses of all channels that have been created -func (ps *Store) ListChannels() ([]address.Address, error) { - cis, err := ps.findChans(func(ci *ChannelInfo) bool { +func (ps *Store) ListChannels(ctx context.Context) ([]address.Address, error) { + cis, err := ps.findChans(ctx, func(ci *ChannelInfo) bool { return ci.Channel != nil }, 0) if err != nil { @@ -193,8 +194,8 @@ func (ps *Store) ListChannels() ([]address.Address, error) { // findChan finds a single channel using the given filter. // If there isn't a channel that matches the filter, returns ErrChannelNotTracked -func (ps *Store) findChan(filter func(ci *ChannelInfo) bool) (*ChannelInfo, error) { - cis, err := ps.findChans(filter, 1) +func (ps *Store) findChan(ctx context.Context, filter func(ci *ChannelInfo) bool) (*ChannelInfo, error) { + cis, err := ps.findChans(ctx, filter, 1) if err != nil { return nil, err } @@ -208,8 +209,8 @@ func (ps *Store) findChan(filter func(ci *ChannelInfo) bool) (*ChannelInfo, erro // findChans loops over all channels, only including those that pass the filter. // max is the maximum number of channels to return. Set to zero to return unlimited channels. -func (ps *Store) findChans(filter func(*ChannelInfo) bool, max int) ([]ChannelInfo, error) { - res, err := ps.ds.Query(dsq.Query{Prefix: dsKeyChannelInfo}) +func (ps *Store) findChans(ctx context.Context, filter func(*ChannelInfo) bool, max int) ([]ChannelInfo, error) { + res, err := ps.ds.Query(ctx, dsq.Query{Prefix: dsKeyChannelInfo}) if err != nil { return nil, err } @@ -251,8 +252,8 @@ func (ps *Store) findChans(filter func(*ChannelInfo) bool, max int) ([]ChannelIn } // AllocateLane allocates a new lane for the given channel -func (ps *Store) AllocateLane(ch address.Address) (uint64, error) { - ci, err := ps.ByAddress(ch) +func (ps *Store) AllocateLane(ctx context.Context, ch address.Address) (uint64, error) { + ci, err := ps.ByAddress(ctx, ch) if err != nil { return 0, err } @@ -260,12 +261,12 @@ func (ps *Store) AllocateLane(ch address.Address) (uint64, error) { out := ci.NextLane ci.NextLane++ - return out, ps.putChannelInfo(ci) + return out, ps.putChannelInfo(ctx, ci) } // VouchersForPaych gets the vouchers for the given channel -func (ps *Store) VouchersForPaych(ch address.Address) ([]*VoucherInfo, error) { - ci, err := ps.ByAddress(ch) +func (ps *Store) VouchersForPaych(ctx context.Context, ch address.Address) ([]*VoucherInfo, error) { + ci, err := ps.ByAddress(ctx, ch) if err != nil { return nil, err } @@ -273,17 +274,17 @@ func (ps *Store) VouchersForPaych(ch address.Address) ([]*VoucherInfo, error) { return ci.Vouchers, nil } -func (ps *Store) MarkVoucherSubmitted(ci *ChannelInfo, sv *paych.SignedVoucher) error { +func (ps *Store) MarkVoucherSubmitted(ctx context.Context, ci *ChannelInfo, sv *paych.SignedVoucher) error { err := ci.markVoucherSubmitted(sv) if err != nil { return err } - return ps.putChannelInfo(ci) + return ps.putChannelInfo(ctx, ci) } // ByAddress gets the channel that matches the given address -func (ps *Store) ByAddress(addr address.Address) (*ChannelInfo, error) { - return ps.findChan(func(ci *ChannelInfo) bool { +func (ps *Store) ByAddress(ctx context.Context, addr address.Address) (*ChannelInfo, error) { + return ps.findChan(ctx, func(ci *ChannelInfo) bool { return ci.Channel != nil && *ci.Channel == addr }) } @@ -307,7 +308,7 @@ func dskeyForMsg(mcid cid.Cid) datastore.Key { } // SaveNewMessage is called when a message is sent -func (ps *Store) SaveNewMessage(channelID string, mcid cid.Cid) error { +func (ps *Store) SaveNewMessage(ctx context.Context, channelID string, mcid cid.Cid) error { k := dskeyForMsg(mcid) b, err := cborrpc.Dump(&MsgInfo{ChannelID: channelID, MsgCid: mcid}) @@ -315,12 +316,12 @@ func (ps *Store) SaveNewMessage(channelID string, mcid cid.Cid) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // SaveMessageResult is called when the result of a message is received -func (ps *Store) SaveMessageResult(mcid cid.Cid, msgErr error) error { - minfo, err := ps.GetMessage(mcid) +func (ps *Store) SaveMessageResult(ctx context.Context, mcid cid.Cid, msgErr error) error { + minfo, err := ps.GetMessage(ctx, mcid) if err != nil { return err } @@ -336,17 +337,17 @@ func (ps *Store) SaveMessageResult(mcid cid.Cid, msgErr error) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // ByMessageCid gets the channel associated with a message -func (ps *Store) ByMessageCid(mcid cid.Cid) (*ChannelInfo, error) { - minfo, err := ps.GetMessage(mcid) +func (ps *Store) ByMessageCid(ctx context.Context, mcid cid.Cid) (*ChannelInfo, error) { + minfo, err := ps.GetMessage(ctx, mcid) if err != nil { return nil, err } - ci, err := ps.findChan(func(ci *ChannelInfo) bool { + ci, err := ps.findChan(ctx, func(ci *ChannelInfo) bool { return ci.ChannelID == minfo.ChannelID }) if err != nil { @@ -357,10 +358,10 @@ func (ps *Store) ByMessageCid(mcid cid.Cid) (*ChannelInfo, error) { } // GetMessage gets the message info for a given message CID -func (ps *Store) GetMessage(mcid cid.Cid) (*MsgInfo, error) { +func (ps *Store) GetMessage(ctx context.Context, mcid cid.Cid) (*MsgInfo, error) { k := dskeyForMsg(mcid) - val, err := ps.ds.Get(k) + val, err := ps.ds.Get(ctx, k) if err != nil { return nil, err } @@ -375,8 +376,8 @@ func (ps *Store) GetMessage(mcid cid.Cid) (*MsgInfo, error) { // OutboundActiveByFromTo looks for outbound channels that have not been // settled, with the given from / to addresses -func (ps *Store) OutboundActiveByFromTo(from address.Address, to address.Address) (*ChannelInfo, error) { - return ps.findChan(func(ci *ChannelInfo) bool { +func (ps *Store) OutboundActiveByFromTo(ctx context.Context, from address.Address, to address.Address) (*ChannelInfo, error) { + return ps.findChan(ctx, func(ci *ChannelInfo) bool { if ci.Direction != DirOutbound { return false } @@ -390,8 +391,8 @@ func (ps *Store) OutboundActiveByFromTo(from address.Address, to address.Address // WithPendingAddFunds is used on startup to find channels for which a // create channel or add funds message has been sent, but lotus shut down // before the response was received. -func (ps *Store) WithPendingAddFunds() ([]ChannelInfo, error) { - return ps.findChans(func(ci *ChannelInfo) bool { +func (ps *Store) WithPendingAddFunds(ctx context.Context) ([]ChannelInfo, error) { + return ps.findChans(ctx, func(ci *ChannelInfo) bool { if ci.Direction != DirOutbound { return false } @@ -400,10 +401,10 @@ func (ps *Store) WithPendingAddFunds() ([]ChannelInfo, error) { } // ByChannelID gets channel info by channel ID -func (ps *Store) ByChannelID(channelID string) (*ChannelInfo, error) { +func (ps *Store) ByChannelID(ctx context.Context, channelID string) (*ChannelInfo, error) { var stored ChannelInfo - res, err := ps.ds.Get(dskeyForChannel(channelID)) + res, err := ps.ds.Get(ctx, dskeyForChannel(channelID)) if err != nil { if err == datastore.ErrNotFound { return nil, ErrChannelNotTracked @@ -415,7 +416,7 @@ func (ps *Store) ByChannelID(channelID string) (*ChannelInfo, error) { } // CreateChannel creates an outbound channel for the given from / to -func (ps *Store) CreateChannel(from address.Address, to address.Address, createMsgCid cid.Cid, amt types.BigInt) (*ChannelInfo, error) { +func (ps *Store) CreateChannel(ctx context.Context, from address.Address, to address.Address, createMsgCid cid.Cid, amt types.BigInt) (*ChannelInfo, error) { ci := &ChannelInfo{ Direction: DirOutbound, NextLane: 0, @@ -426,13 +427,13 @@ func (ps *Store) CreateChannel(from address.Address, to address.Address, createM } // Save the new channel - err := ps.putChannelInfo(ci) + err := ps.putChannelInfo(ctx, ci) if err != nil { return nil, err } // Save a reference to the create message - err = ps.SaveNewMessage(ci.ChannelID, createMsgCid) + err = ps.SaveNewMessage(ctx, ci.ChannelID, createMsgCid) if err != nil { return nil, err } @@ -441,8 +442,8 @@ func (ps *Store) CreateChannel(from address.Address, to address.Address, createM } // RemoveChannel removes the channel with the given channel ID -func (ps *Store) RemoveChannel(channelID string) error { - return ps.ds.Delete(dskeyForChannel(channelID)) +func (ps *Store) RemoveChannel(ctx context.Context, channelID string) error { + return ps.ds.Delete(ctx, dskeyForChannel(channelID)) } // The datastore key used to identify the channel info @@ -451,7 +452,7 @@ func dskeyForChannel(channelID string) datastore.Key { } // putChannelInfo stores the channel info in the datastore -func (ps *Store) putChannelInfo(ci *ChannelInfo) error { +func (ps *Store) putChannelInfo(ctx context.Context, ci *ChannelInfo) error { if len(ci.ChannelID) == 0 { ci.ChannelID = uuid.New().String() } @@ -462,7 +463,7 @@ func (ps *Store) putChannelInfo(ci *ChannelInfo) error { return err } - return ps.ds.Put(k, b) + return ps.ds.Put(ctx, k, b) } // TODO: This is a hack to get around not being able to CBOR marshall a nil diff --git a/storage/sectorblocks/blocks.go b/storage/sectorblocks/blocks.go index ad4ffc0db..231809a9f 100644 --- a/storage/sectorblocks/blocks.go +++ b/storage/sectorblocks/blocks.go @@ -68,11 +68,11 @@ func NewSectorBlocks(sb SectorBuilder, ds dtypes.MetadataDS) *SectorBlocks { return sbc } -func (st *SectorBlocks) writeRef(dealID abi.DealID, sectorID abi.SectorNumber, offset abi.PaddedPieceSize, size abi.UnpaddedPieceSize) error { +func (st *SectorBlocks) writeRef(ctx context.Context, dealID abi.DealID, sectorID abi.SectorNumber, offset abi.PaddedPieceSize, size abi.UnpaddedPieceSize) error { st.keyLk.Lock() // TODO: make this multithreaded defer st.keyLk.Unlock() - v, err := st.keys.Get(DealIDToDsKey(dealID)) + v, err := st.keys.Get(ctx, DealIDToDsKey(dealID)) if err == datastore.ErrNotFound { err = nil } @@ -97,7 +97,7 @@ func (st *SectorBlocks) writeRef(dealID abi.DealID, sectorID abi.SectorNumber, o if err != nil { return xerrors.Errorf("serializing refs: %w", err) } - return st.keys.Put(DealIDToDsKey(dealID), newRef) // TODO: batch somehow + return st.keys.Put(ctx, DealIDToDsKey(dealID), newRef) // TODO: batch somehow } func (st *SectorBlocks) AddPiece(ctx context.Context, size abi.UnpaddedPieceSize, r io.Reader, d api.PieceDealInfo) (abi.SectorNumber, abi.PaddedPieceSize, error) { @@ -107,7 +107,7 @@ func (st *SectorBlocks) AddPiece(ctx context.Context, size abi.UnpaddedPieceSize } // TODO: DealID has very low finality here - err = st.writeRef(d.DealID, so.Sector, so.Offset, size) + err = st.writeRef(ctx, d.DealID, so.Sector, so.Offset, size) if err != nil { return 0, 0, xerrors.Errorf("writeRef: %w", err) } @@ -115,8 +115,8 @@ func (st *SectorBlocks) AddPiece(ctx context.Context, size abi.UnpaddedPieceSize return so.Sector, so.Offset, nil } -func (st *SectorBlocks) List() (map[uint64][]api.SealedRef, error) { - res, err := st.keys.Query(query.Query{}) +func (st *SectorBlocks) List(ctx context.Context) (map[uint64][]api.SealedRef, error) { + res, err := st.keys.Query(ctx, query.Query{}) if err != nil { return nil, err } @@ -144,8 +144,8 @@ func (st *SectorBlocks) List() (map[uint64][]api.SealedRef, error) { return out, nil } -func (st *SectorBlocks) GetRefs(dealID abi.DealID) ([]api.SealedRef, error) { // TODO: track local sectors - ent, err := st.keys.Get(DealIDToDsKey(dealID)) +func (st *SectorBlocks) GetRefs(ctx context.Context, dealID abi.DealID) ([]api.SealedRef, error) { // TODO: track local sectors + ent, err := st.keys.Get(ctx, DealIDToDsKey(dealID)) if err == datastore.ErrNotFound { err = ErrNotFound } @@ -161,8 +161,8 @@ func (st *SectorBlocks) GetRefs(dealID abi.DealID) ([]api.SealedRef, error) { // return refs.Refs, nil } -func (st *SectorBlocks) GetSize(dealID abi.DealID) (uint64, error) { - refs, err := st.GetRefs(dealID) +func (st *SectorBlocks) GetSize(ctx context.Context, dealID abi.DealID) (uint64, error) { + refs, err := st.GetRefs(ctx, dealID) if err != nil { return 0, err } @@ -170,7 +170,7 @@ func (st *SectorBlocks) GetSize(dealID abi.DealID) (uint64, error) { return uint64(refs[0].Size), nil } -func (st *SectorBlocks) Has(dealID abi.DealID) (bool, error) { +func (st *SectorBlocks) Has(ctx context.Context, dealID abi.DealID) (bool, error) { // TODO: ensure sector is still there - return st.keys.Has(DealIDToDsKey(dealID)) + return st.keys.Has(ctx, DealIDToDsKey(dealID)) } From e5895af4a2edfa245447098b0e7d56c3515b8156 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 18:15:35 -0500 Subject: [PATCH 049/157] Update go-ipld-cbor --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5c10d48f5..ea89804fa 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( github.com/ipfs/go-ipfs-http-client v0.0.6 github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 - github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 + github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.3.0 github.com/ipfs/go-merkledag v0.5.1 diff --git a/go.sum b/go.sum index f8df41b81..c9f716752 100644 --- a/go.sum +++ b/go.sum @@ -785,8 +785,8 @@ github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4 h1:is/7IfZF1xug/95JAvZKTVvJrqnrXpSRNgBQORiqQf4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211202953-0412412d04c4/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= From d7528557dfac0e4ae91cf24bc4e10ccb1a272979 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sun, 12 Dec 2021 22:05:43 -0500 Subject: [PATCH 050/157] Shed: Add a util to list terminated deals --- cmd/lotus-shed/main.go | 1 + cmd/lotus-shed/terminations.go | 173 +++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 cmd/lotus-shed/terminations.go diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index d35fb56dd..d18931312 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -65,6 +65,7 @@ func main() { fr32Cmd, chainCmd, balancerCmd, + terminationsCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go new file mode 100644 index 000000000..0cc0800e4 --- /dev/null +++ b/cmd/lotus-shed/terminations.go @@ -0,0 +1,173 @@ +package main + +import ( + "bytes" + "context" + "fmt" + "io" + + "github.com/filecoin-project/lotus/chain/types" + + "github.com/filecoin-project/lotus/chain/actors/builtin/market" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/actors/adt" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/state" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/node/repo" + miner2 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + "github.com/urfave/cli/v2" +) + +var terminationsCmd = &cli.Command{ + Name: "terminations", + Description: "Lists terminated deals from the past 2 days", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := context.TODO() + + if !cctx.Args().Present() { + return fmt.Errorf("must pass block cid") + } + + blkCid, err := cid.Decode(cctx.Args().First()) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + fsrepo, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return err + } + + lkrepo, err := fsrepo.Lock(repo.FullNode) + if err != nil { + return err + } + + defer lkrepo.Close() //nolint:errcheck + + bs, err := lkrepo.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lkrepo.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) + defer cs.Close() //nolint:errcheck + + cst := cbor.NewCborStore(bs) + store := adt.WrapStore(ctx, cst) + + blk, err := cs.GetBlock(blkCid) + if err != nil { + return err + } + + minerCode, err := miner.GetActorCodeID(actors.Version6) + if err != nil { + return err + } + + for i := 0; i < 2880*2; i++ { + pts, err := cs.LoadTipSet(types.NewTipSetKey(blk.Parents...)) + if err != nil { + return err + } + + blk = pts.Blocks()[0] + + msgs, err := cs.MessagesForTipset(pts) + if err != nil { + return err + } + + for _, v := range msgs { + msg := v.VMMessage() + if msg.Method != miner.Methods.TerminateSectors { + continue + } + + tree, err := state.LoadStateTree(cst, blk.ParentStateRoot) + if err != nil { + return err + } + + minerAct, err := tree.GetActor(msg.To) + if err != nil { + return err + } + + if minerAct.Code != minerCode { + continue + } + + minerSt, err := miner.Load(store, minerAct) + if err != nil { + return err + } + + marketAct, err := tree.GetActor(market.Address) + if err != nil { + return err + } + + marketSt, err := market.Load(store, marketAct) + if err != nil { + return err + } + + proposals, err := marketSt.Proposals() + if err != nil { + return err + } + + var termParams miner2.TerminateSectorsParams + err = termParams.UnmarshalCBOR(bytes.NewBuffer(msg.Params)) + if err != nil { + return err + } + + for _, t := range termParams.Terminations { + sectors, err := minerSt.LoadSectors(&t.Sectors) + if err != nil { + return err + } + + for _, sector := range sectors { + for _, deal := range sector.DealIDs { + prop, find, err := proposals.Get(deal) + if err != nil || !find { + return err + } + fmt.Printf("%s, %d, %d, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.PieceCID, prop.Label) + } + } + } + } + } + + return nil + }, +} From 8c4c2eeffc4b5a53d7de5a5a8020acb44e681125 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 13 Dec 2021 03:35:56 -0500 Subject: [PATCH 051/157] add client address --- cmd/lotus-shed/terminations.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index 0cc0800e4..c28d595b4 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -161,7 +161,7 @@ var terminationsCmd = &cli.Command{ if err != nil || !find { return err } - fmt.Printf("%s, %d, %d, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.PieceCID, prop.Label) + fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) } } } From 97a91f23f14f7f3fb1bbec501ff81ab0b51aa27d Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:11:35 +0200 Subject: [PATCH 052/157] update go-ds-measure and go-filestore --- go.mod | 1 + go.sum | 1 + 2 files changed, 2 insertions(+) diff --git a/go.mod b/go.mod index ea89804fa..ac7b683ba 100644 --- a/go.mod +++ b/go.mod @@ -76,6 +76,7 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 + github.com/ipfs/go-filestore v1.1.0 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 diff --git a/go.sum b/go.sum index c9f716752..39ff160d7 100644 --- a/go.sum +++ b/go.sum @@ -725,6 +725,7 @@ github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjAp github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= +github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= From 7ed40c1ec794f63cca890f286c48b06c7f046a0a Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:17:05 +0200 Subject: [PATCH 053/157] go get drand@release/v1.3 --- go.mod | 14 ++++++++------ go.sum | 59 ++++++++++++++++------------------------------------------ 2 files changed, 24 insertions(+), 49 deletions(-) diff --git a/go.mod b/go.mod index ac7b683ba..0d82ce4d8 100644 --- a/go.mod +++ b/go.mod @@ -18,9 +18,10 @@ require ( github.com/coreos/go-systemd/v22 v22.3.2 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.3 + github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v1.2.1 - github.com/drand/kyber v1.1.4 + github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d + github.com/drand/kyber v1.1.7 github.com/dustin/go-humanize v1.0.0 github.com/elastic/go-sysinfo v1.7.0 github.com/elastic/gosigar v0.14.1 @@ -55,6 +56,7 @@ require ( github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 github.com/go-kit/kit v0.12.0 + github.com/golang/glog v1.0.0 // indirect github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.7.4 @@ -72,11 +74,10 @@ require ( github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 github.com/ipfs/go-datastore v0.5.1 - github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 + github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 - github.com/ipfs/go-filestore v1.1.0 // indirect github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 @@ -103,6 +104,7 @@ require ( github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 github.com/ipld/go-ipld-selector-text-lite v0.0.1 + github.com/jonboulle/clockwork v0.2.2 // indirect github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 @@ -113,7 +115,7 @@ require ( github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.4.0 - github.com/libp2p/go-libp2p-pubsub v0.5.6 + github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.15.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 @@ -158,7 +160,7 @@ require ( go.uber.org/zap v1.19.1 golang.org/x/net v0.0.0-20210917221730-978cfadd31cf golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 + golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.5 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 diff --git a/go.sum b/go.sum index 39ff160d7..6d38de42f 100644 --- a/go.sum +++ b/go.sum @@ -115,7 +115,6 @@ github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVj github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -231,7 +230,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= @@ -243,13 +241,12 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= @@ -257,12 +254,13 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d h1:XNzXUX04vE4cpEr+y5xsz8ghW3KQYW1yGueO0dy1Qwc= +github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d/go.mod h1:uQa+6p9wTBXErGU61JTyE0hWyT8Qfwq0AkQH9Tq3Lbk= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= -github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= @@ -391,7 +389,6 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/g github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -481,6 +478,8 @@ github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -586,7 +585,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= @@ -712,9 +710,8 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158 h1:/8az/zYn1icEwiHAmpR11Io+8hrlICU10J+Ft0zSiog= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211119002906-7318f1b76158/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= @@ -725,7 +722,6 @@ github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjAp github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= @@ -894,8 +890,9 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -990,8 +987,6 @@ github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZk github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= @@ -1005,7 +1000,6 @@ github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= @@ -1014,7 +1008,6 @@ github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= @@ -1023,11 +1016,9 @@ github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= @@ -1071,9 +1062,7 @@ github.com/libp2p/go-libp2p-discovery v0.0.5/go.mod h1:YtF20GUxjgoKZ4zmXj8j3Nb2T github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= @@ -1111,7 +1100,6 @@ github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8 github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= @@ -1126,8 +1114,6 @@ github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVd github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= -github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= @@ -1138,9 +1124,8 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= -github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= @@ -1167,7 +1152,6 @@ github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evl github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+74Jjio7xGvsTgU= github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= @@ -1286,7 +1270,6 @@ github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y= github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= @@ -1296,7 +1279,6 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= @@ -1458,7 +1440,6 @@ github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysj github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= @@ -1591,7 +1572,6 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -1628,7 +1608,6 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -1969,7 +1948,6 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2065,7 +2043,6 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2077,10 +2054,8 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2185,9 +2160,7 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2221,8 +2194,9 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2380,7 +2354,6 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= From 84710cf27ec8d0fc63444ded177b41a00f1c2c61 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:26:59 +0200 Subject: [PATCH 054/157] plumb more contexts in lotus --- blockstore/timed.go | 2 +- cmd/lotus/backup.go | 4 ++-- cmd/lotus/daemon.go | 4 ++-- node/modules/chain.go | 4 ++-- node/modules/client.go | 4 ++-- node/modules/genesis.go | 9 +++++---- node/modules/services.go | 2 +- node/modules/storageminer.go | 6 +++--- 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/blockstore/timed.go b/blockstore/timed.go index 4fee6b6dd..8f226b0b1 100644 --- a/blockstore/timed.go +++ b/blockstore/timed.go @@ -154,7 +154,7 @@ func (t *TimedCacheBlockstore) Has(ctx context.Context, k cid.Cid) (bool, error) return t.inactive.Has(ctx, k) } -func (t *TimedCacheBlockstore) HashOnRead(ctx context.Context, _ bool) { +func (t *TimedCacheBlockstore) HashOnRead(_ bool) { // no-op } diff --git a/cmd/lotus/backup.go b/cmd/lotus/backup.go index d41e0c098..245a3d397 100644 --- a/cmd/lotus/backup.go +++ b/cmd/lotus/backup.go @@ -111,10 +111,10 @@ func restore(cctx *cli.Context, r repo.Repo) error { log.Info("Resetting chainstore metadata") chainHead := dstore.NewKey("head") - if err := mds.Delete(chainHead); err != nil { + if err := mds.Delete(context.Background(), chainHead); err != nil { return xerrors.Errorf("clearing chain head: %w", err) } - if err := store.FlushValidationCache(mds); err != nil { + if err := store.FlushValidationCache(context.Background(), mds); err != nil { return xerrors.Errorf("clearing chain validation cache: %w", err) } diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index 3f5de8138..bcf3b119e 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -506,7 +506,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return xerrors.Errorf("importing chain failed: %w", err) } - if err := cst.FlushValidationCache(); err != nil { + if err := cst.FlushValidationCache(context.Background()); err != nil { return xerrors.Errorf("flushing validation cache failed: %w", err) } @@ -515,7 +515,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return err } - err = cst.SetGenesis(gb.Blocks()[0]) + err = cst.SetGenesis(context.Background(), gb.Blocks()[0]) if err != nil { return err } diff --git a/node/modules/chain.go b/node/modules/chain.go index b5be24d5d..d79cd1038 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -59,7 +59,7 @@ func ChainBlockService(bs dtypes.ExposedBlockstore, rem dtypes.ChainBitswap) dty } func MessagePool(lc fx.Lifecycle, us stmgr.UpgradeSchedule, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal, protector dtypes.GCReferenceProtector) (*messagepool.MessagePool, error) { - mp, err := messagepool.New(mpp, ds, us, nn, j) + mp, err := messagepool.New(context.Background(), mpp, ds, us, nn, j) if err != nil { return nil, xerrors.Errorf("constructing mpool: %w", err) } @@ -83,7 +83,7 @@ func ChainStore(lc fx.Lifecycle, chain := store.NewChainStore(cbs, sbs, ds, weight, j) - if err := chain.Load(); err != nil { + if err := chain.Load(context.Background()); err != nil { log.Warnf("loading chain state from disk: %s", err) } diff --git a/node/modules/client.go b/node/modules/client.go index 4d988d98a..1de4f63e8 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -52,7 +52,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full if err != nil { return nil } - b, err := ds.Get(datastore.NewKey("/marketfunds/client")) + b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/client")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -73,7 +73,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full return nil } - return ds.Delete(datastore.NewKey("/marketfunds/client")) + return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/client")) }, }) } diff --git a/node/modules/genesis.go b/node/modules/genesis.go index 43443b125..77cf8e353 100644 --- a/node/modules/genesis.go +++ b/node/modules/genesis.go @@ -2,6 +2,7 @@ package modules import ( "bytes" + "context" "os" "github.com/ipfs/go-datastore" @@ -22,14 +23,14 @@ func ErrorGenesis() Genesis { func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { return func(bs dtypes.ChainBlockstore) Genesis { return func() (header *types.BlockHeader, e error) { - c, err := car.LoadCar(bs, bytes.NewReader(genBytes)) + c, err := car.LoadCar(context.Background(), bs, bytes.NewReader(genBytes)) if err != nil { return nil, xerrors.Errorf("loading genesis car file failed: %w", err) } if len(c.Roots) != 1 { return nil, xerrors.New("expected genesis file to have one root") } - root, err := bs.Get(c.Roots[0]) + root, err := bs.Get(context.Background(), c.Roots[0]) if err != nil { return nil, err } @@ -46,7 +47,7 @@ func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { func DoSetGenesis(_ dtypes.AfterGenesisSet) {} func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) { - genFromRepo, err := cs.GetGenesis() + genFromRepo, err := cs.GetGenesis(context.Background()) if err == nil { if os.Getenv("LOTUS_SKIP_GENESIS_CHECK") != "_yes_" { expectedGenesis, err := g() @@ -69,5 +70,5 @@ func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) return dtypes.AfterGenesisSet{}, xerrors.Errorf("genesis func failed: %w", err) } - return dtypes.AfterGenesisSet{}, cs.SetGenesis(genesis) + return dtypes.AfterGenesisSet{}, cs.SetGenesis(context.Background(), genesis) } diff --git a/node/modules/services.go b/node/modules/services.go index 17d4a7476..c832b16fc 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -229,7 +229,7 @@ func BuiltinDrandConfig() dtypes.DrandSchedule { } func RandomSchedule(p RandomBeaconParams, _ dtypes.AfterGenesisSet) (beacon.Schedule, error) { - gen, err := p.Cs.GetGenesis() + gen, err := p.Cs.GetGenesis(context.Background()) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index f4d00606f..d271f974a 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -78,7 +78,7 @@ var ( ) func minerAddrFromDS(ds dtypes.MetadataDS) (address.Address, error) { - maddrb, err := ds.Get(datastore.NewKey("miner-address")) + maddrb, err := ds.Get(context.Background(), datastore.NewKey("miner-address")) if err != nil { return address.Undef, err } @@ -300,7 +300,7 @@ func HandleDeals(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, h sto func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api.FullNode, minerAddress dtypes.MinerAddress) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { - b, err := ds.Get(datastore.NewKey("/marketfunds/provider")) + b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/provider")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -331,7 +331,7 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. return nil } - return ds.Delete(datastore.NewKey("/marketfunds/provider")) + return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/provider")) }, }) } From 2e057b8f523899917ab85f0c543fd3d4febac6e3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:28:29 +0200 Subject: [PATCH 055/157] plumb contexts in lotus-miner --- cmd/lotus-miner/init.go | 8 ++++---- cmd/lotus-miner/init_restore.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index b2199dd94..adc59f0f9 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -347,7 +347,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string return err } - if err := mds.Put(sectorKey, b); err != nil { + if err := mds.Put(context.Background(), sectorKey, b); err != nil { return err } @@ -387,7 +387,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string buf := make([]byte, binary.MaxVarintLen64) size := binary.PutUvarint(buf, uint64(maxSectorID)) - return mds.Put(datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) + return mds.Put(context.Background(), datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) } func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market2.DealProposal) (abi.DealID, error) { @@ -441,7 +441,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } if cctx.Bool("genesis-miner") { - if err := mds.Put(datastore.NewKey("miner-address"), a.Bytes()); err != nil { + if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), a.Bytes()); err != nil { return err } @@ -548,7 +548,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } log.Infof("Created new miner: %s", addr) - if err := mds.Put(datastore.NewKey("miner-address"), addr.Bytes()); err != nil { + if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), addr.Bytes()); err != nil { return err } diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index 0974a7c5d..84a2f3838 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -255,7 +255,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi log.Info("Checking actor metadata") - abytes, err := mds.Get(datastore.NewKey("miner-address")) + abytes, err := mds.Get(context.Background(), datastore.NewKey("miner-address")) if err != nil { return xerrors.Errorf("getting actor address from metadata datastore: %w", err) } From a8fcaeb1414f49763474e1c4c249a7fd84099760 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:35:24 +0200 Subject: [PATCH 056/157] plumb contexts in lotus-shed --- cmd/lotus-shed/datastore.go | 4 ++-- cmd/lotus-shed/export.go | 4 ++-- cmd/lotus-shed/import-car.go | 4 ++-- cmd/lotus-shed/market.go | 7 ++++--- cmd/lotus-shed/pruning.go | 2 +- cmd/lotus-shed/splitstore.go | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/cmd/lotus-shed/datastore.go b/cmd/lotus-shed/datastore.go index c3a9e572c..ff740a772 100644 --- a/cmd/lotus-shed/datastore.go +++ b/cmd/lotus-shed/datastore.go @@ -83,7 +83,7 @@ var datastoreListCmd = &cli.Command{ genc := cctx.String("get-enc") - q, err := ds.Query(dsq.Query{ + q, err := ds.Query(context.Background(), dsq.Query{ Prefix: datastore.NewKey(cctx.Args().Get(1)).String(), KeysOnly: genc == "", }) @@ -147,7 +147,7 @@ var datastoreGetCmd = &cli.Command{ return err } - val, err := ds.Get(datastore.NewKey(cctx.Args().Get(1))) + val, err := ds.Get(context.Background(), datastore.NewKey(cctx.Args().Get(1))) if err != nil { return xerrors.Errorf("get: %w", err) } diff --git a/cmd/lotus-shed/export.go b/cmd/lotus-shed/export.go index e711ba2bb..3851e4922 100644 --- a/cmd/lotus-shed/export.go +++ b/cmd/lotus-shed/export.go @@ -93,7 +93,7 @@ var exportChainCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, nil, nil) defer cs.Close() //nolint:errcheck - if err := cs.Load(); err != nil { + if err := cs.Load(context.Background()); err != nil { return err } @@ -110,7 +110,7 @@ var exportChainCmd = &cli.Command{ tsk := types.NewTipSetKey(cids...) - selts, err := cs.LoadTipSet(tsk) + selts, err := cs.LoadTipSet(context.Background(), tsk) if err != nil { return xerrors.Errorf("loading tipset: %w", err) } diff --git a/cmd/lotus-shed/import-car.go b/cmd/lotus-shed/import-car.go index 4e465029f..973e7b31b 100644 --- a/cmd/lotus-shed/import-car.go +++ b/cmd/lotus-shed/import-car.go @@ -82,7 +82,7 @@ var importCarCmd = &cli.Command{ return err case nil: fmt.Printf("\r%s", blk.Cid()) - if err := bs.Put(blk); err != nil { + if err := bs.Put(context.Background(), blk); err != nil { if err := f.Close(); err != nil { return err } @@ -146,7 +146,7 @@ var importObjectCmd = &cli.Command{ return err } - if err := bs.Put(blk); err != nil { + if err := bs.Put(context.Background(), blk); err != nil { return err } diff --git a/cmd/lotus-shed/market.go b/cmd/lotus-shed/market.go index 8221e53eb..aaef4690e 100644 --- a/cmd/lotus-shed/market.go +++ b/cmd/lotus-shed/market.go @@ -1,6 +1,7 @@ package main import ( + "context" "fmt" "os" "path" @@ -198,7 +199,7 @@ var marketExportDatastoreCmd = &cli.Command{ } // Write the backup to the file - if err := bds.Backup(out); err != nil { + if err := bds.Backup(context.Background(), out); err != nil { if cerr := out.Close(); cerr != nil { log.Errorw("error closing backup file while handling backup error", "closeErr", cerr, "backupErr", err) } @@ -215,7 +216,7 @@ var marketExportDatastoreCmd = &cli.Command{ } func exportPrefix(prefix string, ds datastore.Batching, backupDs datastore.Batching) error { - q, err := ds.Query(dsq.Query{ + q, err := ds.Query(context.Background(), dsq.Query{ Prefix: prefix, }) if err != nil { @@ -225,7 +226,7 @@ func exportPrefix(prefix string, ds datastore.Batching, backupDs datastore.Batch for res := range q.Next() { fmt.Println("Exporting key " + res.Key) - err := backupDs.Put(datastore.NewKey(res.Key), res.Value) + err := backupDs.Put(context.Background(), datastore.NewKey(res.Key), res.Value) if err != nil { return xerrors.Errorf("putting %s to backup datastore: %w", res.Key, err) } diff --git a/cmd/lotus-shed/pruning.go b/cmd/lotus-shed/pruning.go index 186a3191a..164ff197a 100644 --- a/cmd/lotus-shed/pruning.go +++ b/cmd/lotus-shed/pruning.go @@ -171,7 +171,7 @@ var stateTreePruneCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - if err := cs.Load(); err != nil { + if err := cs.Load(context.Background()); err != nil { return fmt.Errorf("loading chainstore: %w", err) } diff --git a/cmd/lotus-shed/splitstore.go b/cmd/lotus-shed/splitstore.go index 4f668888e..58563955f 100644 --- a/cmd/lotus-shed/splitstore.go +++ b/cmd/lotus-shed/splitstore.go @@ -331,7 +331,7 @@ func deleteSplitstoreKeys(lr repo.LockedRepo) error { } var keys []datastore.Key - res, err := ds.Query(query.Query{Prefix: "/splitstore"}) + res, err := ds.Query(context.Background(), query.Query{Prefix: "/splitstore"}) if err != nil { return xerrors.Errorf("error querying datastore for splitstore keys: %w", err) } @@ -346,7 +346,7 @@ func deleteSplitstoreKeys(lr repo.LockedRepo) error { for _, k := range keys { fmt.Printf("deleting %s from datastore...\n", k) - err = ds.Delete(k) + err = ds.Delete(context.Background(), k) if err != nil { return xerrors.Errorf("error deleting key %s from datastore: %w", k, err) } From 5eb5fcd0f4e2387cf37b291069c996131d9ae103 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:46:49 +0200 Subject: [PATCH 057/157] fix lotus-bench --- cmd/lotus-bench/caching_verifier.go | 4 +-- cmd/lotus-bench/import.go | 43 +++++------------------------ 2 files changed, 9 insertions(+), 38 deletions(-) diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index f4cc0f837..049ea4d99 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -36,7 +36,7 @@ func (cv cachingVerifier) withCache(execute func() (bool, error), param cbg.CBOR } hash := hasher.Sum(nil) key := datastore.NewKey(string(hash)) - fromDs, err := cv.ds.Get(key) + fromDs, err := cv.ds.Get(context.Background(), key) if err == nil { switch fromDs[0] { case 's': @@ -66,7 +66,7 @@ func (cv cachingVerifier) withCache(execute func() (bool, error), param cbg.CBOR } if len(save) != 0 { - errSave := cv.ds.Put(key, save) + errSave := cv.ds.Put(context.Background(), key, save) if errSave != nil { log.Errorf("error saving result: %+v", errSave) } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index c66b90deb..98dcb2fb5 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -17,8 +17,6 @@ import ( "time" ocprom "contrib.go.opencensus.io/exporter/prometheus" - "github.com/cockroachdb/pebble" - "github.com/cockroachdb/pebble/bloom" "github.com/ipfs/go-cid" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -46,7 +44,6 @@ import ( "github.com/ipfs/go-datastore" badger "github.com/ipfs/go-ds-badger2" measure "github.com/ipfs/go-ds-measure" - pebbleds "github.com/ipfs/go-ds-pebble" "github.com/urfave/cli/v2" "golang.org/x/xerrors" @@ -114,9 +111,6 @@ var importBenchCmd = &cli.Command{ &cli.BoolFlag{ Name: "only-import", }, - &cli.BoolFlag{ - Name: "use-pebble", - }, &cli.BoolFlag{ Name: "use-native-badger", }, @@ -178,29 +172,6 @@ var importBenchCmd = &cli.Command{ ) switch { - case cctx.Bool("use-pebble"): - log.Info("using pebble") - cache := 512 - ds, err = pebbleds.NewDatastore(tdir, &pebble.Options{ - // Pebble has a single combined cache area and the write - // buffers are taken from this too. Assign all available - // memory allowance for cache. - Cache: pebble.NewCache(int64(cache * 1024 * 1024)), - // The size of memory table(as well as the write buffer). - // Note, there may have more than two memory tables in the system. - // MemTableStopWritesThreshold can be configured to avoid the memory abuse. - MemTableSize: cache * 1024 * 1024 / 4, - // The default compaction concurrency(1 thread), - // Here use all available CPUs for faster compaction. - MaxConcurrentCompactions: runtime.NumCPU(), - // Per-level options. Options for at least one level must be specified. The - // options for the last level are used for all subsequent levels. - Levels: []pebble.LevelOptions{ - {TargetFileSize: 16 * 1024 * 1024, FilterPolicy: bloom.FilterPolicy(10), Compression: pebble.NoCompression}, - }, - Logger: log, - }) - case cctx.Bool("use-native-badger"): log.Info("using native badger") var opts badgerbs.Options @@ -356,7 +327,7 @@ var importBenchCmd = &cli.Command{ return xerrors.Errorf("failed to parse head tipset key: %w", err) } - head, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) if err != nil { return err } @@ -365,7 +336,7 @@ var importBenchCmd = &cli.Command{ if err != nil { return err } - head, err = cs.LoadTipSet(types.NewTipSetKey(cr.Header.Roots...)) + head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cr.Header.Roots...)) if err != nil { return err } @@ -382,7 +353,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to parse genesis tipset key: %w", err) } - genesis, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + genesis, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) } else { log.Warnf("getting genesis by height; this will be slow; pass in the genesis tipset through --genesis-tipset") // fallback to the slow path of walking the chain. @@ -393,7 +364,7 @@ var importBenchCmd = &cli.Command{ return err } - if err = cs.SetGenesis(genesis.Blocks()[0]); err != nil { + if err = cs.SetGenesis(context.Background(), genesis.Blocks()[0]); err != nil { return err } @@ -404,7 +375,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to end genesis tipset key: %w", err) } - end, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + end, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) } else if h := cctx.Int64("end-height"); h != 0 { log.Infof("getting end tipset at height %d...", h) end, err = cs.GetTipsetByHeight(context.TODO(), abi.ChainEpoch(h), head, true) @@ -426,7 +397,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to start genesis tipset key: %w", err) } - start, err = cs.LoadTipSet(types.NewTipSetKey(cids...)) + start, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) } else if h := cctx.Int64("start-height"); h != 0 { log.Infof("getting start tipset at height %d...", h) // lookback from the end tipset (which falls back to head if not supplied). @@ -450,7 +421,7 @@ var importBenchCmd = &cli.Command{ if h := ts.Height(); h%100 == 0 { log.Infof("walking back the chain; loaded tipset at height %d...", h) } - next, err := cs.LoadTipSet(ts.Parents()) + next, err := cs.LoadTipSet(context.Background(), ts.Parents()) if err != nil { return err } From 73c7e9edf1e9b6a0a4dd7fa16d83445b27c7f215 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:47:01 +0200 Subject: [PATCH 058/157] go mod tidy --- go.mod | 2 -- go.sum | 18 ------------------ 2 files changed, 20 deletions(-) diff --git a/go.mod b/go.mod index 0d82ce4d8..c4be98cc0 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ require ( github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e - github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 github.com/coreos/go-systemd/v22 v22.3.2 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e @@ -77,7 +76,6 @@ require ( github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 - github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-fs-lock v0.0.6 github.com/ipfs/go-graphsync v0.11.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 diff --git a/go.sum b/go.sum index 6d38de42f..0206e839f 100644 --- a/go.sum +++ b/go.sum @@ -157,8 +157,6 @@ github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRt github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894 h1:JLaf/iINcLyjwbtTsCJjc6rtlASgHeIJPrB6QmwURnA= -github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -183,15 +181,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 h1:Cb2pZUCFXlLA8i7My+wrN51D41GeuhYOKa1dJeZt6NY= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3 h1:2+dpIJzYMSbLi0587YXpi8tOJT52qCOI/1I0UNThc/I= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 h1:7grrpcfCtbZLsjtB0DgMuzs1umsJmpzaHMZ6cO6iAWw= @@ -409,9 +398,6 @@ github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdk github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= -github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= @@ -517,7 +503,6 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -720,8 +705,6 @@ github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUN github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 h1:W3YMLEvOXqdW+sYMiguhWP6txJwQvIQqhvpU8yAMGQs= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= @@ -1979,7 +1962,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= From b31480232bb7e72ab0d6c35f0516e2f3d4e458cb Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:59:52 +0200 Subject: [PATCH 059/157] plumb contexts in conformance --- conformance/runner.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conformance/runner.go b/conformance/runner.go index 1044bb329..86cc56f85 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -282,7 +282,7 @@ func writeStateToTempCAR(bs blockstore.Blockstore, roots ...cid.Cid) (string, er continue } // ignore things we don't have, the state tree is incomplete. - if has, err := bs.Has(link.Cid); err != nil { + if has, err := bs.Has(context.Background(), link.Cid); err != nil { return nil, err } else if has { out = append(out, link) @@ -317,7 +317,7 @@ func LoadBlockstore(vectorCAR schema.Base64EncodedBytes) (blockstore.Blockstore, defer r.Close() // nolint // Load the CAR embedded in the test vector into the Blockstore. - _, err = car.LoadCar(bs, r) + _, err = car.LoadCar(context.Background(), bs, r) if err != nil { return nil, fmt.Errorf("failed to load state tree car from test vector: %s", err) } From 47bac4a0c9dbeade3dcf60a74fda4406ee368ae7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 15:03:54 +0200 Subject: [PATCH 060/157] plumb context in tvx --- cmd/tvx/stores.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/tvx/stores.go b/cmd/tvx/stores.go index 040005641..ba54a7f9e 100644 --- a/cmd/tvx/stores.go +++ b/cmd/tvx/stores.go @@ -113,14 +113,14 @@ func (pb *proxyingBlockstore) FinishTracing() map[cid.Cid]struct{} { return ret } -func (pb *proxyingBlockstore) Get(cid cid.Cid) (blocks.Block, error) { +func (pb *proxyingBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) { pb.lk.Lock() if pb.tracing { pb.traced[cid] = struct{}{} } pb.lk.Unlock() - if block, err := pb.Blockstore.Get(cid); err == nil { + if block, err := pb.Blockstore.Get(ctx, cid); err == nil { return block, err } @@ -134,7 +134,7 @@ func (pb *proxyingBlockstore) Get(cid cid.Cid) (blocks.Block, error) { return nil, err } - err = pb.Blockstore.Put(block) + err = pb.Blockstore.Put(ctx, block) if err != nil { return nil, err } @@ -142,16 +142,16 @@ func (pb *proxyingBlockstore) Get(cid cid.Cid) (blocks.Block, error) { return block, nil } -func (pb *proxyingBlockstore) Put(block blocks.Block) error { +func (pb *proxyingBlockstore) Put(ctx context.Context, block blocks.Block) error { pb.lk.Lock() if pb.tracing { pb.traced[block.Cid()] = struct{}{} } pb.lk.Unlock() - return pb.Blockstore.Put(block) + return pb.Blockstore.Put(ctx, block) } -func (pb *proxyingBlockstore) PutMany(blocks []blocks.Block) error { +func (pb *proxyingBlockstore) PutMany(ctx context.Context, blocks []blocks.Block) error { pb.lk.Lock() if pb.tracing { for _, b := range blocks { @@ -159,5 +159,5 @@ func (pb *proxyingBlockstore) PutMany(blocks []blocks.Block) error { } } pb.lk.Unlock() - return pb.Blockstore.PutMany(blocks) + return pb.Blockstore.PutMany(ctx, blocks) } From e4233e45be9f1cbedf716db76b32b6c0d2d55398 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 15:15:38 +0200 Subject: [PATCH 061/157] plumb contexts in lotus-sim --- cmd/lotus-sim/create.go | 4 ++-- cmd/lotus-sim/info_capacity.go | 2 +- cmd/lotus-sim/info_state.go | 4 ++-- cmd/lotus-sim/simulation/block.go | 2 +- cmd/lotus-sim/simulation/node.go | 12 ++++++------ cmd/lotus-sim/simulation/simulation.go | 12 ++++++------ 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cmd/lotus-sim/create.go b/cmd/lotus-sim/create.go index 4867a5da5..23ea454a3 100644 --- a/cmd/lotus-sim/create.go +++ b/cmd/lotus-sim/create.go @@ -26,7 +26,7 @@ var createSimCommand = &cli.Command{ var ts *types.TipSet switch cctx.NArg() { case 0: - if err := node.Chainstore.Load(); err != nil { + if err := node.Chainstore.Load(cctx.Context); err != nil { return err } ts = node.Chainstore.GetHeaviestTipSet() @@ -36,7 +36,7 @@ var createSimCommand = &cli.Command{ return err } tsk := types.NewTipSetKey(cids...) - ts, err = node.Chainstore.LoadTipSet(tsk) + ts, err = node.Chainstore.LoadTipSet(cctx.Context, tsk) if err != nil { return err } diff --git a/cmd/lotus-sim/info_capacity.go b/cmd/lotus-sim/info_capacity.go index 4372ee34a..a92d2cde4 100644 --- a/cmd/lotus-sim/info_capacity.go +++ b/cmd/lotus-sim/info_capacity.go @@ -39,7 +39,7 @@ var infoCapacityGrowthSimCommand = &cli.Command{ lastHeight := ts.Height() for ts.Height() > firstEpoch && cctx.Err() == nil { - ts, err = sim.Node.Chainstore.LoadTipSet(ts.Parents()) + ts, err = sim.Node.Chainstore.LoadTipSet(cctx.Context, ts.Parents()) if err != nil { return err } diff --git a/cmd/lotus-sim/info_state.go b/cmd/lotus-sim/info_state.go index 5c9541513..125dae81d 100644 --- a/cmd/lotus-sim/info_state.go +++ b/cmd/lotus-sim/info_state.go @@ -60,7 +60,7 @@ var infoStateGrowthSimCommand = &cli.Command{ var links []cid.Cid var totalSize uint64 - if err := store.View(c, func(data []byte) error { + if err := store.View(cctx.Context, c, func(data []byte) error { totalSize += uint64(len(data)) return cbg.ScanForLinks(bytes.NewReader(data), func(c cid.Cid) { if c.Prefix().Codec != cid.DagCBOR { @@ -131,7 +131,7 @@ var infoStateGrowthSimCommand = &cli.Command{ fmt.Fprintf(cctx.App.Writer, "%d: %s\n", ts.Height(), types.SizeStr(types.NewInt(parentStateSize))) } - ts, err = sim.Node.Chainstore.LoadTipSet(ts.Parents()) + ts, err = sim.Node.Chainstore.LoadTipSet(cctx.Context, ts.Parents()) if err != nil { return err } diff --git a/cmd/lotus-sim/simulation/block.go b/cmd/lotus-sim/simulation/block.go index 93e6a3191..106bc53f5 100644 --- a/cmd/lotus-sim/simulation/block.go +++ b/cmd/lotus-sim/simulation/block.go @@ -73,7 +73,7 @@ func (sim *Simulation) makeTipSet(ctx context.Context, messages []*types.Message Timestamp: uts, ElectionProof: &types.ElectionProof{WinCount: 1}, }} - err = sim.Node.Chainstore.PersistBlockHeaders(blks...) + err = sim.Node.Chainstore.PersistBlockHeaders(ctx, blks...) if err != nil { return nil, xerrors.Errorf("failed to persist block headers: %w", err) } diff --git a/cmd/lotus-sim/simulation/node.go b/cmd/lotus-sim/simulation/node.go index c18f27a33..da027ff4f 100644 --- a/cmd/lotus-sim/simulation/node.go +++ b/cmd/lotus-sim/simulation/node.go @@ -135,7 +135,7 @@ func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) StateManager: sm, stages: stages, } - if has, err := nd.MetadataDS.Has(sim.key("head")); err != nil { + if has, err := nd.MetadataDS.Has(ctx, sim.key("head")); err != nil { return nil, err } else if has { return nil, xerrors.Errorf("simulation named %s already exists", name) @@ -155,7 +155,7 @@ func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) // ListSims lists all simulations. func (nd *Node) ListSims(ctx context.Context) ([]string, error) { prefix := simulationPrefix.ChildString("head").String() - items, err := nd.MetadataDS.Query(query.Query{ + items, err := nd.MetadataDS.Query(ctx, query.Query{ Prefix: prefix, KeysOnly: true, Orders: []query.Order{query.OrderByKey{}}, @@ -192,7 +192,7 @@ func (nd *Node) DeleteSim(ctx context.Context, name string) error { var err error for _, field := range simFields { key := simulationPrefix.ChildString(field).ChildString(name) - err = multierr.Append(err, nd.MetadataDS.Delete(key)) + err = multierr.Append(err, nd.MetadataDS.Delete(ctx, key)) } return err } @@ -209,7 +209,7 @@ func (nd *Node) CopySim(ctx context.Context, oldName, newName string) error { values := make(map[string][]byte) for _, field := range simFields { key := simulationPrefix.ChildString(field).ChildString(oldName) - value, err := nd.MetadataDS.Get(key) + value, err := nd.MetadataDS.Get(ctx, key) if err == datastore.ErrNotFound { continue } else if err != nil { @@ -226,9 +226,9 @@ func (nd *Node) CopySim(ctx context.Context, oldName, newName string) error { key := simulationPrefix.ChildString(field).ChildString(newName) var err error if value, ok := values[field]; ok { - err = nd.MetadataDS.Put(key, value) + err = nd.MetadataDS.Put(ctx, key, value) } else { - err = nd.MetadataDS.Delete(key) + err = nd.MetadataDS.Delete(ctx, key) } if err != nil { return err diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index 02792e332..51404220e 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -90,7 +90,7 @@ type Simulation struct { // loadConfig loads a simulation's config from the datastore. This must be called on startup and may // be called to restore the config from-disk. func (sim *Simulation) loadConfig() error { - configBytes, err := sim.Node.MetadataDS.Get(sim.key("config")) + configBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key("config")) if err == nil { err = json.Unmarshal(configBytes, &sim.config) } @@ -111,7 +111,7 @@ func (sim *Simulation) saveConfig() error { if err != nil { return err } - return sim.Node.MetadataDS.Put(sim.key("config"), buf) + return sim.Node.MetadataDS.Put(context.Background(), sim.key("config"), buf) } var simulationPrefix = datastore.NewKey("/simulation") @@ -124,7 +124,7 @@ func (sim *Simulation) key(subkey string) datastore.Key { // loadNamedTipSet the tipset with the given name (for this simulation) func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { - tskBytes, err := sim.Node.MetadataDS.Get(sim.key(name)) + tskBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key(name)) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s/%s: %w", sim.name, name, err) } @@ -132,7 +132,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { if err != nil { return nil, xerrors.Errorf("failed to parse tipste %v (%s/%s): %w", tskBytes, sim.name, name, err) } - ts, err := sim.Node.Chainstore.LoadTipSet(tsk) + ts, err := sim.Node.Chainstore.LoadTipSet(context.Background(), tsk) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s (%s/%s): %w", tsk, sim.name, name, err) } @@ -141,7 +141,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { // storeNamedTipSet stores the tipset at name (relative to the simulation). func (sim *Simulation) storeNamedTipSet(name string, ts *types.TipSet) error { - if err := sim.Node.MetadataDS.Put(sim.key(name), ts.Key().Bytes()); err != nil { + if err := sim.Node.MetadataDS.Put(context.Background(), sim.key(name), ts.Key().Bytes()); err != nil { return xerrors.Errorf("failed to store tipset (%s/%s): %w", sim.name, name, err) } return nil @@ -308,7 +308,7 @@ func (sim *Simulation) Walk( stCid = ts.MinTicketBlock().ParentStateRoot recCid = ts.MinTicketBlock().ParentMessageReceipts - ts, err = sim.Node.Chainstore.LoadTipSet(ts.Parents()) + ts, err = sim.Node.Chainstore.LoadTipSet(ctx, ts.Parents()) if err != nil { return xerrors.Errorf("loading parent: %w", err) } From 3e288f1066f290f59316696f506b2ae2b02a2cd3 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 13 Dec 2021 15:47:17 -0500 Subject: [PATCH 062/157] Update FFI --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 428503c87..52d80081b 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 428503c87d917cc5e3e637983b43b4c260863bf0 +Subproject commit 52d80081bfdd8a30bc44bcfe44cb0f299615b9f3 From ac3cdf75fa8e50ae61c3a7caf6473e2e38038f4d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 8 Sep 2021 15:22:41 -0400 Subject: [PATCH 063/157] Mempool: Selection logic should respect block message limits --- chain/messagepool/selection.go | 77 +++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index acff7c4cf..88b1b63af 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -92,7 +92,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas { + if gasLimit < minGas || len(result) >= build.BlockMessageLimit { return result, nil } @@ -117,19 +117,21 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ return result, nil } - // 3. Parition chains into blocks (without trimming) + // 3. Partition chains into blocks (without trimming) // we use the full blockGasLimit (as opposed to the residual gas limit from the - // priority message selection) as we have to account for what other miners are doing + // priority message selection) as we have to account for what other block providers are doing nextChain := 0 partitions := make([][]*msgChain, MaxBlocks) for i := 0; i < MaxBlocks && nextChain < len(chains); i++ { gasLimit := int64(build.BlockGasLimit) + msgLimit := build.BlockMessageLimit for nextChain < len(chains) { chain := chains[nextChain] nextChain++ partitions[i] = append(partitions[i], chain) gasLimit -= chain.gasLimit - if gasLimit < minGas { + msgLimit -= len(chain.msgs) + if gasLimit < minGas || msgLimit <= 0 { break } } @@ -158,7 +160,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ }) // 6. Merge the head chains to produce the list of messages selected for inclusion - // subject to the residual gas limit + // subject to the residual block limits // When a chain is merged in, all its previous dependent chains *must* also be // merged in or we'll have a broken block startMerge := time.Now() @@ -176,14 +178,16 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // compute the dependencies that must be merged and the gas limit including deps chainGasLimit := chain.gasLimit + chainMsgLimit := len(chain.msgs) var chainDeps []*msgChain for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { chainDeps = append(chainDeps, curChain) chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) } // does it all fit in the block? - if chainGasLimit <= gasLimit { + if chainGasLimit <= gasLimit && chainMsgLimit+len(result) <= build.BlockMessageLimit { // include it together with all dependencies for i := len(chainDeps) - 1; i >= 0; i-- { curChain := chainDeps[i] @@ -192,7 +196,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ } chain.merged = true - // adjust the effective pefromance for all subsequent chains + // adjust the effective performance for all subsequent chains if next := chain.next; next != nil && next.effPerf > 0 { next.effPerf += next.parentOffset for next = next.next; next != nil && next.effPerf > 0; next = next.next { @@ -222,7 +226,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // 7. We have reached the edge of what can fit wholesale; if we still hae available // gasLimit to pack some more chains, then trim the last chain and push it down. - // Trimming invalidaates subsequent dependent chains so that they can't be selected + // Trimming invalidates subsequent dependent chains so that they can't be selected // as their dependency cannot be (fully) included. // We do this in a loop because the blocker might have been inordinately large and // we might have to do it multiple times to satisfy tail packing @@ -231,7 +235,7 @@ tailLoop: for gasLimit >= minGas && last < len(chains) { // trim if necessary if chains[last].gasLimit > gasLimit { - chains[last].Trim(gasLimit, mp, baseFee) + chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) } // push down if it hasn't been invalidated @@ -263,16 +267,20 @@ tailLoop: // compute the dependencies that must be merged and the gas limit including deps chainGasLimit := chain.gasLimit + chainMsgLimit := len(chain.msgs) depGasLimit := int64(0) + depMsgLimit := 0 var chainDeps []*msgChain for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { chainDeps = append(chainDeps, curChain) chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) depGasLimit += curChain.gasLimit + depMsgLimit += len(curChain.msgs) } // does it all fit in the bock - if chainGasLimit <= gasLimit { + if chainGasLimit <= gasLimit && len(result)+chainMsgLimit <= build.BlockMessageLimit { // include it together with all dependencies for i := len(chainDeps) - 1; i >= 0; i-- { curChain := chainDeps[i] @@ -288,17 +296,17 @@ tailLoop: // it doesn't all fit; now we have to take into account the dependent chains before // making a decision about trimming or invalidating. - // if the dependencies exceed the gas limit, then we must invalidate the chain + // if the dependencies exceed the block limits, then we must invalidate the chain // as it can never be included. // Otherwise we can just trim and continue - if depGasLimit > gasLimit { + if depGasLimit > gasLimit || len(result)+depMsgLimit >= build.BlockMessageLimit { chain.Invalidate() last += i + 1 continue tailLoop } // dependencies fit, just trim it - chain.Trim(gasLimit-depGasLimit, mp, baseFee) + chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) last += i continue tailLoop } @@ -311,9 +319,9 @@ tailLoop: log.Infow("pack tail chains done", "took", dt) } - // if we have gasLimit to spare, pick some random (non-negative) chains to fill the block - // we pick randomly so that we minimize the probability of duplication among all miners - if gasLimit >= minGas { + // if we have room to spare, pick some random (non-negative) chains to fill the block + // we pick randomly so that we minimize the probability of duplication among all block producers + if gasLimit >= minGas && len(result) <= build.BlockMessageLimit { randomCount := 0 startRandom := time.Now() @@ -321,7 +329,7 @@ tailLoop: for _, chain := range chains { // have we filled the block - if gasLimit < minGas { + if gasLimit < minGas || len(result) >= build.BlockMessageLimit { break } @@ -337,23 +345,27 @@ tailLoop: // compute the dependencies that must be merged and the gas limit including deps chainGasLimit := chain.gasLimit + chainMsgLimit := len(chain.msgs) depGasLimit := int64(0) + depMsgLimit := 0 var chainDeps []*msgChain for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { chainDeps = append(chainDeps, curChain) chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) depGasLimit += curChain.gasLimit + depMsgLimit += len(curChain.msgs) } // do the deps fit? if the deps won't fit, invalidate the chain - if depGasLimit > gasLimit { + if depGasLimit > gasLimit || len(result)+depMsgLimit > build.BlockMessageLimit { chain.Invalidate() continue } // do they fit as is? if it doesn't, trim to make it fit if possible - if chainGasLimit > gasLimit { - chain.Trim(gasLimit-depGasLimit, mp, baseFee) + if chainGasLimit > gasLimit || len(result)+chainMsgLimit > build.BlockMessageLimit { + chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) if !chain.valid { continue @@ -416,7 +428,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas { + if gasLimit < minGas || len(result) > build.BlockMessageLimit { return result, nil } @@ -442,7 +454,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type } // 3. Merge the head chains to produce the list of messages selected for inclusion, subject to - // the block gas limit. + // the block gas and message limits. startMerge := time.Now() last := len(chains) for i, chain := range chains { @@ -452,13 +464,13 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type } // does it fit in the block? - if chain.gasLimit <= gasLimit { + if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { gasLimit -= chain.gasLimit result = append(result, chain.msgs...) continue } - // we can't fit this chain because of block gasLimit -- we are at the edge + // we can't fit this chain because of block limits -- we are at the edge last = i break } @@ -476,7 +488,7 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type tailLoop: for gasLimit >= minGas && last < len(chains) { // trim - chains[last].Trim(gasLimit, mp, baseFee) + chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) // push down if it hasn't been invalidated if chains[last].valid { @@ -501,7 +513,7 @@ tailLoop: } // does it fit in the bock? - if chain.gasLimit <= gasLimit { + if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { gasLimit -= chain.gasLimit result = append(result, chain.msgs...) continue @@ -778,11 +790,16 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6 return nil } + // if we have more messages from this sender than can fit in a block, drop the extra ones + if len(msgs) > build.BlockMessageLimit { + msgs = msgs[:build.BlockMessageLimit] + } + // ok, now we can construct the chains using the messages we have // invariant: each chain has a bigger gasPerf than the next -- otherwise they can be merged // and increase the gasPerf of the first chain // We do this in two passes: - // - in the first pass we create chains that aggreagate messages with non-decreasing gasPerf + // - in the first pass we create chains that aggregate messages with non-decreasing gasPerf // - in the second pass we merge chains to maintain the invariant. var chains []*msgChain var curChain *msgChain @@ -808,7 +825,7 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6 gasLimit := curChain.gasLimit + m.Message.GasLimit gasPerf := mp.getGasPerf(gasReward, gasLimit) - // try to add the message to the current chain -- if it decreases the gasPerf, then make a + // try to add the message to the current chain -- if it decreases the gasPerf, or then make a // new chain if gasPerf < curChain.gasPerf { chains = append(chains, curChain) @@ -868,9 +885,9 @@ func (mc *msgChain) Before(other *msgChain) bool { (mc.gasPerf == other.gasPerf && mc.gasReward.Cmp(other.gasReward) > 0) } -func (mc *msgChain) Trim(gasLimit int64, mp *MessagePool, baseFee types.BigInt) { +func (mc *msgChain) Trim(gasLimit int64, msgLimit int, mp *MessagePool, baseFee types.BigInt) { i := len(mc.msgs) - 1 - for i >= 0 && (mc.gasLimit > gasLimit || mc.gasPerf < 0) { + for i >= 0 && (mc.gasLimit > gasLimit || mc.gasPerf < 0 || i >= msgLimit) { gasReward := mp.getGasReward(mc.msgs[i], baseFee) mc.gasReward = new(big.Int).Sub(mc.gasReward, gasReward) mc.gasLimit -= mc.msgs[i].Message.GasLimit From dd20cb73019d6f4e462a0cef23c9aa3e67cc36ea Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Sep 2021 17:47:12 -0400 Subject: [PATCH 064/157] Consensus: Safety check against unknown sig types --- chain/consensus/filcns/mine.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index bbda35fcf..757363a76 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -65,7 +65,7 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. } blsMsgCids = append(blsMsgCids, c) - } else { + } else if msg.Signature.Type == crypto.SigTypeSecp256k1 { c, err := filec.sm.ChainStore().PutMessage(msg) if err != nil { return nil, err @@ -74,6 +74,8 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. secpkMsgCids = append(secpkMsgCids, c) secpkMessages = append(secpkMessages, msg) + } else { + return nil, xerrors.Errorf("unknown sig type: %d", msg.Signature.Type) } } From ec00e73c9d983140291bada2b866c1991518477e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Sep 2021 20:24:12 -0400 Subject: [PATCH 065/157] Mempool: Selection should respect CBOR limits --- chain/messagepool/repub.go | 6 +- chain/messagepool/selection.go | 340 ++++++++++++++++------------ chain/messagepool/selection_test.go | 8 +- 3 files changed, 203 insertions(+), 151 deletions(-) diff --git a/chain/messagepool/repub.go b/chain/messagepool/repub.go index 4323bdee1..d92b5bd58 100644 --- a/chain/messagepool/repub.go +++ b/chain/messagepool/repub.go @@ -121,7 +121,7 @@ loop: // we can't fit the current chain but there is gas to spare // trim it and push it down - chain.Trim(gasLimit, mp, baseFee) + chain.Trim(gasLimit, repubMsgLimit, mp, baseFee) for j := i; j < len(chains)-1; j++ { if chains[j].Before(chains[j+1]) { break @@ -131,6 +131,10 @@ loop: } count := 0 + if len(msgs) > repubMsgLimit { + msgs = msgs[:repubMsgLimit] + } + log.Infof("republishing %d messages", len(msgs)) for _, m := range msgs { mb, err := m.Serialize() diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index 88b1b63af..7446ee4e4 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -7,6 +7,10 @@ import ( "sort" "time" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/go-state-types/crypto" + "golang.org/x/xerrors" "github.com/filecoin-project/go-address" @@ -34,9 +38,10 @@ type msgChain struct { merged bool next *msgChain prev *msgChain + sigType crypto.SigType } -func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq float64) (msgs []*types.SignedMessage, err error) { +func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq float64) ([]*types.SignedMessage, error) { mp.curTsLk.Lock() defer mp.curTsLk.Unlock() @@ -46,24 +51,151 @@ func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq // if the ticket quality is high enough that the first block has higher probability // than any other block, then we don't bother with optimal selection because the // first block will always have higher effective performance + var sm *selectedMessages + var err error if tq > 0.84 { - msgs, err = mp.selectMessagesGreedy(ctx, mp.curTs, ts) + sm, err = mp.selectMessagesGreedy(ctx, mp.curTs, ts) } else { - msgs, err = mp.selectMessagesOptimal(ctx, mp.curTs, ts, tq) + sm, err = mp.selectMessagesOptimal(ctx, mp.curTs, ts, tq) } if err != nil { return nil, err } - if len(msgs) > build.BlockMessageLimit { - msgs = msgs[:build.BlockMessageLimit] + // one last sanity check + if len(sm.msgs) > build.BlockMessageLimit { + sm.msgs = sm.msgs[:build.BlockMessageLimit] } - return msgs, nil + return sm.msgs, nil } -func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *types.TipSet, tq float64) ([]*types.SignedMessage, error) { +type selectedMessages struct { + msgs []*types.SignedMessage + gasLimit int64 + secpLimit int + blsLimit int +} + +// returns false if chain can't be added due to block constraints +func (sm *selectedMessages) tryToAdd(mc *msgChain) bool { + l := len(mc.msgs) + + if build.BlockMessageLimit < l+len(sm.msgs) || sm.gasLimit < mc.gasLimit { + return false + } + + if mc.sigType == crypto.SigTypeBLS { + if sm.blsLimit < l { + return false + } + + sm.msgs = append(sm.msgs, mc.msgs...) + sm.blsLimit -= l + sm.gasLimit -= mc.gasLimit + } else if mc.sigType == crypto.SigTypeSecp256k1 { + if sm.secpLimit < l { + return false + } + + sm.msgs = append(sm.msgs, mc.msgs...) + sm.secpLimit -= l + sm.gasLimit -= mc.gasLimit + } + + // don't add the weird sigType msg, but otherwise proceed + return true +} + +// returns false if messages can't be added due to block constraints +// will trim / invalidate chain as appropriate +func (sm *selectedMessages) tryToAddWithDeps(mc *msgChain, mp *MessagePool, baseFee types.BigInt) bool { + // compute the dependencies that must be merged and the gas limit including deps + chainGasLimit := mc.gasLimit + chainMsgLimit := len(mc.msgs) + depGasLimit := int64(0) + depMsgLimit := 0 + smMsgLimit := 0 + + if mc.sigType == crypto.SigTypeBLS { + smMsgLimit = sm.blsLimit + } else if mc.sigType == crypto.SigTypeSecp256k1 { + smMsgLimit = sm.secpLimit + } else { + return false + } + + if smMsgLimit > build.BlockMessageLimit-len(sm.msgs) { + smMsgLimit = build.BlockMessageLimit - len(sm.msgs) + } + + var chainDeps []*msgChain + for curChain := mc.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { + chainDeps = append(chainDeps, curChain) + chainGasLimit += curChain.gasLimit + chainMsgLimit += len(curChain.msgs) + depGasLimit += curChain.gasLimit + depMsgLimit += len(curChain.msgs) + } + + // the chain doesn't fit as-is, so trim / invalidate it and return false + if chainGasLimit > sm.gasLimit || chainMsgLimit > smMsgLimit { + + // it doesn't all fit; now we have to take into account the dependent chains before + // making a decision about trimming or invalidating. + // if the dependencies exceed the block limits, then we must invalidate the chain + // as it can never be included. + // Otherwise we can just trim and continue + if depGasLimit > sm.gasLimit || depMsgLimit >= smMsgLimit { + mc.Invalidate() + } else { + // dependencies fit, just trim it + mc.Trim(sm.gasLimit-depGasLimit, smMsgLimit-depMsgLimit, mp, baseFee) + } + + return false + } + + // the chain fits! include it together with all dependencies + for i := len(chainDeps) - 1; i >= 0; i-- { + curChain := chainDeps[i] + curChain.merged = true + sm.msgs = append(sm.msgs, curChain.msgs...) + } + + mc.merged = true + + sm.msgs = append(sm.msgs, mc.msgs...) + sm.gasLimit -= chainGasLimit + + if mc.sigType == crypto.SigTypeBLS { + sm.blsLimit -= chainMsgLimit + } else if mc.sigType == crypto.SigTypeSecp256k1 { + sm.secpLimit -= chainMsgLimit + } + + return true +} + +func (sm *selectedMessages) trimChain(mc *msgChain, mp *MessagePool, baseFee types.BigInt) { + msgLimit := build.BlockMessageLimit - len(sm.msgs) + if mc.sigType == crypto.SigTypeBLS { + if msgLimit > sm.blsLimit { + msgLimit = sm.blsLimit + } + } else if mc.sigType == crypto.SigTypeSecp256k1 { + if msgLimit > sm.secpLimit { + msgLimit = sm.secpLimit + } + } + + if mc.gasLimit > sm.gasLimit || len(mc.msgs) > msgLimit { + mc.Trim(sm.gasLimit, msgLimit, mp, baseFee) + } +} + +func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *types.TipSet, tq float64) (*selectedMessages, error) { start := time.Now() baseFee, err := mp.api.ChainComputeBaseFee(context.TODO(), ts) @@ -89,10 +221,10 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // 0b. Select all priority messages that fit in the block minGas := int64(gasguess.MinGas) - result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) + result := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas || len(result) >= build.BlockMessageLimit { + if result.gasLimit < minGas || len(result.msgs) >= build.BlockMessageLimit { return result, nil } @@ -176,26 +308,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ continue } - // compute the dependencies that must be merged and the gas limit including deps - chainGasLimit := chain.gasLimit - chainMsgLimit := len(chain.msgs) - var chainDeps []*msgChain - for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { - chainDeps = append(chainDeps, curChain) - chainGasLimit += curChain.gasLimit - chainMsgLimit += len(curChain.msgs) - } - - // does it all fit in the block? - if chainGasLimit <= gasLimit && chainMsgLimit+len(result) <= build.BlockMessageLimit { - // include it together with all dependencies - for i := len(chainDeps) - 1; i >= 0; i-- { - curChain := chainDeps[i] - curChain.merged = true - result = append(result, curChain.msgs...) - } - - chain.merged = true + if result.tryToAddWithDeps(chain, mp, baseFee) { // adjust the effective performance for all subsequent chains if next := chain.next; next != nil && next.effPerf > 0 { next.effPerf += next.parentOffset @@ -203,10 +316,8 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ next.setEffPerf() } } - result = append(result, chain.msgs...) - gasLimit -= chainGasLimit - // resort to account for already merged chains and effective performance adjustments + // re-sort to account for already merged chains and effective performance adjustments // the sort *must* be stable or we end up getting negative gasPerfs pushed up. sort.SliceStable(chains[i+1:], func(i, j int) bool { return chains[i].BeforeEffective(chains[j]) @@ -215,7 +326,7 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ continue } - // we can't fit this chain and its dependencies because of block gasLimit -- we are + // we can't fit this chain and its dependencies because of block limits -- we are // at the edge last = i break @@ -232,12 +343,16 @@ func (mp *MessagePool) selectMessagesOptimal(ctx context.Context, curTs, ts *typ // we might have to do it multiple times to satisfy tail packing startTail := time.Now() tailLoop: - for gasLimit >= minGas && last < len(chains) { - // trim if necessary - if chains[last].gasLimit > gasLimit { - chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) + for result.gasLimit >= minGas && last < len(chains) { + + if !chains[last].valid { + last++ + continue tailLoop } + // trim if necessary + result.trimChain(chains[last], mp, baseFee) + // push down if it hasn't been invalidated if chains[last].valid { for i := last; i < len(chains)-1; i++ { @@ -249,7 +364,7 @@ tailLoop: } // select the next (valid and fitting) chain and its dependencies for inclusion - for i, chain := range chains[last:] { + for _, chain := range chains[last:] { // has the chain been invalidated? if !chain.valid { continue @@ -265,49 +380,10 @@ tailLoop: break tailLoop } - // compute the dependencies that must be merged and the gas limit including deps - chainGasLimit := chain.gasLimit - chainMsgLimit := len(chain.msgs) - depGasLimit := int64(0) - depMsgLimit := 0 - var chainDeps []*msgChain - for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { - chainDeps = append(chainDeps, curChain) - chainGasLimit += curChain.gasLimit - chainMsgLimit += len(curChain.msgs) - depGasLimit += curChain.gasLimit - depMsgLimit += len(curChain.msgs) - } - - // does it all fit in the bock - if chainGasLimit <= gasLimit && len(result)+chainMsgLimit <= build.BlockMessageLimit { - // include it together with all dependencies - for i := len(chainDeps) - 1; i >= 0; i-- { - curChain := chainDeps[i] - curChain.merged = true - result = append(result, curChain.msgs...) - } - - chain.merged = true - result = append(result, chain.msgs...) - gasLimit -= chainGasLimit + if result.tryToAddWithDeps(chain, mp, baseFee) { continue } - // it doesn't all fit; now we have to take into account the dependent chains before - // making a decision about trimming or invalidating. - // if the dependencies exceed the block limits, then we must invalidate the chain - // as it can never be included. - // Otherwise we can just trim and continue - if depGasLimit > gasLimit || len(result)+depMsgLimit >= build.BlockMessageLimit { - chain.Invalidate() - last += i + 1 - continue tailLoop - } - - // dependencies fit, just trim it - chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) - last += i continue tailLoop } @@ -321,15 +397,15 @@ tailLoop: // if we have room to spare, pick some random (non-negative) chains to fill the block // we pick randomly so that we minimize the probability of duplication among all block producers - if gasLimit >= minGas && len(result) <= build.BlockMessageLimit { - randomCount := 0 + if result.gasLimit >= minGas && len(result.msgs) <= build.BlockMessageLimit { + preRandomLength := len(result.msgs) startRandom := time.Now() shuffleChains(chains) for _, chain := range chains { // have we filled the block - if gasLimit < minGas || len(result) >= build.BlockMessageLimit { + if result.gasLimit < minGas || len(result.msgs) >= build.BlockMessageLimit { break } @@ -343,63 +419,31 @@ tailLoop: continue } - // compute the dependencies that must be merged and the gas limit including deps - chainGasLimit := chain.gasLimit - chainMsgLimit := len(chain.msgs) - depGasLimit := int64(0) - depMsgLimit := 0 - var chainDeps []*msgChain - for curChain := chain.prev; curChain != nil && !curChain.merged; curChain = curChain.prev { - chainDeps = append(chainDeps, curChain) - chainGasLimit += curChain.gasLimit - chainMsgLimit += len(curChain.msgs) - depGasLimit += curChain.gasLimit - depMsgLimit += len(curChain.msgs) - } - - // do the deps fit? if the deps won't fit, invalidate the chain - if depGasLimit > gasLimit || len(result)+depMsgLimit > build.BlockMessageLimit { - chain.Invalidate() + if result.tryToAddWithDeps(chain, mp, baseFee) { continue } - // do they fit as is? if it doesn't, trim to make it fit if possible - if chainGasLimit > gasLimit || len(result)+chainMsgLimit > build.BlockMessageLimit { - chain.Trim(gasLimit-depGasLimit, build.BlockMessageLimit-len(result)-depMsgLimit, mp, baseFee) - - if !chain.valid { - continue - } + if chain.valid { + // chain got trimmed on the previous call to tryToAddWithDeps, can now be included + result.tryToAddWithDeps(chain, mp, baseFee) + continue } - - // include it together with all dependencies - for i := len(chainDeps) - 1; i >= 0; i-- { - curChain := chainDeps[i] - curChain.merged = true - result = append(result, curChain.msgs...) - randomCount += len(curChain.msgs) - } - - chain.merged = true - result = append(result, chain.msgs...) - randomCount += len(chain.msgs) - gasLimit -= chainGasLimit } if dt := time.Since(startRandom); dt > time.Millisecond { log.Infow("pack random tail chains done", "took", dt) } - if randomCount > 0 { + if len(result.msgs) != preRandomLength { log.Warnf("optimal selection failed to pack a block; picked %d messages with random selection", - randomCount) + len(result.msgs)-preRandomLength) } } return result, nil } -func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *types.TipSet) ([]*types.SignedMessage, error) { +func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *types.TipSet) (*selectedMessages, error) { start := time.Now() baseFee, err := mp.api.ChainComputeBaseFee(context.TODO(), ts) @@ -425,10 +469,10 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type // 0b. Select all priority messages that fit in the block minGas := int64(gasguess.MinGas) - result, gasLimit := mp.selectPriorityMessages(ctx, pending, baseFee, ts) + result := mp.selectPriorityMessages(ctx, pending, baseFee, ts) // have we filled the block? - if gasLimit < minGas || len(result) > build.BlockMessageLimit { + if result.gasLimit < minGas || len(result.msgs) > build.BlockMessageLimit { return result, nil } @@ -464,9 +508,8 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type } // does it fit in the block? - if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -486,9 +529,9 @@ func (mp *MessagePool) selectMessagesGreedy(ctx context.Context, curTs, ts *type // have to do it multiple times to satisfy tail packing. startTail := time.Now() tailLoop: - for gasLimit >= minGas && last < len(chains) { + for result.gasLimit >= minGas && last < len(chains) { // trim - chains[last].Trim(gasLimit, build.BlockMessageLimit-len(result), mp, baseFee) + result.trimChain(chains[last], mp, baseFee) // push down if it hasn't been invalidated if chains[last].valid { @@ -513,9 +556,8 @@ tailLoop: } // does it fit in the bock? - if chain.gasLimit <= gasLimit && len(result)+len(chain.msgs) <= build.BlockMessageLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -535,7 +577,7 @@ tailLoop: return result, nil } -func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[address.Address]map[uint64]*types.SignedMessage, baseFee types.BigInt, ts *types.TipSet) ([]*types.SignedMessage, int64) { +func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[address.Address]map[uint64]*types.SignedMessage, baseFee types.BigInt, ts *types.TipSet) *selectedMessages { start := time.Now() defer func() { if dt := time.Since(start); dt > time.Millisecond { @@ -543,8 +585,12 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a } }() mpCfg := mp.getConfig() - result := make([]*types.SignedMessage, 0, mpCfg.SizeLimitLow) - gasLimit := int64(build.BlockGasLimit) + result := &selectedMessages{ + msgs: make([]*types.SignedMessage, 0, mpCfg.SizeLimitLow), + gasLimit: int64(build.BlockGasLimit), + blsLimit: cbg.MaxLength, + secpLimit: cbg.MaxLength, + } minGas := int64(gasguess.MinGas) // 1. Get priority actor chains @@ -554,7 +600,7 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a pk, err := mp.resolveToKey(ctx, actor) if err != nil { log.Debugf("mpooladdlocal failed to resolve sender: %s", err) - return nil, gasLimit + return result } mset, ok := pending[pk] @@ -566,9 +612,8 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a chains = append(chains, next...) } } - if len(chains) == 0 { - return nil, gasLimit + return result } // 2. Sort the chains @@ -578,7 +623,7 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a if len(chains) != 0 && chains[0].gasPerf < 0 { log.Warnw("all priority messages in mpool have negative gas performance", "bestGasPerf", chains[0].gasPerf) - return nil, gasLimit + return result } // 3. Merge chains until the block limit, as long as they have non-negative gas performance @@ -588,9 +633,8 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a break } - if chain.gasLimit <= gasLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -600,9 +644,10 @@ func (mp *MessagePool) selectPriorityMessages(ctx context.Context, pending map[a } tailLoop: - for gasLimit >= minGas && last < len(chains) { + for result.gasLimit >= minGas && last < len(chains) { // trim, discarding negative performing messages - chains[last].Trim(gasLimit, mp, baseFee) + + result.trimChain(chains[last], mp, baseFee) // push down if it hasn't been invalidated if chains[last].valid { @@ -627,9 +672,8 @@ tailLoop: } // does it fit in the bock? - if chain.gasLimit <= gasLimit { - gasLimit -= chain.gasLimit - result = append(result, chain.msgs...) + if result.tryToAdd(chain) { + // there was room, we added the chain, keep going continue } @@ -643,7 +687,7 @@ tailLoop: break } - return result, gasLimit + return result } func (mp *MessagePool) getPendingMessages(curTs, ts *types.TipSet) (map[address.Address]map[uint64]*types.SignedMessage, error) { @@ -811,6 +855,7 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6 chain.gasLimit = m.Message.GasLimit chain.gasPerf = mp.getGasPerf(chain.gasReward, chain.gasLimit) chain.valid = true + chain.sigType = m.Signature.Type return chain } @@ -910,6 +955,7 @@ func (mc *msgChain) Trim(gasLimit int64, msgLimit int, mp *MessagePool, baseFee mc.msgs = mc.msgs[:i+1] } + // TODO: if the trim above is a no-op, this (may) needlessly invalidates the next chain if mc.next != nil { mc.next.Invalidate() mc.next = nil diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index 0f8fd8ee6..72739b6a1 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -577,7 +577,7 @@ func TestMessageSelectionTrimming(t *testing.T) { expected := int(build.BlockGasLimit / gasLimit) if len(msgs) != expected { - t.Fatalf("expected %d messages, bug got %d", expected, len(msgs)) + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) } mGasLimit := int64(0) @@ -978,7 +978,7 @@ func TestOptimalMessageSelection2(t *testing.T) { func TestOptimalMessageSelection3(t *testing.T) { // this test uses 10 actors sending a block of messages to each other, with the the first // actors paying higher gas premium than the subsequent actors. - // We select with a low ticket quality; the chain depenent merging algorithm should pick + // We select with a low ticket quality; the chain dependent merging algorithm should pick // messages from the median actor from the start mp, tma := makeTestMpool() @@ -1109,11 +1109,13 @@ func testCompetitiveMessageSelection(t *testing.T, rng *rand.Rand, getPremium fu logging.SetLogLevel("messagepool", "error") // 1. greedy selection - greedyMsgs, err := mp.selectMessagesGreedy(context.Background(), ts, ts) + gm, err := mp.selectMessagesGreedy(context.Background(), ts, ts) if err != nil { t.Fatal(err) } + greedyMsgs := gm.msgs + totalGreedyCapacity := 0.0 totalGreedyReward := 0.0 totalOptimalCapacity := 0.0 From a45803d8a033bb267b61bfb2bab53f5fe5dc5c50 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Sep 2021 21:23:49 -0400 Subject: [PATCH 066/157] Mempool: add selection tests --- chain/messagepool/selection.go | 4 + chain/messagepool/selection_test.go | 199 +++++++++++++++++++++++++++- 2 files changed, 202 insertions(+), 1 deletion(-) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index 7446ee4e4..d7f7750fc 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -63,6 +63,10 @@ func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq return nil, err } + if sm == nil { + return nil, nil + } + // one last sanity check if len(sm.msgs) > build.BlockMessageLimit { sm.msgs = sm.msgs[:build.BlockMessageLimit] diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index 72739b6a1..f3389896f 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -13,6 +13,10 @@ import ( "sort" "testing" + "github.com/filecoin-project/go-state-types/crypto" + + cbg "github.com/whyrusleeping/cbor-gen" + "github.com/filecoin-project/go-address" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -527,7 +531,7 @@ func TestBasicMessageSelection(t *testing.T) { } } -func TestMessageSelectionTrimming(t *testing.T) { +func TestMessageSelectionTrimmingGas(t *testing.T) { mp, tma := makeTestMpool() // the actors @@ -590,6 +594,199 @@ func TestMessageSelectionTrimming(t *testing.T) { } +func TestMessageSelectionTrimmingMsgsBasic(t *testing.T) { + mp, tma := makeTestMpool() + + // the actors + w1, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a1, err := w1.WalletNew(context.Background(), types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + block := tma.nextBlock() + ts := mock.TipSet(block) + tma.applyBlock(t, block) + + tma.setBalance(a1, 1) // in FIL + + // create a larger than selectable chain + for i := 0; i < build.BlockMessageLimit; i++ { + m := makeTestMessage(w1, a1, a1, uint64(i), 300000, 100) + mustAdd(t, mp, m) + } + + msgs, err := mp.SelectMessages(context.Background(), ts, 1.0) + if err != nil { + t.Fatal(err) + } + + expected := cbg.MaxLength + if len(msgs) != expected { + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) + } + + mGasLimit := int64(0) + for _, m := range msgs { + mGasLimit += m.Message.GasLimit + } + if mGasLimit > build.BlockGasLimit { + t.Fatal("selected messages gas limit exceeds block gas limit!") + } + +} + +func TestMessageSelectionTrimmingMsgsTwoSendersBasic(t *testing.T) { + mp, tma := makeTestMpool() + + // the actors + w1, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a1, err := w1.WalletNew(context.Background(), types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + w2, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a2, err := w2.WalletNew(context.Background(), types.KTBLS) + if err != nil { + t.Fatal(err) + } + + block := tma.nextBlock() + ts := mock.TipSet(block) + tma.applyBlock(t, block) + + tma.setBalance(a1, 1) // in FIL + tma.setBalance(a2, 1) // in FIL + + // create 2 larger than selectable chains + for i := 0; i < build.BlockMessageLimit; i++ { + m := makeTestMessage(w1, a1, a2, uint64(i), 300000, 100) + mustAdd(t, mp, m) + // a2's messages are preferred + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 1000) + mustAdd(t, mp, m) + } + + msgs, err := mp.SelectMessages(context.Background(), ts, 1.0) + if err != nil { + t.Fatal(err) + } + + mGasLimit := int64(0) + counts := make(map[crypto.SigType]uint) + for _, m := range msgs { + mGasLimit += m.Message.GasLimit + counts[m.Signature.Type]++ + } + + if mGasLimit > build.BlockGasLimit { + t.Fatal("selected messages gas limit exceeds block gas limit!") + } + + expected := build.BlockMessageLimit + if len(msgs) != expected { + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) + } + + if counts[crypto.SigTypeBLS] != cbg.MaxLength { + t.Fatalf("expected %d bls messages, but got %d", cbg.MaxLength, len(msgs)) + } +} + +func TestMessageSelectionTrimmingMsgsTwoSendersAdvanced(t *testing.T) { + mp, tma := makeTestMpool() + + // the actors + w1, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a1, err := w1.WalletNew(context.Background(), types.KTSecp256k1) + if err != nil { + t.Fatal(err) + } + + w2, err := wallet.NewWallet(wallet.NewMemKeyStore()) + if err != nil { + t.Fatal(err) + } + + a2, err := w2.WalletNew(context.Background(), types.KTBLS) + if err != nil { + t.Fatal(err) + } + + block := tma.nextBlock() + ts := mock.TipSet(block) + tma.applyBlock(t, block) + + tma.setBalance(a1, 1) // in FIL + tma.setBalance(a2, 1) // in FIL + + // create 2 almost max-length chains of equal value + i := 0 + for i = 0; i < cbg.MaxLength-1; i++ { + m := makeTestMessage(w1, a1, a2, uint64(i), 300000, 100) + mustAdd(t, mp, m) + // a2's messages are preferred + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 100) + mustAdd(t, mp, m) + } + + // a1's 8192th message is worth more than a2's + m := makeTestMessage(w1, a1, a2, uint64(i), 300000, 1000) + mustAdd(t, mp, m) + + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 100) + mustAdd(t, mp, m) + + i++ + + // a2's (unselectable) 8193rd message is worth SO MUCH + m = makeTestMessage(w2, a2, a1, uint64(i), 300000, 1000000) + mustAdd(t, mp, m) + + msgs, err := mp.SelectMessages(context.Background(), ts, 1.0) + if err != nil { + t.Fatal(err) + } + + mGasLimit := int64(0) + counts := make(map[crypto.SigType]uint) + for _, m := range msgs { + mGasLimit += m.Message.GasLimit + counts[m.Signature.Type]++ + } + + if mGasLimit > build.BlockGasLimit { + t.Fatal("selected messages gas limit exceeds block gas limit!") + } + + expected := build.BlockMessageLimit + if len(msgs) != expected { + t.Fatalf("expected %d messages, but got %d", expected, len(msgs)) + } + + // we should have taken the secp chain + if counts[crypto.SigTypeSecp256k1] != cbg.MaxLength { + t.Fatalf("expected %d bls messages, but got %d", cbg.MaxLength, len(msgs)) + } +} + func TestPriorityMessageSelection(t *testing.T) { mp, tma := makeTestMpool() From b08bf32040d246078547de935ea0f0e88f844509 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 13 Dec 2021 18:31:31 -0500 Subject: [PATCH 067/157] Add a log for when message selection fails --- chain/messagepool/selection.go | 1 + 1 file changed, 1 insertion(+) diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index d7f7750fc..3ccf2e406 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -69,6 +69,7 @@ func (mp *MessagePool) SelectMessages(ctx context.Context, ts *types.TipSet, tq // one last sanity check if len(sm.msgs) > build.BlockMessageLimit { + log.Errorf("message selection chose too many messages %d > %d", len(sm.msgs), build.BlockMessageLimit) sm.msgs = sm.msgs[:build.BlockMessageLimit] } From 0001a6bad099240f9362f86c59b3451bbc757843 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:26:15 +0200 Subject: [PATCH 068/157] update go-libp2p to v0.17 --- go.mod | 14 +++++++------- go.sum | 34 +++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index c4be98cc0..0877eb94b 100644 --- a/go.mod +++ b/go.mod @@ -90,7 +90,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 github.com/ipfs/go-ipld-format v0.2.0 - github.com/ipfs/go-log/v2 v2.3.0 + github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 @@ -106,20 +106,20 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.16.0 + github.com/libp2p/go-libp2p v0.17.0 github.com/libp2p/go-libp2p-connmgr v0.2.4 - github.com/libp2p/go-libp2p-core v0.11.0 + github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 - github.com/libp2p/go-libp2p-peerstore v0.4.0 + github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.0 - github.com/libp2p/go-libp2p-quic-transport v0.15.0 + github.com/libp2p/go-libp2p-quic-transport v0.15.2 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.8.0 + github.com/libp2p/go-libp2p-swarm v0.9.0 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.6.0 + github.com/libp2p/go-libp2p-yamux v0.7.0 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-isatty v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 diff --git a/go.sum b/go.sum index 0206e839f..7e823b6a3 100644 --- a/go.sum +++ b/go.sum @@ -792,8 +792,9 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= @@ -972,8 +973,9 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.16.0 h1:aTxzQPllnW+nyC9mY8xaS20BbcrSYMt1HCkjZRHvdGY= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -984,15 +986,17 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.6.0 h1:+vbQ1pMzMGjE/RJopiQKK2FRjdCKHPNPrkPm8u+luQU= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= +github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= +github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= @@ -1035,8 +1039,10 @@ github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.11.0 h1:75jAgdA+IChNa+/mZXogfmrGkgwxkVvxmIC7pV+F6sI= github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.13.0 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1100,8 +1106,9 @@ github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRj github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.4.0 h1:DOhRJLnM9Dc9lIXi3rPDZBf789LXy1BrzwIs7Tj0cKA= github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= @@ -1113,8 +1120,9 @@ github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= -github.com/libp2p/go-libp2p-quic-transport v0.15.0 h1:DR0mP6kcieowikBprWkcNtbquRKOPWb5dLZ4ahDZujk= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= +github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -1139,8 +1147,9 @@ github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0 github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= -github.com/libp2p/go-libp2p-swarm v0.8.0 h1:nRHNRhi86L7jhka02N4MoV+PSFFPoJFkHNQwCTFxNhw= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1151,8 +1160,9 @@ github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.5.0 h1:bTjC29TTQ/ODq0ld3+0KLq3irdA5cAH3OMbRi0/QsvE= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1166,8 +1176,9 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= -github.com/libp2p/go-libp2p-transport-upgrader v0.5.0 h1:7SDl3O2+AYOgfE40Mis83ClpfGNkNA6m4FwhbOHs+iI= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1180,8 +1191,9 @@ github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2Ez github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= -github.com/libp2p/go-libp2p-yamux v0.6.0 h1:TKayW983n92JhCGdCo7ej7eEb+DQ0VYfKNOxlN/1kNQ= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= +github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= From 773f896bcd892108daa6474cda8cebe0b6a8c96a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:27:34 +0200 Subject: [PATCH 069/157] update go-libp2p-connmgr to v0.3 --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 0877eb94b..3c1496231 100644 --- a/go.mod +++ b/go.mod @@ -107,7 +107,7 @@ require ( github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 github.com/libp2p/go-libp2p v0.17.0 - github.com/libp2p/go-libp2p-connmgr v0.2.4 + github.com/libp2p/go-libp2p-connmgr v0.3.0 github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 @@ -135,7 +135,7 @@ require ( github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e github.com/prometheus/client_golang v1.11.0 github.com/raulk/clock v1.1.0 - github.com/raulk/go-watchdog v1.0.1 + github.com/raulk/go-watchdog v1.2.0 github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 diff --git a/go.sum b/go.sum index 7e823b6a3..912b9b01e 100644 --- a/go.sum +++ b/go.sum @@ -1006,8 +1006,9 @@ github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQ github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= @@ -1612,8 +1613,8 @@ github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= -github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= +github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= From f157ac9b6829a5f8fc564f4343d783ed94735454 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:30:29 +0200 Subject: [PATCH 070/157] update for new ConnManager constructor --- node/modules/lp2p/libp2p.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/node/modules/lp2p/libp2p.go b/node/modules/lp2p/libp2p.go index 4dee15ae9..5d8ece732 100644 --- a/node/modules/lp2p/libp2p.go +++ b/node/modules/lp2p/libp2p.go @@ -69,7 +69,11 @@ func genLibp2pKey() (crypto.PrivKey, error) { func ConnectionManager(low, high uint, grace time.Duration, protected []string) func() (opts Libp2pOpts, err error) { return func() (Libp2pOpts, error) { - cm := connmgr.NewConnManager(int(low), int(high), grace) + cm, err := connmgr.NewConnManager(int(low), int(high), connmgr.WithGracePeriod(grace)) + if err != nil { + return Libp2pOpts{}, err + } + for _, p := range protected { pid, err := peer.IDFromString(p) if err != nil { From 73ca65a6ff1000fe76946c508c3cd80172dcbf3b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:55:00 +0200 Subject: [PATCH 071/157] update drand --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3c1496231..e02b70215 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.3 github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d + github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc github.com/drand/kyber v1.1.7 github.com/dustin/go-humanize v1.0.0 github.com/elastic/go-sysinfo v1.7.0 diff --git a/go.sum b/go.sum index 912b9b01e..b81ed6223 100644 --- a/go.sum +++ b/go.sum @@ -243,8 +243,8 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d h1:XNzXUX04vE4cpEr+y5xsz8ghW3KQYW1yGueO0dy1Qwc= -github.com/drand/drand v1.2.8-0.20211213085422-837d12611c5d/go.mod h1:uQa+6p9wTBXErGU61JTyE0hWyT8Qfwq0AkQH9Tq3Lbk= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc h1:n6pVZeD0CEFqF4TUE0XI45pCe8cpmAJnv04f3BWXNdo= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc/go.mod h1:pizbfJhoUg8zI+od47iyqMM58XOJYsQ04h/TYermiWA= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= From fc7d4a13b0d3a1fde24636602ea03bad08364e0f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:06:59 +0200 Subject: [PATCH 072/157] fix itests --- itests/kit/deals.go | 2 +- itests/kit/ensemble.go | 2 +- itests/kit/files.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 651c15901..29da37c15 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -373,7 +373,7 @@ consumeEvents: func (dh *DealHarness) ExtractFileFromCAR(ctx context.Context, file *os.File) (out *os.File) { bserv := dstest.Bserv() - ch, err := car.LoadCar(bserv.Blockstore(), file) + ch, err := car.LoadCar(ctx, bserv.Blockstore(), file) require.NoError(dh.t, err) b, err := bserv.GetBlock(ctx, ch.Roots[0]) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 90a614645..2a6d16a95 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -487,7 +487,7 @@ func (n *Ensemble) Start() *Ensemble { ds, err := lr.Datastore(context.TODO(), "/metadata") require.NoError(n.t, err) - err = ds.Put(datastore.NewKey("miner-address"), m.ActorAddr.Bytes()) + err = ds.Put(ctx, datastore.NewKey("miner-address"), m.ActorAddr.Bytes()) require.NoError(n.t, err) nic := storedcounter.New(ds, datastore.NewKey(modules.StorageCounterDSPrefix)) diff --git a/itests/kit/files.go b/itests/kit/files.go index 9babac941..c78352afe 100644 --- a/itests/kit/files.go +++ b/itests/kit/files.go @@ -83,7 +83,7 @@ func CreateRandomCARv1(t *testing.T, rseed, size int) (carV1FilePath string, ori require.NoError(t, car.WriteCar(ctx, dagSvc, []cid.Cid{root}, tmp)) _, err = tmp.Seek(0, io.SeekStart) require.NoError(t, err) - hd, _, err := car.ReadHeader(bufio.NewReader(tmp)) + hd, err := car.ReadHeader(bufio.NewReader(tmp)) require.NoError(t, err) require.EqualValues(t, 1, hd.Version) require.Len(t, hd.Roots, 1) From eb48dc9b68355675b1f84cfe6a365c8ddec27ac6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:21:55 +0200 Subject: [PATCH 073/157] fix issues with new peerstore constructor signature in DI --- node/builder.go | 3 +-- node/modules/lp2p/host.go | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/node/builder.go b/node/builder.go index 0520d62dd..6425b21d9 100644 --- a/node/builder.go +++ b/node/builder.go @@ -19,7 +19,6 @@ import ( "github.com/libp2p/go-libp2p-core/peerstore" "github.com/libp2p/go-libp2p-core/routing" dht "github.com/libp2p/go-libp2p-kad-dht" - "github.com/libp2p/go-libp2p-peerstore/pstoremem" pubsub "github.com/libp2p/go-libp2p-pubsub" record "github.com/libp2p/go-libp2p-record" "github.com/libp2p/go-libp2p/p2p/net/conngater" @@ -170,7 +169,7 @@ var LibP2P = Options( Override(new(dtypes.Bootstrapper), dtypes.Bootstrapper(false)), // Host dependencies - Override(new(peerstore.Peerstore), pstoremem.NewPeerstore), + Override(new(peerstore.Peerstore), lp2p.Peerstore), Override(PstoreAddSelfKeysKey, lp2p.PstoreAddSelfKeys), Override(StartListeningKey, lp2p.StartListening(config.DefaultFullNode().Libp2p.ListenAddresses)), diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index 66c45297a..982d9f4cd 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -10,6 +10,7 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/peerstore" dht "github.com/libp2p/go-libp2p-kad-dht" + "github.com/libp2p/go-libp2p-peerstore/pstoremem" record "github.com/libp2p/go-libp2p-record" routedhost "github.com/libp2p/go-libp2p/p2p/host/routed" mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" @@ -33,6 +34,10 @@ type P2PHostIn struct { type RawHost host.Host +func Peerstore() (peerstore.Peerstore, error) { + return pstoremem.NewPeerstore() +} + func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (RawHost, error) { pkey := params.Peerstore.PrivKey(params.ID) if pkey == nil { From 716b4a3b09ef9e14664bfad832367d9f909c62a2 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:57:09 +0200 Subject: [PATCH 074/157] hook a great context in the sky to satisfy DI; sigh... --- node/builder.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/node/builder.go b/node/builder.go index 6425b21d9..96d217ec3 100644 --- a/node/builder.go +++ b/node/builder.go @@ -161,6 +161,12 @@ func defaults() []Option { }), Override(new(dtypes.ShutdownChan), make(chan struct{})), + + // the great context in the sky, otherwise we can't DI build genesis; there has to be a better + // solution than this hack. + Override(new(context.Context), func(lc fx.Lifecycle, mctx helpers.MetricsCtx) context.Context { + return helpers.LifecycleCtx(mctx, lc) + }), } } From 22ce395130fc598673fb4e664af1ad306955f47c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:05:10 +0200 Subject: [PATCH 075/157] fix some unit tests --- chain/events/state/mock/api.go | 4 ++-- node/impl/client/client_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/chain/events/state/mock/api.go b/chain/events/state/mock/api.go index 2ed48dc39..7a73355a5 100644 --- a/chain/events/state/mock/api.go +++ b/chain/events/state/mock/api.go @@ -27,11 +27,11 @@ func NewMockAPI(bs blockstore.Blockstore) *MockAPI { } func (m *MockAPI) ChainHasObj(ctx context.Context, c cid.Cid) (bool, error) { - return m.bs.Has(c) + return m.bs.Has(ctx, c) } func (m *MockAPI) ChainReadObj(ctx context.Context, c cid.Cid) ([]byte, error) { - blk, err := m.bs.Get(c) + blk, err := m.bs.Get(ctx, c) if err != nil { return nil, xerrors.Errorf("blockstore get: %w", err) } diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index bf7ff7735..1be225278 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -107,7 +107,7 @@ func TestImportLocal(t *testing.T) { // recreate the unixfs dag, and see if it matches the original file byte by byte // import the car into a memory blockstore, then export the unixfs file. bs := blockstore.NewBlockstore(datastore.NewMapDatastore()) - _, err = car.LoadCar(bs, exported.DataReader()) + _, err = car.LoadCar(ctx, bs, exported.DataReader()) require.NoError(t, err) dag := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))) From 40c61a310f210b4c1bc8cb14699f5a335f89439a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:17:30 +0200 Subject: [PATCH 076/157] fix splitstore test --- blockstore/splitstore/splitstore_test.go | 48 ++++++++++++------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index f9111a979..7d84e0a4c 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -30,6 +30,7 @@ func init() { } func testSplitStore(t *testing.T, cfg *Config) { + ctx := context.Background() chain := &mockChain{t: t} // the myriads of stores @@ -39,7 +40,7 @@ func testSplitStore(t *testing.T, cfg *Config) { // this is necessary to avoid the garbage mock puts in the blocks garbage := blocks.NewBlock([]byte{1, 2, 3}) - err := cold.Put(garbage) + err := cold.Put(ctx, garbage) if err != nil { t.Fatal(err) } @@ -60,21 +61,21 @@ func testSplitStore(t *testing.T, cfg *Config) { t.Fatal(err) } - err = cold.Put(blk) + err = cold.Put(ctx, blk) if err != nil { t.Fatal(err) } // create a garbage block that is protected with a rgistered protector protected := blocks.NewBlock([]byte("protected!")) - err = hot.Put(protected) + err = hot.Put(ctx, protected) if err != nil { t.Fatal(err) } // and another one that is not protected unprotected := blocks.NewBlock([]byte("unprotected!")) - err = hot.Put(unprotected) + err = hot.Put(ctx, unprotected) if err != nil { t.Fatal(err) } @@ -109,11 +110,11 @@ func testSplitStore(t *testing.T, cfg *Config) { if err != nil { t.Fatal(err) } - err = ss.Put(stateRoot) + err = ss.Put(ctx, stateRoot) if err != nil { t.Fatal(err) } - err = ss.Put(sblk) + err = ss.Put(ctx, sblk) if err != nil { t.Fatal(err) } @@ -176,7 +177,7 @@ func testSplitStore(t *testing.T, cfg *Config) { } // ensure our protected block is still there - has, err := hot.Has(protected.Cid()) + has, err := hot.Has(ctx, protected.Cid()) if err != nil { t.Fatal(err) } @@ -186,7 +187,7 @@ func testSplitStore(t *testing.T, cfg *Config) { } // ensure our unprotected block is in the coldstore now - has, err = hot.Has(unprotected.Cid()) + has, err = hot.Has(ctx, unprotected.Cid()) if err != nil { t.Fatal(err) } @@ -195,7 +196,7 @@ func testSplitStore(t *testing.T, cfg *Config) { t.Fatal("unprotected block is still in hotstore") } - has, err = cold.Has(unprotected.Cid()) + has, err = cold.Has(ctx, unprotected.Cid()) if err != nil { t.Fatal(err) } @@ -222,6 +223,7 @@ func TestSplitStoreCompactionWithBadger(t *testing.T) { } func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { + ctx := context.Background() chain := &mockChain{t: t} // the myriads of stores @@ -231,7 +233,7 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { // this is necessary to avoid the garbage mock puts in the blocks garbage := blocks.NewBlock([]byte{1, 2, 3}) - err := cold.Put(garbage) + err := cold.Put(ctx, garbage) if err != nil { t.Fatal(err) } @@ -252,7 +254,7 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { t.Fatal(err) } - err = cold.Put(blk) + err = cold.Put(ctx, blk) if err != nil { t.Fatal(err) } @@ -288,11 +290,11 @@ func TestSplitStoreSuppressCompactionNearUpgrade(t *testing.T) { if err != nil { t.Fatal(err) } - err = ss.Put(stateRoot) + err = ss.Put(ctx, stateRoot) if err != nil { t.Fatal(err) } - err = ss.Put(sblk) + err = ss.Put(ctx, sblk) if err != nil { t.Fatal(err) } @@ -431,7 +433,7 @@ func newMockStore() *mockStore { return &mockStore{set: make(map[cid.Cid]blocks.Block)} } -func (b *mockStore) Has(cid cid.Cid) (bool, error) { +func (b *mockStore) Has(_ context.Context, cid cid.Cid) (bool, error) { b.mx.Lock() defer b.mx.Unlock() _, ok := b.set[cid] @@ -440,7 +442,7 @@ func (b *mockStore) Has(cid cid.Cid) (bool, error) { func (b *mockStore) HashOnRead(hor bool) {} -func (b *mockStore) Get(cid cid.Cid) (blocks.Block, error) { +func (b *mockStore) Get(_ context.Context, cid cid.Cid) (blocks.Block, error) { b.mx.Lock() defer b.mx.Unlock() @@ -451,8 +453,8 @@ func (b *mockStore) Get(cid cid.Cid) (blocks.Block, error) { return blk, nil } -func (b *mockStore) GetSize(cid cid.Cid) (int, error) { - blk, err := b.Get(cid) +func (b *mockStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) { + blk, err := b.Get(ctx, cid) if err != nil { return 0, err } @@ -460,15 +462,15 @@ func (b *mockStore) GetSize(cid cid.Cid) (int, error) { return len(blk.RawData()), nil } -func (b *mockStore) View(cid cid.Cid, f func([]byte) error) error { - blk, err := b.Get(cid) +func (b *mockStore) View(ctx context.Context, cid cid.Cid, f func([]byte) error) error { + blk, err := b.Get(ctx, cid) if err != nil { return err } return f(blk.RawData()) } -func (b *mockStore) Put(blk blocks.Block) error { +func (b *mockStore) Put(_ context.Context, blk blocks.Block) error { b.mx.Lock() defer b.mx.Unlock() @@ -476,7 +478,7 @@ func (b *mockStore) Put(blk blocks.Block) error { return nil } -func (b *mockStore) PutMany(blks []blocks.Block) error { +func (b *mockStore) PutMany(_ context.Context, blks []blocks.Block) error { b.mx.Lock() defer b.mx.Unlock() @@ -486,7 +488,7 @@ func (b *mockStore) PutMany(blks []blocks.Block) error { return nil } -func (b *mockStore) DeleteBlock(cid cid.Cid) error { +func (b *mockStore) DeleteBlock(_ context.Context, cid cid.Cid) error { b.mx.Lock() defer b.mx.Unlock() @@ -494,7 +496,7 @@ func (b *mockStore) DeleteBlock(cid cid.Cid) error { return nil } -func (b *mockStore) DeleteMany(cids []cid.Cid) error { +func (b *mockStore) DeleteMany(_ context.Context, cids []cid.Cid) error { b.mx.Lock() defer b.mx.Unlock() From 5e692f9071b483faeab7d9c740872841f5838c38 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:45:38 +0200 Subject: [PATCH 077/157] fix more tests --- chain/events/events_test.go | 2 +- chain/messagepool/messagepool_test.go | 20 ++++++++++---------- chain/stmgr/searchwait_test.go | 4 ++-- chain/store/checkpoint_test.go | 10 ++++++---- chain/store/index_test.go | 2 +- chain/store/store_test.go | 2 +- chain/sync_test.go | 2 +- 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/chain/events/events_test.go b/chain/events/events_test.go index 61dd25fbb..304463c04 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -87,7 +87,7 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( } // copied from the chainstore - revert, apply, err := store.ReorgOps(func(tsk types.TipSetKey) (*types.TipSet, error) { + revert, apply, err := store.ReorgOps(ctx, func(tsk types.TipSetKey) (*types.TipSet, error) { return fcs.ChainGetTipSet(ctx, tsk) }, fromTs, toTs) if err != nil { diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go index 4a2bbfe94..e768e18f1 100644 --- a/chain/messagepool/messagepool_test.go +++ b/chain/messagepool/messagepool_test.go @@ -233,7 +233,7 @@ func TestMessagePool(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -277,7 +277,7 @@ func TestCheckMessageBig(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) assert.NoError(t, err) to := mock.Address(1001) @@ -340,7 +340,7 @@ func TestMessagePoolMessagesInEachBlock(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -389,7 +389,7 @@ func TestRevertMessages(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -452,7 +452,7 @@ func TestPruningSimple(t *testing.T) { ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -496,7 +496,7 @@ func TestLoadLocal(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -539,7 +539,7 @@ func TestLoadLocal(t *testing.T) { t.Fatal(err) } - mp, err = New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err = New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -568,7 +568,7 @@ func TestClearAll(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -622,7 +622,7 @@ func TestClearNonLocal(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } @@ -683,7 +683,7 @@ func TestUpdates(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } diff --git a/chain/stmgr/searchwait_test.go b/chain/stmgr/searchwait_test.go index 1e4776ff7..b8cd7ddcf 100644 --- a/chain/stmgr/searchwait_test.go +++ b/chain/stmgr/searchwait_test.go @@ -75,7 +75,7 @@ func TestSearchForMessageReplacements(t *testing.T) { t.Fatal(err) } - err = cg.Blockstore().Put(rmb) + err = cg.Blockstore().Put(ctx, rmb) if err != nil { t.Fatal(err) } @@ -117,7 +117,7 @@ func TestSearchForMessageReplacements(t *testing.T) { t.Fatal(err) } - err = cg.Blockstore().Put(nrmb) + err = cg.Blockstore().Put(ctx, nrmb) if err != nil { t.Fatal(err) } diff --git a/chain/store/checkpoint_test.go b/chain/store/checkpoint_test.go index 81bbab6ea..cc5337f58 100644 --- a/chain/store/checkpoint_test.go +++ b/chain/store/checkpoint_test.go @@ -10,6 +10,8 @@ import ( ) func TestChainCheckpoint(t *testing.T) { + ctx := context.Background() + cg, err := gen.NewGenerator() if err != nil { t.Fatal(err) @@ -27,11 +29,11 @@ func TestChainCheckpoint(t *testing.T) { cs := cg.ChainStore() checkpoint := last - checkpointParents, err := cs.GetTipSetFromKey(checkpoint.Parents()) + checkpointParents, err := cs.GetTipSetFromKey(ctx, checkpoint.Parents()) require.NoError(t, err) // Set the head to the block before the checkpoint. - err = cs.SetHead(checkpointParents) + err = cs.SetHead(ctx, checkpointParents) require.NoError(t, err) // Verify it worked. @@ -39,7 +41,7 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(checkpointParents)) // Try to set the checkpoint in the future, it should fail. - err = cs.SetCheckpoint(checkpoint) + err = cs.SetCheckpoint(ctx, checkpoint) require.Error(t, err) // Then move the head back. @@ -70,7 +72,7 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(checkpoint)) // Remove the checkpoint. - err = cs.RemoveCheckpoint() + err = cs.RemoveCheckpoint(ctx) require.NoError(t, err) // Now switch to the other fork. diff --git a/chain/store/index_test.go b/chain/store/index_test.go index 9bc31e5a8..13054e95d 100644 --- a/chain/store/index_test.go +++ b/chain/store/index_test.go @@ -44,7 +44,7 @@ func TestIndexSeeks(t *testing.T) { if err := cs.PutTipSet(ctx, mock.TipSet(gen)); err != nil { t.Fatal(err) } - assert.NoError(t, cs.SetGenesis(gen)) + assert.NoError(t, cs.SetGenesis(ctx, gen)) // Put 113 blocks from genesis for i := 0; i < 113; i++ { diff --git a/chain/store/store_test.go b/chain/store/store_test.go index 2004b266c..f7cf32e8a 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -149,7 +149,7 @@ func TestChainExportImportFull(t *testing.T) { t.Fatal(err) } - err = cs.SetHead(last) + err = cs.SetHead(context.Background(), last) if err != nil { t.Fatal(err) } diff --git a/chain/sync_test.go b/chain/sync_test.go index 4175ff5fa..2a1798a56 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -298,7 +298,7 @@ func (tu *syncTestUtil) addSourceNode(gen int) { lastTs := blocks[len(blocks)-1].Blocks for _, lastB := range lastTs { cs := out.(*impl.FullNodeAPI).ChainAPI.Chain - require.NoError(tu.t, cs.AddToTipSetTracker(lastB.Header)) + require.NoError(tu.t, cs.AddToTipSetTracker(context.Background(), lastB.Header)) err = cs.AddBlock(tu.ctx, lastB.Header) require.NoError(tu.t, err) } From 780dfa0c7c5c94dd8c3737d0b0e71e6f45771b06 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:49:34 +0200 Subject: [PATCH 078/157] fix ReorgOps incantation in events test --- chain/events/events_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/events/events_test.go b/chain/events/events_test.go index 304463c04..5f52cbd92 100644 --- a/chain/events/events_test.go +++ b/chain/events/events_test.go @@ -87,7 +87,7 @@ func (fcs *fakeCS) ChainGetPath(ctx context.Context, from, to types.TipSetKey) ( } // copied from the chainstore - revert, apply, err := store.ReorgOps(ctx, func(tsk types.TipSetKey) (*types.TipSet, error) { + revert, apply, err := store.ReorgOps(ctx, func(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { return fcs.ChainGetTipSet(ctx, tsk) }, fromTs, toTs) if err != nil { From e6a8c278f5e676ef590afe2058e5a8ef25eb3226 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:53:31 +0200 Subject: [PATCH 079/157] fix messagepool test mock provider --- chain/messagepool/messagepool_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go index e768e18f1..da1a2eab6 100644 --- a/chain/messagepool/messagepool_test.go +++ b/chain/messagepool/messagepool_test.go @@ -190,7 +190,7 @@ func (tma *testMpoolAPI) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, return out, nil } -func (tma *testMpoolAPI) LoadTipSet(tsk types.TipSetKey) (*types.TipSet, error) { +func (tma *testMpoolAPI) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { for _, ts := range tma.tipsets { if types.CidArrsEqual(tsk.Cids(), ts.Cids()) { return ts, nil From 6ecbcebd44d8fe2878d7306977c6314de23267b5 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:57:37 +0200 Subject: [PATCH 080/157] fix messagepool repub test --- chain/messagepool/repub_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagepool/repub_test.go b/chain/messagepool/repub_test.go index fa27d68ed..de32eaa6b 100644 --- a/chain/messagepool/repub_test.go +++ b/chain/messagepool/repub_test.go @@ -25,7 +25,7 @@ func TestRepubMessages(t *testing.T) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "mptest", nil) if err != nil { t.Fatal(err) } From a0353c8627afd5b98268b6ca4919966f2737f79a Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:01:34 +0200 Subject: [PATCH 081/157] fix messagepool selection test --- chain/messagepool/selection_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index 0f8fd8ee6..bd8aa0f49 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -61,7 +61,7 @@ func makeTestMessage(w *wallet.LocalWallet, from, to address.Address, nonce uint func makeTestMpool() (*MessagePool, *testMpoolAPI) { tma := newTestMpoolAPI() ds := datastore.NewMapDatastore() - mp, err := New(tma, ds, filcns.DefaultUpgradeSchedule(), "test", nil) + mp, err := New(context.Background(), tma, ds, filcns.DefaultUpgradeSchedule(), "test", nil) if err != nil { panic(err) } From 63487e1d69ff8d6c6932ce19895e49a679cccb66 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:05:23 +0200 Subject: [PATCH 082/157] fix checkpoint test --- chain/store/checkpoint_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chain/store/checkpoint_test.go b/chain/store/checkpoint_test.go index cc5337f58..73b45f3ad 100644 --- a/chain/store/checkpoint_test.go +++ b/chain/store/checkpoint_test.go @@ -45,7 +45,7 @@ func TestChainCheckpoint(t *testing.T) { require.Error(t, err) // Then move the head back. - err = cs.SetHead(checkpoint) + err = cs.SetHead(ctx, checkpoint) require.NoError(t, err) // Verify it worked. @@ -53,7 +53,7 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(checkpoint)) // And checkpoint it. - err = cs.SetCheckpoint(checkpoint) + err = cs.SetCheckpoint(ctx, checkpoint) require.NoError(t, err) // Let the second miner miner mine a fork @@ -82,10 +82,10 @@ func TestChainCheckpoint(t *testing.T) { require.True(t, head.Equals(last)) // Setting a checkpoint on the other fork should fail. - err = cs.SetCheckpoint(checkpoint) + err = cs.SetCheckpoint(ctx, checkpoint) require.Error(t, err) // Setting a checkpoint on this fork should succeed. - err = cs.SetCheckpoint(checkpointParents) + err = cs.SetCheckpoint(ctx, checkpointParents) require.NoError(t, err) } From e8df325796d8bfc4d271fe4559f72caf4991fd4b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:23:33 +0200 Subject: [PATCH 083/157] update lotus-soup deps --- testplans/lotus-soup/go.mod | 22 +-- testplans/lotus-soup/go.sum | 378 +++++++++++++++++------------------- 2 files changed, 194 insertions(+), 206 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 9c0dc8136..6f32db2cb 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -6,13 +6,13 @@ require ( contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe github.com/davecgh/go-spew v1.1.1 - github.com/drand/drand v1.2.1 + github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-data-transfer v1.11.4 - github.com/filecoin-project/go-fil-markets v1.13.3 + github.com/filecoin-project/go-data-transfer v1.12.0 + github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 - github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b + github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/specs-actors v0.9.14 github.com/google/uuid v1.3.0 @@ -20,16 +20,16 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/influxdata/influxdb v1.9.4 // indirect github.com/ipfs/go-cid v0.1.0 - github.com/ipfs/go-datastore v0.4.6 + github.com/ipfs/go-datastore v0.5.1 github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/go-ipld-format v0.2.0 - github.com/ipfs/go-log/v2 v2.3.0 - github.com/ipfs/go-merkledag v0.4.1 + github.com/ipfs/go-log/v2 v2.4.0 + github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-unixfs v0.2.6 - github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 + github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c - github.com/libp2p/go-libp2p v0.15.0 - github.com/libp2p/go-libp2p-core v0.9.0 + github.com/libp2p/go-libp2p v0.17.0 + github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 github.com/multiformats/go-multiaddr v0.4.1 github.com/testground/sdk-go v0.2.6 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 70da04be2..10b522a18 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -37,7 +37,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -181,11 +180,11 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7y github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= +github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/tmpl v1.0.0/go.mod h1:igT620JFIi44B6awvU9IsDhR77IXWtFigTLil/RPdps= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -231,7 +230,6 @@ github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= @@ -246,6 +244,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5O github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= @@ -256,11 +255,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= @@ -319,13 +313,12 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -339,12 +332,13 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc h1:n6pVZeD0CEFqF4TUE0XI45pCe8cpmAJnv04f3BWXNdo= +github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc/go.mod h1:pizbfJhoUg8zI+od47iyqMM58XOJYsQ04h/TYermiWA= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= -github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= @@ -385,9 +379,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -404,26 +397,23 @@ github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= +github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -433,7 +423,6 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AG github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -447,22 +436,20 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= +github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= @@ -475,13 +462,12 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= -github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= +github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -492,8 +478,9 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -504,8 +491,6 @@ github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -661,6 +646,8 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -699,7 +686,6 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= @@ -777,7 +763,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= @@ -885,20 +870,16 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -908,7 +889,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -917,15 +897,15 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -933,40 +913,33 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= +github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= +github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= +github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= -github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= +github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -981,12 +954,15 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= +github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= @@ -1000,17 +976,18 @@ github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7 github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= @@ -1036,15 +1013,15 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= -github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= @@ -1052,10 +1029,8 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= -github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= @@ -1070,34 +1045,27 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= -github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= -github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= +github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= +github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1105,7 +1073,6 @@ github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= @@ -1128,8 +1095,9 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8 github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -1181,7 +1149,6 @@ github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDK github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -1198,8 +1165,9 @@ github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -1223,8 +1191,9 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= @@ -1238,21 +1207,20 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= -github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= +github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1260,17 +1228,19 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= +github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= +github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= @@ -1282,9 +1252,9 @@ github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCy github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= @@ -1314,8 +1284,12 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.13.0 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1326,8 +1300,8 @@ github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfx github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1335,8 +1309,8 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= -github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= +github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= @@ -1355,17 +1329,17 @@ github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aD github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1382,24 +1356,27 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= -github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= +github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -1424,10 +1401,11 @@ github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1437,22 +1415,26 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1464,10 +1446,10 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= -github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= +github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1484,12 +1466,14 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -1502,13 +1486,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -1523,11 +1509,11 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1545,23 +1531,23 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1587,12 +1573,12 @@ github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZb github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -1641,7 +1627,6 @@ github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1731,10 +1716,9 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1743,13 +1727,12 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= -github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1882,7 +1865,6 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -1920,7 +1902,6 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -1931,8 +1912,8 @@ github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= -github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= +github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1946,6 +1927,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -2120,7 +2103,6 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIf github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2209,13 +2191,23 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= +go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= +go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2287,7 +2279,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2327,7 +2318,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= @@ -2358,7 +2348,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2412,10 +2401,8 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2562,6 +2549,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2571,8 +2559,9 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2669,12 +2658,10 @@ golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= @@ -2755,7 +2742,6 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2867,6 +2853,8 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From 0eec00055f8a929600ade1be9063f6fa24d4dbdb Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:23:43 +0200 Subject: [PATCH 084/157] fix lotus-soup build --- testplans/lotus-soup/testkit/retrieval.go | 2 +- testplans/lotus-soup/testkit/role_miner.go | 2 +- testplans/lotus-soup/testkit/role_pubsub_tracer.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/testplans/lotus-soup/testkit/retrieval.go b/testplans/lotus-soup/testkit/retrieval.go index 3d6683d00..67e8d1654 100644 --- a/testplans/lotus-soup/testkit/retrieval.go +++ b/testplans/lotus-soup/testkit/retrieval.go @@ -78,7 +78,7 @@ func RetrieveData(t *TestEnvironment, ctx context.Context, client api.FullNode, func ExtractCarData(ctx context.Context, rdata []byte, rpath string) []byte { bserv := dstest.Bserv() - ch, err := car.LoadCar(bserv.Blockstore(), bytes.NewReader(rdata)) + ch, err := car.LoadCar(ctx, bserv.Blockstore(), bytes.NewReader(rdata)) if err != nil { panic(err) } diff --git a/testplans/lotus-soup/testkit/role_miner.go b/testplans/lotus-soup/testkit/role_miner.go index fc821cd4d..7204c71fe 100644 --- a/testplans/lotus-soup/testkit/role_miner.go +++ b/testplans/lotus-soup/testkit/role_miner.go @@ -182,7 +182,7 @@ func PrepareMiner(t *TestEnvironment) (*LotusMiner, error) { return nil, err } - err = ds.Put(datastore.NewKey("miner-address"), minerAddr.Bytes()) + err = ds.Put(context.Background(), datastore.NewKey("miner-address"), minerAddr.Bytes()) if err != nil { return nil, err } diff --git a/testplans/lotus-soup/testkit/role_pubsub_tracer.go b/testplans/lotus-soup/testkit/role_pubsub_tracer.go index 5b13e6b81..401a9824d 100644 --- a/testplans/lotus-soup/testkit/role_pubsub_tracer.go +++ b/testplans/lotus-soup/testkit/role_pubsub_tracer.go @@ -30,7 +30,7 @@ func PreparePubsubTracer(t *TestEnvironment) (*PubsubTracer, error) { tracedIP := t.NetClient.MustGetDataNetworkIP().String() tracedAddr := fmt.Sprintf("/ip4/%s/tcp/4001", tracedIP) - host, err := libp2p.New(ctx, + host, err := libp2p.New( libp2p.Identity(privk), libp2p.ListenAddrStrings(tracedAddr), ) From a3ea3ad911c09e3386f17baada79d073606d563e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 11:39:06 -0500 Subject: [PATCH 085/157] Deps: Update actors v2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e02b70215..eda9bffd8 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/specs-actors v0.9.14 - github.com/filecoin-project/specs-actors/v2 v2.3.5 + github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5 github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 diff --git a/go.sum b/go.sum index b81ed6223..d3ce72121 100644 --- a/go.sum +++ b/go.sum @@ -360,8 +360,8 @@ github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5 h1:c6x5kA+6r4lp+44ZSciQJTR+cJ6Ggx9I3m4lIUHCKfU= +github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= From e1634128c17d0ef4cfd9ff18e4bbbde2c96a9bb9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:48:17 +0200 Subject: [PATCH 086/157] fix paychmgr test --- paychmgr/paych_test.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index ab04ad7e0..124999721 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -353,16 +353,16 @@ func TestAddVoucherNextLane(t *testing.T) { _, err := s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err := s.mgr.GetChannelInfo(s.ch) + ci, err := s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 3) // Allocate a lane (should be lane 3) - lane, err := s.mgr.AllocateLane(s.ch) + lane, err := s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 3) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 4) @@ -372,7 +372,7 @@ func TestAddVoucherNextLane(t *testing.T) { _, err = s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 4) @@ -382,22 +382,24 @@ func TestAddVoucherNextLane(t *testing.T) { _, err = s.mgr.AddVoucherOutbound(ctx, s.ch, sv, nil, minDelta) require.NoError(t, err) - ci, err = s.mgr.GetChannelInfo(s.ch) + ci, err = s.mgr.GetChannelInfo(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, ci.NextLane, 8) } func TestAllocateLane(t *testing.T) { + ctx := context.Background() + // Set up a manager with a single payment channel s := testSetupMgrWithChannel(t) // First lane should be 0 - lane, err := s.mgr.AllocateLane(s.ch) + lane, err := s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 0) // Next lane should be 1 - lane, err = s.mgr.AllocateLane(s.ch) + lane, err = s.mgr.AllocateLane(ctx, s.ch) require.NoError(t, err) require.EqualValues(t, lane, 1) } @@ -446,7 +448,7 @@ func TestAllocateLaneWithExistingLaneState(t *testing.T) { require.NoError(t, err) // Allocate lane should return the next lane (lane 3) - lane, err := mgr.AllocateLane(ch) + lane, err := mgr.AllocateLane(ctx, ch) require.NoError(t, err) require.EqualValues(t, 3, lane) } From f00698aafd23394bb7436c31f90ddfd97028791c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 19:01:45 +0200 Subject: [PATCH 087/157] fix more paychmgr tests --- paychmgr/paych_test.go | 2 +- paychmgr/paychget_test.go | 48 +++++++++++++++++++-------------------- paychmgr/settle_test.go | 2 +- paychmgr/store_test.go | 23 +++++++++++-------- 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index 124999721..165c945b8 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -748,7 +748,7 @@ func testSetupMgrWithChannel(t *testing.T) *testScaffold { Target: toAcct, Direction: DirOutbound, } - err = mgr.store.putChannelInfo(ci) + err = mgr.store.putChannelInfo(context.Background(), ci) require.NoError(t, err) // Add the from signing key to the wallet diff --git a/paychmgr/paychget_test.go b/paychmgr/paychget_test.go index e6b94db57..2aacaf6c2 100644 --- a/paychmgr/paychget_test.go +++ b/paychmgr/paychget_test.go @@ -87,7 +87,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NoError(t, err) // Should have no channels yet (message sent but channel not created) - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 0) @@ -112,7 +112,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NotEqual(t, createMsgCid, addFundsMsgCid) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) @@ -121,7 +121,7 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { // channel). // PendingAmount should be amount sent in second GetPaych // (second GetPaych triggered add funds, which has not yet been confirmed) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 10, ci.Amount.Int64()) require.EqualValues(t, 5, ci.PendingAmount.Int64()) @@ -135,13 +135,13 @@ func TestPaychGetCreateChannelThenAddFunds(t *testing.T) { require.NoError(t, err) // Should still have one channel - cis, err = mgr.ListChannels() + cis, err = mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Channel amount should include last amount sent to GetPaych - ci, err = mgr.GetChannelInfo(ch) + ci, err = mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 15, ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -203,12 +203,12 @@ func TestPaychGetCreateChannelWithErrorThenCreateAgain(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt2, ci.Amount) }() @@ -259,12 +259,12 @@ func TestPaychGetRecoverAfterError(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt2, ci.Amount) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -311,12 +311,12 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { require.Error(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) - ci, err := mgr.GetChannelInfo(ch) + ci, err := mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt, ci.Amount) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -338,13 +338,13 @@ func TestPaychGetRecoverAfterAddFundsError(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err = mgr.ListChannels() + cis, err = mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Amount should include amount for successful add funds msg - ci, err = mgr.GetChannelInfo(ch) + ci, err = mgr.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt.Int64()+amt3.Int64(), ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -384,7 +384,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { require.NoError(t, err) // Should have no channels yet (message sent but channel not created) - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 0) @@ -409,7 +409,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { require.NotEqual(t, createMsgCid, addFundsMsgCid) // Should have one channel, whose address is the channel that was created - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) @@ -418,7 +418,7 @@ func TestPaychGetRestartAfterCreateChannelMsg(t *testing.T) { // channel). // PendingAmount should be amount sent in second GetPaych // (second GetPaych triggered add funds, which has not yet been confirmed) - ci, err := mgr2.GetChannelInfo(ch) + ci, err := mgr2.GetChannelInfo(ctx, ch) require.NoError(t, err) require.EqualValues(t, 10, ci.Amount.Int64()) require.EqualValues(t, 5, ci.PendingAmount.Int64()) @@ -481,13 +481,13 @@ func TestPaychGetRestartAfterAddFundsMsg(t *testing.T) { require.NoError(t, err) // Should have one channel, whose address is the channel that was created - cis, err := mgr2.ListChannels() + cis, err := mgr2.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 1) require.Equal(t, ch, cis[0]) // Amount should include amount for successful add funds msg - ci, err := mgr2.GetChannelInfo(ch) + ci, err := mgr2.GetChannelInfo(ctx, ch) require.NoError(t, err) require.Equal(t, amt.Int64()+amt2.Int64(), ci.Amount.Int64()) require.EqualValues(t, 0, ci.PendingAmount.Int64()) @@ -917,7 +917,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // No channel created yet so available funds should be all zeroes - av, err := mgr.AvailableFundsByFromTo(from, to) + av, err := mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) @@ -932,7 +932,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // Available funds should reflect create channel message sent - av, err = mgr.AvailableFundsByFromTo(from, to) + av, err = mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.EqualValues(t, 0, av.ConfirmedAmt.Int64()) @@ -961,7 +961,7 @@ func TestPaychAvailableFunds(t *testing.T) { waitForQueueSize(t, mgr, from, to, 1) // Available funds should now include queued funds - av, err = mgr.AvailableFundsByFromTo(from, to) + av, err = mgr.AvailableFundsByFromTo(ctx, from, to) require.NoError(t, err) require.Nil(t, av.Channel) require.NotNil(t, av.PendingWaitSentinel) @@ -996,7 +996,7 @@ func TestPaychAvailableFunds(t *testing.T) { // Available funds should now include the channel and also a wait sentinel // for the add funds message - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.NotNil(t, av.PendingWaitSentinel) @@ -1018,7 +1018,7 @@ func TestPaychAvailableFunds(t *testing.T) { require.NoError(t, err) // Available funds should no longer have a wait sentinel - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) @@ -1039,7 +1039,7 @@ func TestPaychAvailableFunds(t *testing.T) { _, err = mgr.AddVoucherOutbound(ctx, ch, voucher, nil, types.NewInt(0)) require.NoError(t, err) - av, err = mgr.AvailableFunds(ch) + av, err = mgr.AvailableFunds(ctx, ch) require.NoError(t, err) require.NotNil(t, av.Channel) require.Nil(t, av.PendingWaitSentinel) diff --git a/paychmgr/settle_test.go b/paychmgr/settle_test.go index f17f961e2..43a006200 100644 --- a/paychmgr/settle_test.go +++ b/paychmgr/settle_test.go @@ -63,7 +63,7 @@ func TestPaychSettle(t *testing.T) { require.NotEqual(t, ch, ch2) // There should now be two channels - cis, err := mgr.ListChannels() + cis, err := mgr.ListChannels(ctx) require.NoError(t, err) require.Len(t, cis, 2) } diff --git a/paychmgr/store_test.go b/paychmgr/store_test.go index 1ec8895fa..563b82978 100644 --- a/paychmgr/store_test.go +++ b/paychmgr/store_test.go @@ -1,6 +1,7 @@ package paychmgr import ( + "context" "testing" "github.com/filecoin-project/go-address" @@ -12,8 +13,10 @@ import ( ) func TestStore(t *testing.T) { + ctx := context.Background() + store := NewStore(ds_sync.MutexWrap(ds.NewMapDatastore())) - addrs, err := store.ListChannels() + addrs, err := store.ListChannels(ctx) require.NoError(t, err) require.Len(t, addrs, 0) @@ -38,19 +41,19 @@ func TestStore(t *testing.T) { } // Track the channel - _, err = store.TrackChannel(ci) + _, err = store.TrackChannel(ctx, ci) require.NoError(t, err) // Tracking same channel again should error - _, err = store.TrackChannel(ci) + _, err = store.TrackChannel(ctx, ci) require.Error(t, err) // Track another channel - _, err = store.TrackChannel(ci2) + _, err = store.TrackChannel(ctx, ci2) require.NoError(t, err) // List channels should include all channels - addrs, err = store.ListChannels() + addrs, err = store.ListChannels(ctx) require.NoError(t, err) require.Len(t, addrs, 2) t0100, err := address.NewIDAddress(100) @@ -61,25 +64,25 @@ func TestStore(t *testing.T) { require.Contains(t, addrs, t0200) // Request vouchers for channel - vouchers, err := store.VouchersForPaych(*ci.Channel) + vouchers, err := store.VouchersForPaych(ctx, *ci.Channel) require.NoError(t, err) require.Len(t, vouchers, 1) // Requesting voucher for non-existent channel should error - _, err = store.VouchersForPaych(tutils.NewIDAddr(t, 300)) + _, err = store.VouchersForPaych(ctx, tutils.NewIDAddr(t, 300)) require.Equal(t, err, ErrChannelNotTracked) // Allocate lane for channel - lane, err := store.AllocateLane(*ci.Channel) + lane, err := store.AllocateLane(ctx, *ci.Channel) require.NoError(t, err) require.Equal(t, lane, uint64(0)) // Allocate next lane for channel - lane, err = store.AllocateLane(*ci.Channel) + lane, err = store.AllocateLane(ctx, *ci.Channel) require.NoError(t, err) require.Equal(t, lane, uint64(1)) // Allocate next lane for non-existent channel should error - _, err = store.AllocateLane(tutils.NewIDAddr(t, 300)) + _, err = store.AllocateLane(ctx, tutils.NewIDAddr(t, 300)) require.Equal(t, err, ErrChannelNotTracked) } From aac6d88f7294b09ba108eb98b1873e75aec3955f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 12:49:18 -0500 Subject: [PATCH 088/157] Deps: Update actors v2 to v2.3.6 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eda9bffd8..427542cd1 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 github.com/filecoin-project/specs-actors v0.9.14 - github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5 + github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 diff --git a/go.sum b/go.sum index d3ce72121..ea6449fdd 100644 --- a/go.sum +++ b/go.sum @@ -360,8 +360,8 @@ github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5 h1:c6x5kA+6r4lp+44ZSciQJTR+cJ6Ggx9I3m4lIUHCKfU= -github.com/filecoin-project/specs-actors/v2 v2.3.6-0.20211214163252-3d83739fdba5/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= +github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= +github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= From 5bc4ee257f1e8fa4787094c944664fd8da4848a0 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:33:38 -0500 Subject: [PATCH 089/157] Deps: Update go-ds-badger2 to v0.1.2 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 427542cd1..1e2a29c43 100644 --- a/go.mod +++ b/go.mod @@ -73,7 +73,7 @@ require ( github.com/ipfs/go-cid v0.1.0 github.com/ipfs/go-cidutil v0.0.2 github.com/ipfs/go-datastore v0.5.1 - github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c + github.com/ipfs/go-ds-badger2 v0.1.2 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-fs-lock v0.0.6 diff --git a/go.sum b/go.sum index ea6449fdd..705c9ea93 100644 --- a/go.sum +++ b/go.sum @@ -695,8 +695,9 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= +github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= +github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= From 46d8ae47dcf9ee7105a4c3146f93e764c5075ec2 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:41:34 -0500 Subject: [PATCH 090/157] Deps: Update go-ipld-prime to v0.14.3 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1e2a29c43..7edadf16a 100644 --- a/go.mod +++ b/go.mod @@ -100,7 +100,7 @@ require ( github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 + github.com/ipld/go-ipld-prime v0.14.3 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/jonboulle/clockwork v0.2.2 // indirect github.com/kelseyhightower/envconfig v1.4.0 diff --git a/go.sum b/go.sum index 705c9ea93..6be764f4b 100644 --- a/go.sum +++ b/go.sum @@ -840,8 +840,9 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= -github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= From 3f703ff8a421facfcc4910ed0fad59de1b4e642c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:54:22 -0500 Subject: [PATCH 091/157] Deps: Update go-car/v2 to v2.1.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 7edadf16a..242dab41d 100644 --- a/go.mod +++ b/go.mod @@ -98,7 +98,7 @@ require ( github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 - github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d + github.com/ipld/go-car/v2 v2.1.1 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3 github.com/ipld/go-ipld-selector-text-lite v0.0.1 diff --git a/go.sum b/go.sum index 6be764f4b..ffaeca2f4 100644 --- a/go.sum +++ b/go.sum @@ -828,8 +828,9 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= From 69495f5b59d284fea021d99aabaec0db198e6463 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:50:18 -0500 Subject: [PATCH 092/157] Deps: Update dagstore to v0.4.4 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 242dab41d..90423049e 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 + github.com/filecoin-project/dagstore v0.4.4 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 diff --git a/go.sum b/go.sum index ffaeca2f4..509a966ee 100644 --- a/go.sum +++ b/go.sum @@ -288,8 +288,9 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= +github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= +github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= From bcd2c71031c0b1975c768603fd128cb2bfd12324 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:51:49 -0500 Subject: [PATCH 093/157] Deps: Update go-storedcounter to v0.1.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 90423049e..9c864a0d3 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 - github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 + github.com/filecoin-project/go-storedcounter v0.1.0 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 509a966ee..0d994b5c5 100644 --- a/go.sum +++ b/go.sum @@ -354,8 +354,8 @@ github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4 github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= +github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= +github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= From 8935c4386c7e79994cd3ced383f377c8c9e7a87b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:53:11 -0500 Subject: [PATCH 094/157] Deps: Update go-ipld-cbor to v0.0.6 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 9c864a0d3..f99b75ebf 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( github.com/ipfs/go-ipfs-http-client v0.0.6 github.com/ipfs/go-ipfs-routing v0.2.1 github.com/ipfs/go-ipfs-util v0.0.2 - github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 + github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 diff --git a/go.sum b/go.sum index 0d994b5c5..31b302f24 100644 --- a/go.sum +++ b/go.sum @@ -767,8 +767,9 @@ github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= From 02b00c025ad3e6c99166b308b70f34917ac78a84 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:55:55 -0500 Subject: [PATCH 095/157] Deps: Update go-fil-markets to v1.13.5 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index f99b75ebf..214cc9805 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d + github.com/filecoin-project/go-fil-markets v1.13.5 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 31b302f24..f3b6c8405 100644 --- a/go.sum +++ b/go.sum @@ -324,6 +324,8 @@ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7L github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= +github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 7fb590208c1f623d081cd8352daf552c7c7d9972 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 18:05:52 -0500 Subject: [PATCH 096/157] Deps: Update lotus-soup to point to tagged releases --- testplans/lotus-soup/go.mod | 6 +++--- testplans/lotus-soup/go.sum | 30 ++++++++++++++++++------------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 6f32db2cb..472a38357 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -9,10 +9,10 @@ require ( github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.12.0 - github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d + github.com/filecoin-project/go-fil-markets v1.13.5 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 - github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 + github.com/filecoin-project/go-storedcounter v0.1.0 github.com/filecoin-project/lotus v0.0.0-00010101000000-000000000000 github.com/filecoin-project/specs-actors v0.9.14 github.com/google/uuid v1.3.0 @@ -26,7 +26,7 @@ require ( github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-unixfs v0.2.6 - github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 + github.com/ipld/go-car v0.3.3 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c github.com/libp2p/go-libp2p v0.17.0 github.com/libp2p/go-libp2p-core v0.13.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 10b522a18..905c9d924 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -379,8 +379,9 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2 h1:dWh+o7gzavw1JUlsTqBj2/87r1Z6fbPZuZS43UiIW60= github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= +github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= +github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -412,8 +413,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= +github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -444,15 +445,15 @@ github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4 github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77 h1:3n7WS0WkJStS1rMbt/o+OvriHIlAuU8JKVG6wB2LqJQ= -github.com/filecoin-project/go-storedcounter v0.0.0-20211210031312-d066d7aa2f77/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= +github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= +github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= +github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= @@ -916,8 +917,9 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c h1:hQ/+EqbntANC9WOnloM/JCAjnMn4iEOYiJ6/H+iq84o= github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= +github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= +github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= @@ -986,8 +988,9 @@ github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8 h1:Fq+aGXgpnWNULTbgGi+c08MJYnceRXlwP75+3m8mWXU= github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= @@ -1045,10 +1048,12 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d h1:yrjb9jdAj3Lkxgp8af5G3g4Yv4PwWac3+sikmJVF0fA= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -1059,8 +1064,9 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= -github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= From bdd56d2516e1be630ab5168dbfc041de6b078a0e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 18:06:28 -0500 Subject: [PATCH 097/157] Deps: Update go-car to v0.3.3 --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 214cc9805..d0685be51 100644 --- a/go.mod +++ b/go.mod @@ -97,7 +97,7 @@ require ( github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 - github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 + github.com/ipld/go-car v0.3.3 github.com/ipld/go-car/v2 v2.1.1 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.14.3 diff --git a/go.sum b/go.sum index f3b6c8405..5ecad5936 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,6 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d h1:TkBhjnKRNKrOxnESYqMQRjMbzK/NayYg1oxejxF1cGg= -github.com/filecoin-project/go-fil-markets v1.13.3-0.20211211202606-e111ec29d24d/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= @@ -830,8 +828,9 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= From bd1bec5c930491e859a9d2e2906cb3d29bd4c003 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 14:48:19 -0800 Subject: [PATCH 098/157] remove devel grade --- snap/snapcraft.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 472621c2a..25b84058d 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -17,7 +17,6 @@ description: | https://github.com/filecoin-project/lotus -grade: devel confinement: strict parts: From 145c862ee0752c42404edc9570ea3f199ea49201 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 14:49:56 -0800 Subject: [PATCH 099/157] tmp: publish to snapcraft edge --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a4a88a090..37caa731a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1042,6 +1042,9 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - publish-snapcraft: + name: temporary-snapcraft-publish-edge + channel: edge nightly: triggers: From 2f30322a4e5ffc9546859e7d2bbd0f71fa312986 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 15:01:42 -0800 Subject: [PATCH 100/157] try stable --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 37caa731a..252e1fff8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1043,8 +1043,8 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish-snapcraft: - name: temporary-snapcraft-publish-edge - channel: edge + name: temporary-snapcraft-publish-stable + channel: stable nightly: triggers: From 62de84d5b69f50c8ad39107ada65823cd489cfef Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 15 Dec 2021 18:34:21 -0500 Subject: [PATCH 101/157] Deps: Update drand to 1.3.0 --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 45cefb7a2..ba82c7b1d 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.3 github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc + github.com/drand/drand v1.3.0 github.com/drand/kyber v1.1.7 github.com/dustin/go-humanize v1.0.0 github.com/elastic/go-sysinfo v1.7.0 diff --git a/go.sum b/go.sum index e18478aab..6fe45152a 100644 --- a/go.sum +++ b/go.sum @@ -243,8 +243,8 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc h1:n6pVZeD0CEFqF4TUE0XI45pCe8cpmAJnv04f3BWXNdo= -github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc/go.mod h1:pizbfJhoUg8zI+od47iyqMM58XOJYsQ04h/TYermiWA= +github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM= +github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= @@ -696,7 +696,6 @@ github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBR github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD65qQCjB35uNOHaaha+tudGVWegJ7dFuFKY+3iJKjk= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= From 65ecca290488dbfd50f2abc55c7ad343bc6ebca0 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Wed, 15 Dec 2021 15:54:40 -0800 Subject: [PATCH 102/157] restore .circleci --- .circleci/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 252e1fff8..a4a88a090 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1042,9 +1042,6 @@ workflows: tags: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish-snapcraft: - name: temporary-snapcraft-publish-stable - channel: stable nightly: triggers: From fac769ff17f03731520476bd8a0db49a9a3a4081 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 13 Dec 2021 04:18:31 -0500 Subject: [PATCH 103/157] i forced pushed and brought a bug that was fixed back so im fixing it back --- cmd/lotus-shed/terminations.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index c28d595b4..a209e459f 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -5,12 +5,15 @@ import ( "context" "fmt" "io" + "strconv" + "github.com/filecoin-project/lotus/chain/actors/builtin" + + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/actors/builtin/market" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/consensus/filcns" @@ -26,6 +29,7 @@ import ( var terminationsCmd = &cli.Command{ Name: "terminations", Description: "Lists terminated deals from the past 2 days", + ArgsUsage: "[block to look back from] [lookback period (epochs)]", Flags: []cli.Flag{ &cli.StringFlag{ Name: "repo", @@ -35,8 +39,8 @@ var terminationsCmd = &cli.Command{ Action: func(cctx *cli.Context) error { ctx := context.TODO() - if !cctx.Args().Present() { - return fmt.Errorf("must pass block cid") + if cctx.NArg() != 2 { + return fmt.Errorf("must pass block cid && lookback period") } blkCid, err := cid.Decode(cctx.Args().First()) @@ -85,12 +89,14 @@ var terminationsCmd = &cli.Command{ return err } - minerCode, err := miner.GetActorCodeID(actors.Version6) + lbp, err := strconv.Atoi(cctx.Args().Get(1)) if err != nil { - return err + return fmt.Errorf("failed to parse input: %w", err) } - for i := 0; i < 2880*2; i++ { + cutoff := blk.Height - abi.ChainEpoch(lbp) + + for blk.Height > cutoff { pts, err := cs.LoadTipSet(types.NewTipSetKey(blk.Parents...)) if err != nil { return err @@ -119,7 +125,7 @@ var terminationsCmd = &cli.Command{ return err } - if minerAct.Code != minerCode { + if !builtin.IsStorageMinerActor(minerAct.Code) { continue } @@ -158,10 +164,12 @@ var terminationsCmd = &cli.Command{ for _, sector := range sectors { for _, deal := range sector.DealIDs { prop, find, err := proposals.Get(deal) - if err != nil || !find { + if err != nil { return err } - fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) + if find { + fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) + } } } } From 0f0a70e2516ea983ca7c1e095e5c1977867fed75 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:00:58 -0500 Subject: [PATCH 104/157] Update .github/pull_request_template.md --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6984f6ffd..d4989af72 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,6 +11,7 @@ ## Checklist Before you mark the PR ready for review, please make sure that: +- [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: <#issue number> : ` - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` - `PR type`: _fix_, _feat_, _BREAKING CHANGE_, _build_, _chore_, _ci_, _docs_, _perf_, _refactor_, _revert_, _style_, _test_ From 52fbee6749787741d8f61a45b18061a6aed209f4 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:01:03 -0500 Subject: [PATCH 105/157] Update .github/pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d4989af72..76d38d292 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,7 +14,7 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: <#issue number> : ` - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` - - `PR type`: _fix_, _feat_, _BREAKING CHANGE_, _build_, _chore_, _ci_, _docs_, _perf_, _refactor_, _revert_, _style_, _test_ + - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ - [ ] This PR has tests for new functionality or change in behaviour - [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) From 9e7d9affbe0451d01a58bb6a36ec06d4b7b0466b Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Thu, 28 Oct 2021 22:39:57 +1100 Subject: [PATCH 106/157] feat(graphsync): allow setting of per-peer incoming requests for miners --- documentation/en/default-lotus-miner-config.toml | 11 +++++++++++ itests/deals_concurrent_test.go | 2 +- node/builder_miner.go | 2 +- node/config/def.go | 5 +++-- node/config/doc_gen.go | 11 +++++++++++ node/config/types.go | 7 +++++++ node/modules/storageminer.go | 8 ++++---- tools/packer/repo/config.toml | 1 + 8 files changed, 39 insertions(+), 8 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index d402f65ed..b034698a2 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -207,6 +207,17 @@ # env var: LOTUS_DEALMAKING_SIMULTANEOUSTRANSFERSFORSTORAGE #SimultaneousTransfersForStorage = 20 + # The maximum number of simultaneous data transfers from any single client + # for storage deals. + # Unset by default (0), and values higher than SimultaneousTransfersForStorage + # will have no effect; i.e. the total number of simultaneous data transfers + # across all storage clients is bound by SimultaneousTransfersForStorage + # regardless of this number. + # + # type: uint64 + # env var: LOTUS_DEALMAKING_SIMULTANEOUSTRANSFERSFORSTORAGEPERCLIENT + #SimultaneousTransfersForStoragePerClient = 0 + # The maximum number of parallel online data transfers for retrieval deals # # type: uint64 diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index c0458e8d1..49a8bb008 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -139,7 +139,7 @@ func TestSimultanenousTransferLimit(t *testing.T) { ) runTest := func(t *testing.T) { client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ConstructorOpts( - node.ApplyIf(node.IsType(repo.StorageMiner), node.Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(graphsyncThrottle, graphsyncThrottle))), + node.ApplyIf(node.IsType(repo.StorageMiner), node.Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(graphsyncThrottle, 0, graphsyncThrottle))), node.Override(new(dtypes.Graphsync), modules.Graphsync(graphsyncThrottle, graphsyncThrottle)), )) ens.InterconnectAll().BeginMining(250 * time.Millisecond) diff --git a/node/builder_miner.go b/node/builder_miner.go index 74b0c5558..c8a04255f 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -136,7 +136,7 @@ func ConfigStorageMiner(c interface{}) Option { If(cfg.Subsystems.EnableMarkets, // Markets Override(new(dtypes.StagingBlockstore), modules.StagingBlockstore), - Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(cfg.Dealmaking.SimultaneousTransfersForStorage, cfg.Dealmaking.SimultaneousTransfersForRetrieval)), + Override(new(dtypes.StagingGraphsync), modules.StagingGraphsync(cfg.Dealmaking.SimultaneousTransfersForStorage, cfg.Dealmaking.SimultaneousTransfersForStoragePerClient, cfg.Dealmaking.SimultaneousTransfersForRetrieval)), Override(new(dtypes.ProviderPieceStore), modules.NewProviderPieceStore), Override(new(*sectorblocks.SectorBlocks), sectorblocks.NewSectorBlocks), diff --git a/node/config/def.go b/node/config/def.go index 735107e29..4a525e697 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -160,8 +160,9 @@ func DefaultStorageMiner() *StorageMiner { MaxDealsPerPublishMsg: 8, MaxProviderCollateralMultiplier: 2, - SimultaneousTransfersForStorage: DefaultSimultaneousTransfers, - SimultaneousTransfersForRetrieval: DefaultSimultaneousTransfers, + SimultaneousTransfersForStorage: DefaultSimultaneousTransfers, + SimultaneousTransfersForStoragePerClient: 0, + SimultaneousTransfersForRetrieval: DefaultSimultaneousTransfers, StartEpochSealingBuffer: 480, // 480 epochs buffer == 4 hours from adding deal to sector to sector being sealed diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 296501edc..eded0b1fe 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -272,6 +272,17 @@ passed to the sealing node by the markets service. 0 is unlimited.`, Comment: `The maximum number of parallel online data transfers for storage deals`, }, + { + Name: "SimultaneousTransfersForStoragePerClient", + Type: "uint64", + + Comment: `The maximum number of simultaneous data transfers from any single client +for storage deals. +Unset by default (0), and values higher than SimultaneousTransfersForStorage +will have no effect; i.e. the total number of simultaneous data transfers +across all storage clients is bound by SimultaneousTransfersForStorage +regardless of this number.`, + }, { Name: "SimultaneousTransfersForRetrieval", Type: "uint64", diff --git a/node/config/types.go b/node/config/types.go index 1be40029e..2ae2d8eee 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -131,6 +131,13 @@ type DealmakingConfig struct { MaxStagingDealsBytes int64 // The maximum number of parallel online data transfers for storage deals SimultaneousTransfersForStorage uint64 + // The maximum number of simultaneous data transfers from any single client + // for storage deals. + // Unset by default (0), and values higher than SimultaneousTransfersForStorage + // will have no effect; i.e. the total number of simultaneous data transfers + // across all storage clients is bound by SimultaneousTransfersForStorage + // regardless of this number. + SimultaneousTransfersForStoragePerClient uint64 // The maximum number of parallel online data transfers for retrieval deals SimultaneousTransfersForRetrieval uint64 // Minimum start epoch buffer to give time for sealing of sector with deal. diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index f4d00606f..a505635be 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -39,7 +39,6 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" graphsync "github.com/ipfs/go-graphsync/impl" - graphsyncimpl "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" "github.com/libp2p/go-libp2p-core/host" @@ -396,7 +395,7 @@ func StagingBlockstore(lc fx.Lifecycle, mctx helpers.MetricsCtx, r repo.LockedRe // StagingGraphsync creates a graphsync instance which reads and writes blocks // to the StagingBlockstore -func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForRetrieval uint64) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { +func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForStoragePerPeer uint64, parallelTransfersForRetrieval uint64) func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, ibs dtypes.StagingBlockstore, h host.Host) dtypes.StagingGraphsync { graphsyncNetwork := gsnet.NewFromLibp2pHost(h) lsys := storeutil.LinkSystemForBlockstore(ibs) @@ -405,9 +404,10 @@ func StagingGraphsync(parallelTransfersForStorage uint64, parallelTransfersForRe lsys, graphsync.RejectAllRequestsByDefault(), graphsync.MaxInProgressIncomingRequests(parallelTransfersForRetrieval), + graphsync.MaxInProgressIncomingRequestsPerPeer(parallelTransfersForStoragePerPeer), graphsync.MaxInProgressOutgoingRequests(parallelTransfersForStorage), - graphsyncimpl.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), - graphsyncimpl.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) + graphsync.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), + graphsync.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) graphsyncStats(mctx, lc, gs) diff --git a/tools/packer/repo/config.toml b/tools/packer/repo/config.toml index 900dad218..380d5a28f 100644 --- a/tools/packer/repo/config.toml +++ b/tools/packer/repo/config.toml @@ -21,6 +21,7 @@ ListenAddresses = ["/ip4/0.0.0.0/tcp/5678", "/ip6/::/tcp/5678"] # IpfsMAddr = "" # IpfsUseForRetrieval = false # SimultaneousTransfersForStorage = 20 +# SimultaneousTransfersForStoragePerClient = 0 # SimultaneousTransfersForRetrieval = 20 # [Metrics] From 1f04cc1f23b1a86d79ee1a9afa59180ac1699ab5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 16 Dec 2021 23:59:26 -0500 Subject: [PATCH 107/157] VM: Circ supply should be constant per epoch --- chain/gen/genesis/genesis.go | 6 +++++- chain/vm/vm.go | 19 ++++++++++++++----- conformance/driver.go | 8 ++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 29f03e2af..45387df50 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -479,6 +479,10 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca verifNeeds := make(map[address.Address]abi.PaddedPieceSize) var sum abi.PaddedPieceSize + csc := func(context.Context, abi.ChainEpoch, *state.StateTree) (abi.TokenAmount, error) { + return big.Zero(), nil + } + vmopt := vm.VMOpts{ StateBase: stateroot, Epoch: 0, @@ -486,7 +490,7 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca Bstore: cs.StateBlockstore(), Actors: filcns.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), - CircSupplyCalc: nil, + CircSupplyCalc: csc, NtwkVersion: func(_ context.Context, _ abi.ChainEpoch) network.Version { return nv }, diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 16ad5e2a4..d569dbbbf 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -202,9 +202,7 @@ type ( ) type VM struct { - cstate *state.StateTree - // TODO: Is base actually used? Can we delete it? - base cid.Cid + cstate *state.StateTree cst *cbor.BasicIpldStore buf *blockstore.BufferedBlockstore blockHeight abi.ChainEpoch @@ -214,6 +212,7 @@ type VM struct { ntwkVersion NtwkVersionGetter baseFee abi.TokenAmount lbStateGet LookbackStateGetter + baseCircSupply abi.TokenAmount Syscalls SyscallBuilder } @@ -239,9 +238,13 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { return nil, err } + baseCirc, err := opts.CircSupplyCalc(ctx, opts.Epoch, state) + if err != nil { + return nil, err + } + return &VM{ cstate: state, - base: opts.StateBase, cst: cst, buf: buf, blockHeight: opts.Epoch, @@ -251,6 +254,7 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { ntwkVersion: opts.NtwkVersion, Syscalls: opts.Syscalls, baseFee: opts.BaseFee, + baseCircSupply: baseCirc, lbStateGet: opts.LookbackState, }, nil } @@ -859,7 +863,12 @@ func (vm *VM) GetNtwkVersion(ctx context.Context, ce abi.ChainEpoch) network.Ver } func (vm *VM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error) { - return vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) + // Before v15, this was recalculated on each invocation as the state tree was mutated + if vm.GetNtwkVersion(ctx, vm.blockHeight) <= network.Version14 { + return vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) + } + + return vm.baseCircSupply, nil } func (vm *VM) incrementNonce(addr address.Address) error { diff --git a/conformance/driver.go b/conformance/driver.go index 8669089da..c6a20e359 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -153,6 +153,14 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params results: []*vm.ApplyRet{}, } + sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (*vm.VM, error) { + vmopt.CircSupplyCalc = func(context.Context, abi.ChainEpoch, *state.StateTree) (abi.TokenAmount, error) { + return big.Zero(), nil + } + + return vm.NewVM(ctx, vmopt) + }) + postcid, receiptsroot, err := tse.ApplyBlocks(context.Background(), sm, params.ParentEpoch, From dd327f0b22aea1b6265ad2ad8c24f64719a54193 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 11:42:09 +0200 Subject: [PATCH 108/157] plumb more contexts --- blockstore/badger/blockstore_test.go | 2 +- blockstore/badger/blockstore_test_suite.go | 2 +- chain/consensus/filcns/compute_state.go | 2 +- chain/consensus/filcns/filecoin.go | 6 +-- chain/consensus/filcns/mine.go | 4 +- chain/exchange/server.go | 10 ++-- chain/messagepool/messagepool.go | 16 +++---- chain/messagepool/provider.go | 18 ++++---- chain/stmgr/searchwait.go | 8 ++-- chain/store/basefee.go | 2 +- chain/store/messages.go | 53 +++++++++++----------- chain/store/snapshot.go | 3 +- chain/store/store.go | 4 +- chain/sync.go | 14 +++--- cmd/lotus-bench/import.go | 20 ++++---- cmd/lotus-miner/init.go | 10 ++-- cmd/lotus-miner/init_restore.go | 4 +- cmd/lotus-sim/simulation/messages.go | 2 +- cmd/lotus-sim/simulation/simulation.go | 12 ++--- cmd/lotus/backup.go | 7 ++- cmd/lotus/daemon.go | 8 ++-- conformance/runner.go | 4 +- node/impl/full/chain.go | 12 ++--- node/impl/full/gas.go | 6 +-- node/impl/full/mpool.go | 4 +- node/impl/full/state.go | 4 +- node/impl/full/sync.go | 6 +-- node/modules/chain.go | 9 ++-- node/modules/client.go | 7 +-- node/modules/genesis.go | 20 ++++---- node/modules/services.go | 4 +- node/modules/storageminer.go | 6 +-- 32 files changed, 146 insertions(+), 143 deletions(-) diff --git a/blockstore/badger/blockstore_test.go b/blockstore/badger/blockstore_test.go index db87262d4..4619d4ec3 100644 --- a/blockstore/badger/blockstore_test.go +++ b/blockstore/badger/blockstore_test.go @@ -99,7 +99,7 @@ func openBlockstore(optsSupplier func(path string) Options) func(tb testing.TB, } func testMove(t *testing.T, optsF func(string) Options) { - ctx := context.TODO() + ctx := context.Background() basePath, err := ioutil.TempDir("", "") if err != nil { t.Fatal(err) diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index b155f479a..de8485a0e 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -44,7 +44,7 @@ func (s *Suite) RunTests(t *testing.T, prefix string) { } func (s *Suite) TestGetWhenKeyNotPresent(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 1bc5763b2..bf2bd9955 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -299,7 +299,7 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, sm *stmgr.StateManag r := rand.NewStateRand(sm.ChainStore(), ts.Cids(), sm.Beacon()) - blkmsgs, err := sm.ChainStore().BlockMsgsForTipset(ts) + blkmsgs, err := sm.ChainStore().BlockMsgsForTipset(ctx, ts) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("getting block messages for tipset: %w", err) } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 7f2eaa273..328fc8ec1 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -171,7 +171,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) } if stateroot != h.ParentStateRoot { - msgs, err := filec.store.MessagesForTipset(baseTs) + msgs, err := filec.store.MessagesForTipset(ctx, baseTs) if err != nil { log.Error("failed to load messages for tipset during tipset state mismatch error: ", err) } else { @@ -519,7 +519,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl return xerrors.Errorf("block had invalid bls message at index %d: %w", i, err) } - c, err := store.PutMessage(tmpbs, m) + c, err := store.PutMessage(ctx, tmpbs, m) if err != nil { return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) } @@ -553,7 +553,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl return xerrors.Errorf("secpk message %s has invalid signature: %w", m.Cid(), err) } - c, err := store.PutMessage(tmpbs, m) + c, err := store.PutMessage(ctx, tmpbs, m) if err != nil { return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) } diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index bb4931297..133f810a8 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -59,14 +59,14 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. blsSigs = append(blsSigs, msg.Signature) blsMessages = append(blsMessages, &msg.Message) - c, err := filec.sm.ChainStore().PutMessage(&msg.Message) + c, err := filec.sm.ChainStore().PutMessage(ctx, &msg.Message) if err != nil { return nil, err } blsMsgCids = append(blsMsgCids, c) } else { - c, err := filec.sm.ChainStore().PutMessage(msg) + c, err := filec.sm.ChainStore().PutMessage(ctx, msg) if err != nil { return nil, err } diff --git a/chain/exchange/server.go b/chain/exchange/server.go index b4519ba70..37d49d7bc 100644 --- a/chain/exchange/server.go +++ b/chain/exchange/server.go @@ -172,7 +172,7 @@ func collectChainSegment(ctx context.Context, cs *store.ChainStore, req *validat } if req.options.IncludeMessages { - bmsgs, bmincl, smsgs, smincl, err := gatherMessages(cs, ts) + bmsgs, bmincl, smsgs, smincl, err := gatherMessages(ctx, cs, ts) if err != nil { return nil, xerrors.Errorf("gather messages failed: %w", err) } @@ -197,14 +197,14 @@ func collectChainSegment(ctx context.Context, cs *store.ChainStore, req *validat } } -func gatherMessages(cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { +func gatherMessages(ctx context.Context, cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [][]uint64, []*types.SignedMessage, [][]uint64, error) { blsmsgmap := make(map[cid.Cid]uint64) secpkmsgmap := make(map[cid.Cid]uint64) var secpkincl, blsincl [][]uint64 var blscids, secpkcids []cid.Cid for _, block := range ts.Blocks() { - bc, sc, err := cs.ReadMsgMetaCids(block.Messages) + bc, sc, err := cs.ReadMsgMetaCids(ctx, block.Messages) if err != nil { return nil, nil, nil, nil, err } @@ -237,12 +237,12 @@ func gatherMessages(cs *store.ChainStore, ts *types.TipSet) ([]*types.Message, [ secpkincl = append(secpkincl, smi) } - blsmsgs, err := cs.LoadMessagesFromCids(blscids) + blsmsgs, err := cs.LoadMessagesFromCids(ctx, blscids) if err != nil { return nil, nil, nil, nil, err } - secpkmsgs, err := cs.LoadSignedMessagesFromCids(secpkcids) + secpkmsgs, err := cs.LoadSignedMessagesFromCids(ctx, secpkcids) if err != nil { return nil, nil, nil, nil, err } diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index c8b4931f0..43d014502 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -909,12 +909,12 @@ func (mp *MessagePool) addLocked(ctx context.Context, m *types.SignedMessage, st mp.blsSigCache.Add(m.Cid(), m.Signature) } - if _, err := mp.api.PutMessage(m); err != nil { + if _, err := mp.api.PutMessage(ctx, m); err != nil { log.Warnf("mpooladd cs.PutMessage failed: %s", err) return err } - if _, err := mp.api.PutMessage(&m.Message); err != nil { + if _, err := mp.api.PutMessage(ctx, &m.Message); err != nil { log.Warnf("mpooladd cs.PutMessage failed: %s", err) return err } @@ -1216,7 +1216,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a mp.curTs = pts - msgs, err := mp.MessagesForBlocks(ts.Blocks()) + msgs, err := mp.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { log.Errorf("error retrieving messages for reverted block: %s", err) merr = multierror.Append(merr, err) @@ -1232,7 +1232,7 @@ func (mp *MessagePool) HeadChange(ctx context.Context, revert []*types.TipSet, a mp.curTs = ts for _, b := range ts.Blocks() { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { xerr := xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %w", b.Cid(), b.Height, b.Messages, err) log.Errorf("error retrieving messages for block: %s", xerr) @@ -1368,7 +1368,7 @@ func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to var merr error for _, ts := range revert { - msgs, err := mp.MessagesForBlocks(ts.Blocks()) + msgs, err := mp.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { log.Errorf("error retrieving messages for reverted block: %s", err) merr = multierror.Append(merr, err) @@ -1382,7 +1382,7 @@ func (mp *MessagePool) runHeadChange(ctx context.Context, from *types.TipSet, to for _, ts := range apply { for _, b := range ts.Blocks() { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { xerr := xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %w", b.Cid(), b.Height, b.Messages, err) log.Errorf("error retrieving messages for block: %s", xerr) @@ -1407,11 +1407,11 @@ type statBucket struct { msgs map[uint64]*types.SignedMessage } -func (mp *MessagePool) MessagesForBlocks(blks []*types.BlockHeader) ([]*types.SignedMessage, error) { +func (mp *MessagePool) MessagesForBlocks(ctx context.Context, blks []*types.BlockHeader) ([]*types.SignedMessage, error) { out := make([]*types.SignedMessage, 0) for _, b := range blks { - bmsgs, smsgs, err := mp.api.MessagesForBlock(b) + bmsgs, smsgs, err := mp.api.MessagesForBlock(ctx, b) if err != nil { return nil, xerrors.Errorf("failed to get messages for apply block %s(height %d) (msgroot = %s): %w", b.Cid(), b.Height, b.Messages, err) } diff --git a/chain/messagepool/provider.go b/chain/messagepool/provider.go index 5a3a2ac22..9dcff2b33 100644 --- a/chain/messagepool/provider.go +++ b/chain/messagepool/provider.go @@ -23,12 +23,12 @@ var ( type Provider interface { SubscribeHeadChanges(func(rev, app []*types.TipSet) error) *types.TipSet - PutMessage(m types.ChainMsg) (cid.Cid, error) + PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) PubSubPublish(string, []byte) error GetActorAfter(address.Address, *types.TipSet) (*types.Actor, error) StateAccountKeyAtFinality(context.Context, address.Address, *types.TipSet) (address.Address, error) - MessagesForBlock(*types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) - MessagesForTipset(*types.TipSet) ([]types.ChainMsg, error) + MessagesForBlock(context.Context, *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) + MessagesForTipset(context.Context, *types.TipSet) ([]types.ChainMsg, error) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) ChainComputeBaseFee(ctx context.Context, ts *types.TipSet) (types.BigInt, error) IsLite() bool @@ -66,8 +66,8 @@ func (mpp *mpoolProvider) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) return mpp.sm.ChainStore().GetHeaviestTipSet() } -func (mpp *mpoolProvider) PutMessage(m types.ChainMsg) (cid.Cid, error) { - return mpp.sm.ChainStore().PutMessage(m) +func (mpp *mpoolProvider) PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) { + return mpp.sm.ChainStore().PutMessage(ctx, m) } func (mpp *mpoolProvider) PubSubPublish(k string, v []byte) error { @@ -103,12 +103,12 @@ func (mpp *mpoolProvider) StateAccountKeyAtFinality(ctx context.Context, addr ad return mpp.sm.ResolveToKeyAddressAtFinality(ctx, addr, ts) } -func (mpp *mpoolProvider) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { - return mpp.sm.ChainStore().MessagesForBlock(h) +func (mpp *mpoolProvider) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { + return mpp.sm.ChainStore().MessagesForBlock(ctx, h) } -func (mpp *mpoolProvider) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { - return mpp.sm.ChainStore().MessagesForTipset(ts) +func (mpp *mpoolProvider) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { + return mpp.sm.ChainStore().MessagesForTipset(ctx, ts) } func (mpp *mpoolProvider) LoadTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { diff --git a/chain/stmgr/searchwait.go b/chain/stmgr/searchwait.go index 7d743dd0f..7e6de91d4 100644 --- a/chain/stmgr/searchwait.go +++ b/chain/stmgr/searchwait.go @@ -20,7 +20,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid ctx, cancel := context.WithCancel(ctx) defer cancel() - msg, err := sm.cs.GetCMessage(mcid) + msg, err := sm.cs.GetCMessage(ctx, mcid) if err != nil { return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err) } @@ -130,7 +130,7 @@ func (sm *StateManager) WaitForMessage(ctx context.Context, mcid cid.Cid, confid } func (sm *StateManager) SearchForMessage(ctx context.Context, head *types.TipSet, mcid cid.Cid, lookbackLimit abi.ChainEpoch, allowReplaced bool) (*types.TipSet, *types.MessageReceipt, cid.Cid, error) { - msg, err := sm.cs.GetCMessage(mcid) + msg, err := sm.cs.GetCMessage(ctx, mcid) if err != nil { return nil, nil, cid.Undef, fmt.Errorf("failed to load message: %w", err) } @@ -240,7 +240,7 @@ func (sm *StateManager) tipsetExecutedMessage(ctx context.Context, ts *types.Tip return nil, cid.Undef, err } - cm, err := sm.cs.MessagesForTipset(pts) + cm, err := sm.cs.MessagesForTipset(ctx, pts) if err != nil { return nil, cid.Undef, err } @@ -267,7 +267,7 @@ func (sm *StateManager) tipsetExecutedMessage(ctx context.Context, ts *types.Tip } } - pr, err := sm.cs.GetParentReceipt(ts.Blocks()[0], i) + pr, err := sm.cs.GetParentReceipt(ctx, ts.Blocks()[0], i) if err != nil { return nil, cid.Undef, err } diff --git a/chain/store/basefee.go b/chain/store/basefee.go index 33367abcc..1d6b0760e 100644 --- a/chain/store/basefee.go +++ b/chain/store/basefee.go @@ -58,7 +58,7 @@ func (cs *ChainStore) ComputeBaseFee(ctx context.Context, ts *types.TipSet) (abi seen := make(map[cid.Cid]struct{}) for _, b := range ts.Blocks() { - msg1, msg2, err := cs.MessagesForBlock(b) + msg1, msg2, err := cs.MessagesForBlock(ctx, b) if err != nil { return zero, xerrors.Errorf("error getting messages for: %s: %w", b.Cid(), err) } diff --git a/chain/store/messages.go b/chain/store/messages.go index 6fc4d76b9..4dd3bfc1d 100644 --- a/chain/store/messages.go +++ b/chain/store/messages.go @@ -23,25 +23,25 @@ type storable interface { ToStorageBlock() (block.Block, error) } -func PutMessage(bs bstore.Blockstore, m storable) (cid.Cid, error) { +func PutMessage(ctx context.Context, bs bstore.Blockstore, m storable) (cid.Cid, error) { b, err := m.ToStorageBlock() if err != nil { return cid.Undef, err } - if err := bs.Put(context.TODO(), b); err != nil { + if err := bs.Put(ctx, b); err != nil { return cid.Undef, err } return b.Cid(), nil } -func (cs *ChainStore) PutMessage(m storable) (cid.Cid, error) { - return PutMessage(cs.chainBlockstore, m) +func (cs *ChainStore) PutMessage(ctx context.Context, m storable) (cid.Cid, error) { + return PutMessage(ctx, cs.chainBlockstore, m) } -func (cs *ChainStore) GetCMessage(c cid.Cid) (types.ChainMsg, error) { - m, err := cs.GetMessage(c) +func (cs *ChainStore) GetCMessage(ctx context.Context, c cid.Cid) (types.ChainMsg, error) { + m, err := cs.GetMessage(ctx, c) if err == nil { return m, nil } @@ -49,21 +49,21 @@ func (cs *ChainStore) GetCMessage(c cid.Cid) (types.ChainMsg, error) { log.Warnf("GetCMessage: unexpected error getting unsigned message: %s", err) } - return cs.GetSignedMessage(c) + return cs.GetSignedMessage(ctx, c) } -func (cs *ChainStore) GetMessage(c cid.Cid) (*types.Message, error) { +func (cs *ChainStore) GetMessage(ctx context.Context, c cid.Cid) (*types.Message, error) { var msg *types.Message - err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(ctx, c, func(b []byte) (err error) { msg, err = types.DecodeMessage(b) return err }) return msg, err } -func (cs *ChainStore) GetSignedMessage(c cid.Cid) (*types.SignedMessage, error) { +func (cs *ChainStore) GetSignedMessage(ctx context.Context, c cid.Cid) (*types.SignedMessage, error) { var msg *types.SignedMessage - err := cs.chainLocalBlockstore.View(context.TODO(), c, func(b []byte) (err error) { + err := cs.chainLocalBlockstore.View(ctx, c, func(b []byte) (err error) { msg, err = types.DecodeSignedMessage(b) return err }) @@ -103,7 +103,7 @@ type BlockMessages struct { SecpkMessages []types.ChainMsg } -func (cs *ChainStore) BlockMsgsForTipset(ts *types.TipSet) ([]BlockMessages, error) { +func (cs *ChainStore) BlockMsgsForTipset(ctx context.Context, ts *types.TipSet) ([]BlockMessages, error) { // returned BlockMessages match block order in tipset applied := make(map[address.Address]uint64) @@ -142,7 +142,7 @@ func (cs *ChainStore) BlockMsgsForTipset(ts *types.TipSet) ([]BlockMessages, err var out []BlockMessages for _, b := range ts.Blocks() { - bms, sms, err := cs.MessagesForBlock(b) + bms, sms, err := cs.MessagesForBlock(ctx, b) if err != nil { return nil, xerrors.Errorf("failed to get messages for block: %w", err) } @@ -181,8 +181,8 @@ func (cs *ChainStore) BlockMsgsForTipset(ts *types.TipSet) ([]BlockMessages, err return out, nil } -func (cs *ChainStore) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { - bmsgs, err := cs.BlockMsgsForTipset(ts) +func (cs *ChainStore) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { + bmsgs, err := cs.BlockMsgsForTipset(ctx, ts) if err != nil { return nil, err } @@ -206,7 +206,7 @@ type mmCids struct { secpk []cid.Cid } -func (cs *ChainStore) ReadMsgMetaCids(mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) { +func (cs *ChainStore) ReadMsgMetaCids(ctx context.Context, mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) { o, ok := cs.mmCache.Get(mmc) if ok { mmcids := o.(*mmCids) @@ -215,7 +215,7 @@ func (cs *ChainStore) ReadMsgMetaCids(mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) cst := cbor.NewCborStore(cs.chainLocalBlockstore) var msgmeta types.MsgMeta - if err := cst.Get(context.TODO(), mmc, &msgmeta); err != nil { + if err := cst.Get(ctx, mmc, &msgmeta); err != nil { return nil, nil, xerrors.Errorf("failed to load msgmeta (%s): %w", mmc, err) } @@ -237,18 +237,18 @@ func (cs *ChainStore) ReadMsgMetaCids(mmc cid.Cid) ([]cid.Cid, []cid.Cid, error) return blscids, secpkcids, nil } -func (cs *ChainStore) MessagesForBlock(b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { - blscids, secpkcids, err := cs.ReadMsgMetaCids(b.Messages) +func (cs *ChainStore) MessagesForBlock(ctx context.Context, b *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { + blscids, secpkcids, err := cs.ReadMsgMetaCids(ctx, b.Messages) if err != nil { return nil, nil, err } - blsmsgs, err := cs.LoadMessagesFromCids(blscids) + blsmsgs, err := cs.LoadMessagesFromCids(ctx, blscids) if err != nil { return nil, nil, xerrors.Errorf("loading bls messages for block: %w", err) } - secpkmsgs, err := cs.LoadSignedMessagesFromCids(secpkcids) + secpkmsgs, err := cs.LoadSignedMessagesFromCids(ctx, secpkcids) if err != nil { return nil, nil, xerrors.Errorf("loading secpk messages for block: %w", err) } @@ -256,8 +256,7 @@ func (cs *ChainStore) MessagesForBlock(b *types.BlockHeader) ([]*types.Message, return blsmsgs, secpkmsgs, nil } -func (cs *ChainStore) GetParentReceipt(b *types.BlockHeader, i int) (*types.MessageReceipt, error) { - ctx := context.TODO() +func (cs *ChainStore) GetParentReceipt(ctx context.Context, b *types.BlockHeader, i int) (*types.MessageReceipt, error) { // block headers use adt0, for now. a, err := blockadt.AsArray(cs.ActorStore(ctx), b.ParentMessageReceipts) if err != nil { @@ -274,10 +273,10 @@ func (cs *ChainStore) GetParentReceipt(b *types.BlockHeader, i int) (*types.Mess return &r, nil } -func (cs *ChainStore) LoadMessagesFromCids(cids []cid.Cid) ([]*types.Message, error) { +func (cs *ChainStore) LoadMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.Message, error) { msgs := make([]*types.Message, 0, len(cids)) for i, c := range cids { - m, err := cs.GetMessage(c) + m, err := cs.GetMessage(ctx, c) if err != nil { return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", c, i, err) } @@ -288,10 +287,10 @@ func (cs *ChainStore) LoadMessagesFromCids(cids []cid.Cid) ([]*types.Message, er return msgs, nil } -func (cs *ChainStore) LoadSignedMessagesFromCids(cids []cid.Cid) ([]*types.SignedMessage, error) { +func (cs *ChainStore) LoadSignedMessagesFromCids(ctx context.Context, cids []cid.Cid) ([]*types.SignedMessage, error) { msgs := make([]*types.SignedMessage, 0, len(cids)) for i, c := range cids { - m, err := cs.GetSignedMessage(c) + m, err := cs.GetSignedMessage(ctx, c) if err != nil { return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", c, i, err) } diff --git a/chain/store/snapshot.go b/chain/store/snapshot.go index a3841389e..61fa8bdc8 100644 --- a/chain/store/snapshot.go +++ b/chain/store/snapshot.go @@ -43,8 +43,7 @@ func (cs *ChainStore) Export(ctx context.Context, ts *types.TipSet, inclRecentRo }) } -func (cs *ChainStore) Import(r io.Reader) (*types.TipSet, error) { - ctx := context.TODO() +func (cs *ChainStore) Import(ctx context.Context, r io.Reader) (*types.TipSet, error) { // TODO: writing only to the state blockstore is incorrect. // At this time, both the state and chain blockstores are backed by the // universal store. When we physically segregate the stores, we will need diff --git a/chain/store/store.go b/chain/store/store.go index a24737944..d86a66f12 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -1108,11 +1108,11 @@ func (cs *ChainStore) ActorStore(ctx context.Context) adt.Store { return ActorStore(ctx, cs.stateBlockstore) } -func (cs *ChainStore) TryFillTipSet(ts *types.TipSet) (*FullTipSet, error) { +func (cs *ChainStore) TryFillTipSet(ctx context.Context, ts *types.TipSet) (*FullTipSet, error) { var out []*types.FullBlock for _, b := range ts.Blocks() { - bmsgs, smsgs, err := cs.MessagesForBlock(b) + bmsgs, smsgs, err := cs.MessagesForBlock(ctx, b) if err != nil { // TODO: check for 'not found' errors, and only return nil if this // is actually a 'not found' error diff --git a/chain/sync.go b/chain/sync.go index f6824c389..0293ae25e 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -298,11 +298,11 @@ func (syncer *Syncer) ValidateMsgMeta(fblk *types.FullBlock) error { // into the blockstore. blockstore := bstore.NewMemory() cst := cbor.NewCborStore(blockstore) - + ctx := context.Background() var bcids, scids []cid.Cid for _, m := range fblk.BlsMessages { - c, err := store.PutMessage(blockstore, m) + c, err := store.PutMessage(ctx, blockstore, m) if err != nil { return xerrors.Errorf("putting bls message to blockstore after msgmeta computation: %w", err) } @@ -310,7 +310,7 @@ func (syncer *Syncer) ValidateMsgMeta(fblk *types.FullBlock) error { } for _, m := range fblk.SecpkMessages { - c, err := store.PutMessage(blockstore, m) + c, err := store.PutMessage(ctx, blockstore, m) if err != nil { return xerrors.Errorf("putting bls message to blockstore after msgmeta computation: %w", err) } @@ -482,7 +482,7 @@ func (syncer *Syncer) tryLoadFullTipSet(ctx context.Context, tsk types.TipSetKey fts := &store.FullTipSet{} for _, b := range ts.Blocks() { - bmsgs, smsgs, err := syncer.store.MessagesForBlock(b) + bmsgs, smsgs, err := syncer.store.MessagesForBlock(ctx, b) if err != nil { return nil, err } @@ -965,7 +965,7 @@ func (syncer *Syncer) iterFullTipsets(ctx context.Context, headers []*types.TipS span.AddAttributes(trace.Int64Attribute("num_headers", int64(len(headers)))) for i := len(headers) - 1; i >= 0; { - fts, err := syncer.store.TryFillTipSet(headers[i]) + fts, err := syncer.store.TryFillTipSet(ctx, headers[i]) if err != nil { return err } @@ -1138,7 +1138,7 @@ func persistMessages(ctx context.Context, bs bstore.Blockstore, bst *exchange.Co for _, m := range bst.Bls { //log.Infof("putting BLS message: %s", m.Cid()) - if _, err := store.PutMessage(bs, m); err != nil { + if _, err := store.PutMessage(ctx, bs, m); err != nil { log.Errorf("failed to persist messages: %+v", err) return xerrors.Errorf("BLS message processing failed: %w", err) } @@ -1148,7 +1148,7 @@ func persistMessages(ctx context.Context, bs bstore.Blockstore, bst *exchange.Co return xerrors.Errorf("unknown signature type on message %s: %q", m.Cid(), m.Signature.Type) } //log.Infof("putting secp256k1 message: %s", m.Cid()) - if _, err := store.PutMessage(bs, m); err != nil { + if _, err := store.PutMessage(ctx, bs, m); err != nil { log.Errorf("failed to persist messages: %+v", err) return xerrors.Errorf("secp256k1 message processing failed: %w", err) } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index 98dcb2fb5..18ce6c7ef 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -304,7 +304,7 @@ var importBenchCmd = &cli.Command{ return fmt.Errorf("no CAR file provided for import") } - head, err = cs.Import(carFile) + head, err = cs.Import(cctx.Context, carFile) if err != nil { return err } @@ -327,7 +327,7 @@ var importBenchCmd = &cli.Command{ return xerrors.Errorf("failed to parse head tipset key: %w", err) } - head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + head, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) if err != nil { return err } @@ -336,7 +336,7 @@ var importBenchCmd = &cli.Command{ if err != nil { return err } - head, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cr.Header.Roots...)) + head, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cr.Header.Roots...)) if err != nil { return err } @@ -353,7 +353,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to parse genesis tipset key: %w", err) } - genesis, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + genesis, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) } else { log.Warnf("getting genesis by height; this will be slow; pass in the genesis tipset through --genesis-tipset") // fallback to the slow path of walking the chain. @@ -364,7 +364,7 @@ var importBenchCmd = &cli.Command{ return err } - if err = cs.SetGenesis(context.Background(), genesis.Blocks()[0]); err != nil { + if err = cs.SetGenesis(cctx.Context, genesis.Blocks()[0]); err != nil { return err } @@ -375,10 +375,10 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to end genesis tipset key: %w", err) } - end, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + end, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) } else if h := cctx.Int64("end-height"); h != 0 { log.Infof("getting end tipset at height %d...", h) - end, err = cs.GetTipsetByHeight(context.TODO(), abi.ChainEpoch(h), head, true) + end, err = cs.GetTipsetByHeight(cctx.Context, abi.ChainEpoch(h), head, true) } if err != nil { @@ -397,7 +397,7 @@ var importBenchCmd = &cli.Command{ if cids, err = lcli.ParseTipSetString(tsk); err != nil { return xerrors.Errorf("failed to start genesis tipset key: %w", err) } - start, err = cs.LoadTipSet(context.Background(), types.NewTipSetKey(cids...)) + start, err = cs.LoadTipSet(cctx.Context, types.NewTipSetKey(cids...)) } else if h := cctx.Int64("start-height"); h != 0 { log.Infof("getting start tipset at height %d...", h) // lookback from the end tipset (which falls back to head if not supplied). @@ -410,7 +410,7 @@ var importBenchCmd = &cli.Command{ if start != nil { startEpoch = start.Height() - if err := cs.ForceHeadSilent(context.Background(), start); err != nil { + if err := cs.ForceHeadSilent(cctx.Context, start); err != nil { // if err := cs.SetHead(start); err != nil { return err } @@ -421,7 +421,7 @@ var importBenchCmd = &cli.Command{ if h := ts.Height(); h%100 == 0 { log.Infof("walking back the chain; loaded tipset at height %d...", h) } - next, err := cs.LoadTipSet(context.Background(), ts.Parents()) + next, err := cs.LoadTipSet(cctx.Context, ts.Parents()) if err != nil { return err } diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index adc59f0f9..ae742c663 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -347,7 +347,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string return err } - if err := mds.Put(context.Background(), sectorKey, b); err != nil { + if err := mds.Put(ctx, sectorKey, b); err != nil { return err } @@ -387,7 +387,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string buf := make([]byte, binary.MaxVarintLen64) size := binary.PutUvarint(buf, uint64(maxSectorID)) - return mds.Put(context.Background(), datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) + return mds.Put(ctx, datastore.NewKey(modules.StorageCounterDSPrefix), buf[:size]) } func findMarketDealID(ctx context.Context, api v1api.FullNode, deal market2.DealProposal) (abi.DealID, error) { @@ -428,7 +428,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode return xerrors.Errorf("peer ID from private key: %w", err) } - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(ctx, "/metadata") if err != nil { return err } @@ -441,7 +441,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } if cctx.Bool("genesis-miner") { - if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), a.Bytes()); err != nil { + if err := mds.Put(ctx, datastore.NewKey("miner-address"), a.Bytes()); err != nil { return err } @@ -548,7 +548,7 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api v1api.FullNode } log.Infof("Created new miner: %s", addr) - if err := mds.Put(context.Background(), datastore.NewKey("miner-address"), addr.Bytes()); err != nil { + if err := mds.Put(ctx, datastore.NewKey("miner-address"), addr.Bytes()); err != nil { return err } diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index 84a2f3838..1aaa7909a 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -233,7 +233,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi log.Info("Restoring metadata backup") - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(ctx, "/metadata") if err != nil { return err } @@ -255,7 +255,7 @@ func restore(ctx context.Context, cctx *cli.Context, targetPath string, strConfi log.Info("Checking actor metadata") - abytes, err := mds.Get(context.Background(), datastore.NewKey("miner-address")) + abytes, err := mds.Get(ctx, datastore.NewKey("miner-address")) if err != nil { return xerrors.Errorf("getting actor address from metadata datastore: %w", err) } diff --git a/cmd/lotus-sim/simulation/messages.go b/cmd/lotus-sim/simulation/messages.go index 5bed27436..d6dd98d43 100644 --- a/cmd/lotus-sim/simulation/messages.go +++ b/cmd/lotus-sim/simulation/messages.go @@ -31,7 +31,7 @@ func (sim *Simulation) storeMessages(ctx context.Context, messages []*types.Mess // fail a pre-commit... var msgCids []cid.Cid for _, msg := range messages { - c, err := sim.Node.Chainstore.PutMessage(msg) + c, err := sim.Node.Chainstore.PutMessage(ctx, msg) if err != nil { return cid.Undef, err } diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index 51404220e..5747afe4d 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -90,7 +90,7 @@ type Simulation struct { // loadConfig loads a simulation's config from the datastore. This must be called on startup and may // be called to restore the config from-disk. func (sim *Simulation) loadConfig() error { - configBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key("config")) + configBytes, err := sim.Node.MetadataDS.Get(context.TODO(), sim.key("config")) if err == nil { err = json.Unmarshal(configBytes, &sim.config) } @@ -111,7 +111,7 @@ func (sim *Simulation) saveConfig() error { if err != nil { return err } - return sim.Node.MetadataDS.Put(context.Background(), sim.key("config"), buf) + return sim.Node.MetadataDS.Put(context.TODO(), sim.key("config"), buf) } var simulationPrefix = datastore.NewKey("/simulation") @@ -124,7 +124,7 @@ func (sim *Simulation) key(subkey string) datastore.Key { // loadNamedTipSet the tipset with the given name (for this simulation) func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { - tskBytes, err := sim.Node.MetadataDS.Get(context.Background(), sim.key(name)) + tskBytes, err := sim.Node.MetadataDS.Get(context.TODO(), sim.key(name)) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s/%s: %w", sim.name, name, err) } @@ -132,7 +132,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { if err != nil { return nil, xerrors.Errorf("failed to parse tipste %v (%s/%s): %w", tskBytes, sim.name, name, err) } - ts, err := sim.Node.Chainstore.LoadTipSet(context.Background(), tsk) + ts, err := sim.Node.Chainstore.LoadTipSet(context.TODO(), tsk) if err != nil { return nil, xerrors.Errorf("failed to load tipset %s (%s/%s): %w", tsk, sim.name, name, err) } @@ -141,7 +141,7 @@ func (sim *Simulation) loadNamedTipSet(name string) (*types.TipSet, error) { // storeNamedTipSet stores the tipset at name (relative to the simulation). func (sim *Simulation) storeNamedTipSet(name string, ts *types.TipSet) error { - if err := sim.Node.MetadataDS.Put(context.Background(), sim.key(name), ts.Key().Bytes()); err != nil { + if err := sim.Node.MetadataDS.Put(context.TODO(), sim.key(name), ts.Key().Bytes()); err != nil { return xerrors.Errorf("failed to store tipset (%s/%s): %w", sim.name, name, err) } return nil @@ -342,7 +342,7 @@ func (sim *Simulation) Walk( break } - msgs, err := sim.Node.Chainstore.MessagesForTipset(job.ts) + msgs, err := sim.Node.Chainstore.MessagesForTipset(ctx, job.ts) if err != nil { return err } diff --git a/cmd/lotus/backup.go b/cmd/lotus/backup.go index 245a3d397..4bdd21322 100644 --- a/cmd/lotus/backup.go +++ b/cmd/lotus/backup.go @@ -1,7 +1,6 @@ package main import ( - "context" "os" dstore "github.com/ipfs/go-datastore" @@ -88,7 +87,7 @@ func restore(cctx *cli.Context, r repo.Repo) error { log.Info("Restoring metadata backup") - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(cctx.Context, "/metadata") if err != nil { return err } @@ -111,10 +110,10 @@ func restore(cctx *cli.Context, r repo.Repo) error { log.Info("Resetting chainstore metadata") chainHead := dstore.NewKey("head") - if err := mds.Delete(context.Background(), chainHead); err != nil { + if err := mds.Delete(cctx.Context, chainHead); err != nil { return xerrors.Errorf("clearing chain head: %w", err) } - if err := store.FlushValidationCache(context.Background(), mds); err != nil { + if err := store.FlushValidationCache(cctx.Context, mds); err != nil { return xerrors.Errorf("clearing chain validation cache: %w", err) } diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index bcf3b119e..813a0a9bd 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -474,7 +474,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return xerrors.Errorf("failed to open blockstore: %w", err) } - mds, err := lr.Datastore(context.TODO(), "/metadata") + mds, err := lr.Datastore(ctx, "/metadata") if err != nil { return err } @@ -499,14 +499,14 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) bar.Units = pb.U_BYTES bar.Start() - ts, err := cst.Import(br) + ts, err := cst.Import(ctx, br) bar.Finish() if err != nil { return xerrors.Errorf("importing chain failed: %w", err) } - if err := cst.FlushValidationCache(context.Background()); err != nil { + if err := cst.FlushValidationCache(ctx); err != nil { return xerrors.Errorf("flushing validation cache failed: %w", err) } @@ -515,7 +515,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) return err } - err = cst.SetGenesis(context.Background(), gb.Blocks()[0]) + err = cst.SetGenesis(ctx, gb.Blocks()[0]) if err != nil { return err } diff --git a/conformance/runner.go b/conformance/runner.go index 86cc56f85..e597f0bbe 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -282,7 +282,7 @@ func writeStateToTempCAR(bs blockstore.Blockstore, roots ...cid.Cid) (string, er continue } // ignore things we don't have, the state tree is incomplete. - if has, err := bs.Has(context.Background(), link.Cid); err != nil { + if has, err := bs.Has(context.TODO(), link.Cid); err != nil { return nil, err } else if has { out = append(out, link) @@ -317,7 +317,7 @@ func LoadBlockstore(vectorCAR schema.Base64EncodedBytes) (blockstore.Blockstore, defer r.Close() // nolint // Load the CAR embedded in the test vector into the Blockstore. - _, err = car.LoadCar(context.Background(), bs, r) + _, err = car.LoadCar(context.TODO(), bs, r) if err != nil { return nil, fmt.Errorf("failed to load state tree car from test vector: %s", err) } diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index e37304429..ce492f94a 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -116,7 +116,7 @@ func (m *ChainModule) ChainGetBlockMessages(ctx context.Context, msg cid.Cid) (* return nil, err } - bmsgs, smsgs, err := m.Chain.MessagesForBlock(b) + bmsgs, smsgs, err := m.Chain.MessagesForBlock(ctx, b) if err != nil { return nil, err } @@ -159,7 +159,7 @@ func (a *ChainAPI) ChainGetParentMessages(ctx context.Context, bcid cid.Cid) ([] return nil, err } - cm, err := a.Chain.MessagesForTipset(pts) + cm, err := a.Chain.MessagesForTipset(ctx, pts) if err != nil { return nil, err } @@ -191,14 +191,14 @@ func (a *ChainAPI) ChainGetParentReceipts(ctx context.Context, bcid cid.Cid) ([] return nil, err } - cm, err := a.Chain.MessagesForTipset(pts) + cm, err := a.Chain.MessagesForTipset(ctx, pts) if err != nil { return nil, err } var out []*types.MessageReceipt for i := 0; i < len(cm); i++ { - r, err := a.Chain.GetParentReceipt(b, i) + r, err := a.Chain.GetParentReceipt(ctx, b, i) if err != nil { return nil, err } @@ -220,7 +220,7 @@ func (a *ChainAPI) ChainGetMessagesInTipset(ctx context.Context, tsk types.TipSe return nil, nil } - cm, err := a.Chain.MessagesForTipset(ts) + cm, err := a.Chain.MessagesForTipset(ctx, ts) if err != nil { return nil, err } @@ -577,7 +577,7 @@ func (a *ChainAPI) ChainGetNode(ctx context.Context, p string) (*api.IpldObject, } func (m *ChainModule) ChainGetMessage(ctx context.Context, mc cid.Cid) (*types.Message, error) { - cm, err := m.Chain.GetCMessage(mc) + cm, err := m.Chain.GetCMessage(ctx, mc) if err != nil { return nil, err } diff --git a/node/impl/full/gas.go b/node/impl/full/gas.go index c4c1bd580..dd1e8d5ea 100644 --- a/node/impl/full/gas.go +++ b/node/impl/full/gas.go @@ -82,14 +82,14 @@ type GasMeta struct { Limit int64 } -func (g *GasPriceCache) GetTSGasStats(cstore *store.ChainStore, ts *types.TipSet) ([]GasMeta, error) { +func (g *GasPriceCache) GetTSGasStats(ctx context.Context, cstore *store.ChainStore, ts *types.TipSet) ([]GasMeta, error) { i, has := g.c.Get(ts.Key()) if has { return i.([]GasMeta), nil } var prices []GasMeta - msgs, err := cstore.MessagesForTipset(ts) + msgs, err := cstore.MessagesForTipset(ctx, ts) if err != nil { return nil, xerrors.Errorf("loading messages: %w", err) } @@ -204,7 +204,7 @@ func gasEstimateGasPremium(ctx context.Context, cstore *store.ChainStore, cache } blocks += len(pts.Blocks()) - meta, err := cache.GetTSGasStats(cstore, pts) + meta, err := cache.GetTSGasStats(ctx, cstore, pts) if err != nil { return types.BigInt{}, err } diff --git a/node/impl/full/mpool.go b/node/impl/full/mpool.go index 6e1873d5b..afff871ca 100644 --- a/node/impl/full/mpool.go +++ b/node/impl/full/mpool.go @@ -87,7 +87,7 @@ func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*ty // different blocks in tipsets of the same height // we exclude messages that have been included in blocks in the mpool tipset - have, err := a.Mpool.MessagesForBlocks(mpts.Blocks()) + have, err := a.Mpool.MessagesForBlocks(ctx, mpts.Blocks()) if err != nil { return nil, xerrors.Errorf("getting messages for base ts: %w", err) } @@ -97,7 +97,7 @@ func (a *MpoolAPI) MpoolPending(ctx context.Context, tsk types.TipSetKey) ([]*ty } } - msgs, err := a.Mpool.MessagesForBlocks(ts.Blocks()) + msgs, err := a.Mpool.MessagesForBlocks(ctx, ts.Blocks()) if err != nil { return nil, xerrors.Errorf(": %w", err) } diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 7a96af150..24cc08c8c 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -556,7 +556,7 @@ func (m *StateModule) StateWaitMsg(ctx context.Context, msg cid.Cid, confidence var returndec interface{} if recpt.ExitCode == 0 && len(recpt.Return) > 0 { - cmsg, err := m.Chain.GetCMessage(msg) + cmsg, err := m.Chain.GetCMessage(ctx, msg) if err != nil { return nil, xerrors.Errorf("failed to load message after successful receipt search: %w", err) } @@ -874,7 +874,7 @@ func (a *StateAPI) StateListMessages(ctx context.Context, match *api.MessageMatc var out []cid.Cid for ts.Height() >= toheight { - msgs, err := a.Chain.MessagesForTipset(ts) + msgs, err := a.Chain.MessagesForTipset(ctx, ts) if err != nil { return nil, xerrors.Errorf("failed to get messages for tipset (%s): %w", ts.Key(), err) } diff --git a/node/impl/full/sync.go b/node/impl/full/sync.go index 25f7c784a..bd7de65b1 100644 --- a/node/impl/full/sync.go +++ b/node/impl/full/sync.go @@ -64,12 +64,12 @@ func (a *SyncAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) erro } // TODO: should we have some sort of fast path to adding a local block? - bmsgs, err := a.Syncer.ChainStore().LoadMessagesFromCids(blk.BlsMessages) + bmsgs, err := a.Syncer.ChainStore().LoadMessagesFromCids(ctx, blk.BlsMessages) if err != nil { return xerrors.Errorf("failed to load bls messages: %w", err) } - smsgs, err := a.Syncer.ChainStore().LoadSignedMessagesFromCids(blk.SecpkMessages) + smsgs, err := a.Syncer.ChainStore().LoadSignedMessagesFromCids(ctx, blk.SecpkMessages) if err != nil { return xerrors.Errorf("failed to load secpk message: %w", err) } @@ -142,7 +142,7 @@ func (a *SyncAPI) SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) ( return false, err } - fts, err := a.Syncer.ChainStore().TryFillTipSet(ts) + fts, err := a.Syncer.ChainStore().TryFillTipSet(ctx, ts) if err != nil { return false, err } diff --git a/node/modules/chain.go b/node/modules/chain.go index d79cd1038..ff957c9ad 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -30,7 +30,7 @@ import ( ) // ChainBitswap uses a blockstore that bypasses all caches. -func ChainBitswap(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, rt routing.Routing, bs dtypes.ExposedBlockstore) dtypes.ChainBitswap { +func ChainBitswap(lc fx.Lifecycle, mctx helpers.MetricsCtx, host host.Host, rt routing.Routing, bs dtypes.ExposedBlockstore) dtypes.ChainBitswap { // prefix protocol for chain bitswap // (so bitswap uses /chain/ipfs/bitswap/1.0.0 internally for chain sync stuff) bitswapNetwork := network.NewFromIpfsHost(host, rt, network.Prefix("/chain")) @@ -58,8 +58,8 @@ func ChainBlockService(bs dtypes.ExposedBlockstore, rem dtypes.ChainBitswap) dty return blockservice.New(bs, rem) } -func MessagePool(lc fx.Lifecycle, us stmgr.UpgradeSchedule, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal, protector dtypes.GCReferenceProtector) (*messagepool.MessagePool, error) { - mp, err := messagepool.New(context.Background(), mpp, ds, us, nn, j) +func MessagePool(lc fx.Lifecycle, mctx helpers.MetricsCtx, us stmgr.UpgradeSchedule, mpp messagepool.Provider, ds dtypes.MetadataDS, nn dtypes.NetworkName, j journal.Journal, protector dtypes.GCReferenceProtector) (*messagepool.MessagePool, error) { + mp, err := messagepool.New(helpers.LifecycleCtx(mctx, lc), mpp, ds, us, nn, j) if err != nil { return nil, xerrors.Errorf("constructing mpool: %w", err) } @@ -73,6 +73,7 @@ func MessagePool(lc fx.Lifecycle, us stmgr.UpgradeSchedule, mpp messagepool.Prov } func ChainStore(lc fx.Lifecycle, + mctx helpers.MetricsCtx, cbs dtypes.ChainBlockstore, sbs dtypes.StateBlockstore, ds dtypes.MetadataDS, @@ -83,7 +84,7 @@ func ChainStore(lc fx.Lifecycle, chain := store.NewChainStore(cbs, sbs, ds, weight, j) - if err := chain.Load(context.Background()); err != nil { + if err := chain.Load(helpers.LifecycleCtx(mctx, lc)); err != nil { log.Warnf("loading chain state from disk: %s", err) } diff --git a/node/modules/client.go b/node/modules/client.go index 1de4f63e8..86063b8d9 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -40,11 +40,12 @@ import ( "github.com/filecoin-project/lotus/node/impl/full" payapi "github.com/filecoin-project/lotus/node/impl/paych" "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/helpers" "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/lotus/node/repo/imports" ) -func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full.WalletAPI, fundMgr *market.FundManager) { +func HandleMigrateClientFunds(lc fx.Lifecycle, mctx helpers.MetricsCtx, ds dtypes.MetadataDS, wallet full.WalletAPI, fundMgr *market.FundManager) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { addr, err := wallet.WalletDefaultAddress(ctx) @@ -52,7 +53,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full if err != nil { return nil } - b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/client")) + b, err := ds.Get(helpers.LifecycleCtx(mctx, lc), datastore.NewKey("/marketfunds/client")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -73,7 +74,7 @@ func HandleMigrateClientFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, wallet full return nil } - return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/client")) + return ds.Delete(helpers.LifecycleCtx(mctx, lc), datastore.NewKey("/marketfunds/client")) }, }) } diff --git a/node/modules/genesis.go b/node/modules/genesis.go index 77cf8e353..03b4e2907 100644 --- a/node/modules/genesis.go +++ b/node/modules/genesis.go @@ -2,9 +2,10 @@ package modules import ( "bytes" - "context" "os" + "go.uber.org/fx" + "github.com/ipfs/go-datastore" "github.com/ipld/go-car" "golang.org/x/xerrors" @@ -12,6 +13,7 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/helpers" ) func ErrorGenesis() Genesis { @@ -20,17 +22,18 @@ func ErrorGenesis() Genesis { } } -func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { - return func(bs dtypes.ChainBlockstore) Genesis { +func LoadGenesis(genBytes []byte) func(fx.Lifecycle, helpers.MetricsCtx, dtypes.ChainBlockstore) Genesis { + return func(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtypes.ChainBlockstore) Genesis { return func() (header *types.BlockHeader, e error) { - c, err := car.LoadCar(context.Background(), bs, bytes.NewReader(genBytes)) + ctx := helpers.LifecycleCtx(mctx, lc) + c, err := car.LoadCar(ctx, bs, bytes.NewReader(genBytes)) if err != nil { return nil, xerrors.Errorf("loading genesis car file failed: %w", err) } if len(c.Roots) != 1 { return nil, xerrors.New("expected genesis file to have one root") } - root, err := bs.Get(context.Background(), c.Roots[0]) + root, err := bs.Get(ctx, c.Roots[0]) if err != nil { return nil, err } @@ -46,8 +49,9 @@ func LoadGenesis(genBytes []byte) func(dtypes.ChainBlockstore) Genesis { func DoSetGenesis(_ dtypes.AfterGenesisSet) {} -func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) { - genFromRepo, err := cs.GetGenesis(context.Background()) +func SetGenesis(lc fx.Lifecycle, mctx helpers.MetricsCtx, cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) { + ctx := helpers.LifecycleCtx(mctx, lc) + genFromRepo, err := cs.GetGenesis(ctx) if err == nil { if os.Getenv("LOTUS_SKIP_GENESIS_CHECK") != "_yes_" { expectedGenesis, err := g() @@ -70,5 +74,5 @@ func SetGenesis(cs *store.ChainStore, g Genesis) (dtypes.AfterGenesisSet, error) return dtypes.AfterGenesisSet{}, xerrors.Errorf("genesis func failed: %w", err) } - return dtypes.AfterGenesisSet{}, cs.SetGenesis(context.Background(), genesis) + return dtypes.AfterGenesisSet{}, cs.SetGenesis(ctx, genesis) } diff --git a/node/modules/services.go b/node/modules/services.go index c832b16fc..299c01fb0 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -228,8 +228,8 @@ func BuiltinDrandConfig() dtypes.DrandSchedule { return build.DrandConfigSchedule() } -func RandomSchedule(p RandomBeaconParams, _ dtypes.AfterGenesisSet) (beacon.Schedule, error) { - gen, err := p.Cs.GetGenesis(context.Background()) +func RandomSchedule(lc fx.Lifecycle, mctx helpers.MetricsCtx, p RandomBeaconParams, _ dtypes.AfterGenesisSet) (beacon.Schedule, error) { + gen, err := p.Cs.GetGenesis(helpers.LifecycleCtx(mctx, lc)) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index d271f974a..3eb6f3c3c 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -78,7 +78,7 @@ var ( ) func minerAddrFromDS(ds dtypes.MetadataDS) (address.Address, error) { - maddrb, err := ds.Get(context.Background(), datastore.NewKey("miner-address")) + maddrb, err := ds.Get(context.TODO(), datastore.NewKey("miner-address")) if err != nil { return address.Undef, err } @@ -300,7 +300,7 @@ func HandleDeals(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, h sto func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api.FullNode, minerAddress dtypes.MinerAddress) { lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { - b, err := ds.Get(context.Background(), datastore.NewKey("/marketfunds/provider")) + b, err := ds.Get(ctx, datastore.NewKey("/marketfunds/provider")) if err != nil { if xerrors.Is(err, datastore.ErrNotFound) { return nil @@ -331,7 +331,7 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. return nil } - return ds.Delete(context.Background(), datastore.NewKey("/marketfunds/provider")) + return ds.Delete(ctx, datastore.NewKey("/marketfunds/provider")) }, }) } From 6ba2533e2b8433a8c941358085ee7571d7b6085f Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 11:47:28 +0200 Subject: [PATCH 109/157] fix lotus-shed --- cmd/lotus-shed/genesis-verify.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/genesis-verify.go b/cmd/lotus-shed/genesis-verify.go index 4a692d4c9..cc042064d 100644 --- a/cmd/lotus-shed/genesis-verify.go +++ b/cmd/lotus-shed/genesis-verify.go @@ -64,7 +64,7 @@ var genesisVerifyCmd = &cli.Command{ return xerrors.Errorf("opening the car file: %w", err) } - ts, err := cs.Import(f) + ts, err := cs.Import(cctx.Context, f) if err != nil { return err } From cd266a05d24f8fc3bcdf72a9345a1cc1a5b204dd Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 12:04:04 +0200 Subject: [PATCH 110/157] fix tests --- chain/messagepool/messagepool_test.go | 8 ++++---- chain/store/index_test.go | 2 +- chain/store/store_test.go | 4 ++-- chain/sync_test.go | 7 ++++--- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/chain/messagepool/messagepool_test.go b/chain/messagepool/messagepool_test.go index da1a2eab6..47cf56eb3 100644 --- a/chain/messagepool/messagepool_test.go +++ b/chain/messagepool/messagepool_test.go @@ -103,7 +103,7 @@ func (tma *testMpoolAPI) SubscribeHeadChanges(cb func(rev, app []*types.TipSet) return tma.tipsets[0] } -func (tma *testMpoolAPI) PutMessage(m types.ChainMsg) (cid.Cid, error) { +func (tma *testMpoolAPI) PutMessage(ctx context.Context, m types.ChainMsg) (cid.Cid, error) { return cid.Undef, nil } @@ -164,16 +164,16 @@ func (tma *testMpoolAPI) StateAccountKeyAtFinality(ctx context.Context, addr add return addr, nil } -func (tma *testMpoolAPI) MessagesForBlock(h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { +func (tma *testMpoolAPI) MessagesForBlock(ctx context.Context, h *types.BlockHeader) ([]*types.Message, []*types.SignedMessage, error) { return nil, tma.bmsgs[h.Cid()], nil } -func (tma *testMpoolAPI) MessagesForTipset(ts *types.TipSet) ([]types.ChainMsg, error) { +func (tma *testMpoolAPI) MessagesForTipset(ctx context.Context, ts *types.TipSet) ([]types.ChainMsg, error) { if len(ts.Blocks()) != 1 { panic("cant deal with multiblock tipsets in this test") } - bm, sm, err := tma.MessagesForBlock(ts.Blocks()[0]) + bm, sm, err := tma.MessagesForBlock(ctx, ts.Blocks()[0]) if err != nil { return nil, err } diff --git a/chain/store/index_test.go b/chain/store/index_test.go index 13054e95d..b7f1d570f 100644 --- a/chain/store/index_test.go +++ b/chain/store/index_test.go @@ -35,7 +35,7 @@ func TestIndexSeeks(t *testing.T) { cs := store.NewChainStore(nbs, nbs, syncds.MutexWrap(datastore.NewMapDatastore()), filcns.Weight, nil) defer cs.Close() //nolint:errcheck - _, err = cs.Import(bytes.NewReader(gencar)) + _, err = cs.Import(ctx, bytes.NewReader(gencar)) if err != nil { t.Fatal(err) } diff --git a/chain/store/store_test.go b/chain/store/store_test.go index f7cf32e8a..a759a48a8 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -109,7 +109,7 @@ func TestChainExportImport(t *testing.T) { cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil) defer cs.Close() //nolint:errcheck - root, err := cs.Import(buf) + root, err := cs.Import(context.TODO(), buf) if err != nil { t.Fatal(err) } @@ -144,7 +144,7 @@ func TestChainExportImportFull(t *testing.T) { cs := store.NewChainStore(nbs, nbs, datastore.NewMapDatastore(), filcns.Weight, nil) defer cs.Close() //nolint:errcheck - root, err := cs.Import(buf) + root, err := cs.Import(context.TODO(), buf) if err != nil { t.Fatal(err) } diff --git a/chain/sync_test.go b/chain/sync_test.go index 2a1798a56..3293856c7 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -205,20 +205,21 @@ func (tu *syncTestUtil) pushFtsAndWait(to int, fts *store.FullTipSet, wait bool) } func (tu *syncTestUtil) pushTsExpectErr(to int, fts *store.FullTipSet, experr bool) { + ctx := context.TODO() for _, fb := range fts.Blocks { var b types.BlockMsg // -1 to match block.Height b.Header = fb.Header for _, msg := range fb.SecpkMessages { - c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(msg) + c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(ctx, msg) require.NoError(tu.t, err) b.SecpkMessages = append(b.SecpkMessages, c) } for _, msg := range fb.BlsMessages { - c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(msg) + c, err := tu.nds[to].(*impl.FullNodeAPI).ChainAPI.Chain.PutMessage(ctx, msg) require.NoError(tu.t, err) b.BlsMessages = append(b.BlsMessages, c) @@ -734,7 +735,7 @@ func TestDuplicateNonce(t *testing.T) { t.Fatal("included message should be in exec trace") } - mft, err := tu.g.ChainStore().MessagesForTipset(ts1.TipSet()) + mft, err := tu.g.ChainStore().MessagesForTipset(context.TODO(), ts1.TipSet()) require.NoError(t, err) require.True(t, len(mft) == 1, "only expecting one message for this tipset") require.Equal(t, includedMsg, mft[0].VMMessage().Cid(), "messages for tipset didn't contain expected message") From 122b3195200632c7a52bdf0a85d2a0b43c1f845a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 17 Dec 2021 11:45:40 +0100 Subject: [PATCH 111/157] don't update ffi --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index a7b3c2e69..791238933 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit a7b3c2e695393fd716e9265ff8cba932a3e38dd4 +Subproject commit 7912389334e347bbb2eac0520c836830875c39de From 976a3a5e7b528fb22a60283d54a4d1a6cc72d3fd Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 13:44:05 +0200 Subject: [PATCH 112/157] fix blockstore test contexts --- blockstore/badger/blockstore_test_suite.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index de8485a0e..167d1b2ab 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -57,7 +57,7 @@ func (s *Suite) TestGetWhenKeyNotPresent(t *testing.T) { } func (s *Suite) TestGetWhenKeyIsNil(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -68,7 +68,7 @@ func (s *Suite) TestGetWhenKeyIsNil(t *testing.T) { } func (s *Suite) TestPutThenGetBlock(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -85,7 +85,7 @@ func (s *Suite) TestPutThenGetBlock(t *testing.T) { } func (s *Suite) TestHas(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -106,7 +106,7 @@ func (s *Suite) TestHas(t *testing.T) { } func (s *Suite) TestCidv0v1(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -123,7 +123,7 @@ func (s *Suite) TestCidv0v1(t *testing.T) { } func (s *Suite) TestPutThenGetSizeBlock(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { @@ -210,7 +210,7 @@ func (s *Suite) TestDoubleClose(t *testing.T) { } func (s *Suite) TestReopenPutGet(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, path := s.NewBlockstore(t) c, ok := bs.(io.Closer) if !ok { @@ -236,7 +236,7 @@ func (s *Suite) TestReopenPutGet(t *testing.T) { } func (s *Suite) TestPutMany(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -268,7 +268,7 @@ func (s *Suite) TestPutMany(t *testing.T) { } func (s *Suite) TestDelete(t *testing.T) { - ctx := context.TODO() + ctx := context.Background() bs, _ := s.NewBlockstore(t) if c, ok := bs.(io.Closer); ok { defer func() { require.NoError(t, c.Close()) }() @@ -301,7 +301,7 @@ func (s *Suite) TestDelete(t *testing.T) { } func insertBlocks(t *testing.T, bs blockstore.BasicBlockstore, count int) []cid.Cid { - ctx := context.TODO() + ctx := context.Background() keys := make([]cid.Cid, count) for i := 0; i < count; i++ { block := blocks.NewBlock([]byte(fmt.Sprintf("some data %d", i))) From 66f8f8aff22a6ef75c5206501e8548c91b82b045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 17 Dec 2021 13:05:44 +0100 Subject: [PATCH 113/157] fix shed --- cmd/lotus-shed/terminations.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go index a209e459f..0691f35da 100644 --- a/cmd/lotus-shed/terminations.go +++ b/cmd/lotus-shed/terminations.go @@ -84,7 +84,7 @@ var terminationsCmd = &cli.Command{ cst := cbor.NewCborStore(bs) store := adt.WrapStore(ctx, cst) - blk, err := cs.GetBlock(blkCid) + blk, err := cs.GetBlock(ctx, blkCid) if err != nil { return err } @@ -97,14 +97,14 @@ var terminationsCmd = &cli.Command{ cutoff := blk.Height - abi.ChainEpoch(lbp) for blk.Height > cutoff { - pts, err := cs.LoadTipSet(types.NewTipSetKey(blk.Parents...)) + pts, err := cs.LoadTipSet(ctx, types.NewTipSetKey(blk.Parents...)) if err != nil { return err } blk = pts.Blocks()[0] - msgs, err := cs.MessagesForTipset(pts) + msgs, err := cs.MessagesForTipset(ctx, pts) if err != nil { return err } From 839fc8df7d4f61ef2f4e2fa996f5e7e7331e24f4 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 14:44:51 +0100 Subject: [PATCH 114/157] fix: when retrying Add Piece, first seek to start of reader --- go.mod | 2 +- go.sum | 4 ++-- markets/storageadapter/provider.go | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index c86511c38..a4d85d6cf 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.5 + github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 3b1f06587..f6f557211 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= -github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585 h1:kDzqA/WyUOVVt2en/r81nvS21s0sMThv4qlKoveooDU= +github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/markets/storageadapter/provider.go b/markets/storageadapter/provider.go index bb9863bc4..0828db271 100644 --- a/markets/storageadapter/provider.go +++ b/markets/storageadapter/provider.go @@ -4,7 +4,6 @@ package storageadapter import ( "context" - "io" "time" "github.com/ipfs/go-cid" @@ -88,7 +87,7 @@ func (n *ProviderNodeAdapter) PublishDeals(ctx context.Context, deal storagemark return n.dealPublisher.Publish(ctx, deal.ClientDealProposal) } -func (n *ProviderNodeAdapter) OnDealComplete(ctx context.Context, deal storagemarket.MinerDeal, pieceSize abi.UnpaddedPieceSize, pieceData io.Reader) (*storagemarket.PackingResult, error) { +func (n *ProviderNodeAdapter) OnDealComplete(ctx context.Context, deal storagemarket.MinerDeal, pieceSize abi.UnpaddedPieceSize, pieceData shared.ReadSeekStarter) (*storagemarket.PackingResult, error) { if deal.PublishCid == nil { return nil, xerrors.Errorf("deal.PublishCid can't be nil") } @@ -104,17 +103,32 @@ func (n *ProviderNodeAdapter) OnDealComplete(ctx context.Context, deal storagema KeepUnsealed: deal.FastRetrieval, } + // Attempt to add the piece to the sector p, offset, err := n.secb.AddPiece(ctx, pieceSize, pieceData, sdInfo) curTime := build.Clock.Now() for build.Clock.Since(curTime) < addPieceRetryTimeout { + // Check if there was an error because of too many sectors being sealed if !xerrors.Is(err, sealing.ErrTooManySectorsSealing) { if err != nil { log.Errorf("failed to addPiece for deal %d, err: %v", deal.DealID, err) } + + // There was either a fatal error or no error. In either case + // don't retry AddPiece break } + + // The piece could not be added to the sector because there are too + // many sectors being sealed, back-off for a while before trying again select { case <-build.Clock.After(addPieceRetryWait): + // Reset the reader to the start + err = pieceData.SeekStart() + if err != nil { + return nil, xerrors.Errorf("failed to reset piece reader to start before retrying AddPiece for deal %d: %w", deal.DealID, err) + } + + // Attempt to add the piece again p, offset, err = n.secb.AddPiece(ctx, pieceSize, pieceData, sdInfo) case <-ctx.Done(): return nil, xerrors.New("context expired while waiting to retry AddPiece") From b1734f84b3be46879ae52e30c3d0c9e1e331f8e8 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 15:50:51 +0100 Subject: [PATCH 115/157] feat: retrieval ask CLI command --- api/api_full.go | 1 + build/openrpc/full.json.gz | Bin 25704 -> 25722 bytes cli/client.go | 58 ++++++++++++++++++++ documentation/en/api-v0-methods.md | 1 + documentation/en/api-v1-unstable-methods.md | 1 + documentation/en/cli-lotus.md | 30 ++++++++-- itests/kit/client.go | 7 ++- node/impl/client/client.go | 1 + 8 files changed, 92 insertions(+), 7 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 06aaff99c..9ca0f883a 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -900,6 +900,7 @@ type QueryOffer struct { Size uint64 MinPrice types.BigInt UnsealPrice types.BigInt + PricePerByte abi.TokenAmount PaymentInterval uint64 PaymentIntervalIncrease uint64 Miner address.Address diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 4bb7835d28cd9bdf071b868fed07f443d72ff101..33a869e4a274fa86cf427e358072b8addad32fda 100644 GIT binary patch delta 21017 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 Ca+$FJ delta 20883 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 diff --git a/cli/client.go b/cli/client.go index f5b38788b..e576c0b6c 100644 --- a/cli/client.go +++ b/cli/client.go @@ -92,6 +92,7 @@ var clientCmd = &cli.Command{ WithCategory("data", clientLocalCmd), WithCategory("data", clientStat), WithCategory("retrieval", clientFindCmd), + WithCategory("retrieval", clientQueryRetrievalAskCmd), WithCategory("retrieval", clientRetrieveCmd), WithCategory("retrieval", clientRetrieveCatCmd), WithCategory("retrieval", clientRetrieveLsCmd), @@ -1030,6 +1031,63 @@ var clientFindCmd = &cli.Command{ }, } +var clientQueryRetrievalAskCmd = &cli.Command{ + Name: "query-retrieval-ask", + Usage: "Get a miner's retrieval ask", + ArgsUsage: "[minerAddress] [data CID]", + Flags: []cli.Flag{ + &cli.Int64Flag{ + Name: "size", + Usage: "data size in bytes", + }, + }, + Action: func(cctx *cli.Context) error { + afmt := NewAppFmt(cctx.App) + if cctx.NArg() != 2 { + afmt.Println("Usage: query-retrieval-ask [minerAddress] [data CID]") + return nil + } + + maddr, err := address.NewFromString(cctx.Args().First()) + if err != nil { + return err + } + + dataCid, err := cid.Parse(cctx.Args().Get(1)) + if err != nil { + return fmt.Errorf("parsing data cid: %w", err) + } + + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + ask, err := api.ClientMinerQueryOffer(ctx, maddr, dataCid, nil) + if err != nil { + return err + } + + afmt.Printf("Ask: %s\n", maddr) + afmt.Printf("Unseal price: %s\n", types.FIL(ask.UnsealPrice)) + afmt.Printf("Price per byte: %s\n", types.FIL(ask.PricePerByte)) + afmt.Printf("Payment interval: %s\n", types.SizeStr(types.NewInt(ask.PaymentInterval))) + afmt.Printf("Payment interval increase: %s\n", types.SizeStr(types.NewInt(ask.PaymentIntervalIncrease))) + + size := cctx.Int64("size") + if size == 0 { + return nil + } + transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(uint64(size))) + totalPrice := types.BigAdd(ask.UnsealPrice, transferPrice) + afmt.Printf("Total price for %d bytes: %s\n", size, types.FIL(totalPrice)) + + return nil + }, +} + var clientListRetrievalsCmd = &cli.Command{ Name: "list-retrievals", Usage: "List retrieval market deals", diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 257da9d13..0544a9acc 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -1386,6 +1386,7 @@ Response: "Size": 42, "MinPrice": "0", "UnsealPrice": "0", + "PricePerByte": "0", "PaymentInterval": 42, "PaymentIntervalIncrease": 42, "Miner": "f01234", diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 9624f0e26..c1d6c76e0 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -1425,6 +1425,7 @@ Response: "Size": 42, "MinPrice": "0", "UnsealPrice": "0", + "PricePerByte": "0", "PaymentInterval": 42, "PaymentIntervalIncrease": 42, "Miner": "f01234", diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index eaefe25ce..64b378df3 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -424,12 +424,13 @@ COMMANDS: local List locally imported data stat Print information about a locally stored file (piece size, etc) RETRIEVAL: - find Find data in the network - retrieve Retrieve data from network - cat Show data from network - ls List object links - cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer - list-retrievals List retrieval market deals + find Find data in the network + query-retrieval-ask Get a miner's retrieval ask + retrieve Retrieve data from network + cat Show data from network + ls List object links + cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer + list-retrievals List retrieval market deals STORAGE: deal Initialize storage deal with a miner query-ask Find a miners ask @@ -535,6 +536,23 @@ OPTIONS: ``` +### lotus client query-retrieval-ask +``` +NAME: + lotus client query-retrieval-ask - Get a miner's retrieval ask + +USAGE: + lotus client query-retrieval-ask [command options] [minerAddress] [data CID] + +CATEGORY: + RETRIEVAL + +OPTIONS: + --size value data size in bytes (default: 0) + --help, -h show help (default: false) + +``` + ### lotus client retrieve ``` NAME: diff --git a/itests/kit/client.go b/itests/kit/client.go index c9f8946ec..5ca0ae4fe 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -101,9 +101,14 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) time.Sleep(time.Second) } + // client query-retrieval-ask --size=1 + out = clientCLI.RunCmd("client", "query-retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) + require.Regexp(t, regexp.MustCompile("Ask:"), out) + fmt.Println("retrieval ask:\n", out) + // Retrieve the first file from the Miner // client retrieve - tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-Client") + tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-client") require.NoError(t, err) path := filepath.Join(tmpdir, "outfile.dat") out = clientCLI.RunCmd("client", "retrieve", dataCid.String(), path) diff --git a/node/impl/client/client.go b/node/impl/client/client.go index e3c365fee..7848c84f9 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -490,6 +490,7 @@ func (a *API) makeRetrievalQuery(ctx context.Context, rp rm.RetrievalPeer, paylo Size: queryResponse.Size, MinPrice: queryResponse.PieceRetrievalPrice(), UnsealPrice: queryResponse.UnsealPrice, + PricePerByte: queryResponse.MinPricePerByte, PaymentInterval: queryResponse.MaxPaymentInterval, PaymentIntervalIncrease: queryResponse.MaxPaymentIntervalIncrease, Miner: queryResponse.PaymentAddress, // TODO: check From 0f22d51309cd87b8139da03222492368697deb0c Mon Sep 17 00:00:00 2001 From: dirkmc Date: Fri, 17 Dec 2021 17:54:32 +0100 Subject: [PATCH 116/157] Update cli/client.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Magiera --- cli/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/client.go b/cli/client.go index e576c0b6c..c91d61e21 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1032,7 +1032,7 @@ var clientFindCmd = &cli.Command{ } var clientQueryRetrievalAskCmd = &cli.Command{ - Name: "query-retrieval-ask", + Name: "retrieval-ask", Usage: "Get a miner's retrieval ask", ArgsUsage: "[minerAddress] [data CID]", Flags: []cli.Flag{ From bb56e97177bc8b89229d435b0e1834770b6a6b2f Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Dec 2021 18:01:12 +0100 Subject: [PATCH 117/157] fix: rename query-retrieval-ask to retrieval-ask --- cli/client.go | 2 +- documentation/en/cli-lotus.md | 20 ++++++++++---------- itests/kit/client.go | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cli/client.go b/cli/client.go index c91d61e21..4025b9b56 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1044,7 +1044,7 @@ var clientQueryRetrievalAskCmd = &cli.Command{ Action: func(cctx *cli.Context) error { afmt := NewAppFmt(cctx.App) if cctx.NArg() != 2 { - afmt.Println("Usage: query-retrieval-ask [minerAddress] [data CID]") + afmt.Println("Usage: retrieval-ask [minerAddress] [data CID]") return nil } diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 64b378df3..606921f87 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -424,13 +424,13 @@ COMMANDS: local List locally imported data stat Print information about a locally stored file (piece size, etc) RETRIEVAL: - find Find data in the network - query-retrieval-ask Get a miner's retrieval ask - retrieve Retrieve data from network - cat Show data from network - ls List object links - cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer - list-retrievals List retrieval market deals + find Find data in the network + retrieval-ask Get a miner's retrieval ask + retrieve Retrieve data from network + cat Show data from network + ls List object links + cancel-retrieval Cancel a retrieval deal by deal ID; this also cancels the associated transfer + list-retrievals List retrieval market deals STORAGE: deal Initialize storage deal with a miner query-ask Find a miners ask @@ -536,13 +536,13 @@ OPTIONS: ``` -### lotus client query-retrieval-ask +### lotus client retrieval-ask ``` NAME: - lotus client query-retrieval-ask - Get a miner's retrieval ask + lotus client retrieval-ask - Get a miner's retrieval ask USAGE: - lotus client query-retrieval-ask [command options] [minerAddress] [data CID] + lotus client retrieval-ask [command options] [minerAddress] [data CID] CATEGORY: RETRIEVAL diff --git a/itests/kit/client.go b/itests/kit/client.go index 5ca0ae4fe..4c20e37c1 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -101,8 +101,8 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) time.Sleep(time.Second) } - // client query-retrieval-ask --size=1 - out = clientCLI.RunCmd("client", "query-retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) + // client retrieval-ask --size=1 + out = clientCLI.RunCmd("client", "retrieval-ask", "--size=1", minerAddr.String(), dataCid.String()) require.Regexp(t, regexp.MustCompile("Ask:"), out) fmt.Println("retrieval ask:\n", out) From aa1b77097488d854a9dfc726c9ad036e4af2e0b5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 00:58:20 -0500 Subject: [PATCH 118/157] Rand: Refactor so that versioning lives in StateRand --- chain/gen/genesis/miners.go | 22 +- chain/rand/rand.go | 40 ++- chain/stmgr/stmgr.go | 14 +- chain/vm/runtime.go | 21 +- chain/vm/vm.go | 7 +- conformance/rand_fixed.go | 18 +- conformance/rand_record.go | 28 +- conformance/rand_replay.go | 38 +-- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 624 ++++++++++++------------------------ 10 files changed, 254 insertions(+), 560 deletions(-) diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 666912058..a688a0324 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -510,31 +510,13 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal // TODO: copied from actors test harness, deduplicate or remove from here type fakeRand struct{} -func (fr *fakeRand) GetChainRandomnessV2(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetChainRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint return out, nil } -func (fr *fakeRand) GetChainRandomnessV1(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { - out := make([]byte, 32) - _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint - return out, nil -} - -func (fr *fakeRand) GetBeaconRandomnessV3(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { - out := make([]byte, 32) - _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint - return out, nil -} - -func (fr *fakeRand) GetBeaconRandomnessV2(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { - out := make([]byte, 32) - _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint - return out, nil -} - -func (fr *fakeRand) GetBeaconRandomnessV1(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint return out, nil diff --git a/chain/rand/rand.go b/chain/rand/rand.go index 10eb0436d..6a54a2427 100644 --- a/chain/rand/rand.go +++ b/chain/rand/rand.go @@ -4,6 +4,8 @@ import ( "context" "encoding/binary" + "github.com/filecoin-project/go-state-types/network" + logging "github.com/ipfs/go-log/v2" "github.com/filecoin-project/lotus/chain/beacon" @@ -70,7 +72,7 @@ func (sr *stateRand) GetBeaconRandomnessTipset(ctx context.Context, round abi.Ch return randTs, nil } -func (sr *stateRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { +func (sr *stateRand) getChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { _, span := trace.StartSpan(ctx, "store.GetChainRandomness") defer span.End() span.AddAttributes(trace.Int64Attribute("round", int64(round))) @@ -116,17 +118,7 @@ func NewStateRand(cs *store.ChainStore, blks []cid.Cid, b beacon.Schedule) vm.Ra } // network v0-12 -func (sr *stateRand) GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return sr.GetChainRandomness(ctx, pers, round, entropy, true) -} - -// network v13 and on -func (sr *stateRand) GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return sr.GetChainRandomness(ctx, pers, round, entropy, false) -} - -// network v0-12 -func (sr *stateRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) getBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { randTs, err := sr.GetBeaconRandomnessTipset(ctx, round, true) if err != nil { return nil, err @@ -143,7 +135,7 @@ func (sr *stateRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.Doma } // network v13 -func (sr *stateRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) getBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { randTs, err := sr.GetBeaconRandomnessTipset(ctx, round, false) if err != nil { return nil, err @@ -160,9 +152,9 @@ func (sr *stateRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.Doma } // network v14 and on -func (sr *stateRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) getBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { if filecoinEpoch < 0 { - return sr.GetBeaconRandomnessV2(ctx, pers, filecoinEpoch, entropy) + return sr.getBeaconRandomnessV2(ctx, pers, filecoinEpoch, entropy) } be, err := sr.extractBeaconEntryForEpoch(ctx, filecoinEpoch) @@ -174,6 +166,24 @@ func (sr *stateRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.Doma return DrawRandomness(be.Data, pers, filecoinEpoch, entropy) } +func (sr *stateRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + if nv >= network.Version13 { + return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, false) + } + + return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, true) +} + +func (sr *stateRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + if nv >= network.Version14 { + return sr.getBeaconRandomnessV3(ctx, pers, filecoinEpoch, entropy) + } else if nv == network.Version13 { + return sr.getBeaconRandomnessV2(ctx, pers, filecoinEpoch, entropy) + } else { + return sr.getBeaconRandomnessV1(ctx, pers, filecoinEpoch, entropy) + } +} + func (sr *stateRand) extractBeaconEntryForEpoch(ctx context.Context, filecoinEpoch abi.ChainEpoch) (*types.BeaconEntry, error) { randTs, err := sr.GetBeaconRandomnessTipset(ctx, filecoinEpoch, false) if err != nil { diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index cfd9192f4..06b363733 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -380,13 +380,7 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) rnv := sm.GetNtwkVersion(ctx, randEpoch) - if rnv >= network.Version14 { - return r.GetBeaconRandomnessV3(ctx, personalization, randEpoch, entropy) - } else if rnv == network.Version13 { - return r.GetBeaconRandomnessV2(ctx, personalization, randEpoch, entropy) - } - - return r.GetBeaconRandomnessV1(ctx, personalization, randEpoch, entropy) + return r.GetBeaconRandomness(ctx, rnv, personalization, randEpoch, entropy) } @@ -399,9 +393,5 @@ func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personaliz r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) rnv := sm.GetNtwkVersion(ctx, randEpoch) - if rnv >= network.Version13 { - return r.GetChainRandomnessV2(ctx, personalization, randEpoch, entropy) - } - - return r.GetChainRandomnessV1(ctx, personalization, randEpoch, entropy) + return r.GetChainRandomness(ctx, rnv, personalization, randEpoch, entropy) } diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 3eaa5d69e..9bbed4030 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -224,16 +224,8 @@ func (rt *Runtime) GetActorCodeCID(addr address.Address) (ret cid.Cid, ok bool) } func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - var err error - var res []byte - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - - if rnv >= network.Version13 { - res, err = rt.vm.rand.GetChainRandomnessV2(rt.ctx, personalization, randEpoch, entropy) - } else { - res, err = rt.vm.rand.GetChainRandomnessV1(rt.ctx, personalization, randEpoch, entropy) - } + res, err := rt.vm.rand.GetChainRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get ticket randomness: %s", err)) @@ -242,17 +234,8 @@ func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparat } func (rt *Runtime) GetRandomnessFromBeacon(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - var err error - var res []byte - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - if rnv >= network.Version14 { - res, err = rt.vm.rand.GetBeaconRandomnessV3(rt.ctx, personalization, randEpoch, entropy) - } else if rnv == network.Version13 { - res, err = rt.vm.rand.GetBeaconRandomnessV2(rt.ctx, personalization, randEpoch, entropy) - } else { - res, err = rt.vm.rand.GetBeaconRandomnessV1(rt.ctx, personalization, randEpoch, entropy) - } + res, err := rt.vm.rand.GetBeaconRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get beacon randomness: %s", err)) diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 0f8c2db11..453646030 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -260,11 +260,8 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { } type Rand interface { - GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) + GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) + GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) } type ApplyRet struct { diff --git a/conformance/rand_fixed.go b/conformance/rand_fixed.go index c34980efe..4284f98ff 100644 --- a/conformance/rand_fixed.go +++ b/conformance/rand_fixed.go @@ -3,6 +3,8 @@ package conformance import ( "context" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -19,22 +21,10 @@ func NewFixedRand() vm.Rand { return &fixedRand{} } -func (r *fixedRand) GetChainRandomnessV1(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetChainRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } -func (r *fixedRand) GetChainRandomnessV2(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { - return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. -} - -func (r *fixedRand) GetBeaconRandomnessV3(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { - return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. -} - -func (r *fixedRand) GetBeaconRandomnessV1(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { - return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. -} - -func (r *fixedRand) GetBeaconRandomnessV2(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetBeaconRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } diff --git a/conformance/rand_record.go b/conformance/rand_record.go index 97bd93eb4..f6eeaa6c9 100644 --- a/conformance/rand_record.go +++ b/conformance/rand_record.go @@ -5,6 +5,8 @@ import ( "fmt" "sync" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -45,17 +47,9 @@ func (r *RecordingRand) loadHead() { r.head = head.Key() } -func (r *RecordingRand) GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) getChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) - // FullNode's ChainGetRandomnessFromTickets handles whether we should be looking forward or back + // FullNode's v0 ChainGetRandomnessFromTickets handles whether we should be looking forward or back ret, err := r.api.ChainGetRandomnessFromTickets(ctx, r.head, pers, round, entropy) if err != nil { return ret, err @@ -79,19 +73,7 @@ func (r *RecordingRand) getChainRandomness(ctx context.Context, pers crypto.Doma return ret, err } -func (r *RecordingRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy) -} - -func (r *RecordingRand) getBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) ret, err := r.api.StateGetRandomnessFromBeacon(ctx, pers, round, entropy, r.head) if err != nil { diff --git a/conformance/rand_replay.go b/conformance/rand_replay.go index 5d850f7eb..1907ddf24 100644 --- a/conformance/rand_replay.go +++ b/conformance/rand_replay.go @@ -4,6 +4,8 @@ import ( "bytes" "context" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -43,15 +45,7 @@ func (r *ReplayingRand) match(requested schema.RandomnessRule) ([]byte, bool) { return nil, false } -func (r *ReplayingRand) GetChainRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy, false) -} - -func (r *ReplayingRand) GetChainRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getChainRandomness(ctx, pers, round, entropy, true) -} - -func (r *ReplayingRand) getChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { +func (r *ReplayingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessChain, DomainSeparationTag: int64(pers), @@ -66,26 +60,10 @@ func (r *ReplayingRand) getChainRandomness(ctx context.Context, pers crypto.Doma r.reporter.Logf("returning fallback chain randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - if lookback { - return r.fallback.GetChainRandomnessV1(ctx, pers, round, entropy) - } - - return r.fallback.GetChainRandomnessV2(ctx, pers, round, entropy) + return r.fallback.GetChainRandomness(ctx, nv, pers, round, entropy) } -func (r *ReplayingRand) GetBeaconRandomnessV3(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy, false) -} - -func (r *ReplayingRand) GetBeaconRandomnessV1(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy, true) -} - -func (r *ReplayingRand) GetBeaconRandomnessV2(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { - return r.getBeaconRandomness(ctx, pers, round, entropy, true) -} - -func (r *ReplayingRand) getBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte, lookback bool) ([]byte, error) { +func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessBeacon, DomainSeparationTag: int64(pers), @@ -100,9 +78,5 @@ func (r *ReplayingRand) getBeaconRandomness(ctx context.Context, pers crypto.Dom r.reporter.Logf("returning fallback beacon randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - if lookback { - return r.fallback.GetBeaconRandomnessV1(ctx, pers, round, entropy) - } - - return r.fallback.GetBeaconRandomnessV3(ctx, pers, round, entropy) + return r.fallback.GetBeaconRandomness(ctx, nv, pers, round, entropy) } diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 472a38357..e7d03c23b 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -6,7 +6,7 @@ require ( contrib.go.opencensus.io/exporter/prometheus v0.4.0 github.com/codeskyblue/go-sh v0.0.0-20200712050446-30169cf553fe github.com/davecgh/go-spew v1.1.1 - github.com/drand/drand v1.2.8-0.20211214135232-3ce1e81cdbcc + github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-markets v1.13.5 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 325c08fdb..c16a429cc 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -37,15 +37,7 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -<<<<<<< HEAD -contrib.go.opencensus.io/exporter/jaeger v0.1.0/go.mod h1:VYianECmuFPwU37O699Vc1GOcy+y8kOsfaxHRImmjbA= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= -contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= -======= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= ->>>>>>> master contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -86,10 +78,7 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -<<<<<<< HEAD -======= github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= ->>>>>>> master github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -99,20 +88,12 @@ github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -<<<<<<< HEAD -github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= -github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= -======= github.com/GeertJohan/go.rice v1.0.2 h1:PtRw+Tg3oa3HYwiDBZyvOJ8LdIyf6lAovJJtr7YOAYk= ->>>>>>> master github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -<<<<<<< HEAD -======= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= ->>>>>>> master github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= @@ -133,12 +114,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/SAP/go-hdb v0.14.1/go.mod h1:7fdQLVC2lER3urZLjZCm0AuMQfApof92n3aylBPEkMo= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -<<<<<<< HEAD -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -======= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= ->>>>>>> master github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= @@ -204,11 +180,11 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7y github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= -github.com/benbjohnson/clock v1.0.1/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= +github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/tmpl v1.0.0/go.mod h1:igT620JFIi44B6awvU9IsDhR77IXWtFigTLil/RPdps= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -243,12 +219,7 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -<<<<<<< HEAD -github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4= -github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= -======= github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM= ->>>>>>> master github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= @@ -259,15 +230,11 @@ github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -<<<<<<< HEAD -======= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= ->>>>>>> master github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= @@ -277,6 +244,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5O github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= @@ -287,11 +255,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/pebble v0.0.0-20200916222308-4e219a90ba5b/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07/go.mod h1:hU7vhtrqonEphNF+xt8/lHdaBprxmV1h8BOGrd9XwmQ= -github.com/cockroachdb/redact v0.0.0-20200622112456-cd282804bbd3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= @@ -312,10 +275,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -<<<<<<< HEAD -======= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= ->>>>>>> master github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= @@ -353,13 +313,12 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.0.3/go.mod h1:3KY8+bsP8wI0OEnQJAKpd4wIJW/Mm32yw2j/9FUVnIM= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -373,12 +332,13 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= -github.com/drand/drand v1.2.1 h1:KB7z+69YbnQ5z22AH/LMi0ObDR8DzYmrkS6vZXTR9jI= -github.com/drand/drand v1.2.1/go.mod h1:j0P7RGmVaY7E/OuO2yQOcQj7OgeZCuhgu2gdv0JAm+g= +github.com/drand/drand v1.3.0 h1:k/w/PtHzmlU6OmfoAqgirWyrJ4FZH8ESlJrsKF20UkM= +github.com/drand/drand v1.3.0/go.mod h1:D6kAVlxufq1gi71YCGfzN455JrXF4Q272ZJEG975fzo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= -github.com/drand/kyber v1.1.4 h1:YvKM03QWGvLrdTnYmxxP5iURAX+Gdb6qRDUOgg8i60Q= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= +github.com/drand/kyber v1.1.7 h1:YnOshFoGYSOdhf4K8BiDw4XL/l6caL92vsodAsVQbJI= +github.com/drand/kyber v1.1.7/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= @@ -390,20 +350,12 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -<<<<<<< HEAD -github.com/elastic/go-sysinfo v1.3.0 h1:eb2XFGTMlSwG/yyU9Y8jVAYLIzU2sFzWXwo2gmetyrE= -github.com/elastic/go-sysinfo v1.3.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -======= github.com/elastic/go-sysinfo v1.7.0 h1:4vVvcfi255+8+TyQ7TYUTEK3A+G8v5FLE+ZKYL1z1Dg= ->>>>>>> master github.com/elastic/go-sysinfo v1.7.0/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -<<<<<<< HEAD -======= github.com/elastic/gosigar v0.14.1 h1:T0aQ7n/n2ZA9W7DmAnj60v+qzqKERdBgJBO1CG2W6rc= ->>>>>>> master github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= @@ -425,20 +377,14 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.8.0/go.mod h1:3l45GVGkyrnYNl9HoIjnp2NnNWvh6hLAqD8yTfGjnw8= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -<<<<<<< HEAD -======= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= ->>>>>>> master github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= +github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= +github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= -<<<<<<< HEAD -======= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= ->>>>>>> master github.com/filecoin-project/go-address v0.0.6/go.mod h1:7B0/5DA13n6nHkB8bbGx1gWzG/dbTsZ0fgOJVGsM3TE= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0 h1:t6qDiuGYYngDqaLc2ZUvdtAg4UNxPeOYaXhBWSNsVaM= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= @@ -450,47 +396,25 @@ github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQj github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -<<<<<<< HEAD -github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7 h1:U9Z+76pHCKBmtdxFV7JFZJj7OVm12I6dEKwtMVbq5p0= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= -github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= -github.com/filecoin-project/go-data-transfer v1.10.1 h1:YQNLwhizxkdfFxegAyrnn3l7WjgMjqDlqFzr18iWiYI= -github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= -======= github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= +github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= ->>>>>>> master -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -<<<<<<< HEAD -github.com/filecoin-project/go-fil-markets v1.12.0 h1:RpU5bLaMADVrU4CgLxKMGHC2ZUocNV35uINxogQCf00= -github.com/filecoin-project/go-fil-markets v1.12.0/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= -======= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= ->>>>>>> master -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= +github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -498,20 +422,11 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -<<<<<<< HEAD -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -======= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= ->>>>>>> master github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -<<<<<<< HEAD -======= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= ->>>>>>> master github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= @@ -522,52 +437,41 @@ github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -<<<<<<< HEAD -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -======= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379 h1:UmKkt13NrtulubqfNXhG7SQ7Pjza8BeKdNBxngqAo64= -github.com/filecoin-project/go-state-types v0.1.1-0.20210915140513-d354ccf10379/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= ->>>>>>> master github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= -github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= -github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= +github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= +github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= +github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v2 v2.3.5 h1:PbT4tPlSXZ8sRgajhb4D8AOEmiaaZ+jg6tc6BBv8VQc= -github.com/filecoin-project/specs-actors/v2 v2.3.5/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v2 v2.3.6 h1:UxnWTfQd7JsOae39/aHCK0m1IBjdcyymCJfqxuSkn+g= +github.com/filecoin-project/specs-actors/v2 v2.3.6/go.mod h1:DJMpxVRXvev9t8P0XWA26RmTzN+MHiL9IlItVLT0zUc= github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v3 v3.1.1 h1:BE8fsns1GnEOxt1DTE5LxBK2FThXtWmCChgcJoHTg0E= github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= -<<<<<<< HEAD github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= +github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211104150953-8bd473fc487a/go.mod h1:F3/N4dIRgwEcSk7xp3RizaVyBE/Jlzhv9Le1/ZH50ZA= -======= -github.com/filecoin-project/specs-actors/v6 v6.0.0 h1:i+16MFE8GScWWUF0kG7x2RZ5Hqpz0CeyBHTpnijCJ6I= -github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= ->>>>>>> master -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= -github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= +github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -578,25 +482,19 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -<<<<<<< HEAD -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 h1:EzDjxMg43q1tA2c0MV3tNbaontnHLplHyFF6M5KiVP0= -github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1/go.mod h1:0eHX/BVySxPc6SE2mZRoppGq7qcEagxdmQnA3dzork8= -======= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= ->>>>>>> master github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U4= github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -614,32 +512,19 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -<<<<<<< HEAD -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -======= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= ->>>>>>> master github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -<<<<<<< HEAD -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -======= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= ->>>>>>> master github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -740,10 +625,7 @@ github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY9 github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968 h1:s+PDl6lozQ+dEUtUtQnO7+A2iPG3sK1pI4liU+jxn90= github.com/godbus/dbus v0.0.0-20190402143921-271e53dc4968/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -<<<<<<< HEAD -======= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= ->>>>>>> master github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -768,15 +650,14 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -<<<<<<< HEAD -======= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= ->>>>>>> master github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -809,11 +690,7 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -<<<<<<< HEAD -======= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= ->>>>>>> master github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -831,10 +708,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -<<<<<<< HEAD -======= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= ->>>>>>> master github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -893,7 +767,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= @@ -967,13 +840,9 @@ github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0 github.com/iancoleman/orderedmap v0.1.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= -<<<<<<< HEAD -github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= -======= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 h1:9tcYMdi+7Rb1y0E9Del1DRHui7Ne3za5lLw6CjMJv/M= github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94/go.mod h1:GYeBD1CF7AqnKZK+UCytLcY3G+UKo0ByXX/3xfdNyqQ= github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= ->>>>>>> master github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -987,10 +856,7 @@ github.com/influxdata/influxdb v1.9.4/go.mod h1:dR0WCHqaHPpJLaqWnRSl/QHsbXJR+Qpo github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200515024757-02f0bf5dbca3/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -<<<<<<< HEAD -======= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= ->>>>>>> master github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= github.com/influxdata/influxql v1.1.1-0.20210223160523-b6ab99450c93/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= @@ -1008,23 +874,16 @@ github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyq github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= -github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= +github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= -<<<<<<< HEAD -======= -github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= ->>>>>>> master -github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= +github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= +github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -1034,7 +893,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -1043,15 +901,15 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.6 h1:zU2cmweykxJ+ziXnA2cPtsLe8rdR/vrthOipLPuf6kc= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= +github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= +github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -1059,47 +917,33 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger v0.2.7 h1:ju5REfIm+v+wgVnQ19xGLYPHYHbYLR6qJfmMbCDSK1I= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= -github.com/ipfs/go-ds-badger2 v0.1.0/go.mod h1:pbR1p817OZbdId9EvLOhKBgUVTM3BMCSTan78lDDVaw= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e h1:Xi1nil8K2lBOorBS6Ys7+hmUCzH8fr3U9ipdL/IrcEI= -github.com/ipfs/go-ds-badger2 v0.1.1-0.20200708190120-187fc06f714e/go.mod h1:lJnws7amT9Ehqzta0gwMrRsURU04caT0iRPr1W8AsOU= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= +github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= +github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2 h1:QmQoAJ9WkPMUfBLnu1sBVy0xWWlJPg0m4kRAiJL9iaw= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-measure v0.1.0 h1:vE4TyY4aeLeVgnnPBC5QzKIjKrqzha0NCujTfgvVbVQ= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= -github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459/go.mod h1:oh4liWHulKcDKVhCska5NLelE3MatWl+1FwSz3tY91g= -github.com/ipfs/go-filestore v1.0.0 h1:QR7ekKH+q2AGiWDc7W2Q0qHuYSRZGUJqUn0GsegEPb0= -github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPiFOdcuu9SM= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= +github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= +github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= +github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -<<<<<<< HEAD -github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= -github.com/ipfs/go-graphsync v0.9.1 h1:jo7ZaAZ3lal89RhKxKoRkPzIO8lmOY6KUWA1mDRZ2+U= -github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -======= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= ->>>>>>> master -github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= +github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= -github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= -github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= +github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= +github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= +github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= +github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= @@ -1114,19 +958,19 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0 h1:bEQ8hMGs80h0sR8O4tfDgV6B01aaF9qeTrujrTLYV3g= github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1 h1:LJXIo9W7CAmugqI+uofioIpRb6rY30GUu7G6LUfpMvM= +github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= +github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1 h1:P56jYKZF7lDDOLx5SotVh5KFxoY6C81I1NSHW1FxGew= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0 h1:TiMekCrOGQuWYtZO3mf4YJXDIdNgnKWZ9IE3fGlnWfo= +github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1 h1:mEiXWdbMN6C7vtDG21Fphx8TGCbZPpQnz/496w/PL4g= +github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.4/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= github.com/ipfs/go-ipfs-files v0.0.8/go.mod h1:wiN/jSG8FKyk7N0WyctKSvq3ljIa2NNTiZB55kpTdOs= -<<<<<<< HEAD -======= github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkgFEg= ->>>>>>> master github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= @@ -1136,26 +980,26 @@ github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7 github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= -github.com/ipfs/go-ipfs-routing v0.1.0 h1:gAJTT1cEeeLj6/DlLX6t+NxD9fQe2ymTO6qWRDI/HQQ= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= +github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= +github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= +github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= +github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -<<<<<<< HEAD -======= -github.com/ipfs/go-ipld-legacy v0.1.0 h1:wxkkc4k8cnvIGIjPO0waJCe7SHEyFgl+yQdafdjGrpA= ->>>>>>> master github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= +github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= +github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -1175,18 +1019,15 @@ github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHn github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0 h1:31Re/cPqFHpsRHgyVwjWADPoF0otB1WrjTy8ZFYwEZU= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= +github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= +github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -<<<<<<< HEAD -======= -github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= ->>>>>>> master -github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= +github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= +github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= @@ -1194,13 +1035,8 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -<<<<<<< HEAD -======= -github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= ->>>>>>> master -github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= @@ -1215,49 +1051,30 @@ github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdm github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= -github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -<<<<<<< HEAD -github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= -github.com/ipld/go-car v0.3.1-null-padded-files h1:FMD0Ce4tAM9P5aq7yklw2jnVK3ZuoJ4xK6vkL9VLmxs= -github.com/ipld/go-car v0.3.1-null-padded-files/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= -======= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= ->>>>>>> master -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= +github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= +github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= +github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785/go.mod h1:bDDSvVz7vaK12FNvMeRYnpRFkSUPNQOiCYQezMD/P3w= -github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= -github.com/ipld/go-ipld-prime v0.5.1-0.20200828233916-988837377a7f/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= -github.com/ipld/go-ipld-prime v0.5.1-0.20201021195245-109253e8a018/go.mod h1:0xEgdD6MKbZ1vF0GC+YcR/C4SQCAlRuOjIJ2i0HxqzM= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -<<<<<<< HEAD -github.com/ipld/go-ipld-prime v0.12.0 h1:JapyKWTsJgmhrPI7hfx4V798c/RClr85sXfBZnH1VIw= -github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -======= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= ->>>>>>> master github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= +github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= -github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -<<<<<<< HEAD -======= -github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= ->>>>>>> master -github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= +github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= +github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= +github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1265,7 +1082,6 @@ github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU= @@ -1288,8 +1104,9 @@ github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8 github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -1335,16 +1152,12 @@ github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -<<<<<<< HEAD -======= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= ->>>>>>> master github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -1361,8 +1174,9 @@ github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -1386,8 +1200,9 @@ github.com/libp2p/go-conn-security v0.0.1/go.mod h1:bGmu51N0KU9IEjX7kl2PQjgZa40J github.com/libp2p/go-conn-security-multistream v0.0.2/go.mod h1:nc9vud7inQ+d6SO0I/6dSWrdMnHnzZNHeyUQqrAJulE= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1 h1:ft6/POSK7F+vl/2qzegnHDaXFU0iWB4yVTYrioC6Zy0= github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= +github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= +github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= @@ -1401,21 +1216,20 @@ github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68 github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= github.com/libp2p/go-libp2p v0.3.1/go.mod h1:e6bwxbdYH1HqWTz8faTChKGR0BjPc8p+6SyP8GTTR7Y= github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI= -github.com/libp2p/go-libp2p v0.6.0/go.mod h1:mfKWI7Soz3ABX+XEBR61lGbg+ewyMtJHVt043oWeqwg= github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= +github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= +github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= +github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= +github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= +github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= +github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1423,17 +1237,19 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-autonat v0.4.2 h1:YMp7StMi2dof+baaxkbxaizXjY1RPvU71CXfxExzcUU= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= +github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= +github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= +github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0 h1:3EsGAi0CBGcZ33GwRuXEYJLLPoVWyXJ1bcJzAJjINkk= github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= +github.com/libp2p/go-libp2p-blankhost v0.3.0 h1:kTnLArltMabZlzY63pgGDA4kkUcLkBFSM98zBssn/IY= +github.com/libp2p/go-libp2p-blankhost v0.3.0/go.mod h1:urPC+7U01nCGgJ3ZsV8jdwTp6Ji9ID0dMTvq+aJ+nZU= github.com/libp2p/go-libp2p-circuit v0.0.9/go.mod h1:uU+IBvEQzCu953/ps7bYzC/D/R0Ho2A9LfKVVCatlqU= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= @@ -1445,9 +1261,9 @@ github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCy github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= -github.com/libp2p/go-libp2p-connmgr v0.2.3/go.mod h1:Gqjg29zI8CwXX21zRxy6gOg8VYu3zVerJRt2KyktzH4= -github.com/libp2p/go-libp2p-connmgr v0.2.4 h1:TMS0vc0TCBomtQJyWr7fYxcVYYhx+q/2gF++G5Jkl/w= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= +github.com/libp2p/go-libp2p-connmgr v0.3.0 h1:yerFXrYa0oxpuVsLlndwm/bLulouHYDcvFrY/4H4fx8= +github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= @@ -1477,8 +1293,12 @@ github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.6/go.mod h1:dgHr0l0hIKfWpGpqAMbpo19pen9wJfdCGv51mTmdpmM= -github.com/libp2p/go-libp2p-core v0.9.0 h1:t97Mv0LIBZlP2FXVRNKKVzHJCIjbIWGxYptGId4+htU= github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmkSRCqZ0kQtJ2/8= +github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.13.0 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= +github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1489,8 +1309,8 @@ github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfx github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= +github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1498,8 +1318,8 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.13.0 h1:qBNYzee8BVS6RkD8ukIAGRG6LmVz8+kkeponyI7W+yA= -github.com/libp2p/go-libp2p-kad-dht v0.13.0/go.mod h1:NkGf28RNhPrcsGYWJHm6EH8ULkiJ2qxsWmpE7VTL3LI= +github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= +github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= github.com/libp2p/go-libp2p-kbucket v0.4.7 h1:spZAcgxifvFZHBD8tErvppbnNiKA5uokDu3CV7axu70= @@ -1518,17 +1338,17 @@ github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aD github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6 h1:wMWis3kYynCbHoyKLPBEMu4YRLltbm8Mk08HGSfvTkU= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= +github.com/libp2p/go-libp2p-nat v0.1.0 h1:vigUi2MEN+fwghe5ijpScxtbbDz+L/6y8XwlzYOJgSY= +github.com/libp2p/go-libp2p-nat v0.1.0/go.mod h1:DQzAG+QbDYjN1/C3B6vXucLtz3u9rEonLVPtZVzQqks= github.com/libp2p/go-libp2p-net v0.0.1/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8EgNU9DrCcR8c= github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2 h1:MRt5XGfYziDXIUy2udtMWfPmzZqUDYoC1FZoKnqPzwk= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= +github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= github.com/libp2p/go-libp2p-peer v0.1.1/go.mod h1:jkF12jGB4Gk/IOo+yomm+7oLWxF278F7UnrYUQ1Q8es= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -1545,30 +1365,27 @@ github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= github.com/libp2p/go-libp2p-peerstore v0.2.8/go.mod h1:gGiPlXdz7mIHd2vfAsHzBNAMqSDkt2UBFwgcITgw1lA= -<<<<<<< HEAD -github.com/libp2p/go-libp2p-peerstore v0.2.9 h1:tVa7siDymmzOl3b3+SxPYpQUCnicmK13y6Re1PqWK+g= -github.com/libp2p/go-libp2p-peerstore v0.2.9/go.mod h1:zhBaLzxiWpNGQ3+uI17G/OIjmOD8GxKyFuHbrZbgs0w= -======= -github.com/libp2p/go-libp2p-peerstore v0.3.0 h1:wp/G0+37+GLr7tu+wE+4GWNrA3uxKg6IPRigIMSS5oQ= ->>>>>>> master -github.com/libp2p/go-libp2p-peerstore v0.3.0/go.mod h1:fNX9WlOENMvdx/YD7YO/5Hkrn8+lQIk5A39BHa1HIrM= +github.com/libp2p/go-libp2p-peerstore v0.4.0/go.mod h1:rDJUFyzEWPpXpEwywkcTYYzDHlwza8riYMaUzaN6hX0= +github.com/libp2p/go-libp2p-peerstore v0.6.0 h1:HJminhQSGISBIRb93N6WK3t6Fa8OOTnHd/VBjL4mY5A= +github.com/libp2p/go-libp2p-peerstore v0.6.0/go.mod h1:DGEmKdXrcYpK9Jha3sS7MhqYdInxJy84bIPtSu65bKc= github.com/libp2p/go-libp2p-pnet v0.2.0 h1:J6htxttBipJujEjz1y0a5+eYoiPcFHhSYHH6na5f0/k= github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.5.4 h1:rHl9/Xok4zX3zgi0pg0XnUj9Xj2OeXO8oTu85q2+YA8= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= +github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= +github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= +github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= +github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -1593,10 +1410,11 @@ github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-swarm v0.5.3 h1:hsYaD/y6+kZff1o1Mc56NcuwSg80lIphTS/zDk3mO4M= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= +github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= +github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= +github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1606,22 +1424,26 @@ github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eq github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.4.2 h1:IOiA5mMigi+eEjf4J+B7fepDhsjtsoWA9QbsCqbNp5U= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= +github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= +github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0 h1:N8i5wPiHudA+02sfW85R2nUbybPm7agjAywZc6pd3xA= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= +github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= +github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= +github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-transport v0.0.1/go.mod h1:UzbUs9X+PHOSw7S3ZmeOxfnwaQY5vGDzZmKPod3N3tk= github.com/libp2p/go-libp2p-transport v0.0.5/go.mod h1:StoY3sx6IqsP6XKoabsPnHCwqKXWUMWU7Rfcsubee/A= github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2kn/m1w6YXxcIAYJYeI90h6BGgUc= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.6 h1:SHt3g0FslnqIkEWF25YOB8UCOCTpGAVvHRWQYJ+veiI= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= +github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= +github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1633,10 +1455,10 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= -github.com/libp2p/go-libp2p-yamux v0.5.4 h1:/UOPtT/6DHPtr3TtKXBHa6g0Le0szYuI33Xc/Xpd7fQ= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= +github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= +github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= +github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1653,12 +1475,14 @@ github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6 h1:lQ7Uc0kS1wb1EfRxO2Eir/RJoHkHn7t6o+EiwsYIKJA= github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= +github.com/libp2p/go-msgio v0.1.0 h1:8Q7g/528ivAlfXTFWvWhVjTE8XG8sDTkRUKPYh9+5Q8= +github.com/libp2p/go-msgio v0.1.0/go.mod h1:eNlv2vy9V2X/kNldcZ+SShFE++o2Yjxwx6RAYsmgJnE= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5 h1:qxnwkco8RLKqVh1NmjQ+tJ8p8khNLFxuElYG/TwqW4Q= github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= @@ -1671,13 +1495,15 @@ github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= +github.com/libp2p/go-reuseport v0.1.0 h1:0ooKOx2iwyIkf339WCZ2HN3ujTDbkK0PjC7JVoP1AiM= +github.com/libp2p/go-reuseport v0.1.0/go.mod h1:bQVn9hmfcTaoo0c9v5pBhOarsU1eNOBZdaAd2hzXRKU= github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-reuseport-transport v0.0.5 h1:lJzi+vSYbyJj2faPKLxNGWEIBcaV/uJmyvsUxXy2mLw= github.com/libp2p/go-reuseport-transport v0.0.5/go.mod h1:TC62hhPc8qs5c/RoXDZG6YmjK+/YWUPC0yYmeUecbjc= +github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7CyD1zuN7xQT8gc= +github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= @@ -1692,11 +1518,11 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= +github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= +github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1714,32 +1540,29 @@ github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.6/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= -github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.2.0 h1:RwtpYZ2/wVviZ5+3pjC8qdQ4TKnrak0/E01N1UWoAFU= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= +github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= +github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= +github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -<<<<<<< HEAD -======= github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= ->>>>>>> master github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1759,12 +1582,12 @@ github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZb github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -1775,10 +1598,7 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -<<<<<<< HEAD -======= github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= ->>>>>>> master github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1790,10 +1610,7 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -<<<<<<< HEAD -======= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= ->>>>>>> master github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1819,7 +1636,6 @@ github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1868,10 +1684,7 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -<<<<<<< HEAD -======= github.com/multiformats/go-base32 v0.0.4 h1:+qMh4a2f37b4xTNs6mqitDinryCI+tfO2dRVMN9mjSE= ->>>>>>> master github.com/multiformats/go-base32 v0.0.4/go.mod h1:jNLFzjPZtp3aIARHbJRZIaPuspdH0J6q39uUM5pnABM= github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= @@ -1887,10 +1700,7 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -<<<<<<< HEAD -======= github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= ->>>>>>> master github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1915,10 +1725,9 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1927,16 +1736,12 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -<<<<<<< HEAD -======= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= ->>>>>>> master -github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1968,12 +1773,7 @@ github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= -<<<<<<< HEAD -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -======= github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0twVUow= ->>>>>>> master github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -2074,7 +1874,6 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -2112,22 +1911,18 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= -<<<<<<< HEAD -======= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= ->>>>>>> master github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.0.1 h1:qgm3DIJAeb+2byneLrQJ7kvmDLGxN2vy3apXyGaDKN4= -github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= +github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= +github.com/raulk/go-watchdog v1.2.0/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6RcA1i4mlqI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -2141,6 +1936,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -2315,7 +2112,6 @@ github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIf github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20191216205031-b047b6acb3c0/go.mod h1:xdlJQaiqipF0HW+Mzpg7XRM3fWbGvfgFlcppuvlkIvY= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200414195334-429a0b5e922e/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20200504204219-64967432584d/go.mod h1:W5MvapuoHRP8rz4vxjwCK1pDqF1aQcWsV5PZ+AHbqdg= github.com/whyrusleeping/cbor-gen v0.0.0-20200710004633-5379fc63235d/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -2369,6 +2165,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.12.1 h1:hYRcyznPRJp+5mzF2sazTLP2nGvGjYDD2VzhHhFomLU= @@ -2404,13 +2201,23 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.6-0.20201102222123-380f4078db9f/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= +go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= +go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= +go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= +go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2426,10 +2233,7 @@ go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -<<<<<<< HEAD -======= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= ->>>>>>> master go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2449,10 +2253,7 @@ go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -<<<<<<< HEAD -======= go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= ->>>>>>> master go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= @@ -2488,7 +2289,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2511,11 +2311,9 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -<<<<<<< HEAD -======= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= ->>>>>>> master golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2531,7 +2329,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20210615023648-acb5c1269671/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210714144626-1041f73d31d8/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= golang.org/x/exp v0.0.0-20210715201039-d37aa40e8013 h1:Jp57DBw4K7mimZNA3F9f7CndVcUt4kJjmyJf2rzJHoI= @@ -2550,10 +2347,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -<<<<<<< HEAD -======= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= ->>>>>>> master golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -2565,7 +2359,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2619,10 +2412,8 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200519113804-d87ec0cfa476/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2638,14 +2429,11 @@ golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -<<<<<<< HEAD -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -======= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= ->>>>>>> master golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2774,6 +2562,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2781,13 +2570,12 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -<<<<<<< HEAD -======= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw= ->>>>>>> master golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= @@ -2884,16 +2672,15 @@ golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200827010519-17fd2f27a9e3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2970,16 +2757,12 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -<<<<<<< HEAD -======= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 h1:ysnBoUyeL/H6RCvNRhWHjKoDEmguI+mPU+qHgK8qv/w= ->>>>>>> master google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -3085,6 +2868,9 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= From 27e48d73dd3f2f34d1c552d04dace588941a103f Mon Sep 17 00:00:00 2001 From: gstuart Date: Fri, 10 Dec 2021 21:04:32 -0500 Subject: [PATCH 119/157] Check if sector exists before changing its state --- cmd/lotus-miner/sectors.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 43a71fd9e..b2059a737 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1648,6 +1648,11 @@ var sectorsUpdateCmd = &cli.Command{ return xerrors.Errorf("could not parse sector number: %w", err) } + _, err = nodeApi.SectorsStatus(ctx, abi.SectorNumber(id), false) + if err != nil { + return xerrors.Errorf("sector %d not found, could not change state", id) + } + newState := cctx.Args().Get(1) if _, ok := sealing.ExistSectorStateList[sealing.SectorState(newState)]; !ok { fmt.Printf(" \"%s\" is not a valid state. Possible states for sectors are: \n", newState) From 3f4eaa99d5c4c13c38308f677f39bbbd4290af98 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 18:43:39 -0500 Subject: [PATCH 120/157] Refactor: State: Rename stmgr::GetNtwkVersion to GetNetworkVersion --- chain/consensus/filcns/compute_state.go | 2 +- chain/consensus/filcns/filecoin.go | 8 ++++---- chain/stmgr/actors.go | 4 ++-- chain/stmgr/call.go | 4 ++-- chain/stmgr/stmgr.go | 6 +++--- chain/stmgr/utils.go | 4 ++-- cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go | 4 ++-- cmd/lotus-sim/simulation/simulation.go | 2 +- cmd/lotus-sim/simulation/step.go | 4 ++-- conformance/driver.go | 2 +- node/impl/full/state.go | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 7000af303..6a25e6df2 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -101,7 +101,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager Actors: NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: baseFee, LookbackState: stmgr.LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 328fc8ec1..6d4c8da64 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -95,7 +95,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) return xerrors.Errorf("load parent tipset failed (%s): %w", h.Parents, err) } - winPoStNv := filec.sm.GetNtwkVersion(ctx, baseTs.Height()) + winPoStNv := filec.sm.GetNetworkVersion(ctx, baseTs.Height()) lbts, lbst, err := stmgr.GetLookbackTipSetForRound(ctx, filec.sm, baseTs, h.Height) if err != nil { @@ -457,7 +457,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl return xerrors.Errorf("failed to load base state tree: %w", err) } - nv := filec.sm.GetNtwkVersion(ctx, b.Header.Height) + nv := filec.sm.GetNetworkVersion(ctx, b.Header.Height) pl := vm.PricelistByEpoch(baseTs.Height()) var sumGasLimit int64 checkMsg := func(msg types.ChainMsg) error { @@ -479,7 +479,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl // Phase 2: (Partial) semantic validation: // the sender exists and is an account actor, and the nonces make sense var sender address.Address - if filec.sm.GetNtwkVersion(ctx, b.Header.Height) >= network.Version13 { + if filec.sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version13 { sender, err = st.LookupID(m.From) if err != nil { return err @@ -532,7 +532,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl smArr := blockadt.MakeEmptyArray(tmpstore) for i, m := range b.SecpkMessages { - if filec.sm.GetNtwkVersion(ctx, b.Header.Height) >= network.Version14 { + if filec.sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version14 { if m.Signature.Type != crypto.SigTypeSecp256k1 { return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) } diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index 6804b8126..a8958ee4c 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -358,7 +358,7 @@ func MinerGetBaseInfo(ctx context.Context, sm *StateManager, bcs beacon.Schedule return nil, xerrors.Errorf("failed to get randomness for winning post: %w", err) } - nv := sm.GetNtwkVersion(ctx, ts.Height()) + nv := sm.GetNetworkVersion(ctx, ts.Height()) sectors, err := GetSectorsForWinningPoSt(ctx, nv, pv, sm, lbst, maddr, prand) if err != nil { @@ -420,7 +420,7 @@ func MinerEligibleToMine(ctx context.Context, sm *StateManager, addr address.Add hmp, err := minerHasMinPower(ctx, sm, addr, lookbackTs) // TODO: We're blurring the lines between a "runtime network version" and a "Lotus upgrade epoch", is that unavoidable? - if sm.GetNtwkVersion(ctx, baseTs.Height()) <= network.Version3 { + if sm.GetNetworkVersion(ctx, baseTs.Height()) <= network.Version3 { return hmp, err } diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index ef29e1659..2d5d64ae7 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -80,7 +80,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: types.NewInt(0), LookbackState: LookbackStateGetterForTipset(sm, ts), } @@ -204,7 +204,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index 06b363733..b19dd62c4 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -356,7 +356,7 @@ func (sm *StateManager) VMConstructor() func(context.Context, *vm.VMOpts) (*vm.V } } -func (sm *StateManager) GetNtwkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { +func (sm *StateManager) GetNetworkVersion(ctx context.Context, height abi.ChainEpoch) network.Version { // The epochs here are the _last_ epoch for every version, or -1 if the // version is disabled. for _, spec := range sm.networkVersions { @@ -378,7 +378,7 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza } r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNtwkVersion(ctx, randEpoch) + rnv := sm.GetNetworkVersion(ctx, randEpoch) return r.GetBeaconRandomness(ctx, rnv, personalization, randEpoch, entropy) @@ -391,7 +391,7 @@ func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personaliz } r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNtwkVersion(ctx, randEpoch) + rnv := sm.GetNetworkVersion(ctx, randEpoch) return r.GetChainRandomness(ctx, rnv, personalization, randEpoch, entropy) } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 8b0f8daeb..5f23ce630 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -88,7 +88,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch, Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } @@ -128,7 +128,7 @@ func LookbackStateGetterForTipset(sm *StateManager, ts *types.TipSet) vm.Lookbac func GetLookbackTipSetForRound(ctx context.Context, sm *StateManager, ts *types.TipSet, round abi.ChainEpoch) (*types.TipSet, cid.Cid, error) { var lbr abi.ChainEpoch - lb := policy.GetWinningPoStSectorSetLookback(sm.GetNtwkVersion(ctx, round)) + lb := policy.GetWinningPoStSectorSetLookback(sm.GetNetworkVersion(ctx, round)) if round > lb { lbr = round - lb } diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index a6353e4f4..c656a8208 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -88,7 +88,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S Actors: filcns.NewActorRegistry(), Syscalls: sm.VMSys(), CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, BaseFee: abi.NewTokenAmount(0), LookbackState: stmgr.LookbackStateGetterForTipset(sm, parentTs), } @@ -265,7 +265,7 @@ func (bb *BlockBuilder) Height() abi.ChainEpoch { // NetworkVersion returns the network version for the target block. func (bb *BlockBuilder) NetworkVersion() network.Version { - return bb.sm.GetNtwkVersion(bb.ctx, bb.Height()) + return bb.sm.GetNetworkVersion(bb.ctx, bb.Height()) } // StateManager returns the stmgr.StateManager. diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index 5747afe4d..21e8bff71 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -159,7 +159,7 @@ func (sim *Simulation) GetStart() *types.TipSet { // GetNetworkVersion returns the current network version for the simulation. func (sim *Simulation) GetNetworkVersion() network.Version { - return sim.StateManager.GetNtwkVersion(context.TODO(), sim.head.Height()) + return sim.StateManager.GetNetworkVersion(context.TODO(), sim.head.Height()) } // SetHead updates the current head of the simulation and stores it in the metadata store. This is diff --git a/cmd/lotus-sim/simulation/step.go b/cmd/lotus-sim/simulation/step.go index 902f2ad6c..f9d58529e 100644 --- a/cmd/lotus-sim/simulation/step.go +++ b/cmd/lotus-sim/simulation/step.go @@ -41,8 +41,8 @@ func (sim *Simulation) popNextMessages(ctx context.Context) ([]*types.Message, e // This isn't what the network does, but it makes things easier. Otherwise, we'd need to run // migrations before this epoch and I'd rather not deal with that. nextHeight := parentTs.Height() + 1 - prevVer := sim.StateManager.GetNtwkVersion(ctx, nextHeight-1) - nextVer := sim.StateManager.GetNtwkVersion(ctx, nextHeight) + prevVer := sim.StateManager.GetNetworkVersion(ctx, nextHeight-1) + nextVer := sim.StateManager.GetNetworkVersion(ctx, nextHeight) if nextVer != prevVer { log.Warnw("packing no messages for version upgrade block", "old", prevVer, diff --git a/conformance/driver.go b/conformance/driver.go index c6a20e359..9bca9c1fb 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -227,7 +227,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP }, Rand: params.Rand, BaseFee: params.BaseFee, - NtwkVersion: sm.GetNtwkVersion, + NtwkVersion: sm.GetNetworkVersion, } lvm, err := vm.NewVM(context.TODO(), vmOpts) diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 24cc08c8c..dfd1c69d9 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -1365,7 +1365,7 @@ func (m *StateModule) StateDealProviderCollateralBounds(ctx context.Context, siz powClaim.QualityAdjPower, rewPow, circ.FilCirculating, - m.StateManager.GetNtwkVersion(ctx, ts.Height())) + m.StateManager.GetNetworkVersion(ctx, ts.Height())) if err != nil { return api.DealCollateralBounds{}, xerrors.Errorf("getting deal provider coll bounds: %w", err) } @@ -1418,7 +1418,7 @@ func (m *StateModule) StateNetworkVersion(ctx context.Context, tsk types.TipSetK // TODO: Height-1 to be consistent with the rest of the APIs? // But that's likely going to break a bunch of stuff. - return m.StateManager.GetNtwkVersion(ctx, ts.Height()), nil + return m.StateManager.GetNetworkVersion(ctx, ts.Height()), nil } func (a *StateAPI) StateGetRandomnessFromTickets(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte, tsk types.TipSetKey) (abi.Randomness, error) { From 6f6f5d79fbccab1d6e34bf563c0bc9b8ae4b2830 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 18:54:17 -0500 Subject: [PATCH 121/157] Refactor: State: Let Rand get network versions --- chain/consensus/filcns/compute_state.go | 2 +- chain/gen/genesis/miners.go | 4 +-- chain/rand/rand.go | 26 ++++++++++++------- chain/stmgr/call.go | 4 +-- chain/stmgr/stmgr.go | 10 +++---- chain/stmgr/utils.go | 2 +- chain/vm/runtime.go | 6 ++--- chain/vm/vm.go | 4 +-- .../simulation/blockbuilder/blockbuilder.go | 2 +- conformance/rand_fixed.go | 6 ++--- conformance/rand_record.go | 6 ++--- conformance/rand_replay.go | 10 +++---- 12 files changed, 40 insertions(+), 42 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 6a25e6df2..ba4cc0335 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -299,7 +299,7 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, sm *stmgr.StateManag parentEpoch = parent.Height } - r := rand.NewStateRand(sm.ChainStore(), ts.Cids(), sm.Beacon()) + r := rand.NewStateRand(sm.ChainStore(), ts.Cids(), sm.Beacon(), sm.GetNetworkVersion) blkmsgs, err := sm.ChainStore().BlockMsgsForTipset(ctx, ts) if err != nil { diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index a688a0324..101f1d3b5 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -510,13 +510,13 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal // TODO: copied from actors test harness, deduplicate or remove from here type fakeRand struct{} -func (fr *fakeRand) GetChainRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetChainRandomness(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch * 1000))).Read(out) //nolint return out, nil } -func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, rnv network.Version, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (fr *fakeRand) GetBeaconRandomness(ctx context.Context, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { out := make([]byte, 32) _, _ = rand.New(rand.NewSource(int64(randEpoch))).Read(out) //nolint return out, nil diff --git a/chain/rand/rand.go b/chain/rand/rand.go index 6a54a2427..427648f2a 100644 --- a/chain/rand/rand.go +++ b/chain/rand/rand.go @@ -103,17 +103,21 @@ func (sr *stateRand) getChainRandomness(ctx context.Context, pers crypto.DomainS return DrawRandomness(mtb.Ticket.VRFProof, pers, round, entropy) } +type NetworkVersionGetter func(context.Context, abi.ChainEpoch) network.Version + type stateRand struct { - cs *store.ChainStore - blks []cid.Cid - beacon beacon.Schedule + cs *store.ChainStore + blks []cid.Cid + beacon beacon.Schedule + networkVersionGetter NetworkVersionGetter } -func NewStateRand(cs *store.ChainStore, blks []cid.Cid, b beacon.Schedule) vm.Rand { +func NewStateRand(cs *store.ChainStore, blks []cid.Cid, b beacon.Schedule, networkVersionGetter NetworkVersionGetter) vm.Rand { return &stateRand{ - cs: cs, - blks: blks, - beacon: b, + cs: cs, + blks: blks, + beacon: b, + networkVersionGetter: networkVersionGetter, } } @@ -166,7 +170,9 @@ func (sr *stateRand) getBeaconRandomnessV3(ctx context.Context, pers crypto.Doma return DrawRandomness(be.Data, pers, filecoinEpoch, entropy) } -func (sr *stateRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + nv := sr.networkVersionGetter(ctx, filecoinEpoch) + if nv >= network.Version13 { return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, false) } @@ -174,7 +180,9 @@ func (sr *stateRand) GetChainRandomness(ctx context.Context, nv network.Version, return sr.getChainRandomness(ctx, pers, filecoinEpoch, entropy, true) } -func (sr *stateRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (sr *stateRand) GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, filecoinEpoch abi.ChainEpoch, entropy []byte) ([]byte, error) { + nv := sr.networkVersionGetter(ctx, filecoinEpoch) + if nv >= network.Version14 { return sr.getBeaconRandomnessV3(ctx, pers, filecoinEpoch, entropy) } else if nv == network.Version13 { diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 2d5d64ae7..7f76628e8 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -75,7 +75,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. vmopt := &vm.VMOpts{ StateBase: bstate, Epoch: pheight + 1, - Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon), + Rand: rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion), Bstore: sm.cs.StateBlockstore(), Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, @@ -186,7 +186,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri return nil, fmt.Errorf("failed to handle fork: %w", err) } - r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon) + r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion) if span.IsRecordingEvents() { span.AddAttributes( diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index b19dd62c4..fd3558a1c 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -377,10 +377,9 @@ func (sm *StateManager) GetRandomnessFromBeacon(ctx context.Context, personaliza return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) } - r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNetworkVersion(ctx, randEpoch) + r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon, sm.GetNetworkVersion) - return r.GetBeaconRandomness(ctx, rnv, personalization, randEpoch, entropy) + return r.GetBeaconRandomness(ctx, personalization, randEpoch, entropy) } @@ -390,8 +389,7 @@ func (sm *StateManager) GetRandomnessFromTickets(ctx context.Context, personaliz return nil, xerrors.Errorf("loading tipset key: %w", err) } - r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon) - rnv := sm.GetNetworkVersion(ctx, randEpoch) + r := rand.NewStateRand(sm.ChainStore(), pts.Cids(), sm.beacon, sm.GetNetworkVersion) - return r.GetChainRandomness(ctx, rnv, personalization, randEpoch, entropy) + return r.GetChainRandomness(ctx, personalization, randEpoch, entropy) } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 5f23ce630..698ffc13f 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -79,7 +79,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch, // future. It's not guaranteed to be accurate... but that's fine. } - r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon) + r := rand.NewStateRand(sm.cs, ts.Cids(), sm.beacon, sm.GetNetworkVersion) vmopt := &vm.VMOpts{ StateBase: base, Epoch: height, diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 9bbed4030..844f5d253 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -224,8 +224,7 @@ func (rt *Runtime) GetActorCodeCID(addr address.Address) (ret cid.Cid, ok bool) } func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - res, err := rt.vm.rand.GetChainRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) + res, err := rt.vm.rand.GetChainRandomness(rt.ctx, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get ticket randomness: %s", err)) @@ -234,8 +233,7 @@ func (rt *Runtime) GetRandomnessFromTickets(personalization crypto.DomainSeparat } func (rt *Runtime) GetRandomnessFromBeacon(personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) abi.Randomness { - rnv := rt.vm.ntwkVersion(rt.ctx, randEpoch) - res, err := rt.vm.rand.GetBeaconRandomness(rt.ctx, rnv, personalization, randEpoch, entropy) + res, err := rt.vm.rand.GetBeaconRandomness(rt.ctx, personalization, randEpoch, entropy) if err != nil { panic(aerrors.Fatalf("could not get beacon randomness: %s", err)) diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 453646030..c0b730774 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -260,8 +260,8 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { } type Rand interface { - GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) - GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) + GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) + GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) } type ApplyRet struct { diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index c656a8208..360368b82 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -79,7 +79,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S // 1. We don't charge a fee. // 2. The runtime has "fake" proof logic. // 3. We don't actually save any of the results. - r := lrand.NewStateRand(sm.ChainStore(), parentTs.Cids(), sm.Beacon()) + r := lrand.NewStateRand(sm.ChainStore(), parentTs.Cids(), sm.Beacon(), sm.GetNetworkVersion) vmopt := &vm.VMOpts{ StateBase: parentState, Epoch: parentTs.Height() + 1, diff --git a/conformance/rand_fixed.go b/conformance/rand_fixed.go index 4284f98ff..d356b53d0 100644 --- a/conformance/rand_fixed.go +++ b/conformance/rand_fixed.go @@ -3,8 +3,6 @@ package conformance import ( "context" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -21,10 +19,10 @@ func NewFixedRand() vm.Rand { return &fixedRand{} } -func (r *fixedRand) GetChainRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetChainRandomness(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } -func (r *fixedRand) GetBeaconRandomness(_ context.Context, _ network.Version, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { +func (r *fixedRand) GetBeaconRandomness(_ context.Context, _ crypto.DomainSeparationTag, _ abi.ChainEpoch, _ []byte) ([]byte, error) { return []byte("i_am_random_____i_am_random_____"), nil // 32 bytes. } diff --git a/conformance/rand_record.go b/conformance/rand_record.go index f6eeaa6c9..8422ad31d 100644 --- a/conformance/rand_record.go +++ b/conformance/rand_record.go @@ -5,8 +5,6 @@ import ( "fmt" "sync" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -47,7 +45,7 @@ func (r *RecordingRand) loadHead() { r.head = head.Key() } -func (r *RecordingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) // FullNode's v0 ChainGetRandomnessFromTickets handles whether we should be looking forward or back ret, err := r.api.ChainGetRandomnessFromTickets(ctx, r.head, pers, round, entropy) @@ -73,7 +71,7 @@ func (r *RecordingRand) GetChainRandomness(ctx context.Context, nv network.Versi return ret, err } -func (r *RecordingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *RecordingRand) GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { r.once.Do(r.loadHead) ret, err := r.api.StateGetRandomnessFromBeacon(ctx, pers, round, entropy, r.head) if err != nil { diff --git a/conformance/rand_replay.go b/conformance/rand_replay.go index 1907ddf24..6c2282752 100644 --- a/conformance/rand_replay.go +++ b/conformance/rand_replay.go @@ -4,8 +4,6 @@ import ( "bytes" "context" - "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -45,7 +43,7 @@ func (r *ReplayingRand) match(requested schema.RandomnessRule) ([]byte, bool) { return nil, false } -func (r *ReplayingRand) GetChainRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *ReplayingRand) GetChainRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessChain, DomainSeparationTag: int64(pers), @@ -60,10 +58,10 @@ func (r *ReplayingRand) GetChainRandomness(ctx context.Context, nv network.Versi r.reporter.Logf("returning fallback chain randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - return r.fallback.GetChainRandomness(ctx, nv, pers, round, entropy) + return r.fallback.GetChainRandomness(ctx, pers, round, entropy) } -func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, nv network.Version, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { +func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, pers crypto.DomainSeparationTag, round abi.ChainEpoch, entropy []byte) ([]byte, error) { rule := schema.RandomnessRule{ Kind: schema.RandomnessBeacon, DomainSeparationTag: int64(pers), @@ -78,5 +76,5 @@ func (r *ReplayingRand) GetBeaconRandomness(ctx context.Context, nv network.Vers r.reporter.Logf("returning fallback beacon randomness: dst=%d, epoch=%d, entropy=%x", pers, round, entropy) - return r.fallback.GetBeaconRandomness(ctx, nv, pers, round, entropy) + return r.fallback.GetBeaconRandomness(ctx, pers, round, entropy) } From 670bd993f3c94286b33d7d4e0073f8e1404d818d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 17 Dec 2021 19:05:59 -0500 Subject: [PATCH 122/157] Refactor: VM: Remove the NetworkVersionGetter --- chain/consensus/filcns/compute_state.go | 2 +- chain/gen/genesis/genesis.go | 6 ++---- chain/gen/genesis/miners.go | 6 ++---- chain/stmgr/call.go | 4 ++-- chain/stmgr/utils.go | 2 +- chain/vm/invoker_test.go | 9 ++------- chain/vm/runtime.go | 2 +- chain/vm/vm.go | 20 ++++++++----------- .../simulation/blockbuilder/blockbuilder.go | 2 +- conformance/driver.go | 6 +++--- 10 files changed, 23 insertions(+), 36 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index ba4cc0335..3c70f61db 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -101,7 +101,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager Actors: NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, epoch), BaseFee: baseFee, LookbackState: stmgr.LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 64fd76d2b..6ab101e78 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -491,10 +491,8 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca Actors: filcns.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), CircSupplyCalc: csc, - NtwkVersion: func(_ context.Context, _ abi.ChainEpoch) network.Version { - return nv - }, - BaseFee: types.NewInt(0), + NetworkVersion: nv, + BaseFee: types.NewInt(0), } vm, err := vm.NewVM(ctx, &vmopt) if err != nil { diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 101f1d3b5..274918147 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -94,10 +94,8 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal Actors: filcns.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), CircSupplyCalc: csc, - NtwkVersion: func(_ context.Context, _ abi.ChainEpoch) network.Version { - return nv - }, - BaseFee: types.NewInt(0), + NetworkVersion: nv, + BaseFee: types.NewInt(0), } vm, err := vm.NewVM(ctx, vmopt) diff --git a/chain/stmgr/call.go b/chain/stmgr/call.go index 7f76628e8..31639701d 100644 --- a/chain/stmgr/call.go +++ b/chain/stmgr/call.go @@ -80,7 +80,7 @@ func (sm *StateManager) Call(ctx context.Context, msg *types.Message, ts *types. Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, pheight+1), BaseFee: types.NewInt(0), LookbackState: LookbackStateGetterForTipset(sm, ts), } @@ -204,7 +204,7 @@ func (sm *StateManager) CallWithGas(ctx context.Context, msg *types.Message, pri Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, ts.Height()+1), BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 698ffc13f..2a84c777b 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -88,7 +88,7 @@ func ComputeState(ctx context.Context, sm *StateManager, height abi.ChainEpoch, Actors: sm.tsExec.NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, height), BaseFee: ts.Blocks()[0].ParentBaseFee, LookbackState: LookbackStateGetterForTipset(sm, ts), } diff --git a/chain/vm/invoker_test.go b/chain/vm/invoker_test.go index 8499f001a..fb9910ecd 100644 --- a/chain/vm/invoker_test.go +++ b/chain/vm/invoker_test.go @@ -1,7 +1,6 @@ package vm import ( - "context" "fmt" "io" "testing" @@ -136,9 +135,7 @@ func TestInvokerBasic(t *testing.T) { { _, aerr := code[1](&Runtime{ - vm: &VM{ntwkVersion: func(ctx context.Context, epoch abi.ChainEpoch) network.Version { - return network.Version0 - }}, + vm: &VM{networkVersion: network.Version0}, Message: &basicRtMessage{}, }, []byte{99}) if aerrors.IsFatal(aerr) { @@ -149,9 +146,7 @@ func TestInvokerBasic(t *testing.T) { { _, aerr := code[1](&Runtime{ - vm: &VM{ntwkVersion: func(ctx context.Context, epoch abi.ChainEpoch) network.Version { - return network.Version7 - }}, + vm: &VM{networkVersion: network.Version7}, Message: &basicRtMessage{}, }, []byte{99}) if aerrors.IsFatal(aerr) { diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 844f5d253..0e2adc879 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -92,7 +92,7 @@ func (rt *Runtime) BaseFee() abi.TokenAmount { } func (rt *Runtime) NetworkVersion() network.Version { - return rt.vm.GetNtwkVersion(rt.ctx, rt.CurrEpoch()) + return rt.vm.networkVersion } func (rt *Runtime) TotalFilCircSupply() abi.TokenAmount { diff --git a/chain/vm/vm.go b/chain/vm/vm.go index c0b730774..7e9e972ae 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -169,7 +169,7 @@ func (vm *VM) makeRuntime(ctx context.Context, msg *types.Message, parent *Runti } vmm.From = resF - if vm.ntwkVersion(ctx, vm.blockHeight) <= network.Version3 { + if vm.networkVersion <= network.Version3 { rt.Message = &vmm } else { resT, _ := rt.ResolveAddress(msg.To) @@ -209,7 +209,7 @@ type VM struct { areg *ActorRegistry rand Rand circSupplyCalc CircSupplyCalculator - ntwkVersion NtwkVersionGetter + networkVersion network.Version baseFee abi.TokenAmount lbStateGet LookbackStateGetter baseCircSupply abi.TokenAmount @@ -225,7 +225,7 @@ type VMOpts struct { Actors *ActorRegistry Syscalls SyscallBuilder CircSupplyCalc CircSupplyCalculator - NtwkVersion NtwkVersionGetter // TODO: stebalien: In what cases do we actually need this? It seems like even when creating new networks we want to use the 'global'/build-default version getter + NetworkVersion network.Version BaseFee abi.TokenAmount LookbackState LookbackStateGetter } @@ -251,7 +251,7 @@ func NewVM(ctx context.Context, opts *VMOpts) (*VM, error) { areg: opts.Actors, rand: opts.Rand, // TODO: Probably should be a syscall circSupplyCalc: opts.CircSupplyCalc, - ntwkVersion: opts.NtwkVersion, + networkVersion: opts.NetworkVersion, Syscalls: opts.Syscalls, baseFee: opts.BaseFee, baseCircSupply: baseCirc, @@ -313,7 +313,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, return nil, aerrors.Wrapf(err, "could not create account") } toActor = a - if vm.ntwkVersion(ctx, vm.blockHeight) <= network.Version3 { + if vm.networkVersion <= network.Version3 { // Leave the rt.Message as is } else { nmsg := Message{ @@ -340,7 +340,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime, defer rt.chargeGasSafe(newGasCharge("OnMethodInvocationDone", 0, 0)) if types.BigCmp(msg.Value, types.NewInt(0)) != 0 { - if err := vm.transfer(msg.From, msg.To, msg.Value, vm.ntwkVersion(ctx, vm.blockHeight)); err != nil { + if err := vm.transfer(msg.From, msg.To, msg.Value, vm.networkVersion); err != nil { return nil, aerrors.Wrap(err, "failed to transfer funds") } } @@ -617,7 +617,7 @@ func (vm *VM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet, } func (vm *VM) ShouldBurn(ctx context.Context, st *state.StateTree, msg *types.Message, errcode exitcode.ExitCode) (bool, error) { - if vm.ntwkVersion(ctx, vm.blockHeight) <= network.Version12 { + if vm.networkVersion <= network.Version12 { // Check to see if we should burn funds. We avoid burning on successful // window post. This won't catch _indirect_ window post calls, but this // is the best we can get for now. @@ -855,13 +855,9 @@ func (vm *VM) SetInvoker(i *ActorRegistry) { vm.areg = i } -func (vm *VM) GetNtwkVersion(ctx context.Context, ce abi.ChainEpoch) network.Version { - return vm.ntwkVersion(ctx, ce) -} - func (vm *VM) GetCircSupply(ctx context.Context) (abi.TokenAmount, error) { // Before v15, this was recalculated on each invocation as the state tree was mutated - if vm.GetNtwkVersion(ctx, vm.blockHeight) <= network.Version14 { + if vm.networkVersion <= network.Version14 { return vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) } diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index 360368b82..fb822eb6e 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -88,7 +88,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S Actors: filcns.NewActorRegistry(), Syscalls: sm.VMSys(), CircSupplyCalc: sm.GetVMCirculatingSupply, - NtwkVersion: sm.GetNetworkVersion, + NetworkVersion: sm.GetNetworkVersion(ctx, parentTs.Height()+1), BaseFee: abi.NewTokenAmount(0), LookbackState: stmgr.LookbackStateGetterForTipset(sm, parentTs), } diff --git a/conformance/driver.go b/conformance/driver.go index 9bca9c1fb..6df7b9115 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -225,9 +225,9 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP CircSupplyCalc: func(_ context.Context, _ abi.ChainEpoch, _ *state.StateTree) (abi.TokenAmount, error) { return params.CircSupply, nil }, - Rand: params.Rand, - BaseFee: params.BaseFee, - NtwkVersion: sm.GetNetworkVersion, + Rand: params.Rand, + BaseFee: params.BaseFee, + NetworkVersion: sm.GetNetworkVersion(context.Background(), params.Epoch), } lvm, err := vm.NewVM(context.TODO(), vmOpts) From d10d0a20b1837ce542950dc1718d56968fa4515c Mon Sep 17 00:00:00 2001 From: shotcollin Date: Sun, 19 Dec 2021 17:07:11 -0700 Subject: [PATCH 123/157] fix typo in log warning very minor but this warning comes up a lot so it'd be nicer if it wasn't a grammatical error too --- extern/sector-storage/partialfile/partialfile.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/sector-storage/partialfile/partialfile.go b/extern/sector-storage/partialfile/partialfile.go index 529e889ea..ffc3935ac 100644 --- a/extern/sector-storage/partialfile/partialfile.go +++ b/extern/sector-storage/partialfile/partialfile.go @@ -71,7 +71,7 @@ func CreatePartialFile(maxPieceSize abi.PaddedPieceSize, path string) (*PartialF err := fallocate.Fallocate(f, 0, int64(maxPieceSize)) if errno, ok := err.(syscall.Errno); ok { if errno == syscall.EOPNOTSUPP || errno == syscall.ENOSYS { - log.Warnf("could not allocated space, ignoring: %v", errno) + log.Warnf("could not allocate space, ignoring: %v", errno) err = nil // log and ignore } } From 0e53275d40101b3e0edfa19b098a251d213f251e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 20 Dec 2021 16:03:03 +0100 Subject: [PATCH 124/157] feat: retrieval-ask - if size param is zero use QueryOffer.Size --- cli/client.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cli/client.go b/cli/client.go index 4025b9b56..634bd18e5 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1076,11 +1076,15 @@ var clientQueryRetrievalAskCmd = &cli.Command{ afmt.Printf("Payment interval: %s\n", types.SizeStr(types.NewInt(ask.PaymentInterval))) afmt.Printf("Payment interval increase: %s\n", types.SizeStr(types.NewInt(ask.PaymentIntervalIncrease))) - size := cctx.Int64("size") + size := cctx.Uint64("size") if size == 0 { - return nil + if ask.Size == 0 { + return nil + } + size = ask.Size + afmt.Printf("Size: %s\n", types.SizeStr(types.NewInt(ask.Size))) } - transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(uint64(size))) + transferPrice := types.BigMul(ask.PricePerByte, types.NewInt(size)) totalPrice := types.BigAdd(ask.UnsealPrice, transferPrice) afmt.Printf("Total price for %d bytes: %s\n", size, types.FIL(totalPrice)) From 6311e53a76c1af233bbf0a8e62281eec862af62d Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 21 Dec 2021 11:23:38 +0100 Subject: [PATCH 125/157] feat: update to go-fil-markets v1.14.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a4d85d6cf..e16d468b0 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585 + github.com/filecoin-project/go-fil-markets v1.14.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index f6f557211..afaced0d7 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585 h1:kDzqA/WyUOVVt2en/r81nvS21s0sMThv4qlKoveooDU= -github.com/filecoin-project/go-fil-markets v1.13.6-0.20211217102747-e95a23480585/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.0 h1:AWedMHUsIp/oE535zzHGgPZhxboGVLwUibnekcHj+eo= +github.com/filecoin-project/go-fil-markets v1.14.0/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 6db8a862bb909f895810f0233b12504263ada6c2 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 21 Dec 2021 16:36:47 +0100 Subject: [PATCH 126/157] feat: update to go-fil-markets v1.14.1 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e16d468b0..c6ee3e562 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.14.0 + github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index afaced0d7..54b1c414d 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.0 h1:AWedMHUsIp/oE535zzHGgPZhxboGVLwUibnekcHj+eo= -github.com/filecoin-project/go-fil-markets v1.14.0/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= +github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From cddf63efe98de7ff6442c0c81c445585d23925eb Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 10 Dec 2021 12:28:54 -0800 Subject: [PATCH 127/157] feat(storageminer): add api for transfer diagnostics Add API + CLI for inspecting in depth diagnostics on graphsync transfers with a given peer --- api/api_storage.go | 2 + api/docgen/docgen.go | 2 + api/proxy_gen.go | 13 +++ api/types.go | 25 ++++++ build/openrpc/full.json.gz | Bin 25722 -> 25722 bytes build/openrpc/miner.json.gz | Bin 11532 -> 11753 bytes build/openrpc/worker.json.gz | Bin 3692 -> 3691 bytes cmd/lotus-miner/market.go | 30 +++++++ documentation/en/api-v0-methods-miner.md | 22 +++++ documentation/en/cli-lotus-miner.md | 22 ++++- go.mod | 6 +- go.sum | 20 +++-- node/builder_miner.go | 4 +- node/impl/storminer.go | 107 +++++++++++++++++++++++ node/modules/dtypes/storage.go | 4 +- node/modules/storageminer.go | 16 ++-- 16 files changed, 254 insertions(+), 19 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index c0d9c9f9c..3f0ef50b7 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -165,6 +165,8 @@ type StorageMiner interface { MarketGetRetrievalAsk(ctx context.Context) (*retrievalmarket.Ask, error) //perm:read MarketListDataTransfers(ctx context.Context) ([]DataTransferChannel, error) //perm:write MarketDataTransferUpdates(ctx context.Context) (<-chan DataTransferChannel, error) //perm:write + // MarketDataTransferDiagnostics generates debugging information about current data transfers over graphsync + MarketDataTransferDiagnostics(ctx context.Context, p peer.ID) (*TransferDiagnostics, error) //perm:write // MarketRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer MarketRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write // MarketCancelDataTransfer cancels a data transfer with the given transfer ID and other peer diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 5d87e9d20..03ce9109d 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/google/uuid" "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync" "github.com/libp2p/go-libp2p-core/metrics" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" @@ -120,6 +121,7 @@ func init() { addExample(api.FullAPIVersion1) addExample(api.PCHInbound) addExample(time.Minute) + addExample(graphsync.RequestID(4)) addExample(datatransfer.TransferID(3)) addExample(datatransfer.Ongoing) addExample(storeIDExample) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 10a21b8fa..09c71a167 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -668,6 +668,8 @@ type StorageMinerStruct struct { MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + MarketDataTransferDiagnostics func(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) `perm:"write"` + MarketDataTransferUpdates func(p0 context.Context) (<-chan DataTransferChannel, error) `perm:"write"` MarketGetAsk func(p0 context.Context) (*storagemarket.SignedStorageAsk, error) `perm:"read"` @@ -3972,6 +3974,17 @@ func (s *StorageMinerStub) MarketCancelDataTransfer(p0 context.Context, p1 datat return ErrNotSupported } +func (s *StorageMinerStruct) MarketDataTransferDiagnostics(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) { + if s.Internal.MarketDataTransferDiagnostics == nil { + return nil, ErrNotSupported + } + return s.Internal.MarketDataTransferDiagnostics(p0, p1) +} + +func (s *StorageMinerStub) MarketDataTransferDiagnostics(p0 context.Context, p1 peer.ID) (*TransferDiagnostics, error) { + return nil, ErrNotSupported +} + func (s *StorageMinerStruct) MarketDataTransferUpdates(p0 context.Context) (<-chan DataTransferChannel, error) { if s.Internal.MarketDataTransferUpdates == nil { return nil, ErrNotSupported diff --git a/api/types.go b/api/types.go index 0ecda0405..81345306d 100644 --- a/api/types.go +++ b/api/types.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/types" "github.com/ipfs/go-cid" + "github.com/ipfs/go-graphsync" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" @@ -53,6 +54,30 @@ type MessageSendSpec struct { MaxFee abi.TokenAmount } +// GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync +type GraphSyncDataTransfer struct { + // GraphSync request id for this transfer + RequestID graphsync.RequestID + // Graphsync state for this transfer + RequestState string + // If a channel ID is present, indicates whether this is the current graphsync request for this channel + // (could have changed in a restart) + IsCurrentChannelRequest bool + // Data transfer channel ID for this transfer + ChannelID *datatransfer.ChannelID + // Data transfer state for this transfer + ChannelState *DataTransferChannel + // Diagnostic information about this request -- and unexpected inconsistencies in + // request state + Diagnostics []string +} + +// TransferDiagnostics give current information about transfers going over graphsync that may be helpful for debugging +type TransferDiagnostics struct { + ReceivingTransfers []*GraphSyncDataTransfer + SendingTransfers []*GraphSyncDataTransfer +} + type DataTransferChannel struct { TransferID datatransfer.TransferID Status datatransfer.Status diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 33a869e4a274fa86cf427e358072b8addad32fda..c5b98140478ca8678d72b59367c8df5d52328aaf 100644 GIT binary patch delta 22811 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 Z0Tjj8`SI3+w;@ delta 22784 zcmV)wK$O4w$N~Du0kHG}1AFhSllKCQ0o#*=19^W=&DuUe9^&Zp@UM2OI<8)YfF0~^ z9bZjuj$QeefTu130UDtI5hq!Z3f&%`opgpc_0%kensPn~2WKuK z9FK4b>^#OU2*m1Rh;V^D8S+LiRhgmKMUHL*x^93NLoUE^Yg^!q3&bimvl=i2e<+oz z4^8v)KeY6M%_}#R?aFOhb=jN4$OML+2K`aW7)`JO_}t0D_OA)C980Ru&0= z@BJ#_-e|r%{0BM+4ra`q?9T^qu+N7Bc8jL|U-bTOKb+I4|JQIjLi5pJZ-fWod_N4) z-tOI=grCt?)j+X5lzwuY;mvLhXLygeJFmQR?E9I>H_JfoS^vP|OSC%ML_AOR44EE-g(Foz3VdHdtWd)rXk_IgSY)fl@mjOQ~(5{>x%|1=oNq0 z_0+Qq7>JdV{rLsq@r3sddfUBz?}Pp!%^p#SD**v7DU}21;(JC7e?*MIF}g$!!air+ zHLn})u*IYEtHbd)Kx4>}X!TmI$2voc`1(`CIGp;*BqP_;6&{;bKc#^vPM{|(EuslE zZAXxyQ-tIvYiQ5O596UsL2A4WEJ1&<=2}?Z-+P#&DSJrjn;WuH zg*FX*iD$aaD6*{JaU!K=vzF&13A%W=Em^k7QgY5@(`1oJJ9eIFU~!kS=+S?itI8b> zJNr2{%)+{}y=S0n#{6$7oil31K=;g)H`Y6&3f=3UDbfw~(3qA;ADu=Iqi0&i1z{JzcAq8TjUA-7IJw|azo-C z)yXXaZs>cGjk$vN{lWnB7zKYmWeg8JBoB;>%>z!s1m2+=;^L9CzVT!%qkvA;FyIsc zhKP#-0D1C=P~xC1@MVICB5eYF9}(8SA(VJZ9UtL<#chITvTvoi&oG|=kIoR|fJ-j; zJRXcg3BxW5#77jAqkH6pVp+-={CxfH09=1Ky8<8IU4Qs|0&f z4*Y)g?gX5Ez69^zU0f+t;+3DFaI6D7){F`X;9!tQhG6!5C$G^=#JjSm6yQ!v`?x3BJKMm-#IXZj~ z*(pND&~H`s98a+!_FH$F&nLku4RMa%-)+@I+I%E`Krd{eiTn|{ zfOVr(t7ZDc^?}?5Znx=leY;idR_$i1O7n|CBagx0_4G8oomWlun%;Xv5X0?tJYB!s zOHH4(Tx0)AXe^5rI^9~Qs$4>0y#g2Yojyt&>t{+STHf6yGa*$+Q}J69sFy%EZG4V@ zMW)W}h1hPR7X0phlfekH0c(?W39JL$dsCAn3Q>P~Rd@5WaLC-60c4w5Z0KkNm9mYm z3@8=Guox!gD68?{@L>uh0XkB)kD^b9HGOQR>BB-a3(*$w>eqF5m}71ed+9F6tD|O2 zcy-n=r)!#X?x?F;&RyEa5_~*0K2ts((;4ycAbK#OLBiBaxVegulIP~&dV-QRv>Ts? zS)_kW3r5KRCFmumFDXIFi%klKX;!2}oKuEZ;j}{R#`Tp)oh0HIyH=`fuv97CHYGBq zs@!TN&bxce#m6u<4gb!Np?&vKZj5EUw>MXqyr~NsAXx{WEFnVp#LzC<2mWrUt@OnQ z1l{8aB&JFLpVSMGq`j76Lyk#|LD0NNVDNuQEG7i+l9)a~cPQY$Lf`l1Kf#Q{3rO|8zK)-0pN#+;_?4R zkNMG|EPQx$L%{#OeEIUl%a{MFE9!sw<)v=<3k^M24+H%9RgwRUA00mL138Fi{P2G$ z_4ncPZ+}_??}`n)$)5Fh?W8Ry921sMCK5AmS1Sl(_p`jt^9S^r9s@oB;q`VwT#E{4 zC{yvJs+%9|HTFqUB|EiV$22e2W_0gqr!*~TDgs=@W9?2=u#Bp)Ta5MaTNy*y-5!`Q zl*186fu5n|cuT4!v(T~?Fu5h?Np*j}0w$CloEcy)(&bTl%fJviw-WTmw+N$4fibI6 zacFNy=9(j+(GA4%^8M6>K|;w(F$GBn5O|QIKoz|q(M`d~*wP&vd<;QpE#S0#{IT%y zoduWB)$AV4J7MBcGe3iaM}4n=eW!-igm=djt(tMC8-xTP71Q$C*p;2EmIuBUOs&Ut9yU1?qbU&f^KU$sVkd!_zdTK@hPlsul5vHG}Qd~HKBBY z%#27-*G;kSxiZ{4GrMmpH^mJ}Ll%>dM9kZ}llBbZea?oJc5Jz<{DoM>KHIDD=EJV2FRSSOzPkE+p|5 z_?>B&J_pKpbM|!YXK4CQEh)tAn>sh*D-L;UK%pxy02I;?nt+SX!@oqmh3G;zUV|=l zOU>a$LbrjzGomBTCB`AgjAMtT@`sHB=udK>;}<&o>lbD2{ACCk`bF9RJw_8KB2T51 zN*_D+iuU7Jl@PdiG`fEwL&RrDm*g`F)Gn~dWHXRStrgdPnKi?Vn(Y)OH+gQN_g>+D zbnKCHOoYd6rvpOM8kUBNOI`Z55+#8sozoV;6&SQ6Zgzw-EOdMdRc!|Ol17hK-JyuJta%r zV7toe)WeAIW9T`@bUM9g&O5U87Y9m^#V!|^p0ka1V}LFYTEiN0{X5WeLQg^f!4K3! zHX?+)T1 z?*wvq9YDfHB?w>Lly~GCs$wE8eU(8D!N_T*j7E9 zNHrJa)w7%eQI32hbPq9n5RE^%53A1AwA#*-?he`U@@gOxZE>4jp( zT6dG0N;H4=HuHq+!B09Rw>HM}oxyIEA7*NcULqb~bO*f?1dFrNgz;rss^WY>RA>r= zTg10S*|QTv9+&B%OD2~meKDXak`uEx0w@_%0c7IA0#}q6LWW#G2~dOXjGdLw>B_j- ztG3+C?#c6=!Jx|DPA)9*=`JvG(6Ri0Z8l@NiN$|T1wuj}pPdL~xLA)#H(g`)NVVC_ z>QP4jlDdsR5E5=M{11xUZZb{>)>yx(CgIdNEKG3ror&gm0p}ituF|32_Iq-TMhe_u zS3f9?DBW%<8mfdD`iuf9r|4~%2Q(S_(^Dp2Re6HN+^clKnKN%u-HdUYb8S&_0moi~ zU2A`e7qRM?kQAp5P=t#oyfvw$YOLsmfKX zPrbcFBWWcQ{a&KcLd8+l>PA098RlI|GEf5c`M^PNi;>rn@K@`dtqdIuJndjng6%s5AaGE?Atq8R^fMPC5?UE}MhODG zJ}!A~{SY?-N!N1U7f<}t=x}cxUOh?nQ^^IC%*z!=Wev*V$VW^r0_?QNOZ5>G6tt{% zfefl<2XLqsN%IahMk=*BwXj!}L9>4gIG-ZICFj0V!Tn4!kYy^J5hp;9HBlN{nA*gr zzCgjzoVWPmt929U_kJe~2})Wl$IXwAICxui#Y4*d_lO+Bwyq|saurb0kX!<#$X{)N zo~#<|Mo*53Gl4(4<1r#A&=TSJ@KR~ZMYmP)xI0+$R8*H*1hEzldQVM}+S`Aw@`2Zz zLK@4@$cVOP5OE6z35}zoi`A!8yB#{SW~p6tj*zAy9brM9C~$y@fS@v{x4sJ&g=}#V z^sG{}5lT_1mv7~sNxv~-^#S!MgI=c@)vh??`f^d6L#NCDdc|duuY>Qs=r6(VBo?H1 z*cCWD$(DQqITRx7;CnA}WW0Y)3yrwtZcVxhi;LM&X5GvQ%Y>PPqI zPVMX?bt3+wUC*NWQzqa^-AqZ|}U6|GVDaK9K+WPfsTD zm9QgPhS3ZkPaq*k+j7qc<`_!jaXT-|e(w@7pAz+DTQ(tR8T?S|A$EUbPAv-gUai59 z$-LM{kahbt&RA+H)P$X}E2PGye*Zy3XCjB0Tb-2~;xnH_%4gfDiKamE6R{L3Hdy0a zhnY3>y{Dv(axX?Nxp-QlT%|T_lQYVAzpd0)BfoErYP8ZZv&^a*>86y~{L*ePeW|tH zjLgiME<@_c3NL$`O3Qy%XgamBOWr1Hw81cwN^K6p% z88VA9xt#KjND#FVn@W&=jcdndcyR6Q)Lx+0#uY7cmNGu6Hmb}|Atro(?>Ts;zKgNx zNwr#Te7fn~^jce=VsZ`bPnwW)1fq~>OA`bRb-VN5QggMk8$ElwU0&&l4az^+&b+Ss zZ@2a~@(0MI-&cRjtru1AAntaiy{L@aLUPU+3H zlchEEZmgl#M&B+ll~+~Kx8*K6n=av&ttu}#Ykm%%y-)=&5nIewRM8GkkYXYiF%;c1 zo+`g=dCnXPq?kKt_8}LWh||PB+a5f3lG7tzCdFf#^s9e|_fuEB%R_?2(am#H8dqJF z$#m1Skp0?gbmy4yw7s{jCQ@jpJe9!LZ|Oo>bzRKG3a!^V6_<3;!n?R^M0Na5luzhO zAD3%|g^mF9yf|h7kIT}Lypy+dc7oE8m-tqems+ipr9Bw<*#=T;`+PzN0~_n>x%ayE zTBKy!2zq}@i7`>XQhXUZaK%m4%PQSoTLGnMT_l(kA(2ojI&KLu<;pTs=%OfRh`KiE z$X1q5o|6o=OeQt)8(KyXS!V+4OkgpC#S9iRSZ4z3OkkY}tTVyWaVFR>Rp?D^i~s@q zm9=ykWk|PBr4FgrX3CIms#YCRWm+mj39XCNp@@GJPh}OJs!r4aggm6<6NCd0P|Csa z*$L}F_o+A;O1)UI-g9_aapuskya6p%RAr^#(0rAu#uW_%r&h_>*p2;ayY@b-Sio^a z+-3H5(n!_zj!T%EJd#FhH+rV!mis+J|Dr9QqN~~r5+sGH>>wSmg3Q=UI70sYiY@bV zj@W+%#O|q<$_qENtZ|7Pgzrq%4{HT@#M+Qmbe^Ua;N2Y}+z{6rQe3OZsqm2P1LZEI z1h$L&kyhi%_<;GRryP2M3pc0Xaq4b1qDdVB+^LOPAOi)}gikVqfVozx{LZw0}fm0kX6}6-a*=+=s+*dI3 z?$(#rSCh5QCT(3)N8Z|`KsJnBw_)sRxNyS|b~+H<1B8=^Vo4-X9g2f6d%-vj;27zYVOQ$cA-i1+k)w_~yuFbc zi%HDDn1TfSGCU^81<5$TD4^5aoeqhDy92+EA^~F&1+N`uFTEvFwLXi`v8JS1tgi%5 zL?^fDXF|5-Q$2lz_r+&<7;%lKh;e^7^+k!D?H%dAfdw`C=N0<<6P3ZS8lnK*jFDw4 zL#a`X%y+m)6hs|#sOY9>UW_Mn?^qph>a@m5PH{TYS>^fwvXqvqlgm*t z>h6@?>}>v&`}r9waW-vR?;L-VTlVYj&aWRJoBXPN?d{56y|hVL9%xtFlN%e4)we2G zj~|CQIU>HXXU?LOdDg1@_^isSwhQZ>*Yp$p1aoq!Jt`wRibkmXYZLC+I@_i3HK40Nl7U3H~vnT&tQ6s6RWTc(3C z4m}UKY1d{-;zS+3;(x$VzGF8;owvgP0meh;7Pz6zmWxw;fsyEJb3I$ELUF$H>UC|@ zplC6Efw;X@GHIe}OUG+gA2}#~Y`n8Y)7@@iO|0o&l?2Qn=F-b0rBQGSh6p%RtY_X` z^wRSATAlII+Af#aVQ+tG1DRY&0~=}`o;0pswYOfxB`)OB5^8(w*11SwkLz}*v8O3s zw84`8eR&C2I)=I8w=^-rt`DH|lVyrKA(s!=Jz>xn0TJqTYk5aHcUmi(VcG0Ikwg43 z^*qQ?5ZeHBn1F!m+t&JM_7tYBX2scS^!cD%|7`*9p*tG8(z*~MEnrf9qUL?t`%0=DkKUAYIZE6{jb8zw*oiSQ6(%Ylug zja31Tq=#-nM}~3(;E|$Zgah;v68GhZ24louCSZgBIvRPHsHkcJ?`upV0SXN{VBwIV zzeBk&1L)jhGPZws#o`r93~_;V7@Z=S*P*Y2DM5ZiL~k1zz8AWK)*ZPBQwK>nunH@ zk?T+z$)5&vn*RNX5=Z+4{UNuc!t3uLJI7PZdk1gj5517$mlpw=;&2*i1Ck%g^xRrQ zI_UkIc-#NEI+{4-zb5Fv|Mjn4zgL>JdpPu6G`^D~V<>2*9z$x>O|e{R+%2l=`7^<* z=?QJ@e5B{zq#ymU&0KlZcl_R)A{WagHpB!5^LNCduHe+-BQmtVmkQjIQa@-5=&aUX z3&hO~HG|fEC3Wt^tIcuvwgVUFqAzidH5;*&j^Z%%3k<-M;5jgVoE6dnreY%Fmj?J} zdqn|6))b@+D((`e$*mw+iz8x4R;5uRx1VuVYg4$G0rc1s|V8bJ zZx)Dus)jAqhd5j#-?|}Z9E>3L7{H^rkb1x=K=;TAd52MVES9lY#$uUu#xfQcnB#&7 z_dO0YxTf%6uj0CYc2>Sc3}rchpj)X=>|PdkL|QYVw|m{#H4=JOY}?2TJZ;|)V=)02 z5t#|Rm`xy;7{d>+g8-Y*&~w2MDa&p6n5}J$b+6p|Y2tSOZdsPu! zA;oO9V)Pz1zwcApN&{v1h5m7chI#hYCcd9FMCGNkw;aY zlUqh_8NFqH^y|gw*HkgsuLw5uQQkT|bloH9LGj6(>IC@)nxv#Cvw&r+QQ(=uZG$`o zHKwj8?L`w!pk#oHm4E_G&~=%*gbz4X$7QkzfDWhK#ZFsiTh3#*JgtrKp$r>TIa@z* zU+bTo)niSC!Rv}hF^X%wNBj~o6x^ZWax#+!sTPcXBfl6QZxp&%#nDFDII7*fizJN^ zR}typl!k-@I*OS81acXw#R-D|5$?@F5LJp26Y06xT%lm?zFqI=Hx;2@)XKa>9)b+D z3-VNKq6x&y!nw*@8pTeQy{l15cD=h(2@!$%5ka?js}AS!yvQe~n;l-sz@1|aHmAL> zalW&E|F$ATO>w!l<^)L-KTFw5)36eCFE>b2g)c*wW)>0ekRA*2YWWl86YET^)%L8m zx1rkJ>+OnIB8p{w!F=KdaMn^9MAd(mB#8Q7i4;f;&Qt=#^vv`h41~m^aw%&$5T)L- z2EetZ)`|ox5;j#N>{f(pkReU@m@_RIJ_ z>gD&|7fg<6NR%_df?7uiI+VzxU=~H9(#{X@?`$BbRLZ-(-M;9IU^2d-S6ufa^F%a% z^B2fc@x6yRnl4VZP##LE)%p1)4T;gAepxgo{Qw35oX3%t%#Qt&kJezM$tP_&+GK&W z8*s8f+I_0XyQWz!>r`T$N-7rQ6&@3)WXQwuj5uCfV}ebXNZY_@ksxbYF_AM5$BD}3 zp?~3AXwFgF-L-gs33M7pE(;8+ydG2UO;FSa1YNa8OEMFiq81N1 zf{2Uu;N>0R0Z!1$7ffWWc zcGG-XGI!JB(fQTkcpRXyK-UM~HP_qiYu;JoyQ+(asWLzeq(gur7`hH~7>1U*E;#wb8;iWxQA%}XK3nANtcULxQc#%eAK;5H3>iD$YsjDFG* z;PGk&o2(I}HQy}YdD6>u!>*fuydG3Ujg^f3J(4{7jErcz1BO%sjn18ic|mevCzt+_7@&Rq-g2xAR;@!#b?jg6BHonR!k@dbHo88bKubFRBjpNSd1A^A*HvT z=2>&*>#r<=h}6PuIL)7ZRW`eeORik!-y5I3UC@~{7;X3Zy-$eGXmFc2@snd(&_@#{BzdT@ou1i4xl zc@Ca^{bu5TnCYX&0Wof^nG0fm2sQW5vXl(PU%(I9M5;1O4i2P3B zNmZQ6`D-WBng+Opgy9GkCP>{oz!i}@|r*buH^G5;E4&HaiX)>+i^JK;gdc$*+a z6P#pa@a^q@@bMhR`E1|)TtHH_;q8U_yPFrk8#F;>P{8S|KBjI}FSyHcI3 ze_a)qR>+s*333t-u~uR}(?pGg*F`P@%BlJo&%S>9`b|HUtz2=)L$*-XXL_s^^JUF9 zm-+b-E)e%w@_ZDCMa+Ol$Jl`$aKvi{C;?Ez02(K4>@L86S;>T3p>Box;}YtBKo7gg z#N=E^RxU%!xJSuGt0>lDueI8BLY6o7xDW!=Y_Yuyg4Ewo@jiLbt4Li|ltJmFa2Tp%L0eh0EV*OGaB;bp{muG5E->cz2|2=_d( zRWe=%B=kIg;H&bnlvi3k1Y>-M$kPl)Y`LrDu4}_x-&VzTj(7Ye@;&IF4!CQsCDSAL zCE07P*N0-S#lf1e*F3Q`DpY~9&M=>VKs7K$gxh0ys~2sCUSzc#D~C5*4!_y1imWb0 zgNI#AxwB-y?oZ$p{xiF&VA)xO&NoPvw4=%S@JA2qEJZySaaxC$eTA zBt5Hk7AsLKPI%u!`7&`c2%$F++9(*X0iP|uUl zMEDTMj|gZ0I^y)ztSAFqR#r=@qnseAEx(dtJGanh5ujSt}tp_X&)yyk)-7 zlS_H|W>6L6SZ`g0-PUsA8K2DA_|^UGz5n-!?9N8cKl{_W z-N}^R^4ZY6zlHaEOzzbTcQFa=+-3I-uLN4jY9*_ctTs)WO_TPpcxS&Z=*80UE(}6l zm<76MXMI={;iApCN#ht6X)2Vl5PIGmKqkPFG-e6*-Iv&j_2nXt@stKqHzb39q^9!z zyx2jMcykbn-8Gva0%FPbYa)8U2qVvB00xNs!V?qc4Y?s-M5UxPhPZ%i+x?;;bA~++ zj6=j2fWF|E0frob5kfaaFhmzn5}yP)6NriU*oy0R=UCao0q99Uy=GX;q9%))mN^Tv zu|&#_s_PAwR%^9dtL49z|5~kob)A)=*L6`@Ita*O6pN(;bFfJWmZj{%4Pvik=~;t- zD^?U+QEWxA6~$H*TLZE+ATN!X-qc06xk8>;imkwss%z+?Chf)}k3zn`*WO)Cb@>3^ zYVp_%?8lm@$X^Wt4>JzvsN_}(4FD#N7mAGlFp)m3(#>_~QRmh=w5`~Gp{>?3rWdEt zWbN#34ca=hTCX|_-7Iu_?9gq)yz1W8MbEif?zY`k&278P33GB$Y|(AgtNQD9jfH(e z-~wYw(lJAvB{xj8ExCfwd0IMP7D@Hh@hCZ3|ceyc7eM(>0QDB9AbfGHbii^tS|L`L?r6J6kjWJ(0( z-4QfXX8Iued^SORg4B&kwetlj(ZE?ypgBlCnU`rUEsr68aZpj`F$DOk_KNZS5?Ef**CmvXM_h*FYf-$W#gYH41BO?Ww1Myz zq+5_~LHY_ox`n+K_FC9$VXuX~ZDH?TRggLb#x4}bX^VSx^<{x?@!8%oXjfC!CEQI0 zn#a4fST~|XLrEq^DnP4t!44unp$N9F5antTQZUz|Sc_tR*P7ZQdbN1a;z5fCEgrOZ zuq_^ZRTb7$0G4IE9Gbg0#OBTd0BnW(x^`D6^;M`rdv(qUFB4m01l=N|;&2Xl011PR zm~C)&(g_BP`^&X03q?3lLC{S7CyLn~gDvk7U^fe#EO4^G$pWWM1Wx-^v1t?8e|=9r zz&1f@3r%!?1EVTWl9hM)5gwlrF5N_ngK1VpPRoIb zziWUT?Bmp(uZq7u8p@ zNZKOl6Z_xrrL&XusW&LNv%$5 zb<$0L)Jb1g#SdqAyo5t@b8qHuP5B*rE0?+|S1W`y{>jyPpf%cCRpXJW8Wtc~fMfxZ z1xT9+kls|q6prQmGB*263muy5bLRQ-$PRHEua_{-XGYL5;4(ALKRO(?QiFBXRWxg_ zwjlDc%yH3Py^a>(#~u*kF|6C7-P&4!t%75J6&$PJSOupe1?O#50B`}I0|a?HZ*En! zN~MWak6rNfTj_niA>KNkKuq5G)R~y;H0eUE)EP;3cX~`T3(cd|X-XXVPaOSTXdE-> zd59b8De+~yFt(1w~~H8Sn$_bgfi82DnpHE(*J21>w94?5u6{;#z$pv!Pe^8FsdJws%$%_QI+l z-K!vLGp82dTYzr?z6JQ32k>{dx2uBpGdzBe_~9MI9vph;NMW~DXuqVLCZ`!Zn~~-@ zc$NkG^_ab+^O_t$84aN+o-ZHgf-FFP6(mL(fuup52J(o2j#5DX7Z%}Zz$cJLZu>LL zCvE^|1keC59})gU4e#9MF){`-Ii$6wFl=2}=uS;+|M!Srs7zjMIj63^9K-zj?S*LW zIyrANV4J$<`iyD0X4~-0WQ0bnG9oMDkWr?z)M2X1mL^!|7~dh13V)=mBU|8qv*4Sh zHDQ3jDD;w>PHtbcGzT;6d4N#hQ8Grs4S~LoU;rja-f*%!*7DdzY1(por7T5TvB+xE zv+3K3QeEgM$Bj}B7b_G^^pwY7*xdREa8ktbFs>0qib$W5ryo<#6GLnz`*dY<4avdo)-iS$ zN;2JWjTu|F)X0XNquHuMf^I#L1>%$E3+xi5Y#`g#F?K;9sA2LH00M@*(Mwfkh{;%g zt)3+M9C87UTiXI>9AJ5NFjbKxAkYU_eE`8Rb&&&}%_i8H03E0z36$rEw=aF@+#)yb zMavXwQPbQ3YOZD^`>WhMI+K_cbOdXHMNk@v`yg&2j0OabUKGNKEa z&3jbAXxd<8HI~J3?SIZe+1hcW$AzJPA4fF9I;1Z)L?yo0FPowI7_8@EVi)}Lp^*79 z5O>qy;_HggVG(;1b9ITJJ8#YG;})v8egy8ovjVSQ%**4}YtUmJnYLl`=~1j4N?J7b z6VX^1LoLdtb(dXh%5L6NM3<4<>>RU}m{Qa%VJ|WnU{j_d+Nw(QCrl5GD~a)oFtdQQD%W_j`-i*^8hwUMwbs@h$}v1?4RJ$1FGu4`)NTUR!+Q*rZ9ZLD@z4^wp;IJl>3E#@UPHxb)d z3Jh)^J|zzFqVDVGUK%Mol< zv1m4xq12ii%RY58i%Fh|WYi3uB{-w2=x2Gott_NQYyi+&ebP%RCWq3%iq&J)dT%!q z2qZFPsMsEP?Nn12soKi9IHMdYrERyS#oAV$q-~{t+q0OTkXN-fWYt=G z$>oS!Q_9yBwGQg;WosO9JVDOwm5+!Ehi#2trA>8>W#jzuLrOhU^qM899LTEg)e^fF z#%y7%g|QaKS{Q3#tc9@_#y%X3{V5ccK~^35?q|fqTUQ*qR~Pyr4WwlJ%H=VrY-U;f z`CLIvBZMhCEJv4rOTfx#7&e%Lg_0IZS}19uq=k}?5=xfF=?%RiOwtci&NaF_!OtE! z2zpf)^dl1c0fKxWR zQ<_b-4-k-Qz}x})>$mc=V>6JtFpfZ}VX!TB)g!as(n#9tD{Odq zvwmw+-_N+jY^ArA-d1`)YU#bP5m9#E)Ws2tLPUhaDPB&1t0q?F{$+Y|GDFQOE>Px& zYdyd0ah*MXuCtKFLK+Kc))vxO&#%>ae%TNLHiUpN7=K$4W%G(djt(712U8=_h-XR7@!<%Jp9_&=a+LNs37?!wy8u4#Yvx;lKP@C){VhoN^1=oIYM((Jy z*qbr#trI84H0=hgS@s)*8mcOeI#t7x>Q=;mtFh$UVknX+(@>=?@`YB%xX{!lkc<)A zx*<0tX&L&yhmmSLYL-*^Q}OLz81P{rR6HgsZGr0vx*<_f%w&=z)rt!!dC95&QnP(55|^+jSdRETiw()@ax!jiy?EjjKhA{Xxuy7WFI@KrkhkimWdC(uC1{WaDG( z7MV)hpy(gjSTyzo_@^A}r6WJiyL-%!sf&6C+x_096uadFyoc;}Ccf}n#k7tolMO`D zsk848cO<9h2r_?kiqMgwOFa2}hk|#E<0%wtC-p)i)eA(R$LHxs*EpK|OEd~e)bcgu z&{L!6ZL8Bfi{ZNX_tigl6WVOW-JH5og96?cM=9r?eYEX_&>FPCNOh691b1m zc~MS+W(_uk1W6kv;!qRvy(sC5E9NHhwiI;R3f4vxjpK% zC0D3grR1K5Bnjb~e|e70PM1xNjG5uQaMN;zSnp(S4l6E!jTwkHSuKwOvGKn1Phz0tYQj!HJF+VjB2rMqM2&C3u0{8 zBrQiC$~AxPHb#9-YnEZlrfozZvuV8)9&KrC&F&w|j4d8_umG) z6=^?|U0oX5UFp5r@@P8K#DY}Z@^B+b%RPnuSM?#jDU+LQWbyGvy2qMx>GI~ApHk;X zXmS#gAu)YM%_j&z^>{X+45_0ErjII{E^&!|2`k!8T~*$KNL*Pl;5AAqX~ z4Luj|31)!9+vo%Y+@d)Hm@tl@`~P=#WMQ2Ff2K2FovGS>nKjGkUe0t1b6r`?#754y zcXkK+J((QG?a)U10l^L}?W^-=@%4}#5-|fl z(e!^btF^?fhE0PagNlSiN@U`|2|dU$84Jnmwe%t`G*bmhN*srWc;M|@QEAaFNTW0f{9g2TWOP{N@)aj|#YeDFb1Lz_#2uS8?8U@dALr=&J zHK9nYUK$AbK|;?HEdem}sB_DJ*zw2}0xB7<>gqUBsGWckrB#ceiWU}EJ{4jJIulhg zl3Ym%QRYwz#I$dqZdR9OK5_)`bK?p#7`VE{0I45yxh^6S^ixS}^(cglOfP>2IYZ*h zpN+B|XTHn?k0(e}grr!zFF)K|dt?HS% zA+o=+2~sa;zGk#9#fr^N&<%eH3CHSl#X}W4Tns{yDqTyHiHUZQoP4neqUpOKNryu< z$00+3iC@*4^E_{knWbsVRt?w-F@{2Dm!7BzsP z|88j+6BFenrMx>+qISfSE`-f|0wX$_+3aG+zc!9+)(z3RAzC*?>xO8d$67%T>xO9E z5Um@cbwjkwcxL*hRrH^*qQ?0KFp`61Sz_ zVqJ@M=WQ3zb&-34k%O-AKPp~>%I;oz&?dUcH^19#Oy4oS6 z{Sc;@NUQA>-UBBt2q0jb25=l7W(7CIfdpX2LL{BdIK0*8d@g^29$@$%6=mWM1N7bdi#kkRFP9N)Tz_iZv( z>8P-c5p`=+x*@V}zar0~W~B~wkp_eaKDV*km+ZSaW7II_+9rXQ& zfrv{;>dvDiH&B1G==Mc=Am?c6tHVxLzR0>&C;`z20?)W~9%6MDSYI^1w)z+^t2Q%#ZRmy6&Cq4`w(GLjyhr>J5|>U1V(c`a z(<1~O$pza9qO!&+HJo7XbGmgxrx24XB-pO>`-9_H>B-#kT406~<&*ABL|7TI3of%J zRhsKY)zj0!U{^&pX31?5$$XSzq+X7Mq>O8ICj@`1zu?MX`DzY?9@!NKYpB~S$dTnN zrK>aZ`jP33>na&{>hc#A80|H7Zc*DzMpdmn64|J!eMsS$OwcmYF(SNNJgV!)Rytbg zXr-f-j#fHmq~mT~PN;Lt_%h)Wllta?ioSkpn&UL-rS_<6=`5$2(JTm0l%gqZyo^qM zWM+Rpbcceu_NTxk9d5ve3i=5N?iM8sEi2LW1@q1>60a$@8PvsV6?-NMkeP4gP%mh=5V+VDWRWAL_3=Q&iNpBt`9b5BT zDmLHO0}6p!RpK$|Lgi8{acId)uZ6BICeV3<++Ygo-iFEAy}E#;QW#)@mO=Ka{;H9^ z>SguFJ|2w$vez^%K=xBnN=3SwKn5HSVzH)uIzutwzmPu;Rlqb0`z`F>NZ9|XE{1>T zIioxVMIb`oFJ(2?mBLe~$i zqm<>4i|n!s_~ZJ0`88#N`*l~qKf>S^@yNxh6(`Izu^c%n9gB>ILUiDhz+xd9<8SMtJQ?-`iF#TlQ($=K}Uwzp?XgO$=LV zfCX;xqL1VOK*cAaX#T)j?Z-AU>jGH=WGQC!LqLQyzmnJGx$}E3N)b9RZ ze;}TVflvlL`8P%mDorxq)^|RMe{!(1J=m2Ip=1OWNvxigV-F+3)8`FQbeQzBb2vm^ zF+2PfhXGf1<^yRE?)TmiH~T=Z>5Bk6=mG`$rIY~0I5hf&A}aUzM_+9&F+o?z;WQ}e z{v0y?yYGsxoFl`7Y?6NTqr-oMSLyHApjtHdjc+9srl)BO$yYK7p{2imNqp7xqHT8D zA+{r6(0tOsA*oUO8w{NkXCBRxUWjozz6WF$-@|}Mhs}X?9keWU* zsn@_2uJe=17T&EdysJ`gYYH|5d6i0UclhHcDa4z~gI{ge-Gx`nLGR^K?Vte*PBl{( z+)}(hJE^)D-&ki(_1fJ9`LY2S8#>bzRcp-IOY}l>?lf$qn&p+b%)HuLQM5=a02*AL zuhHsXG}h&<0{=4=_-21rW2>ZFCEY6N52~bZ2prt03s4~)>JA-_?~t19wkmm{o#hU~ zzkYimz4*3NYoCd93O*wvx)>xDNU8NzQs$Mn+CK$3va2iBv^vLupm5(^eLM%NU z1!j}gy}63xN5(c1lLeEDT`;TGep!mo>Y}Sn_9-_;gRFB(4a$EemNU6-x;W!mCQpXy z=!?8>(*hjb`!cES37lWb)XnXih=72H+;NK-QSa`3+$5>rnMxbnw!15pz=4iT5did% z+Y0@umHHc+FHu{q6f;uOP^#Us=rW(_nqraNx{x4B4&FiR!J&tibIB`fYB@xro*d!v z8R3Q)B-eip3`u`C-WGTiM{A5d@`R>O3j_(65&~{ZtV$O(WX3+@ zZfn)Is8ma?nI4-dyG#g6-`kRbvxk_E zF!J23Bg{|5A7-pubzQ@^3+=XK-|-ktdAFu4X51j6Bs!Uu@irz1j6}hCY<0_AO|fj; zvT+kOURZzS#Y~AMB@E{CRextiu{qY1UB0RdsUSCYsoBz;S&Hh*u}WnhjTbcK)u5#W=QWq0OY9p@dT1F$~tabAQYUry@TF=&hE+JH%h;}|L6Xn-~RLO zJM`gyxc`3tkOja0*OBw({=?Df)$RxOj=sOX4?dpX{q{e6)a&Fk1D zaS5xhh0^no5B8@Oa&Nl`OTuUTA5nnm=cBv3z-Br?>y+s^y13R zq?wmVMN=k!n7=r+sRNj1hXnbPmh>E^8f}%rKHqj~nKUI+FT%#&B6>xY_`0N*fXSTK zt&E2Clci`>vE`JN?6W7AG33>LT~HRy2~&q`DX*es@J(rpO(0MD0Qe$6$85YV15)$JrD|WRdiddoVf<=H}?Rj`Xr`~4h{VxQtRwNTq(?_qJwa% z#mJz4R_U^*st<$DUf0Hp5;7^?+{@VKlSZ1Lun-fzzgGddzJ7}vHA7qp4Yh}?aj}*d zD>Kw4uqs7g`mEJY9!K%}W8@T_y*^RQq}IpEZh`G}aR$=i9HE&)0d>Ohgkwfp0fJQBUn|K1J+iz-vbVUHf$$Xdm(0kW zG-N0&Wyt96ZXBn_VR|^DXvq3!iYNMf+Mdr?Y0~sYarJi0zB947q$(VI?_I*#(VQdw zTVAdG?+|*J&kx3nAhTYJ}k*Qy1N5~GSLCXb#8_Su@BrF?$ z<03!Bk9Q;+b{eq1T^lh;F2Bh1d4eS0KBdcx&x$73>pY-}%GDkS)XYuSCjw$U%C3N` z`m!eh_9Vcb1lW@RdlF!cMfN1%r(?67+DK{&EXW%_mDe?zK(b6rOWHPM8(Zd%sJY&| zwsI84W^C`s(d9tT2|by6PQawd*bg9o2aHY;K!OcQ6b0kkSUw6cb#F*I-)6e<%K&-O zW)d}yDd{jz{o_Jfmbo^tog}-gXgkTgGr_3GVGtm~^X{i&?aB~H@v}4HqI-q!KKm$v zj>jHlDET#ko`=Xdc_OXm$04VqQT*(SbpDf_Bv(ac(_ge(px8pHK(Fp3Yw^<@ikmEsx^fL4`^;S)WXyl=)=EtaL=3AK5$V{$rg_4Od3&J5+fJsrcLX0l$ zrI(tK6KKVkZeBN9LdG=6OXR@!J&VVfUP zY7l+9gqCvdsy(au|3o=veo?H%@ zpVH#BA^mXitcjjdpD?njKW@&ww=igu+8Zj~$+BEqwz6bW*rc_^39|ElUDu_BO|{z+ z`DVvx3VqY$r44e5MF?aYfm}>dLFY6BXNb$(HIaFb*>td$5iU*#n_BF}Y_QpvCf2%h ze5cP}l^?A7TREnRzZ;seqDG7@M{~2X=Z39rnw8_#!uU$dhdXZ(==?>AIiunx$8zz{ ze?sK*V$5@M#9kWlJZIj2h$R5q0%ywjF~S~4LCR{v)EO1@yjX<500B%KFLaUnR1bBE z%g#(zY_CYCx9HwRaJLcMZ3K54!Tr$ztNpr2Y@ZOH(ct!zc-IP7r5Y%KRnNgQSBZyI zxrKNrRkj8W6&r32gR<1uAfGfz83kB8&<8t2l~I3F7YT01=EOmNF5t8gjwzEI#o-n{ zSZNUhlq1(sFSYFTo_yTv{&ii@9z92Ypn#R#%51XqbsOdhjiHY-A4)f1x-E3^nw?S6 zLF?_2jBr63;~a&VjiNWloqh+?+5*RZmo^~_NX-Fh#abzA1`8JWtc3FtAJ~6l7y|MHgzJ7|bsWFj3~I z8WJooY~UT5EdQcGCiBk3-W;Vv(iv*0i#oikq%(Rp%}E>6)Hu7WCcmLZSD$!PeVYxx zE&8@DvVy#JG;hoEMO{PKDH*ufTMm%2j9ms!J zl0_3S2FIumAYfhiN%>^FuRc>In zFV8HY>e~^0=w3yk5eamjdhCR9FooQi$l~I$6s&r9;+X?I z4+UTb31@&)fCvi%otzBaLx+2F-PPYAVlp~LY9Q!;9yuXLuA25a`1t$PwQ?L%EtJrO z89;xB&=Z}-d4I$@ImYhR4f%rkL>*vYrdt|PKFQG_CYAoRg!(##k`00aT$aOQG2PmJQKz%2~QNYv(6x}~# zGz=W{tBV-NM4B!8H-u2)puVcW`T%if>$z3nRt#Edk)G!6i#4)R*_~}mY#G5S5JO^z zLcowWda23`#iDR@8yXA?h8wrG15W^&%$gxn{>QwD<(F$yQcj?B?^gHG-AG$rK+d;>qkwqfjl9m30RqKeDlC zEYjqqJH$0j2j4#p=rj|dpGxp33jQJ3i^jI^Av?!Y%;nAe_mG_;bPWCE>cd%dl#A+^!`n}?f+aIO&s!H6ZGHz`j-IAWq13BL*GT?yI_F#9Lms)Pv&g= z>i+iL|9eDsXCvpI{psEAWJ+)OZ0O$K!uvfYA>~IlzI5crd3TSwLbKcb-lY^}~|SU|LqU?V_yZa7tM{;_9jvzy)2puW9#FNi=D0s&>o=V=EdZF%HA_Apz zN%H6#N0WbvMj?q>mhoiNC{!$-cTzlIO0EN_lmfdX%$LMFf$L&*N6Fh>zjqQwM|=C* z@qcOoO<*uiGFV)NLji;I?}iOF4G0l7Id9a2l%zW-u9%-dM0zSsGgf3Nkw+tcWlcL{ zGvd@;z6M%tzvoe>ExAHxEG73eBu+e|`IqO0Q8UUyPvy_unc=)}({hFv7Vk_y$ek&L zcV;A-Op0cfO+KV#o=t5pDfZc-s%FC`bCc%FO?!%1xJf@+W*A*@)#9LK?ieAvnvO(^ zvBuRRnb~e}CDN$DdP)SB;phE--8eZ=BnDeeeAxgKahEW`!lo*#n1Wu7ES)JB)neO3 zGu3n##MrQzr8EoW8h0C`zQ!4mO0Z?~___*YHm#S!qss?Nw9MEt<1U%8*0dY$;>~8_ z8+J7FdZ#Xs=M{p1GZAd1)#*%Jy~P2IykP)`cuRWx%8({~;O~JUrJf9bgU!b0l-`E^ z!lRp*itbKt(gRCh8xR!M9ONXFc$D5UFoe!62z|gQ@B~v-aiHSt5b9V$MTJTZds5+` zu*?bVAndEVWulTk4Vg_)fT9DT$OL~wZpf$4*Y6I1Jn}I))KRAa#Y3GN0zv!<;`pD% z7GKKeamlTZxkHwe_5Ox`9G{&4K7mA^%cM>y^o;!CVD}egZ||oXz0`9c8x`ves`58P z*&`$8L=vYGhRCKVknGEz``B|Id+uY;eY&_9l@;NubCukG-r3&iAa29nPYOFw zp5!2s5hXbeQm>58&AL9Y(K5IF(Sa&>f*fT7Q4FuMwcHge>-RqBJ2h=W{e6h<<1E%w zTANK$Ut%LQuIy52cHj`Ls^u?4J!Tzmw=N*Cx^b4ej@MGv%eJzDXiu4&ph-^#`d_v} zmug^P(1w@D3p7Q4DxHc147tY2%F|DW5RvK)5_O(xnm`)@>SxQthx0=(-|a;tR9Vgh z7JVkyc$&l-eg^|@-cHo(sz$+Wb*E1*zRBxBT@+XK3Ev}L8VR6*6w*zsS_CzTZjvFa zYXOvuw~_RTs7YTOik+clK$AsjeYU`*u1iAC1DGWK(NWlcLeUIPdv`1QW9&XH3T&n1 z;1tfK>+}!-=r~~jITG#4DEXps)(0U&<(LC-3dV@X6>kVi-buk~#ikXTPe^RmMOIlV zuFCiFWK`)~Rh_4%$|a#nhi8eTcQG$jIw*$pvMh_1Az$R;i^yjs(NZ$cb0JXVyKMLm z>DAaGrkag^J5$+&jXSf+ac3Sgy4|Y_uAR@SwgkS78(B5NJ*Q3+6H822*8n#?;6@NP zp=gAO%i`QgzxweDc?g&VxlcN0rNxR*6Dvl0y&fp0N|~UBpL|C(j!Zf*^cMGtJk?p(s|elMSuUK>f`$3?PDtTin%fwwhWL|@h>9=D0d zS8r7*bABmqp{8p%zuT;Jrwy#$uglHw$H!wFs4UE6EWn{Rk8of+cwN(=d63mY6AR&T zO}90Fu(?pDIZm!0?}Cu4byUY$Dv1gjb+51aMOOfvq$Xgps(2H9-Lep^TQ}r-f|+37 z;+6C@2LV#!1Veo(AS4`55x|0u5p)pXR0U&Xz@cu3p%^VbG{=X9Wm4k&T`XaO08g>^ zhrB4Ek;^IeK4Oyoc@zeOCqK`rbDMsh>Nt6Sc!?Ma?$8Nl!!U@#qclW6N!Lx~MxLq` z^`lX?sH&&0Ma|-@wP+;znonEky{?O!A7O-J4u;~=jdeN&gWA>s&^Xp9*T=9iS} zg}DUl%{A5_lS7^#8}iv)hjpnOvOTm=E-J^kNU>PNdo^j1G7*&rQBS`x5Ktg%T)U!};jajROdYy3AH`{f& z5xzjoTZiA#m8*DZ5@=@^gqZOCz3yV}=&rkCq{&zs#M_CeXd7*3OQ#~xmsk1#bCphk zfskl#H;8h=YKOd_LK-p?Pd*9vhl}XU#+N z*eEmW5oM+b+?4!UnP=DD?n+#{Y-}7G8^^}Rv9WP%Y@DB`e(hGpKb;fjSRk__=r&is zQk55|U(dla^?7S`s#JUBI@L|@rq@WR%2HTk2Tyk`p(+D-6z7!_czOy00VSYNvD_&2 znvOl%kL*_}6zX7T3Ezvm|!tZ{1Ul+Fh!8WDJ2ERq2w11 z&>afIPP_$h2IpWD&?&&&y4?K?Gx4X;E4skyhbcB4t0tcJ$anZ&Rg9y5IdMM1pf#S* zbr-^k+C8ls>0(1C^wjU>sLSG3mS~}72M_0f&548DtsC+?)3zma&jTcb0ZDVAg%TSJ zC7vAT*sr>{J10(gLUt3rA#0X!jpyLmi}?K__1{iTn-oiI>_Vs$F6 zPYLA2N-hD|oN+X5#t%w=ElbtYoq1(qS(34Qkf;^k#rxyqq3?TGth~mT;4{s&OQUxL zS(~6aDz%Z|NRamqdM@PXCC5`#W^-w4*eP6|;yIH~%@r*U18z>?H4MhhEg${f7aH86 zAbSyPndEt?weaM^6ufy|b)QP?v2ZxW{74{$c04bsUxk-mC=f4y%Y0Dda zOJ6;HN_Xu*0)_~L0x)n2n0y5wAZX^zffFEkxU4KQ>Zo$-h7iPOLKotbfQI9VI&>t| z?JkILZY~X(;|By?buCh+Zc8WBy~fV1+Ms`2p6c73MWeZ3OdgWSKjRyqUobhQAyGMZ z7gRn%(4piV;ep(L^@=}#!Q_Hoaa~V6yMRLUuvbw@!)9R-* z5XA}fq&ZzjolTHA2t-xnMNyrFMvN5{h--lOJ2Ms8@$N` z<`ztoi}!L(v`x$>AGDL}IY!bBnJq>ACDqv{yMQI>4fhzPzaRt}5S@sKmV_q)rycP* zZe@aYTL5g<{OD8*<;KAVvaGgU^%4QsjQA1(+@^uHQA1+D@WdrRg5w@;OO|c26rwQM zG+7MTj-6+J8Zd}hCyE};Icl3)b}?fwO-P*uJWqPLwpFmL?ecv0&6}!=;&bBsPNp!p zJ@mY`M<3}1N-deSx_i2I7s`8%nrh8G)3F~0Vvx`(rrkp zPU=cm>QF|&!7hwE(bbV1fMba5>6|^C+Z4|6cDw2Z?3_4%=pAq^14OlAAK50%uipWbW4JOy-y=1_NjS2<6s^=O;MvXg~j- z;rzdUuIyl^;@ajH=y`}AK@SqA`GI|=w&5lC=ir$>f5GE3!t0nprumwP8|n5Mh1-8hopq*KJPb~o3{HfH)mRdBfYrM-Hc-@}6n z-+#3>PtXX49D*6*650VBIi`lU$>icbd?3lNz_+Y6^`x?&twbB zyYJYDFCA@;y$VnD=u>;Bg+p4pvaxup)R)t(Evqi)C|e}Bbf>QTM@5&_D_nY;w_VYX zULZX=weVGiySG{<@9xFIYq?ESWpfm$-Ee+G^F^sq((QNR)tMuB(eBYbrv-!`;5*2F z5x7M%R6uG&Eg>Kt{dUTJ(kjQR7pyG6E zLxk&oMXErxJwCv;aPtE+4V`9SI*Oa@$YPWxaS?|Qy_VaDvicx?+Wf&9W(r&Db;T_T zwXV*lO9*6Dd4WfEQ7lj)dAUGGmT`)oYapT}k1RNP)ro97&}wme2uEjJT={nnVFh{kHzNuk9S3`Nsh z$4Vp>9%h`$kX|Ws5L!xlmo4zZkP4rnti<9)E;Q9|{m4D)tC2%sYN@BBtnxO0dfco3 zZH2dw`re<=tmWeWgl6?8pTD8`wLC6wE?hsM*-9m=qJ5EA6;!BuI!xW$DOYoowA2dj zGCUUJ-nt=&cMy9rXs^(e<*Xclp~w1wA;;f+wST*l`tzksTOZsIJq{TTl7v$fUcvGpheifexv}6ZK z16|pQlNP(N7iTD3wD(h;D;KMh<4yTL8KGO3q@=@KVQaUrtqJ*ju)R~^S)^AD9v73c z8}1)GCQTygfBiO`b0J(`IKkZKbn7aK%DPCrilQBwk~Qh|;qp^GGdw0X=?x_Y!a&GW zXpv%|{7v0ZwNX;l_cbH3pbvK`fD7xZsNI*8Fjw&FE{HbF9sHn|+BO6h?AEiNV#fg# X_jiR#_T&Er00960>pyO!!V3ie!@BC; diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 792ad55b90da6475e557702e55641e25670ee06a..b3228b6a69e7199640a2ce7be753fec98c80ac5d 100644 GIT binary patch literal 11753 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 LJa@|?%{Kx7_PQX9 literal 11532 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 Date: Fri, 10 Dec 2021 12:49:53 -0800 Subject: [PATCH 128/157] fix(storageminer): lint/mod-tidy/extra checks --- node/impl/storminer.go | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 3a6752431..42818067a 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -3,6 +3,7 @@ package impl import ( "context" "encoding/json" + "errors" "fmt" "net/http" "os" @@ -560,11 +561,18 @@ func (sm *StorageMinerAPI) MarketDataTransferUpdates(ctx context.Context) (<-cha } func (sm *StorageMinerAPI) MarketDataTransferDiagnostics(ctx context.Context, mpid peer.ID) (*api.TransferDiagnostics, error) { - + gsTransport, ok := sm.Transport.(*gst.Transport) + if !ok { + return nil, errors.New("api only works for graphsync as transport") + } + graphsyncConcrete, ok := sm.StagingGraphsync.(*gsimpl.GraphSync) + if !ok { + return nil, errors.New("api only works for non-mock graphsync implementation") + } // gather information about active transport channels - transportChannels := sm.Transport.(*gst.Transport).ChannelsForPeer(mpid) + transportChannels := gsTransport.ChannelsForPeer(mpid) // gather information about graphsync state for peer - gsPeerState := sm.StagingGraphsync.(*gsimpl.GraphSync).PeerState(mpid) + gsPeerState := graphsyncConcrete.PeerState(mpid) sendingTransfers := sm.generateTransfers(ctx, transportChannels.SendingChannels, gsPeerState.IncomingState) receivingTransfers := sm.generateTransfers(ctx, transportChannels.ReceivingChannels, gsPeerState.OutgoingState) @@ -598,10 +606,10 @@ func (sm *StorageMinerAPI) generateTransfers(ctx context.Context, channelState = &cs } // add the current request for this channel - tc.convertTransfer(&channelID, channelState, baseDiagnostics, channelRequests.Current, true) + tc.convertTransfer(channelID, true, channelState, baseDiagnostics, channelRequests.Current, true) for _, requestID := range channelRequests.Previous { // add any previous requests that were cancelled for a restart - tc.convertTransfer(&channelID, channelState, baseDiagnostics, requestID, false) + tc.convertTransfer(channelID, true, channelState, baseDiagnostics, requestID, false) } } @@ -619,7 +627,7 @@ type transferConverter struct { } // convert transfer assembles transfer and diagnostic data for a given graphsync/data-transfer request -func (tc *transferConverter) convertTransfer(channelID *datatransfer.ChannelID, channelState *api.DataTransferChannel, baseDiagnostics []string, +func (tc *transferConverter) convertTransfer(channelID datatransfer.ChannelID, hasChannelID bool, channelState *api.DataTransferChannel, baseDiagnostics []string, requestID graphsync.RequestID, isCurrentChannelRequest bool) { diagnostics := baseDiagnostics state, hasState := tc.requestStates[requestID] @@ -627,19 +635,23 @@ func (tc *transferConverter) convertTransfer(channelID *datatransfer.ChannelID, if !hasState { stateString = "no graphsync state found" } - if channelID == nil { + var channelIDPtr *datatransfer.ChannelID + if hasChannelID { diagnostics = append(diagnostics, fmt.Sprintf("No data transfer channel id for GraphSync request ID %d", requestID)) - } else if isCurrentChannelRequest && !hasState { - diagnostics = append(diagnostics, fmt.Sprintf("No current request state for data transfer channel id %s", channelID)) - } else if !isCurrentChannelRequest && hasState { - diagnostics = append(diagnostics, fmt.Sprintf("Graphsync request %d is a previous request on data transfer channel id %s that was restarted, but it is still running", requestID, channelID)) + } else { + channelIDPtr = &channelID + if isCurrentChannelRequest && !hasState { + diagnostics = append(diagnostics, fmt.Sprintf("No current request state for data transfer channel id %s", channelID)) + } else if !isCurrentChannelRequest && hasState { + diagnostics = append(diagnostics, fmt.Sprintf("Graphsync request %d is a previous request on data transfer channel id %s that was restarted, but it is still running", requestID, channelID)) + } } diagnostics = append(diagnostics, tc.gsDiagnostics[requestID]...) transfer := &api.GraphSyncDataTransfer{ RequestID: requestID, RequestState: stateString, IsCurrentChannelRequest: isCurrentChannelRequest, - ChannelID: channelID, + ChannelID: channelIDPtr, ChannelState: channelState, Diagnostics: diagnostics, } @@ -650,12 +662,12 @@ func (tc *transferConverter) convertTransfer(channelID *datatransfer.ChannelID, func (tc *transferConverter) collectRemainingTransfers() { for requestID := range tc.requestStates { if _, ok := tc.matchedRequests[requestID]; !ok { - tc.convertTransfer(nil, nil, nil, requestID, false) + tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) } } for requestID := range tc.gsDiagnostics { if _, ok := tc.matchedRequests[requestID]; !ok { - tc.convertTransfer(nil, nil, nil, requestID, false) + tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) } } } From ced22687eb747078fa67438c525ae9cff9d065f8 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 10 Dec 2021 16:49:39 -0800 Subject: [PATCH 129/157] fix(cmd): fix cli peer decoding --- cmd/lotus-miner/market.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index 531e46ce9..c7089e74e 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -873,7 +873,10 @@ var transfersDiagnosticsCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - targetPeer := peer.ID(cctx.Args().First()) + targetPeer, err := peer.Decode(cctx.Args().First()) + if err != nil { + return err + } diagnostics, err := api.MarketDataTransferDiagnostics(ctx, targetPeer) if err != nil { return err From 8a923fb420ad2ae0d81a2c797924347886cc19df Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 10 Dec 2021 17:50:12 -0800 Subject: [PATCH 130/157] fix(storageminer): fix conditional --- node/impl/storminer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 42818067a..8a3f94e35 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -636,7 +636,7 @@ func (tc *transferConverter) convertTransfer(channelID datatransfer.ChannelID, h stateString = "no graphsync state found" } var channelIDPtr *datatransfer.ChannelID - if hasChannelID { + if !hasChannelID { diagnostics = append(diagnostics, fmt.Sprintf("No data transfer channel id for GraphSync request ID %d", requestID)) } else { channelIDPtr = &channelID From 1078dff3a92e926fac02994b27dc49a75b428bcb Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 13 Dec 2021 11:24:19 -0800 Subject: [PATCH 131/157] feat(storageminer): also list data transfers with no id --- node/impl/storminer.go | 68 +++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 8a3f94e35..764e4fb36 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -569,13 +569,38 @@ func (sm *StorageMinerAPI) MarketDataTransferDiagnostics(ctx context.Context, mp if !ok { return nil, errors.New("api only works for non-mock graphsync implementation") } + + inProgressChannels, err := sm.DataTransfer.InProgressChannels(ctx) + if err != nil { + return nil, err + } + + allReceivingChannels := make(map[datatransfer.ChannelID]datatransfer.ChannelState) + allSendingChannels := make(map[datatransfer.ChannelID]datatransfer.ChannelState) + for channelID, channel := range inProgressChannels { + if channel.OtherPeer() != mpid { + continue + } + if channel.Status() == datatransfer.Completed { + continue + } + if channel.Status() == datatransfer.Failed || channel.Status() == datatransfer.Cancelled { + continue + } + if channel.SelfPeer() == channel.Sender() { + allSendingChannels[channelID] = channel + } else { + allReceivingChannels[channelID] = channel + } + } + // gather information about active transport channels transportChannels := gsTransport.ChannelsForPeer(mpid) // gather information about graphsync state for peer gsPeerState := graphsyncConcrete.PeerState(mpid) - sendingTransfers := sm.generateTransfers(ctx, transportChannels.SendingChannels, gsPeerState.IncomingState) - receivingTransfers := sm.generateTransfers(ctx, transportChannels.ReceivingChannels, gsPeerState.OutgoingState) + sendingTransfers := sm.generateTransfers(ctx, transportChannels.SendingChannels, gsPeerState.IncomingState, allSendingChannels) + receivingTransfers := sm.generateTransfers(ctx, transportChannels.ReceivingChannels, gsPeerState.OutgoingState, allReceivingChannels) return &api.TransferDiagnostics{ SendingTransfers: sendingTransfers, @@ -587,11 +612,14 @@ func (sm *StorageMinerAPI) MarketDataTransferDiagnostics(ctx context.Context, mp // to produce detailed output on what's happening with a transfer func (sm *StorageMinerAPI) generateTransfers(ctx context.Context, transportChannels map[datatransfer.ChannelID]gst.ChannelGraphsyncRequests, - gsPeerState peerstate.PeerState) []*api.GraphSyncDataTransfer { + gsPeerState peerstate.PeerState, + allChannels map[datatransfer.ChannelID]datatransfer.ChannelState) []*api.GraphSyncDataTransfer { tc := &transferConverter{ - matchedRequests: make(map[graphsync.RequestID]*api.GraphSyncDataTransfer), - gsDiagnostics: gsPeerState.Diagnostics(), - requestStates: gsPeerState.RequestStates, + matchedChannelIds: make(map[datatransfer.ChannelID]struct{}), + matchedRequests: make(map[graphsync.RequestID]*api.GraphSyncDataTransfer), + gsDiagnostics: gsPeerState.Diagnostics(), + requestStates: gsPeerState.RequestStates, + allChannels: allChannels, } // iterate through all operating data transfer transport channels @@ -620,10 +648,12 @@ func (sm *StorageMinerAPI) generateTransfers(ctx context.Context, } type transferConverter struct { - matchedRequests map[graphsync.RequestID]*api.GraphSyncDataTransfer - transfers []*api.GraphSyncDataTransfer - gsDiagnostics map[graphsync.RequestID][]string - requestStates graphsync.RequestStates + matchedChannelIds map[datatransfer.ChannelID]struct{} + matchedRequests map[graphsync.RequestID]*api.GraphSyncDataTransfer + transfers []*api.GraphSyncDataTransfer + gsDiagnostics map[graphsync.RequestID][]string + requestStates graphsync.RequestStates + allChannels map[datatransfer.ChannelID]datatransfer.ChannelState } // convert transfer assembles transfer and diagnostic data for a given graphsync/data-transfer request @@ -657,6 +687,9 @@ func (tc *transferConverter) convertTransfer(channelID datatransfer.ChannelID, h } tc.transfers = append(tc.transfers, transfer) tc.matchedRequests[requestID] = transfer + if hasChannelID { + tc.matchedChannelIds[channelID] = struct{}{} + } } func (tc *transferConverter) collectRemainingTransfers() { @@ -670,6 +703,21 @@ func (tc *transferConverter) collectRemainingTransfers() { tc.convertTransfer(datatransfer.ChannelID{}, false, nil, nil, requestID, false) } } + for channelID, channelState := range tc.allChannels { + if _, ok := tc.matchedChannelIds[channelID]; !ok { + channelID := channelID + cs := api.NewDataTransferChannel(channelState.SelfPeer(), channelState) + transfer := &api.GraphSyncDataTransfer{ + RequestID: graphsync.RequestID(-1), + RequestState: "graphsync state unknown", + IsCurrentChannelRequest: false, + ChannelID: &channelID, + ChannelState: &cs, + Diagnostics: []string{"data transfer with no open transport channel, cannot determine linked graphsync request"}, + } + tc.transfers = append(tc.transfers, transfer) + } + } } func (sm *StorageMinerAPI) MarketPendingDeals(ctx context.Context) (api.PendingDealInfo, error) { From f82a262ffec41b486dbf00b5c3d349ec1fc6a975 Mon Sep 17 00:00:00 2001 From: pefish Date: Wed, 29 Dec 2021 17:37:37 +0800 Subject: [PATCH 132/157] Update wdpost_run.go --- storage/wdpost_run.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/storage/wdpost_run.go b/storage/wdpost_run.go index 038ed3ac7..83802a7f3 100644 --- a/storage/wdpost_run.go +++ b/storage/wdpost_run.go @@ -181,9 +181,10 @@ func (s *WindowPoStScheduler) runSubmitPoST( post.ChainCommitRand = commRand // Submit PoST - sm, submitErr := s.submitPoStMessage(ctx, post) - if submitErr != nil { - log.Errorf("submit window post failed: %+v", submitErr) + sm, err := s.submitPoStMessage(ctx, post) + if err != nil { + log.Errorf("submit window post failed: %+v", err) + submitErr = err } else { s.recordProofsEvent(post.Partitions, sm.Cid()) } From 4172a3c8b778e3f62b20ac37291df275792b9c29 Mon Sep 17 00:00:00 2001 From: zl Date: Tue, 28 Dec 2021 10:38:12 +0800 Subject: [PATCH 133/157] ExampleValue for a silce is nil --- api/docgen/docgen.go | 4 +- build/openrpc/full.json.gz | Bin 25722 -> 26581 bytes build/openrpc/miner.json.gz | Bin 11753 -> 12555 bytes build/openrpc/worker.json.gz | Bin 3691 -> 3803 bytes documentation/en/api-v0-methods-miner.md | 773 ++++++++- documentation/en/api-v0-methods-worker.md | 78 +- documentation/en/api-v0-methods.md | 1535 +++++++++++++++-- documentation/en/api-v1-unstable-methods.md | 1636 +++++++++++++++++-- 8 files changed, 3721 insertions(+), 305 deletions(-) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 03ce9109d..571599935 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -1,6 +1,7 @@ package docgen import ( + "encoding/json" "fmt" "go/ast" "go/parser" @@ -252,6 +253,7 @@ func init() { addExample(map[abi.SectorNumber]string{ 123: "can't acquire read lock", }) + addExample(json.RawMessage(`"json raw message"`)) addExample(map[api.SectorState]int{ api.SectorState(sealing.Proving): 120, }) @@ -348,7 +350,7 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} { switch t.Kind() { case reflect.Slice: out := reflect.New(t).Elem() - reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) + out = reflect.Append(out, reflect.ValueOf(ExampleValue(method, t.Elem(), t))) return out.Interface() case reflect.Chan: return ExampleValue(method, t.Elem(), nil) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index c5b98140478ca8678d72b59367c8df5d52328aaf..7ca7301ff72e35e16c485e85f0cd4c306540d3c5 100644 GIT binary patch literal 26581 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 YMei@~G%w9(00030|Cve8McqaP0D>m3!vFvP literal 25722 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index b3228b6a69e7199640a2ce7be753fec98c80ac5d..e7083de2449cc0fec7b2962d0b1856b7fc1e71b9 100644 GIT binary patch literal 12555 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 literal 11753 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 LJa@|?%{Kx7_PQX9 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 1a0cb26b543ca19a460774835bc329b0e76b2aca..717eeaacb2879bc3d4445218e554bffe547f727c 100644 GIT binary patch literal 3803 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 R{|^8F|NkJWl}sqf008mFeN_Me literal 3691 zcmV-x4wUg9iwFP!00000|Lk2`bK5o+{wo;nOWdJlillCy=|k$YScJM)1)^AcHziZ}fmSxm_` zN}z(zs~T>XsuG}oLL4AlIb}hJ_+a<}vLNFrQR9~CX0-IeXjN!KtuZ5^@D#9L_;C=0f+Njp;g(${qJwxnf(%`hufiyNVO zT2-wnoPk;#-SSK{bQrHY;Vo~kN;%DCsAB_So3YgnaAj7sQT*R=$v>=B|ZHfvw1iL0dhTt zfP=}sqAFqFD5uJtF`u5EoZLlOdY0#&%n}H3><1p_>%`%3kj;~1GnM?-in{%yXCpyS8?o9IqFwbvJvb|I>ko)qtK_~rP}c&YD+1G^hSrig zg(B!+a;K!2qAZ9~+JTt``%sTB*Ly&XnUY9TBF)!^G|fQ;Jir7x_&Z9*LJ%ip3X3j( zttN>J41_^Va~7-E{0)YP< ztkq_+s-zMgm5<21m@g={prf3cy2=x-DHqA)$JJNpXMSwHo?Tqi_^t=?DbaIP) zY^q(VijiZ*)F)i|^~o^9N;fZY zBb$>$kBBwlNi# z&2Efoqfy8k(`RHQZ%m(!m7+1#cQB>}YrbD(x&wJ}V>;|>!@fQ;N?h&^d~B#`CDzo? z^}enT%#p5DFr#U;*f}oeXIS9JFpa@vWQ>jBxWuFmO;a}q+Qc-qymV-NZDI}w!yO{1|S6dO&x^{IRVwyLs&n>2T>-xN6nliDoD8{nHzVknq1GP(1`VAc3j`suHNaAfUQj3I9QnLYn^9x{C=5>tP-Fc z$7$6GgnXamT!(rV7|n-fX5z={kXVP531p5#&T1B@pE=W?K4c69HWh z+r8`S?N~5d(H7lX*CwWLc|OZEFD}TPO8|-OxquS_-VA(=S`BDiUIll_(QG@(=q$k3 zIU-5E8{)_G0A(;>VmI}csr0(hh2cqmsd3v=Er;F74Y5zV;MbvM{eGpIJ)leEJJ^EP zz6}{FP92`qwR{bYu04n@8r=MCHoOj@gq^Ntapf(ScMTpSMm>aCoxBR+8LvXvdVQiC znZp>F;vJH5WaRZBa&bp4?zD!4b-gYUE;?{gB&@fJgjL`V)+G}Y`()+wHKS#PNpk8dDj7~ZzMLh&yF0ag&{!{wTSM5K|ir45a zQS>sCsN3X)s=Otf;>7NszdMROV7UY2m6ZEE5&xF3!bz9Av{mfy3HY7OQPA3Z#_4v} z)bZ_ zr4|LIDZ<^s(roJ_C_Mz-KQK_5k>bulX+-HP2>{);s8)#oln_-yR0&ac_M*dzSDmg9 zbk3rCSwuq_QzgYbXbkP3a~Vb55=3dVhs%>A7X~ecA5bBOnRmUJ9p0G48Ma0DbyLmg z${%NYO77!I&%DJm7qz3|en(3&-;LtBw{3@R)$8ccH0Uu^Qv9|Co|?eO-$T|I z=5`jgm~EU~bUG;AJOpT46ylc$_oSbbe(tsTxpBpPvJy02s*kr=IDco$%ym80Prp+7r zdjSn{@_cZrdI*4_RGMENW{{pwdcIfY`TG5eTiKdj$F}=DY+YTz_SDU5AMicO-6p4k zX~@9(N;Z;2ET`^S<62;23a1XIE$>+SLGD=V>lJsbT_N@>iKIbTZ&n4XVB*yCoGmf) zn+kS~o6oSaC3b#8(1pQ01#FI1S^+6Q@wbzecJ#m}j{!D^{2xpKMT}u`cSBsb01VzE z0Kp7>1r%8xu_<64;N~6PL5BDb2I)QE;%2H;Bmp$}JUcA@{d zIPkYLD*d?JHZfk;yk%cfa#Q_=#2&M&#-Ibr#&p z-};S0UYkC;^~#ryMis|$;_%&QPg78PQYD){2z5<-XxqsCWx>!nvC+5n`JC04sQN4X z9YyDIO2ah<4X-3m@!!>UOSX&Tc^tX#QtNT4f?9O zx%h2JO&!m=rywK@JAlnmfB*~-An`681wlwiw70jT#QtcDQMxu!mdo4a{{sL3|NoQ& JrGG@n003TMK^_1A diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 49e8c7a1e..013aed641 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -242,10 +242,18 @@ Inputs: `null` Response: ```json { - "PreCommitControl": null, - "CommitControl": null, - "TerminateControl": null, - "DealPublishControl": null, + "PreCommitControl": [ + "f01234" + ], + "CommitControl": [ + "f01234" + ], + "TerminateControl": [ + "f01234" + ], + "DealPublishControl": [ + "f01234" + ], "DisableOwnerFallback": true, "DisableWorkerFallback": true } @@ -276,7 +284,9 @@ Perms: admin Inputs: ```json [ - null + [ + "write" + ] ] ``` @@ -294,7 +304,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "write" +] +``` ## Check @@ -308,7 +323,15 @@ Inputs: ```json [ 8, - null, + [ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + } + ], true ] ``` @@ -331,12 +354,28 @@ Perms: read Inputs: ```json [ - null, - null + [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], + "Bw==" ] ``` -Response: `null` +Response: +```json +[ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } +] +``` ## Create @@ -370,7 +409,16 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", + "Success": false, + "Error": "\u003cerror\u003e" + } +] +``` ### DagstoreInitializeAll DagstoreInitializeAll initializes all uninitialized shards in bulk, @@ -446,7 +494,16 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", + "State": "ShardStateAvailable", + "Error": "\u003cerror\u003e" + } +] +``` ### DagstoreRecoverShard DagstoreRecoverShard attempts to recover a failed shard. @@ -548,7 +605,33 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +] +``` ### DealsPieceCidBlocklist @@ -557,7 +640,14 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### DealsSetConsiderOfflineRetrievalDeals @@ -651,7 +741,11 @@ Perms: admin Inputs: ```json [ - null + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] ] ``` @@ -679,7 +773,28 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": { + "System": "string value", + "Subsystem": "string value" + }, + "Active": true, + "LastActive": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + }, + "LastResolved": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + } + } +] +``` ### LogList @@ -688,7 +803,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "string value" +] +``` ### LogSetLevel @@ -741,8 +861,94 @@ Inputs: Response: ```json { - "ReceivingTransfers": null, - "SendingTransfers": null + "ReceivingTransfers": [ + { + "RequestID": 4, + "RequestState": "string value", + "IsCurrentChannelRequest": true, + "ChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "ChannelState": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Diagnostics": [ + "string value" + ] + } + ], + "SendingTransfers": [ + { + "RequestID": 4, + "RequestState": "string value", + "IsCurrentChannelRequest": true, + "ChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "ChannelState": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Diagnostics": [ + "string value" + ] + } + ] } ``` @@ -768,7 +974,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } ``` @@ -906,7 +1125,40 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` ### MarketListDeals @@ -915,7 +1167,33 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +] +``` ### MarketListIncompleteDeals @@ -924,7 +1202,65 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "AddFundsCid": null, + "PublishCid": null, + "Miner": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Client": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "State": 42, + "PiecePath": ".lotusminer/fstmp123", + "MetadataPath": ".lotusminer/fstmp123", + "SlashEpoch": 10101, + "FastRetrieval": true, + "Message": "string value", + "FundsReserved": "0", + "Ref": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "AvailableForRetrieval": true, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "TransferChannelId": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "SectorNumber": 9, + "InboundCAR": "string value" + } +] +``` ### MarketListRetrievalDeals @@ -933,7 +1269,51 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "Selector": { + "Raw": "Ynl0ZSBhcnJheQ==" + }, + "PieceCID": null, + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "UnsealPrice": "0", + "StoreID": 42, + "ChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "PieceInfo": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Deals": [ + { + "DealID": 5432, + "SectorID": 9, + "Offset": 1032, + "Length": 1032 + } + ] + }, + "Status": 0, + "Receiver": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "TotalSent": 42, + "FundsReceived": "0", + "Message": "string value", + "CurrentInterval": 42, + "LegacyProtocol": true + } +] +``` ### MarketPendingDeals @@ -945,7 +1325,29 @@ Inputs: `null` Response: ```json { - "Deals": null, + "Deals": [ + { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "ClientSignature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ], "PublishPeriodStart": "0001-01-01T00:00:00Z", "PublishPeriod": 60000000000 } @@ -1063,7 +1465,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -1160,9 +1564,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -1179,9 +1589,15 @@ Inputs: `null` Response: ```json { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ``` @@ -1194,9 +1610,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -1213,7 +1635,9 @@ Inputs: [ { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ] ``` @@ -1264,7 +1688,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -1285,8 +1711,12 @@ Response: { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Agent": "string value", - "Addrs": null, - "Protocols": null, + "Addrs": [ + "string value" + ], + "Protocols": [ + "string value" + ], "ConnMgrMeta": { "FirstSeen": "0001-01-01T00:00:00Z", "Value": 123, @@ -1307,7 +1737,17 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] + } +] +``` ### NetPubsubScores @@ -1316,7 +1756,28 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Score": { + "Score": 12.3, + "Topics": { + "/blocks": { + "TimeInMesh": 60000000000, + "FirstMessageDeliveries": 122, + "MeshMessageDeliveries": 1234, + "InvalidMessageDeliveries": 3 + } + }, + "AppSpecificScore": 12.3, + "IPColocationFactor": 12.3, + "BehaviourPenalty": 12.3 + } + } +] +``` ## Pieces @@ -1341,7 +1802,15 @@ Response: "CID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "PieceBlockLocations": null + "PieceBlockLocations": [ + { + "RelOffset": 42, + "BlockSize": 42, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ] } ``` @@ -1365,7 +1834,14 @@ Response: "PieceCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Deals": null + "Deals": [ + { + "DealID": 5432, + "SectorID": 9, + "Offset": 1032, + "Length": 1032 + } + ] } ``` @@ -1376,7 +1852,14 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### PiecesListPieces @@ -1385,7 +1868,14 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ## Pledge @@ -1551,7 +2041,9 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + [ + "Ynl0ZSBhcnJheQ==" + ], { "Code": 0, "Message": "string value" @@ -1576,7 +2068,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1682,7 +2174,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1707,7 +2199,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1732,7 +2224,7 @@ Inputs: }, "ID": "07070707-0707-0707-0707-070707070707" }, - null, + "Bw==", { "Code": 0, "Message": "string value" @@ -1918,7 +2410,22 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Sectors": [ + 123, + 124 + ], + "FailedSectors": { + "123": "can't acquire read lock" + }, + "Msg": null, + "Error": "string value" + } +] +``` ### SectorCommitPending SectorCommitPending returns a list of pending Commit sectors to be sent in the next aggregate message @@ -1928,7 +2435,15 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Miner": 1000, + "Number": 9 + } +] +``` ### SectorGetExpectedSealDuration SectorGetExpectedSealDuration gets the expected time for a sector to seal @@ -1974,7 +2489,19 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Sectors": [ + 123, + 124 + ], + "Msg": null, + "Error": "string value" + } +] +``` ### SectorPreCommitPending SectorPreCommitPending returns a list of pending PreCommit sectors to be sent in the next batch message @@ -1984,7 +2511,15 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Miner": 1000, + "Number": 9 + } +] +``` ### SectorRemove SectorRemove removes the sector from storage. It doesn't terminate it on-chain, which can @@ -2084,7 +2619,15 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Miner": 1000, + "Number": 9 + } +] +``` ## Sectors @@ -2114,7 +2657,9 @@ Perms: read Inputs: ```json [ - null + [ + "Proving" + ] ] ``` @@ -2168,14 +2713,49 @@ Response: "CommD": null, "CommR": null, "Proof": "Ynl0ZSBhcnJheQ==", - "Deals": null, - "Pieces": null, + "Deals": [ + 5432 + ], + "Pieces": [ + { + "Piece": { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + }, + "DealInfo": { + "PublishCid": null, + "DealID": 5432, + "DealProposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "DealSchedule": { + "StartEpoch": 10101, + "EndEpoch": 10101 + }, + "KeepUnsealed": true + } + } + ], "Ticket": { - "Value": null, + "Value": "Bw==", "Epoch": 10101 }, "Seed": { - "Value": null, + "Value": "Bw==", "Epoch": 10101 }, "PreCommitMsg": null, @@ -2183,7 +2763,14 @@ Response: "Retries": 42, "ToUpgrade": true, "LastErr": "string value", - "Log": null, + "Log": [ + { + "Kind": "string value", + "Timestamp": 42, + "Trace": "string value", + "Message": "string value" + } + ], "SealProof": 8, "Activation": 10101, "Expiration": 10101, @@ -2227,7 +2814,7 @@ Inputs: }, 1040384, 1024, - null, + "Bw==", null ] ``` @@ -2277,13 +2864,19 @@ Inputs: [ { "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", - "URLs": null, + "URLs": [ + "string value" + ], "Weight": 42, "MaxStorage": 42, "CanSeal": true, "CanStore": true, - "Groups": null, - "AllowTo": null + "Groups": [ + "string value" + ], + "AllowTo": [ + "string value" + ] }, { "Capacity": 9, @@ -2312,7 +2905,27 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", + "URLs": [ + "string value" + ], + "Weight": 42, + "MaxStorage": 42, + "CanSeal": true, + "CanStore": true, + "Groups": [ + "string value" + ], + "AllowTo": [ + "string value" + ] + } +] +``` ### StorageDeclareSector @@ -2371,7 +2984,21 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", + "URLs": [ + "string value" + ], + "Weight": 42, + "CanSeal": true, + "CanStore": true, + "Primary": true + } +] +``` ### StorageGetLocks @@ -2424,13 +3051,19 @@ Response: ```json { "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", - "URLs": null, + "URLs": [ + "string value" + ], "Weight": 42, "MaxStorage": 42, "CanSeal": true, "CanStore": true, - "Groups": null, - "AllowTo": null + "Groups": [ + "string value" + ], + "AllowTo": [ + "string value" + ] } ``` diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 35f337121..566a650fa 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -103,7 +103,9 @@ Response: "MemSwap": 42, "MemSwapUsed": 42, "CPUs": 42, - "GPUs": null, + "GPUs": [ + "string value" + ], "Resources": { "seal/v0/addpiece": { "0": { @@ -691,7 +693,18 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", + "Weight": 42, + "LocalPath": "string value", + "CanSeal": true, + "CanStore": true + } +] +``` ### Remove Storage / Other @@ -749,7 +762,9 @@ Inputs: }, "ProofType": 8 }, - null, + [ + 1024 + ], 1024, {} ] @@ -784,7 +799,12 @@ Inputs: }, "ProofType": 8 }, - null + [ + { + "Offset": 1024, + "Size": 1024 + } + ] ] ``` @@ -946,7 +966,9 @@ Inputs: { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - null + [ + "Ynl0ZSBhcnJheQ==" + ] ] ``` @@ -979,7 +1001,12 @@ Inputs: }, "ProofType": 8 }, - null + [ + { + "Offset": 1024, + "Size": 1024 + } + ] ] ``` @@ -1012,7 +1039,14 @@ Inputs: }, "ProofType": 8 }, - null + [ + { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ] ] ``` @@ -1045,9 +1079,16 @@ Inputs: }, "ProofType": 8 }, - null, - null, - null, + "Bw==", + "Bw==", + [ + { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], { "Unsealed": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -1085,7 +1126,7 @@ Inputs: }, "ProofType": 8 }, - null + "Bw==" ] ``` @@ -1115,8 +1156,15 @@ Inputs: }, "ProofType": 8 }, - null, - null + "Bw==", + [ + { + "Size": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ] ] ``` @@ -1146,7 +1194,7 @@ Inputs: }, "ProofType": 8 }, - null + "Bw==" ] ``` @@ -1263,7 +1311,7 @@ Inputs: }, 1040384, 1024, - null, + "Bw==", { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 0544a9acc..59dfb09f6 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -299,7 +299,9 @@ Perms: admin Inputs: ```json [ - null + [ + "write" + ] ] ``` @@ -317,7 +319,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "write" +] +``` ## Beacon The Beacon method group contains methods for interacting with the random beacon (DRAND) @@ -422,9 +429,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -479,9 +500,54 @@ Inputs: Response: ```json { - "BlsMessages": null, - "SecpkMessages": null, - "Cids": null + "BlsMessages": [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "SecpkMessages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Cids": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -557,7 +623,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetNode @@ -597,7 +687,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetParentReceipts ChainGetParentReceipts returns receipts for messages in parent tipset of @@ -616,7 +730,16 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` ### ChainGetPath ChainGetPath returns a set of revert/apply operations needed to get from @@ -658,7 +781,19 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainGetRandomnessFromBeacon ChainGetRandomnessFromBeacon is used to sample the beacon for randomness. @@ -683,7 +818,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### ChainGetRandomnessFromTickets ChainGetRandomnessFromTickets is used to sample the chain for randomness. @@ -708,7 +843,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### ChainGetTipSet ChainGetTipSet returns the tipset specified by the given TipSetKey. @@ -814,7 +949,19 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainReadObj ChainReadObj reads ipld nodes referenced by the specified CID from chain @@ -988,7 +1135,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } ``` @@ -1058,7 +1218,30 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Err": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "MinPrice": "0", + "UnsealPrice": "0", + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + } +] +``` ### ClientGenCar ClientGenCar generates a CAR file for the specified file. @@ -1103,7 +1286,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1142,7 +1339,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1180,7 +1390,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1219,7 +1443,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1267,7 +1504,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } }, "Event": 5 @@ -1325,7 +1575,40 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` ### ClientListDeals ClientListDeals returns information about the deals made by the local client. @@ -1335,7 +1618,88 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "DealStages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + }, + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } + } +] +``` ### ClientListImports ClientListImports lists imported files and their root CIDs @@ -1345,7 +1709,19 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": 50, + "Err": "string value", + "Root": null, + "Source": "string value", + "FilePath": "string value", + "CARPath": "string value" + } +] +``` ### ClientListRetrievals ClientQueryAsk returns a signed StorageAsk from the specified miner. @@ -1356,7 +1732,61 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "PieceCID": null, + "PricePerByte": "0", + "UnsealPrice": "0", + "Status": 0, + "Message": "string value", + "Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "BytesReceived": 42, + "BytesPaidFor": 42, + "TotalPaid": "0", + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Event": 5 + } +] +``` ### ClientMinerQueryOffer ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. @@ -1830,7 +2260,28 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": { + "System": "string value", + "Subsystem": "string value" + }, + "Active": true, + "LastActive": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + }, + "LastResolved": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + } + } +] +``` ### LogList @@ -1839,7 +2290,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "string value" +] +``` ### LogSetLevel @@ -1984,11 +2440,46 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconValues": null, - "Messages": null, + "BeaconValues": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "Messages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], "Epoch": 10101, "Timestamp": 42, - "WinningPoStProof": null + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ] } ] ``` @@ -2005,9 +2496,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -2031,8 +2536,16 @@ Response: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -2062,14 +2575,27 @@ Response: { "MinerPower": "0", "NetworkPower": "0", - "Sectors": null, + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], "WorkerKey": "f01234", "SectorSize": 34359738368, "PrevBeaconEntry": { "Round": 42, "Data": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], "EligibleForMining": true } ``` @@ -2088,11 +2614,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolBatchPushMessage MpoolBatchPushMessage batch pushes a unsigned message to mempool. @@ -2103,14 +2661,58 @@ Perms: sign Inputs: ```json [ - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], { "MaxFee": "0" } ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolBatchPushUntrusted MpoolBatchPushUntrusted batch pushes a signed message to mempool from untrusted sources. @@ -2121,11 +2723,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolClear MpoolClear clears pending messages from the mpool @@ -2153,7 +2787,9 @@ Inputs: `null` Response: ```json { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2198,7 +2834,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolPush MpoolPush pushes a signed message to mempool. @@ -2370,7 +3034,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolSetConfig MpoolSetConfig sets the mpool config to (a copy of) the supplied config @@ -2382,7 +3074,9 @@ Inputs: ```json [ { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2610,7 +3304,9 @@ Inputs: ```json [ 42, - null, + [ + "f01234" + ], 10101, "0", "f01234", @@ -2671,7 +3367,21 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ID": 9, + "To": "f01234", + "Value": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Approved": [ + "f01234" + ] + } +] +``` ### MsigGetVested MsigGetVested returns the amount of FIL that vested in a multisig in a certain period. @@ -2881,7 +3591,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -2978,9 +3690,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -2997,9 +3715,15 @@ Inputs: `null` Response: ```json { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ``` @@ -3012,9 +3736,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -3031,7 +3761,9 @@ Inputs: [ { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ] ``` @@ -3082,7 +3814,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -3103,8 +3837,12 @@ Response: { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Agent": "string value", - "Addrs": null, - "Protocols": null, + "Addrs": [ + "string value" + ], + "Protocols": [ + "string value" + ], "ConnMgrMeta": { "FirstSeen": "0001-01-01T00:00:00Z", "Value": 123, @@ -3125,7 +3863,17 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] + } +] +``` ### NetPubsubScores @@ -3134,7 +3882,28 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Score": { + "Score": 12.3, + "Topics": { + "/blocks": { + "TimeInMesh": 60000000000, + "FirstMessageDeliveries": 122, + "MeshMessageDeliveries": 1234, + "InvalidMessageDeliveries": 3 + } + }, + "AppSpecificScore": 12.3, + "IPColocationFactor": 12.3, + "BehaviourPenalty": 12.3 + } + } +] +``` ## Paych The Paych methods are for interacting with and managing payment channels @@ -3273,7 +4042,12 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### PaychNewPayment @@ -3285,7 +4059,19 @@ Inputs: [ "f01234", "f01234", - null + [ + { + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] ] ``` @@ -3296,7 +4082,33 @@ Response: "WaitSentinel": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Vouchers": null + "Vouchers": [ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] } ``` @@ -3362,7 +4174,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3398,7 +4215,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3434,7 +4256,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3476,7 +4303,12 @@ Response: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3498,7 +4330,36 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` ### PaychVoucherSubmit @@ -3523,7 +4384,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3591,7 +4457,15 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Miner": "f01234", + "Epoch": 10101 + } +] +``` ### StateCall StateCall runs the given message and returns its result without any persisted changes. @@ -3693,8 +4567,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -3800,7 +4739,23 @@ Inputs: ```json [ 10101, - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -3818,7 +4773,138 @@ Response: "Root": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Trace": null + "Trace": [ + { + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] + }, + "Error": "string value", + "Duration": 60000000000 + } + ] } ``` @@ -3936,7 +5022,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateGetRandomnessFromTickets StateGetRandomnessFromTickets is used to sample the chain for randomness. @@ -3961,7 +5047,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateGetReceipt StateGetReceipt returns the message receipt for the given message or for a @@ -4023,7 +5109,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateListMessages StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height. @@ -4050,7 +5141,14 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### StateListMiners StateListMiners returns the addresses of every miner that has claimed power in the Power Actor @@ -4072,7 +5170,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateLookupID StateLookupID retrieves the ID address of the given address @@ -4272,7 +5375,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateMinerAvailableBalance StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent @@ -4318,7 +5443,18 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] +``` ### StateMinerFaults StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner @@ -4376,10 +5512,14 @@ Response: "Owner": "f01234", "Worker": "f01234", "NewWorker": "f01234", - "ControlAddresses": null, + "ControlAddresses": [ + "f01234" + ], "WorkerChangeEpoch": 10101, "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Multiaddrs": null, + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], "WindowPoStProofType": 8, "SectorSize": 34359738368, "WindowPoStPartitionSectors": 42, @@ -4404,7 +5544,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4446,7 +5588,33 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } +] +``` ### StateMinerPower StateMinerPower returns the power of the indicated miner @@ -4501,7 +5669,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4668,7 +5838,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateNetworkName StateNetworkName returns the name of the network the node is synced to @@ -4834,8 +6026,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -5011,7 +6268,9 @@ Response: "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Activation": 10101, "Expiration": 10101, "DealWeight": "0", @@ -5085,7 +6344,9 @@ Response: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -5381,9 +6642,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5438,7 +6713,26 @@ Inputs: `null` Response: ```json { - "ActiveSyncs": null, + "ActiveSyncs": [ + { + "WorkerID": 42, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Target": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Stage": 1, + "Height": 10101, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Message": "string value" + } + ], "VMApplied": 42 } ``` @@ -5463,9 +6757,23 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5489,8 +6797,16 @@ Inputs: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ] ``` @@ -5651,7 +6967,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### WalletNew WalletNew creates a new address in the wallet with the given sigType. diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index c1d6c76e0..24a142224 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -305,7 +305,9 @@ Perms: admin Inputs: ```json [ - null + [ + "write" + ] ] ``` @@ -323,7 +325,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "write" +] +``` ## Beacon The Beacon method group contains methods for interacting with the random beacon (DRAND) @@ -454,9 +461,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -511,9 +532,54 @@ Inputs: Response: ```json { - "BlsMessages": null, - "SecpkMessages": null, - "Cids": null + "BlsMessages": [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "SecpkMessages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], + "Cids": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -589,7 +655,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetNode @@ -629,7 +719,31 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + } +] +``` ### ChainGetParentReceipts ChainGetParentReceipts returns receipts for messages in parent tipset of @@ -648,7 +762,16 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + } +] +``` ### ChainGetPath ChainGetPath returns a set of revert/apply operations needed to get from @@ -690,7 +813,19 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainGetTipSet ChainGetTipSet returns the tipset specified by the given TipSetKey. @@ -828,7 +963,19 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": "string value", + "Val": { + "Cids": null, + "Blocks": null, + "Height": 0 + } + } +] +``` ### ChainReadObj ChainReadObj reads ipld nodes referenced by the specified CID from chain @@ -1002,7 +1149,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } ``` @@ -1069,7 +1229,12 @@ Inputs: "Root": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "DAGs": null, + "DAGs": [ + { + "DataSelector": "Links/21/Hash/Links/42/Hash", + "ExportMerkleProof": true + } + ], "FromLocalCAR": "string value", "DealID": 5 }, @@ -1098,7 +1263,30 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Err": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "MinPrice": "0", + "UnsealPrice": "0", + "PricePerByte": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + } +] +``` ### ClientGenCar ClientGenCar generates a CAR file for the specified file. @@ -1143,7 +1331,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1182,7 +1384,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1220,7 +1435,21 @@ Response: "State": 42, "Message": "string value", "DealStages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] }, "Provider": "f01234", "DataRef": { @@ -1259,7 +1488,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } } } @@ -1307,7 +1549,20 @@ Response: "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Transferred": 42, "Stages": { - "Stages": null + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] } }, "Event": 5 @@ -1365,7 +1620,40 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } +] +``` ### ClientListDeals ClientListDeals returns information about the deals made by the local client. @@ -1375,7 +1663,88 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "DealStages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "ExpectedDuration": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + }, + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + } + } +] +``` ### ClientListImports ClientListImports lists imported files and their root CIDs @@ -1385,7 +1754,19 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Key": 50, + "Err": "string value", + "Root": null, + "Source": "string value", + "FilePath": "string value", + "CARPath": "string value" + } +] +``` ### ClientListRetrievals ClientListRetrievals returns information about retrievals made by the local client @@ -1395,7 +1776,61 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + { + "PayloadCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ID": 5, + "PieceCID": null, + "PricePerByte": "0", + "UnsealPrice": "0", + "Status": 0, + "Message": "string value", + "Provider": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "BytesReceived": 42, + "BytesPaidFor": 42, + "TotalPaid": "0", + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42, + "Stages": { + "Stages": [ + { + "Name": "string value", + "Description": "string value", + "CreatedTime": "0001-01-01T00:00:00Z", + "UpdatedTime": "0001-01-01T00:00:00Z", + "Logs": [ + { + "Log": "string value", + "UpdatedTime": "0001-01-01T00:00:00Z" + } + ] + } + ] + } + }, + "Event": 5 + } +] +``` ### ClientMinerQueryOffer ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. @@ -1837,7 +2272,28 @@ Perms: admin Inputs: `null` -Response: `null` +Response: +```json +[ + { + "Type": { + "System": "string value", + "Subsystem": "string value" + }, + "Active": true, + "LastActive": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + }, + "LastResolved": { + "Type": "string value", + "Message": "json raw message", + "Time": "0001-01-01T00:00:00Z" + } + } +] +``` ### LogList @@ -1846,7 +2302,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "string value" +] +``` ### LogSetLevel @@ -1991,11 +2452,46 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconValues": null, - "Messages": null, + "BeaconValues": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "Messages": [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], "Epoch": 10101, "Timestamp": 42, - "WinningPoStProof": null + "WinningPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ] } ] ``` @@ -2012,9 +2508,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -2038,8 +2548,16 @@ Response: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ``` @@ -2069,14 +2587,27 @@ Response: { "MinerPower": "0", "NetworkPower": "0", - "Sectors": null, + "Sectors": [ + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + } + ], "WorkerKey": "f01234", "SectorSize": 34359738368, "PrevBeaconEntry": { "Round": 42, "Data": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], "EligibleForMining": true } ``` @@ -2095,11 +2626,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolBatchPushMessage MpoolBatchPushMessage batch pushes a unsigned message to mempool. @@ -2110,14 +2673,58 @@ Perms: sign Inputs: ```json [ - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], { "MaxFee": "0" } ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolBatchPushUntrusted MpoolBatchPushUntrusted batch pushes a signed message to mempool from untrusted sources. @@ -2128,11 +2735,43 @@ Perms: write Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### MpoolCheckMessages MpoolCheckMessages performs logical checks on a batch of messages @@ -2143,11 +2782,47 @@ Perms: read Inputs: ```json [ - null + [ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "ValidNonce": true + } + ] ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolCheckPendingMessages MpoolCheckPendingMessages performs logical checks for all pending messages from a given address @@ -2162,7 +2837,24 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolCheckReplaceMessages MpoolCheckReplaceMessages performs logical checks on pending messages with replacement @@ -2173,11 +2865,44 @@ Perms: read Inputs: ```json [ - null + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ] ] ``` -Response: `null` +Response: +```json +[ + [ + { + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Code": 0, + "OK": true, + "Err": "string value", + "Hint": { + "abc": 123 + } + } + ] +] +``` ### MpoolClear MpoolClear clears pending messages from the mpool @@ -2205,7 +2930,9 @@ Inputs: `null` Response: ```json { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2250,7 +2977,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolPush MpoolPush pushes a signed message to mempool. @@ -2422,7 +3177,35 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` ### MpoolSetConfig MpoolSetConfig sets the mpool config to (a copy of) the supplied config @@ -2434,7 +3217,9 @@ Inputs: ```json [ { - "PriorityAddrs": null, + "PriorityAddrs": [ + "f01234" + ], "SizeLimitHigh": 123, "SizeLimitLow": 123, "ReplaceByFeeRatio": 12.3, @@ -2790,7 +3575,9 @@ Inputs: ```json [ 42, - null, + [ + "f01234" + ], 10101, "0", "f01234", @@ -2866,7 +3653,21 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ID": 9, + "To": "f01234", + "Value": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "Approved": [ + "f01234" + ] + } +] +``` ### MsigGetVested MsigGetVested returns the amount of FIL that vested in a multisig in a certain period. @@ -3151,7 +3952,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -3248,9 +4051,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -3267,9 +4076,15 @@ Inputs: `null` Response: ```json { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ``` @@ -3282,9 +4097,15 @@ Inputs: ```json [ { - "Peers": null, - "IPAddrs": null, - "IPSubnets": null + "Peers": [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ], + "IPAddrs": [ + "string value" + ], + "IPSubnets": [ + "string value" + ] } ] ``` @@ -3301,7 +4122,9 @@ Inputs: [ { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ] ``` @@ -3352,7 +4175,9 @@ Response: ```json { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Addrs": [] + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] } ``` @@ -3373,8 +4198,12 @@ Response: { "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", "Agent": "string value", - "Addrs": null, - "Protocols": null, + "Addrs": [ + "string value" + ], + "Protocols": [ + "string value" + ], "ConnMgrMeta": { "FirstSeen": "0001-01-01T00:00:00Z", "Value": 123, @@ -3395,7 +4224,17 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Addrs": [ + "/ip4/52.36.61.156/tcp/1347/p2p/12D3KooWFETiESTf1v4PGUvtnxMAcEFMzLZbJGg4tjWfGEimYior" + ] + } +] +``` ### NetPubsubScores @@ -3404,7 +4243,28 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + { + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Score": { + "Score": 12.3, + "Topics": { + "/blocks": { + "TimeInMesh": 60000000000, + "FirstMessageDeliveries": 122, + "MeshMessageDeliveries": 1234, + "InvalidMessageDeliveries": 3 + } + }, + "AppSpecificScore": 12.3, + "IPColocationFactor": 12.3, + "BehaviourPenalty": 12.3 + } + } +] +``` ## Node These methods are general node management and status commands @@ -3577,7 +4437,12 @@ Perms: read Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### PaychNewPayment @@ -3589,7 +4454,19 @@ Inputs: [ "f01234", "f01234", - null + [ + { + "Amount": "0", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "MinSettle": 10101, + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] ] ``` @@ -3600,7 +4477,33 @@ Response: "WaitSentinel": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Vouchers": null + "Vouchers": [ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } + ] } ``` @@ -3666,7 +4569,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3702,7 +4610,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3738,7 +4651,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3780,7 +4698,12 @@ Response: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3802,7 +4725,36 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` ### PaychVoucherSubmit @@ -3827,7 +4779,12 @@ Inputs: "Nonce": 42, "Amount": "0", "MinSettleHeight": 10101, - "Merges": null, + "Merges": [ + { + "Lane": 42, + "Nonce": 42 + } + ], "Signature": { "Type": 2, "Data": "Ynl0ZSBhcnJheQ==" @@ -3895,7 +4852,15 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "Miner": "f01234", + "Epoch": 10101 + } +] +``` ### StateCall StateCall runs the given message and returns its result without any persisted changes. @@ -3997,8 +4962,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -4104,7 +5134,23 @@ Inputs: ```json [ 10101, - null, + [ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } + ], [ { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" @@ -4122,7 +5168,138 @@ Response: "Root": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "Trace": null + "Trace": [ + { + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] + }, + "Error": "string value", + "Duration": 60000000000 + } + ] } ``` @@ -4195,7 +5372,7 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, 1, - null + "json raw message" ] ``` @@ -4259,7 +5436,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateGetRandomnessFromTickets StateGetRandomnessFromTickets is used to sample the chain for randomness. @@ -4284,7 +5461,7 @@ Inputs: ] ``` -Response: `null` +Response: `"Bw=="` ### StateListActors StateListActors returns the addresses of every actor in the state @@ -4306,7 +5483,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateListMessages StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height. @@ -4333,7 +5515,14 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` ### StateListMiners StateListMiners returns the addresses of every miner that has claimed power in the Power Actor @@ -4355,7 +5544,12 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### StateLookupID StateLookupID retrieves the ID address of the given address @@ -4555,7 +5749,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateMinerAvailableBalance StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent @@ -4601,7 +5817,18 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "PostSubmissions": [ + 5, + 1 + ], + "DisputableProofCount": 42 + } +] +``` ### StateMinerFaults StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner @@ -4659,10 +5886,14 @@ Response: "Owner": "f01234", "Worker": "f01234", "NewWorker": "f01234", - "ControlAddresses": null, + "ControlAddresses": [ + "f01234" + ], "WorkerChangeEpoch": 10101, "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", - "Multiaddrs": null, + "Multiaddrs": [ + "Ynl0ZSBhcnJheQ==" + ], "WindowPoStProofType": 8, "SectorSize": 34359738368, "WindowPoStPartitionSectors": 42, @@ -4687,7 +5918,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4729,7 +5962,33 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "AllSectors": [ + 5, + 1 + ], + "FaultySectors": [ + 5, + 1 + ], + "RecoveringSectors": [ + 5, + 1 + ], + "LiveSectors": [ + 5, + 1 + ], + "ActiveSectors": [ + 5, + 1 + ] + } +] +``` ### StateMinerPower StateMinerPower returns the power of the indicated miner @@ -4784,7 +6043,9 @@ Inputs: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -4951,7 +6212,29 @@ Inputs: ] ``` -Response: `null` +Response: +```json +[ + { + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": [ + 5432 + ], + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0", + "SectorKeyCID": null + } +] +``` ### StateNetworkName StateNetworkName returns the name of the network the node is synced to @@ -5117,8 +6400,73 @@ Response: }, "Error": "string value", "Duration": 60000000000, - "GasCharges": null, - "Subcalls": null + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": [ + { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": [ + { + "Name": "string value", + "loc": [ + { + "File": "string value", + "Line": 123, + "Function": "string value" + } + ], + "tg": 9, + "cg": 9, + "sg": 9, + "vtg": 9, + "vcg": 9, + "vsg": 9, + "tt": 60000000000, + "ex": {} + } + ], + "Subcalls": null + } + ] }, "Error": "string value", "Duration": 60000000000 @@ -5251,7 +6599,9 @@ Response: "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Activation": 10101, "Expiration": 10101, "DealWeight": "0", @@ -5325,7 +6675,9 @@ Response: "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" }, "SealRandEpoch": 10101, - "DealIDs": null, + "DealIDs": [ + 5432 + ], "Expiration": 10101, "ReplaceCapacity": true, "ReplaceSectorDeadline": 42, @@ -5568,9 +6920,23 @@ Response: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5625,7 +6991,26 @@ Inputs: `null` Response: ```json { - "ActiveSyncs": null, + "ActiveSyncs": [ + { + "WorkerID": 42, + "Base": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Target": { + "Cids": null, + "Blocks": null, + "Height": 0 + }, + "Stage": 1, + "Height": 10101, + "Start": "0001-01-01T00:00:00Z", + "End": "0001-01-01T00:00:00Z", + "Message": "string value" + } + ], "VMApplied": 42 } ``` @@ -5650,9 +7035,23 @@ Inputs: "WinCount": 9, "VRFProof": "Ynl0ZSBhcnJheQ==" }, - "BeaconEntries": null, - "WinPoStProof": null, - "Parents": null, + "BeaconEntries": [ + { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + } + ], + "WinPoStProof": [ + { + "PoStProof": 8, + "ProofBytes": "Ynl0ZSBhcnJheQ==" + } + ], + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], "ParentWeight": "0", "Height": 10101, "ParentStateRoot": { @@ -5676,8 +7075,16 @@ Inputs: "ForkSignaling": 42, "ParentBaseFee": "0" }, - "BlsMessages": null, - "SecpkMessages": null + "BlsMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ], + "SecpkMessages": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + ] } ] ``` @@ -5838,7 +7245,12 @@ Perms: write Inputs: `null` -Response: `null` +Response: +```json +[ + "f01234" +] +``` ### WalletNew WalletNew creates a new address in the wallet with the given sigType. From 2c3d0d826d1f4ec9d77ee4552f658ad8751bdb36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:23:17 +0000 Subject: [PATCH 134/157] tvx runner: use network version from variant. --- conformance/driver.go | 22 +++++++++------------- conformance/runner.go | 19 +++++++++++-------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/conformance/driver.go b/conformance/driver.go index 6df7b9115..a065d1530 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -5,6 +5,8 @@ import ( gobig "math/big" "os" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/state" @@ -187,11 +189,12 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params } type ExecuteMessageParams struct { - Preroot cid.Cid - Epoch abi.ChainEpoch - Message *types.Message - CircSupply abi.TokenAmount - BaseFee abi.TokenAmount + Preroot cid.Cid + Epoch abi.ChainEpoch + Message *types.Message + CircSupply abi.TokenAmount + BaseFee abi.TokenAmount + NetworkVersion network.Version // Rand is an optional vm.Rand implementation to use. If nil, the driver // will use a vm.Rand that returns a fixed value for all calls. @@ -210,13 +213,6 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP params.Rand = NewFixedRand() } - // dummy state manager; only to reference the GetNetworkVersion method, - // which does not depend on state. - sm, err := stmgr.NewStateManager(nil, filcns.NewTipSetExecutor(), nil, filcns.DefaultUpgradeSchedule(), nil) - if err != nil { - return nil, cid.Cid{}, err - } - vmOpts := &vm.VMOpts{ StateBase: params.Preroot, Epoch: params.Epoch, @@ -227,7 +223,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP }, Rand: params.Rand, BaseFee: params.BaseFee, - NetworkVersion: sm.GetNetworkVersion(context.Background(), params.Epoch), + NetworkVersion: params.NetworkVersion, } lvm, err := vm.NewVM(context.TODO(), vmOpts) diff --git a/conformance/runner.go b/conformance/runner.go index e597f0bbe..1f35f034c 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -14,6 +14,7 @@ import ( "github.com/fatih/color" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/go-state-types/network" "github.com/hashicorp/go-multierror" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" @@ -54,7 +55,8 @@ var TipsetVectorOpts struct { func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema.Variant) (diffs []string, err error) { var ( ctx = context.Background() - baseEpoch = variant.Epoch + baseEpoch = abi.ChainEpoch(variant.Epoch) + nv = network.Version(variant.NetworkVersion) root = vector.Pre.StateTree.RootCID ) @@ -76,18 +78,19 @@ func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema // add the epoch offset if one is set. if m.EpochOffset != nil { - baseEpoch += *m.EpochOffset + baseEpoch += abi.ChainEpoch(*m.EpochOffset) } // Execute the message. var ret *vm.ApplyRet ret, root, err = driver.ExecuteMessage(bs, ExecuteMessageParams{ - Preroot: root, - Epoch: abi.ChainEpoch(baseEpoch), - Message: msg, - BaseFee: BaseFeeOrDefault(vector.Pre.BaseFee), - CircSupply: CircSupplyOrDefault(vector.Pre.CircSupply), - Rand: NewReplayingRand(r, vector.Randomness), + Preroot: root, + Epoch: baseEpoch, + Message: msg, + BaseFee: BaseFeeOrDefault(vector.Pre.BaseFee), + CircSupply: CircSupplyOrDefault(vector.Pre.CircSupply), + Rand: NewReplayingRand(r, vector.Randomness), + NetworkVersion: nv, }) if err != nil { r.Fatalf("fatal failure when executing message: %s", err) From d4fa5a0f1db6f6bd6e4a97dd9735d39ae7c98b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:23:54 +0000 Subject: [PATCH 135/157] tvx runner: adjust gas pricing to cope with synthetic epochs. --- chain/vm/gas.go | 11 +++++---- conformance/runner.go | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/chain/vm/gas.go b/chain/vm/gas.go index 27d9c8d94..c6f8810f2 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -10,8 +10,9 @@ import ( addr "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/lotus/build" "github.com/ipfs/go-cid" + + "github.com/filecoin-project/lotus/build" ) type GasCharge struct { @@ -81,7 +82,9 @@ type Pricelist interface { OnVerifyConsensusFault() GasCharge } -var prices = map[abi.ChainEpoch]Pricelist{ +// Prices are the price lists per starting epoch. Public for testing purposes +// (concretely to allow the test vector runner to rebase prices). +var Prices = map[abi.ChainEpoch]Pricelist{ abi.ChainEpoch(0): &pricelistV0{ computeGasMulti: 1, storageGasMulti: 1000, @@ -214,8 +217,8 @@ func PricelistByEpoch(epoch abi.ChainEpoch) Pricelist { // since we are storing the prices as map or epoch to price // we need to get the price with the highest epoch that is lower or equal to the `epoch` arg bestEpoch := abi.ChainEpoch(0) - bestPrice := prices[bestEpoch] - for e, pl := range prices { + bestPrice := Prices[bestEpoch] + for e, pl := range Prices { // if `e` happened after `bestEpoch` and `e` is earlier or equal to the target `epoch` if e > bestEpoch && e <= epoch { bestEpoch = e diff --git a/conformance/runner.go b/conformance/runner.go index 1f35f034c..3dfedc748 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -7,6 +7,7 @@ import ( "encoding/base64" "fmt" "io/ioutil" + "math" "os" "os/exec" "strconv" @@ -28,6 +29,7 @@ import ( "github.com/filecoin-project/test-vectors/schema" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" ) @@ -51,6 +53,52 @@ var TipsetVectorOpts struct { OnTipsetApplied []func(bs blockstore.Blockstore, params *ExecuteTipsetParams, res *ExecuteTipsetResult) } +type GasPricingRestoreFn func() + +// adjustGasPricing adjusts the global gas price mapping to make sure that the +// gas pricelist for vector's network version is used at the vector's epoch. +// Because it manipulates a global, it returns a function that reverts the +// change. The caller MUST invoke this function or the test vector runner will +// become invalid. +func adjustGasPricing(vectorEpoch abi.ChainEpoch, vectorNv network.Version) GasPricingRestoreFn { + // Stash the current pricing mapping. + // Ok to take a reference instead of a copy, because we override the map + // with a new one below. + var old = vm.Prices + + // Resolve the epoch at which the vector network version kicks in. + var epoch abi.ChainEpoch = math.MaxInt64 + if vectorNv == network.Version0 { + // genesis is not an upgrade. + epoch = 0 + } else { + for _, u := range filcns.DefaultUpgradeSchedule() { + if u.Network == vectorNv { + epoch = u.Height + break + } + } + } + + if epoch == math.MaxInt64 { + panic(fmt.Sprintf("could not resolve network version %d to height", vectorNv)) + } + + // Find the right pricelist for this network version. + pricelist := vm.PricelistByEpoch(epoch) + + // Override the pricing mapping by setting the relevant pricelist for the + // network version at the epoch where the vector runs. + vm.Prices = map[abi.ChainEpoch]vm.Pricelist{ + vectorEpoch: pricelist, + } + + // Return a function to restore the original mapping. + return func() { + vm.Prices = old + } +} + // ExecuteMessageVector executes a message-class test vector. func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema.Variant) (diffs []string, err error) { var ( @@ -69,6 +117,10 @@ func ExecuteMessageVector(r Reporter, vector *schema.TestVector, variant *schema // Create a new Driver. driver := NewDriver(ctx, vector.Selector, DriverOpts{DisableVMFlush: true}) + // Monkey patch the gas pricing. + revertFn := adjustGasPricing(baseEpoch, nv) + defer revertFn() + // Apply every message. for i, m := range vector.ApplyMessages { msg, err := types.DecodeMessage(m.Bytes) From 1215f26a844da59deca6d56e3a917b5957e66bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:24:06 +0000 Subject: [PATCH 136/157] tvx runner: improve error reporting. --- conformance/runner.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conformance/runner.go b/conformance/runner.go index 3dfedc748..fd44ecff9 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -239,8 +239,10 @@ func ExecuteTipsetVector(r Reporter, vector *schema.TestVector, variant *schema. func AssertMsgResult(r Reporter, expected *schema.Receipt, actual *vm.ApplyRet, label string) { r.Helper() + applyret := actual if expected, actual := exitcode.ExitCode(expected.ExitCode), actual.ExitCode; expected != actual { r.Errorf("exit code of msg %s did not match; expected: %s, got: %s", label, expected, actual) + r.Errorf("\t\\==> actor error: %s", applyret.ActorErr) } if expected, actual := expected.GasUsed, actual.GasUsed; expected != actual { r.Errorf("gas used of msg %s did not match; expected: %d, got: %d", label, expected, actual) From 75d8c5200483df82e6914458c20b5183a870c169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Jan 2022 17:42:24 +0000 Subject: [PATCH 137/157] tvx runner: exec: add support for multiple-level dirs. --- cmd/tvx/exec.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/cmd/tvx/exec.go b/cmd/tvx/exec.go index 15bb543a5..750684c36 100644 --- a/cmd/tvx/exec.go +++ b/cmd/tvx/exec.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "io" + "io/fs" "log" "os" "path/filepath" @@ -136,25 +137,31 @@ func processTipsetOpts() error { } func execVectorDir(path string, outdir string) error { - files, err := filepath.Glob(filepath.Join(path, "*")) - if err != nil { - return fmt.Errorf("failed to glob input directory %s: %w", path, err) - } - for _, f := range files { - outfile := strings.TrimSuffix(filepath.Base(f), filepath.Ext(f)) + ".out" + return filepath.WalkDir(path, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return fmt.Errorf("failed while visiting path %s: %w", path, err) + } + if d.IsDir() || !strings.HasSuffix(path, "json") { + return nil + } + // Create an output file to capture the output from the run of the vector. + outfile := strings.TrimSuffix(filepath.Base(path), filepath.Ext(path)) + ".out" outpath := filepath.Join(outdir, outfile) outw, err := os.Create(outpath) if err != nil { return fmt.Errorf("failed to create file %s: %w", outpath, err) } - log.Printf("processing vector %s; sending output to %s", f, outpath) + log.Printf("processing vector %s; sending output to %s", path, outpath) + + // Actually run the vector. log.SetOutput(io.MultiWriter(os.Stderr, outw)) // tee the output. - _, _ = execVectorFile(new(conformance.LogReporter), f) + _, _ = execVectorFile(new(conformance.LogReporter), path) log.SetOutput(os.Stderr) _ = outw.Close() - } - return nil + + return nil + }) } func execVectorsStdin() error { From 5ec5ebac31f9a2b38b52b2b568019351db95761f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 5 Jan 2022 13:52:51 -0500 Subject: [PATCH 138/157] Fix circsuypply calc around null blocks --- chain/consensus/filcns/compute_state.go | 5 ++++- chain/vm/vm.go | 9 ++++++++- testplans/lotus-soup/go.mod | 4 ++-- testplans/lotus-soup/go.sum | 23 ++++++++++++++++++----- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 3c70f61db..2f8cab740 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -169,7 +169,10 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager } } - vmi.SetBlockHeight(i + 1) + if err = vmi.SetBlockHeight(ctx, i+1); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("error advancing vm an epoch: %w", err) + } + pstate = newState } diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 7e9e972ae..703a19880 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -824,8 +824,15 @@ func (vm *VM) StateTree() types.StateTree { return vm.cstate } -func (vm *VM) SetBlockHeight(h abi.ChainEpoch) { +func (vm *VM) SetBlockHeight(ctx context.Context, h abi.ChainEpoch) error { vm.blockHeight = h + ncirc, err := vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) + if err != nil { + return err + } + + vm.baseCircSupply = ncirc + return nil } func (vm *VM) Invoke(act *types.Actor, rt *Runtime, method abi.MethodNum, params []byte) ([]byte, aerrors.ActorError) { diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index e7d03c23b..308ee5140 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -8,8 +8,8 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 - github.com/filecoin-project/go-data-transfer v1.12.0 - github.com/filecoin-project/go-fil-markets v1.13.5 + github.com/filecoin-project/go-data-transfer v1.12.1 + github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index c16a429cc..210cf03ad 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -403,8 +403,9 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= +github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -413,8 +414,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.13.5 h1:NLeF8rI5ZPOJNYEgA6NHrvnuh5QE/2dwuU/7wPW7zP0= -github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= +github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -524,6 +525,11 @@ github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNV github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= @@ -934,8 +940,9 @@ github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zND github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= +github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= +github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -1035,8 +1042,9 @@ github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= +github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= @@ -2206,6 +2214,8 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= +go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/bridge/opencensus v0.25.0/go.mod h1:dkZDdaNwLlIutxK2Kc2m3jwW2M1ISaNf8/rOYVwuVHs= go.opentelemetry.io/otel/exporters/jaeger v1.2.0/go.mod h1:KJLFbEMKTNPIfOxcg/WikIozEoKcPgJRz3Ce1vLlM8E= go.opentelemetry.io/otel/internal/metric v0.25.0/go.mod h1:Nhuw26QSX7d6n4duoqAFi5KOQR4AuzyMcl5eXOgwxtc= @@ -2213,11 +2223,14 @@ go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9deb go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk2s/F1Ju+TEEm8= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U= go.opentelemetry.io/otel/sdk/export/metric v0.25.0/go.mod h1:Ej7NOa+WpN49EIcr1HMUYRvxXXCCnQCg2+ovdt2z8Pk= go.opentelemetry.io/otel/sdk/metric v0.25.0/go.mod h1:G4xzj4LvC6xDDSsVXpvRVclQCbofGGg4ZU2VKKtDRfg= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= +go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= From 736fb5c5b0847b2b7435a592b91ccbb5a239f90d Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 6 Jan 2022 15:35:39 +0100 Subject: [PATCH 139/157] Add gas charge for VerifyReplicaUpdate Signed-off-by: Jakub Sztandera --- chain/vm/gas.go | 2 ++ chain/vm/gas_v0.go | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/chain/vm/gas.go b/chain/vm/gas.go index c6f8810f2..e75c86b9f 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -209,6 +209,8 @@ var Prices = map[abi.ChainEpoch]Pricelist{ }, verifyPostDiscount: false, verifyConsensusFault: 495422, + + verifyReplicaUpdate: 36316136, }, } diff --git a/chain/vm/gas_v0.go b/chain/vm/gas_v0.go index 548227a33..1bda6dfae 100644 --- a/chain/vm/gas_v0.go +++ b/chain/vm/gas_v0.go @@ -120,6 +120,8 @@ type pricelistV0 struct { verifyPostLookup map[abi.RegisteredPoStProof]scalingCost verifyPostDiscount bool verifyConsensusFault int64 + + verifyReplicaUpdate int64 } var _ Pricelist = (*pricelistV0)(nil) @@ -229,8 +231,7 @@ func (pl *pricelistV0) OnVerifyAggregateSeals(aggregate proof7.AggregateSealVeri // OnVerifyReplicaUpdate func (pl *pricelistV0) OnVerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) GasCharge { - // TODO: do the thing - return GasCharge{} + return newGasCharge("OnVerifyReplicaUpdate", pl.verifyReplicaUpdate, 0) } // OnVerifyPost From d4f46122f78b70a7acd5eb82663b38497541174a Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:01:32 -0500 Subject: [PATCH 140/157] Remove ticket number from the title issue number in PR title is not that useful because reader cannot click it and need to mention the issue in the body for auto close either way. --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 76d38d292..a5f863fac 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -12,7 +12,7 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. -- [ ] The PR title is in the form of of `: <#issue number> : ` +- [ ] The PR title is in the form of of `: : ` - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ From 57fa377730c2cd88165454fd804a6a08aa922cf9 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:02:51 -0500 Subject: [PATCH 141/157] Update pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a5f863fac..c6273f056 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -13,7 +13,7 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: : ` - - example: ` fix: #1234 mempool: Introduce a cache for valid signatures` + - example: ` fix: mempool: Introduce a cache for valid signatures` - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ - [ ] This PR has tests for new functionality or change in behaviour From a64cf77e84dc40c3bfee74e337404d1fdcc98af9 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:33:07 +0530 Subject: [PATCH 142/157] generated vectors from v7 for bleeding edge --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4daadced5..53611d565 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -950,7 +950,7 @@ workflows: codecov-upload: false suite: conformance-bleeding-edge target: "./conformance" - vectors-branch: master + vectors-branch: specs-actors-v7 - trigger-testplans: filters: branches: From 4963fe780980fa2718969144bb89f89c40a3f204 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:41:53 +0530 Subject: [PATCH 143/157] Fix template --- .circleci/template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/template.yml b/.circleci/template.yml index 666ad39f5..ef6818c6d 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -785,7 +785,7 @@ workflows: codecov-upload: false suite: conformance-bleeding-edge target: "./conformance" - vectors-branch: master + vectors-branch: specs-actors-v7 - trigger-testplans: filters: branches: From 5f9e7c4ff46e611c638f9de148a8dd56e927ea2a Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:33:07 +0530 Subject: [PATCH 144/157] generated vectors from v7 for bleeding edge --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a4a88a090..2213d08ad 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -945,7 +945,7 @@ workflows: codecov-upload: false suite: conformance-bleeding-edge target: "./conformance" - vectors-branch: master + vectors-branch: specs-actors-v7 - trigger-testplans: filters: branches: From d2abc409f9bd7eb6167dd97fc987c092699b7262 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:41:53 +0530 Subject: [PATCH 145/157] Fix template --- .circleci/template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/template.yml b/.circleci/template.yml index 666ad39f5..ef6818c6d 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -785,7 +785,7 @@ workflows: codecov-upload: false suite: conformance-bleeding-edge target: "./conformance" - vectors-branch: master + vectors-branch: specs-actors-v7 - trigger-testplans: filters: branches: From d46ee7c89b351be3280ca8c61fb196029af7cced Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Sun, 9 Jan 2022 22:32:59 -0500 Subject: [PATCH 146/157] add changelog --- CHANGELOG.md | 156 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 93 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2905389c..95dab8d60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,71 +1,101 @@ # Lotus changelog -# v1.13.2-rc7 / 2022-01-05 +# v1.13.2 / 2022-01-09 -This is the 7th RC for lotus v1.13.2. This will be a highly recommended release with sealing pipeline fixes, worker -management and scheduler enhancement, retrieval improvements and so on. More detailed changelog will be updated later. +Lotus v1.13.2 is a *highly recommended* feature release with remarkable retrieval improvements, new features like +worker management, schedule enhancements and so on. -- github.com/filecoin-project/lotus: - - stores: Reduce log spam during retrievals - - fix lint - - Fix mock ReadPiece - - fr32: Reduce MTTresh from 32M to 512k per core - - piecereader: Avoid allocating 1024MB slices per read - - piecereader: Avoid redundant roundtrips when seeking - - piecereader: Move closer to storage - - build: release: v1.13.2-rc3 ([filecoin-project/lotus#7752](https://github.com/filecoin-project/lotus/pull/7752)) - - build: release: v1.13.2-rc2 ([filecoin-project/lotus#7745](https://github.com/filecoin-project/lotus/pull/7745)) - - v1.13.2-rc1 ([filecoin-project/lotus#7718](https://github.com/filecoin-project/lotus/pull/7718)) - - Address Scheduler enhancements (#7703) review ([filecoin-project/lotus#7714](https://github.com/filecoin-project/lotus/pull/7714)) - - Scheduler enhancements ([filecoin-project/lotus#7703](https://github.com/filecoin-project/lotus/pull/7703)) - - ffiwrapper: Validate PC2 by calling C1 with random seeds ([filecoin-project/lotus#7710](https://github.com/filecoin-project/lotus/pull/7710)) - - fix logic error ([filecoin-project/lotus#7709](https://github.com/filecoin-project/lotus/pull/7709)) - - Update go-graphsync v0.10.6 ([filecoin-project/lotus#7708](https://github.com/filecoin-project/lotus/pull/7708)) - - Add verbose mode to lotus-miner pieces list-cids ([filecoin-project/lotus#7699](https://github.com/filecoin-project/lotus/pull/7699)) - - retrieval: Only output matching nodes, MatchPath dagspec ([filecoin-project/lotus#7706](https://github.com/filecoin-project/lotus/pull/7706)) - - disable mplex stream muxer ([filecoin-project/lotus#7689](https://github.com/filecoin-project/lotus/pull/7689)) - - Cleanup partial retrieval codepaths ( zero functional changes ) ([filecoin-project/lotus#7688](https://github.com/filecoin-project/lotus/pull/7688)) - - Make small retrieval 200x faster ([filecoin-project/lotus#7693](https://github.com/filecoin-project/lotus/pull/7693)) - - Releases back to master ([filecoin-project/lotus#7698](https://github.com/filecoin-project/lotus/pull/7698)) - - Add RLE dump code ([filecoin-project/lotus#7691](https://github.com/filecoin-project/lotus/pull/7691)) - - Update archive script ([filecoin-project/lotus#7690](https://github.com/filecoin-project/lotus/pull/7690)) - - storage: Use 1M buffers for Tar transfers ([filecoin-project/lotus#7681](https://github.com/filecoin-project/lotus/pull/7681)) - - Chore/dm level tests plus merkle proof cars ([filecoin-project/lotus#7673](https://github.com/filecoin-project/lotus/pull/7673)) - - Partial retrieval ux improvements ([filecoin-project/lotus#7610](https://github.com/filecoin-project/lotus/pull/7610)) - - Sector storage groups ([filecoin-project/lotus#7453](https://github.com/filecoin-project/lotus/pull/7453)) - - docsgen-cli: Handle commands with no description correctly ([filecoin-project/lotus#7659](https://github.com/filecoin-project/lotus/pull/7659)) - - shed: simple wallet balancer util ([filecoin-project/lotus#7414](https://github.com/filecoin-project/lotus/pull/7414)) - - remote store: Remove debug printf ([filecoin-project/lotus#7664](https://github.com/filecoin-project/lotus/pull/7664)) - - Bump ws from 5.2.2 to 5.2.3 in /lotuspond/front ([filecoin-project/lotus#7660](https://github.com/filecoin-project/lotus/pull/7660)) - - Bump color-string from 1.5.3 to 1.6.0 in /lotuspond/front ([filecoin-project/lotus#7658](https://github.com/filecoin-project/lotus/pull/7658)) - - Bump postcss from 7.0.17 to 7.0.39 in /lotuspond/front ([filecoin-project/lotus#7657](https://github.com/filecoin-project/lotus/pull/7657)) - - Bump path-parse from 1.0.6 to 1.0.7 in /lotuspond/front ([filecoin-project/lotus#7656](https://github.com/filecoin-project/lotus/pull/7656)) - - Bump tmpl from 1.0.4 to 1.0.5 in /lotuspond/front ([filecoin-project/lotus#7655](https://github.com/filecoin-project/lotus/pull/7655)) - - Bump url-parse from 1.4.7 to 1.5.3 in /lotuspond/front ([filecoin-project/lotus#7654](https://github.com/filecoin-project/lotus/pull/7654)) - - Add caches to lotus-stats and splitcode ([filecoin-project/lotus#7329](https://github.com/filecoin-project/lotus/pull/7329)) - - add additional methods to lotus gateway ([filecoin-project/lotus#7644](https://github.com/filecoin-project/lotus/pull/7644)) - - checkCommit should return SectorCommitFailed ([filecoin-project/lotus#7555](https://github.com/filecoin-project/lotus/pull/7555)) - - Wdpost worker: Reduce challenge confidence to 1 epoch ([filecoin-project/lotus#7572](https://github.com/filecoin-project/lotus/pull/7572)) - - remove api and jaeger env from docker file ([filecoin-project/lotus#7624](https://github.com/filecoin-project/lotus/pull/7624)) - - CLI: Add a lotus multisig cancel command ([filecoin-project/lotus#7645](https://github.com/filecoin-project/lotus/pull/7645)) - - remove jaeger envvars ([filecoin-project/lotus#7631](https://github.com/filecoin-project/lotus/pull/7631)) - - lotus-shed msg: Decode submessages/msig proposals ([filecoin-project/lotus#7639](https://github.com/filecoin-project/lotus/pull/7639)) - - add log for restart windows post scheduler ([filecoin-project/lotus#7613](https://github.com/filecoin-project/lotus/pull/7613)) - - Shed: Add a util to list miner faults ([filecoin-project/lotus#7605](https://github.com/filecoin-project/lotus/pull/7605)) - - add timeout flag to wait-api command ([filecoin-project/lotus#7592](https://github.com/filecoin-project/lotus/pull/7592)) - - Shed: Add a util to create miners more easily ([filecoin-project/lotus#7595](https://github.com/filecoin-project/lotus/pull/7595)) - - Update go-state-types ([filecoin-project/lotus#7591](https://github.com/filecoin-project/lotus/pull/7591)) - - add missing NodeType tag ([filecoin-project/lotus#7559](https://github.com/filecoin-project/lotus/pull/7559)) - - update go-libp2p-pubsub to v0.5.6 ([filecoin-project/lotus#7581](https://github.com/filecoin-project/lotus/pull/7581)) - - bump the master version to v1.13.2-dev ([filecoin-project/lotus#7568](https://github.com/filecoin-project/lotus/pull/7568)) -- github.com/filecoin-project/go-fil-markets (v1.13.3 -> v1.13.4): - failed to fetch repo +## Highlights +- Reduce retrieval Time-To-First-Byte over 100x ([#7693](https://github.com/filecoin-project/lotus/pull/7693)) + - This change makes most free, small retrievals sub-second +- Partial retrieval ux improvements ([#7610](https://github.com/filecoin-project/lotus/pull/7610)) + - New retrieval commands for clients: + - `lotus client ls`: retrieve and list desired object links + - `lotus client cat`: retrieve and print the data from the network + - The monolith `ClientRetrieve` method was broken into: + - `ClientRetrieve` which retrieves data into the local repo (or into an IPFS node if ipfs integration is enabled) + - `ClientRetrieveWait` which will wait for the retrieval to complete + - `ClientExport` which will export data from the local node + - Note: this change only applies to v1 API. v0 API remains unchanged. + - Support for full ipld selectors was added (for example making it possible to only retrieve list of directories in a deal, without fetching any file data) + - To learn more, see [here](https://github.com/filecoin-project/lotus/blob/0523c946f984b22b3f5de8cc3003cc791389527e/api/types.go#L230-L264) +- Sealing scheduler enhancements ([#7703](https://github.com/filecoin-project/lotus/pull/7703), + [#7269](https://github.com/filecoin-project/lotus/pull/7269)), [#7714](https://github.com/filecoin-project/lotus/pull/7714) + - Workers are now aware of cgroup memory limits + - Multiple tasks which use a GPU can be scheduled on a single worker + - Workers can override default resource table through env vars + - Default value list: https://gist.github.com/magik6k/c0e1c7cd73c1241a9acabc30bf469a43 +- Sector storage groups ([#7453](https://github.com/filecoin-project/lotus/pull/7453)) + - Storage groups allow for better control of data flow between workers, for example, it makes it possible to define that data from PC1 on a given worker has to have it's PC2 step executed on the same worker + - To set it up, follow the instructions under the `Sector Storage Group` section [here](https://lotus.filecoin.io/docs/storage-providers/seal-workers/#lotus-worker-co-location) + +## New Features +- Add RLE dump code ([#7691](https://github.com/filecoin-project/lotus/pull/7691)) +- Shed: Add a util to list miner faults ([#7605](https://github.com/filecoin-project/lotus/pull/7605)) +- lotus-shed msg: Decode submessages/msig proposals ([#7639](https://github.com/filecoin-project/lotus/pull/7639)) +- CLI: Add a lotus multisig cancel command ([#7645](https://github.com/filecoin-project/lotus/pull/7645)) +- shed: simple wallet balancer util ([#7414](https://github.com/filecoin-project/lotus/pull/7414)) + - balancing token balance between multiple accounts + +## Improvements +- Add verbose mode to `lotus-miner pieces list-cids` ([#7699](https://github.com/filecoin-project/lotus/pull/7699)) +- retrieval: Only output matching nodes, MatchPath dagspec ([#7706](https://github.com/filecoin-project/lotus/pull/7706)) +- Cleanup partial retrieval codepaths ( zero functional changes ) ([#7688](https://github.com/filecoin-project/lotus/pull/7688)) +- storage: Use 1M buffers for Tar transfers ([#7681](https://github.com/filecoin-project/lotus/pull/7681)) +- Chore/dm level tests plus merkle proof cars ([#7673](https://github.com/filecoin-project/lotus/pull/7673)) +- Shed: Add a util to create miners more easily ([#7595](https://github.com/filecoin-project/lotus/pull/7595)) +- add timeout flag to wait-api command ([#7592](https://github.com/filecoin-project/lotus/pull/7592)) +- add log for restart windows post scheduler ([#7613](https://github.com/filecoin-project/lotus/pull/7613)) +- remove jaeger envvars ([#7631](https://github.com/filecoin-project/lotus/pull/7631)) +- remove api and jaeger env from docker file ([#7624](https://github.com/filecoin-project/lotus/pull/7624)) +- Wdpost worker: Reduce challenge confidence to 1 epoch ([#7572](https://github.com/filecoin-project/lotus/pull/7572)) +- add additional methods to lotus gateway ([#7644](https://github.com/filecoin-project/lotus/pull/7644)) +- Add caches to lotus-stats and splitcode ([#7329](https://github.com/filecoin-project/lotus/pull/7329)) +- remote store: Remove debug printf ([#7664](https://github.com/filecoin-project/lotus/pull/7664)) +- docsgen-cli: Handle commands with no description correctly ([#7659](https://github.com/filecoin-project/lotus/pull/7659)) + +## Bug Fixes +- fix docker logic error ([#7709](https://github.com/filecoin-project/lotus/pull/7709)) +- add missing NodeType tag ([#7559](https://github.com/filecoin-project/lotus/pull/7559)) +- checkCommit should return SectorCommitFailed ([#7555](https://github.com/filecoin-project/lotus/pull/7555)) +- ffiwrapper: Validate PC2 by calling C1 with random seeds ([#7710](https://github.com/filecoin-project/lotus/pull/7710)) + +## Dependency Updates +- Update go-graphsync v0.10.6 ([#7708](https://github.com/filecoin-project/lotus/pull/7708)) +- update go-libp2p-pubsub to v0.5.6 ([#7581](https://github.com/filecoin-project/lotus/pull/7581)) +- Update go-state-types ([#7591](https://github.com/filecoin-project/lotus/pull/7591)) +- disable mplex stream muxer ([#7689](https://github.com/filecoin-project/lotus/pull/7689)) +- Bump ws from 5.2.2 to 5.2.3 in /lotuspond/front ([#7660](https://github.com/filecoin-project/lotus/pull/7660)) +- Bump color-string from 1.5.3 to 1.6.0 in /lotuspond/front ([#7658](https://github.com/filecoin-project/lotus/pull/7658)) +- Bump postcss from 7.0.17 to 7.0.39 in /lotuspond/front ([#7657](https://github.com/filecoin-project/lotus/pull/7657)) +- Bump path-parse from 1.0.6 to 1.0.7 in /lotuspond/front ([#7656](https://github.com/filecoin-project/lotus/pull/7656)) +- Bump tmpl from 1.0.4 to 1.0.5 in /lotuspond/front ([#7655](https://github.com/filecoin-project/lotus/pull/7655)) +- Bump url-parse from 1.4.7 to 1.5.3 in /lotuspond/front ([#7654](https://github.com/filecoin-project/lotus/pull/7654)) - github.com/filecoin-project/go-state-types (v0.1.1-0.20210915140513-d354ccf10379 -> v0.1.1): - - Add v14 - - Add PoRep -> UpdateProof mapping - - Intoduce update proofs enums - - Update golangci-lint for comatibility with Go 1.17 - - Update execution image to maybe update debian version + +## Others +- Update archive script ([#7690](https://github.com/filecoin-project/lotus/pull/7690)) + +## Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| @magik6k | 89 | +5200/-1818 | 232 | +| Travis Person | 5 | +1473/-953 | 38 | +| @arajasek | 6 | +550/-38 | 19 | +| @clinta | 4 | +393/-123 | 26 | +| @ribasushi | 3 | +334/-68 | 7 | +| @jennijuju| 13 | +197/-120 | 67 | +| @Kubuxu | 10 | +153/-30 | 10 | +| @coryschwartz | 6 | +18/-26 | 6 | +| Marten Seemann | 2 | +6/-34 | 5 | +| @vyzo | 1 | +3/-3 | 2 | +| @hannahhoward | 1 | +3/-3 | 2 | +| @zenground0 | 2 | +2/-2 | 2 | +| @yaohcn | 2 | +2/-2 | 2 | +| @jennijuju | 1 | +1/-1 | 1 | +| @hunjixin | 1 | +1/-0 | 1 | + # v1.13.1 / 2021-11-26 From 20d1a5db70396128ad2acd3557f7832a785ff2d3 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Sun, 9 Jan 2022 22:39:09 -0500 Subject: [PATCH 147/157] bump the version to v1.13.2 --- build/openrpc/full.json.gz | Bin 25688 -> 25685 bytes build/openrpc/miner.json.gz | Bin 11151 -> 11148 bytes build/openrpc/worker.json.gz | Bin 3401 -> 3398 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 6581da48e79b14af1e8323efc05bf9c03f15fde5..9c8692acc79207fa711c42af66039d0af898e702 100644 GIT binary patch delta 25638 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

YqqSWwzP5KYn#`IxKAs_7QBfdPwF9r=Q;wU&(Q3 zr|0S6$2dp_ne{mBE;e;D>xz6zqai{+1OzS*!a)MQ<6?Ri^GO9S?$2V1#!y_|6=6~I zOynE)gG853^^o7?Nbs$UvP7@@zBI|zY6zt7NXv?(`+dc?ldZ2mm)K+EBm5zo(GIrx zoqzQA@d80;qJOyrS0pkJ^8PNr?(E(0TQskhSD9T zJB+NubpqY{m0{x!!XC?j`B;MjyMR0^0}krf9^b}gtdPXGD?Bn2fves2wm!qWl{5bf zsmOX4crl5)w&>8;yOMv-z;wH<#GUSSzp&r5f}-+qdH3%rm|Oc3IhvU~hXk^fHZr~Q z9Dp?NMLr5wP*nLuNPrx5#FrEtvw0>ho}V5XB4$d}@TE!cZFJ+Q{lWn!=5F#MYsOt3 zxN>2xPmur1^Ep*rJ{yKg!v)=3gktbv9AWbba?J-P(XldBr@f=15lt=@WUNmbE{Lx$ z{#i%je9UKzP}Q_~T{@Ryn8%%x@FYg3DpK&6Y8~p#F&ZepuQr*!-R?B!5~_>os3JaG z#T?RXMVA4Lv`SGCD+Fb$*mE%7t>l+m^+6b16A#8zd?NLJD~f-yA~w=k*vYlLBcg80 zh>?k^8(g4CUvY4zpDpe2RzghOK73vm=uo3WHc;_h0pK~Oa`yBVvs9!78vkJZ$^5_R ze|ixQ+CHfVSwZKZ;18u*%j@?os35+o)ZT)zFyUY0%b#}H)9V(0kwMOPCaiWc-FdE? z*zphP0|U5m?1~nSfQB6da6j5<0b!oXu+!08I=`)p0P3P_bkM}$e;@kZg3PqYb5+M# z1ZCkDG*nwm7hEL~B}ZansYB#ou`PVhK<07#~GL;W&%D#K!IHhOMBO;6&~*-K0Kz8AD7O3-^rWg4WN2KbVi&qkK)+B{=K(Y z@`qY^)ElA_qoxMPk;tF2)L_K-mh*S6eTu4YzSsO=3>A#~5$T4k{b-wi8XxaU6UlQA zl?>RZO8z+olpdTroAGX2%hf%kbc}66Bv6kSbl3tj`WZ*C7aQN4IBN

l12Y+yZ{$-caoP#L(X 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 6b904873f83add2b7e28b74ce859a6ddcc1dd11e..c2707bfa08bc9971829ca3c989de705be6831657 100644 GIT binary patch delta 11108 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 P00960>;nwXJfQ#p82FdJ delta 3336 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 St^XSU0RR8+w8I2Ip#T7|oOx&f diff --git a/build/version.go b/build/version.go index bc2b06b25..a9adf49e6 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.13.2-rc7" +const BuildVersion = "1.13.2" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 1485a064f..37fbea8c0 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.13.2-rc7 + 1.13.2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 8a52005f2..38ba917e2 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.13.2-rc7 + 1.13.2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index af46cc83b..cdfdc0b4c 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.13.2-rc7 + 1.13.2 COMMANDS: daemon Start a lotus daemon process From 6ce9f232dcea8bdb3dbf44cf5d123b842e53e9de Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Sun, 9 Jan 2022 22:47:41 -0500 Subject: [PATCH 148/157] update changelog --- CHANGELOG.md | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95dab8d60..a420421de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,26 +6,30 @@ Lotus v1.13.2 is a *highly recommended* feature release with remarkable retrieva worker management, schedule enhancements and so on. ## Highlights -- Reduce retrieval Time-To-First-Byte over 100x ([#7693](https://github.com/filecoin-project/lotus/pull/7693)) - - This change makes most free, small retrievals sub-second -- Partial retrieval ux improvements ([#7610](https://github.com/filecoin-project/lotus/pull/7610)) - - New retrieval commands for clients: - - `lotus client ls`: retrieve and list desired object links - - `lotus client cat`: retrieve and print the data from the network - - The monolith `ClientRetrieve` method was broken into: - - `ClientRetrieve` which retrieves data into the local repo (or into an IPFS node if ipfs integration is enabled) - - `ClientRetrieveWait` which will wait for the retrieval to complete - - `ClientExport` which will export data from the local node - - Note: this change only applies to v1 API. v0 API remains unchanged. - - Support for full ipld selectors was added (for example making it possible to only retrieve list of directories in a deal, without fetching any file data) - - To learn more, see [here](https://github.com/filecoin-project/lotus/blob/0523c946f984b22b3f5de8cc3003cc791389527e/api/types.go#L230-L264) -- Sealing scheduler enhancements ([#7703](https://github.com/filecoin-project/lotus/pull/7703), +- 🚀🚀🚀Improve retrieval deal experience + - Testing result with MinerX.3 shows the retrieval deal success rate has increased dramatically with faster transfer + speed, you can join or follow along furthur performance testings [here](https://github.com/filecoin-project/lotus/discussions/7874). We recommend application developers to integrate with the new + retrieval APIs to provide a better client experience. + - 🌟🌟🌟 Reduce retrieval Time-To-First-Byte over 100x ([#7693](https://github.com/filecoin-project/lotus/pull/7693)) + - This change makes most free, small retrievals sub-second + - 🌟🌟🌟 Partial retrieval ux improvements ([#7610](https://github.com/filecoin-project/lotus/pull/7610)) + - New retrieval commands for clients: + - `lotus client ls`: retrieve and list desired object links + - `lotus client cat`: retrieve and print the data from the network + - 🌟🌟 The monolith `ClientRetrieve` method was broken into: + - `ClientRetrieve` which retrieves data into the local repo (or into an IPFS node if ipfs integration is enabled) + - `ClientRetrieveWait` which will wait for the retrieval to complete + - `ClientExport` which will export data from the local node + - Note: this change only applies to v1 API. v0 API remains unchanged. + - 🌟 Support for full ipld selectors was added (for example making it possible to only retrieve list of directories in a deal, without fetching any file data) + - To learn more, see [here](https://github.com/filecoin-project/lotus/blob/0523c946f984b22b3f5de8cc3003cc791389527e/api/types.go#L230-L264) +- 🚀🚀 Sealing scheduler enhancements ([#7703](https://github.com/filecoin-project/lotus/pull/7703), [#7269](https://github.com/filecoin-project/lotus/pull/7269)), [#7714](https://github.com/filecoin-project/lotus/pull/7714) - Workers are now aware of cgroup memory limits - Multiple tasks which use a GPU can be scheduled on a single worker - Workers can override default resource table through env vars - Default value list: https://gist.github.com/magik6k/c0e1c7cd73c1241a9acabc30bf469a43 -- Sector storage groups ([#7453](https://github.com/filecoin-project/lotus/pull/7453)) +- 🚀🚀 Sector storage groups ([#7453](https://github.com/filecoin-project/lotus/pull/7453)) - Storage groups allow for better control of data flow between workers, for example, it makes it possible to define that data from PC1 on a given worker has to have it's PC2 step executed on the same worker - To set it up, follow the instructions under the `Sector Storage Group` section [here](https://lotus.filecoin.io/docs/storage-providers/seal-workers/#lotus-worker-co-location) From 33f2d24f54972547f55069c87f41af51a1db852f Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 8 Dec 2021 12:11:19 -0500 Subject: [PATCH 149/157] Snap Deals Integration - FSM handles the actual cc upgrade process including error states - PoSting (winning and window) works over upgraded and upgrading sectors - Integration test and changes to itest framework to reduce flakes - Update CLI to handle new upgrade - Update dependencies --- api/api_full.go | 2 +- api/api_storage.go | 8 +- api/proxy_gen.go | 30 +- api/v0api/gateway.go | 4 +- api/v0api/proxy_gen.go | 12 +- api/version.go | 2 +- build/openrpc/full.json.gz | Bin 26581 -> 26593 bytes build/openrpc/miner.json.gz | Bin 12555 -> 12680 bytes build/openrpc/worker.json.gz | Bin 3803 -> 3805 bytes build/params_2k.go | 2 +- chain/actors/builtin/builtin.go | 1 + chain/actors/builtin/builtin.go.template | 1 + chain/actors/builtin/miner/actor.go.template | 3 + chain/actors/builtin/miner/miner.go | 3 + chain/consensus/filcns/filecoin.go | 17 +- chain/gen/gen.go | 10 +- chain/stmgr/actors.go | 7 +- chain/sync_test.go | 3 +- chain/vm/syscalls.go | 4 +- cmd/lotus-bench/caching_verifier.go | 5 +- cmd/lotus-bench/main.go | 53 ++-- cmd/lotus-miner/info.go | 12 + cmd/lotus-miner/sectors.go | 76 ++++- cmd/lotus-seal-worker/main.go | 16 ++ cmd/lotus-sim/simulation/mock/mock.go | 3 +- documentation/en/api-v0-methods-miner.md | 18 +- documentation/en/api-v0-methods.md | 1 + documentation/en/api-v1-unstable-methods.md | 1 + documentation/en/cli-lotus-miner.md | 14 + .../en/default-lotus-miner-config.toml | 9 + .../sector-storage/ffiwrapper/sealer_cgo.go | 9 +- .../sector-storage/ffiwrapper/sealer_test.go | 18 +- extern/sector-storage/ffiwrapper/types.go | 17 +- .../sector-storage/ffiwrapper/verifier_cgo.go | 70 +++-- extern/sector-storage/manager.go | 47 ++- extern/sector-storage/mock/mock.go | 67 +++-- extern/sector-storage/teststorage_test.go | 14 +- extern/storage-sealing/cbor_gen.go | 272 +++++++++++++++++- extern/storage-sealing/checks.go | 32 +++ extern/storage-sealing/fsm.go | 119 +++++++- extern/storage-sealing/fsm_events.go | 94 ++++++ extern/storage-sealing/input.go | 39 +++ extern/storage-sealing/mocks/api.go | 15 + extern/storage-sealing/sealing.go | 16 +- extern/storage-sealing/sector_state.go | 123 +++++--- extern/storage-sealing/states_failed.go | 206 +++++++++---- extern/storage-sealing/states_failed_test.go | 8 +- .../storage-sealing/states_replica_update.go | 209 ++++++++++++++ extern/storage-sealing/states_sealing.go | 6 +- extern/storage-sealing/types.go | 10 +- extern/storage-sealing/upgrade_queue.go | 68 ++++- go.mod | 8 +- go.sum | 12 +- itests/ccupgrade_test.go | 143 ++++++--- itests/kit/blockminer.go | 137 +++++++++ itests/kit/deals.go | 7 +- itests/kit/ensemble.go | 37 +++ .../storageadapter/ondealsectorcommitted.go | 53 +++- miner/miner.go | 6 +- miner/warmup.go | 16 +- node/config/def.go | 21 +- node/impl/storminer.go | 13 +- storage/adapter_storage_miner.go | 9 + storage/miner.go | 3 +- storage/miner_sealing.go | 11 +- storage/wdpost_changehandler_test.go | 2 +- storage/wdpost_run.go | 46 ++- storage/wdpost_run_test.go | 6 +- 68 files changed, 1968 insertions(+), 338 deletions(-) create mode 100644 extern/storage-sealing/states_replica_update.go diff --git a/api/api_full.go b/api/api_full.go index 9ca0f883a..cf58a3cc6 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -1084,7 +1084,7 @@ type CirculatingSupply struct { type MiningBaseInfo struct { MinerPower types.BigInt NetworkPower types.BigInt - Sectors []builtin.SectorInfo + Sectors []builtin.ExtendedSectorInfo WorkerKey address.Address SectorSize abi.SectorSize PrevBeaconEntry types.BeaconEntry diff --git a/api/api_storage.go b/api/api_storage.go index 3f0ef50b7..c032a8e1b 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/go-address" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-state-types/abi" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-actors/v2/actors/builtin/market" "github.com/filecoin-project/specs-storage/storage" @@ -99,8 +100,8 @@ type StorageMiner interface { // Returns null if message wasn't sent SectorTerminateFlush(ctx context.Context) (*cid.Cid, error) //perm:admin // SectorTerminatePending returns a list of pending sector terminations to be sent in the next batch message - SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) //perm:admin - SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error //perm:admin + SectorTerminatePending(ctx context.Context) ([]abi.SectorID, error) //perm:admin + SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error //perm:admin // SectorPreCommitFlush immediately sends a PreCommit message with sectors batched for PreCommit. // Returns null if message wasn't sent SectorPreCommitFlush(ctx context.Context) ([]sealiface.PreCommitBatchRes, error) //perm:admin @@ -111,6 +112,7 @@ type StorageMiner interface { SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) //perm:admin // SectorCommitPending returns a list of pending Commit sectors to be sent in the next aggregate message SectorCommitPending(ctx context.Context) ([]abi.SectorID, error) //perm:admin + SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error //perm:admin // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true @@ -253,7 +255,7 @@ type StorageMiner interface { CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin - ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) //perm:read + ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv abinetwork.Version) ([]builtin.PoStProof, error) //perm:read } var _ storiface.WorkerReturn = *new(StorageMiner) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 09c71a167..0a644e585 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" + abinetwork "github.com/filecoin-project/go-state-types/network" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -620,7 +621,7 @@ type StorageMinerStruct struct { CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storage.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` - ComputeProof func(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) `perm:"read"` + ComputeProof func(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) `perm:"read"` CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` @@ -758,7 +759,9 @@ type StorageMinerStruct struct { SectorGetSealDelay func(p0 context.Context) (time.Duration, error) `perm:"read"` - SectorMarkForUpgrade func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"` + SectorMarkForUpgrade func(p0 context.Context, p1 abi.SectorNumber, p2 bool) error `perm:"admin"` + + SectorMatchPendingPiecesToOpenSectors func(p0 context.Context) error `perm:"admin"` SectorPreCommitFlush func(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) `perm:"admin"` @@ -3710,14 +3713,14 @@ func (s *StorageMinerStub) CheckProvable(p0 context.Context, p1 abi.RegisteredPo return *new(map[abi.SectorNumber]string), ErrNotSupported } -func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) { if s.Internal.ComputeProof == nil { return *new([]builtin.PoStProof), ErrNotSupported } - return s.Internal.ComputeProof(p0, p1, p2) + return s.Internal.ComputeProof(p0, p1, p2, p3, p4) } -func (s *StorageMinerStub) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (s *StorageMinerStub) ComputeProof(p0 context.Context, p1 []builtin.ExtendedSectorInfo, p2 abi.PoStRandomness, p3 abi.ChainEpoch, p4 abinetwork.Version) ([]builtin.PoStProof, error) { return *new([]builtin.PoStProof), ErrNotSupported } @@ -4469,14 +4472,25 @@ func (s *StorageMinerStub) SectorGetSealDelay(p0 context.Context) (time.Duration return *new(time.Duration), ErrNotSupported } -func (s *StorageMinerStruct) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber) error { +func (s *StorageMinerStruct) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber, p2 bool) error { if s.Internal.SectorMarkForUpgrade == nil { return ErrNotSupported } - return s.Internal.SectorMarkForUpgrade(p0, p1) + return s.Internal.SectorMarkForUpgrade(p0, p1, p2) } -func (s *StorageMinerStub) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber) error { +func (s *StorageMinerStub) SectorMarkForUpgrade(p0 context.Context, p1 abi.SectorNumber, p2 bool) error { + return ErrNotSupported +} + +func (s *StorageMinerStruct) SectorMatchPendingPiecesToOpenSectors(p0 context.Context) error { + if s.Internal.SectorMatchPendingPiecesToOpenSectors == nil { + return ErrNotSupported + } + return s.Internal.SectorMatchPendingPiecesToOpenSectors(p0) +} + +func (s *StorageMinerStub) SectorMatchPendingPiecesToOpenSectors(p0 context.Context) error { return ErrNotSupported } diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index 18a5ec7d6..e3ba56899 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -57,7 +57,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (miner.MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) - StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) + StateNetworkVersion(context.Context, types.TipSetKey) (abinetwork.Version, error) StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index af0687fe5..49ebad428 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -13,7 +13,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/go-state-types/network" + abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -451,7 +451,7 @@ type GatewayStruct struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (network.Version, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` @@ -2703,15 +2703,15 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } -func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { +func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { if s.Internal.StateNetworkVersion == nil { - return *new(network.Version), ErrNotSupported + return *new(abinetwork.Version), ErrNotSupported } return s.Internal.StateNetworkVersion(p0, p1) } -func (s *GatewayStub) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (network.Version, error) { - return *new(network.Version), ErrNotSupported +func (s *GatewayStub) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { + return *new(abinetwork.Version), ErrNotSupported } func (s *GatewayStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { diff --git a/api/version.go b/api/version.go index 93148f28d..0be7de878 100644 --- a/api/version.go +++ b/api/version.go @@ -57,7 +57,7 @@ var ( FullAPIVersion0 = newVer(1, 4, 0) FullAPIVersion1 = newVer(2, 1, 0) - MinerAPIVersion0 = newVer(1, 2, 0) + MinerAPIVersion0 = newVer(1, 3, 0) WorkerAPIVersion0 = newVer(1, 5, 0) ) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 7ca7301ff72e35e16c485e85f0cd4c306540d3c5..1e4efea1a4fcc8ed6a49cd9c92876b457456c26f 100644 GIT binary patch delta 22257 zcmZsiQ+O^)(4}MTIN7mn+qP}ncJjs9v2EM7ZQHi3IseSv%v^Q%eLYpH*LrJt7I=Ra zxb6i67%A};BogphU>Jfs6X%{Rn`|dtB~auPJzlKRnE-=Yk*YK~taMUg*o=w^rAUGX z2^!~59!L9+J(41y(Hq7L3c?41M-fz^AgMF&p87EE6g}?DYJeVt-ef)PjRFQOO$He4 z(IW;bHPXTO82ptHJ`kpv79Y!sZ+TYGVfOT8ayzu$Hy8jiG+%nJzisBK)eR5qy|&9S z^wZFuy>M=-mZ`IRxG6N)^CjJ}&jaAZJh%gEaA3?hD2n~avA2d|pBpyUDde{ip}{K;Ov2~C7ev7tWYZEaKClbX zE7iuXX%qV!fEQSZeKPBYPRy}!e2CO3^ms?__34g5f5!7=&6ArqY|_NsU+7VfJ!)b8 z=_NieYf^5Nw}val&ozE`VH#xO5!ROUybUI-}d^ZZ!Z*lj0bYx@Qzqrkd?Bg@p@EX?kAa0uw8 zCei*qyt=j&IWJlu!-wAi8$+qSWZH$uW#lYk+z;wr9W+g576-OFg?ft`r{q1&cuBPf zJp`;)?hE|5*6jsaum&h&gqN?KhN+S86Z2%>_wN`uGvIWs@)yyQQ99B&oMRR{xqMo1 z6Mg|RLX@7tdP0R|J&Wt1+{7RBkH7!8VC7RDNhoy3MHZbGMpAN$M-6(Gm4sy-oqAYl zf73>bID&wl{~(bp)!_<+?hujiYf6(V*8{NmC-{p$HV1f?0YN;g==V|vY)%^&3}umc=( zi0ir}QS_cyuD?z_4D5ERr&rM+9H@TPn1WHL&>$RZx|$iYRL*uO*fd&MVwClei9K_8 z;`sFO4UUo7Xv`FC4-<3}Vv`Da9e9wyiNFkkljfj%F5b;5#0EPs8>J*4# z>_<+oCkaKg71t(UUmUPS7>^-WpMVfx3%U#whC#PR z7PIl_ddDBt011<)yD$TexRJO7I5)k2IlX;^FWx#Pw%zzAMYj+<%Q6<$^%&0i!m7Nb zHvTo7;~OnWQ{tI!Pat&zJ6?9~uDWwCyz|x#uFWDqPlsoU%HQ#uW#HkPw)2=m8?>se zD(dUJ|4hP3Y~$H|tc-jqbi@w{=CO+`=!bv$I#afIE1>u_E%WT7{9SV$ zxcpdQB=6{&zFHOa&i=;ioZPmO{6q@u8R9s6;5%B7gr+6J!^JK!`mHsU_GjeYKCvuU7;FyFvnn_2bB*hzXilCr@V?jFyemqD{30GaFimlvZgc zr#@l#p#3$mjQs5wCtIkt!|TKw<0;5&Elr*WkBuanOdN9-v^KQ2bwIEH$CL|$kfji^9iU!jT!}Nm^!vr@nr~R?-}>#pP2Uxi z9`9MgJD3V*6VgB-F2QDd2a9j?iuRNpb3@p3Atg(AdL};F96Ts|3)EzsM`?~%jE7p| zmSBULz%E}xqk!*%t?b??Lg8Kse1kp<2+^aOB&PF42O~lLX*Ae?Sn@=GG?UmD#CgJ3 zC`dC54wEOwSkZjsWzSTGp%|^3R8S^wYrXgEJ^x44A~e~++4j1fr$cJ8JHT;EUjY2%JY9 zQ({VQZxS0vghKP7U*2FNNf5H|Eg5F&ZY|61-LrLWL(3`?8_$1%6a{Cp& z&rk37@hn0|`Lvu=-Qz_W`@M|@1@qZp$miiksxxpv`o2ZxMt zcn%?+p$l9PG1z3`qS)Or#j<1%1tm+^{NDrYf~))Z;;6~yxzaf5h8`S+3NeZ?XjojB^Ou2Ph!BCH~=ZnE431KxR8J zwDfNWzt1VcN@7v@}X!A?Oq*Ri@Q{^+IzKGKr)bTKt%B1=|m2J`bVBdCA5M->d0j)RF# z61px(91=!G89-{-x(teK7Qq(hC63dgK)k^^F$Aqb3GC(n6P78m!#t5wHR)oy3q}SL z>OOr~0%zuf;@F|^&E-!^Y6-@t+vxFeh)M*O z`?4xdy@CL{ZZ5KX>lHLo7yU`nF9uOHHD38B5MYJRt{^R3E&x66Yq3=Tos;S{fQ$tg z{k@@;CF;aRvL;J!*4*vK%+Ln16@Rb;^@RDeVp>N-Fu&>==0H;B6*fkAg#}wgwVJPB zdnRv2r&je$oo(;pu)p0T zc)y%%?H6AjR=RH>k=O5Ohl?ML2cTAJ!%mRG6O)WQfk(0Yu?d3CSr@ zcl)r&flqpUjQu#m&D9I@G<*PInj#V3^%xQ``odc)zM}f4k)pWUWv0mVF0dP*2EX1B zM&?i1c<$QX~20P?}XWZI$(L39` zxB!?1@!56{Ekht|svt3lv zRMu3w>7v@P*eJZIo`rhHEV4?Jy-`ZnEztS0zM7q)b%FY$FvWs>FUio|Nvj57nPQucl9#j05adYyIyE%V3I|AXPg7n7oMc>eZaEc$AJbA=>c z9g2G9@U$hd%mBH?mK(rmy}@Q(d)Vx`E|zm7;DHPP(#=@WQxFcn|E$VumEd0BGm?wBkOzmx z1;4)YjIKv^~9Pmw9t{zlnW=vmI-Je%246 zf7@lnBT2`~64)=5Cc0EROtpfPOj!;vGblKB6(!DCHKh7ii`7#g*S;>5TI@vCY=e^50rh)jOBmN2s^^Uv`C>^{uL_m)7{7`rz^Z9ZMQ}0@ z^NdTGzZ_zpNgZr1Ax^+QC3yJQSPcZb@(d`r!;oa@3-%_AtL`-%w&U&ja3>2K&%dEL zX=Ka5kYS(Zs`P4g&B%eOR4rt}vLkxK((9j{%=QU{-obRY=$X;)VnYRzw@DhJIVK_( zB2rodJD@p8wy1QR6S$@_fS6xXqmjMJ9cnz&kc+JY-ha6|yVOMr_ubh5onrEv)mAr_ zHE+eKVAb@=%B(x;`ZhM~Et^p5_QF)zy1tpXushcS^Tb#=!k1kb6XF~l1$fYVk;W68 zikbY58TjS>y=hh=of5Je9KU#Na5k%sx}>TtxS3oJz&F*5=>x|%AY7|O!xM^z)6NC@ z*g-NZJ2iPra=U>x13sUM)8O}<`Di{R?DHJl$&)1Ws-t>D$B~KGT3F10d$2~J_=Y5$ z@4hMDxpM+GQFG=oKK-#vcH~j$5{_(7%5ruxyQ$luWz4|nj}URIC!=mL^D_;8gWa@Fp)YZ3{nSI;SZfyk2|fF#@l>YiS=&Hwa2z@X_#Un96pQu@o0-ef zD@;ZXNh7%cxTMW=);sz%J#8Q+>hPzAp41ZfJ&ABd7V4 zeRx}_S@o{E?DV*!1}Rcg@*k0@6f3kP`HmPQSL)(z&m>&Z2#1j{l(96bnw2_zY1=E{ z*E_^2*8;N&J;yNjP(?0y{V(8OOgQ@BPME_{RoQxI{zrd4Z78Jk%fKqxOShd^Z>@Xb zx$4eD3q0uU?Kafjj~4wn1>Tul4&Rt1K4PT<=&>JD$gm!Xv@DeO(&{{z`g6Lt_{jWL z2O-dsXb)9rY$}UopG~dTpT^OOS?aY-gBan1fZk66z@-*0k%UQq{Y#BT>B2Yc!;nCt zMtA<+8IzP57Sb{xMe}Zrp_waW*>rm>r$Mr$N97XU+$2v)EYY63%v{hylEzl6w-9Ut zZjo1}HfmJI`{0Ij#M&{?z)KCH{KbcTPQJIr6?paBPrF=tCjY9fU5?neo-XufH)hVT~%{BcCf5d_F_!rNvx^IFYzg%0~ny{u$z z5hmVuNt3;p?&vO+JFDbF>`exkzugS62 zHBsySAly*%c*q8f+?W{;Af?-p2}D&xurXn|gL5>XeSqU~&d~aY^^byypK+1^ejcHt zOaAfC_CW!=FhMgYmOF#*tfq;8pkg`q9WV+5MxBhr<~j#VF76@*so`rmx(@#55{pr5 zvwX~wzzGkZ=l(bBIv_%^9X`Ko-r9*COGM3$<^|OF>= zQ8jvU;*8;Ozq6C$wCm|V&qgc{;x6Vxzhs;HZ1DE>=JU<$oh$De0GYbLasw*}CSS_{ z0NX7^z*t5gAW3mr(?~eBq`?V1En&_ASY_f)L>Qe~CxJyHT851q1gQ{v8Zx4iV;nR- zjj~gd;HUkfg#~|sq{`>T^La2JjY!>2IUlEK9YYbNdQV#AZC}CL1-y6;vO~X9%eCL z9*TcB`jF5LuuNaB35~ng&>%lBOgX#pw_xm>-RkkoOLmruZl}SGSfP`ysQ!qvrVe+= zDeOKzpzvI8iA0?txSB0$r~l>Dm#VypAvE_K|McJ6DdB?^&f9Q?S_PePS*k)|M@`Ga zHa5@kv{^fSF+9dlFkw!{@Irg6;@qJot~mm?_uBg4r40i5aKSOwH<0}&nzDk& zfYTn;!^m+XZ%i<#lDhq+AevNRzW-QEAe{W{QwDbcGOOa6NfS&UcJarlw7QZ0w8uMV zW#nBU1nwfR8sD?(S-xl4ST?!8GDC(@%BoxV3ziX8xA4KGVG#lX{BnwZWfQxY?8e9% zP*{QgyuV|bQu41d%Edv>cmOz?WB>rsF0*_vtQZW1fJPuiMT(AcUhml^)&K7MsW)G1 zt<+nV?imUKhIx^4R4!8hH#9lezM+hDET+a=sW|TD+@=hU68{k|(CShigMQvNMsAPq z=0zIm5W}jGb<;I6zA`zTfy#P(zM+W>Fd^|vsW*RcAV1N|Pi%qEkD;ffL0%^$Mmw5+ z5T_zvN!K>N=Cr;I(DJ5lwQ>rlh=0a>OvmrfjM*S4|7m0qT=>bh04{WH!6G<575nWM zkO848ZCC*vU)G)hZd=*nO5Rf$5LSiWWIe|+kwWn;(}${lk;)gyW8;wN=@xhdF!92wDEMmbZBwu^rbRx?u;WqM_yti8SAoNMlI!+GAmkt(PFj%5Q}t_G)o&u zY(`*8y*Vb7S>b5yglVs+Zi^_z_zzDoJ?Y!)&dLYqB?6ro`sz+q-0whu_KMG`J2xHZ zS!z#V638<+Zs2)4t|N+Ft368Has7SYu284gNUXaBpG6 zYldj+C0i6`OOUPIREIAQ|iW9CJ{*q{KidS`bd+pXzgYW5~z%eVBF!z5|kLx}(Nd%)XG>!ifRTN8~45Nc}k9-nFQg z%%A!iL+(fYEH;gQ&aaFxRJx=N7XC0+yCrk=vR%X;Ev7EfoZtzhx_EJtIX`nYe3@FP zUZ{JnBfOd}*^U^s=5eid_tFi0hZ+m|lp=Of=+a?v7LeW#_#33;OexPrxVZuS-oE)0 zn6tpsjt*)o=YwsNMR#h)JP`-vR*eaghnvF^EZJHSZg61^f~|B4Nvfc!Owy&C==v!v zVd((W&dwdZUd0PPqgpH6uitagUHD&(kFAcZDBm4Ts%P%)>tMt64^lR}?GFyqv1H*+ zJ2RmH0vOBy%$Ajm>zoEf?OBEGW%K$A6BhwZAqI4Q7vdxGzPMxsACZyXj*j$nH^sJF zk@=o*!fNF&H)NU>Bviqd3vZu4vKw7#9{%^=#Ts8RyH2_R%aIvA$DUORsgO0eJqs!+ z163tFHOQ{2`B2_aCDbfL^-_JSxGAQ*`Uz-x3G*NTg~;*PU@Ka|4PpVa?EH98PWYpx zqtD9BqKw}}36|oC~A)ZHR8?SbQo8*@Q}HF(jOmW5eu=kHwHMc zkhk?*rck3h2KLt8Bvtua1-DIKuId}2)Kn?e3$G&ajDMJ5B+Z4!LRPq@@0;$c{1z&J zD}-A|SWpYsJwJFEIG#Ih@S;_obBTyd6cEZP1jc{#qE-D>^XKtHYA1Y~12jd=F6UAJ zGDEmv1S-eMUBx&?h%)!AM6r*^@Z=}iY3@cn1Sk5oE4noa5jo7L5Oc!3|K34JH|whY z9{c1kz7YE2$pjfq(qMm}*pY zk4{n<1P(lw#p8}6u2{*(Vmy&e9V!L`sP*8?n3!Uo#KCzT{Axx|Q`kQuntBJJ7?D(& zM5d{aEJ>SHcQQs(U5k2D4F-M8Z4tgxn~MD6@WSYymc)kDqqM*WL*xyT zO$c5?@V04xYsFk&JI=tXWWs9z1u`ow?mVMuciXtw;bhS2f10N04rmNr!p-EhQ(9S3 zTqc3zdlMtmH2?7gSoroK-YYgaO7cb2lG8h~HOK{U>Wn?97=sa%I$zoP?_w%}n&V*& z20Ma%{}|EShNx@G1|#2|A9jwbH8*Z^sxD{L++=r5IXh)gnrzrQUQW0ItTR)U#$9=C z$~WJEOL-dcXpummrJ>8l5qkm|p%-rLr=3!-rm}IJ^H1pVCf?(8%i6iQ&49AdWub>V zPLZvph}E3Are18;60QuhX9L%Z;S#HV$8-#{o2!%?_&*9nOEt62Tr-**&0JRlIenEt5w=o@R!KG(aXGG?KIVh`Yk!*=q`N z2dMIv1g?@!5>|AN=l}kSNY(+>Yv{5wiwIP#`%SALq#2;T!S+GL>wBEY_mHF>HI^kQ z8vpw<*1}2S9c}M`=x-T?0m^`i%sdcB%piD{02OcsDzz}pZV$l-K*HCS-2MSc;~r|| zg(+Kwx8__rQdp$Ij-_kWP<0V#bYIh~p0RR$SRL0lZ?0)%d}^R{)Ii`ItXc?p-h*!$ zM{Y^bZxi*Z)Ehecnn=E zYQO%vA~} zUBtxxq#YLCY<-WfTvm5fX~D|B`U3c2iM_T7pD5M0ADSwf3?^sA2sj6^ZdAJb6z^@+ z$?H9oq}sPEfKJnH$n`2X;KQ4#KS;SqxCk(6kQO{+@;=lx`V50>7^5}ofP~T%LVfCP zKNoDm8}b0<#_$|nLQ+lg7Kn4$hV<0oU66E#)6?n!>_$7JiP9DEDlbdoh9D%&`M>{jL^6a2mDgnYsmB6V8tfypNO=TxwDn9-p4 zQAmA5k%%T^>MnRUhPz^!-r4QA+l7N;n5)OcOP2ti5&E0It)13Mfu&U10M{b*PM@FH zSy>gi)7ux;?A{Z;+?T6+jCPMycJ zUER~K$)@FcUsOO|@JHHFd%#fojg4jTY*?nRiSf7*H(8X z{ed1MKiUt;+_DvCZKzXhY><#G#`9EvQkq26-Bg~eyprkOuqA3{d2oXA&H#}_Z_NlD z=4-Ma(e-Ft3!hcpSz?3mockfLh8fU$%M5hYGpYJgaiG%fkK`t- z-B8kDHtE1t-YA(ZdttK>W|7!aCA~g#=Mv(7@-jd5-SOZZqgDf}TEh;7eUNy0EpXc8 zUNXYV%8Dc41T+pz0vU%#B;ci*I>Nd9SowD4jOyjGj=uG{oc`Y&p;!M8-2-^dG4C}v z&+KyJxRt_Rb`)C7=wAyQ`C=Y6^m^g)_Pz2F4*90Fn)Wt70&#j&E%3Z0&q0m!QufTm%p{u^n0J_kn!GopNXRB^>yw?hpa|z{>9u_5k1phnB5%a5z0U3dNvvs<1l6n|hL==At=LRoy~1BA zy7?=rP8S!I&{F_<{ak1#^!1v;khLXRc70WKf=y8~Gu|fTWN7X1V40dS<`$J@R#zbx zx&O407&6H*@j6g$@K#k7G%*;NV_dfTLs;Mf$krYKP;j7s0%ZgpG^{WfF@x|!R$^kk z+z4GKer=sv#mxvcdOen+VO%#|#=jC=3(NI$;>aG($_~ITXsY7nH5RU^Cta)B28Q74 zaD(UFYJ{zQj97HV6T;H9o=@WoOoYmfK$T521>4OWgyg3sdU8&^$p+4Ub^%eXzpuAX z0Zo*(Dh!JAqTtVi!Vn=Dfe2EGAAhMIW*8DAMbQq;F9_1E&y`B8a(BxntleCe?3*#_ zy4+wkq84D!h>7>rY%DftMz0wpec47tP#L9Z$w+Jw?qVu$Q#JGW)54S#?VZ_mv)K#M zXNV9!?V<9RR@8i+6S`eS2n(f?CFb3oZPRa*N`>gYk-G6($Dg2?yoa2P1n$5b#f5FY|&BVOxG9*1#LNTB=fwH@lheY;Y_hi}1><|)1g8U`Kk!(9%AIWhT(&)r5}oBZ zu*6H~u@kQRX7;~0fY^1|gj~WNS)=qaR;I@*=r&|#Lq8ztkPQ3|q#;5c00(-!JTGZW zh6Knyt@#ffMV)(87}LCo2I_bA2w5@=#w1Y&qrl9t;21o}(nAKG{R^I*qry@$VLsfa z!5sRPKeJw;K1$j@G>VsmSAJwff(0zpUPS0c5QJ)mWWxm^pic2wkNf`pf(WhD$u?Q)J;Xk$ zoY{JbtDQd+u#aQrr?~DOA(Kz${AMmKr>G#fz}4&3%#84Rr+u6beq!YPy`d z=Iv{M$K`T4o68ptLqNo}vt2I2RtHERJft;4glaBx$&?8jHU`R4&`~cttZ`B=T~s;8 zsP=2IdUU4cLyg0#20PUW;0QDT;bqSv?Mp6HKH2?7=OE6{M&4V$y|t^eU0nGH^87br zHwEzZ{#soCO*7mN?+SGgpqdsB(Yp!CA3FN4Ux8*e^zW>^SZH`SA}ZWUbpt;5aK?C6 zFyWpbP({%>O#bBxjI^?`i|$9y*Iis|%NY2-3;liHQG)xcWv|#6GjDH-xi#im?vv~= z8SDIqu2OtQ%2CB<$}WMEKY0VTKF5mfN(;Z1&iQT5WzbDFW<$B{&g@fA0DP1@uIUvw zi9*8*;lEsM+)T53fC8y@1sgNd7FG1`;Pb~pe#Ve$2hlctJN+hwb;p`mqZw-+DDY+? zB&QId?3^TzZS&>3;iXRNN%NZxZ_hlxtdnq2_#-3O4Kx-VXZ%Yrrb4{==A~=uS&qe8F9_W(lw6E%(C(Mg(azccJJ`Jc2@7P;)nLfw#p~;>Jgh6 zf%awID2TK5#Cr$PdUlEN3zjy{e=NHz9??PL7-u0kK#Wx#ww#u*UHoXW?ka{6ofFx0 z)A`&m)`9!|lhT7JY#;rZu!qXNo}|IYe8#4paIYZ4=kqSo2*H-^-iaooAKfPuNF~iJWtDa0y3Os~boKT8jey?J@oQW6 z9bP{kdo*n84KQrp7vq|W_Y&ce&_K=!!@x-6%1JEQ=Es&YaQGTx3}*#Q$WoFib*>TK2-<_3>Nz6?)Aja) zNCqdo$-h?;fmRP3g1z~79ViUUA-fUwlR)y2r*bqiu|1+F#D7L0c?1H7=Q1mAhoEgp z3$oIK3N4z;5XWoGgX2(@Sc+P=7I@s0nvH zobfejc^_2<;WAvNN({*aHYN=*~4`6qXi!kgA53Ivb<@kR%>54RffN`r6+?~h~2 z-$R}C&HhUeNT`IAYIu|I?FjjTEK&(b$N&;I)b&T17v=G=0zJbn91kJOQc~;j5m=6> zz@Z!{(iGVgl>9@Gcq9fw3#T<>*Zs%$li2BPWn&2}8lg&+Q8}5r65p@->nb=hyp4s3qWg(!j>=bQ7xj>j7AY zY55XTiLoP2sCh8Xut8r^uSHP)RwgbAFD8LJISHL4fAJ672Mko_Hvm#-zo@&?V}ku* zc*>NkL=K?P<{#AImiw4W5=^X9Bf*rvOBj+)S$YY@hqT^5`Jv@ikdJAO|B+!@dJ7an zc#t9*nljVnlqRVn5Gf3E)^qRO{D4vwFvym%HzY7;S3de9x3w*J?OD&!3?~HD=KR%(U^jAzt#Dv>qrU$n)PToza6LEU9Ab(3A3y}27QwFF z^!LX?xL5GeYWE0V1iU4pKnxKE&Rp6XZY&0iq76(mXGl-%mvR)3OU$pLX8(V5CMzRj zK|0ZUu^^*t7wZtHTJtg=g~NEChS)NTTR$vjmN5~##_1iJhovA8@F7d!BFha)2MHbt z5HlJvCi={NGW_^G5-iZ*FQ81vY?VTZyDv%@j~Pg_Wq$HwyOnk-gnO$C*R|)Z+3{9Q zMyE0xT5x+$U`aTxt-BPz^Hrs}Pa0H9d5mfpMXnWc&o(vE{COIz8p+jMp#umBj4`%7z^{9tlmrHroW!)Sx%2~esF0G2r2tWzYpBoahvE89^ z0_hZUk{==ca2)9aR-}X|OmL@zmHw9yAxs0$G-2OOGRC8P>xjT=eWws!tCM73c7lvO z^F~hnC6D5Ekd{o&e&bSBm?3$D@pnc@dZkjtnf)MuqC}lFl|VY3l6Es0HBqwvB+Xru z@OzkI{Xcwc1Dhi83PAn0Sp+y;mYr-ZRsB!PibzO~rj{&ci41M9gyx^{8f(?0U|H%| z(Eq55n;A>~;Ke=!wS2Ud>TI)QX1+jn$+UL@bp6fZ+~OEl*xIU|Bmv`4SAS&d3Vpp* z9d7F4eeR)3gbwZVl%f|ab}e4(L=h6p2L7OtvtZHCxF+Alen84UAz!{T^pY7?iF$Um zuxOfZOY$|w}>Jl^5Ta!Iopt%`=KQ*`4(@v4^g zl*{A5w;)Dp>* zL+9e9_}P9gAM@v&mX^m=E=#L`dTVO#+-8LHNF5T`*5Zem6I!$VjXm9 z@^Pmn-3t;_t6Sj}a6SP&-{J0|O-}`q5ao^#d%~mz6Iod!O3Bw9NgT}Wrmd9O`@afa z!~R_(JAf`OObEf0?+b`WOn(D92q`klLVqzQZN7Lj;XV#H;d`c31XkJK)z$2g6ZS@z zX?EP1U&2)2R{rh-yUg!^ioE%vHUu`sX1Ylb-3TrlODLINls#)wD1ZPV8|mVG!1*P* ztmk;KP(N6;5pmgvyDf2<+RcubgtxIFu|-bG8UV^!QHr!HOAw+9$cV92*eghBabM+U zP2E#D8+ae~AEb@I6&ookfBqBIe^3`!1hKAnvqI&{fn@8(k&nJ6iz#p8zg{WM2*g;1 zj+IlC*w}?Z0xsF=fsc>;KRr%PPU)rY;Ym8Z^t~lQcczPkj|dDMLOjr$7bMWmBx)#O zoB$>15W^amAd#tLYkGvp??%K3&zYoG68K^apTVwwI}(?B!BUNakVR^LCcv7rFBA78 z8c=fOeCUvJr~h=mt&E74nAPynRG-+TBF+cPXhUi)92D}gc0X2}FExEsh(kf(+S&y9 zcgNf6^rtSjqV66EYy;ov;f96jqHt?^5dn9!1vNdbg;LW;6}G2EXbd@ zbg|NXhfBDLor|w(qPBK$uVaRs=aD812!2P#gp(~@J4X)9G1XpL*u*!PPLrnYiPDz~ zoiGeU+S;Atk8&Avv-=ofCf3bnIiuPhG;SqV9~|yN-`*j;V2w`z9(fD+Wn!r`f%q`Pm zn|&>Rqi==utATW4RGoK=)wTGyX&rz83}i>4(0_wS^ST{-kzHB!XHev z)>}uP=p_qx)^TYUwN0qshv)RD<4uJnJ|s*%9~m+iP6?X&1&ncxRXIrIZYx+D29tC{ z6cMYZu_tQGEvRR*_6T>>G=Quc0veSvL3+oP9J~x2!cbM_r|PTkDta@Pp{gP#=EFdr zv#TahHtdUDx&GMgUjUW&7=!K+@*?{Yslz?nkm65#*^4IL*u2HuQhYo5=mppJBG9{X zQEqoT-0||exPxP;oxu@$4!PB4Rbl7}dsE!Dx;u$mx5(C2VRVBGBw)OabM~a}_5u6M z={4mjteG{52Ej@lIpqFU0HU?sq@F=kD`>zbdTpQ77^!)1;+=D?+O46@R-;-=r4q7* zr|Rq)eN&cF6V<9Ml*9iJs2Z(LL)41(tK@$JJo_pCs^|PbEttdILoAPXw1}ID3Qu+- z41kqE&cFmhX8a5R<1Z0`cK;)4EK^cz zJE|!DYvll;1AZ!#uFa%YA-XH6+PdyK)Ma&)G?)J%J|&G(zF3rw z5zOOc6#2MLQ1j2$@UP%n{;#!^|93Ct|F@PBv@bx0iJaKQW_fKcXAr901!{2Ce{?u7iG&jZ9vf?Rm)tx1i8mL)1T>6WnH`%hIf=Dpyvt zG6FZO%4nOnqf%e5%Vr|D@VKyE-8|T-I?#)XvISV^q~_By82;QRrX56Jzbw@^6^rcF z?X%d=gr?D%ts$ouS~dkZp9ZX}O69=Dgz(`=&!j`Yuxdd(0?=b+o<-_LG2*Hc?E8ds zMktZfZ?tDm`Bg}?atIp&{4_@hn;-U0gvt1=ai7D5SiCXYEp-eS?rfT*?e9bQGiHH3 zp@3EC)MRlz)||J?my~ytxF#mk1Y5^owt)~nUWXrn_pqO$+{tA;Wjp(W5&TlYD4RMb zb$*~XY@dr{2?!cAl6kw4gFE|pU?sH*YiGj4a<^VI!c|nOskHS^?$2$v#5Rjfw8l`n zO0qfNQ(7uI8O_G+**rfy%SO4Wyk;_AE9jcG>1o6o{3ej-hVY8i>;Rw*mzs|iu1XjL z9%P~%&WSzH0Fs1xbr~}-Fn6NeVjvr1Z7`nIv5`SysnZMs+K%~*XeD^k#KKP--2f;t@2)_WMd`q}=77LTA_fD9{-zxl> zAPv>N1f*{fRAr15aSXk-k|WsM8oD_UNw$Bd)YR}1dud%@l6338Tg_YGqeFxQSge?ZlVgG{!PPj3P?<&>iK zVke1)`*c_ny7c|zl=5wS@j!ihFxVRo=rU6P0u-BA0}H@oWE1-bV>IpuNLnl+9W4;lefFGQ9Lum5Q%s&eyL9Brk_&zy2<#s zRNifuBAU+KGvvXV_L}`?c&D4m7wvvAoVYMa=Kd%5LL1_*f-6bBHNyxaNQ+>OsEeOe z0dq#vlPFTPBXgY-%#OibKvYGkho!bIHY=i)|1?hPb?-C~@yGcjvDYgv;;z zH70xc%HRA;8*kkSzSjG%DiT)xtwK{(@~2j=tb~ZQ=V)P9_QaCvL-TU%F3s|^dQSTe z+3cTHxHD?bjjWdB{wJijFDJIQN9>hp?F)bIjZ_1$4REZS9}^sK6d7I6W0`P!(3t1G0VkR)<=h40f!+oqs*L)Z`bd9B zJGLMm@&TuM2FA44Yw~{2`&UgVmGl_>fg)CQVz$lH*EH*11{y$c-X7K&aR*ZLhaZ7Yt$K0Rm-zT3n1nz>Ro zHfzh>&9=?fi_ZHtYbuXkHzg1`L(qR$H&=ENMQQaFLw5J|jh1}5l1`iKFHYC&g@qqK z;~<|=EjfS;MQ46tfQd4X)$QVBVT)MWZ2FhoSGjjK-udLtD}8A*^-+&!yYwZuZLeug zd1`&(vSz=fMb~^6ulhC*`*iKg&8AEg@{rb|tIQX5En%k=_#XB*4zVu;{V{*Jrrw!c z02Y#7G}Nb<*Nj`qc-eL&|6$q1vWPJ_MMD4?i|3e30p{Qavee72c5TN2^{&dvpcLHP zxFnb4cmkmQ4X)5a;E_;Wm+cSb4lh(~d!h~9swgy}G4TN(XusG5;(4kxC@nE5w`a6F{OlA`?I)ZMI z7jxvRVPAj`zn@>IFe^o&f-lSf`a6b!Xe_~CC>&zR5Db`NHn(wOpDfd?_L zG{RF%V30C2hYRsZ5R3q1mxRThhZvj0L9j>}O$T}iZf4k<$x7mjfdF420D({Aae$t) z5D{O_%l+zU2aPYqXQF>1o=i|AB=O<#k@)lrKqufGWZ)VGF=BEyT#~F9!&3qU_!)w6 z%r%)H0F=*Aq`nj4C}QdZisqj%8b==b)klnDBHfn5OF}5|&`?!iLx8xq@zfb`cMMt@ zk)D?B%Pq1>-JPc;mW&V;h#|2;Az&z&JXdALVp4dTh6ckz;HH1nHo!4gGBTPYAB-0O zg4D+Wfq)Voc%l|Ug4X5KjsuQ8@%DKLJt57KR>WXE)#6wtexE@$+sGS?{e1qePOwTi zX~>~6p3J|rN^K)WS$`n%1DgtBi6t+CM=q#&VZz&p&U3daPzfGI!9Rp}(b)DKWG8rz zx!jR^2iaSM4q+Xby*!Q39LID0;DgkXgT1Zc;8Y8P@|_67LFF#qlTrvQeGnC{Fh10w;rih9)sdD9ijisuwDE(Hp6rFeMieR7QcD682N# zjlgxOxuf*$U^qC6ldZkof6erNY68t*G}UYQqY@E?x&ig%TVW)W-=4^%5nJ1%;oxmd zJS|9ag{1tN%0c(kKTQ2|t)E`&$JhEf=LJ6HnLcS&p2uSW(^A>vCWf0Bg^8h}3|e-% zZRVG_%~rW)q~acxvatIJOqd_r_9~n_Cu)9FkoKl_%&9}WEgUj>fA)1_S54RocC(3E z@$$qnJx*1Yxnjr&vm6(0Th8)i^0n;;xwhr-+Kxq=LDAy8&4-lYy{+5O5bzzUYDHl) zHm2ri+ft%rY}(OU&FU<>R#+V`r4rh;ZBMkKZCx$V>fI(+rY~E}r%bh4e%{}$Zyie% zb*F)^>R_huG9g%6e^gZ!4XdG*lisiZIxL%Hq}r~6)U0Xe{qZ+4O|ct2kV`>zH!U-^Qcae=+lXkl?Uk4>IE3AcUey_?BKeqjuC(`nPPK(#ZRU>gc` zOY-s4#hX1KcPnl7Bh^M$c|Y=!K#+cdG}UjJ;&b^tExGZbus>*QJYAB*<0HUlkmxN% zV{=W9$S)rDe}7S1MMHz=nH~d4RLnD|%3l)YN>AcyQDV6#4@&%Q+}YORJZ9Y7S}YGq z?ard?^$_UO!m?j~!XThGIy0;PXSUrYDof$A0m@sEYWB#Tx&nbqB1uyq#h2T%bX%5g z%hGLG_HhC-ufp#x%6D^XbE}60EjvFczex3cCW(%yf4I)XcxAQa+xK3h*16p`H&nqR z%_pE?Rbj*9JJ# zbx9lq0Fx}VKgmxj$YAqeg7QD6k^iE=hM@=Ne{dnA{>KPF&x<3-k)SKD!w|&T5X1~s zV-CP6m?EB5yd)@lCl#wxn@(*$BDL9+LTRN0N-lp=%lt|0(WJ&qz8{(QBZUu5PjwYD+EWIY}*D!q{w*m7o_fcO^ zf9ufV<3x+eT5pDmMkyPdn7`dOccE|li+fw#cH8Qn+J~lwUNl__P<``scU5E(x&w7o zd0lpU*GrDghKy&+nrol>ta_N*DX|>$roSeAW9P7O8qI06hpo|;tzWzA_}lwKWYIl$ zJAdhR{^1}U)gvUujCPZxkIRhP_-i^`fBWCnb&-7Amd*VTmrPq{M(LZUhbEJFrQ(hM z?QmD+ENES^6?*IBVlh_C5An*_4@Fe~OnC{lox{b|=KMQdfc49!i&*~naEK#yQF!Fe`SZNdiXljERR|TBFWc$+)D3N)3px?MmP*GB3wL* zJKjQ8MQOz()Y9(Pn}zfSMaxxR1rPmgWz_W0B6(>gU#1_(ha3VAW+(BKvP#D3lB9t; zH~?5`y+|IaA`~FPqeXJUE+xd_I6w)xOOjD~lpZ9fU|Vb|6qj9jL!qLCf5q3|yrU1l zrgHan)3qasL^wlJ%y_goqf}4K6+~}=Sc{8Dit^Y}&K4SMx``y;LI>lbwvWpUi)FG` zvz8bWNqLa8^a}$Kr7{Pz1N=YZVv>@kS$9peo&xFBX4AbRdfG=lK)~pyg1_jFU|-Y$ z@I?;lIjFbBqSZmYekAKwf78_-pCRU*Q}F1@b+R-|wzCalO!)3je|dLw)BOq3tS>Ec z?j&4v&A79nZ_>~QScU*|bsGo+G2uAK-N6B)2wx*+q|brG2UDaH$Vlm$-74i#GQmC~ z9s)iJ`E0|b=W*$ITzZ~0PtW5r&8$bJnKE!w`s>bOyLPtkB)H4vf5&n8aa?{JmmkOF z$N72Y*LGbF)CKVl1u{E;etYxFsJz7ddJ3MX&)aBI8T6`cs>{LUpp{XT=di&KZZ<8U zDg$_uUW+L3^c+S4N&i5N;@GB-E&M;Z z>t8yf#WfW-qq=llf5|cnDJJEM-mC?VtZuz|r*0K(5;&4xwaDopY!dD)#EoiLh!&Oz z8zw}Im%c>)5X=!I>5ZsD;!yGn2k06_VkKSycmo$;645!p+=blz3^(z|I4Fm}>W7Ay zPEC^_xaTW;r!LRYf_NWb)EQ6cx=Z0iBtdtUfEf`1hcJiRovs6FaxmPxxC7I0!iCXIS zXBu6h==eyTf0{dhOu85jv9GT|91aeobWDCFK9WsguES`m%yql+=UjSBwhCSv`67~m z=$o5c&*gs?o11&`zyAz|gE#7`*Xoz4Bc^;YNNwq%TpBtxccLXMb*)kuH zy0=M)S}4ZEha5fUc#f)^NnJfwrBh+N;LB<_d#1jXe=UdE9BDTU*}UxMWZ{N$tUIToQu#jWF`~ETZvrrgl>a_4~_^To_ABssA29U!C`q z_tKg7e;Hq3?@BGuKhECjW2@!e03nzHByToNkG6is>s;-z|NCMU zw%cMW>i$gnwHd&|#BGyqLC(#tS2D^6-9S%4%65aTD{-%-dOw)WT=@54_)8kH1=E@S zf9%M3rj5HXUyzzMra%YlgSFo<*NCNciiy0)?^eA+(Y9m00tj>=&^1>~3Vt5B2FO6} zk6V&ei_AbaHj5??e!GeD907|=g$AJRt=sv}QF#@49yC4b>Dtx%;5^nR+pk{Nr3Y9L z?{_kX(bawsblvbW2~_&88yy>F?LIske+6#p-5R-u!#J8ExznYc7asIxXb9%;N~|Bu zK}Z?H<3Q$zk$!AWReV1KVT7(RjajhBhuEy_;(l!N^z~-laq9GYtu{$l-j_|u^fy&) z_GYtYV^X(2TRBt5GVc-gVRHUJZPWrdh1l)Mx;@zkBRRI}&OI-P_lI5q7cwnae<$&g zCt;s-VN7YTY|l1NyIQcQfo>^ZN=!EknF1f#^0=8HdAcWeqDtRkkC_rMfJT5&?n1YI zLgk*jT)`rs*eqBp1T^qBA_VUQ!=kY~lD z*DA?Mk^g#mkY~k=?-=W6I%nQut)Z9Em6Bq})E@6z_QqB{p4!&xUH>rx~9py`^;lF7$7x=15kCd6OzABuY z8o!YgRu9^8d476Y96L4V6OvCIpblY(W@T&jR%unkH{<#l-8lOjKoi6sTjAenX38SK^rTdx_;OFuZK_=$1_d z5k~kLas;lBOb}r#s1+2%yE&9c4659)VxHzbn-YVn+4)>X!cs?~0ye=lEK3lu@DL7bE* zb`U6<-zHHaxd<@hOeS(O+(Bq1?Oip&OI<2`hN==4J3r|x|2j;9q`p{%1sW6H(6uV& z=svH3(dK4N%#Zr&AJI+6CGZj5H1B`@h87oc)4aWk{fKVvRKF_Tmnm1lg*wW_)X}DD zV>i2$T!CJOr=s5*f0tzc8sb1EY!>#i9F;vV4%iSdv+M1a((7Si;&Ze^DHCpGW9Bo_UKU7tT$hkV6@Eel$Z-j zbcBJJskAcXOA;RHf@;i=tG=%tlO?OTPX%0>Uu7G=qJ+JfzvPJX+8%9tAh2N67$GG- zX_6YFyIj*0f7*yQ?Kjdjvu!g$4*B}Aouo^W!uKoivOd|$y@ZdV_)Ai;I{{ebIm~9C zjY!ck-s)WY1vOJSyp8DG{QZ#;%uT%G>bn|FL%ky$OR*_^%kx zZdtUtAFyP%B_4L%1q)hJkxsg{TjGCT29Fj|8FcMteEppGJihOJh(8kYfU@Sx z`Hs-_8-)*^gqnk>+A{|ioGKO#V&n##bdh1QDt41~6f;iBJbCAvB6Tm+{Ap z7UP7nG%pvpN>LT@;oetGR#@%JjMVII(G7F*11x5$GUK|`7^Iam*d^$zLY~V6T-5baX zjZj(*lbB(N!A66UY&JK*WdtKSI~DwTsrQiOc<*sVPpx=xAyw)xJgqnO&ru4M!lN9K zGqO!~+bOuMwnWz^v@T-#3^_^*~ wa3N%vph6M2uLVJOd1+CrC|JmT22^BM(R+6PbtKz=1^@v6|6c+Bn<+;H0HR8yod5s; delta 22245 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 E00)OA_y7O^ diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index e7083de2449cc0fec7b2962d0b1856b7fc1e71b9..08f41f3c55cb320b41642fb0e29238561a56591c 100644 GIT binary patch literal 12680 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 CH?hC~ literal 12555 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 717eeaacb2879bc3d4445218e554bffe547f727c..c82ad677093007288784c12142827b97d9bd444d 100644 GIT binary patch delta 2674 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 diff --git a/build/params_2k.go b/build/params_2k.go index 84023c38c..6c0918c51 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -17,7 +17,7 @@ import ( const BootstrappersFile = "" const GenesisFile = "" -const GenesisNetworkVersion = network.Version14 +const GenesisNetworkVersion = network.Version15 var UpgradeBreezeHeight = abi.ChainEpoch(-1) diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index d93732999..febbca479 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -61,6 +61,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof7.SectorInfo +type ExtendedSectorInfo = proof7.ExtendedSectorInfo type PoStProof = proof7.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/chain/actors/builtin/builtin.go.template b/chain/actors/builtin/builtin.go.template index 031c05182..f5d5eb77b 100644 --- a/chain/actors/builtin/builtin.go.template +++ b/chain/actors/builtin/builtin.go.template @@ -45,6 +45,7 @@ const ( // These are all just type aliases across actor versions. In the future, that might change // and we might need to do something fancier. type SectorInfo = proof{{.latestVersion}}.SectorInfo +type ExtendedSectorInfo = proof{{.latestVersion}}.ExtendedSectorInfo type PoStProof = proof{{.latestVersion}}.PoStProof type FilterEstimate = smoothing0.FilterEstimate diff --git a/chain/actors/builtin/miner/actor.go.template b/chain/actors/builtin/miner/actor.go.template index 2b6b78ebc..74c16be36 100644 --- a/chain/actors/builtin/miner/actor.go.template +++ b/chain/actors/builtin/miner/actor.go.template @@ -23,6 +23,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" {{range .versions}} builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin" {{end}} @@ -193,6 +194,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -201,6 +203,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { // We added support for the new proofs in network version 7, and removed support for the old diff --git a/chain/actors/builtin/miner/miner.go b/chain/actors/builtin/miner/miner.go index e60ff8da8..7889d7a4d 100644 --- a/chain/actors/builtin/miner/miner.go +++ b/chain/actors/builtin/miner/miner.go @@ -23,6 +23,7 @@ import ( miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" miner3 "github.com/filecoin-project/specs-actors/v3/actors/builtin/miner" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" + miner7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/miner" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -282,6 +283,7 @@ type SectorPreCommitOnChainInfo struct { type PoStPartition = miner0.PoStPartition type RecoveryDeclaration = miner0.RecoveryDeclaration type FaultDeclaration = miner0.FaultDeclaration +type ReplicaUpdate = miner7.ReplicaUpdate // Params type DeclareFaultsParams = miner0.DeclareFaultsParams @@ -290,6 +292,7 @@ type SubmitWindowedPoStParams = miner0.SubmitWindowedPoStParams type ProveCommitSectorParams = miner0.ProveCommitSectorParams type DisputeWindowedPoStParams = miner3.DisputeWindowedPoStParams type ProveCommitAggregateParams = miner5.ProveCommitAggregateParams +type ProveReplicaUpdatesParams = miner7.ProveReplicaUpdatesParams func PreferredSealProofTypeFromWindowPoStType(nver network.Version, proof abi.RegisteredPoStProof) (abi.RegisteredSealProof, error) { // We added support for the new proofs in network version 7, and removed support for the old diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 6d4c8da64..e112e2bf9 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -26,7 +26,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" bstore "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" @@ -400,17 +400,26 @@ func (filec *FilecoinEC) VerifyWinningPoStProof(ctx context.Context, nv network. return xerrors.Errorf("failed to get ID from miner address %s: %w", h.Miner, err) } - sectors, err := stmgr.GetSectorsForWinningPoSt(ctx, nv, filec.verifier, filec.sm, lbst, h.Miner, rand) + xsectors, err := stmgr.GetSectorsForWinningPoSt(ctx, nv, filec.verifier, filec.sm, lbst, h.Miner, rand) if err != nil { return xerrors.Errorf("getting winning post sector set: %w", err) } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(ctx, proof2.WinningPoStVerifyInfo{ + sectors := make([]proof.SectorInfo, len(xsectors)) + for i, xsi := range xsectors { + sectors[i] = proof.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } + + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(ctx, proof.WinningPoStVerifyInfo{ Randomness: rand, Proofs: h.WinPoStProof, ChallengedSectors: sectors, Prover: abi.ActorID(mid), - }) + }, h.Height, nv) if err != nil { return xerrors.Errorf("failed to verify election post: %w", err) } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 461a826e8..4bf8dbc12 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -461,7 +461,7 @@ func (cg *ChainGen) NextTipSetFromMinersWithMessagesAndNulls(base *types.TipSet, if et != nil { // TODO: maybe think about passing in more real parameters to this? - wpost, err := cg.eppProvs[m].ComputeProof(context.TODO(), nil, nil) + wpost, err := cg.eppProvs[m].ComputeProof(context.TODO(), nil, nil, round, network.Version0) if err != nil { return nil, err } @@ -620,7 +620,7 @@ func (mca mca) WalletSign(ctx context.Context, a address.Address, v []byte) (*cr type WinningPoStProver interface { GenerateCandidates(context.Context, abi.PoStRandomness, uint64) ([]uint64, error) - ComputeProof(context.Context, []proof5.SectorInfo, abi.PoStRandomness) ([]proof5.PoStProof, error) + ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof5.PoStProof, error) } type wppProvider struct{} @@ -629,7 +629,7 @@ func (wpp *wppProvider) GenerateCandidates(ctx context.Context, _ abi.PoStRandom return []uint64{0}, nil } -func (wpp *wppProvider) ComputeProof(context.Context, []proof5.SectorInfo, abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (wpp *wppProvider) ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof5.PoStProof, error) { return ValidWpostForTesting, nil } @@ -692,11 +692,11 @@ func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (b panic("not supported") } -func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("not supported") } -func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (m genFakeVerifier) VerifyWindowPoSt(ctx context.Context, info proof7.WindowPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/chain/stmgr/actors.go b/chain/stmgr/actors.go index a8958ee4c..52773e1e4 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -117,7 +117,7 @@ func MinerSectorInfo(ctx context.Context, sm *StateManager, maddr address.Addres return mas.GetSector(sid) } -func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, sm *StateManager, st cid.Cid, maddr address.Address, rand abi.PoStRandomness) ([]builtin.SectorInfo, error) { +func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwrapper.Verifier, sm *StateManager, st cid.Cid, maddr address.Address, rand abi.PoStRandomness) ([]builtin.ExtendedSectorInfo, error) { act, err := sm.LoadActorRaw(ctx, maddr, st) if err != nil { return nil, xerrors.Errorf("failed to load miner actor: %w", err) @@ -203,12 +203,13 @@ func GetSectorsForWinningPoSt(ctx context.Context, nv network.Version, pv ffiwra return nil, xerrors.Errorf("loading proving sectors: %w", err) } - out := make([]builtin.SectorInfo, len(sectors)) + out := make([]builtin.ExtendedSectorInfo, len(sectors)) for i, sinfo := range sectors { - out[i] = builtin.SectorInfo{ + out[i] = builtin.ExtendedSectorInfo{ SealProof: sinfo.SealProof, SectorNumber: sinfo.SectorNumber, SealedCID: sinfo.SealedCID, + SectorKey: sinfo.SectorKeyCID, } } diff --git a/chain/sync_test.go b/chain/sync_test.go index 3293856c7..2af8aeb54 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -22,6 +22,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -543,7 +544,7 @@ func (wpp badWpp) GenerateCandidates(context.Context, abi.PoStRandomness, uint64 return []uint64{1}, nil } -func (wpp badWpp) ComputeProof(context.Context, []proof2.SectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { +func (wpp badWpp) ComputeProof(context.Context, []proof7.ExtendedSectorInfo, abi.PoStRandomness, abi.ChainEpoch, network.Version) ([]proof2.PoStProof, error) { return []proof2.PoStProof{ { PoStProof: abi.RegisteredPoStProof_StackedDrgWinning2KiBV1, diff --git a/chain/vm/syscalls.go b/chain/vm/syscalls.go index b8c027bd7..cd143279e 100644 --- a/chain/vm/syscalls.go +++ b/chain/vm/syscalls.go @@ -245,8 +245,8 @@ func (ss *syscallShim) workerKeyAtLookback(height abi.ChainEpoch) (address.Addre return ResolveToKeyAddr(ss.cstate, ss.cst, info.Worker) } -func (ss *syscallShim) VerifyPoSt(proof proof5.WindowPoStVerifyInfo) error { - ok, err := ss.verifier.VerifyWindowPoSt(context.TODO(), proof) +func (ss *syscallShim) VerifyPoSt(info proof5.WindowPoStVerifyInfo) error { + ok, err := ss.verifier.VerifyWindowPoSt(context.TODO(), info) if err != nil { return err } diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index 358fbd046..9fd6a33f7 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -8,6 +8,7 @@ import ( proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/ipfs/go-datastore" @@ -86,8 +87,8 @@ func (cv *cachingVerifier) VerifySeal(svi proof2.SealVerifyInfo) (bool, error) { }, &svi) } -func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof2.WinningPoStVerifyInfo) (bool, error) { - return cv.backend.VerifyWinningPoSt(ctx, info) +func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { + return cv.backend.VerifyWinningPoSt(ctx, info, poStEpoch, nv) } func (cv *cachingVerifier) VerifyWindowPoSt(ctx context.Context, info proof2.WindowPoStVerifyInfo) (bool, error) { return cv.withCache(func() (bool, error) { diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index 0b8ec6fe3..8893e7b8e 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -12,6 +12,8 @@ import ( "time" saproof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + saproof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/docker/go-units" logging "github.com/ipfs/go-log/v2" @@ -260,7 +262,8 @@ var sealBenchCmd = &cli.Command{ sectorNumber := c.Int("num-sectors") var sealTimings []SealingResult - var sealedSectors []saproof2.SectorInfo + var extendedSealedSectors []saproof7.ExtendedSectorInfo + var sealedSectors []saproof7.SectorInfo if robench == "" { var err error @@ -269,7 +272,7 @@ var sealBenchCmd = &cli.Command{ PreCommit2: 1, Commit: 1, } - sealTimings, sealedSectors, err = runSeals(sb, sbfs, sectorNumber, parCfg, mid, sectorSize, []byte(c.String("ticket-preimage")), c.String("save-commit2-input"), skipc2, c.Bool("skip-unseal")) + sealTimings, extendedSealedSectors, err = runSeals(sb, sbfs, sectorNumber, parCfg, mid, sectorSize, []byte(c.String("ticket-preimage")), c.String("save-commit2-input"), skipc2, c.Bool("skip-unseal")) if err != nil { return xerrors.Errorf("failed to run seals: %w", err) } @@ -296,7 +299,13 @@ var sealBenchCmd = &cli.Command{ } for _, s := range genm.Sectors { - sealedSectors = append(sealedSectors, saproof2.SectorInfo{ + extendedSealedSectors = append(extendedSealedSectors, saproof7.ExtendedSectorInfo{ + SealedCID: s.CommR, + SectorNumber: s.SectorID, + SealProof: s.ProofType, + SectorKey: nil, + }) + sealedSectors = append(sealedSectors, proof.SectorInfo{ SealedCID: s.CommR, SectorNumber: s.SectorID, SealProof: s.ProofType, @@ -325,20 +334,20 @@ var sealBenchCmd = &cli.Command{ return err } - fcandidates, err := ffiwrapper.ProofVerifier.GenerateWinningPoStSectorChallenge(context.TODO(), wipt, mid, challenge[:], uint64(len(sealedSectors))) + fcandidates, err := ffiwrapper.ProofVerifier.GenerateWinningPoStSectorChallenge(context.TODO(), wipt, mid, challenge[:], uint64(len(extendedSealedSectors))) if err != nil { return err } - candidates := make([]saproof2.SectorInfo, len(fcandidates)) + xcandidates := make([]saproof7.ExtendedSectorInfo, len(fcandidates)) for i, fcandidate := range fcandidates { - candidates[i] = sealedSectors[fcandidate] + xcandidates[i] = extendedSealedSectors[fcandidate] } gencandidates := time.Now() log.Info("computing winning post snark (cold)") - proof1, err := sb.GenerateWinningPoSt(context.TODO(), mid, candidates, challenge[:]) + proof1, err := sb.GenerateWinningPoSt(context.TODO(), mid, xcandidates, challenge[:]) if err != nil { return err } @@ -346,20 +355,29 @@ var sealBenchCmd = &cli.Command{ winningpost1 := time.Now() log.Info("computing winning post snark (hot)") - proof2, err := sb.GenerateWinningPoSt(context.TODO(), mid, candidates, challenge[:]) + proof2, err := sb.GenerateWinningPoSt(context.TODO(), mid, xcandidates, challenge[:]) if err != nil { return err } + candidates := make([]saproof7.SectorInfo, len(xcandidates)) + for i, xsi := range xcandidates { + candidates[i] = saproof7.SectorInfo{ + SealedCID: xsi.SealedCID, + SectorNumber: xsi.SectorNumber, + SealProof: xsi.SealProof, + } + } + winnningpost2 := time.Now() - pvi1 := saproof2.WinningPoStVerifyInfo{ + pvi1 := saproof7.WinningPoStVerifyInfo{ Randomness: abi.PoStRandomness(challenge[:]), Proofs: proof1, ChallengedSectors: candidates, Prover: mid, } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1) + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1, 0, build.NewestNetworkVersion) if err != nil { return err } @@ -369,14 +387,14 @@ var sealBenchCmd = &cli.Command{ verifyWinningPost1 := time.Now() - pvi2 := saproof2.WinningPoStVerifyInfo{ + pvi2 := saproof7.WinningPoStVerifyInfo{ Randomness: abi.PoStRandomness(challenge[:]), Proofs: proof2, ChallengedSectors: candidates, Prover: mid, } - ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2) + ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2, 0, build.NewestNetworkVersion) if err != nil { return err } @@ -386,7 +404,7 @@ var sealBenchCmd = &cli.Command{ verifyWinningPost2 := time.Now() log.Info("computing window post snark (cold)") - wproof1, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, sealedSectors, challenge[:]) + wproof1, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, extendedSealedSectors, challenge[:]) if err != nil { return err } @@ -394,7 +412,7 @@ var sealBenchCmd = &cli.Command{ windowpost1 := time.Now() log.Info("computing window post snark (hot)") - wproof2, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, sealedSectors, challenge[:]) + wproof2, _, err := sb.GenerateWindowPoSt(context.TODO(), mid, extendedSealedSectors, challenge[:]) if err != nil { return err } @@ -502,10 +520,10 @@ type ParCfg struct { Commit int } -func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par ParCfg, mid abi.ActorID, sectorSize abi.SectorSize, ticketPreimage []byte, saveC2inp string, skipc2, skipunseal bool) ([]SealingResult, []saproof2.SectorInfo, error) { +func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par ParCfg, mid abi.ActorID, sectorSize abi.SectorSize, ticketPreimage []byte, saveC2inp string, skipc2, skipunseal bool) ([]SealingResult, []saproof7.ExtendedSectorInfo, error) { var pieces []abi.PieceInfo sealTimings := make([]SealingResult, numSectors) - sealedSectors := make([]saproof2.SectorInfo, numSectors) + sealedSectors := make([]saproof7.ExtendedSectorInfo, numSectors) preCommit2Sema := make(chan struct{}, par.PreCommit2) commitSema := make(chan struct{}, par.Commit) @@ -579,10 +597,11 @@ func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par precommit2 := time.Now() <-preCommit2Sema - sealedSectors[i] = saproof2.SectorInfo{ + sealedSectors[i] = saproof7.ExtendedSectorInfo{ SealProof: sid.ProofType, SectorNumber: i, SealedCID: cids.Sealed, + SectorKey: nil, } seed := lapi.SealSeed{ diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index e50c4366e..39de942aa 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -470,6 +470,8 @@ var stateList = []stateMeta{ {col: color.FgBlue, state: sealing.Empty}, {col: color.FgBlue, state: sealing.WaitDeals}, {col: color.FgBlue, state: sealing.AddPiece}, + {col: color.FgBlue, state: sealing.SnapDealsWaitDeals}, + {col: color.FgBlue, state: sealing.SnapDealsAddPiece}, {col: color.FgRed, state: sealing.UndefinedSectorState}, {col: color.FgYellow, state: sealing.Packing}, @@ -488,6 +490,12 @@ var stateList = []stateMeta{ {col: color.FgYellow, state: sealing.SubmitCommitAggregate}, {col: color.FgYellow, state: sealing.CommitAggregateWait}, {col: color.FgYellow, state: sealing.FinalizeSector}, + {col: color.FgYellow, state: sealing.SnapDealsPacking}, + {col: color.FgYellow, state: sealing.UpdateReplica}, + {col: color.FgYellow, state: sealing.ProveReplicaUpdate}, + {col: color.FgYellow, state: sealing.SubmitReplicaUpdate}, + {col: color.FgYellow, state: sealing.ReplicaUpdateWait}, + {col: color.FgYellow, state: sealing.FinalizeReplicaUpdate}, {col: color.FgCyan, state: sealing.Terminating}, {col: color.FgCyan, state: sealing.TerminateWait}, @@ -495,6 +503,7 @@ var stateList = []stateMeta{ {col: color.FgCyan, state: sealing.TerminateFailed}, {col: color.FgCyan, state: sealing.Removing}, {col: color.FgCyan, state: sealing.Removed}, + {col: color.FgCyan, state: sealing.AbortUpgrade}, {col: color.FgRed, state: sealing.FailedUnrecoverable}, {col: color.FgRed, state: sealing.AddPieceFailed}, @@ -512,6 +521,9 @@ var stateList = []stateMeta{ {col: color.FgRed, state: sealing.RemoveFailed}, {col: color.FgRed, state: sealing.DealsExpired}, {col: color.FgRed, state: sealing.RecoverDealIDs}, + {col: color.FgRed, state: sealing.SnapDealsAddPieceFailed}, + {col: color.FgRed, state: sealing.SnapDealsDealsExpired}, + {col: color.FgRed, state: sealing.ReplicaUpdateFailed}, } func init() { diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index b2059a737..629ff7903 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -20,6 +20,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/network" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" "github.com/filecoin-project/lotus/api" @@ -50,11 +51,13 @@ var sectorsCmd = &cli.Command{ sectorsExtendCmd, sectorsTerminateCmd, sectorsRemoveCmd, + sectorsSnapUpCmd, sectorsMarkForUpgradeCmd, sectorsStartSealCmd, sectorsSealDelayCmd, sectorsCapacityCollateralCmd, sectorsBatching, + sectorsRefreshPieceMatchingCmd, }, } @@ -1476,6 +1479,44 @@ var sectorsRemoveCmd = &cli.Command{ }, } +var sectorsSnapUpCmd = &cli.Command{ + Name: "snap-up", + Usage: "Mark a committed capacity sector to be filled with deals", + ArgsUsage: "", + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() != 1 { + return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number")) + } + + nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + api, nCloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer nCloser() + ctx := lcli.ReqContext(cctx) + + nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get network version: %w", err) + } + if nv < network.Version15 { + return xerrors.Errorf("snap deals upgrades enabled in network v15") + } + + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) + if err != nil { + return xerrors.Errorf("could not parse sector number: %w", err) + } + + return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), true) + }, +} + var sectorsMarkForUpgradeCmd = &cli.Command{ Name: "mark-for-upgrade", Usage: "Mark a committed capacity sector for replacement by a sector with deals", @@ -1490,14 +1531,28 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ return err } defer closer() + + api, nCloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer nCloser() ctx := lcli.ReqContext(cctx) + nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get network version: %w", err) + } + if nv >= network.Version15 { + return xerrors.Errorf("classic cc upgrades disabled v15 and beyond, use `snap-up`") + } + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) if err != nil { return xerrors.Errorf("could not parse sector number: %w", err) } - return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id)) + return nodeApi.SectorMarkForUpgrade(ctx, abi.SectorNumber(id), false) }, } @@ -2000,6 +2055,25 @@ var sectorsBatchingPendingPreCommit = &cli.Command{ }, } +var sectorsRefreshPieceMatchingCmd = &cli.Command{ + Name: "match-pending-pieces", + Usage: "force a refreshed match of pending pieces to open sectors without manually waiting for more deals", + Action: func(cctx *cli.Context) error { + nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + if err := nodeApi.SectorMatchPendingPiecesToOpenSectors(ctx); err != nil { + return err + } + + return nil + }, +} + func yesno(b bool) string { if b { return color.GreenString("YES") diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index 5aec2f52f..e6d6c0b6f 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -163,6 +163,16 @@ var runCmd = &cli.Command{ Usage: "enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap)", Value: true, }, + &cli.BoolFlag{ + Name: "replica-update", + Usage: "enable replica update", + Value: true, + }, + &cli.BoolFlag{ + Name: "prove-replica-update2", + Usage: "enable prove replica update 2", + Value: true, + }, &cli.IntFlag{ Name: "parallel-fetch-limit", Usage: "maximum fetch operations to run in parallel", @@ -268,6 +278,12 @@ var runCmd = &cli.Command{ if cctx.Bool("commit") { taskTypes = append(taskTypes, sealtasks.TTCommit2) } + if cctx.Bool("replicaupdate") { + taskTypes = append(taskTypes, sealtasks.TTReplicaUpdate) + } + if cctx.Bool("prove-replica-update2") { + taskTypes = append(taskTypes, sealtasks.TTProveReplicaUpdate2) + } if len(taskTypes) == 0 { return xerrors.Errorf("no task types specified") diff --git a/cmd/lotus-sim/simulation/mock/mock.go b/cmd/lotus-sim/simulation/mock/mock.go index 7656aaa28..70f9ba550 100644 --- a/cmd/lotus-sim/simulation/mock/mock.go +++ b/cmd/lotus-sim/simulation/mock/mock.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -78,7 +79,7 @@ func (mockVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, return false, nil } -func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("should not be called") } func (mockVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 013aed641..272734c56 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -119,6 +119,7 @@ * [SectorGetExpectedSealDuration](#SectorGetExpectedSealDuration) * [SectorGetSealDelay](#SectorGetSealDelay) * [SectorMarkForUpgrade](#SectorMarkForUpgrade) + * [SectorMatchPendingPiecesToOpenSectors](#SectorMatchPendingPiecesToOpenSectors) * [SectorPreCommitFlush](#SectorPreCommitFlush) * [SectorPreCommitPending](#SectorPreCommitPending) * [SectorRemove](#SectorRemove) @@ -358,12 +359,15 @@ Inputs: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } } ], - "Bw==" + "Bw==", + 10101, + 15 ] ``` @@ -2474,12 +2478,22 @@ Perms: admin Inputs: ```json [ - 9 + 9, + true ] ``` Response: `{}` +### SectorMatchPendingPiecesToOpenSectors + + +Perms: admin + +Inputs: `null` + +Response: `{}` + ### SectorPreCommitFlush SectorPreCommitFlush immediately sends a PreCommit message with sectors batched for PreCommit. Returns null if message wasn't sent diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 59dfb09f6..8f851e319 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -2579,6 +2579,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 24a142224..8aa2bfdd2 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -2591,6 +2591,7 @@ Response: { "SealProof": 8, "SectorNumber": 9, + "SectorKey": null, "SealedCID": { "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" } diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index d50161957..e609a8a01 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1525,6 +1525,7 @@ COMMANDS: extend Extend sector expiration terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) + snap-up Mark a committed capacity sector to be filled with deals mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals seal Manually start sealing a sector (filling any unused space with junk) set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts @@ -1746,6 +1747,19 @@ OPTIONS: ``` +### lotus-miner sectors snap-up +``` +NAME: + lotus-miner sectors snap-up - Mark a committed capacity sector to be filled with deals + +USAGE: + lotus-miner sectors snap-up [command options] + +OPTIONS: + --help, -h show help (default: false) + +``` + ### lotus-miner sectors mark-for-upgrade ``` NAME: diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index b034698a2..ced8e8a39 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -424,6 +424,15 @@ # env var: LOTUS_STORAGE_ALLOWUNSEAL #AllowUnseal = true + # env var: LOTUS_STORAGE_ALLOWREPLICAUPDATE + #AllowReplicaUpdate = true + + # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE1 + #AllowProveReplicaUpdate1 = true + + # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE2 + #AllowProveReplicaUpdate2 = true + # env var: LOTUS_STORAGE_RESOURCEFILTERING #ResourceFiltering = "hardware" diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index ec8554f34..e3939d3d1 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -714,7 +714,6 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p if err != nil { return empty, xerrors.Errorf("failed to update replica %d with new deal data: %w", sector.ID.Number, err) } - return storage.ReplicaUpdateOut{NewSealed: sealed, NewUnsealed: unsealed}, nil } @@ -854,6 +853,14 @@ func (sb *Sealer) ReleaseUnsealed(ctx context.Context, sector storage.SectorRef, return xerrors.Errorf("not supported at this layer") } +func (sb *Sealer) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + return xerrors.Errorf("not supported at this layer") +} + +func (sb *Sealer) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + return xerrors.Errorf("not supported at this layer") +} + func (sb *Sealer) Remove(ctx context.Context, sector storage.SectorRef) error { return xerrors.Errorf("not supported at this layer") // happens in localworker } diff --git a/extern/sector-storage/ffiwrapper/sealer_test.go b/extern/sector-storage/ffiwrapper/sealer_test.go index 509efe532..cf8978464 100644 --- a/extern/sector-storage/ffiwrapper/sealer_test.go +++ b/extern/sector-storage/ffiwrapper/sealer_test.go @@ -19,6 +19,7 @@ import ( proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" @@ -180,16 +181,16 @@ func (s *seal) unseal(t *testing.T, sb *Sealer, sp *basicfs.Provider, si storage func post(t *testing.T, sealer *Sealer, skipped []abi.SectorID, seals ...seal) { randomness := abi.PoStRandomness{0, 9, 2, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 45, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 7} - sis := make([]proof2.SectorInfo, len(seals)) + xsis := make([]proof7.ExtendedSectorInfo, len(seals)) for i, s := range seals { - sis[i] = proof2.SectorInfo{ + xsis[i] = proof7.ExtendedSectorInfo{ SealProof: s.ref.ProofType, SectorNumber: s.ref.ID.Number, SealedCID: s.cids.Sealed, } } - proofs, skp, err := sealer.GenerateWindowPoSt(context.TODO(), seals[0].ref.ID.Miner, sis, randomness) + proofs, skp, err := sealer.GenerateWindowPoSt(context.TODO(), seals[0].ref.ID.Miner, xsis, randomness) if len(skipped) > 0 { require.Error(t, err) require.EqualValues(t, skipped, skp) @@ -200,7 +201,16 @@ func post(t *testing.T, sealer *Sealer, skipped []abi.SectorID, seals ...seal) { t.Fatalf("%+v", err) } - ok, err := ProofVerifier.VerifyWindowPoSt(context.TODO(), proof2.WindowPoStVerifyInfo{ + sis := make([]proof7.SectorInfo, len(seals)) + for i, xsi := range xsis { + sis[i] = proof7.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } + + ok, err := ProofVerifier.VerifyWindowPoSt(context.TODO(), proof7.WindowPoStVerifyInfo{ Randomness: randomness, Proofs: proofs, ChallengedSectors: sis, diff --git a/extern/sector-storage/ffiwrapper/types.go b/extern/sector-storage/ffiwrapper/types.go index 1da7ea832..78d2c6eca 100644 --- a/extern/sector-storage/ffiwrapper/types.go +++ b/extern/sector-storage/ffiwrapper/types.go @@ -4,13 +4,12 @@ import ( "context" "io" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper/basicfs" @@ -36,11 +35,11 @@ type Storage interface { } type Verifier interface { - VerifySeal(proof5.SealVerifyInfo) (bool, error) - VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) - VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) - VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) - VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) + VerifySeal(proof.SealVerifyInfo) (bool, error) + VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) + VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) + VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, v network.Version) (bool, error) + VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) GenerateWinningPoStSectorChallenge(context.Context, abi.RegisteredPoStProof, abi.ActorID, abi.PoStRandomness, uint64) ([]uint64, error) } @@ -49,7 +48,7 @@ type Verifier interface { type Prover interface { // TODO: move GenerateWinningPoStSectorChallenge from the Verifier interface to here - AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) + AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) } type SectorProvider interface { diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 66064b1f3..be38189f1 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -11,16 +11,17 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" + "github.com/filecoin-project/go-state-types/network" + ffiproof "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" ) -func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS? if err != nil { return nil, err } @@ -32,12 +33,13 @@ func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, return ffi.GenerateWinningPoSt(minerID, privsectors, randomness) } -func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, []abi.SectorID, error) { +func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) { randomness[31] &= 0x3f - privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) + privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof) if err != nil { return nil, nil, xerrors.Errorf("gathering sector info: %w", err) } + defer done() if len(skipped) > 0 { @@ -53,11 +55,10 @@ func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, s Number: f, }) } - return proof, faultyIDs, err } -func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof5.SectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { +func (sb *Sealer) pubExtendedSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) { fmap := map[abi.SectorNumber]struct{}{} for _, fault := range faults { fmap[fault] = struct{}{} @@ -81,14 +82,32 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn ID: abi.SectorID{Miner: mid, Number: s.SectorNumber}, ProofType: s.SealProof, } - - paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) - if err != nil { - log.Warnw("failed to acquire sector, skipping", "sector", sid.ID, "error", err) - skipped = append(skipped, sid.ID) - continue + proveUpdate := s.SectorKey != nil + var cache string + var sealed string + if proveUpdate { + log.Debugf("Posting over updated sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTUpdateCache|storiface.FTUpdate, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTUpdateCache and FTUpdate of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.UpdateCache + sealed = paths.Update + } else { + log.Debugf("Posting over sector key sector for sector id: %d", s.SectorNumber) + paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage) + if err != nil { + log.Warnw("failed to acquire FTCache and FTSealed of sector, skipping", "sector", sid.ID, "error", err) + skipped = append(skipped, sid.ID) + continue + } + doneFuncs = append(doneFuncs, d) + cache = paths.Cache + sealed = paths.Sealed } - doneFuncs = append(doneFuncs, d) postProofType, err := rpt(s.SealProof) if err != nil { @@ -96,11 +115,16 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn return ffi.SortedPrivateSectorInfo{}, nil, nil, xerrors.Errorf("acquiring registered PoSt proof from sector info %+v: %w", s, err) } + ffiInfo := ffiproof.SectorInfo{ + SealProof: s.SealProof, + SectorNumber: s.SectorNumber, + SealedCID: s.SealedCID, + } out = append(out, ffi.PrivateSectorInfo{ - CacheDirPath: paths.Cache, + CacheDirPath: cache, PoStProofType: postProofType, - SealedSectorPath: paths.Sealed, - SectorInfo: s, + SealedSectorPath: sealed, + SectorInfo: ffiInfo, }) } @@ -113,19 +137,19 @@ type proofVerifier struct{} var ProofVerifier = proofVerifier{} -func (proofVerifier) VerifySeal(info proof5.SealVerifyInfo) (bool, error) { +func (proofVerifier) VerifySeal(info proof.SealVerifyInfo) (bool, error) { return ffi.VerifySeal(info) } -func (proofVerifier) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (proofVerifier) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) { return ffi.VerifyAggregateSeals(aggregate) } -func (proofVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { +func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) { return ffi.SectorUpdate.VerifyUpdateProof(update) } -func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, version network.Version) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") defer span.End() @@ -133,7 +157,7 @@ func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof5.WinningP return ffi.VerifyWinningPoSt(info) } -func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWindowPoSt") defer span.End() diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index 748681544..ecabf0398 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -98,11 +98,13 @@ type SealerConfig struct { ParallelFetchLimit int // Local worker config - AllowAddPiece bool - AllowPreCommit1 bool - AllowPreCommit2 bool - AllowCommit bool - AllowUnseal bool + AllowAddPiece bool + AllowPreCommit1 bool + AllowPreCommit2 bool + AllowCommit bool + AllowUnseal bool + AllowReplicaUpdate bool + AllowProveReplicaUpdate2 bool // ResourceFiltering instructs the system which resource filtering strategy // to use when evaluating tasks against this worker. An empty value defaults @@ -144,7 +146,7 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store go m.sched.runSched() localTasks := []sealtasks.TaskType{ - sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTFetch, + sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize, sealtasks.TTFetch, } if sc.AllowAddPiece { localTasks = append(localTasks, sealtasks.TTAddPiece) @@ -161,6 +163,12 @@ func New(ctx context.Context, lstor *stores.Local, stor *stores.Remote, ls store if sc.AllowUnseal { localTasks = append(localTasks, sealtasks.TTUnseal) } + if sc.AllowReplicaUpdate { + localTasks = append(localTasks, sealtasks.TTReplicaUpdate) + } + if sc.AllowProveReplicaUpdate2 { + localTasks = append(localTasks, sealtasks.TTProveReplicaUpdate2) + } wcfg := WorkerConfig{ IgnoreResourceFiltering: sc.ResourceFiltering == ResourceFilteringDisabled, @@ -584,6 +592,23 @@ func (m *Manager) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef return m.storage.Remove(ctx, sector.ID, storiface.FTSealed, true, nil) } +func (m *Manager) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTUpdateCache|storiface.FTUpdate); err != nil { + return xerrors.Errorf("acquiring sector lock: %w", err) + } + + if err := m.storage.Remove(ctx, sector.ID, storiface.FTUpdateCache, true, nil); err != nil { + return xerrors.Errorf("removing update cache: %w", err) + } + if err := m.storage.Remove(ctx, sector.ID, storiface.FTUpdate, true, nil); err != nil { + return xerrors.Errorf("removing update: %w", err) + } + return nil +} + func (m *Manager) GenerateSectorKeyFromData(ctx context.Context, sector storage.SectorRef, commD cid.Cid) error { ctx, cancel := context.WithCancel(ctx) @@ -666,7 +691,7 @@ func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (out storage.ReplicaUpdateOut, err error) { ctx, cancel := context.WithCancel(ctx) defer cancel() - + log.Errorf("manager is doing replica update") wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTReplicaUpdate, sector, pieces) if err != nil { return storage.ReplicaUpdateOut{}, xerrors.Errorf("getWork: %w", err) @@ -677,7 +702,7 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p waitRes := func() { p, werr := m.waitWork(ctx, wk) if werr != nil { - waitErr = werr + waitErr = xerrors.Errorf("waitWork: %w", werr) return } if p != nil { @@ -697,17 +722,17 @@ func (m *Manager) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p selector := newAllocSelector(m.index, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) err = m.sched.Schedule(ctx, sector, sealtasks.TTReplicaUpdate, selector, m.schedFetch(sector, storiface.FTSealed, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { - + log.Errorf("scheduled work for replica update") err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) if err != nil { - return err + return xerrors.Errorf("startWork: %w", err) } waitRes() return nil }) if err != nil { - return storage.ReplicaUpdateOut{}, err + return storage.ReplicaUpdateOut{}, xerrors.Errorf("Schedule: %w", err) } return out, waitErr } diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index ead4ebe26..7ef780087 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -10,14 +10,13 @@ import ( "math/rand" "sync" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - - proof5 "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/dagstore/mount" ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -39,7 +38,7 @@ type SectorMgr struct { } type mockVerifProver struct { - aggregates map[string]proof5.AggregateSealVerifyProofAndInfos // used for logging bad verifies + aggregates map[string]proof.AggregateSealVerifyProofAndInfos // used for logging bad verifies } func NewMockSectorMgr(genesisSectors []abi.SectorID) *SectorMgr { @@ -336,14 +335,23 @@ func AddOpFinish(ctx context.Context) (context.Context, func()) { } } -func (mgr *SectorMgr) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, error) { +func (mgr *SectorMgr) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, xSectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { mgr.lk.Lock() defer mgr.lk.Unlock() + sectorInfo := make([]proof.SectorInfo, len(xSectorInfo)) + for i, xssi := range xSectorInfo { + sectorInfo[i] = proof.SectorInfo{ + SealProof: xssi.SealProof, + SectorNumber: xssi.SectorNumber, + SealedCID: xssi.SealedCID, + } + } + return generateFakePoSt(sectorInfo, abi.RegisteredSealProof.RegisteredWinningPoStProof, randomness), nil } -func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) ([]proof5.PoStProof, []abi.SectorID, error) { +func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, xSectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) { mgr.lk.Lock() defer mgr.lk.Unlock() @@ -351,22 +359,22 @@ func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorI return nil, nil, xerrors.Errorf("failed to post (mock)") } - si := make([]proof5.SectorInfo, 0, len(sectorInfo)) + si := make([]proof.ExtendedSectorInfo, 0, len(xSectorInfo)) var skipped []abi.SectorID var err error - for _, info := range sectorInfo { + for _, xsi := range xSectorInfo { sid := abi.SectorID{ Miner: minerID, - Number: info.SectorNumber, + Number: xsi.SectorNumber, } _, found := mgr.sectors[sid] if found && !mgr.sectors[sid].failed && !mgr.sectors[sid].corrupted { - si = append(si, info) + si = append(si, xsi) } else { skipped = append(skipped, sid) err = xerrors.Errorf("skipped some sectors") @@ -377,10 +385,19 @@ func (mgr *SectorMgr) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorI return nil, skipped, err } - return generateFakePoSt(si, abi.RegisteredSealProof.RegisteredWindowPoStProof, randomness), skipped, nil + sectorInfo := make([]proof.SectorInfo, len(si)) + for i, xssi := range si { + sectorInfo[i] = proof.SectorInfo{ + SealProof: xssi.SealProof, + SectorNumber: xssi.SectorNumber, + SealedCID: xssi.SealedCID, + } + } + + return generateFakePoSt(sectorInfo, abi.RegisteredSealProof.RegisteredWindowPoStProof, randomness), skipped, nil } -func generateFakePoStProof(sectorInfo []proof5.SectorInfo, randomness abi.PoStRandomness) []byte { +func generateFakePoStProof(sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) []byte { randomness[31] &= 0x3f hasher := sha256.New() @@ -395,13 +412,13 @@ func generateFakePoStProof(sectorInfo []proof5.SectorInfo, randomness abi.PoStRa } -func generateFakePoSt(sectorInfo []proof5.SectorInfo, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error), randomness abi.PoStRandomness) []proof5.PoStProof { +func generateFakePoSt(sectorInfo []proof.SectorInfo, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error), randomness abi.PoStRandomness) []proof.PoStProof { wp, err := rpt(sectorInfo[0].SealProof) if err != nil { panic(err) } - return []proof5.PoStProof{ + return []proof.PoStProof{ { PoStProof: wp, ProofBytes: generateFakePoStProof(sectorInfo, randomness), @@ -465,6 +482,14 @@ func (mgr *SectorMgr) ReleaseUnsealed(ctx context.Context, sector storage.Sector return nil } +func (mgr *SectorMgr) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + return nil +} + +func (mgr *SectorMgr) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + return nil +} + func (mgr *SectorMgr) Remove(ctx context.Context, sector storage.SectorRef) error { mgr.lk.Lock() defer mgr.lk.Unlock() @@ -553,7 +578,7 @@ func (mgr *SectorMgr) ReturnGenerateSectorKeyFromData(ctx context.Context, callI panic("not supported") } -func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifySeal(svi proof.SealVerifyInfo) (bool, error) { plen, err := svi.SealProof.ProofSize() if err != nil { return false, err @@ -574,7 +599,7 @@ func (m mockVerifProver) VerifySeal(svi proof5.SealVerifyInfo) (bool, error) { return true, nil } -func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVerifyProofAndInfos) (bool, error) { +func (m mockVerifProver) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) { out := make([]byte, m.aggLen(len(aggregate.Infos))) for pi, svi := range aggregate.Infos { for i := 0; i < 32; i++ { @@ -600,11 +625,11 @@ func (m mockVerifProver) VerifyAggregateSeals(aggregate proof5.AggregateSealVeri return ok, nil } -func (m mockVerifProver) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, error) { +func (m mockVerifProver) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) { return true, nil } -func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof5.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { +func (m mockVerifProver) AggregateSealProofs(aggregateInfo proof.AggregateSealVerifyProofAndInfos, proofs [][]byte) ([]byte, error) { out := make([]byte, m.aggLen(len(aggregateInfo.Infos))) // todo: figure out more real length for pi, proof := range proofs { for i := range proof[:32] { @@ -646,12 +671,12 @@ func (m mockVerifProver) aggLen(nproofs int) int { } } -func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof5.WinningPoStVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { info.Randomness[31] &= 0x3f return true, nil } -func (m mockVerifProver) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { +func (m mockVerifProver) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) { if len(info.Proofs) != 1 { return false, xerrors.Errorf("expected 1 proof entry") } @@ -674,7 +699,7 @@ func (m mockVerifProver) GenerateWinningPoStSectorChallenge(ctx context.Context, } var MockVerifier = mockVerifProver{ - aggregates: map[string]proof5.AggregateSealVerifyProofAndInfos{}, + aggregates: map[string]proof.AggregateSealVerifyProofAndInfos{}, } var MockProver = MockVerifier diff --git a/extern/sector-storage/teststorage_test.go b/extern/sector-storage/teststorage_test.go index 9fdb3a913..cb15184be 100644 --- a/extern/sector-storage/teststorage_test.go +++ b/extern/sector-storage/teststorage_test.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/specs-actors/actors/runtime/proof" + "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" @@ -23,11 +23,11 @@ type testExec struct { apch chan chan apres } -func (t *testExec) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { +func (t *testExec) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) { panic("implement me") } -func (t *testExec) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.SectorInfo, randomness abi.PoStRandomness) (proof []proof.PoStProof, skipped []abi.SectorID, err error) { +func (t *testExec) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) (proof []proof.PoStProof, skipped []abi.SectorID, err error) { panic("implement me") } @@ -59,6 +59,14 @@ func (t *testExec) ReleaseSealed(ctx context.Context, sector storage.SectorRef) panic("implement me") } +func (t *testExec) ReleaseSectorKey(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + +func (t *testExec) ReleaseReplicaUpgrade(ctx context.Context, sector storage.SectorRef) error { + panic("implement me") +} + func (t *testExec) Remove(ctx context.Context, sector storage.SectorRef) error { panic("implement me") } diff --git a/extern/storage-sealing/cbor_gen.go b/extern/storage-sealing/cbor_gen.go index 1dfaf54a5..c1e2b08fa 100644 --- a/extern/storage-sealing/cbor_gen.go +++ b/extern/storage-sealing/cbor_gen.go @@ -143,7 +143,7 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { _, err := w.Write(cbg.CborNull) return err } - if _, err := w.Write([]byte{184, 26}); err != nil { + if _, err := w.Write([]byte{184, 32}); err != nil { return err } @@ -573,6 +573,137 @@ func (t *SectorInfo) MarshalCBOR(w io.Writer) error { return err } + // t.CCUpdate (bool) (bool) + if len("CCUpdate") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCUpdate\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("CCUpdate"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("CCUpdate")); err != nil { + return err + } + + if err := cbg.WriteBool(w, t.CCUpdate); err != nil { + return err + } + + // t.CCPieces ([]sealing.Piece) (slice) + if len("CCPieces") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"CCPieces\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("CCPieces"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("CCPieces")); err != nil { + return err + } + + if len(t.CCPieces) > cbg.MaxLength { + return xerrors.Errorf("Slice value in field t.CCPieces was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajArray, uint64(len(t.CCPieces))); err != nil { + return err + } + for _, v := range t.CCPieces { + if err := v.MarshalCBOR(w); err != nil { + return err + } + } + + // t.UpdateSealed (cid.Cid) (struct) + if len("UpdateSealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"UpdateSealed\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("UpdateSealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("UpdateSealed")); err != nil { + return err + } + + if t.UpdateSealed == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.UpdateSealed); err != nil { + return xerrors.Errorf("failed to write cid field t.UpdateSealed: %w", err) + } + } + + // t.UpdateUnsealed (cid.Cid) (struct) + if len("UpdateUnsealed") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"UpdateUnsealed\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("UpdateUnsealed"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("UpdateUnsealed")); err != nil { + return err + } + + if t.UpdateUnsealed == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.UpdateUnsealed); err != nil { + return xerrors.Errorf("failed to write cid field t.UpdateUnsealed: %w", err) + } + } + + // t.ReplicaUpdateProof (storage.ReplicaUpdateProof) (slice) + if len("ReplicaUpdateProof") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ReplicaUpdateProof\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("ReplicaUpdateProof"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("ReplicaUpdateProof")); err != nil { + return err + } + + if len(t.ReplicaUpdateProof) > cbg.ByteArrayMaxLen { + return xerrors.Errorf("Byte array in field t.ReplicaUpdateProof was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.ReplicaUpdateProof))); err != nil { + return err + } + + if _, err := w.Write(t.ReplicaUpdateProof[:]); err != nil { + return err + } + + // t.ReplicaUpdateMessage (cid.Cid) (struct) + if len("ReplicaUpdateMessage") > cbg.MaxLength { + return xerrors.Errorf("Value in field \"ReplicaUpdateMessage\" was too long") + } + + if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajTextString, uint64(len("ReplicaUpdateMessage"))); err != nil { + return err + } + if _, err := io.WriteString(w, string("ReplicaUpdateMessage")); err != nil { + return err + } + + if t.ReplicaUpdateMessage == nil { + if _, err := w.Write(cbg.CborNull); err != nil { + return err + } + } else { + if err := cbg.WriteCidBuf(scratch, w, *t.ReplicaUpdateMessage); err != nil { + return xerrors.Errorf("failed to write cid field t.ReplicaUpdateMessage: %w", err) + } + } + // t.FaultReportMsg (cid.Cid) (struct) if len("FaultReportMsg") > cbg.MaxLength { return xerrors.Errorf("Value in field \"FaultReportMsg\" was too long") @@ -1166,6 +1297,145 @@ func (t *SectorInfo) UnmarshalCBOR(r io.Reader) error { } t.InvalidProofs = uint64(extra) + } + // t.CCUpdate (bool) (bool) + case "CCUpdate": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + if maj != cbg.MajOther { + return fmt.Errorf("booleans must be major type 7") + } + switch extra { + case 20: + t.CCUpdate = false + case 21: + t.CCUpdate = true + default: + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) + } + // t.CCPieces ([]sealing.Piece) (slice) + case "CCPieces": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.MaxLength { + return fmt.Errorf("t.CCPieces: array too large (%d)", extra) + } + + if maj != cbg.MajArray { + return fmt.Errorf("expected cbor array") + } + + if extra > 0 { + t.CCPieces = make([]Piece, extra) + } + + for i := 0; i < int(extra); i++ { + + var v Piece + if err := v.UnmarshalCBOR(br); err != nil { + return err + } + + t.CCPieces[i] = v + } + + // t.UpdateSealed (cid.Cid) (struct) + case "UpdateSealed": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.UpdateSealed: %w", err) + } + + t.UpdateSealed = &c + } + + } + // t.UpdateUnsealed (cid.Cid) (struct) + case "UpdateUnsealed": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.UpdateUnsealed: %w", err) + } + + t.UpdateUnsealed = &c + } + + } + // t.ReplicaUpdateProof (storage.ReplicaUpdateProof) (slice) + case "ReplicaUpdateProof": + + maj, extra, err = cbg.CborReadHeaderBuf(br, scratch) + if err != nil { + return err + } + + if extra > cbg.ByteArrayMaxLen { + return fmt.Errorf("t.ReplicaUpdateProof: byte array too large (%d)", extra) + } + if maj != cbg.MajByteString { + return fmt.Errorf("expected byte array") + } + + if extra > 0 { + t.ReplicaUpdateProof = make([]uint8, extra) + } + + if _, err := io.ReadFull(br, t.ReplicaUpdateProof[:]); err != nil { + return err + } + // t.ReplicaUpdateMessage (cid.Cid) (struct) + case "ReplicaUpdateMessage": + + { + + b, err := br.ReadByte() + if err != nil { + return err + } + if b != cbg.CborNull[0] { + if err := br.UnreadByte(); err != nil { + return err + } + + c, err := cbg.ReadCid(br) + if err != nil { + return xerrors.Errorf("failed to read cid field t.ReplicaUpdateMessage: %w", err) + } + + t.ReplicaUpdateMessage = &c + } + } // t.FaultReportMsg (cid.Cid) (struct) case "FaultReportMsg": diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 74a791fcb..42425e782 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -35,6 +35,9 @@ type ErrInvalidProof struct{ error } type ErrNoPrecommit struct{ error } type ErrCommitWaitFailed struct{ error } +type ErrBadRU struct{ error } +type ErrBadPR struct{ error } + func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api SealingAPI) error { tok, height, err := api.ChainHead(ctx) if err != nil { @@ -187,3 +190,32 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte, return nil } + +// check that sector info is good after running a replica update +func checkReplicaUpdate(ctx context.Context, maddr address.Address, si SectorInfo, tok TipSetToken, api SealingAPI) error { + + if err := checkPieces(ctx, maddr, si, api); err != nil { + return err + } + if !si.CCUpdate { + return xerrors.Errorf("replica update on sector not marked for update") + } + + commD, err := api.StateComputeDataCommitment(ctx, maddr, si.SectorType, si.dealIDs(), tok) + if err != nil { + return &ErrApi{xerrors.Errorf("calling StateComputeDataCommitment: %w", err)} + } + if si.UpdateUnsealed == nil || !commD.Equals(*si.UpdateUnsealed) { + return &ErrBadRU{xerrors.Errorf("on chain CommD differs from sector: %s != %s", commD, si.CommD)} + } + + if si.UpdateSealed == nil { + return &ErrBadRU{xerrors.Errorf("nil sealed cid")} + } + if si.ReplicaUpdateProof == nil { + return ErrBadPR{xerrors.Errorf("nil PR2 proof")} + } + + return nil + +} diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 10bec7e0b..83874e907 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -133,6 +133,44 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto on(SectorFinalizeFailed{}, FinalizeFailed), ), + // Snap deals + SnapDealsWaitDeals: planOne( + on(SectorAddPiece{}, SnapDealsAddPiece), + on(SectorStartPacking{}, SnapDealsPacking), + ), + SnapDealsAddPiece: planOne( + on(SectorPieceAdded{}, SnapDealsWaitDeals), + apply(SectorStartPacking{}), + apply(SectorAddPiece{}), + on(SectorAddPieceFailed{}, SnapDealsAddPieceFailed), + ), + SnapDealsPacking: planOne( + on(SectorPacked{}, UpdateReplica), + ), + UpdateReplica: planOne( + on(SectorReplicaUpdate{}, ProveReplicaUpdate), + on(SectorUpdateReplicaFailed{}, ReplicaUpdateFailed), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + ), + ProveReplicaUpdate: planOne( + on(SectorProveReplicaUpdate{}, SubmitReplicaUpdate), + on(SectorProveReplicaUpdateFailed{}, ReplicaUpdateFailed), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + ), + SubmitReplicaUpdate: planOne( + on(SectorReplicaUpdateSubmitted{}, ReplicaUpdateWait), + on(SectorSubmitReplicaUpdateFailed{}, ReplicaUpdateFailed), + ), + ReplicaUpdateWait: planOne( + on(SectorReplicaUpdateLanded{}, FinalizeReplicaUpdate), + on(SectorSubmitReplicaUpdateFailed{}, ReplicaUpdateFailed), + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + FinalizeReplicaUpdate: planOne( + on(SectorFinalized{}, Proving), + ), // Sealing errors AddPieceFailed: planOne( @@ -188,11 +226,37 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto onReturning(SectorUpdateDealIDs{}), ), + // Snap Deals Errors + SnapDealsAddPieceFailed: planOne( + on(SectorRetryWaitDeals{}, SnapDealsWaitDeals), + apply(SectorStartPacking{}), + apply(SectorAddPiece{}), + ), + SnapDealsDealsExpired: planOne( + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + SnapDealsRecoverDealIDs: planOne( + on(SectorUpdateDealIDs{}, SubmitReplicaUpdate), + on(SectorAbortUpgrade{}, AbortUpgrade), + ), + AbortUpgrade: planOneOrIgnore( + on(SectorRevertUpgradeToProving{}, Proving), + ), + ReplicaUpdateFailed: planOne( + on(SectorRetrySubmitReplicaUpdateWait{}, ReplicaUpdateWait), + on(SectorRetrySubmitReplicaUpdate{}, SubmitReplicaUpdate), + on(SectorRetryReplicaUpdate{}, UpdateReplica), + on(SectorRetryProveReplicaUpdate{}, ProveReplicaUpdate), + on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs), + on(SectorDealsExpired{}, SnapDealsDealsExpired), + ), + // Post-seal Proving: planOne( on(SectorFaultReported{}, FaultReported), on(SectorFaulty{}, Faulty), + on(SectorStartCCUpdate{}, SnapDealsWaitDeals), ), Terminating: planOne( on(SectorTerminating{}, TerminateWait), @@ -209,7 +273,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto TerminateFailed: planOne( // SectorTerminating (global) ), - Removing: planOne( + Removing: planOneOrIgnore( on(SectorRemoved{}, Removed), on(SectorRemoveFailed{}, RemoveFailed), ), @@ -355,13 +419,6 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta log.Errorw("update sector stats", "error", err) } - // todo: drop this, use Context iface everywhere - wrapCtx := func(f func(Context, SectorInfo) error) func(statemachine.Context, SectorInfo) error { - return func(ctx statemachine.Context, info SectorInfo) error { - return f(&ctx, info) - } - } - switch state.State { // Happy path case Empty: @@ -403,6 +460,24 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta case FinalizeSector: return m.handleFinalizeSector, processed, nil + // Snap deals updates + case SnapDealsWaitDeals: + return m.handleWaitDeals, processed, nil + case SnapDealsAddPiece: + return m.handleAddPiece, processed, nil + case SnapDealsPacking: + return m.handlePacking, processed, nil + case UpdateReplica: + return m.handleReplicaUpdate, processed, nil + case ProveReplicaUpdate: + return m.handleProveReplicaUpdate, processed, nil + case SubmitReplicaUpdate: + return m.handleSubmitReplicaUpdate, processed, nil + case ReplicaUpdateWait: + return m.handleReplicaUpdateWait, processed, nil + case FinalizeReplicaUpdate: + return m.handleFinalizeReplicaUpdate, processed, nil + // Handled failure modes case AddPieceFailed: return m.handleAddPieceFailed, processed, nil @@ -426,7 +501,20 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta case DealsExpired: return m.handleDealsExpired, processed, nil case RecoverDealIDs: - return wrapCtx(m.HandleRecoverDealIDs), processed, nil + return m.HandleRecoverDealIDs, processed, nil + + // Snap Deals failure modes + case SnapDealsAddPieceFailed: + return m.handleAddPieceFailed, processed, nil + + case SnapDealsDealsExpired: + return m.handleDealsExpiredSnapDeals, processed, nil + case SnapDealsRecoverDealIDs: + return m.handleSnapDealsRecoverDealIDs, processed, nil + case ReplicaUpdateFailed: + return m.handleSubmitReplicaUpdateFailed, processed, nil + case AbortUpgrade: + return m.handleAbortUpgrade, processed, nil // Post-seal case Proving: @@ -642,3 +730,16 @@ func planOne(ts ...func() (mut mutator, next func(*SectorInfo) (more bool, err e return uint64(len(events)), nil } } + +// planOne but ignores unhandled states without erroring, this prevents the need to handle all possible events creating +// error during forced override +func planOneOrIgnore(ts ...func() (mut mutator, next func(*SectorInfo) (more bool, err error))) func(events []statemachine.Event, state *SectorInfo) (uint64, error) { + f := planOne(ts...) + return func(events []statemachine.Event, state *SectorInfo) (uint64, error) { + cnt, err := f(events, state) + if err != nil { + log.Warnf("planOneOrIgnore: ignoring error from planOne: %s", err) + } + return cnt, nil + } +} diff --git a/extern/storage-sealing/fsm_events.go b/extern/storage-sealing/fsm_events.go index 650a81799..395c4b94a 100644 --- a/extern/storage-sealing/fsm_events.go +++ b/extern/storage-sealing/fsm_events.go @@ -295,6 +295,46 @@ type SectorFinalizeFailed struct{ error } func (evt SectorFinalizeFailed) FormatError(xerrors.Printer) (next error) { return evt.error } func (evt SectorFinalizeFailed) apply(*SectorInfo) {} +// Snap deals // CC update path + +type SectorStartCCUpdate struct{} + +func (evt SectorStartCCUpdate) apply(state *SectorInfo) { + state.CCUpdate = true + // Clear filler piece but remember in case of abort + state.CCPieces = state.Pieces + state.Pieces = nil +} + +type SectorReplicaUpdate struct { + Out storage.ReplicaUpdateOut +} + +func (evt SectorReplicaUpdate) apply(state *SectorInfo) { + state.UpdateSealed = &evt.Out.NewSealed + state.UpdateUnsealed = &evt.Out.NewUnsealed +} + +type SectorProveReplicaUpdate struct { + Proof storage.ReplicaUpdateProof +} + +func (evt SectorProveReplicaUpdate) apply(state *SectorInfo) { + state.ReplicaUpdateProof = evt.Proof +} + +type SectorReplicaUpdateSubmitted struct { + Message cid.Cid +} + +func (evt SectorReplicaUpdateSubmitted) apply(state *SectorInfo) { + state.ReplicaUpdateMessage = &evt.Message +} + +type SectorReplicaUpdateLanded struct{} + +func (evt SectorReplicaUpdateLanded) apply(state *SectorInfo) {} + // Failed state recovery type SectorRetrySealPreCommit1 struct{} @@ -351,6 +391,60 @@ func (evt SectorUpdateDealIDs) apply(state *SectorInfo) { } } +// Snap Deals failure and recovery + +type SectorRetryReplicaUpdate struct{} + +func (evt SectorRetryReplicaUpdate) apply(state *SectorInfo) {} + +type SectorRetryProveReplicaUpdate struct{} + +func (evt SectorRetryProveReplicaUpdate) apply(state *SectorInfo) {} + +type SectorUpdateReplicaFailed struct{ error } + +func (evt SectorUpdateReplicaFailed) FormatError(xerrors.Printer) (next error) { return evt.error } +func (evt SectorUpdateReplicaFailed) apply(state *SectorInfo) {} + +type SectorProveReplicaUpdateFailed struct{ error } + +func (evt SectorProveReplicaUpdateFailed) FormatError(xerrors.Printer) (next error) { + return evt.error +} +func (evt SectorProveReplicaUpdateFailed) apply(state *SectorInfo) {} + +type SectorAbortUpgrade struct{ error } + +func (evt SectorAbortUpgrade) apply(state *SectorInfo) {} +func (evt SectorAbortUpgrade) FormatError(xerrors.Printer) (next error) { + return evt.error +} + +type SectorRevertUpgradeToProving struct{} + +func (evt SectorRevertUpgradeToProving) apply(state *SectorInfo) { + // cleanup sector state so that it is back in proving + state.CCUpdate = false + state.UpdateSealed = nil + state.UpdateUnsealed = nil + state.ReplicaUpdateProof = nil + state.ReplicaUpdateMessage = nil + state.Pieces = state.CCPieces + state.CCPieces = nil +} + +type SectorRetrySubmitReplicaUpdateWait struct{} + +func (evt SectorRetrySubmitReplicaUpdateWait) apply(state *SectorInfo) {} + +type SectorRetrySubmitReplicaUpdate struct{} + +func (evt SectorRetrySubmitReplicaUpdate) apply(state *SectorInfo) {} + +type SectorSubmitReplicaUpdateFailed struct{} + +func (evt SectorSubmitReplicaUpdateFailed) apply(state *SectorInfo) {} + // Faults type SectorFaulty struct{} diff --git a/extern/storage-sealing/input.go b/extern/storage-sealing/input.go index 60c3a79e2..f3259f0cc 100644 --- a/extern/storage-sealing/input.go +++ b/extern/storage-sealing/input.go @@ -59,6 +59,8 @@ func (m *Sealing) handleWaitDeals(ctx statemachine.Context, sector SectorInfo) e return ctx.Send(SectorAddPiece{}) }, + number: sector.SectorNumber, + ccUpdate: sector.CCUpdate, } } else { // make sure we're only accounting for pieces which were correctly added @@ -329,6 +331,17 @@ func (m *Sealing) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPiec return api.SectorOffset{Sector: res.sn, Offset: res.offset.Padded()}, res.err } +func (m *Sealing) MatchPendingPiecesToOpenSectors(ctx context.Context) error { + sp, err := m.currentSealProof(ctx) + if err != nil { + return xerrors.Errorf("failed to get current seal proof: %w", err) + } + log.Debug("pieces to sector matching waiting for lock") + m.inputLk.Lock() + defer m.inputLk.Unlock() + return m.updateInput(ctx, sp) +} + // called with m.inputLk func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) error { ssize, err := sp.SectorSize() @@ -356,8 +369,33 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e toAssign[proposalCid] = struct{}{} + memo := make(map[abi.SectorNumber]abi.ChainEpoch) + expF := func(sn abi.SectorNumber) (abi.ChainEpoch, error) { + if exp, ok := memo[sn]; ok { + return exp, nil + } + onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, sn, TipSetToken{}) + if err != nil { + return 0, err + } + memo[sn] = onChainInfo.Expiration + return onChainInfo.Expiration, nil + } + for id, sector := range m.openSectors { avail := abi.PaddedPieceSize(ssize).Unpadded() - sector.used + // check that sector lifetime is long enough to fit deal using latest expiration from on chain + + ok, err := sector.dealFitsInLifetime(piece.deal.DealProposal.EndEpoch, expF) + if err != nil { + log.Errorf("failed to check expiration for cc Update sector %d", sector.number) + continue + } + if !ok { + exp, _ := expF(sector.number) + log.Infof("CC update sector %d cannot fit deal, expiration %d before deal end epoch %d", id, exp, piece.deal.DealProposal.EndEpoch) + continue + } if piece.size <= avail { // (note: if we have enough space for the piece, we also have enough space for inter-piece padding) matches = append(matches, match{ @@ -416,6 +454,7 @@ func (m *Sealing) updateInput(ctx context.Context, sp abi.RegisteredSealProof) e } if len(toAssign) > 0 { + log.Errorf("we are trying to create a new sector with open sectors %v", m.openSectors) if err := m.tryCreateDealSector(ctx, sp); err != nil { log.Errorw("Failed to create a new sector for deals", "error", err) } diff --git a/extern/storage-sealing/mocks/api.go b/extern/storage-sealing/mocks/api.go index cc8561dc7..95c222ecd 100644 --- a/extern/storage-sealing/mocks/api.go +++ b/extern/storage-sealing/mocks/api.go @@ -213,6 +213,21 @@ func (mr *MockSealingAPIMockRecorder) StateMarketStorageDealProposal(arg0, arg1, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketStorageDealProposal", reflect.TypeOf((*MockSealingAPI)(nil).StateMarketStorageDealProposal), arg0, arg1, arg2) } +// StateMinerActiveSectors mocks base method. +func (m *MockSealingAPI) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) + ret0, _ := ret[0].([]*miner.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerActiveSectors indicates an expected call of StateMinerActiveSectors. +func (mr *MockSealingAPIMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockSealingAPI)(nil).StateMinerActiveSectors), arg0, arg1, arg2) +} + // StateMinerAvailableBalance mocks base method. func (m *MockSealingAPI) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 sealing.TipSetToken) (big.Int, error) { m.ctrl.T.Helper() diff --git a/extern/storage-sealing/sealing.go b/extern/storage-sealing/sealing.go index 583bed052..81f6b38e9 100644 --- a/extern/storage-sealing/sealing.go +++ b/extern/storage-sealing/sealing.go @@ -63,6 +63,7 @@ type SealingAPI interface { StateMinerInfo(context.Context, address.Address, TipSetToken) (miner.MinerInfo, error) StateMinerAvailableBalance(context.Context, address.Address, TipSetToken) (big.Int, error) StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, TipSetToken) (bool, error) + StateMinerActiveSectors(context.Context, address.Address, TipSetToken) ([]*miner.SectorOnChainInfo, error) StateMarketStorageDeal(context.Context, abi.DealID, TipSetToken) (*api.MarketDeal, error) StateMarketStorageDealProposal(context.Context, abi.DealID, TipSetToken) (market.DealProposal, error) StateNetworkVersion(ctx context.Context, tok TipSetToken) (network.Version, error) @@ -121,11 +122,24 @@ type Sealing struct { } type openSector struct { - used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors + used abi.UnpaddedPieceSize // change to bitfield/rle when AddPiece gains offset support to better fill sectors + number abi.SectorNumber + ccUpdate bool maybeAccept func(cid.Cid) error // called with inputLk } +func (o *openSector) dealFitsInLifetime(dealEnd abi.ChainEpoch, expF func(sn abi.SectorNumber) (abi.ChainEpoch, error)) (bool, error) { + if !o.ccUpdate { + return true, nil + } + expiration, err := expF(o.number) + if err != nil { + return false, err + } + return expiration >= dealEnd, nil +} + type pendingPiece struct { size abi.UnpaddedPieceSize deal api.PieceDealInfo diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index b606de5ae..ba6df7ff4 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -3,50 +3,65 @@ package sealing type SectorState string var ExistSectorStateList = map[SectorState]struct{}{ - Empty: {}, - WaitDeals: {}, - Packing: {}, - AddPiece: {}, - AddPieceFailed: {}, - GetTicket: {}, - PreCommit1: {}, - PreCommit2: {}, - PreCommitting: {}, - PreCommitWait: {}, - SubmitPreCommitBatch: {}, - PreCommitBatchWait: {}, - WaitSeed: {}, - Committing: {}, - CommitFinalize: {}, - CommitFinalizeFailed: {}, - SubmitCommit: {}, - CommitWait: {}, - SubmitCommitAggregate: {}, - CommitAggregateWait: {}, - FinalizeSector: {}, - Proving: {}, - FailedUnrecoverable: {}, - SealPreCommit1Failed: {}, - SealPreCommit2Failed: {}, - PreCommitFailed: {}, - ComputeProofFailed: {}, - CommitFailed: {}, - PackingFailed: {}, - FinalizeFailed: {}, - DealsExpired: {}, - RecoverDealIDs: {}, - Faulty: {}, - FaultReported: {}, - FaultedFinal: {}, - Terminating: {}, - TerminateWait: {}, - TerminateFinality: {}, - TerminateFailed: {}, - Removing: {}, - RemoveFailed: {}, - Removed: {}, + Empty: {}, + WaitDeals: {}, + Packing: {}, + AddPiece: {}, + AddPieceFailed: {}, + GetTicket: {}, + PreCommit1: {}, + PreCommit2: {}, + PreCommitting: {}, + PreCommitWait: {}, + SubmitPreCommitBatch: {}, + PreCommitBatchWait: {}, + WaitSeed: {}, + Committing: {}, + CommitFinalize: {}, + CommitFinalizeFailed: {}, + SubmitCommit: {}, + CommitWait: {}, + SubmitCommitAggregate: {}, + CommitAggregateWait: {}, + FinalizeSector: {}, + Proving: {}, + FailedUnrecoverable: {}, + SealPreCommit1Failed: {}, + SealPreCommit2Failed: {}, + PreCommitFailed: {}, + ComputeProofFailed: {}, + CommitFailed: {}, + PackingFailed: {}, + FinalizeFailed: {}, + DealsExpired: {}, + RecoverDealIDs: {}, + Faulty: {}, + FaultReported: {}, + FaultedFinal: {}, + Terminating: {}, + TerminateWait: {}, + TerminateFinality: {}, + TerminateFailed: {}, + Removing: {}, + RemoveFailed: {}, + Removed: {}, + SnapDealsWaitDeals: {}, + SnapDealsAddPiece: {}, + SnapDealsPacking: {}, + UpdateReplica: {}, + ProveReplicaUpdate: {}, + SubmitReplicaUpdate: {}, + ReplicaUpdateWait: {}, + FinalizeReplicaUpdate: {}, + SnapDealsAddPieceFailed: {}, + SnapDealsDealsExpired: {}, + SnapDealsRecoverDealIDs: {}, + ReplicaUpdateFailed: {}, + AbortUpgrade: {}, } +// cmd/lotus-miner/info.go defines CLI colors corresponding to these states +// update files there when adding new states const ( UndefinedSectorState SectorState = "" @@ -79,6 +94,17 @@ const ( FinalizeSector SectorState = "FinalizeSector" Proving SectorState = "Proving" + + // snap deals / cc update + SnapDealsWaitDeals SectorState = "SnapDealsWaitDeals" + SnapDealsAddPiece SectorState = "SnapDealsAddPiece" + SnapDealsPacking SectorState = "SnapDealsPacking" + UpdateReplica SectorState = "UpdateReplica" + ProveReplicaUpdate SectorState = "ProveReplicaUpdate" + SubmitReplicaUpdate SectorState = "SubmitReplicaUpdate" + ReplicaUpdateWait SectorState = "ReplicaUpdateWait" + FinalizeReplicaUpdate SectorState = "FinalizeReplicaUpdate" + // error modes FailedUnrecoverable SectorState = "FailedUnrecoverable" AddPieceFailed SectorState = "AddPieceFailed" @@ -92,6 +118,13 @@ const ( DealsExpired SectorState = "DealsExpired" RecoverDealIDs SectorState = "RecoverDealIDs" + // snap deals error modes + SnapDealsAddPieceFailed SectorState = "SnapDealsAddPieceFailed" + SnapDealsDealsExpired SectorState = "SnapDealsDealsExpired" + SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" + AbortUpgrade SectorState = "AbortUpgrade" + ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" + Faulty SectorState = "Faulty" // sector is corrupted or gone for some reason FaultReported SectorState = "FaultReported" // sector has been declared as a fault on chain FaultedFinal SectorState = "FaultedFinal" // fault declared on chain @@ -108,11 +141,11 @@ const ( func toStatState(st SectorState, finEarly bool) statSectorState { switch st { - case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed: + case UndefinedSectorState, Empty, WaitDeals, AddPiece, AddPieceFailed, SnapDealsWaitDeals, SnapDealsAddPiece: return sstStaging - case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector: + case Packing, GetTicket, PreCommit1, PreCommit2, PreCommitting, PreCommitWait, SubmitPreCommitBatch, PreCommitBatchWait, WaitSeed, Committing, CommitFinalize, FinalizeSector, SnapDealsPacking, UpdateReplica, ProveReplicaUpdate, FinalizeReplicaUpdate: return sstSealing - case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait: + case SubmitCommit, CommitWait, SubmitCommitAggregate, CommitAggregateWait, SubmitReplicaUpdate, ReplicaUpdateWait: if finEarly { // we use statSectorState for throttling storage use. With FinalizeEarly // we can consider sectors in states after CommitFinalize as finalized, so diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index 0c88cc384..a93cda3f5 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -1,11 +1,13 @@ package sealing import ( + "context" "time" "github.com/hashicorp/go-multierror" "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -181,6 +183,67 @@ func (m *Sealing) handleComputeProofFailed(ctx statemachine.Context, sector Sect return ctx.Send(SectorRetryComputeProof{}) } +func (m *Sealing) handleSubmitReplicaUpdateFailed(ctx statemachine.Context, sector SectorInfo) error { + if sector.ReplicaUpdateMessage != nil { + mw, err := m.Api.StateSearchMsg(ctx.Context(), *sector.ReplicaUpdateMessage) + if err != nil { + // API error + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + } + + if mw == nil { + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + } + + switch mw.Receipt.ExitCode { + case exitcode.Ok: + return ctx.Send(SectorRetrySubmitReplicaUpdateWait{}) + case exitcode.SysErrOutOfGas: + return ctx.Send(SectorRetrySubmitReplicaUpdate{}) + default: + // something else went wrong + } + } + + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + log.Errorf("handleCommitting: api error, not proceeding: %+v", err) + return nil + } + + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { + switch err.(type) { + case *ErrApi: + log.Errorf("handleSubmitReplicaUpdateFailed: api error, not proceeding: %+v", err) + return nil + case *ErrBadRU: + log.Errorf("bad replica update: %+v", err) + return ctx.Send(SectorRetryReplicaUpdate{}) + case *ErrBadPR: + log.Errorf("bad PR1: +%v", err) + return ctx.Send(SectorRetryProveReplicaUpdate{}) + + case *ErrInvalidDeals: + return ctx.Send(SectorInvalidDealIDs{}) + case *ErrExpiredDeals: + return ctx.Send(SectorDealsExpired{xerrors.Errorf("expired dealIDs in sector: %w", err)}) + default: + log.Errorf("sanity check error, not proceeding: +%v", err) + return xerrors.Errorf("checkPieces sanity check error: %w", err) + } + } + + if err := failedCooldown(ctx, sector); err != nil { + return err + } + + return ctx.Send(SectorRetrySubmitReplicaUpdate{}) +} + func (m *Sealing) handleCommitFailed(ctx statemachine.Context, sector SectorInfo) error { tok, _, err := m.Api.ChainHead(ctx.Context()) if err != nil { @@ -319,61 +382,40 @@ func (m *Sealing) handleDealsExpired(ctx statemachine.Context, sector SectorInfo return ctx.Send(SectorRemove{}) } -func (m *Sealing) HandleRecoverDealIDs(ctx Context, sector SectorInfo) error { - tok, height, err := m.Api.ChainHead(ctx.Context()) +func (m *Sealing) handleDealsExpiredSnapDeals(ctx statemachine.Context, sector SectorInfo) error { + if !sector.CCUpdate { + // Should be impossible + return xerrors.Errorf("should never reach SnapDealsDealsExpired as a non-CCUpdate sector") + } + + return ctx.Send(SectorAbortUpgrade{xerrors.Errorf("one of upgrade deals expired")}) +} + +func (m *Sealing) handleAbortUpgrade(ctx statemachine.Context, sector SectorInfo) error { + if !sector.CCUpdate { + return xerrors.Errorf("should never reach AbortUpgrade as a non-CCUpdate sector") + } + + // Remove snap deals replica if any + if err := m.sealer.ReleaseReplicaUpgrade(ctx.Context(), m.minerSector(sector.SectorType, sector.SectorNumber)); err != nil { + return xerrors.Errorf("removing CC update files from sector storage") + } + return ctx.Send(SectorRevertUpgradeToProving{}) +} + +// failWith is a mutator or global mutator +func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, sector SectorInfo, failWith interface{}) error { + toFix, paddingPieces, err := recoveryPiecesToFix(ctx.Context(), m.Api, sector, m.maddr) if err != nil { - return xerrors.Errorf("getting chain head: %w", err) + return err } - - var toFix []int - paddingPieces := 0 - - for i, p := range sector.Pieces { - // if no deal is associated with the piece, ensure that we added it as - // filler (i.e. ensure that it has a zero PieceCID) - if p.DealInfo == nil { - exp := zerocomm.ZeroPieceCommitment(p.Piece.Size.Unpadded()) - if !p.Piece.PieceCID.Equals(exp) { - return xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", sector.SectorNumber, i, p.Piece.PieceCID) - } - paddingPieces++ - continue - } - - proposal, err := m.Api.StateMarketStorageDealProposal(ctx.Context(), p.DealInfo.DealID, tok) - if err != nil { - log.Warnf("getting deal %d for piece %d: %+v", p.DealInfo.DealID, i, err) - toFix = append(toFix, i) - continue - } - - if proposal.Provider != m.maddr { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.Provider, m.maddr) - toFix = append(toFix, i) - continue - } - - if proposal.PieceCID != p.Piece.PieceCID { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.PieceCID, proposal.PieceCID) - toFix = append(toFix, i) - continue - } - - if p.Piece.Size != proposal.PieceSize { - log.Warnf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.Size, proposal.PieceSize) - toFix = append(toFix, i) - continue - } - - if height >= proposal.StartEpoch { - // TODO: check if we are in an early enough state (before precommit), try to remove the offending pieces - // (tricky as we have to 'defragment' the sector while doing that, and update piece references for retrieval) - return xerrors.Errorf("can't fix sector deals: piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height) - } + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + return err } - failed := map[int]error{} updates := map[int]abi.DealID{} + for _, i := range toFix { p := sector.Pieces[i] @@ -430,3 +472,67 @@ func (m *Sealing) HandleRecoverDealIDs(ctx Context, sector SectorInfo) error { // Not much to do here, we can't go back in time to commit this sector return ctx.Send(SectorUpdateDealIDs{Updates: updates}) } + +func (m *Sealing) HandleRecoverDealIDs(ctx statemachine.Context, sector SectorInfo) error { + return m.handleRecoverDealIDsOrFailWith(ctx, sector, SectorRemove{}) +} + +func (m *Sealing) handleSnapDealsRecoverDealIDs(ctx statemachine.Context, sector SectorInfo) error { + return m.handleRecoverDealIDsOrFailWith(ctx, sector, SectorAbortUpgrade{}) +} + +func recoveryPiecesToFix(ctx context.Context, api SealingAPI, sector SectorInfo, maddr address.Address) ([]int, int, error) { + tok, height, err := api.ChainHead(ctx) + if err != nil { + return nil, 0, xerrors.Errorf("getting chain head: %w", err) + } + + var toFix []int + paddingPieces := 0 + + for i, p := range sector.Pieces { + // if no deal is associated with the piece, ensure that we added it as + // filler (i.e. ensure that it has a zero PieceCID) + if p.DealInfo == nil { + exp := zerocomm.ZeroPieceCommitment(p.Piece.Size.Unpadded()) + if !p.Piece.PieceCID.Equals(exp) { + return nil, 0, xerrors.Errorf("sector %d piece %d had non-zero PieceCID %+v", sector.SectorNumber, i, p.Piece.PieceCID) + } + paddingPieces++ + continue + } + + proposal, err := api.StateMarketStorageDealProposal(ctx, p.DealInfo.DealID, tok) + if err != nil { + log.Warnf("getting deal %d for piece %d: %+v", p.DealInfo.DealID, i, err) + toFix = append(toFix, i) + continue + } + + if proposal.Provider != maddr { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong provider: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.Provider, maddr) + toFix = append(toFix, i) + continue + } + + if proposal.PieceCID != p.Piece.PieceCID { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with wrong PieceCID: %s != %s", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.PieceCID, proposal.PieceCID) + toFix = append(toFix, i) + continue + } + + if p.Piece.Size != proposal.PieceSize { + log.Warnf("piece %d (of %d) of sector %d refers deal %d with different size: %d != %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, p.Piece.Size, proposal.PieceSize) + toFix = append(toFix, i) + continue + } + + if height >= proposal.StartEpoch { + // TODO: check if we are in an early enough state (before precommit), try to remove the offending pieces + // (tricky as we have to 'defragment' the sector while doing that, and update piece references for retrieval) + return nil, 0, xerrors.Errorf("can't fix sector deals: piece %d (of %d) of sector %d refers expired deal %d - should start at %d, head %d", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID, proposal.StartEpoch, height) + } + } + + return toFix, paddingPieces, nil +} diff --git a/extern/storage-sealing/states_failed_test.go b/extern/storage-sealing/states_failed_test.go index 22c245afd..86f69b11f 100644 --- a/extern/storage-sealing/states_failed_test.go +++ b/extern/storage-sealing/states_failed_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/filecoin-project/go-state-types/network" + statemachine "github.com/filecoin-project/go-statemachine" market0 "github.com/filecoin-project/specs-actors/actors/builtin/market" @@ -25,6 +26,7 @@ import ( ) func TestStateRecoverDealIDs(t *testing.T) { + t.Skip("Bring this back when we can correctly mock a state machine context: Issue #7867") mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() @@ -40,7 +42,7 @@ func TestStateRecoverDealIDs(t *testing.T) { sctx := mocks.NewMockContext(mockCtrl) sctx.EXPECT().Context().AnyTimes().Return(ctx) - api.EXPECT().ChainHead(ctx).Times(1).Return(nil, abi.ChainEpoch(10), nil) + api.EXPECT().ChainHead(ctx).Times(2).Return(nil, abi.ChainEpoch(10), nil) var dealId abi.DealID = 12 dealProposal := market.DealProposal{ @@ -70,7 +72,9 @@ func TestStateRecoverDealIDs(t *testing.T) { sctx.EXPECT().Send(sealing.SectorRemove{}).Return(nil) - err := fakeSealing.HandleRecoverDealIDs(sctx, sealing.SectorInfo{ + // TODO sctx should satisfy an interface so it can be useable for mocking. This will fail because we are passing in an empty context now to get this to build. + // https://github.com/filecoin-project/lotus/issues/7867 + err := fakeSealing.HandleRecoverDealIDs(statemachine.Context{}, sealing.SectorInfo{ Pieces: []sealing.Piece{ { DealInfo: &api2.PieceDealInfo{ diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go new file mode 100644 index 000000000..28c5ede0b --- /dev/null +++ b/extern/storage-sealing/states_replica_update.go @@ -0,0 +1,209 @@ +package sealing + +import ( + "bytes" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/exitcode" + statemachine "github.com/filecoin-project/go-statemachine" + api "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "golang.org/x/xerrors" +) + +func (m *Sealing) handleReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state + switch err.(type) { + case *ErrApi: + log.Errorf("handleReplicaUpdate: api error, not proceeding: %+v", err) + return nil + case *ErrInvalidDeals: + log.Warnf("invalid deals in sector %d: %v", sector.SectorNumber, err) + return ctx.Send(SectorInvalidDealIDs{}) + case *ErrExpiredDeals: // Probably not much we can do here, maybe re-pack the sector? + return ctx.Send(SectorDealsExpired{xerrors.Errorf("expired dealIDs in sector: %w", err)}) + default: + return xerrors.Errorf("checkPieces sanity check error: %w", err) + } + } + out, err := m.sealer.ReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.pieceInfos()) + if err != nil { + return ctx.Send(SectorUpdateReplicaFailed{xerrors.Errorf("replica update failed: %w", err)}) + } + return ctx.Send(SectorReplicaUpdate{ + Out: out, + }) +} + +func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + if sector.UpdateSealed == nil || sector.UpdateUnsealed == nil { + return xerrors.Errorf("invalid sector %d with nil UpdateSealed or UpdateUnsealed output", sector.SectorNumber) + } + if sector.CommR == nil { + return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) + } + vanillaProofs, err := m.sealer.ProveReplicaUpdate1(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed) + if err != nil { + return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (1) failed: %w", err)}) + } + + proof, err := m.sealer.ProveReplicaUpdate2(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), *sector.CommR, *sector.UpdateSealed, *sector.UpdateUnsealed, vanillaProofs) + if err != nil { + return ctx.Send(SectorProveReplicaUpdateFailed{xerrors.Errorf("prove replica update (2) failed: %w", err)}) + + } + return ctx.Send(SectorProveReplicaUpdate{ + Proof: proof, + }) +} + +func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + + tok, _, err := m.Api.ChainHead(ctx.Context()) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + sl, err := m.Api.StateSectorPartition(ctx.Context(), m.maddr, sector.SectorNumber, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + updateProof, err := sector.SectorType.RegisteredUpdateProof() + if err != nil { + log.Errorf("failed to get update proof type from seal proof: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + enc := new(bytes.Buffer) + params := &miner.ProveReplicaUpdatesParams{ + Updates: []miner.ReplicaUpdate{ + { + SectorID: sector.SectorNumber, + Deadline: sl.Deadline, + Partition: sl.Partition, + NewSealedSectorCID: *sector.UpdateSealed, + Deals: sector.dealIDs(), + UpdateProofType: updateProof, + ReplicaProof: sector.ReplicaUpdateProof, + }, + }, + } + if err := params.MarshalCBOR(enc); err != nil { + log.Errorf("failed to serialize update replica params: %w", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + cfg, err := m.getConfig() + if err != nil { + return xerrors.Errorf("getting config: %w", err) + } + + onChainInfo, err := m.Api.StateSectorGetInfo(ctx.Context(), m.maddr, sector.SectorNumber, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + sp, err := m.currentSealProof(ctx.Context()) + if err != nil { + log.Errorf("sealer failed to return current seal proof not proceeding: %+v", err) + return nil + } + virtualPCI := miner.SectorPreCommitInfo{ + SealProof: sp, + SectorNumber: sector.SectorNumber, + SealedCID: *sector.UpdateSealed, + //SealRandEpoch: 0, + DealIDs: sector.dealIDs(), + Expiration: onChainInfo.Expiration, + //ReplaceCapacity: false, + //ReplaceSectorDeadline: 0, + //ReplaceSectorPartition: 0, + //ReplaceSectorNumber: 0, + } + + collateral, err := m.Api.StateMinerInitialPledgeCollateral(ctx.Context(), m.maddr, virtualPCI, tok) + if err != nil { + return xerrors.Errorf("getting initial pledge collateral: %w", err) + } + + collateral = big.Sub(collateral, onChainInfo.InitialPledge) + if collateral.LessThan(big.Zero()) { + collateral = big.Zero() + } + + collateral, err = collateralSendAmount(ctx.Context(), m.Api, m.maddr, cfg, collateral) + if err != nil { + log.Errorf("collateral send amount failed not proceeding: %+v", err) + return nil + } + + goodFunds := big.Add(collateral, big.Int(m.feeCfg.MaxCommitGasFee)) + + mi, err := m.Api.StateMinerInfo(ctx.Context(), m.maddr, tok) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: api error, not proceeding: %+v", err) + return nil + } + + from, _, err := m.addrSel(ctx.Context(), mi, api.CommitAddr, goodFunds, collateral) + if err != nil { + log.Errorf("no good address to send replica update message from: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.ProveReplicaUpdates, big.Zero(), big.Int(m.feeCfg.MaxCommitGasFee), enc.Bytes()) + if err != nil { + log.Errorf("handleSubmitReplicaUpdate: error sending message: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + return ctx.Send(SectorReplicaUpdateSubmitted{Message: mcid}) +} + +func (m *Sealing) handleReplicaUpdateWait(ctx statemachine.Context, sector SectorInfo) error { + if sector.ReplicaUpdateMessage == nil { + log.Errorf("handleReplicaUpdateWait: no replica update message cid recorded") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + mw, err := m.Api.StateWaitMsg(ctx.Context(), *sector.ReplicaUpdateMessage) + if err != nil { + log.Errorf("handleReplicaUpdateWait: failed to wait for message: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + switch mw.Receipt.ExitCode { + case exitcode.Ok: + //expected + case exitcode.SysErrInsufficientFunds: + fallthrough + case exitcode.SysErrOutOfGas: + log.Errorf("gas estimator was wrong or out of funds") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + default: + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + si, err := m.Api.StateSectorGetInfo(ctx.Context(), m.maddr, sector.SectorNumber, mw.TipSetTok) + if err != nil { + log.Errorf("api err failed to get sector info: %+v", err) + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + if si == nil { + log.Errorf("api err sector not found") + return ctx.Send(SectorSubmitReplicaUpdateFailed{}) + } + + if !si.SealedCID.Equals(*sector.UpdateSealed) { + log.Errorf("mismatch of expected onchain sealed cid after replica update, expected %s got %s", sector.UpdateSealed, si.SealedCID) + return ctx.Send(SectorAbortUpgrade{}) + } + return ctx.Send(SectorReplicaUpdateLanded{}) +} + +func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { + return ctx.Send(SectorFinalized{}) +} diff --git a/extern/storage-sealing/states_sealing.go b/extern/storage-sealing/states_sealing.go index c6cd0bb49..2258250f4 100644 --- a/extern/storage-sealing/states_sealing.go +++ b/extern/storage-sealing/states_sealing.go @@ -280,8 +280,8 @@ func (m *Sealing) handlePreCommit2(ctx statemachine.Context, sector SectorInfo) } // TODO: We should probably invoke this method in most (if not all) state transition failures after handlePreCommitting -func (m *Sealing) remarkForUpgrade(sid abi.SectorNumber) { - err := m.MarkForUpgrade(sid) +func (m *Sealing) remarkForUpgrade(ctx context.Context, sid abi.SectorNumber) { + err := m.MarkForUpgrade(ctx, sid) if err != nil { log.Errorf("error re-marking sector %d as for upgrade: %+v", sid, err) } @@ -424,7 +424,7 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf mcid, err := m.Api.SendMsg(ctx.Context(), from, m.maddr, miner.Methods.PreCommitSector, deposit, big.Int(m.feeCfg.MaxPreCommitGasFee), enc.Bytes()) if err != nil { if params.ReplaceCapacity { - m.remarkForUpgrade(params.ReplaceSectorNumber) + m.remarkForUpgrade(ctx.Context(), params.ReplaceSectorNumber) } return ctx.Send(SectorChainPreCommitFailed{xerrors.Errorf("pushing message to mpool: %w", err)}) } diff --git a/extern/storage-sealing/types.go b/extern/storage-sealing/types.go index aeb378f29..db53f43d3 100644 --- a/extern/storage-sealing/types.go +++ b/extern/storage-sealing/types.go @@ -73,7 +73,7 @@ type SectorInfo struct { // PreCommit2 CommD *cid.Cid - CommR *cid.Cid + CommR *cid.Cid // SectorKey Proof []byte PreCommitInfo *miner.SectorPreCommitInfo @@ -91,6 +91,14 @@ type SectorInfo struct { CommitMessage *cid.Cid InvalidProofs uint64 // failed proof computations (doesn't validate with proof inputs; can't compute) + // CCUpdate + CCUpdate bool + CCPieces []Piece + UpdateSealed *cid.Cid + UpdateUnsealed *cid.Cid + ReplicaUpdateProof storage.ReplicaUpdateProof + ReplicaUpdateMessage *cid.Cid + // Faults FaultReportMsg *cid.Cid diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index 02db41fde..aab1e67b0 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -4,6 +4,7 @@ import ( "context" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + market7 "github.com/filecoin-project/specs-actors/v7/actors/builtin/market" "golang.org/x/xerrors" @@ -18,7 +19,8 @@ func (m *Sealing) IsMarkedForUpgrade(id abi.SectorNumber) bool { return found } -func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { +func (m *Sealing) MarkForUpgrade(ctx context.Context, id abi.SectorNumber) error { + m.upgradeLk.Lock() defer m.upgradeLk.Unlock() @@ -27,6 +29,37 @@ func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { return xerrors.Errorf("sector %d already marked for upgrade", id) } + si, err := m.GetSectorInfo(id) + if err != nil { + return xerrors.Errorf("getting sector info: %w", err) + } + if si.State != Proving { + return xerrors.Errorf("can't mark sectors not in the 'Proving' state for upgrade") + } + if len(si.Pieces) != 1 { + return xerrors.Errorf("not a committed-capacity sector, expected 1 piece") + } + if si.Pieces[0].DealInfo != nil { + return xerrors.Errorf("not a committed-capacity sector, has deals") + } + + m.toUpgrade[id] = struct{}{} + + return nil +} + +func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) error { + cfg, err := m.getConfig() + if err != nil { + return xerrors.Errorf("getting storage config: %w", err) + } + + curStaging := m.stats.curStaging() + if cfg.MaxWaitDealsSectors > 0 && curStaging >= cfg.MaxWaitDealsSectors { + return xerrors.Errorf("already waiting for deals in %d >= %d (cfg.MaxWaitDealsSectors) sectors, no free resources to wait for deals in another", + curStaging, cfg.MaxWaitDealsSectors) + } + si, err := m.GetSectorInfo(id) if err != nil { return xerrors.Errorf("getting sector info: %w", err) @@ -44,11 +77,38 @@ func (m *Sealing) MarkForUpgrade(id abi.SectorNumber) error { return xerrors.Errorf("not a committed-capacity sector, has deals") } - // TODO: more checks to match actor constraints + tok, head, err := m.Api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("couldnt get chain head: %w", err) + } + onChainInfo, err := m.Api.StateSectorGetInfo(ctx, m.maddr, id, tok) + if err != nil { + return xerrors.Errorf("failed to read sector on chain info: %w", err) + } - m.toUpgrade[id] = struct{}{} + active, err := m.Api.StateMinerActiveSectors(ctx, m.maddr, tok) + if err != nil { + return xerrors.Errorf("failed to check active sectors: %w", err) + } + // Ensure the upgraded sector is active + var found bool + for _, si := range active { + if si.SectorNumber == id { + found = true + break + } + } + if !found { + return xerrors.Errorf("cannot mark inactive sector for upgrade") + } - return nil + if onChainInfo.Expiration-head < market7.DealMinDuration { + return xerrors.Errorf("pointless to upgrade sector %d, expiration %d is less than a min deal duration away from current epoch."+ + "Upgrade expiration before marking for upgrade", id, onChainInfo.Expiration) + } + + log.Errorf("updating sector number %d", id) + return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) } func (m *Sealing) tryUpgradeSector(ctx context.Context, params *miner.SectorPreCommitInfo) big.Int { diff --git a/go.mod b/go.mod index 551af628d..2cf84d128 100644 --- a/go.mod +++ b/go.mod @@ -50,8 +50,8 @@ require ( github.com/filecoin-project/specs-actors/v4 v4.0.1 github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 - github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec - github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff + github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a + github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 @@ -173,3 +173,7 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors + +//replace github.com/filecoin-project/specs-actors/v7 => /Users/zenground0/pl/repos/specs-actors + +// replace github.com/filecon-project/specs-storage => /Users/zenground0/pl/repos/specs-storage diff --git a/go.sum b/go.sum index 45625140b..3efacc216 100644 --- a/go.sum +++ b/go.sum @@ -341,7 +341,6 @@ github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MU github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -357,7 +356,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -376,10 +374,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -722,7 +721,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index b5ca41416..487a15659 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -6,14 +6,16 @@ import ( "testing" "time" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -// TODO: This needs to be repurposed into a SnapDeals test suite func TestCCUpgrade(t *testing.T) { kit.QuietMiningLogs() @@ -29,37 +31,45 @@ func TestCCUpgrade(t *testing.T) { } } -func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { +func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullNode { ctx := context.Background() blockTime := 5 * time.Millisecond - client, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.TurboUpgradeAt(upgradeHeight)) - ens.InterconnectAll().BeginMining(blockTime) + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMiningMustPost(blockTime) maddr, err := miner.ActorAddress(ctx) if err != nil { t.Fatal(err) } - CC := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) - Upgraded := CC + 1 + CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) + fmt.Printf("CCUpgrade: %d\n", CCUpgrade) + // wait for deadline 0 to pass so that committing starts after post on preseals + // this gives max time for post to complete minimizing chances of timeout + // waitForDeadline(ctx, t, 1, client, maddr) miner.PledgeSectors(ctx, 1, 0, nil) sl, err := miner.SectorsList(ctx) require.NoError(t, err) require.Len(t, sl, 1, "expected 1 sector") - require.Equal(t, CC, sl[0], "unexpected sector number") - + require.Equal(t, CCUpgrade, sl[0], "unexpected sector number") { - si, err := client.StateSectorGetInfo(ctx, maddr, CC, types.EmptyTSK) + si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) require.NoError(t, err) require.Less(t, 50000, int(si.Expiration)) } - err = miner.SectorMarkForUpgrade(ctx, sl[0]) + waitForSectorActive(ctx, t, CCUpgrade, client, maddr) + + err = miner.SectorMarkForUpgrade(ctx, sl[0], true) require.NoError(t, err) + sl, err = miner.SectorsList(ctx) + require.NoError(t, err) + require.Len(t, sl, 1, "expected 1 sector") + dh := kit.NewDealHarness(t, client, miner, miner) deal, res, inPath := dh.MakeOnlineDeal(ctx, kit.MakeFullDealParams{ Rseed: 6, @@ -68,37 +78,96 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) { outPath := dh.PerformRetrieval(context.Background(), deal, res.Root, false) kit.AssertFilesEqual(t, inPath, outPath) - // Validate upgrade - - { - exp, err := client.StateSectorExpiration(ctx, maddr, CC, types.EmptyTSK) - if err != nil { - require.Contains(t, err.Error(), "failed to find sector 3") // already cleaned up - } else { - require.NoError(t, err) - require.NotNil(t, exp) - require.Greater(t, 50000, int(exp.OnTime)) - } - } - { - exp, err := client.StateSectorExpiration(ctx, maddr, Upgraded, types.EmptyTSK) - require.NoError(t, err) - require.Less(t, 50000, int(exp.OnTime)) - } - - dlInfo, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + status, err := miner.SectorsStatus(ctx, CCUpgrade, true) require.NoError(t, err) + assert.Equal(t, 1, len(status.Deals)) + return client +} - // Sector should expire. +func waitForDeadline(ctx context.Context, t *testing.T, waitIdx uint64, node *kit.TestFullNode, maddr address.Address) { for { - // Wait for the sector to expire. - status, err := miner.SectorsStatus(ctx, CC, true) + ts, err := node.ChainHead(ctx) require.NoError(t, err) - if status.OnTime == 0 && status.Early == 0 { - break + dl, err := node.StateMinerProvingDeadline(ctx, maddr, ts.Key()) + require.NoError(t, err) + if dl.Index == waitIdx { + return } - t.Log("waiting for sector to expire") - // wait one deadline per loop. - time.Sleep(time.Duration(dlInfo.WPoStChallengeWindow) * blockTime) } } + +func waitForSectorActive(ctx context.Context, t *testing.T, sn abi.SectorNumber, node *kit.TestFullNode, maddr address.Address) { + for { + active, err := node.StateMinerActiveSectors(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + for _, si := range active { + if si.SectorNumber == sn { + fmt.Printf("ACTIVE\n") + return + } + } + + time.Sleep(time.Second) + } +} + +func TestCCUpgradeAndPoSt(t *testing.T) { + kit.QuietMiningLogs() + t.Run("upgrade and then post", func(t *testing.T) { + ctx := context.Background() + n := runTestCCUpgrade(t, 100) + ts, err := n.ChainHead(ctx) + require.NoError(t, err) + start := ts.Height() + // wait for a full proving period + n.WaitTillChain(ctx, func(ts *types.TipSet) bool { + if ts.Height() > start+abi.ChainEpoch(2880) { + return true + } + return false + }) + }) +} + +func TestTooManyMarkedForUpgrade(t *testing.T) { + kit.QuietMiningLogs() + + ctx := context.Background() + blockTime := 5 * time.Millisecond + + client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) + ens.InterconnectAll().BeginMining(blockTime) + + maddr, err := miner.ActorAddress(ctx) + if err != nil { + t.Fatal(err) + } + + CCUpgrade := abi.SectorNumber(kit.DefaultPresealsPerBootstrapMiner + 1) + waitForDeadline(ctx, t, 1, client, maddr) + miner.PledgeSectors(ctx, 3, 0, nil) + + sl, err := miner.SectorsList(ctx) + require.NoError(t, err) + require.Len(t, sl, 3, "expected 3 sectors") + + { + si, err := client.StateSectorGetInfo(ctx, maddr, CCUpgrade, types.EmptyTSK) + require.NoError(t, err) + require.Less(t, 50000, int(si.Expiration)) + } + + waitForSectorActive(ctx, t, CCUpgrade, client, maddr) + waitForSectorActive(ctx, t, CCUpgrade+1, client, maddr) + waitForSectorActive(ctx, t, CCUpgrade+2, client, maddr) + + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade, true) + require.NoError(t, err) + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+1, true) + require.NoError(t, err) + + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+2, true) + require.Error(t, err) + assert.Contains(t, err.Error(), "no free resources to wait for deals") + +} diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 2c9bd47c6..c1061b558 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -1,13 +1,18 @@ package kit import ( + "bytes" "context" "sync" "sync/atomic" "testing" "time" + "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/api" + aminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/miner" "github.com/stretchr/testify/require" ) @@ -30,6 +35,138 @@ func NewBlockMiner(t *testing.T, miner *TestMiner) *BlockMiner { } } +type partitionTracker struct { + partitions []api.Partition + posted bitfield.BitField +} + +func newPartitionTracker(ctx context.Context, dlIdx uint64, bm *BlockMiner) *partitionTracker { + dlines, err := bm.miner.FullNode.StateMinerDeadlines(ctx, bm.miner.ActorAddr, types.EmptyTSK) + require.NoError(bm.t, err) + dl := dlines[dlIdx] + + parts, err := bm.miner.FullNode.StateMinerPartitions(ctx, bm.miner.ActorAddr, dlIdx, types.EmptyTSK) + require.NoError(bm.t, err) + return &partitionTracker{ + partitions: parts, + posted: dl.PostSubmissions, + } +} + +func (p *partitionTracker) count(t *testing.T) uint64 { + pCnt, err := p.posted.Count() + require.NoError(t, err) + return pCnt +} + +func (p *partitionTracker) done(t *testing.T) bool { + return uint64(len(p.partitions)) == p.count(t) +} + +func (p *partitionTracker) recordIfPost(t *testing.T, bm *BlockMiner, smsg *types.SignedMessage) (ret bool) { + defer func() { + ret = p.done(t) + }() + msg := smsg.Message + if !(msg.To == bm.miner.ActorAddr) { + return + } + if msg.Method != aminer.Methods.SubmitWindowedPoSt { + return + } + params := aminer.SubmitWindowedPoStParams{} + require.NoError(t, params.UnmarshalCBOR(bytes.NewReader(msg.Params))) + for _, part := range params.Partitions { + p.posted.Set(part.Index) + } + return +} + +// Like MineBlocks but refuses to mine until the window post scheduler has wdpost messages in the mempool +// and everything shuts down if a post fails +func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Duration) { + + time.Sleep(time.Second) + + // wrap context in a cancellable context. + ctx, bm.cancel = context.WithCancel(ctx) + bm.wg.Add(1) + go func() { + defer bm.wg.Done() + + activeDeadlines := make(map[int]struct{}) + _ = activeDeadlines + + for { + select { + case <-time.After(blocktime): + case <-ctx.Done(): + return + } + nulls := atomic.SwapInt64(&bm.nextNulls, 0) + require.Equal(bm.t, int64(0), nulls, "Injecting > 0 null blocks while `MustPost` mining is currently unsupported") + + // Wake up and figure out if we are at the end of an active deadline + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + tsk := ts.Key() + dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) + require.NoError(bm.t, err) + if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted + + tracker := newPartitionTracker(ctx, dlinfo.Index, bm) + if !tracker.done(bm.t) { // need to wait for post + bm.t.Logf("expect %d partitions proved but only see %d", len(tracker.partitions), tracker.count(bm.t)) + poolEvts, err := bm.miner.FullNode.MpoolSub(ctx) + require.NoError(bm.t, err) + + // First check pending messages we'll mine this epoch + msgs, err := bm.miner.FullNode.MpoolPending(ctx, types.EmptyTSK) + require.NoError(bm.t, err) + for _, msg := range msgs { + tracker.recordIfPost(bm.t, bm, msg) + } + + // post not yet in mpool, wait for it + if !tracker.done(bm.t) { + bm.t.Logf("post missing from mpool, block mining suspended until it arrives") + POOL: + for { + select { + case <-ctx.Done(): + return + case evt := <-poolEvts: + if evt.Type == api.MpoolAdd { + bm.t.Logf("incoming message %v", evt.Message) + if tracker.recordIfPost(bm.t, bm, evt.Message) { + break POOL + } + } + } + } + + } + + } + + } + + err = bm.miner.MineOne(ctx, miner.MineReq{ + InjectNulls: abi.ChainEpoch(nulls), + Done: func(bool, abi.ChainEpoch, error) {}, + }) + switch { + case err == nil: // wrap around + case ctx.Err() != nil: // context fired. + return + default: // log error + bm.t.Error(err) + } + } + }() + +} + func (bm *BlockMiner) MineBlocks(ctx context.Context, blocktime time.Duration) { time.Sleep(time.Second) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 29da37c15..f8de14d62 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -104,8 +104,9 @@ func (dh *DealHarness) MakeOnlineDeal(ctx context.Context, params MakeFullDealPa // TODO: this sleep is only necessary because deals don't immediately get logged in the dealstore, we should fix this time.Sleep(time.Second) + fmt.Printf("WAIT DEAL SEALEDS START\n") dh.WaitDealSealed(ctx, deal, false, false, nil) - + fmt.Printf("WAIT DEAL SEALEDS END\n") return deal, res, path } @@ -176,6 +177,7 @@ loop: cb() } } + fmt.Printf("WAIT DEAL SEALED LOOP BROKEN\n") } // WaitDealSealedQuiet waits until the deal is sealed, without logging anything. @@ -290,12 +292,11 @@ func (dh *DealHarness) WaitDealPublished(ctx context.Context, deal *cid.Cid) { func (dh *DealHarness) StartSealingWaiting(ctx context.Context) { snums, err := dh.main.SectorsList(ctx) require.NoError(dh.t, err) - for _, snum := range snums { si, err := dh.main.SectorsStatus(ctx, snum, false) require.NoError(dh.t, err) - dh.t.Logf("Sector state: %s", si.State) + dh.t.Logf("Sector state <%d>-[%d]:, %s", snum, si.SealProof, si.State) if si.State == api.SectorState(sealing.WaitDeals) { require.NoError(dh.t, dh.main.SectorStartSealing(ctx, snum)) } diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 2a6d16a95..dfd3d8cd7 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -675,6 +675,43 @@ func (n *Ensemble) Connect(from api.Net, to ...api.Net) *Ensemble { return n } +func (n *Ensemble) BeginMiningMustPost(blocktime time.Duration, miners ...*TestMiner) []*BlockMiner { + ctx := context.Background() + + // wait one second to make sure that nodes are connected and have handshaken. + // TODO make this deterministic by listening to identify events on the + // libp2p eventbus instead (or something else). + time.Sleep(1 * time.Second) + + var bms []*BlockMiner + if len(miners) == 0 { + // no miners have been provided explicitly, instantiate block miners + // for all active miners that aren't still mining. + for _, m := range n.active.miners { + if _, ok := n.active.bms[m]; ok { + continue // skip, already have a block miner + } + miners = append(miners, m) + } + } + + if len(miners) > 1 { + n.t.Fatalf("Only one active miner for MustPost, but have %d", len(miners)) + } + + for _, m := range miners { + bm := NewBlockMiner(n.t, m) + bm.MineBlocksMustPost(ctx, blocktime) + n.t.Cleanup(bm.Stop) + + bms = append(bms, bm) + + n.active.bms[m] = bm + } + + return bms +} + // BeginMining kicks off mining for the specified miners. If nil or 0-length, // it will kick off mining for all enrolled and active miners. It also adds a // cleanup function to stop all mining operations on test teardown. diff --git a/markets/storageadapter/ondealsectorcommitted.go b/markets/storageadapter/ondealsectorcommitted.go index 4cd0a2d68..94eaadef4 100644 --- a/markets/storageadapter/ondealsectorcommitted.go +++ b/markets/storageadapter/ondealsectorcommitted.go @@ -5,6 +5,7 @@ import ( "context" "sync" + "github.com/filecoin-project/go-bitfield" sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -110,7 +111,7 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, // Watch for a pre-commit message to the provider. matchEvent := func(msg *types.Message) (bool, error) { - matched := msg.To == provider && (msg.Method == miner.Methods.PreCommitSector || msg.Method == miner.Methods.PreCommitSectorBatch) + matched := msg.To == provider && (msg.Method == miner.Methods.PreCommitSector || msg.Method == miner.Methods.PreCommitSectorBatch || msg.Method == miner.Methods.ProveReplicaUpdates) return matched, nil } @@ -145,6 +146,20 @@ func (mgr *SectorCommittedManager) OnDealSectorPreCommitted(ctx context.Context, return false, err } + // If this is a replica update method that succeeded the deal is active + if msg.Method == miner.Methods.ProveReplicaUpdates { + sn, err := dealSectorInReplicaUpdateSuccess(msg, rec, res) + if err != nil { + return false, err + } + if sn != nil { + cb(*sn, true, nil) + return false, nil + } + // Didn't find the deal ID in this message, so keep looking + return true, nil + } + // Extract the message parameters sn, err := dealSectorInPreCommitMsg(msg, res) if err != nil { @@ -264,6 +279,42 @@ func (mgr *SectorCommittedManager) OnDealSectorCommitted(ctx context.Context, pr return nil } +func dealSectorInReplicaUpdateSuccess(msg *types.Message, rec *types.MessageReceipt, res sealing.CurrentDealInfo) (*abi.SectorNumber, error) { + var params miner.ProveReplicaUpdatesParams + if err := params.UnmarshalCBOR(bytes.NewReader(msg.Params)); err != nil { + return nil, xerrors.Errorf("unmarshal prove replica update: %w", err) + } + + var seekUpdate miner.ReplicaUpdate + var found bool + for _, update := range params.Updates { + for _, did := range update.Deals { + if did == res.DealID { + seekUpdate = update + found = true + break + } + } + } + if !found { + return nil, nil + } + + // check that this update passed validation steps + var successBf bitfield.BitField + if err := successBf.UnmarshalCBOR(bytes.NewReader(rec.Return)); err != nil { + return nil, xerrors.Errorf("unmarshal return value: %w", err) + } + success, err := successBf.IsSet(uint64(seekUpdate.SectorID)) + if err != nil { + return nil, xerrors.Errorf("failed to check success of replica update: %w", err) + } + if !success { + return nil, xerrors.Errorf("replica update %d failed", seekUpdate.SectorID) + } + return &seekUpdate.SectorID, nil +} + // dealSectorInPreCommitMsg tries to find a sector containing the specified deal func dealSectorInPreCommitMsg(msg *types.Message, res sealing.CurrentDealInfo) (*abi.SectorNumber, error) { switch msg.Method { diff --git a/miner/miner.go b/miner/miner.go index c5f0a0129..976e9ca6f 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -535,8 +535,12 @@ func (m *Miner) mineOne(ctx context.Context, base *MiningBase) (minedBlock *type prand := abi.PoStRandomness(rand) tSeed := build.Clock.Now() + nv, err := m.api.StateNetworkVersion(ctx, base.TipSet.Key()) + if err != nil { + return nil, err + } - postProof, err := m.epp.ComputeProof(ctx, mbi.Sectors, prand) + postProof, err := m.epp.ComputeProof(ctx, mbi.Sectors, prand, round, nv) if err != nil { err = xerrors.Errorf("failed to compute winning post proof: %w", err) return nil, err diff --git a/miner/warmup.go b/miner/warmup.go index 991679c09..be5ac3ea7 100644 --- a/miner/warmup.go +++ b/miner/warmup.go @@ -10,8 +10,7 @@ import ( "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" - - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/chain/types" ) @@ -61,13 +60,22 @@ out: return xerrors.Errorf("getting sector info: %w", err) } - _, err = m.epp.ComputeProof(ctx, []proof2.SectorInfo{ + ts, err := m.api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("getting chain head") + } + nv, err := m.api.StateNetworkVersion(ctx, ts.Key()) + if err != nil { + return xerrors.Errorf("getting network version") + } + + _, err = m.epp.ComputeProof(ctx, []proof7.ExtendedSectorInfo{ { SealProof: si.SealProof, SectorNumber: sector, SealedCID: si.SealedCID, }, - }, r) + }, r, ts.Height(), nv) if err != nil { return xerrors.Errorf("failed to compute proof: %w", err) } diff --git a/node/config/def.go b/node/config/def.go index 4a525e697..9c39c197c 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -109,10 +109,11 @@ func DefaultStorageMiner() *StorageMiner { AvailableBalanceBuffer: types.FIL(big.Zero()), DisableCollateralFallback: false, - BatchPreCommits: true, - MaxPreCommitBatch: miner5.PreCommitSectorBatchMaxSize, // up to 256 sectors - PreCommitBatchWait: Duration(24 * time.Hour), // this should be less than 31.5 hours, which is the expiration of a precommit ticket - PreCommitBatchSlack: Duration(3 * time.Hour), // time buffer for forceful batch submission before sectors/deals in batch would start expiring, higher value will lower the chances for message fail due to expiration + BatchPreCommits: true, + MaxPreCommitBatch: miner5.PreCommitSectorBatchMaxSize, // up to 256 sectors + PreCommitBatchWait: Duration(24 * time.Hour), // this should be less than 31.5 hours, which is the expiration of a precommit ticket + // XXX snap deals wait deals slack if first + PreCommitBatchSlack: Duration(3 * time.Hour), // time buffer for forceful batch submission before sectors/deals in batch would start expiring, higher value will lower the chances for message fail due to expiration CommittedCapacitySectorLifetime: Duration(builtin.EpochDurationSeconds * uint64(policy.GetMaxSectorExpirationExtension()) * uint64(time.Second)), @@ -131,11 +132,13 @@ func DefaultStorageMiner() *StorageMiner { }, Storage: sectorstorage.SealerConfig{ - AllowAddPiece: true, - AllowPreCommit1: true, - AllowPreCommit2: true, - AllowCommit: true, - AllowUnseal: true, + AllowAddPiece: true, + AllowPreCommit1: true, + AllowPreCommit2: true, + AllowCommit: true, + AllowUnseal: true, + AllowReplicaUpdate: true, + AllowProveReplicaUpdate2: true, // Default to 10 - tcp should still be able to figure this out, and // it's the ratio between 10gbit / 1gbit diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 764e4fb36..3ebac1409 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -37,6 +37,7 @@ import ( "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/network" sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage" "github.com/filecoin-project/lotus/extern/sector-storage/fsutil" @@ -386,8 +387,8 @@ func (sm *StorageMinerAPI) SectorPreCommitPending(ctx context.Context) ([]abi.Se return sm.Miner.SectorPreCommitPending(ctx) } -func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber) error { - return sm.Miner.MarkForUpgrade(id) +func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error { + return sm.Miner.MarkForUpgrade(ctx, id, snap) } func (sm *StorageMinerAPI) SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) { @@ -398,6 +399,10 @@ func (sm *StorageMinerAPI) SectorCommitPending(ctx context.Context) ([]abi.Secto return sm.Miner.CommitPending(ctx) } +func (sm *StorageMinerAPI) SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error { + return sm.Miner.SectorMatchPendingPiecesToOpenSectors(ctx) +} + func (sm *StorageMinerAPI) WorkerConnect(ctx context.Context, url string) error { w, err := connectRemoteWorker(ctx, sm, url) if err != nil { @@ -1155,8 +1160,8 @@ func (sm *StorageMinerAPI) Discover(ctx context.Context) (apitypes.OpenRPCDocume return build.OpenRPCDiscoverJSON_Miner(), nil } -func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { - return sm.Epp.ComputeProof(ctx, ssi, rand) +func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, poStEpoch abi.ChainEpoch, nv network.Version) ([]builtin.PoStProof, error) { + return sm.Epp.ComputeProof(ctx, ssi, rand, poStEpoch, nv) } func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubsystems, err error) { diff --git a/storage/adapter_storage_miner.go b/storage/adapter_storage_miner.go index 0b4b17f96..01ff9d8d3 100644 --- a/storage/adapter_storage_miner.go +++ b/storage/adapter_storage_miner.go @@ -112,6 +112,15 @@ func (s SealingAPIAdapter) StateMinerSectorAllocated(ctx context.Context, maddr return s.delegate.StateMinerSectorAllocated(ctx, maddr, sid, tsk) } +func (s SealingAPIAdapter) StateMinerActiveSectors(ctx context.Context, maddr address.Address, tok sealing.TipSetToken) ([]*miner.SectorOnChainInfo, error) { + tsk, err := types.TipSetKeyFromBytes(tok) + if err != nil { + return nil, xerrors.Errorf("faile dto unmarshal TipSetToken to TipSetKey: %w", err) + } + + return s.delegate.StateMinerActiveSectors(ctx, maddr, tsk) +} + func (s SealingAPIAdapter) StateWaitMsg(ctx context.Context, mcid cid.Cid) (sealing.MsgLookup, error) { wmsg, err := s.delegate.StateWaitMsg(ctx, mcid, build.MessageConfidence, api.LookbackNoLimit, true) if err != nil { diff --git a/storage/miner.go b/storage/miner.go index 0b1f66840..c52b786ee 100644 --- a/storage/miner.go +++ b/storage/miner.go @@ -86,6 +86,7 @@ type fullNodeFilteredAPI interface { StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*miner.SectorLocation, error) StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) StateMinerAvailableBalance(ctx context.Context, maddr address.Address, tok types.TipSetKey) (types.BigInt, error) + StateMinerActiveSectors(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error) StateMinerPartitions(context.Context, address.Address, uint64, types.TipSetKey) ([]api.Partition, error) StateMinerProvingDeadline(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) @@ -282,7 +283,7 @@ func (wpp *StorageWpp) GenerateCandidates(ctx context.Context, randomness abi.Po return cds, nil } -func (wpp *StorageWpp) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { +func (wpp *StorageWpp) ComputeProof(ctx context.Context, ssi []builtin.ExtendedSectorInfo, rand abi.PoStRandomness, currEpoch abi.ChainEpoch, nv network.Version) ([]builtin.PoStProof, error) { if build.InsecurePoStValidation { return []builtin.PoStProof{{ProofBytes: []byte("valid proof")}}, nil } diff --git a/storage/miner_sealing.go b/storage/miner_sealing.go index 01b9546a6..d8ef26835 100644 --- a/storage/miner_sealing.go +++ b/storage/miner_sealing.go @@ -71,8 +71,15 @@ func (m *Miner) CommitPending(ctx context.Context) ([]abi.SectorID, error) { return m.sealing.CommitPending(ctx) } -func (m *Miner) MarkForUpgrade(id abi.SectorNumber) error { - return m.sealing.MarkForUpgrade(id) +func (m *Miner) SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error { + return m.sealing.MatchPendingPiecesToOpenSectors(ctx) +} + +func (m *Miner) MarkForUpgrade(ctx context.Context, id abi.SectorNumber, snap bool) error { + if snap { + return m.sealing.MarkForSnapUpgrade(ctx, id) + } + return m.sealing.MarkForUpgrade(ctx, id) } func (m *Miner) IsMarkedForUpgrade(id abi.SectorNumber) bool { diff --git a/storage/wdpost_changehandler_test.go b/storage/wdpost_changehandler_test.go index a2283cb7c..2fcbe770e 100644 --- a/storage/wdpost_changehandler_test.go +++ b/storage/wdpost_changehandler_test.go @@ -117,7 +117,7 @@ func (m *mockAPI) startGeneratePoST( completeGeneratePoST CompleteGeneratePoSTCb, ) context.CancelFunc { ctx, cancel := context.WithCancel(ctx) - + log.Errorf("mock posting\n") m.statesLk.Lock() defer m.statesLk.Unlock() m.postStates[deadline.Open] = postStatusProving diff --git a/storage/wdpost_run.go b/storage/wdpost_run.go index 83802a7f3..6a86656c7 100644 --- a/storage/wdpost_run.go +++ b/storage/wdpost_run.go @@ -19,8 +19,8 @@ import ( "go.opencensus.io/trace" "golang.org/x/xerrors" - proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/filecoin-project/specs-actors/v3/actors/runtime/proof" + proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -568,7 +568,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t for retries := 0; ; retries++ { skipCount := uint64(0) var partitions []miner.PoStPartition - var sinfos []proof2.SectorInfo + var xsinfos []proof7.ExtendedSectorInfo for partIdx, partition := range batch { // TODO: Can do this in parallel toProve, err := bitfield.SubtractBitField(partition.LiveSectors, partition.FaultySectors) @@ -611,14 +611,14 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t continue } - sinfos = append(sinfos, ssi...) + xsinfos = append(xsinfos, ssi...) partitions = append(partitions, miner.PoStPartition{ Index: uint64(batchPartitionStartIdx + partIdx), Skipped: skipped, }) } - if len(sinfos) == 0 { + if len(xsinfos) == 0 { // nothing to prove for this batch break } @@ -637,14 +637,22 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t return nil, err } - postOut, ps, err := s.prover.GenerateWindowPoSt(ctx, abi.ActorID(mid), sinfos, append(abi.PoStRandomness{}, rand...)) + defer func() { + if r := recover(); r != nil { + log.Errorf("recover: %s", r) + } + }() + postOut, ps, err := s.prover.GenerateWindowPoSt(ctx, abi.ActorID(mid), xsinfos, append(abi.PoStRandomness{}, rand...)) elapsed := time.Since(tsStart) - log.Infow("computing window post", "batch", batchIdx, "elapsed", elapsed) - + if err != nil { + log.Errorf("error generating window post: %s", err) + } if err == nil { + // If we proved nothing, something is very wrong. if len(postOut) == 0 { + log.Errorf("len(postOut) == 0") return nil, xerrors.Errorf("received no proofs back from generate window post") } @@ -665,6 +673,14 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t } // If we generated an incorrect proof, try again. + sinfos := make([]proof7.SectorInfo, len(xsinfos)) + for i, xsi := range xsinfos { + sinfos[i] = proof7.SectorInfo{ + SealProof: xsi.SealProof, + SectorNumber: xsi.SectorNumber, + SealedCID: xsi.SealedCID, + } + } if correct, err := s.verifier.VerifyWindowPoSt(ctx, proof.WindowPoStVerifyInfo{ Randomness: abi.PoStRandomness(checkRand), Proofs: postOut, @@ -687,7 +703,7 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t } // Proof generation failed, so retry - + log.Debugf("Proof generation failed, retry") if len(ps) == 0 { // If we didn't skip any new sectors, we failed // for some other reason and we need to abort. @@ -715,10 +731,8 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t if !somethingToProve { continue } - posts = append(posts, params) } - return posts, nil } @@ -767,7 +781,7 @@ func (s *WindowPoStScheduler) batchPartitions(partitions []api.Partition, nv net return batches, nil } -func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof2.SectorInfo, error) { +func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, allSectors bitfield.BitField, ts *types.TipSet) ([]proof7.ExtendedSectorInfo, error) { sset, err := s.api.StateMinerSectors(ctx, s.actor, &goodSectors, ts.Key()) if err != nil { return nil, err @@ -777,22 +791,24 @@ func (s *WindowPoStScheduler) sectorsForProof(ctx context.Context, goodSectors, return nil, nil } - substitute := proof2.SectorInfo{ + substitute := proof7.ExtendedSectorInfo{ SectorNumber: sset[0].SectorNumber, SealedCID: sset[0].SealedCID, SealProof: sset[0].SealProof, + SectorKey: sset[0].SectorKeyCID, } - sectorByID := make(map[uint64]proof2.SectorInfo, len(sset)) + sectorByID := make(map[uint64]proof7.ExtendedSectorInfo, len(sset)) for _, sector := range sset { - sectorByID[uint64(sector.SectorNumber)] = proof2.SectorInfo{ + sectorByID[uint64(sector.SectorNumber)] = proof7.ExtendedSectorInfo{ SectorNumber: sector.SectorNumber, SealedCID: sector.SealedCID, SealProof: sector.SealProof, + SectorKey: sector.SectorKeyCID, } } - proofSectors := make([]proof2.SectorInfo, 0, len(sset)) + proofSectors := make([]proof7.ExtendedSectorInfo, 0, len(sset)) if err := allSectors.ForEach(func(sectorNo uint64) error { if info, found := sectorByID[sectorNo]; found { proofSectors = append(proofSectors, info) diff --git a/storage/wdpost_run_test.go b/storage/wdpost_run_test.go index 9ece295ca..feeaab6ed 100644 --- a/storage/wdpost_run_test.go +++ b/storage/wdpost_run_test.go @@ -116,11 +116,11 @@ func (m *mockStorageMinerAPI) GasEstimateFeeCap(context.Context, *types.Message, type mockProver struct { } -func (m *mockProver) GenerateWinningPoSt(context.Context, abi.ActorID, []proof2.SectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { +func (m *mockProver) GenerateWinningPoSt(context.Context, abi.ActorID, []proof7.ExtendedSectorInfo, abi.PoStRandomness) ([]proof2.PoStProof, error) { panic("implement me") } -func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, sis []proof2.SectorInfo, pr abi.PoStRandomness) ([]proof2.PoStProof, []abi.SectorID, error) { +func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, sis []proof7.ExtendedSectorInfo, pr abi.PoStRandomness) ([]proof2.PoStProof, []abi.SectorID, error) { return []proof2.PoStProof{ { PoStProof: abi.RegisteredPoStProof_StackedDrgWindow2KiBV1, @@ -132,7 +132,7 @@ func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, si type mockVerif struct { } -func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof2.WinningPoStVerifyInfo) (bool, error) { +func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, nv network.Version) (bool, error) { panic("implement me") } From f59bfd65da38445d1b5ab160ea9258e135d67bf8 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 5 Jan 2022 08:24:46 -0500 Subject: [PATCH 150/157] Deflake snap deals integration test --- itests/kit/blockminer.go | 72 ++++++++++++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index c1061b558..878f4a663 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -83,10 +83,10 @@ func (p *partitionTracker) recordIfPost(t *testing.T, bm *BlockMiner, smsg *type } // Like MineBlocks but refuses to mine until the window post scheduler has wdpost messages in the mempool -// and everything shuts down if a post fails +// and everything shuts down if a post fails. It also enforces that every block mined succeeds func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Duration) { - time.Sleep(time.Second) + time.Sleep(3 * time.Second) // wrap context in a cancellable context. ctx, bm.cancel = context.WithCancel(ctx) @@ -96,7 +96,20 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur activeDeadlines := make(map[int]struct{}) _ = activeDeadlines - + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + wait := make(chan bool) + reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { + bm.t.Logf("done with mine one at epoch %d, success %t", epoch, success) + require.NoError(bm.t, err) + wait <- success + } + chg, err := bm.miner.FullNode.ChainNotify(ctx) + require.NoError(bm.t, err) + // read current out + curr := <-chg + require.Equal(bm.t, ts.Height(), curr[0].Val.Height()) + numMined := curr[0].Val.Height() for { select { case <-time.After(blocktime): @@ -110,6 +123,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) tsk := ts.Key() + bm.t.Logf("Miner sees head ts: %s at height %d, num mined = %d", tsk, ts.Height(), numMined) dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) require.NoError(bm.t, err) if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted @@ -132,10 +146,12 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur bm.t.Logf("post missing from mpool, block mining suspended until it arrives") POOL: for { + bm.t.Logf("mpool event wait loop at block height %d, ts: %s", ts.Height(), ts.Key()) select { case <-ctx.Done(): return case evt := <-poolEvts: + bm.t.Logf("pool event: %d", evt.Type) if evt.Type == api.MpoolAdd { bm.t.Logf("incoming message %v", evt.Message) if tracker.recordIfPost(bm.t, bm, evt.Message) { @@ -144,17 +160,53 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur } } } - + bm.t.Logf("done waiting on mpool") } - } - } - err = bm.miner.MineOne(ctx, miner.MineReq{ - InjectNulls: abi.ChainEpoch(nulls), - Done: func(bool, abi.ChainEpoch, error) {}, - }) + baseHeight := ts.Height() + + syncedToHeight := func(target abi.ChainEpoch) { + headChangeCh, err := bm.miner.FullNode.ChainNotify(ctx) + require.NoError(bm.t, err) + hccurrent, ok1 := <-headChangeCh + for !ok1 { + hccurrent, ok1 = <-headChangeCh + } + if hccurrent[0].Val.Height() >= target { + return + } + var ok2 bool + for { + var headChanges []*api.HeadChange + select { + case headChanges, ok2 = <-headChangeCh: + if !ok2 { // if channel is closed on us fail + bm.t.Log("channel closed") + bm.t.Fatal("chain notify channel closed while waiting to sync") + } + for _, hc := range headChanges { + if hc.Val.Height() >= target { + return + } + } + case <-ctx.Done(): + return + } + } + } + + var success bool + for i := int64(0); !success; i++ { + err = bm.miner.MineOne(ctx, miner.MineReq{ + InjectNulls: abi.ChainEpoch(nulls + i), + Done: reportSuccessFn, + }) + success = <-wait + } + syncedToHeight(baseHeight + 1) + numMined += 1 switch { case err == nil: // wrap around case ctx.Err() != nil: // context fired. From 3dc3f55ecb1df841792a04d72c9b692b825459e5 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Fri, 7 Jan 2022 22:20:49 +0530 Subject: [PATCH 151/157] Deflake more practically --- itests/kit/blockminer.go | 62 ++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 878f4a663..91ddc2e26 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -99,17 +99,11 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) wait := make(chan bool) - reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { - bm.t.Logf("done with mine one at epoch %d, success %t", epoch, success) - require.NoError(bm.t, err) - wait <- success - } chg, err := bm.miner.FullNode.ChainNotify(ctx) require.NoError(bm.t, err) // read current out curr := <-chg require.Equal(bm.t, ts.Height(), curr[0].Val.Height()) - numMined := curr[0].Val.Height() for { select { case <-time.After(blocktime): @@ -123,7 +117,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur ts, err := bm.miner.FullNode.ChainHead(ctx) require.NoError(bm.t, err) tsk := ts.Key() - bm.t.Logf("Miner sees head ts: %s at height %d, num mined = %d", tsk, ts.Height(), numMined) + dlinfo, err := bm.miner.FullNode.StateMinerProvingDeadline(ctx, bm.miner.ActorAddr, tsk) require.NoError(bm.t, err) if ts.Height()+1 == dlinfo.Last() { // Last epoch in dline, we need to check that miner has posted @@ -165,36 +159,11 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur } } - baseHeight := ts.Height() - - syncedToHeight := func(target abi.ChainEpoch) { - headChangeCh, err := bm.miner.FullNode.ChainNotify(ctx) + var target abi.ChainEpoch + reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { require.NoError(bm.t, err) - hccurrent, ok1 := <-headChangeCh - for !ok1 { - hccurrent, ok1 = <-headChangeCh - } - if hccurrent[0].Val.Height() >= target { - return - } - var ok2 bool - for { - var headChanges []*api.HeadChange - select { - case headChanges, ok2 = <-headChangeCh: - if !ok2 { // if channel is closed on us fail - bm.t.Log("channel closed") - bm.t.Fatal("chain notify channel closed while waiting to sync") - } - for _, hc := range headChanges { - if hc.Val.Height() >= target { - return - } - } - case <-ctx.Done(): - return - } - } + target = epoch + wait <- success } var success bool @@ -205,8 +174,25 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur }) success = <-wait } - syncedToHeight(baseHeight + 1) - numMined += 1 + + // Wait until it shows up on the given full nodes ChainHead + // TODO this replicates a flaky condition from MineUntil, + // it would be better to use api to wait for sync, + // but currently this is a bit difficult + // and flaky failure is easy to debug and retry + nloops := 200 + for i := 0; i < nloops; i++ { + ts, err := bm.miner.FullNode.ChainHead(ctx) + require.NoError(bm.t, err) + + if ts.Height() == target { + break + } + + require.NotEqual(bm.t, i, nloops-1, "block never managed to sync to node") + time.Sleep(time.Millisecond * 10) + } + switch { case err == nil: // wrap around case ctx.Err() != nil: // context fired. From c309686679c0a6c5158a700a91fd1c64e8081901 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 08:53:22 +0530 Subject: [PATCH 152/157] Fix TooManyMarkedForUpgrade --- extern/storage-sealing/upgrade_queue.go | 1 - itests/ccupgrade_test.go | 27 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/extern/storage-sealing/upgrade_queue.go b/extern/storage-sealing/upgrade_queue.go index aab1e67b0..1aacc9c08 100644 --- a/extern/storage-sealing/upgrade_queue.go +++ b/extern/storage-sealing/upgrade_queue.go @@ -107,7 +107,6 @@ func (m *Sealing) MarkForSnapUpgrade(ctx context.Context, id abi.SectorNumber) e "Upgrade expiration before marking for upgrade", id, onChainInfo.Expiration) } - log.Errorf("updating sector number %d", id) return m.sectors.Send(uint64(id), SectorStartCCUpdate{}) } diff --git a/itests/ccupgrade_test.go b/itests/ccupgrade_test.go index 487a15659..b63e96d24 100644 --- a/itests/ccupgrade_test.go +++ b/itests/ccupgrade_test.go @@ -9,6 +9,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" @@ -33,7 +34,7 @@ func TestCCUpgrade(t *testing.T) { func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullNode { ctx := context.Background() - blockTime := 5 * time.Millisecond + blockTime := 1 * time.Millisecond client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) ens.InterconnectAll().BeginMiningMustPost(blockTime) @@ -50,7 +51,6 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullN // this gives max time for post to complete minimizing chances of timeout // waitForDeadline(ctx, t, 1, client, maddr) miner.PledgeSectors(ctx, 1, 0, nil) - sl, err := miner.SectorsList(ctx) require.NoError(t, err) require.Len(t, sl, 1, "expected 1 sector") @@ -60,7 +60,6 @@ func runTestCCUpgrade(t *testing.T, upgradeHeight abi.ChainEpoch) *kit.TestFullN require.NoError(t, err) require.Less(t, 50000, int(si.Expiration)) } - waitForSectorActive(ctx, t, CCUpgrade, client, maddr) err = miner.SectorMarkForUpgrade(ctx, sl[0], true) @@ -111,6 +110,18 @@ func waitForSectorActive(ctx context.Context, t *testing.T, sn abi.SectorNumber, } } +func waitForSectorStartUpgrade(ctx context.Context, t *testing.T, sn abi.SectorNumber, miner *kit.TestMiner) { + for { + si, err := miner.StorageMiner.SectorsStatus(ctx, sn, false) + require.NoError(t, err) + if si.State != api.SectorState("Proving") { + t.Logf("Done proving sector in state: %s", si.State) + return + } + + } +} + func TestCCUpgradeAndPoSt(t *testing.T) { kit.QuietMiningLogs() t.Run("upgrade and then post", func(t *testing.T) { @@ -120,6 +131,8 @@ func TestCCUpgradeAndPoSt(t *testing.T) { require.NoError(t, err) start := ts.Height() // wait for a full proving period + t.Log("waiting for chain") + n.WaitTillChain(ctx, func(ts *types.TipSet) bool { if ts.Height() > start+abi.ChainEpoch(2880) { return true @@ -133,10 +146,10 @@ func TestTooManyMarkedForUpgrade(t *testing.T) { kit.QuietMiningLogs() ctx := context.Background() - blockTime := 5 * time.Millisecond + blockTime := 1 * time.Millisecond client, miner, ens := kit.EnsembleMinimal(t, kit.GenesisNetworkVersion(network.Version15)) - ens.InterconnectAll().BeginMining(blockTime) + ens.InterconnectAll().BeginMiningMustPost(blockTime) maddr, err := miner.ActorAddress(ctx) if err != nil { @@ -166,8 +179,10 @@ func TestTooManyMarkedForUpgrade(t *testing.T) { err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+1, true) require.NoError(t, err) + waitForSectorStartUpgrade(ctx, t, CCUpgrade, miner) + waitForSectorStartUpgrade(ctx, t, CCUpgrade+1, miner) + err = miner.SectorMarkForUpgrade(ctx, CCUpgrade+2, true) require.Error(t, err) assert.Contains(t, err.Error(), "no free resources to wait for deals") - } From 825e2c9527dba03a7c45160c40df39eda0a39647 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 09:12:00 +0530 Subject: [PATCH 153/157] doscgen cli --- documentation/en/cli-lotus-miner.md | 50 ++++++++++++------- documentation/en/cli-lotus-worker.md | 2 + .../en/default-lotus-miner-config.toml | 3 -- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index e609a8a01..856202f7f 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1514,24 +1514,25 @@ USAGE: lotus-miner sectors command [command options] [arguments...] COMMANDS: - status Get the seal status of a sector by its number - list List sectors - refs List References to sectors - update-state ADVANCED: manually update the state of a sector, this may aid in error recovery - pledge store random data in a sector - check-expire Inspect expiring sectors - expired Get or cleanup expired sectors - renew Renew expiring sectors while not exceeding each sector's max life - extend Extend sector expiration - terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) - remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) - snap-up Mark a committed capacity sector to be filled with deals - mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals - seal Manually start sealing a sector (filling any unused space with junk) - set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts - get-cc-collateral Get the collateral required to pledge a committed capacity sector - batching manage batch sector operations - help, h Shows a list of commands or help for one command + status Get the seal status of a sector by its number + list List sectors + refs List References to sectors + update-state ADVANCED: manually update the state of a sector, this may aid in error recovery + pledge store random data in a sector + check-expire Inspect expiring sectors + expired Get or cleanup expired sectors + renew Renew expiring sectors while not exceeding each sector's max life + extend Extend sector expiration + terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) + remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) + snap-up Mark a committed capacity sector to be filled with deals + mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals + seal Manually start sealing a sector (filling any unused space with junk) + set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts + get-cc-collateral Get the collateral required to pledge a committed capacity sector + batching manage batch sector operations + match-pending-pieces force a refreshed match of pending pieces to open sectors without manually waiting for more deals + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -1860,6 +1861,19 @@ OPTIONS: ``` +### lotus-miner sectors match-pending-pieces +``` +NAME: + lotus-miner sectors match-pending-pieces - force a refreshed match of pending pieces to open sectors without manually waiting for more deals + +USAGE: + lotus-miner sectors match-pending-pieces [command options] [arguments...] + +OPTIONS: + --help, -h show help (default: false) + +``` + ## lotus-miner proving ``` NAME: diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index ac133f908..c03a8e342 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -44,6 +44,8 @@ OPTIONS: --unseal enable unsealing (32G sectors: 1 core, 128GiB Memory) (default: true) --precommit2 enable precommit2 (32G sectors: all cores, 96GiB Memory) (default: true) --commit enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap) (default: true) + --replica-update enable replica update (default: true) + --prove-replica-update2 enable prove replica update 2 (default: true) --parallel-fetch-limit value maximum fetch operations to run in parallel (default: 5) --timeout value used when 'listen' is unspecified. must be a valid duration recognized by golang's time.ParseDuration function (default: "30m") --help, -h show help (default: false) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index ced8e8a39..55ddbb054 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -427,9 +427,6 @@ # env var: LOTUS_STORAGE_ALLOWREPLICAUPDATE #AllowReplicaUpdate = true - # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE1 - #AllowProveReplicaUpdate1 = true - # env var: LOTUS_STORAGE_ALLOWPROVEREPLICAUPDATE2 #AllowProveReplicaUpdate2 = true From d16c5d0e93947921be09e5c4d5f302855a4bfeda Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 10 Jan 2022 15:47:20 +0530 Subject: [PATCH 154/157] Fix hande deal recover return value bug --- extern/storage-sealing/states_failed.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/storage-sealing/states_failed.go b/extern/storage-sealing/states_failed.go index a93cda3f5..0d7c08ce5 100644 --- a/extern/storage-sealing/states_failed.go +++ b/extern/storage-sealing/states_failed.go @@ -423,7 +423,7 @@ func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, secto // TODO: check if we are in an early enough state try to remove this piece log.Errorf("can't fix sector deals: piece %d (of %d) of sector %d has nil DealInfo.PublishCid (refers to deal %d)", i, len(sector.Pieces), sector.SectorNumber, p.DealInfo.DealID) // Not much to do here (and this can only happen for old spacerace sectors) - return ctx.Send(SectorRemove{}) + return ctx.Send(failWith) } var dp *market.DealProposal @@ -458,7 +458,7 @@ func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, secto if len(failed)+paddingPieces == len(sector.Pieces) { log.Errorf("removing sector %d: all deals expired or unrecoverable: %+v", sector.SectorNumber, merr) - return ctx.Send(SectorRemove{}) + return ctx.Send(failWith) } // todo: try to remove bad pieces (hard; see the todo above) @@ -466,7 +466,7 @@ func (m *Sealing) handleRecoverDealIDsOrFailWith(ctx statemachine.Context, secto // for now removing sectors is probably better than having them stuck in RecoverDealIDs // and expire anyways log.Errorf("removing sector %d: deals expired or unrecoverable: %+v", sector.SectorNumber, merr) - return ctx.Send(SectorRemove{}) + return ctx.Send(failWith) } // Not much to do here, we can't go back in time to commit this sector From 9614f6db8d64c444fc1a657f9bcbec2aab13f83b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 10 Jan 2022 19:03:26 -0500 Subject: [PATCH 155/157] Update go-paramfetch --- go.mod | 2 +- go.sum | 4 ++-- testplans/lotus-soup/go.sum | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 551af628d..8d3994463 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/filecoin-project/go-fil-markets v1.14.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 - github.com/filecoin-project/go-paramfetch v0.0.2 + github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 diff --git a/go.sum b/go.sum index 45625140b..2d35878ce 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= -github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 210cf03ad..2b150009a 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -429,8 +429,8 @@ github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.m github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= -github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= +github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= From 960759d22b17b74a9c7422a6104ed0a945893a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 11 Jan 2022 17:31:27 +0100 Subject: [PATCH 156/157] address review --- api/version.go | 4 ++-- cmd/lotus-seal-worker/main.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/version.go b/api/version.go index 0be7de878..228dcbd10 100644 --- a/api/version.go +++ b/api/version.go @@ -54,8 +54,8 @@ func VersionForType(nodeType NodeType) (Version, error) { // semver versions of the rpc api exposed var ( - FullAPIVersion0 = newVer(1, 4, 0) - FullAPIVersion1 = newVer(2, 1, 0) + FullAPIVersion0 = newVer(1, 5, 0) + FullAPIVersion1 = newVer(2, 2, 0) MinerAPIVersion0 = newVer(1, 3, 0) WorkerAPIVersion0 = newVer(1, 5, 0) diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index e6d6c0b6f..2e326e9c7 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -261,7 +261,7 @@ var runCmd = &cli.Command{ var taskTypes []sealtasks.TaskType - taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize) + taskTypes = append(taskTypes, sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTProveReplicaUpdate1, sealtasks.TTFinalize) if cctx.Bool("addpiece") { taskTypes = append(taskTypes, sealtasks.TTAddPiece) From d645c5fbabe2c087c21058d7a5eeda09da7a0f0a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 11:53:14 -0500 Subject: [PATCH 157/157] Remove unnecessary params from VerifyWinningPost --- build/openrpc/worker.json.gz | Bin 3805 -> 3803 bytes chain/consensus/filcns/filecoin.go | 2 +- chain/gen/gen.go | 2 +- cmd/lotus-bench/caching_verifier.go | 6 +++--- cmd/lotus-bench/main.go | 4 ++-- cmd/lotus-sim/simulation/mock/mock.go | 3 +-- documentation/en/api-v0-methods-miner.md | 2 +- documentation/en/api-v0-methods-worker.md | 2 +- documentation/en/api-v0-methods.md | 2 +- documentation/en/api-v1-unstable-methods.md | 2 +- extern/sector-storage/ffiwrapper/types.go | 3 +-- .../sector-storage/ffiwrapper/verifier_cgo.go | 3 +-- extern/sector-storage/mock/mock.go | 3 +-- storage/wdpost_run_test.go | 2 +- testplans/lotus-soup/go.sum | 12 +++++------- 15 files changed, 21 insertions(+), 27 deletions(-) diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c82ad677093007288784c12142827b97d9bd444d..edfabcc6b998b81113797881dd01f4390b022998 100644 GIT binary patch delta 101 zcmV-r0Gj{Z9orqSehyuGTL6MR707PI$@V{y&3+4Q%mhVpS*}zlE0@2P#kO7jO4BbF zzZI#m({wnWU(f#^00960$ye0t HD9Hc-DFiMB delta 103 zcmV-t0GR*V9o-$Uehy!CZMd-~-BW?=R-A1A6WQ#y(8f$qB$wq%g|c$_YgugD)vq-D za`9V{8atkOOF>AO?Ep5#0R||*fW-TB6a*n5(eB=s68qYgqcly2^ZE7s{{a91|Njdk J5%ws_008ZWG;RO@ diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index e112e2bf9..42020d529 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -419,7 +419,7 @@ func (filec *FilecoinEC) VerifyWinningPoStProof(ctx context.Context, nv network. Proofs: h.WinPoStProof, ChallengedSectors: sectors, Prover: abi.ActorID(mid), - }, h.Height, nv) + }) if err != nil { return xerrors.Errorf("failed to verify election post: %w", err) } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index 4bf8dbc12..4153830dc 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -692,7 +692,7 @@ func (m genFakeVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (b panic("not supported") } -func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (m genFakeVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { panic("not supported") } diff --git a/cmd/lotus-bench/caching_verifier.go b/cmd/lotus-bench/caching_verifier.go index 9fd6a33f7..0fddf515d 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -8,7 +8,6 @@ import ( proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" "github.com/ipfs/go-datastore" @@ -87,9 +86,10 @@ func (cv *cachingVerifier) VerifySeal(svi proof2.SealVerifyInfo) (bool, error) { }, &svi) } -func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { - return cv.backend.VerifyWinningPoSt(ctx, info, poStEpoch, nv) +func (cv *cachingVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { + return cv.backend.VerifyWinningPoSt(ctx, info) } + func (cv *cachingVerifier) VerifyWindowPoSt(ctx context.Context, info proof2.WindowPoStVerifyInfo) (bool, error) { return cv.withCache(func() (bool, error) { return cv.backend.VerifyWindowPoSt(ctx, info) diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index 8893e7b8e..b0e71b90e 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -377,7 +377,7 @@ var sealBenchCmd = &cli.Command{ ChallengedSectors: candidates, Prover: mid, } - ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1, 0, build.NewestNetworkVersion) + ok, err := ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi1) if err != nil { return err } @@ -394,7 +394,7 @@ var sealBenchCmd = &cli.Command{ Prover: mid, } - ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2, 0, build.NewestNetworkVersion) + ok, err = ffiwrapper.ProofVerifier.VerifyWinningPoSt(context.TODO(), pvi2) if err != nil { return err } diff --git a/cmd/lotus-sim/simulation/mock/mock.go b/cmd/lotus-sim/simulation/mock/mock.go index 70f9ba550..b1d36ba48 100644 --- a/cmd/lotus-sim/simulation/mock/mock.go +++ b/cmd/lotus-sim/simulation/mock/mock.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -79,7 +78,7 @@ func (mockVerifier) VerifyReplicaUpdate(update proof7.ReplicaUpdateInfo) (bool, return false, nil } -func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (mockVerifier) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { panic("should not be called") } func (mockVerifier) VerifyWindowPoSt(ctx context.Context, info proof5.WindowPoStVerifyInfo) (bool, error) { diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 272734c56..caf0419fe 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -216,7 +216,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328, + "APIVersion": 131584, "BlockDelay": 42 } ``` diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 566a650fa..f2d9019e2 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -741,7 +741,7 @@ Perms: admin Inputs: `null` -Response: `131328` +Response: `131584` ## Add diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 8f851e319..88c4d8187 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -283,7 +283,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328, + "APIVersion": 131584, "BlockDelay": 42 } ``` diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 8aa2bfdd2..7d5f4665e 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -289,7 +289,7 @@ Response: ```json { "Version": "string value", - "APIVersion": 131328, + "APIVersion": 131584, "BlockDelay": 42 } ``` diff --git a/extern/sector-storage/ffiwrapper/types.go b/extern/sector-storage/ffiwrapper/types.go index 78d2c6eca..b8d9e90f1 100644 --- a/extern/sector-storage/ffiwrapper/types.go +++ b/extern/sector-storage/ffiwrapper/types.go @@ -9,7 +9,6 @@ import ( "github.com/ipfs/go-cid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper/basicfs" @@ -38,7 +37,7 @@ type Verifier interface { VerifySeal(proof.SealVerifyInfo) (bool, error) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) - VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, v network.Version) (bool, error) + VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) GenerateWinningPoStSectorChallenge(context.Context, abi.RegisteredPoStProof, abi.ActorID, abi.PoStRandomness, uint64) ([]uint64, error) diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index be38189f1..6adda05c9 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -11,7 +11,6 @@ import ( ffi "github.com/filecoin-project/filecoin-ffi" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" ffiproof "github.com/filecoin-project/specs-actors/v5/actors/runtime/proof" "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" "github.com/filecoin-project/specs-storage/storage" @@ -149,7 +148,7 @@ func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, return ffi.SectorUpdate.VerifyUpdateProof(update) } -func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, version network.Version) (bool, error) { +func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f _, span := trace.StartSpan(ctx, "VerifyWinningPoSt") defer span.End() diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index 7ef780087..c99af89e7 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -16,7 +16,6 @@ import ( ffiwrapper2 "github.com/filecoin-project/go-commp-utils/ffiwrapper" commcid "github.com/filecoin-project/go-fil-commcid" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/specs-storage/storage" "github.com/ipfs/go-cid" logging "github.com/ipfs/go-log/v2" @@ -671,7 +670,7 @@ func (m mockVerifProver) aggLen(nproofs int) int { } } -func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo, poStEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (m mockVerifProver) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) { info.Randomness[31] &= 0x3f return true, nil } diff --git a/storage/wdpost_run_test.go b/storage/wdpost_run_test.go index feeaab6ed..f3ea5836b 100644 --- a/storage/wdpost_run_test.go +++ b/storage/wdpost_run_test.go @@ -132,7 +132,7 @@ func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, si type mockVerif struct { } -func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo, currEpoch abi.ChainEpoch, nv network.Version) (bool, error) { +func (m mockVerif) VerifyWinningPoSt(ctx context.Context, info proof7.WinningPoStVerifyInfo) (bool, error) { panic("implement me") } diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 210cf03ad..3fda5f7ea 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -432,7 +432,6 @@ github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MU github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= -github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -448,7 +447,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -467,10 +465,11 @@ github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVi github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-actors/v7 v7.0.0-20211117170924-fd07a4c7dff9/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec h1:KV9vE+Sl2Y3qKsrpba4HcE7wHwK7v6O5U/S0xHbje6A= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211118013026-3dce48197cec/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff h1:JO62nquOGhjoDf9+JkAcV+wsD5yhoyIKOMj70ZNdD3Q= -github.com/filecoin-project/specs-storage v0.1.1-0.20211213202648-f14267c929ff/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h1:MS1mtAhZh0iSE7OxP1bb6+UNyYKsxg8n51FpHlX1d54= +github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= +github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= @@ -943,7 +942,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE=