From 3e3bd52c511d938804ec642a6aeaa16a99bce31d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 4 Nov 2021 15:59:29 +0000 Subject: [PATCH 001/129] Integrate v7 actors --- build/openrpc/full.json.gz | Bin 25685 -> 25685 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.sum | 429 ++++++------- 60 files changed, 2677 insertions(+), 317 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 9c8692acc79207fa711c42af66039d0af898e702..abed1ebd0f5dc871db65ebcacc112a65c9fb7633 100644 GIT binary patch delta 5130 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 delta 5129 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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 2e57b8d7d..6f3cdd020 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -4699,7 +4699,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 1a14dbd71..27b11f528 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -4982,7 +4982,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 8eaed54f6..7397ccddc 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" "github.com/filecoin-project/dagstore/mount" @@ -558,6 +560,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 15586dc89..8cabc1fa8 100644 --- a/go.mod +++ b/go.mod @@ -51,6 +51,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 12fe4eabf..90dce9837 100644 --- a/go.sum +++ b/go.sum @@ -392,8 +392,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.sum b/testplans/lotus-soup/go.sum index 70da04be2..1f9a37b85 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.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= @@ -385,9 +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.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= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -404,26 +398,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/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/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= 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.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= @@ -433,13 +425,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.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= 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= @@ -447,41 +438,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= -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.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= -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-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/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/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 +483,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 +496,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= @@ -535,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= @@ -661,6 +656,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 +696,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 +773,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 +880,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 +899,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 +907,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 +923,34 @@ 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= -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/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.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 +965,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,23 +987,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= -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= @@ -1036,15 +1026,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 +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.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-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= @@ -1070,34 +1059,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= -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/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= -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/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= -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 +1090,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 +1112,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 +1166,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 +1182,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 +1208,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 +1224,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 +1245,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 +1269,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 +1301,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 +1317,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 +1326,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 +1346,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 +1373,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 +1418,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 +1432,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 +1463,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 +1483,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 +1503,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 +1526,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 +1548,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 +1590,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 +1644,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 +1733,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 +1744,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 +1882,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 +1919,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 +1929,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 +1944,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 +2120,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= @@ -2174,6 +2173,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= @@ -2209,13 +2209,28 @@ 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 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= 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 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= @@ -2287,7 +2302,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= @@ -2310,8 +2324,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= @@ -2327,7 +2342,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 +2372,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 +2425,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= @@ -2431,9 +2442,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= +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= +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= @@ -2562,6 +2575,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= @@ -2569,10 +2583,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= -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= @@ -2669,16 +2685,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= @@ -2755,7 +2770,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 +2881,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= @@ -2890,4 +2907,4 @@ 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= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= \ No newline at end of file From b44596e48ff76122fa498fb61aba9e66c9fe4a0b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 16 Nov 2021 19:09:10 -0500 Subject: [PATCH 002/129] 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 8cabc1fa8..d5ae9b750 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,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 90dce9837..808dd8a0f 100644 --- a/go.sum +++ b/go.sum @@ -364,6 +364,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= @@ -395,10 +396,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 27e21e8db91f69abaf8b0c1d19f48475762d56d5 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 12:41:42 -0500 Subject: [PATCH 003/129] 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 7397ccddc..dcf9be4bd 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -560,9 +560,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 d5ae9b750..71de44fd6 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,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 808dd8a0f..b736807ca 100644 --- a/go.sum +++ b/go.sum @@ -364,7 +364,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= @@ -390,14 +389,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 7884f3ec82ba44b381ea4bc84fdd4e7a984939f8 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 17:50:36 -0500 Subject: [PATCH 004/129] 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 9007be1aecf9ff4a7ac796750852ccdc6533b46a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 17 Nov 2021 20:33:18 -0500 Subject: [PATCH 005/129] Update actors --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 71de44fd6..b42ad4c22 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,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 b736807ca..96ed00772 100644 --- a/go.sum +++ b/go.sum @@ -394,8 +394,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 0fc5626b3b83f75fca474800f1f443ba68e6c8d3 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 18 Nov 2021 18:35:06 -0500 Subject: [PATCH 006/129] Address review --- build/openrpc/full.json.gz | Bin 25685 -> 25697 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 abed1ebd0f5dc871db65ebcacc112a65c9fb7633..e1f6e980f37d4635ed9a62ae241b829823b124e4 100644 GIT binary patch delta 25184 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 Date: Wed, 10 Nov 2021 13:53:00 -0500 Subject: [PATCH 007/129] 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 25697 -> 25699 bytes build/openrpc/miner.json.gz | Bin 11148 -> 11351 bytes build/openrpc/worker.json.gz | Bin 3398 -> 3622 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 feb08531f..4e752e245 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -718,10 +718,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"` @@ -861,10 +867,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"` @@ -4229,6 +4241,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 @@ -4251,6 +4285,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 @@ -4922,6 +4967,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 @@ -4944,6 +5011,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 e1f6e980f37d4635ed9a62ae241b829823b124e4..ff564764883212634b4a71e384d4f1a5850a2b9e 100644 GIT binary patch delta 20791 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index c2707bfa08bc9971829ca3c989de705be6831657..bf64392408e87027d6cfb68de46e1494ab612fbf 100644 GIT binary patch delta 10951 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 delta 10747 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 literal 3398 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 diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 3d27f0c75..fd143d2aa 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -95,8 +95,11 @@ * [ReturnFetch](#ReturnFetch) * [ReturnFinalizeSector](#ReturnFinalizeSector) * [ReturnMoveStorage](#ReturnMoveStorage) + * [ReturnProveReplicaUpdate1](#ReturnProveReplicaUpdate1) + * [ReturnProveReplicaUpdate2](#ReturnProveReplicaUpdate2) * [ReturnReadPiece](#ReturnReadPiece) * [ReturnReleaseUnsealed](#ReturnReleaseUnsealed) + * [ReturnReplicaUpdate](#ReturnReplicaUpdate) * [ReturnSealCommit1](#ReturnSealCommit1) * [ReturnSealCommit2](#ReturnSealCommit2) * [ReturnSealPreCommit1](#ReturnSealPreCommit1) @@ -1485,6 +1488,56 @@ Inputs: Response: `{}` +### ReturnProveReplicaUpdate1 + + +Perms: admin + +Inputs: +```json +[ + { + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" + }, + null, + { + "Code": 0, + "Message": "string value" + } +] +``` + +Response: `{}` + +### ReturnProveReplicaUpdate2 + + +Perms: admin + +Inputs: +```json +[ + { + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" + }, + null, + { + "Code": 0, + "Message": "string value" + } +] +``` + +Response: `{}` + ### ReturnReadPiece @@ -1534,6 +1587,38 @@ Inputs: Response: `{}` +### ReturnReplicaUpdate + + +Perms: admin + +Inputs: +```json +[ + { + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" + }, + { + "NewSealed": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "NewUnsealed": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } + }, + { + "Code": 0, + "Message": "string value" + } +] +``` + +Response: `{}` + ### ReturnSealCommit1 diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 7a1c2e2f2..acbae1060 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -15,8 +15,13 @@ * [MoveStorage](#MoveStorage) * [Process](#Process) * [ProcessSession](#ProcessSession) +* [Prove](#Prove) + * [ProveReplicaUpdate1](#ProveReplicaUpdate1) + * [ProveReplicaUpdate2](#ProveReplicaUpdate2) * [Release](#Release) * [ReleaseUnsealed](#ReleaseUnsealed) +* [Replica](#Replica) + * [ReplicaUpdate](#ReplicaUpdate) * [Seal](#Seal) * [SealCommit1](#SealCommit1) * [SealCommit2](#SealCommit2) @@ -839,12 +844,125 @@ Inputs: `null` Response: `"07070707-0707-0707-0707-070707070707"` +## Prove + + +### ProveReplicaUpdate1 + + +Perms: admin + +Inputs: +```json +[ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" +} +``` + +### ProveReplicaUpdate2 + + +Perms: admin + +Inputs: +```json +[ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + null +] +``` + +Response: +```json +{ + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" +} +``` + ## Release ### ReleaseUnsealed +Perms: admin + +Inputs: +```json +[ + { + "ID": { + "Miner": 1000, + "Number": 9 + }, + "ProofType": 8 + }, + null +] +``` + +Response: +```json +{ + "Sector": { + "Miner": 1000, + "Number": 9 + }, + "ID": "07070707-0707-0707-0707-070707070707" +} +``` + +## Replica + + +### ReplicaUpdate + + Perms: admin Inputs: diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 58c014a42..b1a66cfd1 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 58c014a42b7a21e73560879841a71e679126a852 +Subproject commit b1a66cfd12686a8af6030fccace49916849b1954 diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 61aceadaf..6a6e3f56c 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -24,6 +24,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-storage/storage" + "github.com/detailyang/go-fallocate" commpffi "github.com/filecoin-project/go-commp-utils/ffiwrapper" "github.com/filecoin-project/go-commp-utils/zerocomm" "github.com/filecoin-project/lotus/extern/sector-storage/fr32" @@ -639,6 +640,88 @@ func (sb *Sealer) SealCommit2(ctx context.Context, sector storage.SectorRef, pha return ffi.SealCommitPhase2(phase1Out, sector.ID.Number, sector.ID.Miner) } +func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, pieces []abi.PieceInfo) (storage.ReplicaUpdateOut, error) { + empty := storage.ReplicaUpdateOut{} + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache, storiface.FTUpdate|storiface.FTUpdateCache, storiface.PathSealing) + if err != nil { + return empty, xerrors.Errorf("failed to acquire sector paths: %w", err) + } + defer done() + + updateProofType := abi.SealProofInfos[sector.ProofType].UpdateProof + + s, err := os.Stat(paths.Sealed) + if err != nil { + return empty, err + } + sealedSize := s.Size() + + u, err := os.OpenFile(paths.Update, os.O_RDWR|os.O_CREATE, 0644) // nolint:gosec + if err != nil { + return empty, xerrors.Errorf("ensuring updated replica file exists: %w", err) + } + if err := fallocate.Fallocate(u, 0, sealedSize); err != nil { + return empty, xerrors.Errorf("allocating space for replica update file: %w", err) + } + + if err := u.Close(); err != nil { + return empty, err + } + + if err := os.Mkdir(paths.UpdateCache, 0755); err != nil { // nolint + if os.IsExist(err) { + log.Warnf("existing cache in %s; removing", paths.Cache) + + if err := os.RemoveAll(paths.UpdateCache); err != nil { + return empty, xerrors.Errorf("remove existing sector cache from %s (sector %d): %w", paths.Cache, sector, err) + } + + if err := os.Mkdir(paths.UpdateCache, 0755); err != nil { // nolint:gosec + return empty, xerrors.Errorf("mkdir cache path after cleanup: %w", err) + } + } else { + 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) + } + + return storage.ReplicaUpdateOut{NewSealed: sealed, NewUnsealed: unsealed}, nil +} + +func (sb *Sealer) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storage.ReplicaVanillaProofs, error) { + paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTCache|storiface.FTUpdateCache|storiface.FTUpdate, storiface.FTNone, storiface.PathSealing) + if err != nil { + return nil, xerrors.Errorf("failed to acquire sector paths: %w", err) + } + defer done() + + updateProofType := abi.SealProofInfos[sector.ProofType].UpdateProof + + vanillaProofs, err := ffi.SectorUpdate.GenerateUpdateVanillaProofs(updateProofType, sectorKey, newSealed, newUnsealed, paths.Update, paths.UpdateCache, paths.Sealed, paths.Cache) + if err != nil { + return nil, xerrors.Errorf("failed to generate proof of replica update for sector %d: %w", sector.ID.Number, err) + } + return vanillaProofs, nil +} + +func (sb *Sealer) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storage.ReplicaUpdateProof, error) { + updateProofType := abi.SealProofInfos[sector.ProofType].UpdateProof + return ffi.SectorUpdate.GenerateUpdateProofWithVanilla(updateProofType, sectorKey, newSealed, newUnsealed, vanillaProofs) +} + +func (sb *Sealer) ReleaseSealed(ctx context.Context, sector storage.SectorRef) error { + return xerrors.Errorf("not supported at this layer") +} + func (sb *Sealer) FinalizeSector(ctx context.Context, sector storage.SectorRef, keepUnsealed []storage.Range) error { ssize, err := sector.ProofType.SectorSize() if err != nil { diff --git a/extern/sector-storage/ffiwrapper/verifier_cgo.go b/extern/sector-storage/ffiwrapper/verifier_cgo.go index 94e04f26a..66064b1f3 100644 --- a/extern/sector-storage/ffiwrapper/verifier_cgo.go +++ b/extern/sector-storage/ffiwrapper/verifier_cgo.go @@ -6,14 +6,13 @@ package ffiwrapper import ( "context" - proof7 "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - "go.opencensus.io/trace" "golang.org/x/xerrors" 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/specs-storage/storage" "github.com/filecoin-project/lotus/extern/sector-storage/storiface" diff --git a/extern/sector-storage/manager.go b/extern/sector-storage/manager.go index fb081ee5d..14ef94b1e 100644 --- a/extern/sector-storage/manager.go +++ b/extern/sector-storage/manager.go @@ -573,6 +573,10 @@ 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) Remove(ctx context.Context, sector storage.SectorRef) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -596,6 +600,151 @@ func (m *Manager) Remove(ctx context.Context, sector storage.SectorRef) error { return err } +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() + + wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTReplicaUpdate, sector, pieces) + if err != nil { + return storage.ReplicaUpdateOut{}, xerrors.Errorf("getWork: %w", err) + } + defer cancel() + + var waitErr error + waitRes := func() { + p, werr := m.waitWork(ctx, wk) + if werr != nil { + waitErr = werr + return + } + if p != nil { + out = p.(storage.ReplicaUpdateOut) + } + } + + if wait { // already in progress + waitRes() + return out, waitErr + } + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTSealed|storiface.FTCache, storiface.FTUpdate|storiface.FTUpdateCache); err != nil { + return storage.ReplicaUpdateOut{}, xerrors.Errorf("acquiring sector lock: %w", err) + } + + 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 { + + err := m.startWork(ctx, w, wk)(w.ReplicaUpdate(ctx, sector, pieces)) + if err != nil { + return err + } + + waitRes() + return nil + }) + if err != nil { + return storage.ReplicaUpdateOut{}, err + } + return out, waitErr +} + +func (m *Manager) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (out storage.ReplicaVanillaProofs, err error) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTProveReplicaUpdate1, sector, sectorKey, newSealed, newUnsealed) + if err != nil { + return nil, xerrors.Errorf("getWork: %w", err) + } + defer cancel() + + var waitErr error + waitRes := func() { + p, werr := m.waitWork(ctx, wk) + if werr != nil { + waitErr = werr + return + } + if p != nil { + out = p.(storage.ReplicaVanillaProofs) + } + } + + if wait { // already in progress + waitRes() + return out, waitErr + } + + if err := m.index.StorageLock(ctx, sector.ID, storiface.FTSealed|storiface.FTUpdate|storiface.FTCache|storiface.FTUpdateCache, storiface.FTNone); err != nil { + return nil, xerrors.Errorf("acquiring sector lock: %w", err) + } + + selector := newExistingSelector(m.index, sector.ID, storiface.FTUpdate|storiface.FTUpdateCache|storiface.FTSealed|storiface.FTCache, true) + + err = m.sched.Schedule(ctx, sector, sealtasks.TTProveReplicaUpdate1, selector, m.schedFetch(sector, storiface.FTSealed, storiface.PathSealing, storiface.AcquireCopy), func(ctx context.Context, w Worker) error { + + err := m.startWork(ctx, w, wk)(w.ProveReplicaUpdate1(ctx, sector, sectorKey, newSealed, newUnsealed)) + if err != nil { + return err + } + + waitRes() + return nil + }) + if err != nil { + return nil, err + } + + return out, waitErr +} + +func (m *Manager) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (out storage.ReplicaUpdateProof, err error) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + wk, wait, cancel, err := m.getWork(ctx, sealtasks.TTProveReplicaUpdate2, sector, sectorKey, newSealed, newUnsealed, vanillaProofs) + if err != nil { + return nil, xerrors.Errorf("getWork: %w", err) + } + defer cancel() + + var waitErr error + waitRes := func() { + p, werr := m.waitWork(ctx, wk) + if werr != nil { + waitErr = werr + return + } + if p != nil { + out = p.(storage.ReplicaUpdateProof) + } + } + + if wait { // already in progress + waitRes() + return out, waitErr + } + + selector := newTaskSelector() + + err = m.sched.Schedule(ctx, sector, sealtasks.TTProveReplicaUpdate2, selector, schedNop, func(ctx context.Context, w Worker) error { + err := m.startWork(ctx, w, wk)(w.ProveReplicaUpdate2(ctx, sector, sectorKey, newSealed, newUnsealed, vanillaProofs)) + if err != nil { + return err + } + + waitRes() + return nil + }) + + if err != nil { + return nil, err + } + + return out, waitErr +} + func (m *Manager) ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error { return m.returnResult(ctx, callID, pi, err) } @@ -624,6 +773,18 @@ func (m *Manager) ReturnReleaseUnsealed(ctx context.Context, callID storiface.Ca return m.returnResult(ctx, callID, nil, err) } +func (m *Manager) ReturnReplicaUpdate(ctx context.Context, callID storiface.CallID, out storage.ReplicaUpdateOut, err *storiface.CallError) error { + return m.returnResult(ctx, callID, out, err) +} + +func (m *Manager) ReturnProveReplicaUpdate1(ctx context.Context, callID storiface.CallID, out storage.ReplicaVanillaProofs, err *storiface.CallError) error { + return m.returnResult(ctx, callID, out, err) +} + +func (m *Manager) ReturnProveReplicaUpdate2(ctx context.Context, callID storiface.CallID, proof storage.ReplicaUpdateProof, err *storiface.CallError) error { + return m.returnResult(ctx, callID, proof, 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_calltracker.go b/extern/sector-storage/manager_calltracker.go index 332a08817..7c8703e89 100644 --- a/extern/sector-storage/manager_calltracker.go +++ b/extern/sector-storage/manager_calltracker.go @@ -385,7 +385,6 @@ func (m *Manager) returnResult(ctx context.Context, callID storiface.CallID, r i if ok { return xerrors.Errorf("result for call %v already reported", wid) } - m.results[wid] = res err := m.work.Get(wid).Mutate(func(ws *WorkState) error { diff --git a/extern/sector-storage/manager_test.go b/extern/sector-storage/manager_test.go index 4a8ca5f22..59db66bac 100644 --- a/extern/sector-storage/manager_test.go +++ b/extern/sector-storage/manager_test.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "io" "io/ioutil" "os" "path/filepath" @@ -17,10 +18,12 @@ import ( "github.com/google/uuid" "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-statestore" + proof7 "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" @@ -65,11 +68,11 @@ 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) - } - } + // for _, path := range t.StoragePaths { + // if err := os.RemoveAll(path.Path); err != nil { + // fmt.Println("Cleanup error:", err) + // } + // } } func (t testStorage) GetStorage() (stores.StorageConfig, error) { @@ -162,6 +165,132 @@ func TestSimple(t *testing.T) { require.NoError(t, err) } +type Reader struct{} + +func (Reader) Read(out []byte) (int, error) { + for i := range out { + out[i] = 0 + } + return len(out), nil +} + +type NullReader struct { + *io.LimitedReader +} + +func NewNullReader(size abi.UnpaddedPieceSize) io.Reader { + return &NullReader{(io.LimitReader(&Reader{}, int64(size))).(*io.LimitedReader)} +} + +func (m NullReader) NullBytes() int64 { + return m.N +} + +func TestSnapDeals(t *testing.T) { + logging.SetAllLoggers(logging.LevelWarn) + ctx := context.Background() + m, lstor, stor, idx, cleanup := newTestMgr(ctx, t, datastore.NewMapDatastore()) + defer cleanup() + + localTasks := []sealtasks.TaskType{ + sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit1, sealtasks.TTCommit2, sealtasks.TTFinalize, + sealtasks.TTFetch, sealtasks.TTReplicaUpdate, sealtasks.TTProveReplicaUpdate1, sealtasks.TTProveReplicaUpdate2, + } + wds := datastore.NewMapDatastore() + + w := NewLocalWorker(WorkerConfig{TaskTypes: localTasks}, stor, lstor, idx, m, statestore.New(wds)) + err := m.AddWorker(ctx, w) + require.NoError(t, err) + + proofType := abi.RegisteredSealProof_StackedDrg2KiBV1 + ptStr := os.Getenv("LOTUS_TEST_SNAP_DEALS_PROOF_TYPE") + switch ptStr { + case "2k": + case "8M": + proofType = abi.RegisteredSealProof_StackedDrg8MiBV1 + case "512M": + proofType = abi.RegisteredSealProof_StackedDrg512MiBV1 + case "32G": + proofType = abi.RegisteredSealProof_StackedDrg32GiBV1 + case "64G": + proofType = abi.RegisteredSealProof_StackedDrg64GiBV1 + default: + log.Warn("Unspecified proof type, make sure to set LOTUS_TEST_SNAP_DEALS_PROOF_TYPE to '2k', '8M', '512M', '32G' or '64G'") + log.Warn("Continuing test with 2k sectors") + } + + sid := storage.SectorRef{ + ID: abi.SectorID{Miner: 1000, Number: 1}, + ProofType: proofType, + } + ss, err := proofType.SectorSize() + require.NoError(t, err) + + unpaddedSectorSize := abi.PaddedPieceSize(ss).Unpadded() + + // Pack sector with no pieces + p0, err := m.AddPiece(ctx, sid, nil, unpaddedSectorSize, NewNullReader(unpaddedSectorSize)) + require.NoError(t, err) + ccPieces := []abi.PieceInfo{p0} + + // Precommit and Seal a CC sector + fmt.Printf("PC1\n") + ticket := abi.SealRandomness{9, 9, 9, 9, 9, 9, 9, 9} + pc1Out, err := m.SealPreCommit1(ctx, sid, ticket, ccPieces) + 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 + sectorKey := pc2Out.Sealed + + // Two pieces each half the size of the sector + unpaddedPieceSize := unpaddedSectorSize / 2 + p1, err := m.AddPiece(ctx, sid, nil, unpaddedPieceSize, strings.NewReader(strings.Repeat("k", int(unpaddedPieceSize)))) + require.NoError(t, err) + require.Equal(t, unpaddedPieceSize.Padded(), p1.Size) + + p2, err := m.AddPiece(ctx, sid, []abi.UnpaddedPieceSize{p1.Size.Unpadded()}, unpaddedPieceSize, strings.NewReader(strings.Repeat("j", int(unpaddedPieceSize)))) + require.NoError(t, err) + require.Equal(t, unpaddedPieceSize.Padded(), p1.Size) + + pieces := []abi.PieceInfo{p1, p2} + fmt.Printf("RU\n") + out, err := m.ReplicaUpdate(ctx, sid, pieces) + require.NoError(t, err) + updateProofType, err := sid.ProofType.RegisteredUpdateProof() + require.NoError(t, err) + require.NotNil(t, out) + fmt.Printf("PR1\n") + vanillaProofs, err := m.ProveReplicaUpdate1(ctx, sid, sectorKey, out.NewSealed, out.NewUnsealed) + require.NoError(t, err) + require.NotNil(t, vanillaProofs) + fmt.Printf("PR2\n") + proof, err := m.ProveReplicaUpdate2(ctx, sid, sectorKey, out.NewSealed, out.NewUnsealed, vanillaProofs) + require.NoError(t, err) + require.NotNil(t, proof) + + vInfo := proof7.ReplicaUpdateInfo{ + Proof: proof, + UpdateProofType: updateProofType, + OldSealedSectorCID: sectorKey, + NewSealedSectorCID: out.NewSealed, + NewUnsealedSectorCID: out.NewUnsealed, + } + pass, err := ffiwrapper.ProofVerifier.VerifyReplicaUpdate(vInfo) + require.NoError(t, err) + assert.True(t, pass) +} + func TestRedoPC1(t *testing.T) { logging.SetAllLoggers(logging.LevelDebug) diff --git a/extern/sector-storage/mock/mock.go b/extern/sector-storage/mock/mock.go index dcf9be4bd..751cc407d 100644 --- a/extern/sector-storage/mock/mock.go +++ b/extern/sector-storage/mock/mock.go @@ -264,6 +264,24 @@ func (mgr *SectorMgr) SealCommit2(ctx context.Context, sid storage.SectorRef, ph return out[:], nil } +func (mgr *SectorMgr) ReplicaUpdate(ctx context.Context, sid storage.SectorRef, pieces []abi.PieceInfo) (storage.ReplicaUpdateOut, error) { + out := storage.ReplicaUpdateOut{} + return out, nil +} + +func (mgr *SectorMgr) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storage.ReplicaVanillaProofs, error) { + out := make([][]byte, 0) + return out, nil +} + +func (mgr *SectorMgr) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (storage.ReplicaUpdateProof, error) { + return make([]byte, 0), nil +} + +func (mgr *SectorMgr) ReleaseSealed(ctx context.Context, sid storage.SectorRef) error { + return nil +} + // Test Instrumentation Methods func (mgr *SectorMgr) MarkFailed(sid storage.SectorRef, failed bool) error { @@ -469,6 +487,8 @@ func (mgr *SectorMgr) CheckProvable(ctx context.Context, pp abi.RegisteredPoStPr return bad, nil } +var _ storiface.WorkerReturn = &SectorMgr{} + func (mgr *SectorMgr) ReturnAddPiece(ctx context.Context, callID storiface.CallID, pi abi.PieceInfo, err *storiface.CallError) error { panic("not supported") } @@ -513,6 +533,18 @@ func (mgr *SectorMgr) ReturnFetch(ctx context.Context, callID storiface.CallID, panic("not supported") } +func (mgr *SectorMgr) ReturnReplicaUpdate(ctx context.Context, callID storiface.CallID, out storage.ReplicaUpdateOut, err *storiface.CallError) error { + panic("not supported") +} + +func (mgr *SectorMgr) ReturnProveReplicaUpdate1(ctx context.Context, callID storiface.CallID, out storage.ReplicaVanillaProofs, err *storiface.CallError) error { + panic("not supported") +} + +func (mgr *SectorMgr) ReturnProveReplicaUpdate2(ctx context.Context, callID storiface.CallID, out storage.ReplicaUpdateProof, 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 667fabb66..1441304ed 100644 --- a/extern/sector-storage/sched_test.go +++ b/extern/sector-storage/sched_test.go @@ -102,6 +102,18 @@ func (s *schedTestWorker) AddPiece(ctx context.Context, sector storage.SectorRef panic("implement me") } +func (s *schedTestWorker) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, peices []abi.PieceInfo) (storiface.CallID, error) { + panic("implement me") +} + +func (s *schedTestWorker) ProveReplicaUpdate1(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid) (storiface.CallID, error) { + panic("implement me") +} + +func (s *schedTestWorker) ProveReplicaUpdate2(ctx context.Context, sector storage.SectorRef, sectorKey, newSealed, newUnsealed cid.Cid, vanillaProofs storage.ReplicaVanillaProofs) (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 6d341a4b3..3f2a9701f 100644 --- a/extern/sector-storage/sealtasks/task.go +++ b/extern/sector-storage/sealtasks/task.go @@ -13,17 +13,24 @@ const ( TTFetch TaskType = "seal/v0/fetch" TTUnseal TaskType = "seal/v0/unseal" + + TTReplicaUpdate TaskType = "seal/v0/replicaupdate" + TTProveReplicaUpdate1 TaskType = "seal/v0/provereplicaupdate/1" + TTProveReplicaUpdate2 TaskType = "seal/v0/provereplicaupdate/2" ) var order = map[TaskType]int{ - TTAddPiece: 6, // least priority - TTPreCommit1: 5, - TTPreCommit2: 4, - TTCommit2: 3, - TTCommit1: 2, - TTUnseal: 1, - TTFetch: -1, - TTFinalize: -2, // most priority + TTAddPiece: 9, // least priority + TTReplicaUpdate: 8, + TTProveReplicaUpdate2: 7, + TTProveReplicaUpdate1: 6, + TTPreCommit1: 5, + TTPreCommit2: 4, + TTCommit2: 3, + TTCommit1: 2, + TTUnseal: 1, + TTFetch: -1, + TTFinalize: -2, // most priority } var shortNames = map[TaskType]string{ @@ -38,6 +45,10 @@ var shortNames = map[TaskType]string{ TTFetch: "GET", TTUnseal: "UNS", + + TTReplicaUpdate: "RU", + TTProveReplicaUpdate1: "PR1", + TTProveReplicaUpdate2: "PR2", } func (a TaskType) MuchLess(b TaskType) (bool, bool) { diff --git a/extern/sector-storage/storiface/filetype.go b/extern/sector-storage/storiface/filetype.go index 2e0999022..83fcadc90 100644 --- a/extern/sector-storage/storiface/filetype.go +++ b/extern/sector-storage/storiface/filetype.go @@ -12,11 +12,13 @@ const ( FTUnsealed SectorFileType = 1 << iota FTSealed FTCache + FTUpdate + FTUpdateCache FileTypes = iota ) -var PathTypes = []SectorFileType{FTUnsealed, FTSealed, FTCache} +var PathTypes = []SectorFileType{FTUnsealed, FTSealed, FTCache, FTUpdate, FTUpdateCache} const ( FTNone SectorFileType = 0 @@ -25,15 +27,21 @@ const ( const FSOverheadDen = 10 var FSOverheadSeal = map[SectorFileType]int{ // 10x overheads - FTUnsealed: FSOverheadDen, - FTSealed: FSOverheadDen, - FTCache: 141, // 11 layers + D(2x ssize) + C + R + FTUnsealed: FSOverheadDen, + FTSealed: FSOverheadDen, + FTUpdate: FSOverheadDen, + FTUpdateCache: FSOverheadDen * 2, + FTCache: 141, // 11 layers + D(2x ssize) + C + R' } +// sector size * disk / fs overhead. FSOverheadDen is like the unit of sector size + var FsOverheadFinalized = map[SectorFileType]int{ - FTUnsealed: FSOverheadDen, - FTSealed: FSOverheadDen, - FTCache: 2, + FTUnsealed: FSOverheadDen, + FTSealed: FSOverheadDen, + FTUpdate: FSOverheadDen * 2, // XXX: we should clear the update cache on Finalize??? + FTUpdateCache: FSOverheadDen, + FTCache: 2, } type SectorFileType int @@ -46,6 +54,10 @@ func (t SectorFileType) String() string { return "sealed" case FTCache: return "cache" + case FTUpdate: + return "update" + case FTUpdateCache: + return "update-cache" default: return fmt.Sprintf("", 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 5889701d0..6a7791cda 100644 --- a/extern/sector-storage/storiface/worker.go +++ b/extern/sector-storage/storiface/worker.go @@ -121,6 +121,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) @@ -174,6 +177,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 81b1daee3..dd23278ae 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 3545c50c0..bebeca9a1 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 @@ -148,7 +148,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) } @@ -163,16 +162,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) @@ -210,16 +212,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) { @@ -243,7 +248,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 { @@ -261,7 +265,6 @@ func (l *LocalWorker) asyncCall(ctx context.Context, sector storage.SectorRef, r } } }() - return ci, nil } @@ -385,6 +388,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 7a88d9bd4..a1c647422 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 stori 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 b42ad4c22..0b8d26bd7 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,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 @@ -158,7 +158,7 @@ require ( golang.org/x/sync v0.0.0-20210220032951-036812b2e83c 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/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 96ed00772..014d603c6 100644 --- a/go.sum +++ b/go.sum @@ -397,8 +397,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= @@ -1880,6 +1880,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= @@ -2113,6 +2114,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/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= @@ -2237,6 +2239,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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= @@ -2329,8 +2332,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 7c91964cbb0f7600254b372f66b37bb8e138cf1d Mon Sep 17 00:00:00 2001 From: c r Date: Mon, 29 Nov 2021 17:26:47 -0500 Subject: [PATCH 008/129] 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 2213d08ad..53611d565 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -895,6 +895,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 f7d5efd596739f44772aaaebc5a74589234269c8 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 30 Nov 2021 12:40:14 -0500 Subject: [PATCH 009/129] 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 6a6e3f56c..f2d09c90a 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -685,9 +685,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 ef60ee943550710db1b2e21beb6ac59f4c07b9b2 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 30 Nov 2021 13:53:37 -0500 Subject: [PATCH 010/129] 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 f2d09c90a..6a6e3f56c 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -685,9 +685,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 59db66bac..6e71430b5 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 6bf57a38ec55cc3bf548bf15033bb7f19b940228 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 30 Nov 2021 18:24:34 -0500 Subject: [PATCH 011/129] Bump the master version to v1.13.3-dev --- build/openrpc/full.json.gz | Bin 25699 -> 25702 bytes build/openrpc/miner.json.gz | Bin 11351 -> 11355 bytes build/openrpc/worker.json.gz | Bin 3622 -> 3626 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 +- itests/self_sent_txn_test.go | 3 +-- 8 files changed, 5 insertions(+), 6 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index ff564764883212634b4a71e384d4f1a5850a2b9e..1a582b4b554bb0e1d56a4ede2f34e80deac37e6b 100644 GIT binary patch delta 25615 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 Q#K%WwZJ!kzGAzXZ0#6vZB>(^b diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index bf64392408e87027d6cfb68de46e1494ab612fbf..ca4a1419c3d2e7ee974241dfe077805e8a6fef54 100644 GIT binary patch delta 11317 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 diff --git a/build/version.go b/build/version.go index a9adf49e6..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" +const BuildVersion = "1.13.3-dev" 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 37fbea8c0..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 + 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 38ba917e2..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 + 1.13.3-dev COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index cdfdc0b4c..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 + 1.13.3-dev COMMANDS: daemon Start a lotus daemon process 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 2918a7fa4649d81a58a3c5bde7004975f6cbbc42 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 30 Nov 2021 18:29:13 -0500 Subject: [PATCH 012/129] docs gen From 4ae0d1c42e559c13603819133216c9452ec06e48 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 013/129] 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 1d3c48c8529d9601b579d2857ba801c349ef78b0 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 1 Dec 2021 14:01:55 -0500 Subject: [PATCH 014/129] 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 25702 -> 25704 bytes build/openrpc/miner.json.gz | Bin 11355 -> 11409 bytes build/openrpc/worker.json.gz | Bin 3626 -> 3696 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 +- 20 files changed, 280 insertions(+), 23 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 4e752e245..1e17d9e73 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -716,6 +716,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"` @@ -859,6 +861,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"` @@ -4230,6 +4234,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 @@ -4923,6 +4938,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 1a582b4b554bb0e1d56a4ede2f34e80deac37e6b..ec52653193c9c4f60013e46eb7315bf0a40fb604 100644 GIT binary patch delta 24019 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 O0RR8viYL}Y#{dB7kSad_ literal 3626 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 w3-}ZV7@z Date: Mon, 13 Dec 2021 15:47:17 -0500 Subject: [PATCH 015/129] 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 d83d585327045620a27f82c9a6c7ae83a67e863c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 8 Sep 2021 15:22:41 -0400 Subject: [PATCH 016/129] 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 518634b998735928b6754b053e58d0a40a770a59 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Sep 2021 17:47:12 -0400 Subject: [PATCH 017/129] 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 3e872599ce2f184ee08ace5457643cd92bed003c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Sep 2021 20:24:12 -0400 Subject: [PATCH 018/129] 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 e19199626af941e2424ba66801288a078aa2f283 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Sep 2021 21:23:49 -0400 Subject: [PATCH 019/129] 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 7c165768d27d4d6611e2bcac231f194e4be5a489 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 13 Dec 2021 18:31:31 -0500 Subject: [PATCH 020/129] 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 762d2e473b16e9ea85743cdf046d20ddb2dd9a72 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 16 Dec 2021 23:59:26 -0500 Subject: [PATCH 021/129] 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 6a06f1565014846b0a0f9ae95754648f6331752b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 5 Jan 2022 13:52:51 -0500 Subject: [PATCH 022/129] Fix circsuypply calc around null blocks --- chain/consensus/filcns/compute_state.go | 5 ++++- chain/vm/vm.go | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 847d41d47..63d4e5d3d 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 d569dbbbf..f1823858f 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -827,8 +827,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) { From 88c23a9cac85fd01c0d2e602700b98b7c2e46aa0 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 6 Jan 2022 15:35:39 +0100 Subject: [PATCH 023/129] 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 27d9c8d94..fe44b55b1 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -206,6 +206,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 290b31e269493419fe0d1c5ced2bac6782e0512f 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 024/129] 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6984f6ffd..13a4e8cbd 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,7 +11,8 @@ ## Checklist Before you mark the PR ready for review, please make sure that: -- [ ] The PR title is in the form of of `: <#issue number> : ` +- [ ] 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` - `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_ From 70c4337835442312486fde480f5f00a2c04f5b8e 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 025/129] Update pull_request_template.md --- .github/pull_request_template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 13a4e8cbd..5cb12a751 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -12,9 +12,9 @@ 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` - - `PR type`: _fix_, _feat_, _BREAKING CHANGE_, _build_, _chore_, _ci_, _docs_, _perf_, _refactor_, _revert_, _style_, _test_ +- [ ] The PR title is in the form of `: : ` + - 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 - [ ] 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 ba85c9fc67f57c73fc36e85f5e46184dfe46d54e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 10 Jan 2022 19:03:26 -0500 Subject: [PATCH 026/129] Update go-paramfetch --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ac020c580..112b798fe 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( 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 + 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.1.1 diff --git a/go.sum b/go.sum index 7d7aae511..f24bfc3ee 100644 --- a/go.sum +++ b/go.sum @@ -355,8 +355,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 d665416829726d95bbeee35e1fc46b5f3688defb Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 10 Jan 2022 23:24:37 -0500 Subject: [PATCH 027/129] bump the version to v1.14.0-rc1 --- build/openrpc/full.json.gz | Bin 25704 -> 25704 bytes build/openrpc/miner.json.gz | Bin 11409 -> 11409 bytes build/openrpc/worker.json.gz | Bin 3696 -> 3696 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 ec52653193c9c4f60013e46eb7315bf0a40fb604..65580f678258eb4d72c14aa62ba86b2d17b2e7b4 100644 GIT binary patch delta 25578 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 JzqK<91pt~mP2vCm delta 25578 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 Date: Wed, 8 Dec 2021 12:11:19 -0500 Subject: [PATCH 028/129] 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 25704 -> 25709 bytes build/openrpc/miner.json.gz | Bin 11409 -> 11527 bytes build/openrpc/worker.json.gz | Bin 3696 -> 3692 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 | 17 +- documentation/en/cli-lotus-miner.md | 62 ++-- documentation/en/cli-lotus-worker.md | 2 + .../en/default-lotus-miner-config.toml | 6 + .../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 +- 67 files changed, 1995 insertions(+), 355 deletions(-) create mode 100644 extern/storage-sealing/states_replica_update.go diff --git a/api/api_full.go b/api/api_full.go index 06aaff99c..84055877e 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -1083,7 +1083,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 92117d2fb..6e6d75c28 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 @@ -250,7 +252,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 1e17d9e73..63dc4aac8 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"` @@ -756,7 +757,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"` @@ -3706,14 +3709,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 } @@ -4454,14 +4457,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 65580f678258eb4d72c14aa62ba86b2d17b2e7b4..5bf44f1a455a2cecb587e0a05fe009f7088e95c8 100644 GIT binary patch delta 23487 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%0Dwpb3Dps?Hgp+56G!+ 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 delta 3396 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 a4mlLYhO%7VF8>z*0RR7g*c9tT#{dA)sfKU> 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 883edd9a1..53dce3f17 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 60dd142e9..f48798c6b 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 4d016b7ab..a50b1b034 100644 --- a/chain/stmgr/actors.go +++ b/chain/stmgr/actors.go @@ -116,7 +116,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) @@ -202,12 +202,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 4175ff5fa..e14601cb6 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" @@ -542,7 +543,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 7d5e993a0..87c2e9e16 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 43a71fd9e..3a17eac3a 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) }, } @@ -1995,6 +2050,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 591a2b06b..1ff720677 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -118,6 +118,7 @@ * [SectorGetExpectedSealDuration](#SectorGetExpectedSealDuration) * [SectorGetSealDelay](#SectorGetSealDelay) * [SectorMarkForUpgrade](#SectorMarkForUpgrade) + * [SectorMatchPendingPiecesToOpenSectors](#SectorMatchPendingPiecesToOpenSectors) * [SectorPreCommitFlush](#SectorPreCommitFlush) * [SectorPreCommitPending](#SectorPreCommitPending) * [SectorRemove](#SectorRemove) @@ -330,7 +331,9 @@ Inputs: ```json [ null, - null + null, + 10101, + 15 ] ``` @@ -1936,12 +1939,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/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index dad0609ac..08fac332d 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1500,23 +1500,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)) - 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) @@ -1732,6 +1734,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: @@ -1832,6 +1847,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 9972128b5..0cfa38096 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 d402f65ed..486ffed51 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -413,6 +413,12 @@ # env var: LOTUS_STORAGE_ALLOWUNSEAL #AllowUnseal = true + # env var: LOTUS_STORAGE_ALLOWREPLICAUPDATE + #AllowReplicaUpdate = 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 112b798fe..a580c738e 100644 --- a/go.mod +++ b/go.mod @@ -51,8 +51,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.20211202151826-2e51da61d454 + 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 @@ -168,3 +168,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 f24bfc3ee..d188bd414 100644 --- a/go.sum +++ b/go.sum @@ -358,7 +358,6 @@ github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MU 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= 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= @@ -374,7 +373,6 @@ github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/ 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/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= @@ -395,10 +393,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.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/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= @@ -750,7 +749,6 @@ 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 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= -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= 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 651c15901..5a2121029 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 90a614645..fa983dbdf 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 582ade723..22e4e9085 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 735107e29..e89d480b2 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 39baa97bf..2fcd709b8 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -32,6 +32,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" @@ -379,8 +380,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) { @@ -391,6 +392,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 { @@ -988,8 +993,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 038ed3ac7..0ba7b21e1 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" @@ -567,7 +567,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) @@ -610,14 +610,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 } @@ -636,14 +636,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") } @@ -664,6 +672,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, @@ -686,7 +702,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. @@ -714,10 +730,8 @@ func (s *WindowPoStScheduler) runPoStCycle(ctx context.Context, di dline.Info, t if !somethingToProve { continue } - posts = append(posts, params) } - return posts, nil } @@ -766,7 +780,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 @@ -776,22 +790,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 e3e4c2ce8915cdcdec107958240630aba7f28275 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 5 Jan 2022 08:24:46 -0500 Subject: [PATCH 029/129] 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 a25eac80339ced38d946aa07ae489c16be3d6bcc Mon Sep 17 00:00:00 2001 From: zenground0 Date: Fri, 7 Jan 2022 22:20:49 +0530 Subject: [PATCH 030/129] 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 62438885da65daac164203d476f4a012c20550ab Mon Sep 17 00:00:00 2001 From: zenground0 Date: Sun, 9 Jan 2022 08:53:22 +0530 Subject: [PATCH 031/129] 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 b62ccd75a0098042998f535e75506e1c22cf08b8 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 10 Jan 2022 15:47:20 +0530 Subject: [PATCH 032/129] 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 473b333f85ab1895a4c59303a1d950bdbb9c5a4b 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 033/129] 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 faa930778f928d330d3ea74593b36e7420229aff Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 11:53:14 -0500 Subject: [PATCH 034/129] Remove unnecessary params from VerifyWinningPost --- build/openrpc/worker.json.gz | Bin 3692 -> 3691 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 a24652d477c4f604931a88049f04ad53d65bdf5a..d781908170e9cf9df239655073381c47d63b8433 100644 GIT binary patch delta 3678 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 delta 3679 zcmV-l4xsVt9PAvBFn@w90Xk7U`tLg+DT!B^ph#JEFr7&)5WqPA&gBDe06Z$5k4WHK z%Bj-t>Aj(%DwxbX<@8Zum^nx}RX%tuq~P-647|NKS5)Nz1r&QED$zH4+Hqj@m8Gh< zh|N8lDyN?x6#`ve^f&Av%fqDi*0wJ&vXG)GHlkL5eHK^o<$ueUJMV_fLSlh86#Vp; z7u=)ZiUpy?j=-we8(#yKM;Q9XdS~(fRp9plWnKX9Q11#^%nL5jOa;CUKHtJA?p+ff z+BS+SxWeC&3VZ`peKFT{y@L!Mfj9goo*-(r7lhdR(L{SwV2GEVWHw^d?O&7<$M{zV9 z$>+=v`u)O~6?#2GoBy!p$c0>n&^PG%4vK3$f5($PVt;}H<+QJ9nyP#X-6{VyS*prK z;CZt@7Cur=$IDw)fwmp71)Yn)^HIPsuV)4wid4ls zVe#p_%XNx3{To?K$u>%$g3qfOZkMVOpnpOfAX_z7_U3wEpM+%In8CLV*_HFvDFT6WmdFN z{NHiOKdb+gMphyb=Eqv1`=oVn;kWa+!v0WITz^bbzmm+cj4#zx+YirDH8wrPG_EPJ z<9g>=B|ZHfvw1iL0dhTtfP=}sqAFqFD5uJtF`u5EoZLlOdY0#&%n}H3><1p_>%`%3 z_a1i&H02bJ=QttW%e0-VS^Trf9CrNx-zqyp8>>@9RAbH`Ur0eCP^c!N< zTu_jrGGb_UV`$@aPM-sc2+nRkUO+ZalFd}|TPy1JkDiSLL2blpSBQ4i5B1=z#H~Ld zZmp90?m%4&h^`1siyB%>>J*BggUOweVtdcy6*LD&j^f>wgjR zs1~++XV@0>q?N?Ga;n=}EB)(1De@us*F>tHo=-;#LKrx=5n*_SOXk*R*aiV7PZ43< zI8)@zj^jL2OzvW3BMd;>4iKft26$at51cb@(q~@aA{$H>0D?c`O=cB9aOT;_0&l*~ zu{8&n*qAqw({MwFVT*q~_Mvr;?0+>C-dRTg5*tA9k>{F2I`3tt`;W>AmvT5;=+p1e zLeTh1?fGzFKx4?J2E9kF|F`$;A3t1puK)McouS3dFlX2Z7sD__rv6|mOF0vk-duX~ z*qaXq<=*_9%sfHI&5M-pw&X(_c+PEJn18S3a5vQnIo*WQPBvr8nA>6$GJl!s7>0j) zl&wi|;{_g|6Y`nX`5o~Bbcv`J2G(jbSyfUAkIF~nUd$I1ThLKXO$Dch zCv`4WMbB~2*G9(3?2mOb!$dl{MLsswE>*?Iv0~~Ib21$1lVOIHbaGd$nE7!Tj3*Pr z98C1=(4>;PVrB4LvN?Qq*&H2?Y>p2{HYbN7n@e?VOfAoKF+1tEYky1&N&7XXb;);a zOzZNo)tEjbD|uu3jI6Y0Oa*1LZDT4fo81`GMx&57rq9Sq-k3fcD@9|f?_f*|)_lLn zbO-X{#&p=%hJAfxl(^g-_}Ea>O021&>wR4xm?K@QU`Eqwv2$F`&#=IcVH$(U$QT>L zafwMCnx<|Jw25hId4K89`r5=C4u&oBGaQfl6LT~i8N=pwb$2n{$*#5{rgiP=KEyO{ zSf5)=^Vaow#WZDNXHkr0iGA&B=6Em~=8S)m)}rOtN=)oNX%~&_{%9AW>HcUJvFQG2 z=Z)k(Y3J?aK4}*%Drl;`S#lTu@-Yx-cKjZJ-=>l9;T8so{pFh^~#Casx~>zvOmnR#3J zjFMR}ozEwkrM7gJxp@gw6>xTM#dI)ep0#ylAB~X1qKy|qk z45Hk`X+5rD2$NvbWl5;kI?w9({W2F>B|tfj)2b5)`98_H4)rWBnh(v)#E;b>u?{H{ z$Q*~9)htjybEZFi$QTO9MW*L^KRxkDU=(taRC72of`9v1(%_BI*Xo~~+>4iq6r)x# zk+yD$t8JF@N}_Rx!}4g{kKO~iiVtcC2IZzowsVDr;DMSH{jQGCWSb}t%^Xy`{2?5g zc{#UI$P*^=gvo33X`@lOPrHC@P6fSLRHpolNqq7g(O%*Tc-C!>DXMCVODd~R$StjS z?c|h68Gm;bhw%%Ux;>G92FX>j%v7Ax@Q<9O@~^Q~D9k}VcouXb-pjuJh49_H)(rqH zp6fqUT^o-pbS>~KMClcxG!`x)rOOm9*S;{scJKOnI~L4Vv_<#UwTUTQp3id4iwkn+ z5JwO=@nAlCdWh%XHbYXbX zUuxX;RLfy^azpIXF8Fn**<@0wW)J8R`3|<=wQoa)ic^OtbuC{*qiYYMiv~A;n+>l+ zC}F3oSzLL`Rwu7Qc*d&`wqBnoN9Hg_rg(>>92t3ih+N!}i#shL;epoI z>VG2Pq5~I2!g{MnSOxxIT{5BbCnVT$V1#Yx&QMw3A5_*$pfYcugv$q^^%5@s;I3c7 zctky=%j;E)I$K~^2&VaKc)YC)qnoesCbR;5=AdFiMmZ*sLETyDNgME`Maao z1C~2LUP-y%6Y*~eE1Yz>OIyYMo`B!k90jetXPjM8xaWS>+Rs#g(z06jA3Z3F( zkV#@{;<}FBaGV#eTxP{vPMHN#VI51AZSs(L^qg^YFSRHzO%d)6mS$TgLFpmr{(pgi z(u@>$4oV|RXGs9)wneo<{HKJd5~50oy0aG@RJ`hRg`jg5-OC~x%9tuC=0Rg<2c63( z>Xsl%qdi=n9Jw%PG5mlEIn2E4&Ft{TB+jrcy04pRMpyng+f#BMS9<0xp1G(U4fi`* ziurC7*S&2!bgQ1f=(ZL&7$wZwb$TPkExR4w>9w81V;WIvc@pCv#`Z%2K^#H&6kHZgqKF>|MT{%%fy#KqCKKjO;bwE@jXQ2OZQjt|3uus&=Yvz#LjVk=(){u; zgYtRlt=V;KyWhjs)dg%%-Msbz-=o}Zaw?dH46LtYBT2+^>Yg>O1vaK| z>TuffjYDh_wvqkIf}wL_qi^f;Ijb*G^?z6RJBrTbl!j{z8eU1B z;=ilymTVWv^Eh(frPkw81-0nzeJRb-xSoi!Itqf2kZ5mjM~VI67NaI3Wx2dv{yzW!|Np|Ipr}O0005|6CB*;$ diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 53dce3f17..15277cf56 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 f48798c6b..3572c37cd 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 87c2e9e16..1e670ce78 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 1ff720677..388b41398 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -214,7 +214,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 35f337121..bb4052671 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -728,7 +728,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 257da9d13..9b1d9c14a 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 9624f0e26..777741699 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 1f9a37b85..0dd4bc0d8 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.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= 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= From b5fb1406c559fe0dc5b35d554722de61c61e3fc7 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 10 Jan 2022 23:45:04 -0500 Subject: [PATCH 035/129] Integrate proof v11.0.0 --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 52d80081b..e660df561 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 52d80081bfdd8a30bc44bcfe44cb0f299615b9f3 +Subproject commit e660df5616e397b2d8ac316f45ddfa7a44637971 From f8a928c4b620c1418dace2cf58087ec3b3d05a58 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 7 Jan 2022 18:05:36 -0500 Subject: [PATCH 036/129] Disable mark-for-upgrade two days before the network v15 OhSnap upgrade to avoid unexpected edge cases that may cause deal/sector failure --- cmd/lotus-miner/sectors.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 3a17eac3a..bd00ab38a 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -5,6 +5,8 @@ import ( "encoding/json" "errors" "fmt" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin" "os" "sort" "strconv" @@ -1547,6 +1549,17 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ return xerrors.Errorf("classic cc upgrades disabled v15 and beyond, use `snap-up`") } + head, err := api.ChainHead(ctx) + if err != nil { + return xerrors.Errorf("failed to get chain head: %w", err) + } + + twoDays := abi.ChainEpoch(2 * builtin.EpochsInDay) + if head.Height() > (build.UpgradeSnapDealsHeight - twoDays) { + return xerrors.Errorf("OhSnap is coming soon, " + + "please use `snap-up` to upgrade your cc sectors after the network v15 upgrade!") + } + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) if err != nil { return xerrors.Errorf("could not parse sector number: %w", err) From dbdf16610a158e2c5a107fd87882446701bb0c98 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 7 Jan 2022 18:24:57 -0500 Subject: [PATCH 037/129] fix lint --- cmd/lotus-miner/sectors.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index bd00ab38a..ee6a09040 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -5,14 +5,15 @@ import ( "encoding/json" "errors" "fmt" - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors/builtin" "os" "sort" "strconv" "strings" "time" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/docker/go-units" "github.com/fatih/color" cbor "github.com/ipfs/go-ipld-cbor" From 4bce60bacea40f345ccf8c2c51330bc6ab3cb576 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Mon, 10 Jan 2022 22:23:55 -0500 Subject: [PATCH 038/129] Update default-lotus-miner-config.toml From 07df10a455ffd3b8cc9e5fb3ea0e9c99b0033ec2 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 12:50:34 -0500 Subject: [PATCH 039/129] format --- cmd/lotus-miner/sectors.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index ee6a09040..90fe7b00b 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1550,6 +1550,8 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ return xerrors.Errorf("classic cc upgrades disabled v15 and beyond, use `snap-up`") } + // disable mark for upgrade two days before the ntwk v15 upgrade + // TODO: remove the following block in v1.15.1 head, err := api.ChainHead(ctx) if err != nil { return xerrors.Errorf("failed to get chain head: %w", err) From ee41547c52f97b82aeab6bf50070a2597e8bab20 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 11:50:35 +0200 Subject: [PATCH 040/129] 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 f7067adf709a85b9ab1dc669883fdcb44e7b02c1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:05:15 +0200 Subject: [PATCH 041/129] 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 e54c8dac56fc73b62a8f4211fa417963cdfe72b7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:11:54 +0200 Subject: [PATCH 042/129] 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 c905b6f0c192c90d4587d843c7ecc276169fb4c1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 3 Dec 2021 12:15:28 +0200 Subject: [PATCH 043/129] 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 a44081aa75c7effce06dd3dd2951d4f1b4638316 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Thu, 18 Nov 2021 17:50:25 -0800 Subject: [PATCH 044/129] 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 ++++++------ go.mod | 37 +++++------ go.sum | 76 +++++++++++++--------- lib/backupds/backupds_test.go | 7 +- lib/backupds/datastore.go | 49 +++++++------- lib/backupds/log.go | 10 ++- lib/backupds/read.go | 7 +- 22 files changed, 345 insertions(+), 309 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/go.mod b/go.mod index a580c738e..7c78769bb 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( 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 @@ -27,14 +27,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.3 + 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.2 + 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.4 + github.com/filecoin-project/go-data-transfer v1.11.7-0.20211119001436-c0dbfa5fae4d 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 @@ -43,7 +43,7 @@ require ( 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.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 @@ -68,33 +68,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-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-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-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 @@ -114,7 +114,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 @@ -153,8 +153,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/crypto v0.0.0-20211209193657-4570a0811e8b // indirect - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 + 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-20211209171907-798191bca915 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac diff --git a/go.sum b/go.sum index d188bd414..3d41b3ce2 100644 --- a/go.sum +++ b/go.sum @@ -245,8 +245,8 @@ github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlN 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/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= @@ -302,9 +302,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 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/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -321,15 +320,16 @@ 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 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-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -369,8 +369,9 @@ 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 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/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -677,8 +678,9 @@ github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3 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= @@ -688,8 +690,8 @@ github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7s 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= @@ -715,8 +717,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= @@ -725,16 +729,18 @@ 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.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= @@ -747,17 +753,19 @@ github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CE 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 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= 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 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 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= 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 h1:ZIZ2qgHO5pftHW0oHTfx+LoO+Me2xHkVAexhVpgGL3I= +github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= 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= @@ -772,12 +780,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= @@ -791,8 +802,9 @@ 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= @@ -835,8 +847,8 @@ github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB 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 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= @@ -847,8 +859,9 @@ github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP 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= @@ -868,7 +881,6 @@ 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= @@ -1023,6 +1035,7 @@ github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TA 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= @@ -1157,8 +1170,8 @@ 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 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= @@ -1296,6 +1309,7 @@ github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2 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= @@ -1997,9 +2011,8 @@ 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= @@ -2114,9 +2127,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx 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= -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= 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 dcd7c9ec6adb546b4c5459a4e4d662e946487c7b Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 7 Dec 2021 17:24:58 -0500 Subject: [PATCH 045/129] Update go-data-transfer --- go.mod | 24 +++++++------- go.sum | 98 ++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 70 insertions(+), 52 deletions(-) diff --git a/go.mod b/go.mod index 7c78769bb..9ea790513 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( 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.20211119001436-c0dbfa5fae4d + github.com/filecoin-project/go-data-transfer v1.11.7-0.20211207053937-e06a599f202a 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 @@ -43,7 +43,7 @@ require ( 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.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 @@ -73,13 +73,13 @@ 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-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 @@ -108,20 +108,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 3d41b3ce2..548da9976 100644 --- a/go.sum +++ b/go.sum @@ -327,9 +327,9 @@ github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2 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.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-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-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= @@ -370,8 +370,8 @@ github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzO 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/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -717,10 +717,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/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= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -753,9 +753,8 @@ github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CE 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 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= -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-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= @@ -859,7 +858,6 @@ github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP 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= @@ -911,7 +909,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= @@ -1010,8 +1007,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= @@ -1037,10 +1035,11 @@ github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t 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 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= github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= @@ -1049,8 +1048,9 @@ 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 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= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= @@ -1102,8 +1102,10 @@ 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 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= @@ -1114,8 +1116,9 @@ 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= @@ -1143,8 +1146,9 @@ 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= @@ -1152,8 +1156,8 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK 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= @@ -1183,8 +1187,10 @@ 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.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 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= @@ -1211,8 +1217,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.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 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= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1222,11 +1229,13 @@ 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 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.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= @@ -1236,8 +1245,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.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 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= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1251,8 +1261,9 @@ 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.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 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= @@ -1269,12 +1280,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= @@ -1287,13 +1300,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= @@ -1312,8 +1327,8 @@ 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 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= @@ -1338,16 +1353,19 @@ 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= @@ -1370,12 +1388,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/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= From 585f30a793814331d4220684da7edc2bee1e49e7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 9 Dec 2021 15:14:48 +0200 Subject: [PATCH 046/129] update deps --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 9ea790513..a7af3878d 100644 --- a/go.mod +++ b/go.mod @@ -80,7 +80,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.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 diff --git a/go.sum b/go.sum index 548da9976..79675a958 100644 --- a/go.sum +++ b/go.sum @@ -763,8 +763,9 @@ github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAX 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 h1:ZIZ2qgHO5pftHW0oHTfx+LoO+Me2xHkVAexhVpgGL3I= 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= From 4d98dd9806fa98695f27f81b6df653c8ad164e17 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Dec 2021 22:31:46 -0500 Subject: [PATCH 047/129] 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 a7af3878d..950e3238d 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,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 @@ -44,7 +44,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 79675a958..0203158de 100644 --- a/go.sum +++ b/go.sum @@ -320,8 +320,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.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= From 414a53b2dffe54d01802c819337c22d6b84f9f5a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Dec 2021 22:46:30 -0500 Subject: [PATCH 048/129] Update go-car --- go.mod | 6 +++--- go.sum | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 950e3238d..f4907267a 100644 --- a/go.mod +++ b/go.mod @@ -80,7 +80,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 @@ -100,10 +100,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.14.2 + 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 diff --git a/go.sum b/go.sum index 0203158de..baf7398ca 100644 --- a/go.sum +++ b/go.sum @@ -766,8 +766,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= @@ -879,8 +879,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= @@ -897,8 +898,8 @@ 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.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 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= From 7d55284b90d40761bae5a5b1a85dd9588e7ddf6d Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 10 Dec 2021 19:15:53 -0500 Subject: [PATCH 049/129] Update carv2 --- go.mod | 2 +- go.sum | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index f4907267a..db8a1c38b 100644 --- a/go.mod +++ b/go.mod @@ -101,7 +101,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 baf7398ca..abbadccf8 100644 --- a/go.sum +++ b/go.sum @@ -883,8 +883,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= @@ -898,12 +899,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 df943d3f4e5e8757eb40e4b3520b4a47cbcb18c1 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 14:37:37 -0500 Subject: [PATCH 050/129] Update markets --- go.mod | 6 ++-- go.sum | 94 +++++++--------------------------------------------------- 2 files changed, 13 insertions(+), 87 deletions(-) diff --git a/go.mod b/go.mod index db8a1c38b..302fb6246 100644 --- a/go.mod +++ b/go.mod @@ -27,17 +27,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.3-0.20220111000201-e42866db1a53 diff --git a/go.sum b/go.sum index abbadccf8..ad0544530 100644 --- a/go.sum +++ b/go.sum @@ -302,8 +302,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= @@ -320,28 +320,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= @@ -351,7 +346,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,17 +364,13 @@ 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.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= @@ -679,8 +669,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= @@ -689,9 +677,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= @@ -703,7 +688,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= @@ -716,7 +700,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= @@ -730,7 +713,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= @@ -747,25 +729,17 @@ 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-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= @@ -813,7 +787,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= @@ -847,7 +820,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= @@ -859,8 +831,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= @@ -877,35 +847,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= @@ -982,7 +940,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= @@ -1031,16 +988,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= @@ -1055,7 +1008,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= @@ -1074,7 +1026,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= @@ -1193,7 +1144,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= @@ -1220,10 +1170,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= @@ -1250,7 +1198,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= @@ -1267,8 +1214,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= @@ -1331,7 +1276,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= @@ -1359,8 +1303,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= @@ -1368,7 +1310,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= @@ -1389,10 +1330,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= @@ -1441,7 +1380,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= @@ -1526,8 +1464,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= @@ -1545,7 +1481,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= @@ -1586,7 +1521,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= @@ -1597,7 +1531,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= @@ -1812,7 +1745,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= @@ -1869,7 +1801,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= @@ -2018,7 +1949,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= @@ -2085,7 +2015,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= @@ -2103,7 +2032,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= @@ -2360,12 +2288,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/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= From 5cb33b48dacfc7de020068180d50bc5e34a3b9ce Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 16:03:00 -0500 Subject: [PATCH 051/129] 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 63d4e5d3d..de2d19223 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -294,7 +294,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 15277cf56..4f109ed08 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 757363a76..d4b0ea2b2 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 a8e85d78f..863193180 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -642,7 +642,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 3572c37cd..4153830dc 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -241,7 +241,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) } @@ -471,7 +471,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 45387df50..64fd76d2b 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -595,7 +595,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) } @@ -625,7 +625,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) } @@ -656,7 +656,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 3ccf2e406..633e9b23f 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -210,7 +210,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 } @@ -458,7 +458,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 } @@ -695,7 +695,7 @@ tailLoop: return result } -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) @@ -731,7 +731,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 a50b1b034..6836d6cb6 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" @@ -301,12 +302,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 f1823858f..675ba528b 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) @@ -710,7 +710,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 @@ -739,7 +739,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) } @@ -764,13 +764,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) } @@ -795,7 +795,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 @@ -805,7 +805,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 302fb6246..ba3575a64 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,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.3-0.20220111000201-e42866db1a53 @@ -76,7 +76,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 @@ -90,7 +90,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-ipld-legacy v0.1.1 // indirect github.com/ipfs/go-log/v2 v2.3.0 @@ -112,7 +112,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 ad0544530..23a47ae32 100644 --- a/go.sum +++ b/go.sum @@ -335,8 +335,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= @@ -696,7 +696,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= @@ -725,8 +724,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= @@ -787,8 +786,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= @@ -1085,8 +1085,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 22e4e9085..976e9ca6f 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 2fcd709b8..cfee53aed 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -301,11 +301,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 } @@ -953,7 +953,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 489abefce6d0512d2ff76310254b029221a5b9f1 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sat, 11 Dec 2021 18:15:35 -0500 Subject: [PATCH 052/129] 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 ba3575a64..027f76932 100644 --- a/go.mod +++ b/go.mod @@ -90,7 +90,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-ipld-legacy v0.1.1 // indirect github.com/ipfs/go-log/v2 v2.3.0 diff --git a/go.sum b/go.sum index 23a47ae32..5f62af4b5 100644 --- a/go.sum +++ b/go.sum @@ -787,8 +787,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 27c9a3b772935d524605c2700db11e06131c1907 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:11:35 +0200 Subject: [PATCH 053/129] 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 027f76932..07f2ce826 100644 --- a/go.mod +++ b/go.mod @@ -78,6 +78,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 5f62af4b5..c36fde67f 100644 --- a/go.sum +++ b/go.sum @@ -728,6 +728,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 d9d4e2925385091aa01d1a6279c5b1d747f0e683 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:17:05 +0200 Subject: [PATCH 054/129] go get drand@release/v1.3 --- go.mod | 14 ++++++++------ go.sum | 60 ++++++++++++++++------------------------------------------ 2 files changed, 24 insertions(+), 50 deletions(-) diff --git a/go.mod b/go.mod index 07f2ce826..021d08f0f 100644 --- a/go.mod +++ b/go.mod @@ -19,9 +19,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 @@ -57,6 +58,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 @@ -74,11 +76,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 @@ -106,6 +107,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 @@ -116,7 +118,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 @@ -156,7 +158,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-20211209171907-798191bca915 + golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.7 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 diff --git a/go.sum b/go.sum index c36fde67f..9ae6c2bbf 100644 --- a/go.sum +++ b/go.sum @@ -117,7 +117,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 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= @@ -232,7 +231,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= @@ -244,13 +242,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= @@ -258,12 +255,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= @@ -394,7 +392,6 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/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= @@ -484,6 +481,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= @@ -589,7 +588,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= @@ -715,9 +713,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= @@ -728,7 +725,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= @@ -897,8 +893,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= @@ -993,8 +990,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= @@ -1008,7 +1003,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= @@ -1017,7 +1011,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= @@ -1026,11 +1019,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= @@ -1074,9 +1065,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= @@ -1114,7 +1103,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= @@ -1129,8 +1117,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= @@ -1141,9 +1127,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= @@ -1170,7 +1155,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= @@ -1289,7 +1273,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= @@ -1299,7 +1282,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= @@ -1461,7 +1443,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= @@ -1594,7 +1575,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= @@ -1631,7 +1611,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= @@ -1953,7 +1932,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= @@ -2049,7 +2027,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= @@ -2061,10 +2038,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= @@ -2170,9 +2145,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= @@ -2207,8 +2180,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc 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/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/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= @@ -2368,7 +2341,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 35b8516288f3440d51bf38af430997c79aacac17 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:26:59 +0200 Subject: [PATCH 055/129] 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 074f3850d80cc326da1d5f65a12f1de3100eb67c Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:28:29 +0200 Subject: [PATCH 056/129] 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 289ea3d33fd397a610384fee5024d1c8ecbf18ff Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:35:24 +0200 Subject: [PATCH 057/129] 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 e0240a4ee5649532aa33289b9afa329637cc2cc0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:46:49 +0200 Subject: [PATCH 058/129] 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 1e670ce78..0fddf515d 100644 --- a/cmd/lotus-bench/caching_verifier.go +++ b/cmd/lotus-bench/caching_verifier.go @@ -37,7 +37,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': @@ -67,7 +67,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 d5b131f4ecafeee0b799a4a64918941cfbd0d54a Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:47:01 +0200 Subject: [PATCH 059/129] go mod tidy --- go.mod | 2 -- go.sum | 18 ------------------ 2 files changed, 20 deletions(-) diff --git a/go.mod b/go.mod index 021d08f0f..e1e549911 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,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 @@ -79,7 +78,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 9ae6c2bbf..f1490b5fe 100644 --- a/go.sum +++ b/go.sum @@ -158,8 +158,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= @@ -184,15 +182,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= @@ -412,9 +401,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= @@ -520,7 +506,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= @@ -723,8 +708,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= @@ -1963,7 +1946,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 16a37036b5002a19b67204c802e70b92e9740c00 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 14:59:52 +0200 Subject: [PATCH 060/129] 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 fa7fa8c19967b81a1f20bd1278b18c386dfd2596 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 15:15:38 +0200 Subject: [PATCH 061/129] 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 81c8c3f55496160bf04fc25260013b392c8dcf22 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:26:15 +0200 Subject: [PATCH 062/129] 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 e1e549911..185336239 100644 --- a/go.mod +++ b/go.mod @@ -93,7 +93,7 @@ require ( 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-ipld-legacy v0.1.1 // indirect - 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 @@ -109,20 +109,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 f1490b5fe..078c8a0e5 100644 --- a/go.sum +++ b/go.sum @@ -795,8 +795,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= @@ -975,8 +976,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= @@ -987,15 +989,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= @@ -1038,8 +1042,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= @@ -1103,8 +1109,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= @@ -1116,8 +1123,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= @@ -1142,8 +1150,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= @@ -1154,8 +1163,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= @@ -1169,8 +1179,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= @@ -1183,8 +1194,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 1f99550da8d79ac23fc616ed0ebe12740c16aefb Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:27:34 +0200 Subject: [PATCH 063/129] 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 185336239..60f3f3a74 100644 --- a/go.mod +++ b/go.mod @@ -110,7 +110,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 @@ -138,7 +138,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 078c8a0e5..ac2fb265d 100644 --- a/go.sum +++ b/go.sum @@ -1009,8 +1009,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= @@ -1615,8 +1616,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 1eb6f77da11514fccc920181738df1ce05a93c78 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:30:29 +0200 Subject: [PATCH 064/129] 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 87b21380c725e482cfcf4fd79f15319ec89c15d6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 15:55:00 +0200 Subject: [PATCH 065/129] update drand --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 60f3f3a74..61e58c050 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,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 ac2fb265d..6e2dc1444 100644 --- a/go.sum +++ b/go.sum @@ -244,8 +244,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 ed9153cb7ff160cda9bf2ec3f98d98dd9877fb5b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:06:59 +0200 Subject: [PATCH 066/129] 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 5a2121029..f8de14d62 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -374,7 +374,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 fa983dbdf..dfd3d8cd7 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 6bca8216bb808e11515dd8718d98b9454b486b43 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:21:55 +0200 Subject: [PATCH 067/129] 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 1e07cc6a5a1de961ce3f3e458d3fecb7acb75ee3 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 16:57:09 +0200 Subject: [PATCH 068/129] 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 c8b23b475b4da5a662621b7e53c5a1b39b390d4b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:05:10 +0200 Subject: [PATCH 069/129] 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 6317f1422dcb665a0c47a5a22b06d526263594e9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:17:30 +0200 Subject: [PATCH 070/129] 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 704904e2da17dfe5f956e5caba180147c216e335 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:45:38 +0200 Subject: [PATCH 071/129] 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 e14601cb6..9b6f0c598 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -299,7 +299,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 e98bac367f5df2e384642315cbb56673ed41b49b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:49:34 +0200 Subject: [PATCH 072/129] 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 170d2cdfc77bea3cbdb6d834355591d2d778062b Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:53:31 +0200 Subject: [PATCH 073/129] 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 ef37ba812eeccbb884661f233532167ebad95e54 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 17:57:37 +0200 Subject: [PATCH 074/129] 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 3ec2af0a2b184868e15759b0ddcbbbc124a1db00 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:01:34 +0200 Subject: [PATCH 075/129] 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 f3389896f..2ae99cd77 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -65,7 +65,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 1ae448f6b75c3d10f176176bb9823157083001f9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:05:23 +0200 Subject: [PATCH 076/129] 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 0e5d5cac82316f1a52fb7257b62cd551bde35f90 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:23:33 +0200 Subject: [PATCH 077/129] update lotus-soup deps --- testplans/lotus-soup/go.mod | 22 +++++----- testplans/lotus-soup/go.sum | 85 +++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 11 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 0dd4bc0d8..96c4d57bb 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -332,8 +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= +<<<<<<< HEAD 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/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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -379,9 +384,14 @@ 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= +<<<<<<< HEAD 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/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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -403,9 +413,14 @@ 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= +<<<<<<< HEAD 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-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= +github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -414,8 +429,13 @@ 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= +<<<<<<< HEAD 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-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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -445,8 +465,14 @@ 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= +<<<<<<< HEAD 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/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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -461,6 +487,7 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= 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= @@ -470,6 +497,12 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h 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/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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -925,8 +958,13 @@ 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= +<<<<<<< HEAD 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-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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -939,9 +977,15 @@ 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= +<<<<<<< HEAD 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-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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -995,9 +1039,14 @@ 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= +<<<<<<< HEAD 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-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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -1040,9 +1089,14 @@ 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= +<<<<<<< HEAD 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-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= +github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -1057,12 +1111,19 @@ 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= +<<<<<<< HEAD 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-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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -1073,9 +1134,14 @@ 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= +<<<<<<< HEAD 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 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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -2212,8 +2278,11 @@ 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= +<<<<<<< HEAD go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +======= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -2221,14 +2290,20 @@ 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= +<<<<<<< HEAD go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= +======= +>>>>>>> e8df32579 (update lotus-soup deps) 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= +<<<<<<< HEAD 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= +======= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -2585,8 +2660,13 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +<<<<<<< HEAD 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/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= +>>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -2879,9 +2959,14 @@ 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= +<<<<<<< HEAD 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= +======= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +>>>>>>> e8df32579 (update lotus-soup deps) 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 9f872d2a94cefbdc6939b59c7ec631642d8dcf2f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:23:43 +0200 Subject: [PATCH 078/129] 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 11cf83fb887ca1b451d501520a9210425fc3bbb9 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 11:39:06 -0500 Subject: [PATCH 079/129] 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 61e58c050..8e96b1024 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,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 6e2dc1444..d88b911c9 100644 --- a/go.sum +++ b/go.sum @@ -359,8 +359,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 beea49df89dae8dfd9b4f765c2207f1bce1087cb Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 18:48:17 +0200 Subject: [PATCH 080/129] 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 e93752b88d4865e9adfa428d04015f4c1bf32a64 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 14 Dec 2021 19:01:45 +0200 Subject: [PATCH 081/129] 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 f8eaa0b8c16a591dd765234b47e69ec66e23b59f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 12:49:18 -0500 Subject: [PATCH 082/129] 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 8e96b1024..d8a8e4ad8 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,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 d88b911c9..dc2e9e5c6 100644 --- a/go.sum +++ b/go.sum @@ -359,8 +359,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 b5dff4b63c2473dcfc9357e4c380d28026751e2f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:33:38 -0500 Subject: [PATCH 083/129] 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 d8a8e4ad8..692fec032 100644 --- a/go.mod +++ b/go.mod @@ -75,7 +75,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 dc2e9e5c6..144bef43b 100644 --- a/go.sum +++ b/go.sum @@ -698,8 +698,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 5a5d3afa8010d3daa16080b12dc796683b1e83c4 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:41:34 -0500 Subject: [PATCH 084/129] 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 692fec032..cb76ab892 100644 --- a/go.mod +++ b/go.mod @@ -103,7 +103,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 144bef43b..675fad37e 100644 --- a/go.sum +++ b/go.sum @@ -843,8 +843,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 ec21fd5f2c739da85ed64ef8518a982e1fcdc2e7 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 16:54:22 -0500 Subject: [PATCH 085/129] 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 cb76ab892..5096bbc54 100644 --- a/go.mod +++ b/go.mod @@ -101,7 +101,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 675fad37e..5449f391d 100644 --- a/go.sum +++ b/go.sum @@ -831,8 +831,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 1033ec304ac9279a01863c9f8b3f52c1d1a6ba4f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:50:18 -0500 Subject: [PATCH 086/129] 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 5096bbc54..0a2b173f9 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,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 5449f391d..ba25f012c 100644 --- a/go.sum +++ b/go.sum @@ -289,8 +289,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 d9361f4be0ab6fea6f40859d0623c1f6f88b7559 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:51:49 -0500 Subject: [PATCH 087/129] 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 0a2b173f9..708599e9d 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,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 ba25f012c..d4312ff31 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.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= From 8ef3f6d8b0feeff89ceacd159d316f6fdac43f18 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:53:11 -0500 Subject: [PATCH 088/129] 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 708599e9d..61dee10aa 100644 --- a/go.mod +++ b/go.mod @@ -90,7 +90,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-ipld-legacy v0.1.1 // indirect github.com/ipfs/go-log/v2 v2.4.0 diff --git a/go.sum b/go.sum index d4312ff31..5c24dcd36 100644 --- a/go.sum +++ b/go.sum @@ -769,8 +769,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 6730af0cfe34dd81b92fd4e5054fa59fb3d7488f Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 17:55:55 -0500 Subject: [PATCH 089/129] 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 61dee10aa..d803fe009 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,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.3-0.20220111000201-e42866db1a53 diff --git a/go.sum b/go.sum index 5c24dcd36..f0b88fadb 100644 --- a/go.sum +++ b/go.sum @@ -325,6 +325,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 5a2398baa0ed4c4244a374ba9d1064caf2bab2a4 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 18:05:52 -0500 Subject: [PATCH 090/129] Deps: Update lotus-soup to point to tagged releases --- go.sum | 2 -- testplans/lotus-soup/go.mod | 6 ++--- testplans/lotus-soup/go.sum | 45 ++++++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/go.sum b/go.sum index f0b88fadb..11f8287d3 100644 --- a/go.sum +++ b/go.sum @@ -323,8 +323,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= 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 96c4d57bb..b615f0c93 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -385,6 +385,7 @@ github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= <<<<<<< HEAD +<<<<<<< HEAD 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= @@ -392,6 +393,11 @@ github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhD 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= >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -430,12 +436,17 @@ 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= <<<<<<< HEAD +<<<<<<< HEAD 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-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= >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -466,11 +477,16 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO 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= <<<<<<< HEAD +<<<<<<< HEAD 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/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= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= >>>>>>> e8df32579 (update lotus-soup deps) github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -959,12 +975,18 @@ github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6 github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= <<<<<<< HEAD +<<<<<<< HEAD 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-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= >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -1040,6 +1062,7 @@ github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA 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= <<<<<<< HEAD +<<<<<<< HEAD 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= @@ -1047,6 +1070,11 @@ github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4uk 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= >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -1112,6 +1140,7 @@ github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVx 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= <<<<<<< HEAD +<<<<<<< HEAD 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= @@ -1120,10 +1149,18 @@ 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-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= +======= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= +<<<<<<< HEAD >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -1135,6 +1172,7 @@ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHt 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= <<<<<<< HEAD +<<<<<<< HEAD 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= @@ -1142,6 +1180,11 @@ github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704n 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= >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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 ace56b5aa8ddfb72ca74ece5b7f20f296f3104a6 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 14 Dec 2021 18:06:28 -0500 Subject: [PATCH 091/129] Deps: Update go-car to v0.3.3 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index d803fe009..faf017a73 100644 --- a/go.mod +++ b/go.mod @@ -100,7 +100,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 11f8287d3..0229aec5a 100644 --- a/go.sum +++ b/go.sum @@ -831,8 +831,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 908ba3fd5a9382859bd043f2d15f6826ba1e8167 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 15 Dec 2021 18:34:21 -0500 Subject: [PATCH 092/129] 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 faf017a73..e1fbdde34 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,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 0229aec5a..d9be365b3 100644 --- a/go.sum +++ b/go.sum @@ -244,8 +244,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= @@ -699,7 +699,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 8f311123129dfb6b9eb4e61febe44dd21b7bfdf2 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 11:42:09 +0200 Subject: [PATCH 093/129] 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 de2d19223..cedd7a862 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -304,7 +304,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 4f109ed08..e601abaa0 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 { @@ -528,7 +528,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) } @@ -562,7 +562,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 d4b0ea2b2..35e38883d 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 if msg.Signature.Type == crypto.SigTypeSecp256k1 { - 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 a536ef227c65ca2dfa1bc3088cd9e6cd10400f76 Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 11:47:28 +0200 Subject: [PATCH 094/129] 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 f9ff542ef465b75ef2b9fc4c499156a30d1b444b Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 12:04:04 +0200 Subject: [PATCH 095/129] 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 9b6f0c598..2af8aeb54 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -206,20 +206,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) @@ -735,7 +736,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 e4359eeb196039702c10c09eb85c756962e49f6d Mon Sep 17 00:00:00 2001 From: vyzo Date: Fri, 17 Dec 2021 13:44:05 +0200 Subject: [PATCH 096/129] 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 c3cc681e0c761a8e1131d472e83b2c14cd08faef 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 097/129] fix shed --- cmd/lotus-shed/terminations.go | 181 +++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 cmd/lotus-shed/terminations.go diff --git a/cmd/lotus-shed/terminations.go b/cmd/lotus-shed/terminations.go new file mode 100644 index 000000000..0691f35da --- /dev/null +++ b/cmd/lotus-shed/terminations.go @@ -0,0 +1,181 @@ +package main + +import ( + "bytes" + "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/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", + ArgsUsage: "[block to look back from] [lookback period (epochs)]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := context.TODO() + + if cctx.NArg() != 2 { + return fmt.Errorf("must pass block cid && lookback period") + } + + 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(ctx, blkCid) + if err != nil { + return err + } + + lbp, err := strconv.Atoi(cctx.Args().Get(1)) + if err != nil { + return fmt.Errorf("failed to parse input: %w", err) + } + + cutoff := blk.Height - abi.ChainEpoch(lbp) + + for blk.Height > cutoff { + pts, err := cs.LoadTipSet(ctx, types.NewTipSetKey(blk.Parents...)) + if err != nil { + return err + } + + blk = pts.Blocks()[0] + + msgs, err := cs.MessagesForTipset(ctx, 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 !builtin.IsStorageMinerActor(minerAct.Code) { + 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 { + return err + } + if find { + fmt.Printf("%s, %d, %d, %s, %s, %s\n", msg.To, sector.SectorNumber, deal, prop.Client, prop.PieceCID, prop.Label) + } + } + } + } + } + } + + return nil + }, +} From bc2171f413888efcce806125f48f14498ee96097 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Sun, 19 Dec 2021 20:44:19 -0500 Subject: [PATCH 098/129] Fast migration for v15 --- .../actors/builtin/paych/message.go.template | 4 + chain/actors/builtin/paych/message0.go | 4 +- chain/actors/builtin/paych/message2.go | 4 +- chain/actors/builtin/paych/message3.go | 4 +- chain/actors/builtin/paych/message4.go | 4 +- chain/actors/builtin/paych/message5.go | 4 +- chain/actors/builtin/paych/message6.go | 4 +- chain/actors/builtin/paych/message7.go | 4 +- chain/actors/builtin/paych/state.go.template | 18 + chain/actors/builtin/paych/v7.go | 16 + chain/consensus/filcns/upgrades.go | 20 +- chain/stmgr/forks.go | 6 +- chain/stmgr/stmgr.go | 13 +- cmd/lotus-shed/main.go | 2 + cmd/lotus-shed/migrations.go | 127 +++++++ go.mod | 3 +- go.sum | 5 +- lotuspond/front/src/chain/methods.json | 5 +- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 320 ++---------------- 20 files changed, 252 insertions(+), 317 deletions(-) create mode 100644 cmd/lotus-shed/migrations.go diff --git a/chain/actors/builtin/paych/message.go.template b/chain/actors/builtin/paych/message.go.template index 4a5ea2331..99f64cabb 100644 --- a/chain/actors/builtin/paych/message.go.template +++ b/chain/actors/builtin/paych/message.go.template @@ -39,7 +39,11 @@ func (m message{{.v}}) Create(to address.Address, initialAmount abi.TokenAmount) func (m message{{.v}}) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych{{.v}}.UpdateChannelStateParams{ + {{if (ge .v 7)}} + Sv: toV{{.v}}SignedVoucher(*sv), + {{else}} Sv: *sv, + {{end}} Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message0.go b/chain/actors/builtin/paych/message0.go index bfeb2731e..7cba977e3 100644 --- a/chain/actors/builtin/paych/message0.go +++ b/chain/actors/builtin/paych/message0.go @@ -39,7 +39,9 @@ func (m message0) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message0) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych0.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message2.go b/chain/actors/builtin/paych/message2.go index 2cf3ef22e..60c7fe16e 100644 --- a/chain/actors/builtin/paych/message2.go +++ b/chain/actors/builtin/paych/message2.go @@ -39,7 +39,9 @@ func (m message2) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message2) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych2.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message3.go b/chain/actors/builtin/paych/message3.go index 50503a140..04fb35b57 100644 --- a/chain/actors/builtin/paych/message3.go +++ b/chain/actors/builtin/paych/message3.go @@ -39,7 +39,9 @@ func (m message3) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message3) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych3.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message4.go b/chain/actors/builtin/paych/message4.go index b2c6b612e..9f5e000d9 100644 --- a/chain/actors/builtin/paych/message4.go +++ b/chain/actors/builtin/paych/message4.go @@ -39,7 +39,9 @@ func (m message4) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message4) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych4.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message5.go b/chain/actors/builtin/paych/message5.go index 37a2b6f04..71e6b6799 100644 --- a/chain/actors/builtin/paych/message5.go +++ b/chain/actors/builtin/paych/message5.go @@ -39,7 +39,9 @@ func (m message5) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message5) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych5.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message6.go b/chain/actors/builtin/paych/message6.go index aecf26983..7f80bc4a6 100644 --- a/chain/actors/builtin/paych/message6.go +++ b/chain/actors/builtin/paych/message6.go @@ -39,7 +39,9 @@ func (m message6) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message6) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych6.UpdateChannelStateParams{ - Sv: *sv, + + Sv: *sv, + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/message7.go b/chain/actors/builtin/paych/message7.go index 41dfa1bdd..e3ee0d77b 100644 --- a/chain/actors/builtin/paych/message7.go +++ b/chain/actors/builtin/paych/message7.go @@ -39,7 +39,9 @@ func (m message7) Create(to address.Address, initialAmount abi.TokenAmount) (*ty func (m message7) Update(paych address.Address, sv *SignedVoucher, secret []byte) (*types.Message, error) { params, aerr := actors.SerializeParams(&paych7.UpdateChannelStateParams{ - Sv: *sv, + + Sv: toV7SignedVoucher(*sv), + Secret: secret, }) if aerr != nil { diff --git a/chain/actors/builtin/paych/state.go.template b/chain/actors/builtin/paych/state.go.template index 3e41f5be5..f11407202 100644 --- a/chain/actors/builtin/paych/state.go.template +++ b/chain/actors/builtin/paych/state.go.template @@ -112,3 +112,21 @@ func (ls *laneState{{.v}}) Redeemed() (big.Int, error) { func (ls *laneState{{.v}}) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + +{{if (ge .v 7)}} +func toV{{.v}}SignedVoucher(sv SignedVoucher) paych{{.v}}.SignedVoucher { + return paych{{.v}}.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} +{{end}} \ No newline at end of file diff --git a/chain/actors/builtin/paych/v7.go b/chain/actors/builtin/paych/v7.go index ce09ea2e4..19c801c82 100644 --- a/chain/actors/builtin/paych/v7.go +++ b/chain/actors/builtin/paych/v7.go @@ -112,3 +112,19 @@ func (ls *laneState7) Redeemed() (big.Int, error) { func (ls *laneState7) Nonce() (uint64, error) { return ls.LaneState.Nonce, nil } + +func toV7SignedVoucher(sv SignedVoucher) paych7.SignedVoucher { + return paych7.SignedVoucher{ + ChannelAddr: sv.ChannelAddr, + TimeLockMin: sv.TimeLockMin, + TimeLockMax: sv.TimeLockMax, + SecretHash: sv.SecretPreimage, + Extra: sv.Extra, + Lane: sv.Lane, + Nonce: sv.Nonce, + Amount: sv.Amount, + MinSettleHeight: sv.MinSettleHeight, + Merges: sv.Merges, + Signature: sv.Signature, + } +} diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 863193180..a66c9c2ca 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -5,6 +5,8 @@ import ( "runtime" "time" + autobatch "github.com/application-research/go-bs-autobatch" + "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" @@ -1245,8 +1247,15 @@ func PreUpgradeActorsV7(ctx context.Context, sm *stmgr.StateManager, cache stmgr workerCount /= 2 } - config := nv15.Config{MaxWorkers: uint(workerCount)} - _, err := upgradeActorsV7Common(ctx, sm, cache, root, epoch, ts, config) + lbts, lbRoot, err := stmgr.GetLookbackTipSetForRound(ctx, sm, ts, epoch) + if err != nil { + return xerrors.Errorf("error getting lookback ts for premigration: %w", err) + } + + config := nv15.Config{MaxWorkers: uint(workerCount), + ProgressLogPeriod: time.Minute * 5} + + _, err = upgradeActorsV7Common(ctx, sm, cache, lbRoot, epoch, lbts, config) return err } @@ -1255,7 +1264,12 @@ func upgradeActorsV7Common( root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync()) + writeStore, err := autobatch.NewBlockstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync(), 100_000, 100, true) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to create writeStore: %w", err) + } + + buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) store := store.ActorStore(ctx, buf) // Load the state root. diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index 454f781c4..a83ffdf7a 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -8,6 +8,8 @@ import ( "sync" "time" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + "github.com/ipfs/go-cid" "golang.org/x/xerrors" @@ -15,8 +17,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/specs-actors/v3/actors/migration/nv10" - "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init" @@ -211,7 +211,7 @@ func (sm *StateManager) hasExpensiveFork(height abi.ChainEpoch) bool { return ok } -func runPreMigration(ctx context.Context, sm *StateManager, fn PreMigrationFunc, cache *nv10.MemMigrationCache, ts *types.TipSet) { +func runPreMigration(ctx context.Context, sm *StateManager, fn PreMigrationFunc, cache *nv15.MemMigrationCache, ts *types.TipSet) { height := ts.Height() parent := ts.ParentState() diff --git a/chain/stmgr/stmgr.go b/chain/stmgr/stmgr.go index cfd9192f4..3bca39105 100644 --- a/chain/stmgr/stmgr.go +++ b/chain/stmgr/stmgr.go @@ -4,6 +4,8 @@ import ( "context" "sync" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/lotus/chain/beacon" @@ -18,10 +20,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" - // Used for genesis. - msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" - "github.com/filecoin-project/specs-actors/v3/actors/migration/nv10" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" @@ -30,6 +28,9 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" + + // Used for genesis. + msig0 "github.com/filecoin-project/specs-actors/actors/builtin/multisig" ) const LookbackNoLimit = api.LookbackNoLimit @@ -53,7 +54,7 @@ type versionSpec struct { type migration struct { upgrade MigrationFunc preMigrations []PreMigration - cache *nv10.MemMigrationCache + cache *nv15.MemMigrationCache } type Executor interface { @@ -121,7 +122,7 @@ func NewStateManager(cs *store.ChainStore, exec Executor, sys vm.SyscallBuilder, migration := &migration{ upgrade: upgrade.Migration, preMigrations: upgrade.PreMigrations, - cache: nv10.NewMemMigrationCache(), + cache: nv15.NewMemMigrationCache(), } stateMigrations[upgrade.Height] = migration } diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index d35fb56dd..698841597 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -65,6 +65,8 @@ func main() { fr32Cmd, chainCmd, balancerCmd, + terminationsCmd, + migrationsCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go new file mode 100644 index 000000000..85987c658 --- /dev/null +++ b/cmd/lotus-shed/migrations.go @@ -0,0 +1,127 @@ +package main + +import ( + "context" + "fmt" + "io" + "time" + + "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/vm" + "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" + "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + + "github.com/filecoin-project/lotus/chain/types" + + "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/node/repo" + "github.com/ipfs/go-cid" + "github.com/urfave/cli/v2" +) + +var migrationsCmd = &cli.Command{ + Name: "migrate-nv15", + Description: "Run the specified migration", + ArgsUsage: "[block to look back from]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "repo", + Value: "~/.lotus", + }, + }, + Action: func(cctx *cli.Context) error { + ctx := context.TODO() + + if cctx.NArg() != 1 { + 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 + + sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + if err != nil { + return err + } + + cache := nv15.NewMemMigrationCache() + + blk, err := cs.GetBlock(ctx, blkCid) + if err != nil { + return err + } + + migrationTs, err := cs.LoadTipSet(ctx, types.NewTipSetKey(blk.Parents...)) + if err != nil { + return err + } + + ts1, err := cs.GetTipsetByHeight(ctx, blk.Height-240, migrationTs, false) + if err != nil { + return err + } + + startTime := time.Now() + + err = filcns.PreUpgradeActorsV7(ctx, sm, cache, ts1.ParentState(), ts1.Height()-1, ts1) + if err != nil { + return err + } + + fmt.Println("completed round 1, took ", time.Since(startTime)) + startTime = time.Now() + + newCid1, err := filcns.UpgradeActorsV7(ctx, sm, cache, nil, blk.ParentStateRoot, blk.Height-1, migrationTs) + if err != nil { + return err + } + fmt.Println("completed round actual (with cache), took ", time.Since(startTime)) + + fmt.Println("new cid", newCid1) + + newCid2, err := filcns.UpgradeActorsV7(ctx, sm, nv15.NewMemMigrationCache(), nil, blk.ParentStateRoot, blk.Height-1, migrationTs) + if err != nil { + return err + } + fmt.Println("completed round actual (without cache), took ", time.Since(startTime)) + + fmt.Println("new cid", newCid2) + return nil + }, +} diff --git a/go.mod b/go.mod index e1fbdde34..d4e03972e 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ 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/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 @@ -41,7 +42,7 @@ require ( 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.3-0.20220111000201-e42866db1a53 - github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-state-types v0.1.3 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.1.0 diff --git a/go.sum b/go.sum index d9be365b3..ff1c1a032 100644 --- a/go.sum +++ b/go.sum @@ -100,6 +100,8 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 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= @@ -346,8 +348,9 @@ 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 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.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= +github.com/filecoin-project/go-state-types v0.1.3/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= diff --git a/lotuspond/front/src/chain/methods.json b/lotuspond/front/src/chain/methods.json index 1f6191a94..15c04ca28 100644 --- a/lotuspond/front/src/chain/methods.json +++ b/lotuspond/front/src/chain/methods.json @@ -712,7 +712,7 @@ "CreateMiner", "UpdateClaimedPower", "EnrollCronEvent", - "OnEpochTickEnd", + "CronTick", "UpdatePledgeTotal", "SubmitPoRepForBulkVerify", "CurrentTotalPower" @@ -728,6 +728,7 @@ "RemoveVerifier", "AddVerifiedClient", "UseBytes", - "RestoreBytes" + "RestoreBytes", + "RemoveVerifiedClientDataCap" ] } \ No newline at end of file diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 472a38357..cb7b658ac 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -11,7 +11,7 @@ require ( 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-jsonrpc v0.1.5 - github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-state-types v0.1.3 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 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index b615f0c93..aabdcc8ed 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -143,6 +143,8 @@ github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QN github.com/apache/arrow/go/arrow v0.0.0-20200923215132-ac86123a3f01/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= +github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 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= @@ -407,6 +409,8 @@ github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoC 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-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= 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= @@ -468,8 +472,9 @@ 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 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.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= +github.com/filecoin-project/go-state-types v0.1.3/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= @@ -509,9 +514,7 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 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-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/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= @@ -521,27 +524,20 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/g >>>>>>> e8df32579 (update lotus-soup deps) 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= 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= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp4nseejPd+UKxtCVQ2hUxNTZ7qQZJa7CLriIeo= -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/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= -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= 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/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -561,24 +557,18 @@ 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= -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= 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= -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-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= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -643,13 +633,11 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 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= @@ -676,15 +664,12 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -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= -github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= 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= -github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -693,10 +678,8 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5 github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= -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= @@ -704,14 +687,12 @@ 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= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= 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= @@ -721,7 +702,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -740,11 +720,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -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.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= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -762,13 +740,11 @@ 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= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= 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= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -785,7 +761,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= @@ -797,41 +772,32 @@ github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEo github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= 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.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -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= 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/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-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= 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= @@ -839,7 +805,6 @@ github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/ 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= @@ -853,7 +818,6 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh 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= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -868,7 +832,6 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -887,16 +850,13 @@ github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbc 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= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= 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 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= 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= @@ -905,12 +865,10 @@ github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmc github.com/influxdata/flux v0.127.3/go.mod h1:Zc0P/HNnJnhBlm4QsmsBbAeAdtccKo4Eu0OfkP3RCk0= github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA= github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= -github.com/influxdata/influxdb v1.9.4 h1:hZMq5fd4enVnruYHd7qCHsqG7kWQ/msA6x+kCvGFsRY= github.com/influxdata/influxdb v1.9.4/go.mod h1:dR0WCHqaHPpJLaqWnRSl/QHsbXJR+QpofbZXyTc8ccw= 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= -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= 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= @@ -923,20 +881,16 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mq github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= 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.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.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= @@ -947,9 +901,7 @@ 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.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= github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -962,9 +914,7 @@ github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X 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= 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= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= @@ -972,10 +922,10 @@ 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.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= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD 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= ======= @@ -985,23 +935,20 @@ github.com/ipfs/go-ds-badger2 v0.1.2-0.20211203191834-bc6df5c2417c/go.mod h1:wD6 ======= 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= +======= +>>>>>>> 8aabe1b48 (Fast migration for v15) github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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/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.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= <<<<<<< HEAD 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-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= @@ -1013,49 +960,34 @@ github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2Is 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= -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.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-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= 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= @@ -1072,17 +1004,13 @@ github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdx >>>>>>> e8df32579 (update lotus-soup deps) ======= 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= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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-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= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -1090,7 +1018,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= @@ -1102,24 +1029,19 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf 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/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.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/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= <<<<<<< HEAD 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-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= @@ -1128,15 +1050,10 @@ github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 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= <<<<<<< HEAD @@ -1152,17 +1069,18 @@ github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vw ======= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= <<<<<<< HEAD +<<<<<<< HEAD >>>>>>> e8df32579 (update lotus-soup deps) ======= github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= +======= +>>>>>>> 8aabe1b48 (Fast migration for v15) github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= @@ -1174,7 +1092,6 @@ github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD <<<<<<< HEAD <<<<<<< HEAD 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 v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= @@ -1186,44 +1103,33 @@ github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= -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= 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/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/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= 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= @@ -1241,22 +1147,18 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3TDYCcsFy9hpqb0= 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/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3 h1:Iy7Ifq2ysilWU4QlCx/97OoI4xT1IV7i8byT/EyIT/M= 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/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -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= @@ -1267,13 +1169,10 @@ 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= -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 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.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= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= @@ -1282,21 +1181,17 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv 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/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c h1:3pM6OrLfkfe0rKZjE6MHdcTaI0ohcHbRUZJeJqkvPb4= github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod h1:ESXZSm2iaF+1P5o6VFEWpeARTQpcil4e1DwumnTopdg= 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/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= 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/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= @@ -1304,27 +1199,21 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/lib/pq v1.0.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.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= @@ -1340,10 +1229,8 @@ github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ 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/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= @@ -1354,7 +1241,6 @@ 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.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= @@ -1363,7 +1249,6 @@ github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uL 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/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= @@ -1373,11 +1258,9 @@ github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3 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= 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= @@ -1412,7 +1295,6 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk 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= @@ -1424,7 +1306,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.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= @@ -1433,14 +1314,11 @@ 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.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= 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= @@ -1449,20 +1327,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/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.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= 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= @@ -1481,17 +1355,13 @@ github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD 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/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/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -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= @@ -1499,17 +1369,14 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU 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= 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.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= @@ -1528,7 +1395,6 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg 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-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= @@ -1541,11 +1407,9 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts 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-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= 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= @@ -1557,7 +1421,6 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIW 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-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= @@ -1572,12 +1435,10 @@ 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.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= -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= @@ -1585,49 +1446,40 @@ 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= 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 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= @@ -1636,7 +1488,6 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr 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.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= @@ -1647,7 +1498,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= @@ -1657,10 +1507,8 @@ github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.5/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.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.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= @@ -1670,14 +1518,11 @@ github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86 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-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1698,12 +1543,9 @@ github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0a 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/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1713,7 +1555,6 @@ 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= -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-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1725,17 +1566,14 @@ 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= -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.3/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-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= 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= @@ -1752,16 +1590,11 @@ 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.29/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/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= @@ -1770,12 +1603,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/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= @@ -1795,13 +1626,10 @@ 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/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= -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= @@ -1815,17 +1643,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= @@ -1837,11 +1662,9 @@ 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.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= @@ -1851,19 +1674,16 @@ 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.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.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/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1886,12 +1706,9 @@ 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 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= @@ -1908,7 +1725,6 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 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 v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1919,24 +1735,19 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J 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/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.0.3-0.20180606204148-bd9c31933947/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= @@ -1953,7 +1764,6 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 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= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= @@ -1963,17 +1773,14 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= 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/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -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= @@ -1992,14 +1799,12 @@ github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O 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= @@ -2013,7 +1818,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= @@ -2029,38 +1833,27 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 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= -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.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= -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/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -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.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= 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= @@ -2072,10 +1865,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= 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= @@ -2098,7 +1889,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/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= @@ -2110,16 +1900,13 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB 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-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/snowflakedb/gosnowflake v1.6.1/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98= @@ -2129,10 +1916,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/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -2154,7 +1939,6 @@ github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5J 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= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -2164,12 +1948,9 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P 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/testground/sdk-go v0.2.6 h1:sMwv0/caNNODKfdPigNqmSSIZLcse7pZX6fgrjCGBIs= github.com/testground/sdk-go v0.2.6/go.mod h1:Q4dnWsUBH+dZ1u7aEGDBHWGUaLfhitjUq3UJQqxeTmk= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= @@ -2177,7 +1958,6 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -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= @@ -2187,43 +1967,31 @@ github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW 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= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+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/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= 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-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= @@ -2239,26 +2007,19 @@ 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/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-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/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -2266,13 +2027,10 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7V github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= 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/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= 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= @@ -2281,21 +2039,15 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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= 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 h1:i0ZbOQocHUjfFasBiUql5zVeC7u/vahFd96DFA8UOWk= 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= @@ -2317,12 +2069,14 @@ 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= <<<<<<< HEAD +<<<<<<< HEAD go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= +======= +>>>>>>> 8aabe1b48 (Fast migration for v15) go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= ======= >>>>>>> e8df32579 (update lotus-soup deps) @@ -2334,16 +2088,22 @@ go.opentelemetry.io/otel/metric v0.25.0/go.mod h1:E884FSpQfnJOMMUaq+05IWlJ4rjZpk 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= <<<<<<< HEAD +<<<<<<< HEAD go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= ======= >>>>>>> e8df32579 (update lotus-soup deps) +======= +>>>>>>> 8aabe1b48 (Fast migration for v15) 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= <<<<<<< HEAD +<<<<<<< HEAD go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= +======= +>>>>>>> 8aabe1b48 (Fast migration for v15) go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= ======= >>>>>>> e8df32579 (update lotus-soup deps) @@ -2354,22 +2114,17 @@ 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.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 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.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -2382,10 +2137,8 @@ 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-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= @@ -2441,7 +2194,6 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y 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/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= @@ -2460,7 +2212,6 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 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= @@ -2476,7 +2227,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= @@ -2488,7 +2238,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.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= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2561,7 +2310,6 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx 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/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= @@ -2583,7 +2331,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-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2704,7 +2451,10 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc 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= <<<<<<< HEAD +<<<<<<< HEAD golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +======= +>>>>>>> 8aabe1b48 (Fast migration for v15) golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= ======= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= @@ -2712,7 +2462,6 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc >>>>>>> e8df32579 (update lotus-soup deps) 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-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2722,7 +2471,6 @@ 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= @@ -2813,12 +2561,10 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 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/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= -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.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -2896,7 +2642,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= @@ -2926,7 +2671,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= @@ -2940,17 +2684,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= @@ -2960,7 +2701,6 @@ 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/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -2972,12 +2712,9 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/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= @@ -2989,7 +2726,6 @@ 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= k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= @@ -3004,25 +2740,23 @@ k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= <<<<<<< HEAD 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= +<<<<<<< HEAD ======= lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= >>>>>>> e8df32579 (update lotus-soup deps) modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= +======= +>>>>>>> 8aabe1b48 (Fast migration for v15) 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 def5cb559e818f0629017693a086c93d245f00f8 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 10 Jan 2022 18:08:21 -0500 Subject: [PATCH 099/129] Update to actors v7.0.0-rc1 --- go.mod | 2 +- go.sum | 6 ++++-- testplans/lotus-soup/go.sum | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index d4e03972e..c99f75006 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,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-20211230214648-aeae366b083a + github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 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 diff --git a/go.sum b/go.sum index ff1c1a032..baa71d81f 100644 --- a/go.sum +++ b/go.sum @@ -303,6 +303,8 @@ github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoC 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-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= 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= @@ -378,8 +380,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 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-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-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= 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= diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index aabdcc8ed..ff4311412 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -514,7 +514,7 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 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-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= -github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= ======= github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= From da39b16c830da59c1daf6991afed33cd88783e90 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 11:31:59 -0500 Subject: [PATCH 100/129] Implement an autobatcher --- blockstore/autobatch.go | 93 ++++++++++++++++++++++++++++++ blockstore/autobatch_test.go | 33 +++++++++++ chain/consensus/filcns/upgrades.go | 23 +++----- go.mod | 1 - go.sum | 2 - 5 files changed, 134 insertions(+), 18 deletions(-) create mode 100644 blockstore/autobatch.go create mode 100644 blockstore/autobatch_test.go diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go new file mode 100644 index 000000000..308b98b4b --- /dev/null +++ b/blockstore/autobatch.go @@ -0,0 +1,93 @@ +package blockstore + +import ( + "context" + "sync" + + block "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" +) + +// autolog is a logger for the autobatching blockstore. It is subscoped from the +// blockstore logger. +var autolog = log.Named("auto") + +type AutobatchBlockstore struct { + bufferedBlks []block.Block + bufferedBlksLk sync.Mutex + flushLk sync.Mutex + backingBs Blockstore + bufferCapacity int + bufferSize int +} + +func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { + panic("implement me") +} + +func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) GetSize(context.Context, cid.Cid) (int, error) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) PutMany(context.Context, []block.Block) error { + panic("implement me") +} + +func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { + panic("implement me") +} + +func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { + panic("implement me") +} + +func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { + panic("implement me") +} + +func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { + bs := &AutobatchBlockstore{ + backingBs: backingBs, + bufferCapacity: bufferCapacity, + } + + return bs +} + +// May NOT `Get` blocks that have been `Put` into this store +// Only guaranteed to fetch those that were already in the backingBs at creation of this store and those at the most recent `Flush` +func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + return bs.backingBs.Get(ctx, c) +} + +func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { + // TODO: Would it be faster to check if bs.backing Has the blk (and skip if so)? + bs.bufferedBlksLk.Lock() + bs.bufferedBlks = append(bs.bufferedBlks, blk) + bs.bufferSize += len(blk.RawData()) + if bs.bufferSize >= bs.bufferCapacity { + // time to flush + go bs.Flush(ctx) + } + bs.bufferedBlksLk.Unlock() + return nil +} + +func (bs *AutobatchBlockstore) Flush(ctx context.Context) { + bs.flushLk.Lock() + defer bs.flushLk.Unlock() + bs.bufferedBlksLk.Lock() + toFlush := bs.bufferedBlks + bs.bufferedBlks = []block.Block{} + bs.bufferedBlksLk.Unlock() + // error????? + bs.backingBs.PutMany(ctx, toFlush) +} diff --git a/blockstore/autobatch_test.go b/blockstore/autobatch_test.go new file mode 100644 index 000000000..fe52c55c7 --- /dev/null +++ b/blockstore/autobatch_test.go @@ -0,0 +1,33 @@ +package blockstore + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAutobatchBlockstore(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ab := NewAutobatch(ctx, NewMemory(), len(b0.RawData())+len(b1.RawData())-1) + + require.NoError(t, ab.Put(ctx, b0)) + require.NoError(t, ab.Put(ctx, b1)) + require.NoError(t, ab.Put(ctx, b2)) + + ab.Flush(ctx) + + v0, err := ab.Get(ctx, b0.Cid()) + require.NoError(t, err) + require.Equal(t, b0.RawData(), v0.RawData()) + + v1, err := ab.Get(ctx, b1.Cid()) + require.NoError(t, err) + require.Equal(t, b1.RawData(), v1.RawData()) + + v2, err := ab.Get(ctx, b2.Cid()) + require.NoError(t, err) + require.Equal(t, b2.RawData(), v2.RawData()) +} diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index a66c9c2ca..548f59aac 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -5,7 +5,7 @@ import ( "runtime" "time" - autobatch "github.com/application-research/go-bs-autobatch" + "github.com/docker/go-units" "github.com/filecoin-project/specs-actors/v6/actors/migration/nv14" "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" @@ -1264,14 +1264,14 @@ func upgradeActorsV7Common( root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - writeStore, err := autobatch.NewBlockstore(sm.ChainStore().StateBlockstore(), blockstore.NewMemorySync(), 100_000, 100, true) - if err != nil { - return cid.Undef, xerrors.Errorf("failed to create writeStore: %w", err) - } - buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) - store := store.ActorStore(ctx, buf) + ctxWithCancel, cancel := context.WithCancel(ctx) + defer cancel() + writeStore := blockstore.NewAutobatch(ctxWithCancel, sm.ChainStore().StateBlockstore(), units.GiB) + // TODO: pretty sure we'd achieve nothing by doing this, confirm in review + //buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) + store := store.ActorStore(ctx, writeStore) // Load the state root. var stateRoot types.StateRoot if err := store.Get(ctx, root, &stateRoot); err != nil { @@ -1303,14 +1303,7 @@ func upgradeActorsV7Common( // 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) - } - } + writeStore.Flush(ctx) return newRoot, nil } diff --git a/go.mod b/go.mod index c99f75006..ac5d3b16a 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,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/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 github.com/buger/goterm v1.0.3 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327 diff --git a/go.sum b/go.sum index baa71d81f..321b2a129 100644 --- a/go.sum +++ b/go.sum @@ -100,8 +100,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 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= From a6489f2dd745f85fa1ddea72f1d22c667b71ab02 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 17:17:34 -0500 Subject: [PATCH 101/129] cache added cids --- blockstore/autobatch.go | 17 +- testplans/lotus-soup/go.sum | 315 +++++++++++++++++++++++++++++++++++- 2 files changed, 324 insertions(+), 8 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 308b98b4b..5d78e92a1 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -14,6 +14,7 @@ var autolog = log.Named("auto") type AutobatchBlockstore struct { bufferedBlks []block.Block + addedCids map[cid.Cid]struct{} bufferedBlksLk sync.Mutex flushLk sync.Mutex backingBs Blockstore @@ -57,6 +58,7 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) bs := &AutobatchBlockstore{ backingBs: backingBs, bufferCapacity: bufferCapacity, + addedCids: make(map[cid.Cid]struct{}), } return bs @@ -69,13 +71,16 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - // TODO: Would it be faster to check if bs.backing Has the blk (and skip if so)? bs.bufferedBlksLk.Lock() - bs.bufferedBlks = append(bs.bufferedBlks, blk) - bs.bufferSize += len(blk.RawData()) - if bs.bufferSize >= bs.bufferCapacity { - // time to flush - go bs.Flush(ctx) + _, ok := bs.addedCids[blk.Cid()] + if !ok { + bs.bufferedBlks = append(bs.bufferedBlks, blk) + bs.addedCids[blk.Cid()] = struct{}{} + bs.bufferSize += len(blk.RawData()) + if bs.bufferSize >= bs.bufferCapacity { + // time to flush + go bs.Flush(ctx) + } } bs.bufferedBlksLk.Unlock() return nil diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index ff4311412..545c0ddf1 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -143,8 +143,6 @@ github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QN github.com/apache/arrow/go/arrow v0.0.0-20200923215132-ac86123a3f01/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402 h1:8l0IQrh8vwqihv5jNhKCYB+YGH5hGGFL7od/2ETWrZw= -github.com/application-research/go-bs-autobatch v0.0.0-20211215020302-c4c0b68ef402/go.mod h1:86iZMWoyMLfLpYyd0aMPyECUpFwf8oZRjS5jJ9quZ7I= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 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= @@ -514,7 +512,9 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 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-20211222192039-c83bea50c402/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= +github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsGGCE+NumpF6aiBoU/2X5W4= github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= +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/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3oLyRf0Rkl4jFO8Wew= @@ -524,20 +524,27 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/g >>>>>>> e8df32579 (update lotus-soup deps) 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= 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= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/foxcpp/go-mockdns v0.0.0-20201212160233-ede2f9158d15/go.mod h1:tPg4cp4nseejPd+UKxtCVQ2hUxNTZ7qQZJa7CLriIeo= +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/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= +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= 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/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -557,18 +564,24 @@ 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= +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= 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= +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-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= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -633,11 +646,13 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 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= @@ -664,12 +679,15 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +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= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= 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= +github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -678,8 +696,10 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5 github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= +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= @@ -687,12 +707,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= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= 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= @@ -702,6 +724,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -720,9 +743,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +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.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= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -740,11 +765,13 @@ 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= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= 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= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -761,6 +788,7 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= @@ -772,32 +800,41 @@ github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEo github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= 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.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= +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= 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/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-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= 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= @@ -805,6 +842,7 @@ github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/ 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= @@ -818,6 +856,7 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh 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= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -832,6 +871,7 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -850,13 +890,16 @@ github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbc 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= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= 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 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= 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= @@ -865,10 +908,12 @@ github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmc github.com/influxdata/flux v0.127.3/go.mod h1:Zc0P/HNnJnhBlm4QsmsBbAeAdtccKo4Eu0OfkP3RCk0= github.com/influxdata/httprouter v1.3.1-0.20191122104820-ee83e2772f69/go.mod h1:pwymjR6SrP3gD3pRj9RJwdl1j5s3doEEV8gS4X9qSzA= github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= +github.com/influxdata/influxdb v1.9.4 h1:hZMq5fd4enVnruYHd7qCHsqG7kWQ/msA6x+kCvGFsRY= github.com/influxdata/influxdb v1.9.4/go.mod h1:dR0WCHqaHPpJLaqWnRSl/QHsbXJR+QpofbZXyTc8ccw= 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= +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= 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= @@ -881,16 +926,20 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mq github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= +github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= 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.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.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= @@ -901,7 +950,9 @@ 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.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= github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -914,7 +965,9 @@ github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X 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= 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= github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= @@ -922,10 +975,14 @@ 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.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= <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 544cfa63a (cache added cids) 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= ======= @@ -943,12 +1000,17 @@ github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIyk 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/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.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= <<<<<<< HEAD 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-graphsync v0.11.0 h1:PiiD5CnoC3xEHMW8d6uBGqGcoTwiMB5d9CORIEyF6iA= @@ -960,34 +1022,49 @@ github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2Is 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= +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.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-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= 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= @@ -1008,9 +1085,12 @@ github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4uk >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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-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= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= @@ -1018,6 +1098,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= @@ -1029,19 +1110,24 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf 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/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.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/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= <<<<<<< HEAD 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-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= @@ -1050,10 +1136,15 @@ github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 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= <<<<<<< HEAD @@ -1081,6 +1172,7 @@ 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= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= @@ -1092,6 +1184,7 @@ github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD <<<<<<< HEAD <<<<<<< HEAD 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 v0.14.3-0.20211207234443-319145880958 h1:olscE5Sv+ts+N9YLQsIL9k6eS6y6CXMGRl5RCr2Cn/E= @@ -1103,33 +1196,44 @@ github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= +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= 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/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/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= 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= @@ -1147,18 +1251,22 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3TDYCcsFy9hpqb0= 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/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/kabukky/httpscerts v0.0.0-20150320125433-617593d7dcb3 h1:Iy7Ifq2ysilWU4QlCx/97OoI4xT1IV7i8byT/EyIT/M= 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/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +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= @@ -1169,10 +1277,13 @@ 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= +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 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.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= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= @@ -1181,17 +1292,21 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv 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/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c h1:3pM6OrLfkfe0rKZjE6MHdcTaI0ohcHbRUZJeJqkvPb4= github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c/go.mod h1:ESXZSm2iaF+1P5o6VFEWpeARTQpcil4e1DwumnTopdg= 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/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= 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/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= @@ -1199,21 +1314,27 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/lib/pq v1.0.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.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= @@ -1229,8 +1350,10 @@ github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ 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/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= @@ -1241,6 +1364,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.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= @@ -1249,6 +1373,7 @@ github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uL 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/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= @@ -1258,9 +1383,11 @@ github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3 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= 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= @@ -1295,6 +1422,7 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk 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= @@ -1306,6 +1434,7 @@ 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.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= @@ -1314,11 +1443,14 @@ 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.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= 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= @@ -1327,16 +1459,20 @@ 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.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= 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= @@ -1355,13 +1491,17 @@ github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuD 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/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/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= +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= @@ -1369,14 +1509,17 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU 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= 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.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= @@ -1395,6 +1538,7 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg 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-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= @@ -1407,9 +1551,11 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts 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-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= 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= @@ -1421,6 +1567,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIW 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-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= @@ -1435,10 +1582,12 @@ 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.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= +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= @@ -1446,40 +1595,49 @@ 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= 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 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= @@ -1488,6 +1646,7 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr 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.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= @@ -1498,6 +1657,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= @@ -1507,8 +1667,10 @@ github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZ github.com/libp2p/go-yamux v1.3.5/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.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.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= @@ -1518,11 +1680,14 @@ github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86 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-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1543,9 +1708,12 @@ github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0a 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/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1555,6 +1723,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= +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-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -1566,14 +1735,17 @@ 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= +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.3/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-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= 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= @@ -1590,11 +1762,16 @@ 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.29/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/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= @@ -1603,10 +1780,12 @@ 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/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= @@ -1626,10 +1805,13 @@ 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/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= +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= @@ -1643,14 +1825,17 @@ 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= @@ -1662,9 +1847,11 @@ 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.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= @@ -1674,16 +1861,19 @@ 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.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.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/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1706,9 +1896,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 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= @@ -1725,6 +1918,7 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 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 v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1735,19 +1929,24 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J 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/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.0.3-0.20180606204148-bd9c31933947/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= @@ -1764,6 +1963,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 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= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= @@ -1773,14 +1973,17 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= 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/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +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= @@ -1799,12 +2002,14 @@ github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O 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= @@ -1818,6 +2023,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= @@ -1833,27 +2039,38 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 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= +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.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= +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/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +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.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= 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= @@ -1865,8 +2082,10 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= 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= @@ -1889,6 +2108,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/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= @@ -1900,13 +2120,16 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB 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-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/snowflakedb/gosnowflake v1.6.1/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98= @@ -1916,8 +2139,10 @@ 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/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -1939,6 +2164,7 @@ github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5J 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= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1948,9 +2174,12 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P 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/testground/sdk-go v0.2.6 h1:sMwv0/caNNODKfdPigNqmSSIZLcse7pZX6fgrjCGBIs= github.com/testground/sdk-go v0.2.6/go.mod h1:Q4dnWsUBH+dZ1u7aEGDBHWGUaLfhitjUq3UJQqxeTmk= github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= @@ -1958,6 +2187,7 @@ github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +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= @@ -1967,31 +2197,43 @@ github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW 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= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+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/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= 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-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= @@ -2007,19 +2249,26 @@ 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/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-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/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -2027,10 +2276,13 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7V github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= 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/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= 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= @@ -2039,15 +2291,21 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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= 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 h1:i0ZbOQocHUjfFasBiUql5zVeC7u/vahFd96DFA8UOWk= 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= @@ -2069,14 +2327,19 @@ 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= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) +======= +go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= +>>>>>>> 544cfa63a (cache added cids) go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= ======= >>>>>>> e8df32579 (update lotus-soup deps) @@ -2089,11 +2352,15 @@ go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= ======= >>>>>>> e8df32579 (update lotus-soup deps) ======= >>>>>>> 8aabe1b48 (Fast migration for v15) +======= +go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= +>>>>>>> 544cfa63a (cache added cids) 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= @@ -2101,9 +2368,13 @@ go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16g go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) +======= +go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= +>>>>>>> 544cfa63a (cache added cids) go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= ======= >>>>>>> e8df32579 (update lotus-soup deps) @@ -2114,17 +2385,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.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 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.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -2137,8 +2413,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-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= @@ -2194,6 +2472,7 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y 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/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= @@ -2212,6 +2491,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 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= @@ -2227,6 +2507,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= @@ -2238,6 +2519,7 @@ 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.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= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2310,6 +2592,7 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx 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/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= @@ -2331,6 +2614,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-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180202135801-37707fdb30a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2452,9 +2736,13 @@ golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) +======= +golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= +>>>>>>> 544cfa63a (cache added cids) golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= ======= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= @@ -2462,6 +2750,7 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc >>>>>>> e8df32579 (update lotus-soup deps) 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-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2471,6 +2760,7 @@ 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= @@ -2561,10 +2851,12 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 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/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= +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.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -2642,6 +2934,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= @@ -2671,6 +2964,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= @@ -2684,14 +2978,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= @@ -2701,6 +2998,7 @@ 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/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -2712,9 +3010,12 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/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= @@ -2726,6 +3027,7 @@ 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= k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= @@ -2740,8 +3042,10 @@ k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= <<<<<<< HEAD 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= <<<<<<< HEAD +<<<<<<< HEAD ======= lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= @@ -2749,14 +3053,21 @@ lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) +======= +modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= +>>>>>>> 544cfa63a (cache added cids) 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 b628958cf68790ddcfb8ddd074c505a159ca4a91 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 17:44:45 -0500 Subject: [PATCH 102/129] implement stubs --- blockstore/autobatch.go | 119 +++++++++++++++++++---------- chain/consensus/filcns/upgrades.go | 9 +-- 2 files changed, 81 insertions(+), 47 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 5d78e92a1..ed52f39cd 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -4,6 +4,8 @@ import ( "context" "sync" + "golang.org/x/xerrors" + block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ) @@ -22,38 +24,6 @@ type AutobatchBlockstore struct { bufferSize int } -func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { - panic("implement me") -} - -func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) GetSize(context.Context, cid.Cid) (int, error) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) PutMany(context.Context, []block.Block) error { - panic("implement me") -} - -func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { - panic("implement me") -} - -func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - panic("implement me") -} - -func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { - panic("implement me") -} - func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { bs := &AutobatchBlockstore{ backingBs: backingBs, @@ -64,12 +34,6 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) return bs } -// May NOT `Get` blocks that have been `Put` into this store -// Only guaranteed to fetch those that were already in the backingBs at creation of this store and those at the most recent `Flush` -func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { - return bs.backingBs.Get(ctx, c) -} - func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { bs.bufferedBlksLk.Lock() _, ok := bs.addedCids[blk.Cid()] @@ -90,9 +54,84 @@ func (bs *AutobatchBlockstore) Flush(ctx context.Context) { bs.flushLk.Lock() defer bs.flushLk.Unlock() bs.bufferedBlksLk.Lock() + // We do NOT clear addedCids here, because its purpose is to expedite Puts toFlush := bs.bufferedBlks bs.bufferedBlks = []block.Block{} bs.bufferedBlksLk.Unlock() - // error????? - bs.backingBs.PutMany(ctx, toFlush) + err := bs.backingBs.PutMany(ctx, toFlush) + autolog.Errorf("FLUSH ERRORED, maybe async: %w", err) +} + +// May be very slow if the cid queried wasn't in the backingBs at the time of creation of this AutobatchBlockstore +func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + blk, err := bs.backingBs.Get(ctx, c) + if err == nil { + return blk, nil + } + + if err != ErrNotFound { + return blk, err + } + + bs.Flush(ctx) + return bs.backingBs.Get(ctx, c) +} + +func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { + // if we wanted to support this, we would have to: + // - flush + // - delete from the backingBs (if present) + // - remove from addedCids (if present) + // - if present in addedCids, also walk bufferedBlks and remove if present + return xerrors.New("deletion is unsupported") +} + +func (bs *AutobatchBlockstore) DeleteMany(ctx context.Context, cids []cid.Cid) error { + // see note in DeleteBlock() + return xerrors.New("deletion is unsupported") +} + +func (bs *AutobatchBlockstore) Has(ctx context.Context, c cid.Cid) (bool, error) { + _, err := bs.Get(ctx, c) + if err == nil { + return true, nil + } + if err == ErrNotFound { + return false, nil + } + + return false, err +} + +func (bs *AutobatchBlockstore) GetSize(ctx context.Context, c cid.Cid) (int, error) { + blk, err := bs.Get(ctx, c) + if err != nil { + return 0, err + } + + return len(blk.RawData()), nil +} + +func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) error { + for _, blk := range blks { + if err := bs.Put(ctx, blk); err != nil { + return err + } + } + + return nil +} + +func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { + bs.Flush(ctx) + return bs.backingBs.AllKeysChan(ctx) +} + +func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { + bs.backingBs.HashOnRead(enabled) +} + +func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { + bs.Flush(ctx) + return bs.backingBs.View(ctx, cid, callback) } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 548f59aac..c7b407a6d 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1264,11 +1264,7 @@ func upgradeActorsV7Common( root cid.Cid, epoch abi.ChainEpoch, ts *types.TipSet, config nv15.Config, ) (cid.Cid, error) { - - ctxWithCancel, cancel := context.WithCancel(ctx) - defer cancel() - - writeStore := blockstore.NewAutobatch(ctxWithCancel, sm.ChainStore().StateBlockstore(), units.GiB) + writeStore := blockstore.NewAutobatch(ctx, sm.ChainStore().StateBlockstore(), units.GiB) // TODO: pretty sure we'd achieve nothing by doing this, confirm in review //buf := blockstore.NewTieredBstore(sm.ChainStore().StateBlockstore(), writeStore) store := store.ActorStore(ctx, writeStore) @@ -1301,8 +1297,7 @@ func upgradeActorsV7Common( return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) } - // Persist the new tree. - + // Persist the new tree. Blocks until the entire writeStore is in the state blockstore. writeStore.Flush(ctx) return newRoot, nil From 2ba131e8029dfa2cb488e6747e5fdbd241bbc4e8 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 19:44:56 -0500 Subject: [PATCH 103/129] Use channels to trigger flushes in a dedicated goroutine --- blockstore/autobatch.go | 52 +++++++++++++++++++++++++----- chain/consensus/filcns/upgrades.go | 8 ++++- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index ed52f39cd..5f64979a2 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -18,7 +18,10 @@ type AutobatchBlockstore struct { bufferedBlks []block.Block addedCids map[cid.Cid]struct{} bufferedBlksLk sync.Mutex - flushLk sync.Mutex + flushCh chan struct{} + flushErr error + shutdownCh chan struct{} + flushCtx context.Context backingBs Blockstore bufferCapacity int bufferSize int @@ -29,8 +32,11 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) backingBs: backingBs, bufferCapacity: bufferCapacity, addedCids: make(map[cid.Cid]struct{}), + flushCtx: ctx, } + go bs.flushWorker() + return bs } @@ -42,24 +48,54 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { bs.addedCids[blk.Cid()] = struct{}{} bs.bufferSize += len(blk.RawData()) if bs.bufferSize >= bs.bufferCapacity { - // time to flush - go bs.Flush(ctx) + // signal that a flush is appropriate, may be ignored + select { + case bs.flushCh <- struct{}{}: + default: + // do nothing + } } } bs.bufferedBlksLk.Unlock() return nil } -func (bs *AutobatchBlockstore) Flush(ctx context.Context) { - bs.flushLk.Lock() - defer bs.flushLk.Unlock() +func (bs *AutobatchBlockstore) flushWorker() { + for { + select { + case <-bs.flushCh: + putErr := bs.doFlush(bs.flushCtx) + if putErr != nil { + autolog.Errorf("FLUSH ERRORED: %w", putErr) + bs.flushErr = xerrors.Errorf("%w, put error: %w", bs.flushErr, putErr) + } + case <-bs.shutdownCh: + return + } + } +} + +func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { bs.bufferedBlksLk.Lock() // We do NOT clear addedCids here, because its purpose is to expedite Puts toFlush := bs.bufferedBlks bs.bufferedBlks = []block.Block{} bs.bufferedBlksLk.Unlock() - err := bs.backingBs.PutMany(ctx, toFlush) - autolog.Errorf("FLUSH ERRORED, maybe async: %w", err) + return bs.backingBs.PutMany(ctx, toFlush) +} + +func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { + return bs.doFlush(ctx) +} + +func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { + bs.shutdownCh <- struct{}{} + if bs.flushErr != nil { + return xerrors.Errorf("flushWorker errored: %w", bs.flushErr) + } + + // one last flush in case it's needed + return bs.doFlush(ctx) } // May be very slow if the cid queried wasn't in the backingBs at the time of creation of this AutobatchBlockstore diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index c7b407a6d..72b1605fa 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1298,7 +1298,13 @@ func upgradeActorsV7Common( } // Persist the new tree. Blocks until the entire writeStore is in the state blockstore. - writeStore.Flush(ctx) + if err := writeStore.Flush(ctx); err != nil { + return cid.Undef, xerrors.Errorf("failed to flush writestore: %w", err) + } + + if err := writeStore.Shutdown(ctx); err != nil { + return cid.Undef, xerrors.Errorf("writeStore failed: %w", err) + } return newRoot, nil } From 4f26f67b3bd2250c7f5fc72df6841bc46be17182 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 11 Jan 2022 20:29:26 -0500 Subject: [PATCH 104/129] Support faster Get, retry flushes on error --- blockstore/autobatch.go | 113 +++++++++++++++++++---------- chain/consensus/filcns/upgrades.go | 6 +- 2 files changed, 75 insertions(+), 44 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 5f64979a2..e7694f931 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -3,6 +3,7 @@ package blockstore import ( "context" "sync" + "time" "golang.org/x/xerrors" @@ -15,24 +16,39 @@ import ( var autolog = log.Named("auto") type AutobatchBlockstore struct { - bufferedBlks []block.Block - addedCids map[cid.Cid]struct{} - bufferedBlksLk sync.Mutex - flushCh chan struct{} - flushErr error - shutdownCh chan struct{} - flushCtx context.Context - backingBs Blockstore + // TODO: drop if memory consumption is too high + addedCids map[cid.Cid]struct{} + + bufferedLk sync.Mutex + bufferedBlksOrdered []block.Block + bufferedBlksMap map[cid.Cid]block.Block + + flushingLk sync.Mutex + flushingBlksMap map[cid.Cid]block.Block + + flushCh chan struct{} + flushErr error + flushRetryDelay time.Duration + flushCtx context.Context + shutdownCh chan struct{} + + backingBs Blockstore + bufferCapacity int bufferSize int } func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { bs := &AutobatchBlockstore{ - backingBs: backingBs, - bufferCapacity: bufferCapacity, - addedCids: make(map[cid.Cid]struct{}), - flushCtx: ctx, + addedCids: make(map[cid.Cid]struct{}), + backingBs: backingBs, + bufferCapacity: bufferCapacity, + bufferedBlksMap: make(map[cid.Cid]block.Block), + flushingBlksMap: make(map[cid.Cid]block.Block), + flushCtx: ctx, + flushCh: make(chan struct{}, 1), + // could be made configable + flushRetryDelay: time.Second * 5, } go bs.flushWorker() @@ -41,11 +57,12 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - bs.bufferedBlksLk.Lock() + bs.bufferedLk.Lock() _, ok := bs.addedCids[blk.Cid()] if !ok { - bs.bufferedBlks = append(bs.bufferedBlks, blk) bs.addedCids[blk.Cid()] = struct{}{} + bs.bufferedBlksOrdered = append(bs.bufferedBlksOrdered, blk) + bs.bufferedBlksMap[blk.Cid()] = blk bs.bufferSize += len(blk.RawData()) if bs.bufferSize >= bs.bufferCapacity { // signal that a flush is appropriate, may be ignored @@ -56,7 +73,7 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { } } } - bs.bufferedBlksLk.Unlock() + bs.bufferedLk.Unlock() return nil } @@ -65,9 +82,16 @@ func (bs *AutobatchBlockstore) flushWorker() { select { case <-bs.flushCh: putErr := bs.doFlush(bs.flushCtx) - if putErr != nil { - autolog.Errorf("FLUSH ERRORED: %w", putErr) - bs.flushErr = xerrors.Errorf("%w, put error: %w", bs.flushErr, putErr) + for putErr != nil { + select { + case <-bs.shutdownCh: + bs.flushErr = putErr + return + default: + autolog.Errorf("FLUSH ERRORED: %w, retrying in %v", putErr, bs.flushRetryDelay) + time.Sleep(bs.flushRetryDelay) + putErr = bs.doFlush(bs.flushCtx) + } } case <-bs.shutdownCh: return @@ -76,20 +100,24 @@ func (bs *AutobatchBlockstore) flushWorker() { } func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { - bs.bufferedBlksLk.Lock() + bs.bufferedLk.Lock() + bs.flushingLk.Lock() // We do NOT clear addedCids here, because its purpose is to expedite Puts - toFlush := bs.bufferedBlks - bs.bufferedBlks = []block.Block{} - bs.bufferedBlksLk.Unlock() - return bs.backingBs.PutMany(ctx, toFlush) -} - -func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { - return bs.doFlush(ctx) + flushingBlksOrdered := bs.bufferedBlksOrdered + bs.flushingBlksMap = bs.bufferedBlksMap + bs.bufferedBlksOrdered = []block.Block{} + bs.bufferedBlksMap = make(map[cid.Cid]block.Block) + bs.bufferedLk.Unlock() + bs.flushingLk.Unlock() + return bs.backingBs.PutMany(ctx, flushingBlksOrdered) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { + // request one last flush of the worker + bs.flushCh <- struct{}{} + // shutdown the flush worker bs.shutdownCh <- struct{}{} + // if it ever errored, this method fails if bs.flushErr != nil { return xerrors.Errorf("flushWorker errored: %w", bs.flushErr) } @@ -98,8 +126,8 @@ func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { return bs.doFlush(ctx) } -// May be very slow if the cid queried wasn't in the backingBs at the time of creation of this AutobatchBlockstore func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + // may seem backward to check the backingBs first, but that is the likeliest case blk, err := bs.backingBs.Get(ctx, c) if err == nil { return blk, nil @@ -109,16 +137,24 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } - bs.Flush(ctx) - return bs.backingBs.Get(ctx, c) + bs.flushingLk.Lock() + v, ok := bs.flushingBlksMap[c] + bs.flushingLk.Unlock() + if ok { + return v, nil + } + + bs.bufferedLk.Lock() + v, ok = bs.bufferedBlksMap[c] + bs.bufferedLk.Unlock() + if ok { + return v, nil + } + + return nil, ErrNotFound } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { - // if we wanted to support this, we would have to: - // - flush - // - delete from the backingBs (if present) - // - remove from addedCids (if present) - // - if present in addedCids, also walk bufferedBlks and remove if present return xerrors.New("deletion is unsupported") } @@ -159,8 +195,8 @@ func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) } func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { - bs.Flush(ctx) - return bs.backingBs.AllKeysChan(ctx) + return nil, xerrors.New("unsupported") + } func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { @@ -168,6 +204,5 @@ func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { } func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - bs.Flush(ctx) - return bs.backingBs.View(ctx, cid, callback) + return xerrors.New("unsupported") } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 72b1605fa..066fb8a50 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1297,11 +1297,7 @@ func upgradeActorsV7Common( return cid.Undef, xerrors.Errorf("failed to persist new state root: %w", err) } - // Persist the new tree. Blocks until the entire writeStore is in the state blockstore. - if err := writeStore.Flush(ctx); err != nil { - return cid.Undef, xerrors.Errorf("failed to flush writestore: %w", err) - } - + // Persists the new tree and shuts down the flush worker if err := writeStore.Shutdown(ctx); err != nil { return cid.Undef, xerrors.Errorf("writeStore failed: %w", err) } From 98ad7580f821abd9e604c98a83ffbcb7bc5aad74 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 12:57:34 -0500 Subject: [PATCH 105/129] Address review --- blockstore/autobatch.go | 118 +++++++++++++++++------------ chain/consensus/filcns/upgrades.go | 6 +- 2 files changed, 73 insertions(+), 51 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index e7694f931..cd3991246 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -15,19 +15,25 @@ import ( // blockstore logger. var autolog = log.Named("auto") +// contains the same set of blocks twice, once as an ordered list for flushing, and as a map for fast access +type blockBatch struct { + blockList []block.Block + blockMap map[cid.Cid]block.Block +} + type AutobatchBlockstore struct { // TODO: drop if memory consumption is too high addedCids map[cid.Cid]struct{} - bufferedLk sync.Mutex - bufferedBlksOrdered []block.Block - bufferedBlksMap map[cid.Cid]block.Block + lock sync.Mutex + bufferedBatch blockBatch - flushingLk sync.Mutex - flushingBlksMap map[cid.Cid]block.Block + // the flush worker has sole control (including read) over the flushingBatch.blockList and flushErr until shutdown + flushingBatch blockBatch + flushErr error + + flushCh chan struct{} - flushCh chan struct{} - flushErr error flushRetryDelay time.Duration flushCtx context.Context shutdownCh chan struct{} @@ -40,29 +46,32 @@ type AutobatchBlockstore struct { func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { bs := &AutobatchBlockstore{ - addedCids: make(map[cid.Cid]struct{}), - backingBs: backingBs, - bufferCapacity: bufferCapacity, - bufferedBlksMap: make(map[cid.Cid]block.Block), - flushingBlksMap: make(map[cid.Cid]block.Block), - flushCtx: ctx, - flushCh: make(chan struct{}, 1), + addedCids: make(map[cid.Cid]struct{}), + backingBs: backingBs, + bufferCapacity: bufferCapacity, + flushCtx: ctx, + flushCh: make(chan struct{}, 1), // could be made configable - flushRetryDelay: time.Second * 5, + flushRetryDelay: time.Millisecond * 100, } + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block) + bs.flushingBatch.blockMap = make(map[cid.Cid]block.Block) + go bs.flushWorker() return bs } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - bs.bufferedLk.Lock() + bs.lock.Lock() + defer bs.lock.Unlock() + _, ok := bs.addedCids[blk.Cid()] if !ok { bs.addedCids[blk.Cid()] = struct{}{} - bs.bufferedBlksOrdered = append(bs.bufferedBlksOrdered, blk) - bs.bufferedBlksMap[blk.Cid()] = blk + bs.bufferedBatch.blockList = append(bs.bufferedBatch.blockList, blk) + bs.bufferedBatch.blockMap[blk.Cid()] = blk bs.bufferSize += len(blk.RawData()) if bs.bufferSize >= bs.bufferCapacity { // signal that a flush is appropriate, may be ignored @@ -73,7 +82,7 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { } } } - bs.bufferedLk.Unlock() + return nil } @@ -85,11 +94,9 @@ func (bs *AutobatchBlockstore) flushWorker() { for putErr != nil { select { case <-bs.shutdownCh: - bs.flushErr = putErr return - default: - autolog.Errorf("FLUSH ERRORED: %w, retrying in %v", putErr, bs.flushRetryDelay) - time.Sleep(bs.flushRetryDelay) + case <-time.After(bs.flushRetryDelay): + autolog.Errorf("FLUSH ERRORED: %w, retrying after %v", putErr, bs.flushRetryDelay) putErr = bs.doFlush(bs.flushCtx) } } @@ -99,31 +106,31 @@ func (bs *AutobatchBlockstore) flushWorker() { } } +// caller must NOT hold lock func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { - bs.bufferedLk.Lock() - bs.flushingLk.Lock() - // We do NOT clear addedCids here, because its purpose is to expedite Puts - flushingBlksOrdered := bs.bufferedBlksOrdered - bs.flushingBlksMap = bs.bufferedBlksMap - bs.bufferedBlksOrdered = []block.Block{} - bs.bufferedBlksMap = make(map[cid.Cid]block.Block) - bs.bufferedLk.Unlock() - bs.flushingLk.Unlock() - return bs.backingBs.PutMany(ctx, flushingBlksOrdered) + if bs.flushErr == nil { + bs.lock.Lock() + // We do NOT clear addedCids here, because its purpose is to expedite Puts + bs.flushingBatch = bs.bufferedBatch + bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) + bs.lock.Unlock() + } + + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + return bs.flushErr +} + +// caller must NOT hold lock +func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { + return bs.doFlush(ctx) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { - // request one last flush of the worker - bs.flushCh <- struct{}{} // shutdown the flush worker bs.shutdownCh <- struct{}{} - // if it ever errored, this method fails - if bs.flushErr != nil { - return xerrors.Errorf("flushWorker errored: %w", bs.flushErr) - } - // one last flush in case it's needed - return bs.doFlush(ctx) + return bs.flushErr } func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { @@ -137,24 +144,28 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } - bs.flushingLk.Lock() - v, ok := bs.flushingBlksMap[c] - bs.flushingLk.Unlock() + bs.lock.Lock() + defer bs.lock.Unlock() + v, ok := bs.flushingBatch.blockMap[c] if ok { return v, nil } - bs.bufferedLk.Lock() - v, ok = bs.bufferedBlksMap[c] - bs.bufferedLk.Unlock() + v, ok = bs.flushingBatch.blockMap[c] if ok { return v, nil } - return nil, ErrNotFound + // check the backingBs in case it just got put in the backingBs (and removed from the batch maps) while we were here + return bs.backingBs.Get(ctx, c) } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { + // if we wanted to support this, we would have to: + // - flush + // - delete from the backingBs (if present) + // - remove from addedCids (if present) + // - if present in addedCids, also walk the ordered lists and remove if present return xerrors.New("deletion is unsupported") } @@ -195,8 +206,11 @@ func (bs *AutobatchBlockstore) PutMany(ctx context.Context, blks []block.Block) } func (bs *AutobatchBlockstore) AllKeysChan(ctx context.Context) (<-chan cid.Cid, error) { - return nil, xerrors.New("unsupported") + if err := bs.Flush(ctx); err != nil { + return nil, err + } + return bs.backingBs.AllKeysChan(ctx) } func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { @@ -204,5 +218,9 @@ func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { } func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - return xerrors.New("unsupported") + if err := bs.Flush(ctx); err != nil { + return err + } + + return bs.backingBs.View(ctx, cid, callback) } diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index 066fb8a50..a21bdb05e 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -1298,8 +1298,12 @@ func upgradeActorsV7Common( } // Persists the new tree and shuts down the flush worker + if err := writeStore.Flush(ctx); err != nil { + return cid.Undef, xerrors.Errorf("writeStore flush failed: %w", err) + } + if err := writeStore.Shutdown(ctx); err != nil { - return cid.Undef, xerrors.Errorf("writeStore failed: %w", err) + return cid.Undef, xerrors.Errorf("writeStore shutdown failed: %w", err) } return newRoot, nil From 13d9cda20e4e721e4b8a501e84e11cf8d60cdb60 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 15:03:34 -0500 Subject: [PATCH 106/129] Address review part 2 --- blockstore/autobatch.go | 58 +++++++++++++++++++++++------------- blockstore/autobatch_test.go | 5 ++-- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index cd3991246..e9df6a3b3 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -25,12 +25,13 @@ type AutobatchBlockstore struct { // TODO: drop if memory consumption is too high addedCids map[cid.Cid]struct{} - lock sync.Mutex + stateLock sync.Mutex + doFlushLock sync.Mutex bufferedBatch blockBatch - // the flush worker has sole control (including read) over the flushingBatch.blockList and flushErr until shutdown - flushingBatch blockBatch - flushErr error + flushingBatch blockBatch + flushErr error + flushWorkerDone bool flushCh chan struct{} @@ -51,12 +52,13 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) bufferCapacity: bufferCapacity, flushCtx: ctx, flushCh: make(chan struct{}, 1), + shutdownCh: make(chan struct{}), // could be made configable flushRetryDelay: time.Millisecond * 100, + flushWorkerDone: false, } bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block) - bs.flushingBatch.blockMap = make(map[cid.Cid]block.Block) go bs.flushWorker() @@ -64,8 +66,8 @@ func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) } func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { - bs.lock.Lock() - defer bs.lock.Unlock() + bs.stateLock.Lock() + defer bs.stateLock.Unlock() _, ok := bs.addedCids[blk.Cid()] if !ok { @@ -87,6 +89,11 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { } func (bs *AutobatchBlockstore) flushWorker() { + defer func() { + bs.stateLock.Lock() + bs.flushWorkerDone = true + bs.stateLock.Unlock() + }() for { select { case <-bs.flushCh: @@ -106,34 +113,47 @@ func (bs *AutobatchBlockstore) flushWorker() { } } -// caller must NOT hold lock +// caller must NOT hold stateLock func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { + bs.doFlushLock.Lock() + defer bs.doFlushLock.Unlock() if bs.flushErr == nil { - bs.lock.Lock() + bs.stateLock.Lock() // We do NOT clear addedCids here, because its purpose is to expedite Puts bs.flushingBatch = bs.bufferedBatch bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) - bs.lock.Unlock() + bs.stateLock.Unlock() } bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + bs.stateLock.Lock() + bs.flushingBatch = blockBatch{} + bs.stateLock.Unlock() + return bs.flushErr } -// caller must NOT hold lock +// caller must NOT hold stateLock func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { return bs.doFlush(ctx) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { - // shutdown the flush worker - bs.shutdownCh <- struct{}{} + bs.stateLock.Lock() + flushDone := bs.flushWorkerDone + bs.stateLock.Unlock() + if !flushDone { + // may racily block forever if Shutdown is called in parallel + bs.shutdownCh <- struct{}{} + } return bs.flushErr } func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { + bs.stateLock.Lock() + defer bs.stateLock.Unlock() // may seem backward to check the backingBs first, but that is the likeliest case blk, err := bs.backingBs.Get(ctx, c) if err == nil { @@ -144,20 +164,17 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } - bs.lock.Lock() - defer bs.lock.Unlock() v, ok := bs.flushingBatch.blockMap[c] if ok { return v, nil } - v, ok = bs.flushingBatch.blockMap[c] + v, ok = bs.bufferedBatch.blockMap[c] if ok { return v, nil } - // check the backingBs in case it just got put in the backingBs (and removed from the batch maps) while we were here - return bs.backingBs.Get(ctx, c) + return nil, ErrNotFound } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { @@ -218,9 +235,10 @@ func (bs *AutobatchBlockstore) HashOnRead(enabled bool) { } func (bs *AutobatchBlockstore) View(ctx context.Context, cid cid.Cid, callback func([]byte) error) error { - if err := bs.Flush(ctx); err != nil { + blk, err := bs.Get(ctx, cid) + if err != nil { return err } - return bs.backingBs.View(ctx, cid, callback) + return callback(blk.RawData()) } diff --git a/blockstore/autobatch_test.go b/blockstore/autobatch_test.go index fe52c55c7..57a3b7d6c 100644 --- a/blockstore/autobatch_test.go +++ b/blockstore/autobatch_test.go @@ -17,8 +17,6 @@ func TestAutobatchBlockstore(t *testing.T) { require.NoError(t, ab.Put(ctx, b1)) require.NoError(t, ab.Put(ctx, b2)) - ab.Flush(ctx) - v0, err := ab.Get(ctx, b0.Cid()) require.NoError(t, err) require.Equal(t, b0.RawData(), v0.RawData()) @@ -30,4 +28,7 @@ func TestAutobatchBlockstore(t *testing.T) { v2, err := ab.Get(ctx, b2.Cid()) require.NoError(t, err) require.Equal(t, b2.RawData(), v2.RawData()) + + require.NoError(t, ab.Flush(ctx)) + require.NoError(t, ab.Shutdown(ctx)) } From 398f0766ba4e4f3626ffe73c13c27e6840643c85 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 16:04:47 -0500 Subject: [PATCH 107/129] Don't lock in Get --- blockstore/autobatch.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index e9df6a3b3..53764d15c 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -152,8 +152,6 @@ func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { } func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, error) { - bs.stateLock.Lock() - defer bs.stateLock.Unlock() // may seem backward to check the backingBs first, but that is the likeliest case blk, err := bs.backingBs.Get(ctx, c) if err == nil { @@ -174,7 +172,7 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return v, nil } - return nil, ErrNotFound + return bs.Get(ctx, c) } func (bs *AutobatchBlockstore) DeleteBlock(context.Context, cid.Cid) error { From 6854668ff68f2f2eaffb80816e7bc9eaca9be9bf Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 3 Jan 2022 19:58:52 -0500 Subject: [PATCH 108/129] Add more deal expiration handling for snap deals --- extern/storage-sealing/checks.go | 19 +++++++++- .../storage-sealing/states_replica_update.go | 38 ++++++++++++------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 42425e782..73511e057 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -3,7 +3,6 @@ package sealing import ( "bytes" "context" - "github.com/filecoin-project/lotus/chain/actors/policy" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" @@ -80,6 +79,24 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api return nil } +func checkDealExpiration(ctx context.Context, sector SectorInfo, api SealingAPI) error { + tok, height, err := api.ChainHead(ctx) + if err != nil { + return &ErrApi{xerrors.Errorf("getting chain head: %w", err)} + } + + for i, p := range sector.Pieces { + proposal, err := api.StateMarketStorageDealProposal(ctx, p.DealInfo.DealID, tok) + if err != nil { + return &ErrInvalidDeals{xerrors.Errorf("getting deal %d for piece %d: %w", p.DealInfo.DealID, i, err)} + } + if height >= proposal.StartEpoch { + return &ErrExpiredDeals{xerrors.Errorf("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 nil +} + // checkPrecommit checks that data commitment generated in the sealing process // matches pieces, and that the seal ticket isn't expired func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, tok TipSetToken, height abi.ChainEpoch, api SealingAPI) (err error) { diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 28c5ede0b..7c237add5 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -2,7 +2,6 @@ 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" @@ -13,18 +12,7 @@ import ( 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) - } + return handleErrors(ctx, err, sector) } out, err := m.sealer.ReplicaUpdate(sector.sealingCtx(ctx.Context()), m.minerSector(sector.SectorType, sector.SectorNumber), sector.pieceInfos()) if err != nil { @@ -42,6 +30,11 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect if sector.CommR == nil { return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) } + + if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + return handleErrors(ctx, err, sector) + } + 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)}) @@ -65,6 +58,10 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec return nil } + if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + return handleErrors(ctx, err, sector) + } + if err := checkReplicaUpdate(ctx.Context(), m.maddr, sector, tok, m.Api); err != nil { return ctx.Send(SectorSubmitReplicaUpdateFailed{}) } @@ -207,3 +204,18 @@ func (m *Sealing) handleReplicaUpdateWait(ctx statemachine.Context, sector Secto func (m *Sealing) handleFinalizeReplicaUpdate(ctx statemachine.Context, sector SectorInfo) error { return ctx.Send(SectorFinalized{}) } + +func handleErrors(ctx statemachine.Context, err error, sector SectorInfo) error { + 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) + } +} From 0f991e54fe37a66237178408d81d6ac758e6c733 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 3 Jan 2022 20:45:48 -0500 Subject: [PATCH 109/129] just use checkPiece --- extern/storage-sealing/checks.go | 18 ------------------ .../storage-sealing/states_replica_update.go | 4 ++-- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 73511e057..392f2905e 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -79,24 +79,6 @@ func checkPieces(ctx context.Context, maddr address.Address, si SectorInfo, api return nil } -func checkDealExpiration(ctx context.Context, sector SectorInfo, api SealingAPI) error { - tok, height, err := api.ChainHead(ctx) - if err != nil { - return &ErrApi{xerrors.Errorf("getting chain head: %w", err)} - } - - for i, p := range sector.Pieces { - proposal, err := api.StateMarketStorageDealProposal(ctx, p.DealInfo.DealID, tok) - if err != nil { - return &ErrInvalidDeals{xerrors.Errorf("getting deal %d for piece %d: %w", p.DealInfo.DealID, i, err)} - } - if height >= proposal.StartEpoch { - return &ErrExpiredDeals{xerrors.Errorf("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 nil -} - // checkPrecommit checks that data commitment generated in the sealing process // matches pieces, and that the seal ticket isn't expired func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, tok TipSetToken, height abi.ChainEpoch, api SealingAPI) (err error) { diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index 7c237add5..b2121ef72 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -31,7 +31,7 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) } - if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state return handleErrors(ctx, err, sector) } @@ -58,7 +58,7 @@ func (m *Sealing) handleSubmitReplicaUpdate(ctx statemachine.Context, sector Sec return nil } - if err := checkDealExpiration(ctx.Context(), sector, m.Api); err != nil { // Sanity check state + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state return handleErrors(ctx, err, sector) } From 0f122df6e26527a2bca57652220a8adb60ae1bd1 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 3 Jan 2022 21:29:48 -0500 Subject: [PATCH 110/129] Check piece before PRU2 instead of PRU1 as PRU2 is the heavy computation part --- extern/storage-sealing/states_replica_update.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index b2121ef72..caf50fb7e 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -31,15 +31,15 @@ func (m *Sealing) handleProveReplicaUpdate(ctx statemachine.Context, sector Sect return xerrors.Errorf("invalid sector %d with nil CommR", sector.SectorNumber) } - if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state - return handleErrors(ctx, err, sector) - } - 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)}) } + if err := checkPieces(ctx.Context(), m.maddr, sector, m.Api); err != nil { // Sanity check state + return handleErrors(ctx, err, sector) + } + 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)}) From d65b6f6f635008837d372ddcb562e11cc8fa317d Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 4 Jan 2022 02:27:14 -0500 Subject: [PATCH 111/129] fix lint --- extern/storage-sealing/checks.go | 1 + 1 file changed, 1 insertion(+) diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index 392f2905e..42425e782 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -3,6 +3,7 @@ package sealing import ( "bytes" "context" + "github.com/filecoin-project/lotus/chain/actors/policy" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" From 0b6be15fd926295a926852aa33ee3f776fa804bb Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 18:10:07 -0500 Subject: [PATCH 112/129] Appease the linter --- extern/storage-sealing/states_replica_update.go | 1 + 1 file changed, 1 insertion(+) diff --git a/extern/storage-sealing/states_replica_update.go b/extern/storage-sealing/states_replica_update.go index caf50fb7e..43d5467ed 100644 --- a/extern/storage-sealing/states_replica_update.go +++ b/extern/storage-sealing/states_replica_update.go @@ -2,6 +2,7 @@ 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" From ed72441fbc02e927dac8e8464d9c46cc1b11b98e Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Fri, 7 Jan 2022 00:37:14 -0500 Subject: [PATCH 113/129] remove power change --- build/params_butterfly.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index e26fd78fa..0ea8df649 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -16,7 +16,7 @@ var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, } -const GenesisNetworkVersion = network.Version13 +const GenesisNetworkVersion = network.Version14 const BootstrappersFile = "butterflynet.pi" const GenesisFile = "butterflynet.car" @@ -47,6 +47,8 @@ func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) policy.SetSupportedProofTypes( abi.RegisteredSealProof_StackedDrg512MiBV1, + abi.RegisteredSealProof_StackedDrg32GiBV1, + abi.RegisteredSealProof_StackedDrg64GiBV1, ) SetAddressNetwork(address.Testnet) From f2bab4cc637f49527a236db30abf0dd7be487c43 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 7 Jan 2022 16:49:55 -0500 Subject: [PATCH 114/129] Update butterflynet params --- build/bootstrap/butterflynet.pi | 4 +- build/genesis/butterflynet.car | Bin 2265972 -> 2185801 bytes testplans/lotus-soup/go.sum | 66 ++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/build/bootstrap/butterflynet.pi b/build/bootstrap/butterflynet.pi index fbfa1e92c..1972adc5a 100644 --- a/build/bootstrap/butterflynet.pi +++ b/build/bootstrap/butterflynet.pi @@ -1,2 +1,2 @@ -/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWBzv5sf4eTyo8cjJGfGnpxo6QkEPkRShG9GqjE2A5QaW5 -/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWBo9TSD4XXRFtu6snv6QNYvXgRaSaVb116YiYEsDWgKtq +/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWBdRCBLUeKvoy22u5DcXs61adFn31v8WWCZgmBjDCjbsC +/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWDUQJBA18njjXnG9RtLxoN3muvdU7PEy55QorUEsdAqdy diff --git a/build/genesis/butterflynet.car b/build/genesis/butterflynet.car index cb840104262cb94c6829e637f7653108643adb05..c79eab38eb96c401356d80105c4479513ddf4e2f 100644 GIT binary patch delta 840933 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 *J99XUJz*}iFRtjd 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%0DJ1^0-J$!>uP*`)#FV)$iu|1i6Y*jf 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

!o#*jgy}q^=W4MxoY$b*hA*^hqV4R>dhr$dKa^ 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 Z}7rP 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±XSa=_AZF<`J4 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 RkLo%I1i2 z7!A0FOD(&yVAFmco4g5vrZqSlVo@d47>(xV_Z}%53`CW!S$zGX2ioGfkMY*F?EX|c zy9RRR!g*Bovm?xIA1REHjTm6uG1(N|5l`-&8Nb3&8K+M?YM{v+NoBB}KrLB$wP__N z756zH8;nDh9jz*J0WUw+uQJGyH*b??HzOL`HuQOprh3kqi}}#im!|;PCxQqLkd5a1 z-^e~}<;6YyyTHrjHiSE&Hg$XXOB{2JTXO+NDK-PwZrX))&+(hXyW@U;r@fs#Jbq@y zAL;J~RZLqySAXz$^6o891O0{|6Kk(H2F8APBR8VJ3rZk#j>!GoBl{ydng-nddQIVCI7g1!rKFs8vQa`yyj{RWlfIBAu_J*F~N28Wo zA~NHAly^t!dd=u!{sKas)9f zWZhd+Um~hVu(_pyM+S^T4W6oC;`V044A<&Dv5DSJf|=mDoPiOly`)$1;?tW4+W#*G zfq|&Ov*LUKEA|0H-vgp{#=4%j{fWf)F{%oKf+_rZ_SB8&X@Cm`FRgJm1O^7eeK3f*T*J|zTY0pw1@npFc^2twW`kZ zyI<}7p2WIqUG%f(BKQ$_cGRi-67zu8HrF-HTI3JFU>vGzHZB4+Zbzz1E#}(}VLo*C zXJRIGyL&`vvY(xO&jU4MEddtF6F~&`$F)i$O1`TkiAB!}vZfrm7MCBAj~7mc;EEPX zEeWyJ-<){VuI-b--K-NC#13vdm_p}KBoxt5)MC$Hk{TXeTXw&ISleW8_Boe~1t zNsjtmg|#H4YcLSibr+8AmvB*@TD6V7$n0&6s1^^ikOy*nfu=%hYs3dU$UGX1JLVcc zk$BFo+IOINET13WVP}&x(T#M)txIWRF{PQEXa?Cb3dW(jhL?91qZ46U&`eyTdxWpu z8ZK+HA?x48M-aCzm;=pdOa@$^2qHMZwc@|hUC>>jDV>2DMx`BLDNnS$Y*eBe8NoiY zU%XKGYhG8%+}!sE=krk~Kz1kyhbo(M51;?jwCZi&`y}!+3kGMrJuHLBhN$@0uHJds z@AHWT7#9WxqRM9bGRR6iFse)kW7|4gQ4&j~^7g?!Z+R~1x4Mlir;O|2QM>>rz?Hp0%V^Ie&PaTH~uT#1>4t;A{&y8TVIj7X8g-NrTxO# zj-t(kl7Ct)yh^b&L-2I0AaL)*K{!;|CO4~gzMVaz&;E4j$7p*2$+z!%+$;xcbawWy zD&XY{|9>YH3`CVJ#_{8qbxw`Wz^!5`x~O%m+dp|K%LilV`Cb^_Y91^@zB&rV9gA#@ z=b?e}metK4+{C-=8#z6i%b+x0Bhp^y-T6BIlp$&ZxD#L;s%%5aAc>9+Z3FQ;WJQns zt~17@I9%KhP}iH2hvjHPOE#JT*(ZVs4v?+*uXLA8{CBz=5EH-uKtJt8C+_8j)H;Zl z%Q3uQ`v z!8;@n=`JWGlz{l&1iYP`!ZoCy`mM#z)u@k*%1ya!??m#lRoTBdr2GF?PaewU;A)#ycR3$M&djg;VC1mYVd3+L|(ifP3xpckJ(zL zFeZZQCcc5GOjZ|a)u8suWKG_iR;2N8Olx{XTFh4~&ih6Jt9WuN4tB=*mI~E#|5>Rv zPHjcyOXUPEae7Bp-~?$L3f53#bC|v4_2RmoO6Uv8mn$l1Yn#`xbLlQ)SC4*KItA~; z!BkGa%!HFmb21J^ak8Ci&uO}Fp-aISc&duEs40lCS5aj3CV zdw0?HyYs=5;smOL6~3vypyyk6@{~Vr4m5};jC>CSViE=c15sn=vzh5cAg$G-wzZ(P z1s5sdYK5eCEw5kkJK^Zyk~ys)n=rt*W3lszY_&|@u-HsmMOvKT_N&bJb&=@!X5mNF z^H)dINH3oOVh4;vTrm3I*=_`xcA>w&fYuM#Cy9g((y&Xgm~0-;yZkt0K7(6IR_pUX zwtFIo;1B~JweKF!cEKLWv^>Pu)tFDm&wOQze@hlUNY66tx!0VZNXRRoGSVVbd7#m9 z3FxSXfN`j*1=F5g@Yug1{LF7hkBP5N@aHC-?zrYCwnO@u_dD{t|1ac&fvBo=F3~N- zgcN0q-oFz3&Q^g`4K1*9O`~l)>ybZ?xIHzp-VVkcQ{6KBsG{no?Kd~c1E=QH61QvQ zkLk8ZgH0Ny2X8~Hnvu^C7>BBwko5V`=m3REkMiC7&nCWT7!ey(>hN(Wn#b1=WkcKX zUIWYIi6Daeqgn+`^uJYsY5;`QbR6U`{@H6gR48}4Au;sMJ%{^-PYZDjP}-Fb@_ zBiDm@=ktqrVaS-i!|B_!`Me4Ad%(b89I9*TaGpqFx63eP8%u#|X*I{MTzv-_???qp z2_}aXpqV6J0M{pi2o7)^`mbacbX%|qMf_}YZy)MdW1ja?-QCsD*J*R9Ad1AFi`wRG z=h-LbW?y`PDcXT>sIon=;srUIuMOZYl0z>O!E?s?icO%t{qt^0w02eN8SKEgFfb5R zHW7zrSDm)&b#Ju*KlImEgjYFjDWc)*wIsflDeMyGko9&j?nw4u$!?5XTf(kXG_Dz1 z*z?LS*W-mF4fl7g2UVpr)ao~vIKN>_iiJoWPtd-V3Lw`I|%oync&In;_( z&+7NW9{p5`p8;f_493p@veC@{8`xoKh`>I1U#~sPbsN@O+$SWQmG&5a%F_v*=IYnp zsNv4O=UG4>6u_WCP!2c&<4|2+S9N+h$;0eJwHC!M+5J8HL%h~b+zn};r5s+C7D{iR zhy;UxfvB##jVy<_HyWH+WEGRYYSi1!bJC|(z9376eI6`~x3hr)7YxQ73vB0`n8qGe zG0*cpzzQB}OF7~s-s6)KVq36lI=GH+7q12k4920l&WW#IVLB^_^Zeom+-&CHQhQuJ zn*#N-7vFwBHx3W{OxZ> zwViEcBq1*;eE*O)^WNWS?&}2k0;d?-h8fY-@ZPWX6JOI>qszj)3%sh_RpUEC&mA>0 zFkL`2GyGCRG&6wlaQ9{iGvt|IF29Q_#XdKp2hZZ_%QsJJitp7hHO^gtQhZ=Dc!GOW zUj5mOXeXEzf+gu=y)xdh(rxb?`Q-V$dv~t>#%qDOd0meQrY~>dHX1l45H*HZ4T2Fb zBSzogCGp>vncGtGE_h8_Xq;B;?#wx>?tC=hrxwJ3mv+yyhlaVEYARu5U+gHJIe=Y` zB+Ff*VOCiF+Wb{(_^1jz$<08)`i6}Aj5pSN?>ia)e5P@%xNA7+%C(H?_jE`$I`_Pa z;CaM2TA*_|j2$x)n@7SV%FR_1`f4^?@w|loTeO>8j$Y=~X5xWDHpnwc!8p{|SxJz8 zOdq;FH{g}G<2+F}{wlqAx|BEnlrpDEsHn3jaGn(6Q^Fu1YV6oomfb${>w-Rvhpq?FqqMn;>Nx7Pb}YI`N^mBhbxKXjdySIUt*f9#Ml=93 z1mjR$Gk@qi&G95iRnj0y_4`2Wr)PGt7CyHb=5x2}dxb5xJO7LegMfjkt~0bk_><0f zCaSx9Q)pyMEHSQhB=OgOg@J?CKDGy^LAnOxj=4UqPe9gMWudQgdEwKGqOBBpNb$i% z!x|qFUbpVeYczPkodDxdU1yN!SPz3eKU5JXAbzy`8ky_wn6va@*Zn{4H zE-*zf4pp}6Es?XA{DYG(Kkqsn)oiLNUxZjK)1U#pBdRkP@ArWQNf-nSM3qhPNXg{Z zr#9sd@|omxcZ!9fuxZ7247IfHR65aHcCd_r3kKtk$^PnC%{m`c!=qaN%ye_gbmPtS zswWs{9#3PR73sL-haYn8s9pZ|q#6@%e^wv7`s zE?f$beIkh90NIWI%67qag+tk@=OTnTtc^-uNtERXBzVCE>@Hmvc>ZvlBnF4zxkoFq z3j~Zqm3`5cq)ACtgj9&U?U7{FE_ty1_5Hg8G4nBT)4I%2A`HmL1_M!L^9AwFp2B0j zkM;hcZLdcZdmFb@*bsfHOq)x@V!+2HWQhfgJ0^RvEhpc`G93Wc}CEGpxnhe;!u74Mo8rH#QRiqevQ9xSYXB1Y)D7=E%Jr6%VZa;*~vh8O| zhdeMvFb-9ADnu5&X*BP2v6tV%?dl6pattefpu0Y;3Q|<=p4-RxfRqgeqRMXO_qoVF z&i1KZ1J3Yzk;&!)S~8Cpfp$WZyY=}9ae-IB1%q+NWWT_y|3X`@lHv1!6z4rp%hd-v zmg8S^F_d?UMMwyz+JIs-1dKzKO~)j6p^Ljshy6qCK8cjM1J$W9ZG-B&H!@d39h{*0 z9T$MeJ`qH4fb7Qqrn~UNP6qZ1ze~GeVGR%O=SdlGsYK}C%_q_nrLuVmefaQ&_)hxQ zJ;<}-zjNNP)v!i1lCpa)JHaBOt!92{tNx3*m4>f%w`$+HOkDg3A2ULfc0nn!K18PL z>6Wj76(em_P%1r{sBFkb>o?~tQD<&Dmu`8pQ$+a5QE@eQ7IA#oi0#x^obJs?BZ*g$ z7!PSwSzgx%`4K8Lpb?FFf1Emd<*;H)7K7+cC=}g&_KqYN8*?WTlkQoAMY5tD)tS$3 z_8Lw<+zPAS8y^iC+KW&EG5GVu_md9_6`rwvaoBlz{$6mwz8kIoQ5kq2 zF(@k<+C|d|;?G^tbPfT$eAO10Zi;GZ3DiV*CxhJ_zkhQ1 z-OGTcd8~IA{Gt3^@=H#O8{6-LX4=dD@^#f+hweOKe#&&;DTDMWl~pMI17uMXj6-!z zWZ#wC@2`~ACX6kE@sV&<-G@{v_mR;l=5k9fm6w-+HwR!4Fc8)C-K}1ky^g4Y5~rNv{)$QDc1!|V)-#NHz*6@oQgkR zT|W^-aDQAQ{yY3{73eVI1zT4RlOV^PI$mN2#|+*G53?j)CL|9DGI5}}!xM1pIq`XS$LTvgK(jv#0tTYW*2r+1 zXI9i&(0hxi`~sa1T`rCIR)zy*_Km5g3t1sIUH}&i#vPMwH|ra2RZZ>kql%h-Z=TWPbgTf7V;( zSw%dIMfS|RxnlQCopgZ(j)c*ud1L_xj6-$(AjSgYnMkenOX85Pv(M`?T5YptdU-3X z@CfcxRZ%ES+yh*n3{KnwT!;QE;RW5>MG=Saa_g*4DzlF5vK)+ba`?Q)5@G%v#nP57 z$kx^p3ws-U7Pxm{9I9+bsk^v17aN}u_`wJ+oKx-%PoCKL$SZz|oh~|j-#9Mk&$uuM z7>Fu+;qH@6F^#vjFS&Fu;dQycUSii+YzX(CVxMP8RXbNTlhYuC^T*1{^XXZ=svzF#FPcucEA zFk3l+AGqQgSh`Qc#iJV~i&eYN9aU~2n}`Itv|Ib_qe}hn z&TXCPR~U8Pp8bC5azc|4u}u2T#|qcc)T7F+fFq*&K^+21x8o|Y%_Tg4mgvG2Ra?^i zQrQD0s=yd+lVuTqOSp|AqH2t*E|3kEy8b}XB~-BJTW4l@^iS-jz)RcY^zj4-nif7s zt-E0JINTMRy~`r)#R**QzF`PB&?vMt51CJhQsYH=HM4DNxO5CV%*>#VouU)%UED^bgY0_pCFAcFhT z2&Am|k8~I8X*_iOE1l(8Fx#cAiAz=R0#cJC9Ji8HfBu9_P2MK5Mlv*H>n<3F>bm>a z=Z>-E_#}e={PCAKtNxz8xu4h4#8#7J z$aavWZZHnjHMej&PIG(L0lqFCi)_UgR14}sg86?SB7$fSbt04aW(+qP-TC( zl2{(?8tkm~{8277(b6-^0ooi)w~ZF!X6m4t2V4TcxG*pfRd#Br55!~o{OUMNzMsRa zRO#kj99aw&6Kf@%$%(u7bdYr`Fz%0&|NkFb?V@<4iuv^e?hjanPE8%UW30_&_-T6A z^kHESYq0;Hw1IJ`vW*@#3gm^{;US~S`>H)8@;Cs$Gcct0MwMpZ7oz$ArIN3J?32Ng zuYhbtlyvv-e;cqJ;V`m&1+c!}X5+t0C3Q;5L)Y_;AtmulLuuP+H)dkj$Z3mYKnfU# zDtktTqwuq(lBwez#e$J(t$Vu$^Vru!T{&cF)Lm=i6@dQ~U=T16RrW;Uu6)Xh3jCl1 zyDrZVx3@o(p)TdYIomw9^G|=B%||xdfN{qnTV9<|pKU1d1A19hX3M&<_GUZRKuO8@ zhtHSi`dO5y(SbVw#-YkCNns>h$DYCCD;^>s;LUUmPe?1TDVs4!RXBi;!$H6}RM~a+S)SSqSDF1PeY*9fur4owxRIyNlsW=d_GGLH`j8?QkbNSE z-~ic*|H^koul+9Yu2(y=)R%vLs#wFLr-ZijT6jS5;(lz?RM?HGc)`jF^1t(4@7wt| ziW>#zrnlqoP1H~Fv3;H(M57}}z-BUl(Yf});Xk|(1zu1}KM(P$8ofzJs)s|^uDqA9 znA4q{c53-$e4my@V#AN8hVh^--{ATe7)&6ee7+&r{yQ~l?&lKnUOi!%Kl4)W!1-aZ zvy64))5_k{M-^LQBSh1|aBpn0YRoBo?74SDxN8?_bahAs?Sy{#zQTLK=aVA_PoZZ} zg*Vhj8nnz8kq>8m?&4!Y z@8^AQO_`Fq@X(x^&%(@;^ZEJOT^k${xm&x3nJz2HT;S*j*wnC!C*r3}U-M5oS6PH4 zUt`cir>I)~aX=E2_W5jZN{cq|od5_JhZ;7^JasLUITyI|M4yS8DZwCMAZpk!j}1n15Y2hkJsBQOnrppTQM8cP45xGybI)xo+ z(9V*!j)5<>`YwCDnO?KO`(9RpjKnLa-aFUfcPBgJ(+@P$mTCbqp z0WKJfJLVcTa4`OOpAv>f_acS2Mqk_hdx zit>y?*1!{96Q$1<6)msyFucs1$F|QxL(y1(CGtcN!ToWqf+qIglE7i|1G1(t9qxw? znVZ+kMx(c@KF6OSZ@zahSS{1QS3J4#%V`+jns#Xhm?9X5I>k%O>Z3Hl(NEC2la~uG za?gj}uv1lY&AV!@es-y6Dtr+s8w^C1jV)A!d(XgGY^J>bzE$LvzBQ;LxyrLeGztkmdiU%KJBURc^?>eVm_y@82Leoh1t93VUNADJ#I$hL5_iXWVD zWMIb|qRr`o*H}!$uaRPBQZ)2Ha|pN-U>xe5K<6GQ zn|FQtIzjOp29L`7>RC4nvS*sIterCvC0o!lmZ3mop9ms2KsK7i@yKQc+1TM>4u}&a z{gV5WE;nC)H|A zBpi)*CKadc7pZr;aqv~J*n!MJ0x{hxi{2&Z>%3iq~Oe|M^wXzJA7EfG4)so; zS?AD5MoM+6*y)CZ{TMynGMrm16Dc5mmB`3g2--7H3&=hZL~wxY(0^sRa$&zKyVW#V zOi!`)yM017?}jniojGe2FYM|uvcuqMwgO{d+xa@t^MakFhKJ*Zq5^1x`~ zoSxEGfwL;_Z>2PC8XQ%26_XK_U8PKnWC$1!?~6cGc2^;Wm@RK`9ThKqr-ZpkES9#i zX6qR~JJ2J2Pk1VfxA3TD>sf|qRajQdUZH%?qi9>qr1>O!byq^Ux$%aWa$=rk#*Ki; z2C}1??a~gSRRMR1h|B*M6g#rf-f6b`V>qtPOXCHlXx91cI48YUC5gjP(+3epF7PRY z3cOQ%k7hM|Afr+mIUPsrZFu(Fla5cnNWSLY@GLnR6hebZ0ihYbFtoaJQ{aXmWc|!j z!yS=CBl?;50lE(D>vkQCry2jh-K(fAF!<&soiwEFzi ziABk@WNy1RRPR&xbFZ*xU~XLXM^+ucIMfS1pZ`La>f@aj?nP~}hcpT8kToVd@fL=eFt20rTHJ)Zc2K9Ps6dwSnZG!_-u=iJ>jUweGJhoa-j>?5W zz(CYn$F@8`Z%x@1eb94|z9!xVjj=Rdiy)k#<`E%r7p>n(1TGkiJLcNwl`*4QKs39w z_-vn$^8kr~IKjC@$_^oxBnMUO9K|?bU@#8#f@w27DK|=*GtbaJP{qstCO#>^a`%qc zS|OM2vG!8F!B4687-Hr%V5%?7ZW#{Qf^~uavBe!fmf?nb|vJ?_^|0 zMnxevWs@0q%NC)sqp~Z>C^SeSdzF#M?st9EyU^UStz+0*yJi@w_yzihOOPLd(PZTTG+jRJw#ea8yDR$T7Am~d9JDX~>f@ovc4 z;+<*d;zTwnO=>qWr4wcQF4zy^RV4ESW^?IxToyUE z^Try8!xmh`sCztU)tcqQ0g91}4<}s<+{q;yuEr;K*f<;^Q9ea61DpL<5aM978~&s4 z1>P36&2~+S7R4>)y)3McM_IaQk-6#o!1V&9gF&Ea>S+(74|s6jfjDflxqV;C?Flv2 zGRK=RWu>PG)FGNWDLa3|^Fb1C>Jp>N>m9Q}Aa>vN`3g!qNR7v|^IW|1$tBw`!JAgP zOI~iK+fZQr#0xQNSTKnD!|aO+g~FqC)}m{@t*4`1DNpUakVH&;M|J<&ivsl#E*(EO zFo?qzT=9su&Ul@HBmTzTcHeW)OtKTizKjw1j~(i=xM!jK;Q=0O_FqAWgUwd_kHQyx zV`o)`_B4cXlWJrZlCt;fsWjjED$;bev%{;iO2P_n;o$UX=-Yl~xZatgc&M8I4%=)G zaZ>5SzAI{e`UQ10`zd)R4+^S`Cb za$#B5Tp*6pOoju4IBdc9C-7bltbdZc{CTBTh1$Wp>e464shZ`g8lt<)5yDE5>#*5> z2P4;Evm5@a@KsOvXNh;hGmy3tA z(@L>+lTWbKWeG(1PCH!pm|NI&@*yDR;Q;&V5Qgp=t8`I78RQ@vQRww5;Aie&xBj zo2U|u!C7e8m_k=6d%-8A-B5nD8HZH3K&r|!+17H;Ni&XvVlqjFueal&Nm;2-s6EbK z=Mz3BYrntRPLqAUt0GKd`2eqBLunA(xb)oC?{7^2GP%AzLy81lzP#saIE`rk0Qou0 zpqI?o%p)}Sl@s#XXu0@m3>x7}1;k+wnpyR^!{yAUEsX@C0u?9~Y6i`$7%UDg7k$$> z%C#0$Wbr#L8U+HeufeZZq+YUmk;!iT6n^u3a!vL_$eV#aF*}*1+W`~wjArGqU=a7m z49QhLJJh(4PBoon($Z7VMopxhXmI(6d(u7n`0DSy%5_1j~^U;2zW0=$rZA%}nnJE>BGsAW6UqOiby$?tQ=h(k??ry)U54sfp*|=+> zS$>Fja;P44E9gv|1?2^GR9?}lW7Btw75SmunQT@#K@f*+wS|51fuL_(r4C1i>RGh) z@IrmcyM=G5*jF7}$%vddJ+@;t2*kG9=W;o|DOHz*(JSdO?K{CLqKuKS(M5tZ8gHI82TL)tyT{3o*FF@cr z0oP{iGvowZh;K#tjZ@zaBIa&7Y8mUc&#ERy+2TPFJU{*wggAK1SMYz8xuDr(dt47p zyXKELGSh36o(aFQq)4pH(^Fiw;N|Va`7jiJZ`RJQd>{_nY|Yw6>xd)dW@c88MoEKu zm9~oNJwn{<$CtF44pKa?4cIXo1Y(;#ajmev!-~(vHi$s@>Z1V5QhnXnfh~%O(VNL` z3+|t3U{65YA7;;&8}M`I;XG`N$B(l<`}M<S62Aw4|<$1(Wa-HwwgIn{D@* zi_+PEpeWWefLDgqVzxLtBV+mahv_eTJtE(gtyz>{v;PW09Bej@!GA3I0d5Ky+y+uw z^lDDptfMPO&UMcm)pdfzTVj4rm_z+n$qD_)jL7ugq- zU;AI!e9b$KQ63tVjTNl065<|*UmrxHKp?i+4*sGs?q}>WjgGrsKW~$k*HCTTL6*ic zH{nmEWzdw&2nz;rf0)f1{($ggSmd$F2~v~(!@{0fk7O$ z*_%&9Ft_a7QV;dliT*rrEI(%Nt;U1LTlOAdt$By1obE0RoBdZ1;$X9b|EtUe-q*L^ zwF$CO-Ir$(Xd7{abB$!?uv4ZA{+6u$-EU-v?q~DmxWFlD0yu25KRceYHnD8U^8T*R z+0mt~)^tXT{2=GUbys4xA4|NiTH&~85QuHIe51o;IcE{Uy-u0{Q9-9$)uZ~A?4wgz zPtpqlACZmj{L}>Eewn?i%(aar%3EFi=3;m|LTjyN);0D0817fuP6wSwLQiq){`YbM zh{HBJagrwKoSXSTdrYrLFp2(_qBPUgrF2p8$Ai5Vqp3>kWw6xo}+Tn?@IUI%|$%4vUASD#S$b>rXR>6N$C0{4|I+4Nq>p%5H zEtXO^rR3H-6&iRMt^ero#fiqGnuX zq-J?kT6eyL%;bth0sHrtin-F?gzF~mVC<}1F0-SL#H?VtE<+_T{};!#Z){zAM#Hz1 zwkqpLB7V9r&ke*!i4hsnf7s_O_RoUuF&027+xNq>Ht)FtbA(^~_$igN73WkfvWGRJ zb?-Mq);Pl-)VL9I@YN0Cut&|e4c+06qK0vghvSP3I+vu}I3gZ&8RMN!=a?X|AR>bw z4xuv{0N@{^=9?F1cVX3l2W8X4&OS{EEkEv-=sWw;1126va3r`tfCb9~xPPv}kltNy zE$Oj;>&CsB_^rv}0Vnxm$u#@ach|Yxnd{DJPPC7hb8f+bLENu5NB{TLij!}H3xu5P zV+BqPx#a~ZpQvA1>p9t@n(}kAb$U~&>Eje!=l&IhxZnGKR22VR=Wf5u3%C|B3o=Z! zXiEO)HTSnP$cIVw#5Qpvc?DMat)BCGQMU?{Y zd&=9%d#t5w@{IRARVnQF{8`1A_IJ-g&olrK+v~#}RJ8uK7aF$a*ZC?A;!qi+uzyu} z7KR%VKce04H?a;|0^6-XzgBhgC4pkbXJf zekWApC0`2p%}4Z3EEbCCuwW4PhuQ3^#@FZ!@$57&d~#(q3Onx7@xG~CM}IkQWc6aC z<#%>CFo?r8dsT5!l>hN3`_AJbr`^O$1G57-Y_s`C{qH@KnA}j-NjUa7K{8@R3H_mvX)pWHO4rk&%5OH(V6*=ULL6*% z!+#aJp!@o^*+;de!Wg;uJ&W;crPMFIM)Q2T8jj!pGlhUE<*qH|2?{tx5QlBH)AX8C z-j(xdflas*{lREdjkR>$iItItSHl>tXPr;!f5%0mKp?i+1F^{``}FRgbj+zW=F(rc z43F_14frN=%D)4b@aIICIV>2&{b6=i)>VPy)MpHGX{8PY^EED=i`J+Su%RqjcqQqm z+mkH;2L^H2W)GfWW{b$TD%~dwk51i4{d+^uPwVDIs_zS9E1eA z`ZIYM^;xdpGWN4uE!nH|+#+N4Yt`Ug3}p#a=mM!PB}7at?3IRLBqXYF!-8mBg&_a4 zEpn{I5y#gdunbS zsI@bjS=w_7lXtzRl7)RS`qr0)PVEg|LN-j|3d`>^82~xuZVw--a+Q-Z9SzGy`k(s- z$=uf`Xovze3XAv@xt#DGeWberUo;>Nd-&M4p6u#p9J+&kW{5x4-d(xGaf$ahT8l1c zT5%@nY{T%*@Bx9?!>5uGFGqts5Z5HMZqS5^-B-&zh{omcM3c1TBa5i6RUTL{i2Gys ztUDiJu)LBtMPs!k>BIA-+c;MHSk zKPdKJt9EW(rY{kK&$&dSKp?i)PuE@x2)wFHc`>APKK4XJ&Dl2jHwwM)Q!TvZZ8fFx zcNTy^+#g;`1k&xZBt9N<-?xeOIdh3aj#k|~uJ67>57cR%p7YOLg?j?TVSAmAqqe}) z?;WT9#`asubDjk*oz~3^svx|Vvm;L9%FIg(@KpI%5aND&t%@V@?=^w#t-FAEMR42f zJ1fL>biq$+d8E`$RQDO?lZ1KV%Y|cfQ z`s`+&m98!O0KeRssP?|dzV@QuU57@2Ky0%gxPQ!A5_UX$;QOTJ$9}bE@A4hGSUomf z-@TuI+4+r*81@9j{bBZP@mpcHGpwf7_U6b+(h$>1pSp14r%usvM&&Ta#p1V@;lLmc z+w23ps%0yz26hy2=3KDE*2lc~z5$mMmLuZZ$gX0@k*&HgJ0aj@CJ|55R>0B#Mx zw(g4ea@6O>^YwqFEo1PyCbcCXArM1QAnEYd5w%%@x%w4O5yWAeeVjf&L(ndtm1zQ} zaQ2-|V0FO_eFpg_OEOAkWI-D#**j)~Ky0(Kla{+CeiRGfhCQ!;aOY-i-Yvm{Y95(K zmDjZzo{7KN*+K;3{xJLC;}O;|a~)UuFE{tk&mAxqAeruDLz1?PhokdxOfKzfVO7 z{&^->0878z5i$b_nVp|jK-?c*ySv*)Uf7r~P_W4qXt_zga^s3AOQp#7&t9z6L6nSP zn($Q*;;_9wymXx~cruuiZSHC>R-HR}kW0uY>=q z;I*s$r{JBY=fZu_*OpuQD7q>!y4VFx!@Vp(_=4lqxdvRb(*wD?S9Xm~Sg(?%tq=xu z9hW(SiHYdDI7%43bo-H-)EKKP_u@kgV?9*x0x6{oMkba*jK#ofQSH~aO4ypa1@(#h z`IO#kyHR1{d>L#w#Xeyu$)H!tehRZvqby8?m7=25^f9*7VPlV?7(`TNYZD#Z%3|}n zq{dDkxrm`Oz&AtXaEeb*wVdKIO#2?X8py*{b*{10`gEe>5gl^L5|?|H*=&s?Kof{5+~;z}`icPF#INPwpL@ulGaJ%y)Cv#LKkLaq zwvS5d`qs&`^D!wby;ln2#SC948^`|Istd@a5fj1&eS@b}?%IWO2G>XTtMYlV*J!vu znW(5!3QCQl?hI0YrLgnZwGQC0hs|7!^nqs#IyJHva2`&ya_ctf^Gl0X$cV)r|L9#% zw!{x#glG_mJ#4D(S08NlC|3S%lu^X1Dxh@f6#ZeHWr-WZO=0!H-}T{_-%ud#*Ra|3 zgNR^y^*1*Z-UO|4stn;;&KhHwP_TGPl;q3?_qxE{kziOch=T+Z?B2pap!?EZ{1Qzm z{sg5=*3@2&{Z?CVmDh=rZc3A|uCOUe;KPOP-$4m{DDbbXy8lt=g09BxDN>SMyR$o1 zoSV-IrA4mrDbCBxebLw5jLfK({QTMds!ec)AP(E>JM=S3VHxaK&r0AWsCxC&(qu%} zI%tYp%oRO2rCM6dCRSLh3fdX;ZUO%yaS85;@ zG8&F?u_WMFKH)m~H5B)N;DGgAofij{yT0nfx5K}J5ck__RmJ}*bU~BKw%PRpO3bl$ zt(^lsaGrmnRbIZ&*iTS<^`+I*aymMN2iNbzW`j6vv-R#t4eRCx@`zB~rzD6x^ka6x zgQ@;nES1ybXZiVshYP>sqER3a+idrjE4X4bdmkKk`PN>>a9ZEj@0#-_ZL{oyoY;Ns zdw3#Y!65DrvpwFv$c_#EL80PAXsu_5pBAHk%bx7Ca{mjpIzDZ#elj>Ph{HBJpzocj zx1H_bkU(n1Fay3HV8 z6Ibn9_U|IS3#~4`|5$&cw}r}8Yc-;wtzCe{Ma~;e5yWAejZd+(v?o>6W>zXW<}~#E zVJ_U)v7K(_i(6iAqT(Id@psGyf!JnKrrYCS^k^!R{SKGmFSt1{D<_uGGh}Z1eM3{& zU9QuE1%tRh%;uiD)vSJ-TE9TciRsk>Q5qZ=#9^E5alDFw zHYHW=YN_>Y?Nj+zSEK!1vZ62QnG)Q!2ve@TwKKB+3PK!gwjx%c`|Icpz>R%-WXm2s z{iE&nS&`e{nr^drc%@SP{65+2m6D}sz<76Ze*+bqB8bB_J2uimRmy_g`IL7hF032L^H2X0Mj# zsEigo4zS3two02@&Lu-#@&@}ToBiuh7DzOYy?G2cC^oYXL;m3 z>45m8-glJU6o#8#zur;v_(;TsIsOVdeGJ57Q1YxyC@aoF+e5;_*SK3Bovk%)9t_QV zm1)0s^7LKG7fHA5uG9Qlx($8}9ggsPzegZNSQpLLx!4Ti;rP_`H6^n}qShEO`d3EX za|(LfyKHT2p?wbw1f0ILoKv?BQ_vaLN~&8E-R`}zk(ntYXS}Ybs~ej2D`a4`;hpVZK*fF{l zc1ABgniGL)P1jb9X2(^%F_gTF$5;TVU?>-%4PV{z4;h0@wO#zaP8vD2$(0Y!lXSh* z3u)QN(WjXBKK2~GYCs(J_-Vj&;n3WW-*a*zdGBCXQt>=9J~?yfT?>|%G-%&3pa1RJ z1%cS($2^mU+LAZtya^qX2Fb%S`xzUGwTt&!Y1=e&j;FRg-g!F>#QiaTde{UAmfgGC zEgfkH8Ox3bUHKl784|`fVHSPwvRS@U9o!Qj4ic=myX2*Ix3jO~r@V3C?s<-`B~QlM zgM}_)*C*sPY&CTDD$$TE!zJ%uL5TZD@%DMU+W*?MyFFI|uf>11?N)voC(q{*=zAO@ zD{p(EoD$i8H`$Jg zfO&LqcCq~h_3xfTqd*|G*Oq3!MLs{BKh4t8q-GrKPM1|%73t}z>C~OQTec+sE)2E= z#Qov5chAb8+=V)_si0LBPKhz^rwuIaN*Na{v=7yF4(fa^g#&}QKfKP}svn(HuDxSr z7Gp!&({i(CGNF&+#}zuh2u%lNzdUDnuB84O2ywr?Rt^4-l9vTAonQYF{xqe`)a|{g0Evx%LUC zP2gV$P$2FPvlAMcby<9AztmE1%--A7s7@LrT`Fq*ys0-!UbpOV6uvxBAP(DXiXhXw zH7zNkaZ&H@EXOGe$yVJepN)>loeX8Y%dhNk!~!<^uOP(1X5$$Cd%16WWP@%9+f~s1 z$J3WgRAlCuX0odbQ~3t=+fnq|s2(FZuwG*5eU@P7HBJzRZ8kpX6nj))QS|#3v1Zor zXKie%Dui!@n`LxZfJ z^!!h16$AL{1aW_uO-=cd$+>WN@!aKO!Avs|SF6L?tQJ2O_LtoyVQLc)_kaU~IBc^o zy<6<@8QLcpD7Mg%6hv2b)b3le=dtO2!uE2}E6S+`J71XiD+qD0*}?x+@&fMbN4Cwz zY1gaGY9cpKcl0{T@SxcujqG***pFB1NqVB>Ki;?Q>`Vr6*k-@}gu&nke3$UzZ~C4b zZJ4n6fVyxlQBcJ9oT3WJ4B`JaZxJ+JICXJxIfGm$t@P$2>TH%fWPTAr3Yh=i0oWR^mzW_QUu@p+JeX1dQOU7RFRT*xPT z&{Dn8Tl-#a$rfc?O>e#i7Z>qe-YqfA-F%95oOBL`Evu$^P6Ix;2J5)TjmiS`NGf&bsuMCC{mv2v;8AXE}-IYh}$4k6bk-Wj2WLNe_0g{h>Sw5`I{t7zi3Dv|Jf<#qO z(-LJLQ4zU1KO+hW1CO7dO6^s=!S5=RbH%g$pP*(a=b!BkeRSm3Kf(m=b$k-f=AGV` zRjBIA5h++VNMK+}^=ok#l*{(832OWzX;PM5D0WUHb1dNUi6LvRugLGjpE`o$upDrc;!@09+-J^5lSdD|KovSQ;qtQMasQ5sMu9-+D*V@4 z>1UhVjTjyy%oURNoTIoue7N?uL_GT_`>x-w!P|vuJ=#m{|8Op=s+-1eaU7n#(-f+k0 zt#k8Rl$Ft%5`M*XxYGSA2ywqR0jVhdN2LqA7+E6@L2E!4xabCP&Ep^TMV-0aB_??j z|0@ysc>uH_9wM$zML}xV(mxtcG`EtZRM4?V{O1)?LOD@qz zJop?26dD9#dp#MmAU|!Y^O!PFqZfBl$Mf0bw6jFuHM)+x7u`+rm@Zf_i2EJ)f2Xgy z8sF^qGZrpeJ|{H5X_}z;bM0WA`rbC_(!~Q$+|N`~!ht~?w%7jS9G6TVE&4JFe3rv| zIXL#CHny}hJ&?!Nc>YHhh0=%uT>ShU98rKbd^P-6r3;u(Fbhf0%i8VM6U{dm9UnH- zn;&Ld4Iv;PW09Bj7Ye^t7mJHoH^zLSK!8&CUL z2OgyuX7@ZWH7cA<2x;3pQ1E86_BGSjFYxs&3*fNL_HLE$edt;=aNAbv;)v=`Q|^>F zsbyP>+a>iTLDza~jCRZhf!JoF#W=WkqGcZo>h=yl!@qyy z6prlczy!PeuQ>2S0vZJZvCR&<5gPbny<$-E?#Y6(t$PantD->^JU2$_sY%tHTEy94 z!65DrvrRiL?V}wEWhaZi7NgO8j&qpD_M-k3ZrA99%Zoh%8n|#^5QlB{$yM=Jhd=fj zG`}W&O&V-0_vA2RQsJZFfW$f{#=FV`YJITTe+3~9He2z(D&4?oB6nQ0WWUSESb2W% z$jsgty1Gk(tBD?-6+%U4{CMJrH7tS&LQHUrOf40O_CIKgJ9Rev?Oy&_J#)$e%U@@0 zd>yh`j}ujJu6yQU)u~5!812FBz!~;Bl$(C_#o3-P=MZxd{BVWG;mS?3Cq;Ph_e-7F zYtDn0kkWp!e|A+tZd^d@RsM%Hhb0W|+_yv(-V}O;c;hf(ToarFPOk1kM}&MGeO#Sf z9UXieon6nK^SQYFznGg}h&s_ngwCGx^s#ex^z!s`^!bJF{-1f=UlQ%|DBSMNTLnIe zuHrUw7oav=rF-I#O5ptA)LnAvdH>RQ4IEq-9O%#g{@%C$*S~-LeGG@*5tr2#3#l6Z zN^})}&k>?+-j(zZHAbY-*bYY~ORa*5w zJ#tk`;1Hc(w(*mr4F}8Zj|e4x)mbCsDEoPZOghPAVv0BaYQrWC$79dsto!)4`dkU8 z@P4K8?)=A+?**Mt@EMwKRSu;dtIivyJZpIA3a?D*o!cK@Z^ifWVNQJ`G9x{PL$Lo{ zSON|XrqiBI0HaIEyaz-0od|`YStOFsZ#q13SMpPVgXOAdS7N;qOA=Y!VGvmuzxJ!u);v7Qv8g1sK5t}i3>}cf|Y}F1Z(_)5f|olt8Ok5 z+2f)>VKKqf%=Bn+p{;C*(39C#b!WEDv=G$0x!<2zT;JR6;r3zRruEmcUF}j#A7>7T zrxLwlI-EdpH$BJxrCCX9XsO_4l(d$>-u%DKA^JMQQU*rYG zezZRQSj5=3hH3{z8Cfl&{HwdO>NcujAJ=?Kdo{o6G|lF zt}ChgD}EQF6Lc7jB>Ih_|2d&X7`HLmKm9_JkaNsabW*`P147jTm5{EFx{@aL8#V({ zyTaloiBCy+RN|0GSH*XSr{KCu2OrLMD~$>N=JwT~CHd_xlw-A7@xgR$%hIQOt-!5W zo9pkn9ZN{{$;7awd*nr?{5pZKRP9#_>Il`R+Y`0Wp#eZ;3vgN z?CaIiyTX3{fpfxwI;35`)I09Ohi;+!!f#|kE0SmXFiHMjbJmh~p-BylEtd$>?Azj` zk817_HaeM2KQHXMD)X@AcD)MAXJZIObL0F{V81FCf_@OJN#QO_7gTRta3*>xt)M)i z=uTcJU!7!s@vg9O0keaqlqKzynL)3!AHIE2d&Yy>x=2QLmXSfq@t&~wF7&h=v0=9( z=0tA8&-DCUeO9rar%R^mp9f_n%8vOj_BaOf{G|WYKIl5c*j>hFz|8+35@puH!Q(#^ z6AVoNS~$3`&T+hQeM+N+ga0_8!K`h-2gAKWqzYoZ5HODrFnFurwzLs2*AOtD5HMV8 zU_G7)m}&$J?mD=wV+fdJ1WZ2yhI0d~=L`a-3e2Q#f}7Gpz$77HJ|bW^w!nHk5HJt7 zh}1zt2lpqKp?uFsjj{PjBnAqGK@e;h%%lhq19dC)FjA+)5Q8M8JSA4w{QC@pqgc%F zYtjPU5ix5q_>34sTwtr1Xk2gx?+`Ex=jf<0VtC*NMXusgV}cNX5AndtaPh$mt1qO? z1|O`78eB+(lnD}pl{pcEm6al3hWsIA6eQpVS(71UmI%Nk60ovQ z2pGyhNSQ1tSed~!NLe@nu#Ob0jFb$_C|!b-Ig=5KA)fg_1wN)I1)BLrppc+jz`;FW zeNG6NQUuHf0!D)ztS1Qp^9cdNvlrafSp-ZS0)})SxGiG@Oa=mG8Ub^J0<0$(0n>(n zIj|qxmK_4-9s=eE0!EnSa#<}d_w;70WjFd-6Ng*FoqB5+ArjP>yI>CU`4CtbKNFboJ_-qoV)}nnXP|Xb%-#ZMx+7!;=8BPH2J4GNz~C-J zD+1#P8f0bxH|UChsX)Mp{D4G3-$nt}sK-!XQ7H(R&j=X16-bmkD_E2-D_B$`0*0Io z94B!V66MAQ7L|=4*jEIM6gyZ{;~FF?l^rbV6@p+49N-2W5HJhtkf5Dijj*&`DViJz)Pat++fy2NSPx7FpVFqY!U&Jm;otMKMYpZRRt+aL;$`#3|2;iV3oTu6H?|Q z09Jv z27|i7U}e`K2J!PN=oe~?XALy-af^VZ*@%Fp6(V4k5HO0O;I?8AFz*pCtYYA{+z~KU z2pBwZa9g?vnCl3b5d@6j5wM<%2$*LG7zzn+Tb2lzI|!J01dOaCSWh?trV9acNDADR zGXkaz0kesK(Ub=3Nk+g7AYgc9{vXp7XqOBI)eKEn)iS{8Dp|>d8iOwj?0D zb(vFRBETG`ULGurOaaU^o`i(CD1e3GT2f=m!5n4=L8B6iU|}I(CRxOa8Z)Q})Q+K3 z0=H+6fMKoxvC%rRABanJ*)NHrY|27>_XR3+8~1!GbJGj0f&Dg;chBQp(# zULBmFfjU@}VmCewrVK%_83e(kG{6nwIz#GjXn@rRKY{!iM*udyfl?6D1V?n&1j~Db zfGI^Cq`@$1fg8lFg;H=v0A^}|m3>9P$Q%R5i9o>UyFn&R9s_5{sts;%e-Gr(Wo>Y< zCkTR(=ztsSIt{6J)d4rC-vIgZ5CNFj3#EXs3yyeH7c4IdVi3=Fpl!;j$BFeolT)V$ z)E_R#!RoV)gViVWL0y5T2M#8y2M!jAfHCld)K4L3u=6S8ri4CN8D&3|!W9HyjXpR9 zQUfr9%L`2yZU$gw2G5}sst|zl2wIgh1S^Y1!1N$sGJPPEq>R8BdK-a7*$zVfbR!71 z#~2*U909|64pRTf7_2_C1@ec;1Pl&+hEgy>0LGetQ}}>@=@Ni0F&R^^GS*fog$M*- zgDF_qUNbOb2{DMLJJ72Zm@YH$e3#`1*(q%f?h8~q)ED6hK)X@M&Nm1^atm;WSRh~w zL?AmKTYyu@>VQ%pwgiKUmSAO95iorS7;YwFWmh-wF9+iU1Uuf>Ovq0QOshQ{X)bW>_VlODy^%I0f%+D1{yb;C>r$ ztJVmZLIlhY1WW@OGRfQ)oMECZSa|Rk$e(Wrg7Mq^Kju5o`(haVcXS6awRYefvZNt9 z$?U=4!aK-LGX!9QJ-AmsAz=7Uf#digU=*)FcJ`hEXGrM)Y%p~ma?{5F9IFT%3$ucN zX$*zLTR4InRQv$hlZOBdS%6YlL;xOk0(J-HA_B%+9=gK%oWLnG_CYCdJA*-6XRxyS z2$(eljD`!it^JXZNq1eq!iNw9>--M+qwER}7T^k2)`EaZjDpnjx`7+qKLGjTivToO zhEjNn0NiljFa&wJi~#Ifg;G#C1CAJY1}yI-0;W+Nnl|`6!3|Q5Kq>ek082c< z$~F-&$GpICFbEji1jwWnFK~t;-rxpNn~*@1`gyQ4yA;UNRRqC4PeC1`?h9^}6_0=hlZ*gt_XW#i@B=fHdXT67eqd#GGf)aI zz+mbHaHF~in41Wg2?R{Zb;u*li{J!9E`o)75kmG1BM5fT9~{gD0V8q~QvcE)tiEIx zvgbem7+fHNQaFVGyd3~eVG02=WCUGd#{$91MCPFsFbKfTK(I2VOJK$g0aJy52~LAd zq7MRRXb=PzrAP+(Qw9Y?Jm-OqBEcl4Lvx-m8m!M14c2F82HDw)AXw=lWG7uPxK;gN zaI0wum}vxzWC*aW)GWx&>mgv>UEo-lhP{xRqL;zJPG1HJ!&D<+Lb4(C3|D{+rv8B3 zaRPG~B?>5mas=R)E8q;IL&1#53Frd584An*6S4xOFo6I>g@If3K)^gkzz~On+v>an zdE^of&M*r>ummc|AG`=~Fxd#OvPcAsK|Z8@3PFRN>ySSZkzi$%G*AjxAP@~Yp5)Q~ zU&oVx4hjpoF1+ikrs#~HpWc31#re^4^MW-COPXsdN5w;J|H$sBNmZXAFP|M0IdmJ1ibbQk>IfAD{MvOP)$gQ@VW_ zEcxM;_9d}_NeZMiLByHiyU^mRR}#Z@j9cFWL3o6_e}BLcCn?B0H2y&Xz+>fr8{N#g{kiwl8IijPTBFY2oXt^hI973 zi??~0w+5j*XLijTZu&t>_fw&fOTXjez51HO`OnL%nFFo9RkW@6jbgLA!di6WR8u@9 z5D6-=i1nE}h;EQ_JbT|mH}85}W0U5dd%MN5jKr?DpgYZK{Besv^xwq|qPM}h@RH7B z&FwC(-h+w$7=kk@I5+D1${ks%o$8yp% zFDOP38dgtaJyntRZ*d;FTq5>$!`#B1^ZM8+G39aNce@V;*T^TR zygKs)&DD*+{61%)cI5LxFFmzq5pRUs?8K-U&+LloTysn4=%AmrQYP zqqqBOi7yzby+M0-eB8yFnlihP9+CQy-8nm;(>HmgOYB{!S$AXygD(#AW1)RByHIk; zG~%iQ1Tyhb5;4Sqk=Ir)I{(xS(IrymI<6dDF_E(ieO>%4MXI$!lc{yKLvE5OL%_6a z?XdvMD%Hm_wDjdVZr)vN@TGl3A#zVns8(}j7F0=o#C(k3D0eN8s^^?gb#t(3-i68+ zz8#)zm|DC3DK62OO@O6I!z1koj&9@6^>>5iU5S@>p~_mMy&05_7RC`)ViTg8Gi!e2 zv~881YHMf=&vFJ4z49)WM^p9Up02dw!aAHj$H(y#99Bne%kBw3=Kqy2w_ZQCeHVJ7 zv``?NP)R(9y00N;ePQ@I{l{vw#sj(XGlPY8I@^fm} zx$54E_)R`0I-$)Z zeZS*V3Ht1q?}nxL9UiLA59Eh;v9!djw{1_OHfPc*te2!!dqsvVQr|^ZTt8G9rL*9`}1w(%Qu? zwy&j6DCYU{BIJ~NXMVhuVz-Y`!=U1c?a=!a2kV@uF>Nj?N;-bH-xOA4FI}S2HC~}J zP;TAV+Bm)|qVxxfG`5)WX}{I*{8WQ26Y59ahL^pBrOHBjbEyuV{yv}NX(Cwd)!2Ze4*_+<{!mM^5y6I4=?j5j>hKNWsRE0&G< zZu~9Hvgpla{v8$%g)zD{TeQ?Ns(wYDBE|e@lSJ3_3C8L}>EWd=Zl6Z&Nq3=42N-WX zw^5CjJ5FVDzQX7{i@2=o`mNw%e2Mnhts~3#exutrrR%2#Xf(+C-5zeHL`b)NUpt~& zo?}?XSIxSV!gFQW==QF#={@ILiihssDB$xwN?hsAR(;B3d~$|??9{ynbFUS1cMn7* zXKJUeiYW4v@k6hIO5YV+p1qh7{YV{ug*_Udbn=j1*gwaS>OtpNg6`nEC&NR;>9GUJ z)maVpCkAP4FzQ1?ID!_@Uh}@(dpMZ4mVz<5iNsG(K&q9A;2?_Mcd_Y?*I@YxEt+C~ z$-)b{!v4k?ofpmRMv~f-+;WaWUmPS=_@9Jhx_Wd zIN$Cmb=%{CZr8@Jw&JQ_YMBXWQON^d*TbJ3cxOqLy5Z2YYPZlm=N+5eY_4LHD7JCR z=i0B&fhnFoNQDZE3eSD^H08C)$yDC+#QN5k6S*`ilS%@$REW>h$QIn${>In?76K}i z+(+jFjL$DAKRq+Q&U#eaW?3nS_(lS8D$Ceud%uGIEN7-d8C9P9_+c)v%q7zH zalnmS7JJ24NoQ;Ox|F@Y;f(vO9RKxE1yJhSCp5Q>r0k`CKIjvCs7Em=T-0o^bP0L>W11^U(=W3zFV;Gin~{RiXcg-+=!kzt0l> z{v{d(0{=LnncL%@ylj({y5OAy8%u|91(zl|g{6lrr|(ztx)ex^zTKSFc~G&JO2=0^SxJ7{pys-jB2U^I=-gLW1iFImxp$ z8>=nVL-DI*Tw4O>e>@7Ix0cuBFTnd8Z1t-o23&s@+kUmPmc~qNShvLIeTh7HZZT{u z#O2#tog@BSL1H5pCOtP{l^_n=F9T_>qM1W#PFwG0Z~XZ9!Rm33}*TSD1w5ya_f_nnQVf)438s(U6`1+$NcMjv3jK=SH z>eYM|i{b^zPi|j|;y3(a0{aD;1-AW4yQU}FS6A;-eUlIBdVZ&-+ zP+C0iKED_3YuGQ)RE#mmXQ4$~aECO${9-;JDROIBhv56|tCO!2##4t4a%~ddRLJdo zPSF&=Vf*Ey+tS5U5qy(~fl)0vl`AbkZ9PAp_NsV0-5E!6S|E)IP^Tjzam)3s$hod;o{- z*ZT^csm-IzGUfN%RPOfg4P&N%Bgm`9$!WsH?{xpz(|d4SGzi4@t4!~0AH$n@bFCJ~ z>wqLjhBBNr(U6l{Ks%vK{Lw~lTw+_2z?x(}qe82ALNxlIL>=&pi z*`5zYEy-{iU-_!P95r|*bw}X<(W$0*%kOosBqeKS)4m*EfmMPyY`^@K`zN*-e7`;* zJj%|z#}+3p>I`eNxmoC?tDg=vwrTD89T$xPf!KcK#nFj(7T@l zhSE);@4Ccy*x$S7RlLc%?~VIXku=67QWDW3u_$`KF-GCc!J~FX z=Z|hS#TNN4{Q7WN!ZWCPmbminLujD|eU&^z1Ub$oO;5{pFqFB(W~kMk4pUu0-m8H! z+9H#iGJ%BjukrCi}-%V=LiRZ=5D;xNHaYv*`dW>sKbYJy875m}$kskiK z5*h^pu}20Oea5(Skx$d@ngg%sP3h@LUf>g#M{RJ4+6D(mpYSG!1%tRhMn*uX=uamC zHOrFg;VrjmF<}I)EeXl7r&@Ab-Y|HP&WgZ+K^!C)cXuUjF|XtM%~0{05iQ4&s6jTP z1Xm8*&}1Q8d##08ZoUCNHh3ljTz8ld0Y+MMvyfKt%Y8HXWWztsD^nRQU2;AX+jzs9 zVzfo%h4u2fC#(|0Vf)ps?|871uS8Vn^7KcR&%>ojeaF&Yh<== zSo^)tN>0jISEe8d9^ldZeoc*9BVgx|48&pk<>1goH=3_l*mVO{Q8>&0jyU1Lksguz zYSP!3zdYfaVS5kz1sMF8A!B^#D`RKwtm7Jm9oG01RVf=S`QdTHO?5F};kIgT&M-#V z4EXDqC=iG3*DO(#Q{`28_JO0eJy`)Uk1ux4deHT~RdCgUBc#O0MwNNr%&TOn>&3?o5uwNkV55H!gWzX4ro<3{%79DD-oG*4R zI%hw+fY8q^wW8tvbPW8dEEI^t_Nzp&vE!Nb{0kiuJm38GY_~v>916nM#0S%#-jz#I`F+mVD3h2J81WC#Rn9 zFZc~(K6>08hWcz7?s(^w+2n*_!65DryEs0^Nx9dwRJmoQ^^hME@pXT5Vk4io!0{gM zCA(qAg`Fod5QlBo67}GVfz=W(!`F>7E3@op&iAy-F_N*m*Hy)}>++{oFu-PA%vLScFmhAi~?O8Z|5Qpv8<~ZF?-7@2@D*0#o z{d20PS{$26xDB#xgnDgHUm{3_%Oo@k1Y-L|Iyp_g^n!ZrCWZMk{;rkF+|T{lXYnY* zaw`HCw9`zEz=A>CAAZ@UStqI=?qq15dy5h9r;R!k^59O|Nb)GF*~9yfPL(Rcfk7O$ zU+%cG`AWvcKRnCdZr~7exg71u9Cm{ZiRj31hp36J=3W zk!Vz;#Ybh-WUE(uT!4=XZ;M}828?N>SN?FVLSt1E27 zr~uBy-qjd4T(=miRn;ktEzdOkFs_~|k>Y;}anP^Oy9;rYzS*ItF4?wQA9AWm(Vv2X zyHf)>1JvV8j26&Mkw=>_-%6lD97uJ=LWOu5{7M9}3bt}hztH0Kob1uLn(@dJOBx?Blw^!*7>f7I)ToP* zjc;#vcKamzCNsSii@)!7CefD5aQR-7t&*Ia6rMB2JMN$v%i^9!CP5juJSXqRzI_cv z%tKs7&!5~Ptn|DaM0e9m0uw@vtA-Kcr>91l(-Ob=h!UWg`6A=zB226+uM8cn`6z{I ze@haW)d*>(8uRP-=J7WU`Vvmi6BFd1e zv)^SVB7;xqn|7I3(kTs`F3Bz>4xPKDJ$z$l6(7X?F*fK=KIje?%OJNh3Z%_){3Og8 zF_YKr%D!Aj!?E^wfDjG$1c-wK@84aD>$92)rch?)lW0#L{1A8i1I04&r6l><_!Rqi zTmk-r9mDWk2E6h@mLS6fy}I(%rLt8^#4HL3ip|gH6x_)i54MbDnCO}$eZvZ?bOCVK ze$ly55Yo00UX6u5e&l-0=)!Gf<{up2OBt0f)QH-(XC)b1-#_^~nGw&%s|0c5jDp)K_ zY3)i7+!G)U+pm;%QUQxd->xna1L-Bh5A3SFPJ^B0Qg&#*n(}VGDYjYIFTgB}=`w*n z(A+Yn$Z*C&)e_TeB-h%^tI`vB|K z+oMLfV#iLyfB%MvbER?=V=XC{yT3+hiPJt#K=%rS(^x@8|xi(ZhD!&+4kWlML{upZpSp2g^3J=FtjiK{Jx@;Gi-84$ zxIg^z^itsA_$u*Jpowz)^SScbWWul`PpI$A->($zoUkF|r zxcj)WNl>y}b?tTkI-zf5wzgOVzq`>#*e_63vh5e|X^mdD6JMO%;zCbem1G((XNY4w zXQ|3^+o@HwBivgXP9MZ!`?bVhd}T&5Hpum4gCpL&t6C?I`ISO~ZvTA&wHN1U8B2Hk z0)g0mc?I`e`;xBWwqhMO`-S+agZfQE+w!&6>7KBO>1(TAc(7m)_lI9+31711^K%;N zW<;1}*&5?FwP|{+^^m?Nj&J?pq;fn94h-V3{Zb|N>*Wy;vp&%g_(W>i8vl;n@z$+F z?nC$ABt|!*T)dB7H++C7y)*dvApl2GqnG>nDnCA^pNe-k8(xH;vtp-b?$Rki=3`peqn^kHs*gcN<67i zt~d5VyeGHik^sf8fF(!isaWVKr-Js*+lEglruWGynWJ+r-6Es*JL&ZE`2P`hmSI(N zT?3Xb=`J~hQU)OkBHbn3C8e~K2nZYj0ZEZYN*bh*PU%i*X+)((KuYmD;xp&-9e&LJ z`&#Th_u6|Fd)Cas2{kW`jT^Q{k%yl2P9_#PJl)|$w)aJuLfzMhJC^FVX}8_s{n&#S&U{r=2I9h@ zK=2a5qI?$QJ>d8-!TWk}kW{XywQ#D-fY3vqRhPKle!s;eATSh%i2LUd`~OQk_1HY| z6BG`y_**w(xpF>WxgJci1X#-x<@uBtNCjZl0)e48KXH`*=~LOCBF@aA)hSo$dIi^J z!Z)3wQCChDfl)$nU|$D?(Mz}K+vXPWV(XYaGh^H=Lon(WNxoWZ`3Y1~OX~d>7Y>60 z!M-vRm+Mh@mlNHn9N5%1)!$Yd)u!Kect-q9^&NKg^gBghz);*@U;jMk3sJ~dMo-Zx z;M^R@n%{YCVQ%RhT@Zp|IN=_sbenVSI}jL(1N&;Vs_<>Nbvn^GUMi6$Zn!+8(Ykui z+@4ug=Dwmd=gW$pfG?;G;LI2HtDlzz_5|)rF35kcQSUU&zEgEoJ4nmSGWpi8HdUuU zV3bfC*w;&Q+u=>?@JQ&UR4J zQ<<(|!^_I+W*=REg3(87jZgxt`fr1(?}5NDDDIpu)^aHajYqovKKo@jTka&kI}%R_ zB{jt&niR%04{(0d09OKv1N)lj>L?0XV9Hc&uD=4?7J2?$_}K+aeDsn`j>e~U91*W0 z0bdZiaGcLH;&{BN82)NE=xCMu?NjwqL8&LRnrm`3(PVF;9Ug9W81f=dFQGWFuL^z5 zyld`74FdW3$y5P3mLhORKjnfKr9;V>u=?5pN$;X+bI3$xARMHhVW z>#6*riU)OUdu=hiOpPW1w~_5yP~16RgV$h`x9DugyoDDH4W~+XzxZU7y9w{(Jrr)= zCjR~tSv)~;U|(W*%OM-aMv0X8A{_~p>0(wrYJC2^z8RN){;+z%`NkLq_=3D2s_LSW z!%u`OT3$SoeXbt0sZmnoG3sFG+Km5}H36%(DoVBy`E>Ul1PAuTOnP%xpHriF;!5f* z*^Fy>Q{5xIKX5O)T^BI;q5SL=d5jB(0>Qq%QEkrI($5+vz-#um$t;^OYCM03cAvh9HE+k@i%`ugYowaq$K$a={po7nhU^>E{e$pe!^e7wcXhzEl+Vb?XI(t-5_ z#escgR**J7WfCry+j5m_xL)*nG`8XTbcJuZ@w*o;PZBu3Isv{Qijt(bGhfMfF~d^g zzTK(#H7y|>aO+_}P@Jm7FNF+h3I8$)OCn&D_aHd1FV)|Nje%$|oQEld=_nPatquye z3?B`=qvE~rHlt?zz#51PhXTRA!mu=+yIt?R#GbtEFn{1fwMvvNi9O;{75_`;oArHe zAs{dmcg~ku$cyDh`>VZK_Yz|xQ|Jm@S(z$uSI|b)=-_-2OYpZqU?>jkD?~F$SKEB@ zz5TrCokDiK?q_?H52DD9Wo+shF~bMYpN}C*@}BpIlKl6;pOPHvrK*2R^0|z_<(r`j z9m1KT5tBF8T0WZbwuHvzs(%Q5mG|RGIdxq85TYc9q=t(TCHZu=`t8}-y=Zi{eaB}Z zaT`R#VzD7fqYXQUm=Q<1A1MAdkmFmR6T@P294g472qT8oNb>}wA1XvJ@-qfXKApI| zYO2IncCqQK*SlAdiUh{WLfbe?Gv6-lI9$wO_L-$@hqamQt-}qcESpyMN5!Upd%cN{ z5H-1QMFpC?HX4O9D=JR!tWgIcFJn}MO*vcG4{|>#qOVMUf<~q8lfY~Yzf7|`@LCf7a0pLd|LsJ?0-9u|#S5XiXJ8%TbQvCaF7 zywkLqXuyq*dEviZE08na$wc(u;ndkNWBxkeo#DMS(olH7k|$6{Tc031#&}Y%e|r(R zPB<4a8@8N6z3<7{Xcbi5T$7m#l?-PN_3`Ee{a7}Bqi$P-7+)RjZkY{ znXTBbS^)bRMEb?O8l@tKAIr6ALk!Pkomd#&in_tGq2j3spkDQQpmoZQt3DVwB> zJ!%{&TVbk8n%5O7gqWynEjo@rdrBDtmlcZp>+7GoydHm#ZM+OCyfE*2Vlc*wUe|e> zymXlsM#O<3;>8`%ZarM0yx6;(F5OjN0XWyBNLdv{koKlN6 zfG@~RV8;Q`wvuUjZR7D}boP5j-}B7KJdSmeQa>ve%e=3#%)qQ+bOokA3&DYXP4lyx zr7V57^&ECnqE2X%m6jXWWULn7PvUSTTopqp2I9h@K(H@fYtP9CDs{Cy+Cic?mu2}F zPmdD~eSDc#O&@99z_^Y4zZZ%-x4wQoyUHm?o?T6uNu6=g@}Xq%JH8Q^o7HtC_!qDC zC@C&r#84dAmr9T|WwxS+iiSU#|7;BRn2XZBu7J7sUPW?{=7_M2NQIf`S|C z$Asx2{KI>5@oQ&M|5w#cxl`?jJp*(=QbBQGU&9Uf4xw@VhTJ_h+BZEHQwk0AU%J`4)|xG58eG=oa$9*87%&uf z&R5OdQ{P5wH9y$yrM?r*J6emW73f#mmi-FUc4>utwvdG>6bJT&vzEEFpH#y&QYyr| z5P1~VU6(l?CSi4pYKE7Nmm?894e$j~l>BYFR0=pUeYk%7p_cGgkKAMXr6CW|c-#G(^YH%17 z2=>Jq7pfIMhpCPE`%dKBFm@X2L!4Jl(Z_FS9CjZ3{Nkbn3>b<#=j-FFL_@CmM&M*Q z8L`jvs;?dn_r04Oh6x@A-u{waxefHO!Js&>uWOWsjBU%aex?W%@{1jwg;~(GhK|^X+fNo*N;nFG&Vtf0FQL?qImm>663L4ok8W%LsFr& znlx*X-+u#^7$eTg7bBbcZ{N-Nv4v{a>V=8Epq}+fC^6sx`kf);l*z#hW0(cbgFQ zSb>6mf+HaaxU5jzIbSKyUdVPuSZYjoGkzeD<+IMcgZ~dUsBI;lja$7=|m6h(e?^+#jC7?L)l^~mFRIFe%U+t=K zAep=(+ZR{o{CqL_A&b)`G#f3>FJ*54Ur<}|nXj=?feROd4yNMlHs9Qy^i7F3RQ+YV zsP;LL@EW_5Fgx-AA`}N6r6=mn#va-m+JJS8JM4%2Y688}R2$dAVr*zP>{c;#F_6BX zK(Md-L@)!q$f29`9Jld*srY%+xD}>qZ97e;2YOS}is1vzOfV?!oG+>I(~XY8i~%Wm ziArKFWp#t<{Vmjk>(5f@3)RpS`H%}2iUVJXye3U_t*B;|2b@w>RF_v*tmz}FD~zX% zV98s48=O=glYlR%o8pB9Job_1X!Ypbs1jUN>O=-d=Fhcl-|nYKiJrUow_&U2L!-vA>OA z_OGd%nDDnp^%&F}%N^kiHAe}zt^&&diaY0P`v>MyZhC>x_X{nz`efEwF+aZA6aAHh z6+eA7<7cWm^3`D|4tymleniOZ$Vs{zJWR>BXQy zLX9`s^_ql7{1~(Je(G)&JuwejO(@;14?%4(eOH$-I)Nez!6Dswbe z8tSrd;qTei9K^6?dgw%s${VcL>#%VHbI;EU?41oiJN3;4N@p{v`qN7)u)V z91r8vHLSC8LWlRDE^sBFI7DFVe_PA9B4jE>cXtr4{)X!v zx3z2_w4C7Ra(+X zzPM^1C4}SMw+Pcg|P$+K72z%$Ajki-@3<4o#~6g*~^j+l9~HewnWFv%DME z@xBmuciEovg((A2Hb8Cxs$*nue9F!Ij9kY|l?I)XI<&dty_V^%h~(?hUkzzW#n;`C zyE+sH_N93Ix+Zb@dz(S>cE0sjex?u;v(J@U&4ed`Tjt`IIth^L3kn4LI^lQrbjy(q z{;Vg`z~HO77uLfiUJ=F1KNE28Cb3l|a8d|^;?DVs(%)+9eYr}ZupsSvwB}z=xGE{i zGMxE>U$F3Jdj2EiK|B-(_Vx9y1x?&&*M5j=RHw%R_e=lFYIX{6<%T6z_{w*VX**)T z7t}`FY>aqwL!W$7E`h#))+>qHXJyGac=4<3R=jIL@(goQO!kBQHXy5@IIypwea)=j ztw~(l@Rq0V8rt~nv9bvhzlUDBDtY@&<|35^(iap6_O&PKOk=oCY;{bOrKRlYMzUN& zd-~~ELs5(2UVYD{@5qjQDDIrEk|n%h?$;*o-DlLt6?yUov#M?ftBHrV&sMR*kGgf~M?4;X-1q*&3@17?QA+7& zygjcEfCPi${`&f-kEO~%y&+vORgjGP;%^SIL8T_Mpt}-xNIZft7BAmztw%NtLUCYU zb+;~e89%KN;W6Nun{3&=ucx^bEVU+Sf%~#m74apHtLT6)sH)_wEa%yQRq{M)c>nXO zWdC;hg&SD$4ZmNU@|nHZ_ho#l*#bP5g+Xy(U&gOgzTOh}<+~r9F}p@jtj+sL;g-eN z(+n)tF!rM|1ry}@f&#(5Q0MhSz9*OjU_R}*X@}Z3YeDo850x+wYlvUA>tM*79PkCj z{q^xc3;-pKi|H|#q`^j9f#kZHzqU8CF-Y2;v6y&pg6FvCd$F4X5MbH zKE{#VE!c;S%F-LoM-29*R9!Tyc4)3QTdGt}|Gef2^-bP?>+!eE7G9;d$hgz4eN3Yv z8M)Rr1{QW~{)$ zn{O;TE!YyY*BUqe*m zat=Z@k=~RxJ|rKsLV8F7F-nw}r8vT;Hj6BNlVJ}ce!>Xx`NbhrY*GgJlXdjhCaCW{ zFU8U5tydY~zNbH0)_Z0vai408zfUNxx$Tm4T!}B@q?`yVTq8c9RkBj9Q8uYJ_ueS_ zHG#|6&BYXH?;YpKRpVYAGWYZ$L>QM~&7_+`7eXle zF9W3*42lE$60fm~+Gv11=0Eu%rJT*>;#qWZ^L>`iPKm}Wj9t);2d4?io z#`S=>HuhQI${mT5*G2;ByYVYO$}x{sNH#wKzM!~sz6eKz1k3jWc5-+9IkuMXKGLjE%e#esd{$MScLudJw|dfHznwo5CVSyiDIy6CI-Q-eH{m_y?i zA>a#QBZylJ!X}5?yk&jBfUj9p8Y+%1;7;;-qO9R9eV3Y&l8Y4d#G&zw8b{-Jq!GYx}47 zUfSlwQwS}Re?@)u#E(a59qnUSCWQG)St$`C^$W=Q$chK^e!-Gx-t zW=CW*4-^OXW$`_UIVP`Yo;RPEK0#Q6HGWLf;rRp22wqPqiEd8g52k=Gh~3!jY<)Qg z3N(H&UbVbW!n+Y*y36Vy(AjSO$hu5@cvNV1{@xBSeJBp>%Sohy|07$lG~t*Wy~bes zP>YY;^&5#qoDbhzDAoNY1bq1p4ub;0zFxLft6AvM@P2>$;d^bx{LaXPA;tTpL6b!k zj5M9$tBt^bp}2FtG83*Y38mEt6upbF$w2u<-|D*4Z2IJ*IOX`o=;OE8$R`_69M~6a zYW3jI&;#wr&-xEA9b2aigNja@pIfbBI@ObPaqLq+0(?Q;6N!m%$>EcNtE}|13Bsu# z`spTQ)`~}ixJW3=uXHWz8P?t+!b0u>P#oBo)_eetg$Fgu@bkRU$4{_x>lEGS?hSoL zUudCZ@pt7vMy@X?5bVo2OzdrD_Cj&kOpe18IZkz#?OuQ&jhDtwuhYxCv6skNABsEY zE7)A^6TRnEbieib+wExaTThB23?5P>Pj_95FAb8VL6&$>9N5=>oRybGpVtW1Y8~N& z@>43FdhsRCUzSeqGH!ZTamu_w0enGJCbDPii;QCk?zc^G z8$>OJ;ct^0Fazld#esc2S#=${nwk~uqT(jzyAE2?_T7-atmIX%bZ945) zhV2dO$CQG8BF#pMOpTugJk+)w$dBHe7xS+2b}#)sO&2|&C1Ie*lwvTZ$X7XjMEMhM zikjx6?TP8P6FS_5Jx?~v@{K>Wwp3hA6r$8;?Y7+&q|_eUbo~+)ZKCD=ki!*&|Izik zO}~yS0}Jd({s#Rmg6N1bAGg!y);i>icwtK`=_e>hT8A?Evqzjz?a2xGqinsCzg^`J zvsOJ@A~G22Ve_WNVQ+0FhTOSGgJqWwT@*zMu5eRo!sLR#3jm1$#etW|MbZ`Hpjx=l zd$QLF7X~SWKfZ72Vn`nOenc{AnH*sVe9i<8g95=z1ZxbQK)m+AG|Eab;OW@Gm!6#? z^^ElUG^ZRg!t~S`!N7o_I7D1jpMQVFgtqQ`ZR|G1#;PmbOTEK=RPLXGH0$oS(+bOm zo3G(rL3Wixaem_H|I=08j!qPa!M7!7yLK@DwvSZ4(N&cq$`xCUpI2&3iSq+lBe11G z<=&aEUXP!jeH5}Wd7sGS#@|=F6*Qk7n%#hgQ|RtO*Sq%}_+}vtiUa%7b{g;u9hFsh zD{?|ifIBAQ(%VbI#T@RaQkEOaKza2&a!Z2(!M?_#JXX947<}ABmn%ar`q(d3-3aNw z@+8Fr%b=bb2@JaLS{E03d!kfW5Z;o`91BR+L^?wOII)-w2MRWi~S6bSb9hOO4-$jBnRQQD{6e<$wA6HmBXjZOY_3`w86SJ!&J0t1HP z&iOj6@+8t6`YOV{sx2wTLJ%&5kz>JCmPyX|O6aLnN`4s-7>Wb?GQ1Z~y~ZyZtFA5m zU_9U|IaT&>5{g`nYrA>P3tW!1{@;KvsIB;{#51_aF8A<G}N{Vmy2@aJVh2BS_T*|a*`K9opyA!*mLLx*lUryxtgXH$j4hy9N3qJ(${Wp^vLjN|qo|jV;G5Kc1o(pD zz`oiu!;j|tmyXla({m47^3xdQoJ$vHuod2{naEMSPX(GR;4mliLfLJ6Z~29v5Y4jh<}|maO&#~H)>WI7OWYskcZsUx(`lXec>W5N`UcMeFiI#6>}$a7d3GwQ zaMT#x57sTg93zbE{pU=&aozAId?oZ2*G7=*3kn4LYVPM2cx{r&-1}>6tnSgE|BB^L zy2kmSy}35mXh|t6Ct$!(+&N!eZSgRw!MvrwPkh|Q`P8M$i8rG~pfqfk$?x0L*{gyPMcoh1TC{~9n&AT(Jh(uhV?y?~p8l`q*)d4*=;*=cfH|G8= z#`)Nv`)g@DAHf(r%$2q~AIZ`(+$dphmG zQTQz}r%;$$n_DVNW+CG_SGrAbmk`=eDzi^oklE{D+De zSb|r)NK#!)hbB04uF~vn_SHL|#F@7MR|1Ly`+DUi<8xrk#cX&(rH!VKxyGkD2e!96 z$c;ypIFiB1NoNK4g4zepd=+#oB~0y+tgbn%7`cVnr^$7whrQD>V@{~ZyP<%7O%oU; z6bJUjWi7aJ(3Xzjwoz2HFf^@6=AV;P-ODU%M;jZZ`1BdjLJWsNfnZ-ed57ATtc9J` zxPmQqP_AFL;*AuX6ES*_MUK*{rRxw3B z9kOUz{Y^dN&f*yZ3>b<#=PNs?J1p_Cd3cZY-MiPg1m)NkP9&O>U~iw1n`DhNDBug~mUy9^aPT?! z!$vyTbNDy%F1$thf&#(5PTIfigvuW{-@2XmJkSH4jn+9l!spd+#qaTN53Hl5OTcA? z;?DV64VOf*8-JN4z8WxBv*>p5u;g=o@YgPavED0|BrnyG?>$E$X^XfVrloR#FQ~eNTM?5Su1UwrG@SCW-OxJC2BR}0k5;*k zv;oFJdRtpyo0@~;GBAB84(#iuL0h7Uo>94}gwg4&pZw&(%qjV|s`;rG8gAEj^tAu~ z_zwyM`})*8uz15g!$|aoTEav^_jgf;b#FtXtLTS2O0>^qoRQ}#P~16R2}I_fYQ+o9 zg7&4TNxMJ$eN6MHwcLp`qkbJt*)3j-{1pT!4(v2&{`%c1HkE|B8+vru zcWbLlT;oD-Aj)w_%8HVX9yU+q92v?ZUJ_Y;wG{E$+LnWh&uoLtALp?PGgD7b_8b0b zBG-c9v@?9GLyf>=@7w*U?EXeKB8|W6o=0&g?oYGn`#)||{XLu>sz8*^FUG}30_I6t z7W6Z|&kVsS3*sdAr{MH6syl3}CBc=C&YHa^spv>x0%e1>J<3S}yaF~)6k!FoO7{(3 znrFR_z50;g8?(t}l)pihsp&`f@yZr944{J;LcCEhmvAUiGzjx-hNX`F#QJrr|7l;do0>NodjfaYF8soU%f~`AK z_bcZep=Qyt=;Ir7oc!~L2=*#m)LZFLYeu}jY4_pDl7cWRki-dod!{m3_Akn6+9<+7kp0h3bURB(Ur-=;`fKkmr>BuI$bK?nuPL1qh;x0O&D9VfN&9_Q z#6oBNBl55liaY1)mfaegE*qX@5a9!M1z#rL8y{GW%oZ`c%31SD{4j*r0bfuYc)*IZ zaOP|RSGL|qMdnX-uiW|ma6@p2qO?LB{qyuCj^_ldfG>zmHcoW`(HlN!WYTHS)MK`c zlH6Fwg2RoDC+RCLxp&tnpYmom3l{Q0ITQ!>#rxt_=E5)fL>azW#}R>wMB}dp(wX!x zBS&tv8YkCiVj_J(f#B)KkBS*QZQl~dFgSM6&@~f_Jauu%-`omJ;CrU>_@~Pha9N?a zbG{lR5+r1hQts(^H~AO{48?&5{A>HxJKH-g+I)`TVoS8FPlBWUTH^|W;y2>iJVuTUG_!6?V83SdeA1`NfW^QE~dOvBn=_4!+d zjor>YFVmzUVNA`SA*R7jx5j(n_C`QpC=NW}um^Ry=IlWYO4swqeALLI^)wj2u&?)< zYkrXGx{84_{u}WM;Hw*m&W32gKb;M_BNwU(ThY0_OLRk>wrSz-`7N9a?Ub_P!<$=V z@e1<(t=_x?FHEo{8Fe_whs~jgd1saEt>1VZFq(ua-#$A;dg>H+O$brFK~fG^5Y^j& z2hn3e<}YOGe9`s?@kf!_Ei7V}KGZ3zCJHZm;@?A*P=7vSecb`kG?3c7<>~88EscS) z)H9ILB5-2=mLgUmQl9YkCS0*wF5v7)Ggbs~q8XxSpp)XQ&heAU@F1l&tV$?TQgZLo zNOX62?^8ndfjI6{I;prhRytCcFO!hU;% zSD;I`|N8oK~-gk6=~!Kp^z*OMMVi`MXgW)^&>G zIS~*ZD?N00AFL=9f&cWl`~JHT(t73ekm^ipKsOWzPJG?$n2j&!__tKh1=e$K)QXPC zRJhj(4s#lllt*m2ZZ;zm9|{EL5%rd;O*q93Q+haR7fnZ-(UysGga2gC%ePoOvEUq}w?0h7xCZM@SN-DS>8a;sgtQZt` z&X=c2ZEs}d7j)E)k#hZv@GCn$BiagDgPE`R(87+RSdp#dP#oA7&c#`=xo}BVyo8Cz zQ^M7gV&n$FS9vor^X+r}u{rZfdx0AZ#HxOJR%knU9O*!qNZH% z|G2S$>xNloZvGL-Dku)@YqBqcFUb>?R=9U&8Dr|lXM9Fad*=dl{m`j^M#js`ok(9$ zAlO$~+m#X#voMv-O=6R|CD;5P_r$N)UN0lf;-A>Emq(EV1`NfW^OY5EMR(+)hwT-@ zliLu(i~b^>M(7KTr%ce|i6bJT|mXpuKhqXVQ!OBx|Yf}WKZD1vYro3{)%Zaojw;(dVh1qFhA;mRBeOb)Y2cQsS? zkL9Af%lXlTjlaea_R!>28YM&%1O^Pno%7X%ov%Spbb;Jz{F#Jki~)P(Wojm#8r_nM z-OQ77M00sSU?>jkOUbN6K(3LFNbv~{2|+}`v;vbRj!%d5<4^YQTfcF_yNdx|P#a-LFchs34bLeybPk(N1uom#0*_HE-7GR0K-F*7t; zeRct)YO6s`8lNc6;=NSDCV|z9X@38;NwNL-G>4$dR9h*!=@z}N%`IvvqR@xm19B?= zR%{SciAz&OoV0Z&<#UH{lcL*-XuLT3FdDvf%=`K7QzIjM(S3%2A&Pf^XDAMw@f@xR zQYJDtCB8Dpl)#J(N~6QxrM2OFuQE?DXbh|01zxv=!=ONL##f!-&h@^Xt2wzpz`7C2 zedJ8|@y=&A)K8OHEK3&&W#WJVLverO{&RFQ8h|3kJjNKOm5MI^BRS7ms{F=ddLO>N zUKC-~s&Xd>ATSi?Cyx3*PqdkdiXyjU^PY*mHLHv5#om7c_tPM=>=?`Ry&XEpiOzo+ z*r6cv>Ce&4*CotO)Gpp`^Xk=alD09T&YYpku-A=!<@Nj2>sp3)fKftmU|%oUIt~?x zm5-&S#b{ekjuli}T?Vf`=4YAV9FMfre8S>l8sDT$WL)8~XlP ziU+~+MR&v&7P|vNY#$~@0|SQQ&iRt-MJXEiacD+{vqZ)kHj?=2@Qs&4rg>N*F+g+qa0U7EaMMWMeWYJO}jkdJS*En1lF2w_R-%~&>SWmdf|K6BkNVUN>E~|wH1cu_k zx>ho#X(wYuz6f!>t!Ph|wY*w@65DZIf?!=>rvH^ZN53_&ydbyNKg(+pmP6f=?Vd8| zah*o{eV9y`S3gNN^)f0&tgn#~`sa+05l2)tX~Ng^ zm&OwJUKp$=gBP#oBoxuOR1v;4;g+%9N>3gS;=sPtMF*7U4-8&4EKkpi&cHt2&s|ee zH`6gi)xLbc4K3qjv8qVxPr-J_=Gl#`)kCby&**u28A>dt4U+PfL>#fjR^Qx7 z|E*OgC=#&e{iBIlo#bMLFbVF+g2(Di>hc%fv+v)=O3@)cvK3y~ymPGh^h>rgYGE@& zd`olMQhj5`kC?v1~ zmE9@p&TqQQ!4DWveX7+I;luUlo^ii?jB;ggJ&FhZz83^Fp|iZ7WRqfm-3!yo8$^?= zUSCi<==&;zjhFh>JX=@vl#c-ounon5^WOK0AVrTq4(hgg+S4^@XBVPz7K*pec!ir% zXrou|E*T^99ts5Ky}X8`^3t;<-i^%$W!5X>L)|^IsvFzs;WaW;DwC;fq`-ioxN~`r z^-PmP6iu2dZ*sSmw4MEc-q_Dwa=!`B5?}RaB#}8b5EzQ{6Nmjz*~XOGM#6W*^%CS z)J1iwEoGy@!i9F^6Tl#$IIyk@BO@XfKi=gSGjs+9Z;X1&{i!qX>qHf|hc6(@-)na;UEhpEXgl2j!(E%q(xQKigiPyl3Dn5EzOB>sr7IGP$o5N=nB4Og4i)=T^4(>GM`s~Syh(=4pj z52FM|3B`eZy~z*B8A?Y@mw6TcmHStj*@*z{e}0M8QHC zR%wM5Dmr3Hj%nK7-GTH4#esbp?akMVVKj-^@mq{$h`-rOC!TayYQ1bX#F46Si*s#A z81MzPzn*P}sL6&fl+o#cWIjoZ501L8`WGWjstDLL)bbERDS#y7Y>60!M-f2OCMGSeD&oRm_&;gIlL%r zl!u#OQ}fDsyzIiaF*cxK4hF@Y^K~UL*b1wu`h)G=G*R6xJv{48k~~7gyCiry!F~#u z4#=GbiUa$~&=p#CNNF1P6uQ3|V@@`>6?2Vgm~#7F9!@094^I9|$$&4Yo7|bN$8Qb_ z56o&@HO70NyEgg1wnG;~eLUVi=|86cVUXNXOv@9ohMu98u-Q{RPikdDoRVls zcNIu5DDIpu8+O|tDHd=+UNU^b9jY8}=Tj|;%AEq-STlvMR1YgyfWS~3*jJhWmVcWl zFUj2Xm(E@c3NOX{Y!&7neM$PlaNlYUEmfqTO4pSy*M?4HISRGe^ zYV95Tq)#tiTRnay?KS@$E@41ZP-C^kvF&AU+3~jp%}WDOhb{Rvlx~b(ih& z+C%Y`>;HX;$r76s*2QvVSuD9-pA?r_ZrEqY;hqQ!xqy=#b&~3k@yXMcTYt~lAg1#7 zoUO|+t?rd;hPs5j`?uU6Iy1M|4wt!~+}PA!`j(Ny&MFIdhT^~(FEg^TYEnM6TRPJ) zq!4x5!N4kOzH7S8TqQ)Z$(hw|hRk><5S;O1stYw+eDQ^cX7BvcDN<87@U|p3>Pf9z z`HQ)pPQ9c61`NfW%lLyj`<~d&I?rMP_Wp$QwHxV6gO%K_83ETbV)uDCh`fNnP#hvK z;tg>Q9o7pdj&DAp!j3K&8@46MYu7r2Oi_3ZtB;tFa9(n_J@CtO$xWLx)*cVop`eoL zY=`3AeNtrVPGS4?0c~af*Qvp}>%X%ZLU}NlZB92C$5?TIQ9^NGU;1gq{s*7G_q0ZP zyG-!U)ja2F-iD`F-e9UQ@%&R5q|x$Nna#LVV{tmn}}D(Z5(UEg#qj3S2HLt~^cI+2M0#esc2 zbz+vdZD-EAo$si(d{c9)a64*XCuAfd+pDHLm2;Gc1n>p9vi}_1I3`$O@-4E>FZnRP zuCu2OcfKRto>M`<7I-fV^*-D1H^3JZ2ln-x#YXC`!!wDwm? zff+cRa$dlxFdPO2f_~0?+UK}*TWt#bX??az}8AUjGYbWvr4=C=O zFQo!nA&H&7GCO05sW8;xccnv5aMD^zj4sZ}*yk!PYXesTiUa$i$eT!98V=ZGB&xxu zU=PgCHt1;i{@4~PpA7wyE~l601mFu|fBpMyr3jwjbtg-H)}VmO>%`75+nViIs{WwS zfxRTXT5`%gRA7`)9N1T_(`dGBxzVrup73KMtRdawXxgJEkKVY=psnqgFRNA{*B2BB z_N7L_!y{wZuhkin^RDbeWzUxZk5?63a#2c8gzR6S;WGmRhT_iontfSBl056oLGF96 zK6tWCAWvf-^;77Z?kF4oOBsImiGaXR9M~77A_YUG;z=Zx=x9>9UOQXI1gBD1#=2*T zp?i-uXD9j`;0x+5ceWqyqjP+GgDCqtWY=-Y16uWH9r@iu8zPtqBg82Mcf}q7qlDtX zzWVY@J2iLE>8*lSw&!`U30n^P)0gZ0R-JTfb@_$F2E#OB z{x3(>kKwM3HAXr=X0}c|C$eM=k=qs&ch1-A7aF&cJ~lm~md{%G<5xt$5eW>61N*X`+L6ZD5Jfp0i}H?)>=QHd8101Dt6sW}%G=P1ro%f{_0925 z#Wpju-G_3AzoU%F?0I^Nf7^!ZW@gNr;fVEcET!-)Yw~|9HnF{LZXQvn6TCtyR;B(#X5iC9>M+P@&jNzYESb zOwI-5JroDd`{}-U>e}cPNA{lPIcfYSv(H>ICf(nCPQWZIl+yp~PyJt9I1CB|=e=nQ zZgzsQ_{K->pKZ}ODjl_vD<-mf`?0iUon$s9;mCg|pty5+PilHKd9%AU>sdzB7gWc@ z%%^0Nbf-A(S|JyMj%TYHM}aE=#UTR2{;k{KCcaTdJ>@2kT51zKY<|Z!W(F?$C!tpxK7?w=7FT@ZORhitTf;?DWF_WBVSX z?%XZbit5-X27EzrU|-C^$DMbpPbMb%p0fS&uVW9boKMdoEmF-YaEspIyqc~A+*hEM z_L;9#m~xBFrLj4i@UQv(fi1iReb?EqjWgi)81L5;DTML@qlDtXzMkuK+^3V@YH$!d zHN8NnS?$fFq-3j;*{D*7gEGyX`2QcAfC9n3bWb}fg>^X-g5J*CqcUb%sG!9}Czf9u zj1hCbx@}o_1PmC8JLjwT=Xb^e-IFvNNxg)JlOFL)LEg3vri8Ajo}YXhhOu4&fuT6C zFQK0rt5>z&D4{s8FRu9SGreIw7smup^q!|G@&|paXvoUp z=`O%cP`o6>0eo%)@rE`82=>*>Yp?1h{^`31J-n2LUCYUdNC#P-eEn2 z?HUs_OphBmfe?s8|ow)uQ#y-hyBV^wd!b$;~=9jK@* z`ab`7wNqevriWMk1K6aobM(kb2%qzud(3zVU+$7*WWPssThGN|iT@oREEq1F}c8!%uf?wl`y=o)uk zqAl5;LLw2=<}6kY8-MK5?~KZ=Avxa-Gn)#5z)&36mxo(t*bdY2^1WZuVF%xn{M1j; zFL$Q&;3wAVh&iIsT??ps1^-jGea7918_K65h?9I=Z%(<5$dh#XoC| z1^-*OWpXZlMz0X<9=(r6|Hc|+^gF?zg8{!|)K=B6!%JuRe_10gd=HO z^EC#kxFAkM(CG*5131(vJ0}!!`$Y#vj;VNjM`ec%DRSb;vX{*^@&8tB5YzEE%ldgk z9_w(0*k3;_ShY*xk#}pf(;fQ4Z$IX2*Ogzma244b1jT`~p1^=wzvx9iD-KO`WG_n% z8!o>17~(6VwEFS-)>uojw~<*71%k6a==t7AX`PfsuF6E9bwER``1}1j&UxNveC~NZ=RCsSx9jUvtv7^a6*TWwBds#^2n``_8K*3-fqAyqXIz5Qzciol?cSlX*@1z+X?Ck2Ys#Ek#*LbmVY^-_$zQBg| zZ(kgf-SOt)@RFn_2D*OwIcUS!3H4`F!AgC5A*Z8iYZ5{yIiB~`+ah<#JmR6^0w zw<4EjJZ#S*hSNV)MJQg*JtKBV;ADJ(fr!4kQCUm79Kt%nrQ13_c-0=ULF3Ill#?bx z?BDxcEu}p(NaC(8RUD8I~7Rk7$t;25KPy+Y@n_n+IgI`;9gLVHlKO3wi z_lS1@$@anXwH~=ihsM734^FGQpUM?ak|e-5L|@`eZQ0>J=?tEf*V=M2Oz(FTYR*W; zkykAfio5hS=mA+BPzV@^=xah`d9p9ejrmz&YvQ*f3%rZLK`7S=jP_T|c^)MQXX5~m z6^uLOE33}{wCaUfImc@KO)(P#1-3FQBqS$>YM@{+4$)WB#c>L+=1LXi z>!e?d?q)4Hagln7=E1Hg3M$m8uv2JU1$=?5axhaz_<>&m>QM9x$eg*6ibW*K$vgI+ z&h6M5-{qNO1;F2#>NtS3NucA#e#8&zF=3FsUKsBP2v+@+%7iN6r4ff zAbebWZY6^m|LQP$UUDk@0I6;O`~ayz#IFOS*R#<|BbKY6%)O}F1LRFS9^>_0Qr2CWT5Wp zOI4Q3VJ~7T2EXH&;SuAEczwzXQq7)Pd`5A+lh*wK9+UB%Uq&r>9Qb0CeR(rvI8l5K z`nIjrQD!Vs>AHM5rRfIpV%+`7|j%>1473>(G5SpC^j8QNSvG-RIq#AvE z+4F!ZA=&Yc#W!&Vp0Hk~1<2?JW8}O?IboD1y&nuj?ESl#Bi?P#D%<!L(X9Z>}&`uS= zKuH3PW1DeeNKHW#P)haqDe%DUan|{l!B32;D@9+Kv0-`uwcH2c5PdCT$UW*}RM5ji zhQ4=m98#@!^SAaB3k`2>qJF8bw22Rt3k3raeF>jKyE(43sMwWHSV(7E3jCWh}b?8J9CRx0Nrlp@CDXHLV-Yr&*$f# zc(%8CPl7Bk?v$_b)${U#7G`Q0*EIz+Jiqz+853%B=MXm4>~{!(w^ z(^sL09r09Aj+sE2U9%*P$QJ&SH%?$2qOWSYTR{wRX!8*fg4C9`Ur((#%Bg9su*C;k zW;oPTjUE1JJrn{4BKjK4Uyt4+BvTPs8!dFa*>!ipW4F^|b4uB2oLP6Y^zO-_1TgN{ z*I&P8$*j1$eTVQbgp}5(({E_7Np|4m#qwbp{wN-)Wgh*R4fq1%5PkXAtl%v(22Y9Y z%!*IbS0-*^HH;43_tx?E)lvvxk1|aMe1WWTFoFU2r*e1bj4|`dRxXo;zwGc;J8X>* z;j+c=v}}x}npGDlKX-D77K}sm^%Q428q+S1^wZskB`gj1@P>8F%aX58ZXE^VPWhrp7R=8` zH@g>hzx=%Mu&yyiEDX!!YB#&|;HjPam z=h)B3n6Z7N98>6}?+)P6+mA?i^tS)(SM+wfI*~_g(nC=?h3&Jqz?>(+?J4Zpq_G-I zPffW#=g!f;qc?k^%az1_>!BWBGVsr>8W4>ivUF6V&2k>r-0sS+znBYqngoyDK&jLy z_}PRjiI0rd_1XC@c}O&F9fWA!E|U##iVrE0s3eK!bQ*E~os(uV48Q$@%RZEX!VYOJ zYVLy<7dmI^s{^W}N0lshSn?UULw<}$9&f0fzX5+^`Zbpcwy(nFbBW^Vo5lvyVshI2 zx7ivK-zKat^R_0*X#OtrBP#_V-O7#^PY7A!9jRDey74WynVv#E4wl4tm}UBGp`*AO zOnnHxpSO1dorsPw%T{aOrD163P4$n4kHmOZt`75(wcV0Y2Qg-r^5&H=loNC4HLC_v$Flv&N7x?YC}CzLFe~1Khw|1=gp2uPvs& z>MG}mya+#ftSy^9^)yVPrQHj#*`VYSggJe1X=Md`fpLhwmfz6sVIrCRv_y#`oOFJa zvlzZ6v5GrtoZ*hC9I!74gji4r7>MYLxFN-R+$$sP$~S>$twS6cG3k=={*E4(@Y5Lz zi`&+o0~H42PWgJ8lv6BP#1X34qMZB2y$|E-U0;oYVLGN4VI&W&bW-mE1%q*jzFNOG zPm_BV>Ka%+SJ`V{pg@<_io(nC^=MYR%S3bLa`wslH!u#-R}-ogH%%TAGNV7?jKuae6|!-mvc1Vnh|vX@ zr$P?S|4)*Dfr!2++}6H^B`(lNvbf|`XED^fJ%34`*?|MN(}Ktx}8 zy()H19rNgE#um7=qDo8t=D1k9`SuMOqgqAtsCEiKg~7N}zA`ZDDO3s2W^VN*eZ2FI zIrYmevee{V!AHTbxFN)iaaVzY!8k-;(M&Ri(G-s4**trzWEzLs63Qy#-r2(+hnad) z)H&Xt(+7NkEOOkxeL-O9HjXpx=}!}|(K@9y!i2UoJUpjnaCcaihtk?pPB!+zI7DAB zgJIV^v9^199j?@9(0L8MYcP-}bqh8!xt7}zgwq1N;eg+04FV$ia2h4 zV4EXX${G*z^O>Gn>Cx?xXD#Xa0X$YP?v$^CiZ;XQZOz5h>%|v*W~-=g&lnYwxrDwF zzPP?^6+Ju$6b!~8`r2G=bIRB+4~}9Q$TE>4yMF(E6R$kxXX*?;baOKF%w<7%?3R!O zkKK}Ue#LG&I<(fZ$n{O!8YG22JsmbHw@iyV7#;uv|4Pz#il~+2bXc^A7yO z(*F7IlLyN5&*obSMxK|E^M~O`efs)ZO)zyIhy8)H4L5_?VlV%3vYVPP1tG+IGJxoZ z=Ci$bT*NzZ3W_$3*xB9r^@kB{%ImwfjZ!wpuT4RkLwy_!ObeHiC2wneVoN0&GJ$qK zF~QB}m3|+#*4*bA$eMcrP;LssA$I=03$O$!)eZETf*c~s?#r8)hPn={%0la}OB;Vc z9rXzRlnaG`fry=7=-MFWP1wN*rn%xmW*0uYtM!|=S2E<%?9g#u8_3)`d0Pg?o$CDW z3VPfcD~canNpZM8x#nxzIvH)pl#YTFEX|jzdR^`$7y#qo1>^r6ypaXnp|A*dk2WEG z!2cz`FaKG-t5b?v!U&;MHk&HPb%kYMvI6N;yT5(;-imlRR`%#p8_Kf*%JEv0)hX|M z`SrpDDG}yCNq37iz!w;Y=qoaL*Xir_tuKc?`aLf`@|ThC=U^-K%rgdDo=7Uw_dq}K z1qLGevR!X1-(L3F=u%?i*^Ucpf#rVw9*8ePS*c!7M#~(i4pbP7JLSvY1pR>X+sB%1 zHb{$nXIHZM)nTsO324vdP`67QH>=2ig26aMUsv2)hr~8sMRaDTx_pguEkW0J)!dhv z+3u+Px-iMH8|Dl60vXzzzkOxykXJrVXIZ}pVb{P|)uq9wAipqB zOE3=6SNP;-VrHsFr`v83-U1D@JQKeBL{i0pH#hdvu+e9PfpiBb1Pny<#Y2NR^%?p{yBlix64+$mo>tp1H3~v;*xIQ<38bUN;D(pj!Z;zS) zUtkmLZ(mo&JVMzs@^Ws#2pX+Rl<90M2OldvOmRqw%E+u29yr;~1>+EXB{ytj2a20& z$-LQ5VZ%ecFEij)LUS$KAK&$nJF1b;|C1BJKtx}Du$)2MR%tKSy?9GgRC@Ck+)a0v z+>ju`JGF;J4+6@84hF`Z^2I=^QkjP3N%I}sa+G4ff4WBArb~F>i(W)L*VAIUw?LXc z1dK!U)zFR?D(4i;V(K+lh(C&@CT`7u6#3x#$Q`Y+HwNrZS|@2FAgdhAnIHb*sQfGW zB+hwFs#pU91znme=F66nDzW_ZV#M1Clsw_*Pd1>zI7DA&l+_Zh1l%#$?b=KBnRhiv z&S~~$6j?XRZE|Hj;%B%2^H`w}Fc8rfU4zx#a-?&dAD}8PTd%q{<_D}!Zuy|7Y2`R_ zDJBGN0=~ewQ@&W(vbhz#dfT4gNgc9CE_lV)`H6GYoN(Z6)Sw#EU80{r!C)MsFKh!N z3Prz#7kXjQaz)m!dM{}cVoikI*vk3wyzc_~{$nS2@FtoI58fo-{tDjC2_<8ek)nx2 z2@5{NychO#*X#C?a)2_146};NgEtH5e+O@2cMY&mQ~E`<=spzRnccO%r@Z=lmiA~;=IJ;lFHRM)v@{9UcFa> z^(c%Fgr+R@iE5}T<8-K6FBZkkj9{2K>f z_gFEntQ1I_*uw94Pr;iVYN)PdM>6~9&~M&qb$A&zWegAVZvCJmg2)WG^G53#CT~~# z{6tF9d*OxBLtVE|sIR8$HEcvlV~#I!<9-GI?`%1lm$~<{?I=a+0+6pZJ!{&y>J}6fwZOyMqo!l0?lOIlT~>%q}lP}3aR8b8`>Qku_oTU>?DKW)Z#C0 z&j8~xARJ=f$Np(`>wyk&iTKmcacS}Nj8XYYo}I3?6ak;FD9tr<>;dIM!9c{m|Ayk; zG81YPSym3phuqSav8L;|fr>TpjD)I`Owfm4f`Nj;xZ}S6*Go9e*U8>C+L|U(#@?aH zn&&;9CR*8+X+8h)Xr-M0T9)8-pkOc#UaI0tZX``YA;jxk*WpN z5mAb{hbe#KPlc2(G4yCL1;E}K6aoe!y4G81Zd!gDGEs#krfC#%soz83qq4336D{Rd z8;4gSp}=i`5HRl8^n_H&Sr4iQDi9NrjNBR1?7Vsp% zI7HX_Yx{fuMw!sZAN^I1U7rcUxj(LD{duKM z%LbWJWPS%B^Al(>S|M9+t9s?XeK}-rK6p~kC!<~`6*FEFzi-js4>S>sLzK-Vf%8H@SsNGvB1oiO=&IO{1(2?lf?9Y%7sF}Kt$O%VhJTiPLEc0X5?m`myX1_ zUqVZqZBTfm`9^!Szl?exs4y6JO11(0&^3)X3M34Y+H4bIidF8X!auUzViMQ{tM{4o zEkc2U!8kys zWP`2>zeYA)!y%r|((oLTQ&`zrr`jFY_d0V46YrV5z7DG1l*Qu$nh3@r%5I*tA@Qs= z&b%?S9E&3M0<)gXk5l|`B$ijFhHP2g8udgr7>Fo4hvVY+76T2wK_613ak|UmEq@T<+1s5EA+-KD~)-HP z=TVC#-k33LhiZF1{-`DKnUYrS+I8v~-xb;u*>K~?ynWzFJuzvdY#|Qb)4H#UKSyGGwWSMV6$%Qrd z5nm%VTzq$&9XMVI4@!~azNXDz=q)te9%LrZqvwol(zY?CwQ#vAZ{AvCfg*Xl_xQpc z{w~_nmN?kYcqMOlQl`-V;>DQF#Sp&YgQ`2DVP`-4=VuYhrgqXsoq3)%E$nZaNYmhj56zJS#4Hz^O9td3S`^sPvd zWB&gJ3=BjZHI?>Hq{r}tNh_S5#H>6UoX2HX5V$!MOszLJh*o-D=HzA$Fb-ZWd@u2@ z;O7-78^Z&OC39x|igNFU+q7!6c7nkL4tAP1Mmf$+eg)o%L%_Ho8La8uRvGobf8NI(jj5dpU6p| z5*iC@FDG17DupYv&}6!>p14V%{CtPpvX@5M>9y(WBKg`#Dg*3?nW8)*k?&c*ymi>L zsJ2AIHcbXPCm46ib^Q!EX~VuOM#IM*|1mUk7v_*VY6BkalYOKzaZj%`oov8>afq(h z`4|M=6~1DbMhUfToDa~xiWyUbS5{Xjz*nd7UB>+eGB87)3BtKQu4U`~73hLZDZc~V z%9JjX$8C_B1$v)rg(x=dCO1OdDGgXGEkvB&#zF;8ZfpSK5M`^yC2=xk`Dw{t@e6&p z<9LqbqF_s15p!W%^2Y?dt&so6K42iCY|XVWn}j;e%AXAVT{vTY*e)Je?}@T*U*0yK zpI@O(_5oyrai?VCUvg7t|F)#b^V&a{J=n;v6YKdzilBFE5%L9?p8BiXK*3-fqU^;j z{syCsZ#X4nW>mR#w?_Q8Ov~zEpIymo62ASES;#g5WSHSU??E<_G{F7h*;~*TOY%5y6$x9d_m!pE8+W3&Q z@t>!>Ngb>Bs_r5lUq%~?I!d+yhrYHW-H} zTVhF@YgCwu@n;08CFgW+tMUq2I@U+c3g{cg`$3b^%OZg6v%zH%Kz7|f0$tj(mvz`< zc6w51&=~Y%Ug)*J0R)m0 zrBA=&Tz}sS7y;r{MzZD1DKE=}Mq#5-2PJo23ctI!AZufBtNHIZw>RjkS^%cip#G2d z2EKBc_KX(ZUwPl$V^mgMYb@kmW`=#~hsU{~R6q+gEnSrZpCIKP2d$J#n@eHTA>*W3 zWhfHceMf>XOvX7cZo-@iA-a$NRsXrKHI#?^L+WDRWsCN#Wc$kJNhT)K4@p18(B#V< z=TY7wMj@h=5T9U}enHCc<56W8&m5bFrRZ9{u$8A157L9>W;0m8JeC~ndn+{&9qM)= zox}`lcUIF4T*FJTQC?~OWCQ`PYb(DHRp8*=J^tPrZ3z4X^M&fMz#j|OxKSdr>2WcJ zt_aHbtgewhZ?kQPR?3TeFL%71OApeL--}^EnA+pY>-n{2%?{%06(L-?!I*R^G?^)e z=Z%+$#vDn2o&v@pj+x$k3$X_y%%mT9S>I-q3Qq-gEQY_VveJIwsO+JVZFzJuX23wi zG1KbzLcgoDLh2d?dWeD6)yGNt#4gnoo5B6gyB4mhqbDbr!MIanhA+}DQiS2{cM0{^ zuLJ5;N$YqupG9ePqPm5uH{vuT1DP`rFb?ra@O9+jyc{@OR*2^MVlj!_cLlFUzs$Kx z`&}GCP>l2oG1JB$bdYiE2w5!4!2rpu%9>Dc7wzug05ok6zN4 z4?fU#qIpr=7?YQx(P)a!AP6Tr?G_ znUsBvJiKH?HE#m*C%7q0ez>-y3~{$b zh&gO0!Ou1dbho~u_kK6eWpR>Y(+k2OHnF)x0IM~*z{<1j63$&W_96kRmHC_pOAivt z3s+xEn5hDf4hjY$%AQP{z?mWGDcX$6iTrxRHQS&~ez$y8VZh$-bH?P`ZE~PsFz#6P zUxCkeNfO=H*SDVDTMdz)JSQ+`5A}k{Y8AT3(^J0FAQgfD1%q*jPl8KJz%p)~U_6T| z_u9F6+v?_@juNqUVmgv?@qU#7(${YRvd;#u-vVU&|0~J`Srv}I*Ej7@)bZ}4Byw*M zTA9!tLjCcMyP}TaL95~npA>^qQC5H^f^mpVd^U=6F(V@^+M)Ix0iUH+&Ah@hlsXc1 zqS?l3-MfJYz#a$`0tO<=e)-T>UCeYSTe_0)Wvk4>RH17`?;+DN&wE9hERFtfAd>_F z#+@43c}bkO<5%R}uiV-a)#+?Be`4IocOZU`>nf>CscyCC$y*FC4)IAGpe#shLksyE zAq_!8P1zN}-_r4;@6ed&Z1Q8&$+Ys706`5ji-cm$ha~%#U8aHF z3C5k0P3Xd{zKwb0Phu}S#n3Zc%2q+kgLwpi%b1R=2FN}WgmZvw|9^$KA~WzXS6w3a)AYBxrM>v^ z$mrV)Ty*cR+b3T}Qm#MR@1HE`i4Ocb%q1>K8oiiubl=LWba-UA`tx189a}sdN3>#N zub$6q3N62HDTax!V==>M=dd0_z<8K+418m^^>ORMHg+)a`j?8`wlUtKPV<1b=XGgV zh}U8tmU7RXJKkJXn}>f8E}SagJ?MMl?m|p6S|;20Gg!;LJvkek55&QSQnvlxxiIOw z6uOW^RjjgFO#&KmYt6OQeqVN}s2_tD$aAd-b5OPLC=LJIwK&O$LP*DdyECReTUmcc zyybz&u#2y7QRD9zsV zeFo5Nz&ONiGcZlcj&=$4q1VDtHzwo;!Ly9ZJn$F!LD%9%9JW4L{y&`&3`8727d6i< zqQ}q6%~B5=`h5)kAZu1@luL(YEQ%Z{h>edO0aO@_J2ik-?6w5B+_)x~Ny2?D>U-_% zUbG{`&_PWmoUGFed-wAuP%sz=FBpCu(Esnqrl(32iODPW8x9<`XZ$L}*|>l;aCiJ- zbV+%mhM#n<$OI7co(aOaUtbCO74z1ej(O=oI%BLUJX5Rcd_RlqvqwJFJa4yZ(#r~1 zJv*3fN2}s6-wLSvTgXWQ4Fuy5Ro~IRq4rP`SE|&t^cF2tbhCa&E^6+ss-?c4w{(A8 z^y5F}LLp!vqU!NC+1yD!5ic8^A5Ijh(&&6;ZaN<}k-6mU%iVNmEV3J@Fc^1AHM$*+ z@%1Wbf~N#p3_sS@rZLxTN`bZFkKXT_7WQ?B6Zc1s<%D{8*Y(9}B0?we5? zL7bp-K}CDc+5>OYH!|xS#=u;8CJ5*LsFs!bSI7%Gr9{iaLtb($qr6gN=ZMiN0sPn9 z3}ioEyopwTirR=;P|)=@*a6S38H7WW{S_)+`?klhzVHB3Ub!JB(J9Fyak`{wOhFo4+-3yN(yDMFQk+&`Le;WGY)Chbplyws8|Q5vFyJ> z-ra}s-MwPzrb5%PW9=W!^;YB;YRgzQ(`@96tc%MPR)K=SI7Hc!sge%GM>$VIU7#O( zhC>5y$_fri5f-QWTsrzX_*i;N43K>`xFrV2uKP#G3%V#w4Puf&7dHKBjbq$yRI>I` zj5J*k+~}X$X%wSoe0y)?u333Auqg)t;}B(=4$&4vdD;3FVmf7tHDg!5J|aY8bR_i= zXb6A(!(yW>i_y|J*eDjH-JsA+b_m?c0-S(x z$Fl$0?8_zG{#sgg8~th{yRR?O&OX=2c9D{&s8eaqglIReE}vwhf^mqlgOONi-8wx9 z%%>^Fr=BMv^`5hT?*DSU*V1IvQAsA0z#EW#CJ5&M*;4-sdBN88-z&D)-0Yp)L?xMp z;#cDbP-uM)x&Y=4n^s@*b2VyeUGGj3+QB$P*&)0gQltupC|>lOZ9H!UmkAh%H{BtV zfsJYEOgAqc0(s0(2pEVc8?X4MWOtt)@4gAs#kXed^wq1REtLXqJ_}Q5wk2^~1g<=Q zfN`f}i)-FV*{ZeY4<-NhV<5JIxdXG3+dR))=Q6z`k;!ciJfIhWafq^YUw=zi3AXQK z!y8^+(LlM087rG-ZKR=1I<~(Lm6?MFMSl{}&II8cAiM5gA@9}oUpu=pH?W6Z5LoJK zg&OiN@X0Uld7L9@FLjjLgRySEz#y0TJLH|r!qQ8hT5GUKRu}2p__{&2{IxZEhYFwK zog^;${lO*J!3KP17nG`+h98r^?Bcuq5^~Qb3eT5AOXudxal?$~Z&c@OXGv-XxW-tj zk2h__XW+RBH>HfCj88o*SYu8@6m$25~y4In>p5y01b$s}J3;vZCZy0JK z$@Qy}6JKP7>Canx9!MZPp8UywZlDNxg7h*J79dD-6~;PCO#+#$k?&ik3Ui`q2rday z4db~Gfn$_1q_aTyDLr)d{89PuGH>yt5JFyBV7oUtsD)crw-1s_sHq?ZWT*|zH{2NVw#nhQth^}Ubr7;IAZJJrJ79CvhfD!FJK(v z$WdN;u8S-(?MQu8*&9rto8yBNmN9JMdAa+EEs|b$PRPkL2?ipLoHjxFZ)@0Jt|31o zV|y;TQSgnvDC7n%M#QJ8n+79X(N;i(!MIZ+$J-+?O%~>C|4h}Ip*@t&fTp+2e*c{0 zGpVXgw%hGbPfo~!aqxnr{*HBfBkMj)7#o#8>e@T%O&3OCc7G^e!c+u57$SFQEbWi& z0mQmzf^ZIA@Nv5CwbL1#p#AYzQePMI)@*g}QxUBdJ>x~5#n~01?>Z~a7QvX<&VfHJ zqG|w-4va%|oj|~cB$*{>L~YmSvba%>j1ybosLGt|*kB+>8YFTKcykDafPsjve>{xr zHKGkm-zv)!K$BwRL6tSUC!m+#lDn{{ISgL8cU^-vgVAZJ939Ahpz@gz}4EyX9lO?^a1cB$CPYemQ*W zedjiTCW3K@vU_c-a1uFnJWyuuJt8NXtHR_@_((Mpdo&T>Sf8am1-z4lLcl;o+05Gf z1kMRYL7BuX1K#2fWz~}z6~{?$*pr~*o3KiEpTwkK+$q`Wf*M|=zR%e_hj8$_+I`S= z#`jxwQto+B35pjn&V{@Oo&*?&C|h_Qa|esG>g9TYN+s^oN#jdq1ssh!xetqI#q%v> zD$)D^*=K@q4v>u`{@*RXqE>VYITyt*xc>= zFNJWmTT+{W7J_kzuItb?8*v$C<^r3s>tSz(Ll5rBO*2$!6nqh-VkzXUy7Z@9Ct~;4zUOxdL=v&wNep=m5%wNvF|{I!MIbd&uO|4jO3eg$cZL6 z7|YsOxj2z0rQtIo=RTUQt9GiT0SX4=5MA?zhQA%q6TUvmJ#pim*m^Mq4^z`nEHPK; zyL&z)GWItL0oP}Oa1L-f zLT({yg#<^4t+bFOeo4sZ@*JrbKyuGW6kIf9@ zMa6y$0pnqxQL$+t4cJ?1Zj=uO`e@gSiltg3U}2tYGMdX-i^rE*3_k+ z-MYVo;b~h|@j(m4rLcv@CVFzA{0DzNlB0%>O$gbWEBBAYZ!=e8`Fu5a!I<{umXqRn z=5G1(__szQOqrWt(of)f#$%S|VlN`hd3=7-;ANj*QQR+w-Wt(^JdvYY8dsH&yLTM& zg0^Li355ijC78f$W434U+#YS4Z)?{2VuQwr`YPX}l}qLQs^brU{-_7SAr7Eu&#DZ` zwVsVc*Z18{R)wo%{WDMl{@RrLLenv=2RBaMBSOJI!~s;kK5>6;_q^RwS68r8>fW-K z1lKJgM%>uekKGp|^(2ge3WIUKx+6R?g`Rw>kW9##(}{0(zC}9Bcfx1->sI@)6ZtMWE&8(ES!`$$U2iRGy_TfN_XoCjkyQtgc?`l_-&R{BFu`GNLyHB~e2P zPf89uxmHRRghO=Qy^xJIr4;qq9PLsUdNFsLeF`()dk?FI^Y^8jzL?bmDGd-P7>MXP z3D0MO*)YHNu~zUiUtGprBm0F234+_NKW=LlO_=hWoMQpwPPrE3CiPBU#hjhuAW_66 ztdV>pMsM2m94D|B{pq4?rp3w12*x40o}GU5eQ$^$LrB08`zFmd-*%i4Sa>vg$`WlS zWx1$y?g%hho(<-X{BbQ?_pgu_Y(DwDGInaWBt4*6>zGcfvk9w?Oe6FPS9P%CF7;Y8 z<;^veIZ0^%;}B)XP_FM;v)12h)XpZyOjIvf^6cHr3{*SZ5tPlZ-}D0#f}s#F5K*?i z?})`zpuz+*Gh1{sXRYyIaQ8a}@!*_RwG$(WSD_ygmPW&gG1r_(jpE&iTzBrc3B zUow{zmPpkffUg=mg)2AomdUom6DSyrLzJCjNozUa7RxkmkUNI1dy_>X=jp7b(3j0G z<+TEQGRb$}1G3Kq;T#}a3L)hEoxcLQBB)=0kL*`v#wl8cU*%$ONyzx@9#s&zE1`Gm zv$wofHg8R7uK=1j3&J7F{sbMcZCx=4jwm7F&MBZ1x@Tx#R^y)m#lTr8IOJIx2g-$l zfrzrldPTXNtm2&PZ$w7@n6hcj^vv%ci2cN6QfL~jII0Pxe?!2yW7&Vr;vb&67<4u} z2GV6}K95SiPa7NB!Q+v?V-cEB7mX3rd~#L~j6;;YLomQ}%^f|_dFesOk6}#E%fqi2L7HrE-oMcZf}6EOTd6{UZ*bcY<+#yEr zwMe$1OhTp}r29x{@9v}Gxe*`}#m5Y|J`;pFDi z3Ovv(_LccSfl5%W{Pfyu6$3hf9|~$syxb^pcF*5;$iJpM-UR;k6TS&dwK)G43wO8V z?kC5?MqTWXh_LB>EAM9}j2U#ZpQ0=-{@$?dsE40V+my6-EMC5g--=G`tat$ z`qC#)kw8kqHC1YCp5sD462rsc!Xq2-lG}YF zI1Y5d+VXon9K4bgPpOung%c3@#Tiu3Kj z%^r1^lbug6E=We|KY{L2@TH?3Z^Pw;?%QRKCaUAed0lrEcD5_zIxapakS@Fk0Rr7K zK{)p(5$LM_e*@iLGb9~YhrHxUM*^kPpODYjIE?wDV*%k1Ro`8<#rWL)NT|Y_3+b5(QZ7RtBUU*P)Ql9%(3PlQ1{)|B3I-yoo-fD6 z7=QovrYo(umcnyn+oQ%;DWMsh&u@Dby7zKlR{{zK92RS~GSbv1% z@2<`Q6TMOO8e?C#VU+H+cDeyjFc^oZIx)2f$MS{Kr99y%Z5vE+9*%hV0Z3^VvByJO zJW^a~UPfSsJR9U?1aiKR`2M>o@H_MYol<^n_pRMgM-xYW_PpSU&C-V@oGXzP1@~@W zENd&U!W8`UX3h|3A{d7#yVFmAw@h;=MOluHnqf5O!$`X_GlrG|*?r%Adug9ooImA4 zAz&b)Y&Vk^FU{Xyn;6NTmOFpvzKPncdMDA_UVICAhVlo{9t)ttVBD#3eG^-SIgO0i zG3Mz5zDIOvhyI0CiW`g&)U9tVB_9HPihzQ_I7HbSBT6j{1IZYz$Oop9qxgJodLH>B zs7a)Wafb_IGN@hYfb26tI0wk~|5uy~wkrId#J$6&zc&+Z3sWA>d&jg6m^RUG@pmIh zK782g^9^6@-Z0QaFb+|+HP)+(BHTB>p@?VU)9=iOJ5He2^t)r|w<>&6|G_lTaUvTG zM3kMUP)JoZf2XjE-Ibrnr*|P=aj35fD`BKNAN~os#m;r0!eHDf*(Fo54j$h)FM1ea z6w=8&S|d_q*xSM+4M*WakIxXHB>)Nr;}B)r+hcN%AQjAst&FL6-?-VDSKWGuNwe{p zV#iJr-#6H> zIK~b$dsu~nM1UsxgK&tlr*0_fDUUnhFPfruh84>CeVH9R|BtZ}g z1|rI?T2c`{nkKC^deR?>)-p4pt1%FiL$1;m?!c>gNd$%# zg5N#c5`4bvVqNlG?QLO|w=P~sTK8#woaAYPafq_%wyqhIS?ShBo$sN5;9U)3>Zaqq zKjiU4`~ub8sSRnXyMXMoL94rfZ2x}+y2fh5P9 z2>kZg#m9}CjZT@@H$(*3o~#>~P6P`+^O;P$R$b%hR@ev&FhS9!VD^Llk_ zG;>oLeggvW2Uw1uT;4`S^VrLau&G<{4>sLm#3rE&_W7Q-vLnlAnWN9I%3xoNNyr*> zNdfaaiFqgcMI}s_vn~9JS;ZdsVYMfY4YaX_gRd8fjLvAih#XYr%hNrlazw0qxx-U!Aa4xe2p z{^gHpw9maR5Bvynsx#Mnet4aF5jQ0+`odEAH&pRI6c)Lgl_n0855Q8K}5&f?9hxSi;t?|B|ZNf3&= z<+n91Q(WBz3I^j4E8MCt`%&iMR7~NW<}9jfPH*B{Et~SH&6`^^lBsH>>FmmZfcH!g z&izRPx?1<&fcJM0bRV=Y{`%NcIx=71)&(6*dr`)OY=z;&@x~a12fUj^6|NtECkF)s5g%PPGyf6I zji+PpP_a}#aX~sD8UelPj9wDsq_rn^%YbpmuK$`UgVWI$>b%_DC$W+oUbEX> zxpGuK(mcaVqC3+$UCP7e3)C2lL#(hC^3$^7if78-DXKZwi-t$#Vn(V&8`k+T%QrR) zeoCX>1E$KeLDYLd%9qr?B3_UwCGq#b*1Wf;_cMRLIM9`1%S3M{yG`WkdF{~w=M1TY z!qJTOlSB|O4pBBq=wo^=vDqHZm-yt2pJj%fICikt8JjI2s(sf)L+;G}d2~<+7>M}n zswrN*;p#LlG-h-$2zi@I<2gsc-iXQb%#iu+@P)KtX21y;cP#s_4WL}!ca1C=92cx- z!e_3E#fx1%hw{L9@sj+itG5KD9RE9@U@#7`!XDSL=h7Ro%!APZ@4j z28z-*mtT0C{4@mP5M_TY_ZAPbHf)){8X$U*M#=sLU6hYmxU%o7nyA|?CJu%Z*7JFh&$MU&}XO?T~!QOfy|3y(gw)V`j%IUEZ(0pm`|o}4WlFPTkG>$;M> zmsdvpK#7C${J{;=jBIpF-h>spPM}~g4za>v3JFO4Y6tHvUprza7LPn7v`|4iR0&0O zMoJR6AhVJs4ahzdgmZvwseeVhU<>`r(l{!V|PGp0Dh|g{r z+UT0w^mbx-kPNwGrdRG-XIt#F)pR_oMsN7q7Rkx_0LGn?jaSQmPbhqxfJH2ba=_^u zLtsK(mJ>ll@1{5D#rv<9POf?f;}9$SNi4gIIIH6_cJwY?h>ik|TF)XWUUz)FHS-k? zDjAHSlNWSnf^ZIyUH7ku_cr&ht=(>~LZbO6;eE^R38U{W_jE0yIoIfOXF29|=xk|W zD02NB@vdgZzF>NlO6iI8-Gk=!n&x>!rxLlK*U4ryijMrtimEUOFMMkkjEb{>&_Kdf zXa+8FR=J*|Bp=yT6l>i0Qj|Fg!H6fw+wZltm>r2D&@f&5o_iVcz;mHmR!{xQf&K~mTtP73lBqG(iloTUWbMQvI z`e8_`bn-BIMy#tadrJrjWWv#G`KR)Il8|>kG}EOWDLy$jpSvie$Q$0U2+GuAE&N?( zjT1a^7p=x}_t17P+Udr<4Mn4em<#BH1{HIHY%{x!*B)ytDjmnVV9ohGaK@5Gv+C3c z7@D!-du((QGuLH_3FW`PvDQFK;#HNxdZ|t_Cuma3GKJ8I1q+|hJbOW2F@}Ce@H260R3zJV7L4_%8X7!TE6ri456d;v_tvlJtry5VBB%R|39Qg zKAAo=eOUutOrJH5&RJ2Et?JHYxha^jxMSAQh_xh>CT{@8d z2n)!9C#+nI;t?XIb&yHLi2BLh=Y35xmnCww-5YcLMcHI4I@DTQA& z^`;V=5X$AK?dAK41GPTO2a!BNf=($;|3AJB1|qs%qqw|Be4k5jl3Tg9D*S4nIy+Z8 zU-fwko-_=<2g$SXK!w4$Q?7&KnqR8IwgrR|w77Nl=XA&)W3%b!`!1_;x^xQZCY*F4 zFb>gmP-4M>_1Zat#M^v;tLiC`R}>oRvpNKx!9YaUbn2ukALQKBj;u(TU6-QFmNeDM z9-}H+$K)&=4c4s!1w+8NQ?7?7D96u9Kh*geuQVq|lg@pK#q->x&ZUB|LVKQp^?Pni}AuQ6mMXu{NP7i)W*3av|`BLYR{Bhg9pb0!Gq0M|$o|Jd&X zTNGf<7vLunp=vBN&J%NvrF71m=ux1JDJC{)p7M3`}_%P^kgJl_N15M_IP&Pc4d z|K%}tgskhO#1GZplU0LBg5_w2+bj8<6@4qf_=AFhh_dqGMFhVwH1Bpi@-4;BKb^L(ksMJQU+-axXA5RS%O9>89-I_9$%CZ^;ZDg; z4@A~=VTx6~tebw{(&7?t?D}UtL)rI3W#hwMI_J27M+fx+0TE@#Ofsfavi7Iwokw+T zW#jUlSG=!87Q!#i*juq9_eTEYs0|o*O13G^?&J-}9Jl3_XRPHHU{^?-N$EXoSsv2C z>U-X81p{X&Az&P$>;=|5NV7BJGu8K)TZAYr7 zfNUhU|Bme6iMvkXze3&qTXZAuDJ@DjX3N7&aJJ6v4tDYBJ$qK_l1Pl+emLRscc?3T z(+2DON8_KLjG5`wWwJ_+>ZScJ-0jmV6@W8 zajB|McnG`EFe%x58@Jko{PW_vGtvZ$@P$pCcO9Zc74NR3bABQ^F4cGyUMih{-)DkH zxtI}O?v-A`?#_%KJQAOs{nQ%#S)cTyrqP$*(JtNS*)4+gyo7J|(X0vI=WiK;&OLp# zuHkjp-gDP;?|Oeabi+k98k&@@5A<;`4sq;sW*vo0Q-ly01TDV_jiA>FJdfoseU#w+ zph{pNH5`WYr(F0ePY@7s?2vB}&SoUd?6g+bFS#VN^+S>CmGtII=U=O+QRus@CIJ-& ztXZIh`E=ZSz znL5&tKx?JYZ%gm1S;9X~er0YDTEg~!2~f)~#Z zt6upVx;Fo_aEaZ3%d4Xk7pZL3;`(M({P;#d~*$)VG$bTiRZF`Px! zn@xZUgK?)^wLA)JzuKywHEY|4$OlfX535GWs$Pk`*w6#=^H~Qix(J&D4Q>AYj-Z^=1rkK zv;4qt^rol7g&G(H^9SE_yL?|U>D8Uc1_Kdg7yLBlxl(biwS5bP^Q!gKrSB$9D8_^7 z84O$T?bN-JC#ij4+$q`9j?PcM^=(^>N{|h{85Us=h?2T`NH!LE;CrsoKKBPE(2Kx0 zMA-{Q>I6C}^D%VG;(6H9NPJzV_g16RXCWbOk7R9qbI0wj<`d7FMwk-UX zJ>9&clDL;}B(k$-%*F5Nv&mhNH`P z#5|~yGOBwOiM^frVPUleK`)m1iEJ{G3CrLl|KsZF%@#3z^Sgm~>X5kex_T~`e z-DX}r^AF!@IjV!A&6SZ9fky`g0}*AhoYH{_+#QHvUs$=a)8=WXak3i%#v#hi zc#88F?a_We{f}-{6N1Z1<)Y&oLQzuOcsBT@gxb=s#enRyLDynHw$y*a-7-@p?EA<{ z$TNzxX4B#2tslNnx+8x&&$-C^c1mh_qFIx?{TA*^mUn?L^s19 zB0F0+u`v(w*4|qv%`&FbWt z8>c*gj{O9LLmV)Vl90cLd>~%ZUbE-=vK-caU@99_?WY~LMfvU(P%abw@U zs~C&lY3MS|JF7F*BNlye=Ura$-+%T$!p<_RimeO4q;!|`0Yo~bLpmj-K|o4cx}>{H zR5&212+|-8iqfD+N-0Pq0@8vY^_`0jpZ9Pd=l}bxvuEBN>#W(cr{&YET$PNP_gx?` z7}sXTsx*7ikvrHHUtz=g}P<@7WF5>NdToOpwZvBNyeNIp41f z#=*OGMZP{&g#47MLCuw-h<8SIImEDjtHA^}{|U2>rSzMDF<^51D+uF&ja~@X{#^@z zZB-$s`TLXtZJ~gDVF1rJmX1oKhAz|{?UuK4m!-SHG#`zbBdU}?He0Oc=K01CFb>`| zHaVsTX9$%XW7G@7LwcT+FJ)9StBxj0`dGKcU-8oeNBsmsz(9D{uf1&bl`GNtZbZwS ze0^`SId!*~OIjs~lngOn5+d*B40KK~?t*KQmLv5gHH)pRoH+2ikq*wh!}OcJf-nDgB%(a;hO>z`X-w2&Y_+Mit-V#8&O%q??zx?87RIn`kDj58scyaUFDci~tKncAylgK) zCOt0OKF?+=K3un-$H(Gz<5*5JkEq5Kh^1h;5U_u?=)g7r1WI zFMd56NGz{vh92;%_R zLH|y1q5o8Lp`ouRAazd-F;o#%A~QREubs%rC)_N}9<(MF!u+IB&sH$+jWWZyanPgR z`)9HXnZ&3yR-4PZwR^d7DzmPl5run7$xXU!8FG(>t9aZ1DryWX>w;2S=}6QNjrr2= zeH}bIM}-7KN}BpFSDw*05jx`s&BYh;^y8g;`&CxO!oEZZu_TVbrK)nY%f6CDp+hU7 zrFhTn__&RJ^%7|s664BY;ICpWo(U{5#zf~V4bPW>PA_$II7dWK%tUN&w#al%rB}au z9hWc(f%3>u>p|X41WTwBr{wm(EQ$`PAX?JadYVbN`d*GJ>YL6q=9G(l!5xo5R$CboL%doyosSx*!(=HA9DGyA}F-1BWW7_wcBT ziDxwrjpDs@80Q;vUv?y=vG*n-Tm!lc7zaOip58NqQaD7X_G7X(k{;Z%kct{}-YoV` zoOSLuzs6PB_d9MN1Pp{9JXWzb@wMMZV+%JHV(+AKvxsh}r(&SUWNsfzSLLV2$^i`q z<1P%Iq-&(}LYH3(GuU{(+}|psI6%j{2dSWFeJ|v&o_zmXA`lpig9S$VGu^%B$b7Zs zL(x_j749oZdhsc>hf{gkh?noP8|#+@Ntqju1L^KxK^XVXAJ4N>b}y#8puO>IqMTgy z7zww-*)D%f&vmWk`;F0*1+Mu=j{-@ZJy1K*lJ zZM5V-gTc59uDjwV^wK8Hh4Aj14Oh(UbUedObwcL7Yb=zYRGE>P@c;-6#=*PJie@W| zSaT%*>AJYR_4!p~>!%-{RkUp5gf$_bu%t7b&v$wK6@+oWUCT;dOm{ESg3Kq-mSos7 z?Q%cG=TBcx7v3wT+rrz>&)k2ef+bg}veUB6OzLpBeEzXKFb-b!B^|RU+i-E6lLz^Ydc_jF$9c* zmwkQlegC(Ux&Dy651l|VbCr5;xe$xkBi(fBE&vhsOtKwfl7zfC1{;zx&Y*{!P z*)9mJNjHU93g@Hzj@u38S3l);W$=iJBrY;N+z6Ahu?FrP7zZ!=s!-rh33nXHos&s?@pe3sII2;n2*HT)3?r@T#R<*q0|_Fq952gsKEuY4D5VLy{i zM@Mr9fk~&fu&vI6!vuf8@J$v3CEwp0;Ax zK^Ic1fJcjkk-OAvM9M#D9QNS3AMb0E86}BZcc}kNbwiyD$H%jmCmRy0jW#K)`}5GV zy}P(ag^W{Yvm{R~qkg@fmf($X73y>s_Ier^52ba09X*y*Hh6?r6cvSIvzw6oiqp?K z63IAqK1RI1@kVu%BAnO(r0UqKTcVd*g? zBfGWEuxwh*L@UXofPwJKn-SXyE`bW=WY;Y+9q@7>v6xh;HC#P0WRC zd3tdVPO)TulWP^G79v7qeu5x#V2H1|TA!&Bg;VdtK zDE4J~1G}BiXi}#t&RW+I`Sf)SefzVhfLjN~!MmRFy;OO(j)x!p)zkY{v+=Nom0+M$F)YDQV*h+ zRX=lvn(i{E*T``dWM@4e)<{*`#WxR;IDa(@jDwf`!zgZ+pXIr^>T9!Z5fPyj&QlkH z6Fh%pixT8C?B*wclRyX<2rpYL-zcwq^qWlgvmdxC*3W!9Z(D7T3iT;);I{rWbL~Ih zI1k2MkX>kt`IsoHA#T*->de!2qh34F7svfv+`WyaU;Kaf+$ z7$%;5#puy;t{n6XnyP$or9)5ik+5_=;`#Aoe+6M2AR9sAKT3a~tHM8La17TY(g@Vi z)!Shz?`_y$_i8+~!EIiVV_9pdYX0hv#0gv?7zZz#*?i@eS4y9ThNY9mD>>ApW=87g zS&zv-(5Z&<1`QVi4+{bzU?9BgF+|0cMm=w0jSLc>q_{S`nUs19%4Hq}{~3oH3dd%P zK!d@!3$j(36|9WIn=f}#Bu#K0vW7HxJe9mHH9PO`?b4L{^X~bpj$jz}w>8~J+17rvNSKbS@u%C@=g4||n4td!| zZ7a7pS3>1|e4L&CKh7WO*?sg&L40|ktOm#t+mTz-%2O3f0f7lGQYZPB4?EYhdx zv`bducNsoNjmQ0V5(ohU;bkjHM)j2#)qUlRh!AAIGL*pfDZ9?wdutobfIOeFs;~!; z4aQxNO^5txQ-xM=O=9)9gQmXKqCUjrlk)*)u~XYKDK5&5^A~Z!IC$ANoc&1}KR>03 zXgw+pElqC4%uXd3;@7JV4pDj%D1A-vGBAz*6@+nsYy{7LkL#^WMWAmR$kGOBh3#>z`Z5c{Zn`?E5Pm z>r*Jh^JzZG*~&pxePJbDP)gF68dl=na2Uv$323hk{g9p2vncD&SM*l) zUPbb+GAlJJtjtR4Mz{1Rw9r!fsgRDt*G=uNFf*S%dHv4?VPg#eDt+3&&uze!9f zrP)HIo(o?Ax+53|KYj#{zpzN5eGr#BAe6lkHPS{R5t}+*y^Lo=6>301m+E&ue!xKZ z@w0DTIajl^>`*~)*@r;**_XP`ZBb&enX8De^`IF_7F9rl!8lmlpnvV&RYbSMDjCwi z4^klJAXEsNC{Li)H)iU6M* zr6n9}&h{^5M7z^0r5=rE11axcK^O;X@vq&x7gJu)UU}x4$EQX}B^RxUw<)PQ-r>gG z+KuO9A8PXS5bH6jxtmJ6fhz>#;9c)5r=i|8`E;cOqd+x#xLxJ#V4jXt?#K%LU9RZw z6hu+yuE9Wf*PlYk2_x@tD#+x{3GwtP=z7jIQ%G2eC6%w4vTag)WC9ut#$9lYa5MSJ z@W^_1*CmOu{F`s?Mumq(eqauD$`nhXJ#8RH0Rn?@@UBHrPan}ZPco1OkI`@Um?-k5fF82?s~1S4OpT z&F(#F8{?MhP97Qgh!(&nZAZTX$o?w`;{e%`|CREBEe&TQdwLeP8zsDOmH6Ar#DKCd@W69myt5+er^T(E{Gm{S!-j* zeFYi+9XAjH2Exm}gtiiYZ)~k9#FBWEjX8lFo%1-J^W`K|IQ2%OCeHX6&|om`g6t}? zZk!Sq{IZuha;94Hp(R$a$TXA85$`?BR_`cDDd+-$!8mx?Vg1U5M!BPt3aecHE`EeK zAs9R-0@7O5u_^W3Kc!u;wE@|G1z{W@yZJv-UeLvzN97VpU?wgl)oLe(h_MV5hp4uO zemYU9RXVpx*Fv8p^pi5q`H~IB!OQL%%puFU5AmzbjjQT-GwaZ1nErer4{oX0(%%}3sc_HU@F2D&GcR_Z*{BYr( zRdNj-zod?NX@1FdKLMYX#cMjF+gt%+LWU3^Fc=3f8|tlmkIB#*lR2ziJrBcUWR>4C zP*UwHk#=mQx|8%e{wW~)uON&AWJ~^6%9|PWPpOv#jV{B~9&)^zS#7*4EIZCKXOJ=y zRh>#zlOXj_8mIlwls9B>PO@auyS)AF2eQ!+?WdhvrlyYGKU(c5IAss<^)r8!dUK$# zQm<4x(tQXR59Nu4m3n7md}QyoZ_7I2O_wGPlpuO8@ekI<=e)Oqae<>IhOsd@6ps~vY|pkH9DLB z%SytXUmJQsFXx{cLGRqi(=nqys80*Foei_WD=!w@DvHsZ+R4waX{+tXjDVg4#=(!F zE843_aUwB(k`r16c9z~(_Aox)*jN?PqI{&*bQB@uem;i4K=?6)lC!FTKtS65@JHC- zdyc`hO$WXt4`XQXxNRwlqC?3J&|om`!WiP897jpgW*fd^PaAHPYxrp4?yK9EMdnp} zZf|nYhuDV$fx);?Y5aesy|V8z_LdT3Kbg5iy$>bfiBSvcN-XqAE6t^0`9LRiL=_CA zy?+H^-0$r{GC}{5_JVcDv&Av&S(9m!9zMQOupcCP$7f5vtyNl#rs%PQEkVYP^~U+j z17IAyYwAPg2i?0`EKOzn>V%Ur+v^#^d8d2#KMO4t9VAX?=bgI-1L0lc+|eO}-@lGJ1`8foikFYagh}eI_k~$K6+x##-@DM5W0oVuAVc zuON&Awt^w>{kuf)&xT&wzt1SuXRh_yUdXpd1>9ZOV$DX{qKUY?zj92WAQ_?ZqFmzX z4bAhs0*r%qJrrz_6K%kr>)tAo_*igtG2FJMktFNYSVNykgRG=h&beza5Z<-Y4aqdB z6xLRrN&M;45+NggC;o|Xr^&0O<`bC>*{V=L2^e?5bw!onN@60d<|pMAaST!O${%PG z^3VCM#+DdkS|{FL1-6?*z&Lo<0pFAP#*c%nKZp8r-%IV{-jha9jDKalL>kwlCH$*MVwOu@TJz$0sO8}-76(#ax*LdL#a|E& z+`DNI4qkRolT+>k3mYDTTO}UCbGE8(i{Y!C317sr@UKrSyX+hR?XmBX(|E#cc*HP`r3&b}u=`GV;o!qV+bSmlHh0f^~#q0fq zr04IJfpPG%?Trc*^urm@be=4+y0uC6jZp7iTEFS~qGrX`$h7pW_PJ~@5MFk#dx?<$ z@_Nstl;1$65vNDrS98w_)W|hWbnnJ5{XK#}?*!v6$fhyUulCXDF}-a_WAFgaO!J5A zRsGwX*^ir;P&I}FhJbYk0>;71rm1sv=sT$Osk1FWZmbEl^}n9=>aYT+nc^iqh$SP*OCBZyaa?ke%B*q>d&i!Z#3YE1@$Qq+hh5{v zeZK-uwZj5NNXSMm-5;tdY0Xi4eVN1ZkSyi#qbos8qO|J_@^@KGeifN#m?;P$Pf?aM zA}={N7HWS}KqH{~&Ofv_;3QH$J{EQT9Tt*S;;%goAQuCDfd+fU^88R@D!ZNc&r@w+o0vfZbXUFb;m)Xw=vRyfa~2*j_V6O?7{7_9T6_r@^ol zy(%@#OpidF=zQFOf$-x7?Y@Qi<7;E673D!6=@|BN0_~L;<_n2U7rIMcI$zq;2gVH; zcVXPTDt}F*G8)cbc|$eVsPF0)$v`us8447AYjfdt+9*FF5EzVu1xEaHPs2+=-J9ZE zQ4e=GYq5laUusmm*Au3TQ%sFhOG%=W;xiZqGTpy|Fz)xpAerX>$aKMaT5ApuoznQH$Ug;{$!$k?qk$(kY9Iy#Y@?xfY8FW%PlijqQ-;p$` zl@_#+&8olNU^U#6F#5gSGMz_;71u6wOzL=sSDOxTns*7({ngCUO& zy%SkYAbkF#ZBj{<-0xc#2mu4(WxMv%@wIjpwV!CdKQX$6=`>0q9TQj~%dmzNau@d3 z>AW-t#$AxzRNKntlh_qsjf)~YTy!l_j+A_Xf4uhzwGh8m^aGmnO~POtyzFGAi6zG& zhZvM%UVASr=-!l1om1AcoH%ZihG1RkkRug9_Fq952gq*zuT&RoSvZsZg|@A7ln}Q_ zof~(4{ad!W;?o|cp<}7=4c7j3+W5z5Kz|0~;AOuvBRR?Q1`MIF7ShGd7oEP1} zxC^o)o~F6?KrBZ5x%XfWBycC3}$ z)kTDjFy&(@{5z+&5I?)s_ZTUjzo-bt!OQMneWUg0&9>a&%^&zDyB=66R&hz#oX9`4 zKaVTtd3FGs`T`+fAiV5h_tkqpi@OgWD&o&7Jg$9bf;?m=*KZb=E%wy&LOm$xbo}gSQ`jYN)N{!^IrbmFpbZPLeVuH(haZg0t zyJx6Sn*vy>3rgV+!ctvn-|oYiE}H-;M0DPqlZndjhE}O8*8DD>r zUT#V5t|L#ub@Fguyof1nU}le!O)aPsrYFiStFw$N_WVR zN2=v*@>?61iu60qf}Z>nG+m-P=q7!~s&-_EoWf~I#hd-H`mSJ=3Mv{3zMxZ&{$F)n zuucLDGl^QFb;m`=x)oZjya3> zNKv7wekM_t6_a+EuM6)ac;TroUgCT0()m0I2Eq@Whdz&M^9JufQ29aD&(7YIz96cg zxJ>Mb)WYj@<#c}dykG^!T^Kq<_IgH4x`Y_4OlqyWN;nBcX6WI;nhUo$Ox+9wOIxjg zI|0VQ0;B(#?QZBZ2}H@aJ45nZ-$e7(9&+DGh{k2iCF6cC=$j(NHtz&vyMF~?94zp! z9lS~xckqIANT|yJY`1o^P_i<_NA^Qyh;CzOyYK#ZBtMpQ3fVew2VumAShQT=3c)yd z*WTUu;m*8NHB7x9t&?tS$k0m0o$$#Qs`wbwe-CKnW;}Nd2Ewio<T5Hv67kKe)ik+qWp$yST zwtalMg4Fg6fpV;P5pUp5fN}7ynKS6F+K*qI7vM8!`}}w`JI(CzUFXqho$GWVNzbMG zHu`{R@~%m>d0!}z3j-_ zkPWy*Fb-a}@a2>vU&sA9b?E6vf#AC~^fyPs8-)>_QCZ}(Nd%T7=d!^-c-g%TL>bg7 zOKIr>3K=o9b@=Y}wwCA;UFz$lv*v*2%gRLosZIoQYedl>SN-=y@ zKZKQqkeLtrft<9!aRU%A4qojPgE{&_kl;1I3(ka;!rj&xN_j^##jhnumw1-i(L*3&$5i0M!U zARCN>myL%VL6?=W{A^0*T~-95RfcCt^&*1grvQhwR?3aeNUd|(U?9BgxyeZk)1>Ef z0u*oiSGcvb%9k== zWd9X}ae(Zg|HyV}K^Ar>Vl(WW)W$S{kG2$98}2m^N7;IjjQwVpU%8I9om6LfS+13v z9{`sK#=*;0_!x5u=^6E!sAf_hfuh>}_)E?hRq;^?3%X<4*y#n}Jn}#Y7zi&r?lmP| z>B0gI=?}<@B$`AXyRw3BPBIa%5Vv1eWuj65-(rM-aTjD82L@>H*xsxq?aD zc%d*Q`Mf3m#W2ds#%=#K;7)*X@Uq=|D)OB-SEvXE7+Xc9)b31%_J1l*`kH)4Ejzrefko{K>#sRVsy#771&vx+E*Zh<1;z~}xwjzS|*vLq!cp+{}?2G#Q6RK+OlW9o5 z!+qEC<8Yy3*;?)hq~0kvRzQ>jpZe3 zNML>cc+G@V%er53PR22X%hUMkW(5q5jR&e%mKmkZ-a@w?QtQz+C`&eTd~Lj?c$HlD zNg)}kWb0tz(7Y=0HJXR5`;Kl9km`D6Zc9RnY~x3aASO?7-c; zclyZ@`ln*{GGUMm=;JwIj6$+OWo5@FOhH$i90c2eZUV-^515CglOb+9o&|M}Y)V#4 zKRyen-)0(Gb?1PdTA@i0mjzi)hTa^w|0STa!Ov49m7 zr4omC+vWU-0Wj{@Hl05XsH&*tab-%j>kQtfy4&2Atv-Y^-9ew|^?fFB_T=-i;4*M0 zz&Q9j!Ggap8Qh{sc!fm33=xTWI01rbRA!p-{${J0_ZAz8Xi$(LqD#&K5(K0_8Jwjq z+gUIvC^KtjH_~e&$)yZ?)RS#H zZcM&ZJbxw)#$E8WhKgqJgKc_2NJtfN8#h35c`FO2YwF<>$fGDbdsJ^+z!w+?e-Q}=ItAp8(%`sm9Ba9hE+ z3%k?uTk=y$9~P`Q@Q~70-IaUe03=Xp0IgY)m&$;O&*zObD|4%X#04b z)m=)k^B$MqTN$90U>tlab2=slo}FB|le;lob;y_RLfFELwI@lbr=}>k!~P%x=iC<< z2=B{u524JMKwo;_itppM+1M+(M&UiJ_@4NYrl{J-%5nohgTc59zJlMX#7qc`QVFnf zrN$EF$w{@<6p%NO`T9`fxk=oR=?4OXaqxGdG>H;x7xfD|N7--`o~K12~+r5V+!yMpKLX2m2Bf-Yq`M1_ABXeAg2 z-%3YLgF~+uhh;=;bzPbEUgCqDqjfK&d_Es$IhJ3wixE2a1qQYDLesE&I zgYdiW2k2x z#??BXwto)R68?ynNgw-V#p@vAd5Xq~4pD=PW{5MlP}ROAqs$xmXMg5wekki)Zo|!1 zSUjPLR2bYtWO40{7L~T_iIKkYzRXoJP@)c4&IU?pJb}G+rS)S0f43<8bfux>rUlAt z0na%u*Ysf)6-Y$4n>3AjH&jELLJwm4DvYK7vr-SY(H>E?T7<g)3T+>wyxC!v5~eHxt`gnXe6edfHsYLG_Jf z=|&npGM$L{6H==y3CxSY-x3HI2k(4-GWR)-4U?RPA=Kvid@(x5+I>yD?!?9}a(cnH z!(l4ty&nvO@BNk!MGiea1d1eSB=&Qya*q8}8l8RZ?5%A-LC{;SS$ zsMXi=uW5EOJIWjQQ%$q5B(EKPa#3B`>7054 z_IML-_xiV~1)_dKl9kqquZnT{5E&$`;eesEgVIx?`%6yT?7%pMelbSWE zY=5PW#HF5Jayxtfn^)GO@AhVf zH6Hmq8vvPPp<839B!Tw(>Z2rGKipl(_K3DU)6`eryk4#{eST4$aPzy^pR&KZW;|6rj>O7<0}vX2EzL~S>+_s!@F6Th;liB z*MR25t6TR7wl0}bf3pe1ntO46h#>@wyWs0?s`vHsQKM=Wh55a5A{n9M)=iAVzlqRgqH5JvE4rZHw&`T z>7Qk9Kf>%8MT~2`WUUi!bYGz&eEdGLaeR&IW)9zb$I3@i=YQtGICx)V`LL(X-Ny0NNAYAz0U=V3#$)cv>PFTNqfjWrNAYWT0TbN_z3 ze&Z+Xq4DHPbE~>{y21uXQ}lf)U8>xH8CLPOAz6_!JtqysI!MciDii4TJYv!4)z3M`uMNiln_!_vRCv&py4Z3xX~VUw^{sd^Xko3 zQ+F*dd*Wvn_l_&Bus!QnDwywaw_nDW-ZQ>#|a+_DPdkXvdM#KQ=ttamv;a$1B z$iWkne*OqgAB2PN{UKWi^dvMl6@Px4&F?UXhM-|@bPot!f8?=1GFjvkeZIB^f`Rb8 zUxyac5-}66nlgXV-2XbS%=X9CA=-_xrDQf4)FU=5c1^C9WY+&VSl$+ULn^&9*Jq_N$Q?+A9> zL<~v1*cLp>xva;pfouS*SDnpP4z>e6Yk{gm60H)VNh=5p4@T=cb|cctsWMuNQY}Z$ z-<1U8;C+c>E9@olWH(;HOOqhx^t7;ueunrYOHa7=XX0zG`${&yuRah02EzN|b5`FO zo=Vo47qVYc-w8+NIrW+*I2K8cd%5d{@+oE;7n(ir$o zC14p4{4Sa4QhGHbR(_9_bE5A;juMgINnQVT;khp`5Z;#|Y8}00E$!VRxs`*^VF8ci zZjDmcy}G>Ka*>rVxt{ad8yI)NmpSI1JtBvJ$L@oX@tn6iM6opTxH7wmnJS%_ogGbA zb^%{t9K5e$3RSg$17q5cqV9$IFC=;n< zAH;9d`7H!9$?wV{o3hHs%7{Jj-fFzOa)G>z%LX;4@rDJt}#TSsfWTTVa?VV+E5pM^!~MPi!W&h~cfVmK<`C*=o_L7BxW|& zo+mgTUtl1-FN!=HObLB{N?Zyi_EE^*1Y=MCvP`R(jeDD{(rcAnTEG_=chT1uT{Uth z1!Urlh2~M(=k<{tdnjjp!uhJ!?w^N6o1w&@`n`DUYxYYT7 z7F>R{SNG~t!CoXPchn&)dutqmWpA&i{;9noSKf)a)g>IbL?|Rkk>(`-x#(kNxoGTn z?d{B4#UDc0{>{nwi=P`w#g?G2QQ zeFdw%)j}iK@KAAv`C7j_R!~kGP)2P1Xun69$ankhpat{V+V84b6D)mGCKe;iIAF#( zO5jVh4bJp*Eqn)cxJ_660?$8g51Qw6R#l^QgVo=T2?dAnoS$2z1%APv&l;2z9GGOI z(YPTdh_>s7CH3(WRKpEc(91FRTXx_xLa+DZK_8lm^2??`=PCH;LZo#p1)Wv7{PZkd zAO;=mXit8LDlJ|$H(AAeYl0HA4~!gJKZ03?u4FoXBE}}U!~8381HF{9FZ>3@NGGAz z<`OsP9y|CcUJ=6o^7F^#hQ@KKC`dzF78jtK3WS62_{zPeS(qilI~5xF4>j@_syPGZ z)>ASYU+KPXCNPXAwgln^f`RZIKa%{VV2;J~!T$FG=24lz0>MzcO>8q4nlRTgT?~f( z^NoRE+&?>1VfoenKj-|pJU7!iq$ikK*^oL>R*%7-IM!B5yN%ftC1hTwR%;SyF&Gyr zjqe56;%%6DGI0qsx!lyO`Mo*|d5 z$*_Ght1wuJ`4Mi=d)Sy~D&*HLXrJdDx)uYp5{!fQ#Z8wyGD#fW-C&85Gp!Ok8N|Y+ z4lNeTcz-AAvxWHj{~vOLf$+Xe3)^w9XndKUW>E2#4U4vrW=(lsY8v9kSh*doREE0< zG#HHgA_lFj}lsNWF;|zC7kic@+-U^`{ru()biQUbIRjDzd|%lUZe8Yhxe;421Xf9U-t#xw=ni8Idb*F)Ez8M5Z8!Leao5DtNa?_A=dhwFQj3 z;A=XnbNw4#?KA`NOv#h)iv#7a8_h47kv&x%bqH^icFF_p1Q-YJ%WUQ;dim4r>^-%QE8kehc)qh4(@Fupz~)ydfeq{%AGFP{dNViW_ggFb>|=@k<_Px|v-H)#Pj5Q&Q#Uu{h~1 zlxp2L{B*BIkg{0soZVI;-b0wG`^eE)B9w@MYsFbID|N?9*yhmXnaJXNGutkl?I--b4EOD7y?Fc^2C z|LYQT(OHJpLGl)78)*ZAhTi(tu}Zp6B>6uwnEXlXeZKtVdpM|&%gQ{C z!(!GhKS0{(&Hm4^+helHr^oMBj@eo#mVxyJtVf;sdLj6(${N2BlBbbSryyVYJ+a00 z#@u?pS=CXZYUfXtkHF=Faqzx8m-U7nlV`FtAAhgNUZzuhjOZt3yi{+TH%2U%e8Y(M zcicb-7zpo6@opzG=7+)h_GOgqXCIXKXGzgKsEvEy$0-F_2Yg^61{w^;UGR1H0B4EQ z0e3rE&QpW%>&7W^G86I=dgQ`&zfQ4F){ks~z+fD_FAc(vA|AEVZx|?w`ECfsj|UCQ z&y#9#-QVe_kq~0Nc4Zv!1v0Fmv)Zs@0tAOE+}vZy-m+)Sxn0fNM!2f9Q^%gD;HLRR zjU;zc`~3Y1Fb>|=`$6N$eF1Cl*ZS0yVfc^^>S>MkUBfZiJpcQ`v|z00Rkic97>xVn>yQ7lo~89Dha$3G#MM-jAEKV);MJE2 zUh&P!bYN3?8Q<$32HXiS4&E2rf=@}iz}F*bmHWyw_XQ*Or2;<|QR6U()!5pHePBJx z1bl(5a%b})E|0NN-Zi>FeCUmlVwj8eormc7!;R<)y03A7T7gZD+u=VHvZ z|Cqpd+-*#8fu(EML#ZZ!T(KzJ^fMxK8xh#68wddd;e8>GOs|fqg)fN8yj^V3>E~p= zME8~kIdw5Ony=%wi|_}a!C>5l@wK4#7VUIN?NVPk(!8jvF3Y99eC*R5XHVSK)v>pl zJV1*fU>v-!X-69R$meE77}1Uvel)HUosIJ02dm%a*wxA<4pG%J++q3K$r>zwL;Cqo z{zgqok=|h<8zZhpXyQ?=yuG4yEV9Zelm z4DfdqWFvmuSMX9~#G_n%8yklyiTFAOnqL6j(ngVk(ma60TM{tOcpLMh7whsnLgh_d zEBETzk$ih7ZtLgCk!Zh8w_h(SfLsYQNr8?e@XIjzk8W(a8HZ!ek*9vw+l3K6h#5#F zvUVD9AM`@hrGRb(#=-ado23$8ueZ#u=P2GWVD)?wGvgKZ0XajncH6Rmfil2v?|0ll z2p9<8?;3)iDD-|v}Xu@UQZ0P_?`e=0tkrzrUo1GPMOK*_@8Nb2@m?l^LkW-$2SUI=cwf-1H-|>+DQ$%J zFz;THk5$Mk4qmX0fBz_OP2~9Md_@g#Tfw*szTVx~e!!6OdED0s>Koea?)I*Yobf2Y zCQ0=L){~kjdj%jc7zgi*lts43M2G|7c?^|T&+Rso8>}LA&+(qI*lkuvJF(H369c|L z=GVrv@wMrQmhbJSsamOZtL=*%KC#>y$F9|aiD(e?$mOQ|E*a2DFb>{V47S1L$XA93 z(>+>}s*XtOPg8|=mlSU4GVZjqMOF0x^}Ij`7zppnqB(j8noGEaJx_lScr7n6Q+Ccl z;XyBcU9c77)px_(K!d@!3%(|XI%zFXHK=dJydY$988^t4EpDetKPgy~edHy}Ss4ce z2IJs;5wbp0;t$Y%=zufE?B!tf{MMFnho{%^QOWZpo7b$J<^+H*kW~&EoC7;{@EMU~ z14JM)fycEbV@k4J4Pz;oEjxkZz6K{$ckzo-v!Q z$ux-z&|om`g0J38iRr_x0@4COzvXm;8g0!mcX3WpqwK@lhlyfIGipF!Fb>`q`)(>~ z(AOYF`i=M|vdQgogw%w6y$5o4HNIoM|B2cXngz?-at>j6+cPvwSl*UuF-5F^J!w~a zoE$0K^Zh5kY*nsiC2Kw1ZZdP|o>s=6d0Vb|P#PQYgh_gMwgkdP&6ket(EJU{#Gqt| zg)#U22?MA&2Ifl$C?%CmK}~y|;2SfOoXhuRpTxLYcbh$uz4_Q8r=)@Cg@Sn#5<)2A z9=aU#l$(x-mfRdQsCYQQ;A2dB4-fSX*Gqe1>;55_V>do*u)5WdLzDJt<)HXjm_(2; zhj}bjmAhs87GpV=`JY4Nt=D=YaTj_&i)R^56JFq|&m>h(a=>N7E-69u z)$-PNVUz5|6|V6>-3bE5!5R$tbGsXg>RWR@f8rO&O9UcMmT?sD4Nr!p578bx7DlJr zXQLND24*XeUZr@px+sZ_(I%h_1xHWuvb7gZ6u9>i7n!5JVuTV$D%M#~O9Ph=#=-kS zi)Xi3#3JU`VQR6f4UxjEauzFpUVEgWqlq_?`Oz}rcicb-7zpp{dW7K{|77HM!+bC8 z+CLdi-6~;r88#L8@li-X+)cIZ{FE9n?t(8B|2!$X_7~D@S1pp9gn64SPOg)eJ81P^ z7OpdXqBIHAogiQwysww$BQG?r1usNEZEm4l*)y{Jx)z2=$~k3RpwdOjHn?^Z@C7!u z&wMo=Mh@y|EKk4bgdI-3xbIlm-y&wQma|K)q8=kNn!pVB0^{I)aSRaB28A_D#@HJR z1$}s5DL2YNXm7lb*gK-Zh27T*Y|;*dfPwJ7F0HdNdY}an%}DAon1`^FW|$;CNaVOC z`Q)9_dp%vo%Rqy{xC_2^cW%A>E?V0gb7-pCu6+CEVnjBw^QnNYT-8iELtE+jzy;&r zeffSG(RDF1We@fvk_^{i{jpeK(>qLXmrlU+3bz4UMtTh33v7Zt^YwLB0X={Jr)*!1NE11+V^ZJk{WGI9Unxb)bYYOE+9=XDHyO=CQ3eceZq01v&y42k*;4t&W@|IYm7F zg>l9Wi|6qNF+Mg=V!YLLQ3?#g*_zVN#~0Wtcjn8D(Y5xgBYK+XBK;mgUu(lt)VIjW z$)1Q}=o}9zPQ;MG9fi#?@n4v{dz{W&&<27H zbg#D6xi%e;r(K@Z(U4$zAgW}Id32Z0mZlZ5dWxad+@-I#(E0Lpl^oNeq->*K@>$5A zX`8r505W6J2f7pO!kXJZrJuVXRlU(;AEy^$4{`5iQ(Br(OErjoYK`suePCTb?DHaNnyz&@|{`_vJ63M z4{+;oTPpB+!`5@nkUH93K!5C6#lgx|2HWn-Cchq(f?dm5mycm8+n(pBxczjF(NOrh zzYg1w&|zDDT~_r5ey-R?(F!0MjDzp;$K5kYOB{aEZ_SrnXykf~g;o&m9HkvQaT9)f z_a<{F<#*gb2p9<8<-2i?bGp!KLi95qk=-Mlwra{1`{~u=##{GJp z|HsBD(Um85pQ2MT^}oL%7w4ysu8$|tuzwvNXhbrlvc0H02;2!U?$=oQ|2M4vN7-3N zRn@$2pH8Jy>VOIeDguHCqJV@7N=XPPC8cz$;31?tH>HS3N_R*jAkr-Y0xBsANQb`L zIJ|t1&vMT1kF%ERc|P28&0I6H_q}KKY-)3TgKA#NSh{qFBi*Z3hpLz|O$B47&&%n_ zDIDabAzDLSQa~LFvLSd#~5J z0628NvYw6{7JFe_ezq)5am!|^_X9^|;zDMN?@}#cv-!U~lnN`QEJ((w>tzdpo^A+@Jjy|9@lRx|)ZiuOJw4dT%K ziuO-R2sS--F0{H}%SV&c@B0-O+q@baD8PI5)_u~73z(s>=#tfbdsOm=nICQ_>Tc=)CtJ8_9 zX1?;$%Xgfi6(nWBoJ^Uek={f!7CaWuRBlvBF0-n)4$`vTTKv%h6*Ds2C4?x~RA3N??$_Hf9*cQi zCwtx54G+E@cO#Xs6GA-<7kKbQ;x=Kzh4)958vF)rl%WnGcDFGZ=N8_ zDt~yKGoXgoYip5yTT?BID?t_SchL7%xKwO|1xhkwQHcBObQ@<<{cE)*ay7uQ-)#XLv4cN`3eL+|=_ zBHO#ksQP72o|>9iHs2y25-l&H9lF-_>qUe^bKaM%BzlQ!zc!=Lr*vQ5kp z1%8n=kQ&PRv1U0S+ePUq?xtVuR=^DCqJ0TKZM(fuNzUHb62N}%vUG{KQJ zffSpW-M2R+=9M>F&UZ)z+@RXqDg)yF@+;oxxS7LGN>3nQ*Cesn(L#}5S zqqGXFkC!F34)~y&6~z7JS8~eJ%4hXA%Sver-siNxr9F8kQTR!@S>@;x{OH3AMSHhy zAP(IxIp}4A9{%gk6ceMOf&z*5%oVNOZNAC_+a1yO9`VY4$VT}Em}8xP`E~Z&TaW2< z)dk!4D|iwd51%;1b{}?BF)g*H9no&c*eF6(AH<>i1@WFQs|=&%yKw%s|K`=j*a|iA zhv`Ar8rW?O4zgUKGyD@5i2#AlGQnu}1+mUt%vpoXJE*`Q4&5(>=?moa zw&D$XAtNfHLOpusH?Ev%DSmS_;sX&*D35!4Bg!w(l`hEyKA1FF%5`mdG6V;&8lN@6 zyP7~s0r%VcCy#bdzjo8eyK--DMHj@O`<3|N)!BfXXLeq)J~E>&_|C#*=v{gKVwi=T zeV>5f=`7TeCK3Sx(f#6ej=BBx8%0)cscUUgilKNO&b8aTD|!iXZD-u_FC$V>%?jfF z@{2w5nDF&cB3E}oTE1KJ5>IPS5ER!CUzqomr+u-gG|r9+4C2uJy0v+_CNm7Lm3ki`;Vkt(MREmzDSsK~5;r;)=L;mXzJ)|$*qmU2s z@KD2kp{^xCK#}t%*wD_q?;!6NMNP^K1}zUY9I`7VyWH8~CEiEf-m15~N+^)V?qkIL z><<60;nKzqO|twm^3N_QJSqt97-D}C!-zZM?xD$#>wTfZTdMxcEhIlTE`^BBK}~L) z(5SY1BVRTzh)HZh&%r)WWn|gzVn)1?-tmwuTeI4DZg-txMbqYRrbdA7M1HQ#<91!frn`M+UShf z=nQvHZogo-4M#kLGk%TPTymR*0Aja@IX5($9d@M`!H7HO?g1$+5zr&={46%OxU=y1 zMt>G*LtIeHu1cPc<8~k;?(DB(Jt|(BIO*_I90Qvx_p9}-s#!(%5$|$g$6==VG9adBu5H< zc#@nASDT(amKIdIOLL^cYAq=nH-6X*pTXp3y{{b;7m4dE$q>tul6e?GW*4}`_dSmh zcVPzScMp0Xxy_uMejMtG-l=TWbl5ZsWj?1G)thM7npx-Jw-5>~7}0AHU%|qo==Tc6 z!h*UC=ubdbDOpJ&{1pNOMDvY6SdsN?a_J9EJzJAkHL*4)d_HbC(`{~~R;EllFI3vN zYDk{NHY3>A*~2nS8#LZrKfvxzn!|CF$FmRnBMYZiD!~@Sr+UY%s}15bp*Kf>f3nv5a$_gRRH%h%Rp)OZPWdYW-X(GR14}K+ih9Sz4?d zxQ8Nf5bsh5NEBY1JFhGbjeLKj!dNrcU}SP4#Pd_%TS*m8UcNmR2Z2wd?!1hj`Pjg~ z{YFmx1#LIB?8`d5ta*ndL@o<&`wZ+uFL7EQ9p%yp!Po;vVwT`5|TRQM`RdQN5iYup}LUNX^r=uogA4$+-E1=U6_PVB2YmGzGn$g#FU z>bl=;5{laDw*NwrzdMnBx$-HSAS{;81~Wkq{OEmU)dUKYfV+yygg7%)#UVCFGkgw4Tv+%aI;<|s zLR$g2haiMKxY!%^;I>G?fLX$T;Sa*4hLjw@qWm1dqOfrZsi7GRg0VY-gXssu%G?~m z%E~bahVKL}P#FUzECd#n=L8lti$O3UXRs)D44Ar5Sk$;PSQO(uaDhe`F!>lTOJT4m ziu+(um+yl`1uQB9gJ7!| zFp{qShq(=OFAu$lg6FnwSFn7Nhv2qQ$AHNvg?mKtLvVp#FbF1!1dH;PJfU8L8 z3uf3)vr7V^HWBKd>-mAy`VBCda zVNL#EVRih}5LEz>gX9Ci!XONo{4=nyHE@9uO9Ir8R3KQ`gFvvbW(=4K5m*>!5U{`q z_S4jmEtrE|1c8OEW57^~!ot*p!NQb{1k1S=c75 zEDeKT;}`@x9t|$g83U$n3l=pP4Xz;t1TIhq1122dgaO08 z3yV4v3l?P^3l?R=33sec41y8GfrBZ3hn1Pc{U0Vc(6SCxT>wvTAK{Ro$C#9baMFD$ z9t@hrgDX;u0fU_Yjw4wFi_%K~i;Be{*e47a{>NZZHpQ^0(8pj=Hau|O7{LIfeF833 z9|I<-1Xfo21gvZmgJ3d=U{PThFx{oFsKrFEsAEsT1v+5B)M3D2m&2kENnlYolE9); zFkqH2VE8LwQA*FiqS*Q1j+KA`*#8Wyo;?}N=vTtZ+>*h{$}tFr|NQ@uw1U>6A*+}0 z1Q+!jEUg1B7BmSSN&z#*7%&AGFyAp?uB3wXunWSSAtM#s0FxL5JDCP9@ID4i69x=b zI=HM`7%-U_Fl!hvQW;=9!5A>Z7%-ff;IeEnV5%`-NM3-;>OMnA1KoK+F9;eT&oBt~ z1p`Jj3oObT1EvQ9hBX^p)*TF(5}3g_^#tvVfe=mb#3h>p9JdjYYSd6Tn1kNrfU8NL z3ud~-;0eVs7c9(1of@hKbI>*hh05iDh3V_S`G0C2SXhzu zrc!XBCNKk>@xK1q^a0x72X%MiGC>=qz$!reW%QQ-7orFWT^cC73>@nXI2OcE4lEBc z!hmrzVx@ta%7LOH>hx$J>IxtSN%Y{-KzbN}u@&GNOku!ao4_@Ys{|`^s{|KV*9)tk zz#!P6m*8L~7%=$=CK{;aC0IRn6|levirX}hK@~VwJUA9Kg8?H{4b%iF-GS|it_F&V z2s5IAK7cuhVi30IR1Gj7WL5)KSAqf4eHX3)eJ!{^rCM--VMDO`d<=rkVG!(09sMPY z=Q_{^2u3*qtLJY72fNbQ+cVV!tYE~11q~$F4CEla_pn877=Y!?;2IFLfEjjsxCSOIU}aA+2sSYetH*u~ z4kr2kJzZUXudVmE+xZR_HdN7DZ+6#;YX=1>nV8GNOVS5PrfEA3u zen11Mf;q_TGi=dQ48XU2|A+Yw^r{%7)K9MnNKv7rv#^u<5 zfB|4AXb1!5=pZt67zE=Q1{Y{^9`0Vg!(jDw;9wD5?lcg`J8&%RcVJ=Z7%;0CFciM9 zJ?bMsQ4z|XG*B{_gSu8=ixx2ekBx$B>4*Un<_Fhca1>Yrh++&}pz<25-ewFOEE5if zaV86T(G@+}DDU!NxHN#*TwW14+(-mEE5MD{IDpp;Uz3V2CBy();2g6 zbm=p&JSYkSCNBoIXYDhvf)Ps*G|2{7zSn2e*-s)z6R{5^EYrs^1;C( zYU5}isugf7`4zCR7z~(CU?w^VHWdEo7-%nbgk%B@6anU-+Jms6;~0R9Yv4*6W5BpS zgKN;d2CPB!I=DPZa#+0nIxrR#he5Du3>bbLxO-jN02k=K0aPCmnn(jpVi1dI6Br9J z#egZsfayws-J#n8RxpAx30?~Xb5JN1Y*8Kt;OrK-mcrX$MmY_x0kjRQ0n~*-FiIL& zJ^v26~WE(4@&aP7Yc_`O5x6r)OG}R$zQAAYKD#W=TEP(jN|F=P0yIH^LcMFG_|iQ_r*ju{9MLa2|-%*&wsl+3K}!L%4aTPu*x zx~_YsWW7y%Vcp6vtXS~OKAkOwWq}>?y4k0TJjf+`Yr3B+D$`?aR+U&6oNbS^zgM~s z74OL`e11Mdf^9o#K}^}DzNx`v){m^wsw&Yw`v#(3X%B@Pbs?2_RQ1B6mf8CITQTZI zu65c6^K)N+lwUiSw`iN5*0{&wAkt#{>~C4b6!6T%9?;0zIePVb%uy|@$95bums(Ph zj=}p--|gxb56E3*E6uvgo?et6DL*#})vT3rt+zeUI@dbJ^#}cR(pgH8zVgP~>2KUm zo@r7p`zkYPhlRc0oqY7_Ov`R6_u-&@Vb`mg4n*=UL=-A!yS{SsV#lhgCoX?1E|OXz z^*WUtnXnJ_k8mbsmZ4r~ObEYLp1nja>-z$4JBzLGi(@!*%HoHnU+ABc&g?(jw*NS6 zc&o;?0IQhj)DzR^Sx%plMEou*GDlFV_4Drw>$F{l7gB#9KJ>z7v1;@eLispZ4hm_v zwtUOU$Lq9OD*MoPA|Eom9FJB(r#N$PW!yXQ-m4f@OB9(@KgHI_r0o0oMYX+?&NOBQ ztRnp>rmp1VMbK8Ou+Py(uOHY^yTANQ`~C)AAo0GiT>LlF`|5F?u4EUsbzVV+j=$4l zO~4MV3=z6V{*v+h?<3rP55?*EZ!Gn>@fIqtJrj)=hxplJ-~Z4eX>M1We*1K~p!d|! zzT>N<=y}4u#dU9X=SeHZ5Hw9?C&|5K5Q#Wo_o!q1*{agXeF_YS)f6vtDxbZ!@T!~a zy)2f6_Q!DnldB`L?+>->9^p>?T{^)h2dk(&$Wrvb zc_a6?*N(0F)P(A4IS-YLX_K7s_`0jZpybodrsl-Pz*l4T_x33`J$UnII<~-7dlJ>N z^_{j#3ho~}g{wO1W#ygXSGUO>_n|NOxHJ00<$jo2#CL6{1hM80By|jN)3}UrSl2ot zd!DcCW4~0{DLtkM!_DX z_vH5Uz(tuj_E~TC-So*A#={Ko_rTc~_Rj})ySjnwX50-oN~pj2DoL5`h`$+$MOtjh zDNz;OlMA5yvM(&v^SR56vndDMJ7&I>>L2I`RwlN~d%Zi$E*+7gbC9lRA9`)qRDj+0 zk>h>419}!pw_=oU>Nl{Zq$#Cvy*pV=L1w=XJ^tp=a98j#ym>rjhn~J6vn>(?vSztv zxu~<`yNk=R`S*RSfa-*uQ(a(&YR*>#;f=h2*U90j*=dx#w#-eJQihAk_MuN-tZ@8@ z6KX&8p8kq3ujl{yzl&Ak2`H43_b z@BiWgmsMqNVU_GbgOS@Y-xLw9ndBRSkKjXLmnO2Y^fVKuu0Y#(43&t#Fm$Sw1&;}V z*U2uD8m==PUzuAsanxVacT@gLw=?g_u~rg3FDFL^XyO?B&4Vkfc$5gs*$-GGMUGkB z*K2&QeoeZFbZb5uok);!r{~}mY;PW;Uth_pWyPanixm^tiM6LEZe3MQj$&pKWs~@> zYCIo0Gv#bu&S_x;VGqJzOr~1Ps1Uq|=ZH)lXunNHIYy)*FP?bul=)G9$XsK{eRHPj^RfBAzr6LMkd+E? ztk~A%2S;zHfl!DZtDwLg9-4eVG_Br5wvD$b>aUdZg6wYj-e- z7>#ql1ghac9J!owoKI z4I1C!tfqH-G}Csw+Xz=}6crf6p*#JSr_+1zu6}pyqq(=FpNWF_-7{y%Yr=3H)O=j; zOU@4lxLy72^gltE`{VRQxM!eyjQ~wO(9#hcTBOIb*QeMAU-!~;SX#3`s41mN)PG4t z(+OS)?ON{JZ_AdO-Bg^algIh`Tt*Dd&Hlb zQgH4h;(V$Q=XnNtAw8e@@B&9+Ux@7%{lQc9(x|{74&7@-4%?*;Ta$@l9$RrshO3Sf z&a|r1%yGq+V$zl-MI#UHPwvCc^RWi}h&>H)bEz~5>i_jL&l-3nyV zY$jaNH5OH?(q)juIffg3<0U)6YysD2F!nP4pu~go_k|X9xKTZ!q!mp#pGwDMV9T{UUq;}tpqs;y%2y-a2-BkWI8+Zfo>w2wvBXTH= zD<)5~WeHKA&M8+!Fuoxr*#; z=GqM+`gtL7O{M&7)JIg22oQ*FwwTJ5`zr+lc)V|O?%sk(;9(LPgw(0e^*U^mLXth_(+mm4Z4N&!4zR1PDYo+t2&Rs5EENqsK$V-QOY|HaF%Knr*uai_Ubs&E-`a z+q;_taetX@=N5k7jlo%|p5W=_>JDyi4;`Ct%T1Ky4vGfe{kCl-sFnb6=w=_$pFyPM zi60rAa~_+b;j8ROo4?!fg47uS#SsckM+ z+u#yu9HJDZ^=k~c_WPT2p^b2|5)#VeE9M@elisz;n*G&|>H3fSVH;z;=Y{MGMT2yZ zCA8$iq=B%}ep)0dl6_JzOJ5^_tAXzMxpu)Muhu-i^Ogw7sZni+@;RXfqNj)a>O23Q z>Nj&I6KWG!io6Fe#x8bga_U?QblCOk|C9ItDs260Y>k`w9UT<)Jm@T&FBo!*|Muj| z-RH)d#?NW!Sg8urOZGmV3F6Sl){*-`)^r3=-StN+V(#V|8iM^f;t^sqgevhy+4V)U zsBc^%5g-tKY+*m{ksdg&n?OGm%(3g4o@m;Z_&7|EF5>gpb^5wqzP(Sffw;fMmN5M{ zt)W2S?L%~0xBW=*Bu|<~#B5u?w`e9^WUrwdsYQ(~5C;dQ`1!OF_2lWpF}-8vm##LQ zd>Q(5`~=B^{zuQ_$UfW`JI>EPK`9|J8sw(%`xfb+Ak4vm5pd!or9|`B-7uiXD*v+j zI-$t3K4N@LA6NW9`ix3WA%e?&%0#hF6R!va&*28|RS?9XTYW=q$wi?<^OR1xFrSPr zU!s}6z-XxCOQOcD)#q=?LmBp_Q4ol3wYG&fk^UO<^AfMH=g*EAsi`O_FHYCR*|C?r z8Cy0n5JNcv;{LMwsK7RZY>M^`^>ibNjY}P>Hwc>#BwtrKc`njfRSVt#ANPVJ~mx}WoRNm0kEsLbb|Ak6)-`eN;WWIn(-C%+56 z8_s0mb_oiI@B0$<8ZR^8hFI=FGZ)M0cIt)QsKb$V>!_yV190eG|Jb0@1xLSa%ip%H-RfC5=F;>&O%?+xnRq2PYWn zb4S>cGa^?}fkE7FulHp>>RL9pvmSXUC|I6or!&oLLvY*jJ*qAC*O0JKDR>-TiV6(k z{_?uMsqRGW&E3Y2@fV7!R^2j+21~EbuBM-8ZNDp`Ea?`Fx@3<36LgFIs)ON-VqM>#g=W^)uC0sf)Sxy*iBwbw#N`r9qV0{{&$U zWp?d&b|F2nmnceN_j+YpIyWkUhmj?Sgw)xXLK3DG+?i}FU?S3tXkE$YwLpOV^ ztv^{ac zl*qcsH}AhQC<||Wzc!|!jS>vv{xW-)bjqS~0P6I7{Yp-uE!Dfi&?SW|G)pbgfm*-h_09L`QuEQKuIs;6Um_H{sStNQvV6FB?ejFfpC97c z0@6}ciiQ4iA+4Q8pi*4uLlPT!MMneSA*CL2P3KJO^Q_|SKGqN^g&7^3WK|o|+ekZ| zidJ1l$R-$0dafv>Raj3o1hh*qB9e-S2Dii?ciS6n7?sUv-%_U4ul}_-bc&aO3bD}3 zp+eq#zVFB6rZCstd3VW|Y8^`NScWfFcgD;wV;B5h@d4HM*U;Lic3{d@PxkC9*ILsP zahO>}aD|Eo%#jbtbEO&kyhjZI1c*Z)T2hvG8_3(du4drop5MeF7a)+ z!lA#K9{RK12TjWpm*OKtc8%HHR{{&$UR*dsA@d^Dq@d5SMUslV* zHx##RIc<9tN~yoR2)C<1oZWOb{&M?}d4s0LUi_UW5XuM$`sVZPwhE_|G$S5haW9hLa}6NI@xR$s(Y_L+e zAuXkZ;zr{~Ml)4MIEtu;MF}rX=O_Jf;P^lN3t%o={I=hS<2t_NK>WJpR+N?kU$E$Yko!cVBl?uv}{$kV;B8hPq<@6NI@xUQ4_EN8$s# za{LlbE%pv~-8Jm&)sxIRw5X15Dp zzO>%d(Dh@(R}v){#QkM<1;l^+fn2tR-LQTh-BNe~u9xg8Dr&$m;zESk*eW+H!! z+Eju7ap-0%*rw}Q$3l53+o52Dwph1rQuSe+785_o2^$b?w5?T z+7bJ_{NjVLGfiPwo4B7jt-MOuosWKU)MR^RgFtk%j~F=5TH50tWLyet4;|JaufEvh%+JIJv}t^Q;uD*$pM=O2aye=;j+X`P*tVE%d%dibyF2PZTQ;F>asj$`7EXMC zl=2fe@wrGlr~DygMf;7`G6_#un3F$N1zT@g+-HkC{=v35T!M)3=}#IFZs;hcb77$!ilW(*>XUJtO-0|sU!_u`6}S} z&9Bw^qzNvxln7@(N3~M?*Sc<(QghL2-#Gk|@5WogmxoACs;B!<9@l<84zD5o448Kg zPJakbbpKH8ntnxIJo-tx<#akDN3r0=v|)3q+;Qph=E}rh=?@#A){uKDyfY@?X?8}* zL;W{I8Me!GqU?bk)uB3LNJ$gDlLK$gdtK;2bt@2uKEQ}R+_8|s3gy@}i96?U-Oxn# z$eDb4i{t}p^+g>#AD^KfJR=bx5Pg6JoX9`(3YB)5k)-Ieq5Wu^V-Yn97GS2PL(lU(^xEdk;@r6~R< z{Rw2&U$m4LDE=CCCG|9yY%l++t~i7^t(QqJ!!a$PanK%>{`?b!IZr9X&kb)#sM1sv%m^@!8?(h#0#PT*OnXz}9 z+1@TF5QlDc=R3X7=9D#ooZ);Pk|n~)yz{M9(*wq%&K~~yMhg-jf>7ztzrhdi65lVY zFG~DJ`U9AFqUx||kvmi0wu;8y>bt?7ZMENWn9fdxdH_5QlE{ zsx`B&%-24)(lx5;veJrNf+VG!=XUdFhAR@S{91b^|HMTiKp?u+)ojOlEu0~Od8&Jj zS$xm8JRXjJ-kH75+cQ~Gj4jh=juH&w{uc#CN50tGOd~-_gN&*~0ey zM&DIRs#EoQ_edZP-Rg7hON@65HzGaPksD`@h7S(NYP`=Klm1G1oK2QQs_E%E>azJy z5a#|^EnWLx*$?Q-@#`L`^Xe{dv0RoVvTk;hSK29Hqn^1vi<$n6{#!DJALoQndzBC% z4&Cf*cJ7;^$7#GO?tQpKz1w0t#irt;-}m5#^Zgb+Z;qnYJ+na|y4jQEl-LO_E+IFI zu8*-NzSg+X%g*=x5qpIpLH1GOE1jrEV+auUm)S}-@7)@v*xCd8@#u?vTrA<&&@2`r zjYF+P%yrTlyHioU2*jbAEnN5J?#;fhC3QiiNBrI$(}=jo6yIt+iDg0(6+tewbl3@H z_CG5Gbs1cB>JXL(bDQu| zi*-mhUHDqrn(szFXma?G>v=0Z2FpW*Ur>QT+;6k@P2z58;{p*uSJ!H`X2^W#p`x)< ziq!E){OrgNoV-mA1>~r}AP(K^W?6*tv)AIxCDYU=!{ZM=Z0oeRXMK1$8?V4PE@ep4 z^#aQ5e}k?UP-fTuSM~$Eg`{2qGGI*{!s!E(aHPL=)iT;i6!C6#XBnU(|yNr+2 zJ;{FjhoY~TVA7$(Z(6O$w>fc;**3Oy8J#?SL8!nW?k}?gGwX~TxXa{v22!@=zl$hH z>u=~-+8Q~%`W_i1IK5kr3Jl`V&93%3em22j@FZR2_j{Zj5)VeqW^^3a4&ET72yXU^ zkqoRsnf-4tum)we#D8T!5|@8wKcLrO_h&yGqRayF3lFb|2@Q|;5qQVDr|U<`*vyp- zJo|P%=W$*ww0Q;2et=YWF1+C_uR>Y4;$6atgt@z_jCfll6rXlJY-neAdY+`P=nlIF zC4Iq{hLrM{s1Z$#&1r^thYwdD^^qhZxhqTO*7uC+aPxPb?MT9%2l8#d7GT~ez!?aU zd2_L>I?l*7nF}$;=`WAEZD>`NOkDdx+n3?o!+Y?=@3(U(HsS22{uK`kFH?f@R!)of z%D|f}0YmII5?n@wGUQGFGriMfKZ8ajuEIOx9=_;sqp&L)XbQj4I5)<}Z#EQFXX?0S zKuSENC>w_TJLaitaPefkxAN^Md!15}?b4URdCWFn#zmiel>SM`OhM(@oc8D62@t5_ zVXDNm$R#qnz%FtNtU=ZG5}oxvL1d=hGJciWs*@9bEaAn=dlMgsLmy)a+H)Oe`$uk3 zUe|ukKX>PKaYhgOEamA}ZwaVM3JzwW<~<|=1fq{IYV*&pk4ax>$M+Jo*z#i%y-mk* z?<5buTC}9^2}na|4mA`&-0v~AZ_|W95!t)16tiMW85%cdWnOl3k7Y9MtQu$UTF*SH zI-ur`3Jl`lz}WlOf5`9-)VZzeRZrp7eXy-jOH^dJFhhFffob=Hh)5oZ`iEtx1n8e2 z%>CI^Dn&v2*Ty$s&;9x2FhwW`%dE~$k{nReQb{B z#b)oxUnpp6$&Q#y+>JNJ4H!%9XdjtE%9# zpz3^jJw)ohh6L)$`A-n$P+P^ZME>`=;ja||;Kk$TxSpPLYfKp?n9&&zA>Z}GNuc## zxtG}#`9wJENTj~^?%pFI5QlE|EvK*wDK)|3ht=!m>4tr}9?IY? zzcG24RL&81?@Nc2sf|6#?0_$O=JvsqOgZw(qxl z79taHXZl;2d)@unY6n!mR-&p1;?T`De|6lLWm8q5f8rt$AQ0W`^UL$H(bEqSWALXqD^kN%d1J6P*{A1+P=Z0+UuG+Q zWReOm@d{pbCrP?Cvtq5sZAV^CbNKGttP3oD_lGD@fk7O)+3)i_-0bU}jw`x_6gD-f z;y;yqdR8{ifW(kFtSV>JxhuQzYo+CG#d zFr(Oa8}MV?U@Y%(anA#Y{ee3WHL8jbr%1Q-4UDIaA$Wxo`#M-$9uRt@fXcdf3-p0M%;!On^X#`|MAE^o3R^-1H0Y zUEv6!&AavS8_t)}xrz!WFG(CM`@{8xfzUl2H~|7u%60Jak9lh_UIj^hfgs<>NIwTI zt52T|iHaV*M-Y)}=1K6KdIae!vdKWzj_{cWFU8&oa`Y9>mnOF1vA30Fr}4y6%kI>Y zg~h1IZ-1J3`FjyYd=g$MqM=eG$8|Bkze?Iy=*_7sS6eD_D#JSSDogba^Yi3y$Ns$Y zL&8RdSi*@<^i$3Zcdkycs5+}iN&nPRz_0yBdr80pOIw}R+t5-yyZ|Jna|mJB8!0`B z=VNW0(lGxh3YVHUGc6LopG8;e%c17q0rPa>{73Cp=H*2m8B+y`m~q~q9jT84cr;d0 zk0^Fb=ySz?sHy+n{|2h}ucwC#3mdUS(V{kJ4&5fc*Q-T^c$cH3t- z1BB(@IVtg&)`^Emg^i;EgE%-a(f<4=Lv%nas;O7gKbdbbce>$yNMj{&aE~)hdYoIX zmV^g)0V@CbCkS(J;NLI){GI;*`)ytHAzI}1FFF?MlQv)LJdOL$$aGZ8y9%(6*ovGV z5lcPPAF%hJ*bTs;TdiO~sOw5g&@$9&DSE2Yx8kF3@674zPPk{8j^3@*(b;>U2nhnw ztsZE#x8`_|{CL}Mw3?T@yHIiQys0UqveA8M>&VGg(pHosAnv!-`<@+s>HPL%CYJTp zy|bfSigoJJ2Ng~TD1Tb1kmxPkuAFz@+d~QB(5+?;dBNGc>4Fpv-i`gx5J4qNA2pt6 zl{Jm{p%fD*EAdSnmH+%3{3ia#>Wj7ioBt#^GBL7&=ACX^CR(ImOTn@N;ZqZ4?8p#g zKp*z$H&g@*+w1hkQNoHj1cRuSlLc_-R=+=Bqf0a0*QMzT80PftRx?W%F7W93hy0)seot37Rvj8%m)+KZ0}ZRVYN z!`9=HlY4Zu>yuvz<7c0E$z6QZh4bIwF8&{@r6v9={{db(e!b*XFR_^I7iXaMc$P^y zP4tjhdExz((GX!7)5O&);I{NmNySY}q^ zaf@Yce0XmUB@zUpn?00KYo_<~*{MM8w5R88Fv_#7%LQ`WY+9k4bW1aw?b+*{Anq@- zSvn3cerd{FIqWoIb+qq^LZw25QfYkV)1AsR87c4g)u@&Lap-2-`F|9rx{91WeTATS z(Jt)9QSD%J!+ybw-s#t8?VKdVTTo{I8x(IrnO*xI`48|0;Meu~nEDM|I?)rll>Tq^ zeJjgjv}A}+`_T-wq_ntq9LpPhX&rR{g^R*x~4s~jWJFnvo2##{hU85_y z(@EZ%3ZW_fsZrnEj^>yB`7)|CkSYY|tq0uxYXgE(}viQO)@*-Ya# zQ6y8HzgSb}Zz-#~tD(x?afQ2#XHM$=%qf)F{{&$UWwykBAfS&FL-$X*9G3-b(PX@SLtc_%KS2t+qq*vPIK*XwNY!DV)TQNOnDce*L_hX+-{-k;uFK2k)x zw}}SC{Wg2w6`Lkx{Sa;8(WtL)lMWVs^DpEHsCtx|~i*^0F!h&XsiO|hGN@3<-%=7%!--(Z*@%Iwh6K_pMuXj+cM?( zmDKOc)oB&TaNHk)Z-t#Y?TF0l-*ygW$O<$V`(!ko%3g( zn)|g_M8OQFKW^N$26D{T#IMeX~cz&D+4= zElbMtA?%yyi5O8n<|Y)_quD3B_H-BVO7(f(?^l3q;1tNpaLC2-O4qyd4h4ZN0TJBK z9wX^j&9}O$T=blyrm@xE(9fl4{?w;L$IAnq@#lUt^R zr%Rt-khi>Daqj3G{;c_~34zy2nX|=YtP8f611d0xLvIPmr^0uxOpzE*m4(ES9!N{- z&JD%VO7c6*&9h9}Bgy!-29*N+6NI@xR$s)r`aerRzm^4nbI;FZ0mjXohn6=d{lBwN zRq7)PB`<2RdP;fX5l;1HXor;=?+t4ZhhD=VvF%dwyS5vddS0hz>c0n-S9aq~j}m(O zn}0kb;eGM_p4T7{-Rnz_2lP%qV5jZpHj)#iuR5Nd?9=z6RfSHhqi>lyTmLZ15)k*7 z*BUM&adEy^wRnaCU#3`V5a*^Jii?D1*2&ikJZbTh4N-wX9C}M!SI!OeyR59MR9w|K zly$=BcD(+owS4xiiU)7T`lRHkKBF$4{{&%f@8Ka@4&)w%&BzA2di=UkIy%UF_R1Aa zE!isU&CLyp=-6|i2cO5vooy$N(hnV{LDg^`z@gXBt99rw>n;n)>yqzFOXD(M2TnMd z*W2M6b2qCt@ErYg0u>ht0@1w|T+KglOgHRs*Evb`m)>HA2Xn;h`EIvlyYr_O3|Qv( zqXL7tKim2L{|SF|(+Z|)9fI-nF%0Ah7qLHI63h;$_FFHU?DAl1p%UAB0RhCJx5UI+ zRZVMmxja5w@&Wn~WEPbp_C_(0-r8+MPuzzB$!m2eum25Rt3!E>b^Y&E0r2(z=fF;^ zY7-x;)?<8g{JwZ*ZkHb#>dj9ZlX4!A`u`E-E7m0j|m3PEosUwa80e_3Aoq~PJG-I#SbD> zeP2rNil>MY4C4M8*w>Ojzx`x(dSQpvv-#H7s?%W+$?tB-VSC%mW?L_My6l~E0pieG zV#jcxvF#`&o4C{U+ck4j8U8{|ejK}1#6H@%-x;OaJKIoZ{}Y5cl-X|ol>&io;eK7Q zOZl}Vn7=l%DHIpfa)nCLumv|K>s;5pKF&H>=V6+&cWeZRL$9KcrO3N7KfaCGW8&-5 zO-^kGAB#7e(im#L+Z<`WXV8V(TZcq|Ky%-sOQe(%kZ$Rg5E1E6 z38lkt1rOi*Tf8{`-`DKSxz986%$%9o{n>=UlN z_IFLhw;B!_#HDZCjAW3fxt;}V>D!!gYimpQm*@Lu?CO4h8Nuhth$~YGSaD}R{tBbw zgP4MRKJR%A-LKi+%`-5p`bpw>Q_Ohvr#tISS19;ZnLZ!N{5=B1gO~!{*$pYPwx5Dk z#1b@^U_Pk*@;Nj~Wh*DC)SBsG>YcK9_}VPu3y{)hd>fRyrRNih7n+&;Vw1Mm8lH|t zR5De{Z-V${vd82shKcqBvaYm66;ll@}KWBmn z4pH#Y7ogr#(;r5V_ZGe;j+p7TDdD$C`ab$qE>!$T|2z>Yvl#YjRv`toMUR62rAu2U zM^V8zWYsnDQv_X(RWkCOODGT6hjiY_aBo`O=X;{d`(^kkrH#jlYA_I4bvs(yaBy2J zv2PXR!Hetw4a16wAMrN>7;p{e$M>Bw837|;+$q(ig)ew?X?9up7$VNIH3#VnKJ@ds zXO|Y7e%0DQv~=hs{{rKXRmW{mzMemS;Efl3|C^GG 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 RP@#AdU|2j8 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 7fb590208 (Deps: Update lotus-soup to point to tagged releases) +======= +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= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -470,9 +476,14 @@ 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/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= github.com/filecoin-project/go-state-types v0.1.3/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= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -507,6 +518,7 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIP 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 +<<<<<<< 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= @@ -517,6 +529,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36PO 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= ======= +======= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1009,12 +1023,21 @@ github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vc 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= <<<<<<< HEAD +<<<<<<< HEAD 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-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.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/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +>>>>>>> a98ca86a4 (Update butterflynet params) github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= >>>>>>> e8df32579 (update lotus-soup deps) github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= @@ -1149,6 +1172,7 @@ 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= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD 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= @@ -1171,6 +1195,16 @@ github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= >>>>>>> 8aabe1b48 (Fast migration for v15) github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= >>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) +======= +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.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= +github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1179,6 +1213,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= +<<<<<<< HEAD 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= <<<<<<< HEAD @@ -1198,6 +1233,16 @@ github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704n 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= +======= +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.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= +github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1499,8 +1544,13 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 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/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= +<<<<<<< HEAD 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 v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1850,6 +1900,11 @@ 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= +<<<<<<< HEAD +======= +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= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -2737,6 +2792,7 @@ golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBc <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) @@ -2748,6 +2804,10 @@ golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBc 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= >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -3041,6 +3101,7 @@ k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM 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= <<<<<<< HEAD +<<<<<<< HEAD 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= @@ -3050,6 +3111,11 @@ lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= >>>>>>> e8df32579 (update lotus-soup deps) +======= +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= +>>>>>>> a98ca86a4 (Update butterflynet params) modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) From f40a7dd7cd8185c5630e094a350431b9928b0b88 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 7 Jan 2022 16:49:55 -0500 Subject: [PATCH 115/129] Update butterflynet params --- testplans/lotus-soup/go.sum | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 2db586498..248bce866 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -454,6 +454,9 @@ github.com/filecoin-project/go-fil-markets v1.13.5/go.mod h1:vXOHH3q2+zLk929W+lI 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= +<<<<<<< HEAD +>>>>>>> a98ca86a4 (Update butterflynet params) +======= >>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -477,6 +480,7 @@ 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/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= <<<<<<< HEAD +<<<<<<< HEAD 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.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= @@ -484,6 +488,10 @@ github.com/filecoin-project/go-state-types v0.1.3/go.mod h1:ezYnPf0bNkTsDibL/psS 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= >>>>>>> a98ca86a4 (Update butterflynet params) +======= +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= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -519,6 +527,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= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< 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= @@ -531,6 +540,8 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/g ======= ======= >>>>>>> a98ca86a4 (Update butterflynet params) +======= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1037,6 +1048,9 @@ 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 h1:GkYan4EoDslceHaqYo/hxktWtuZ7VmsyRXLdSmoCcBQ= github.com/ipfs/go-graphsync v0.10.6/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= +<<<<<<< HEAD +>>>>>>> a98ca86a4 (Update butterflynet params) +======= >>>>>>> a98ca86a4 (Update butterflynet params) github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= >>>>>>> e8df32579 (update lotus-soup deps) @@ -1204,6 +1218,9 @@ github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I 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= +<<<<<<< HEAD +>>>>>>> a98ca86a4 (Update butterflynet params) +======= >>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1242,6 +1259,9 @@ github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1 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 +>>>>>>> a98ca86a4 (Update butterflynet params) +======= >>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1545,12 +1565,17 @@ github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEX 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/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= <<<<<<< HEAD +<<<<<<< HEAD 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 v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= >>>>>>> a98ca86a4 (Update butterflynet params) +======= +github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1904,6 +1929,9 @@ github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErh ======= 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= +<<<<<<< HEAD +>>>>>>> a98ca86a4 (Update butterflynet params) +======= >>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -2793,6 +2821,7 @@ golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBc <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) @@ -2808,6 +2837,10 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc 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= >>>>>>> a98ca86a4 (Update butterflynet params) +======= +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= +>>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -3102,6 +3135,7 @@ k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD 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= @@ -3120,6 +3154,11 @@ modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= ======= >>>>>>> 8aabe1b48 (Fast migration for v15) ======= +======= +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= +>>>>>>> a98ca86a4 (Update butterflynet params) modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= >>>>>>> 544cfa63a (cache added cids) modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= From 93c3ec00b128573c0db82e7350497361bcbde623 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 11 Jan 2022 17:37:06 -0500 Subject: [PATCH 116/129] add butterfly ohsnap epoch --- build/params_butterfly.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 0ea8df649..17e40af4e 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -40,8 +40,10 @@ const UpgradeTrustHeight = -13 const UpgradeNorwegianHeight = -14 const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 -const UpgradeChocolateHeight = 6360 -const UpgradeSnapDealsHeight = 99999999 +const UpgradeChocolateHeight = -17 + +// 2022-01-13T19:00:00Z +const UpgradeOhSnapHeight = 18742 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) From efda3a58470db5d60a7c260872cf84a1e246f301 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 11 Jan 2022 17:41:20 -0500 Subject: [PATCH 117/129] Update the ntwk v15 name to OhSnap --- build/params_2k.go | 2 +- build/params_calibnet.go | 2 +- build/params_interop.go | 2 +- build/params_mainnet.go | 4 ++-- build/params_testground.go | 2 +- chain/consensus/filcns/upgrades.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/params_2k.go b/build/params_2k.go index 6c0918c51..0c31ce5ce 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -47,7 +47,7 @@ var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) -var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) +var UpgradeOhSnapHeight = abi.ChainEpoch(-18) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 16d77c7e6..4da2269ee 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -54,7 +54,7 @@ const UpgradeHyperdriveHeight = 420 const UpgradeChocolateHeight = 312746 -const UpgradeSnapDealsHeight = 99999999 +const UpgradeOhSnapHeight = 99999999 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(32 << 30)) diff --git a/build/params_interop.go b/build/params_interop.go index 66033937c..a483e7188 100644 --- a/build/params_interop.go +++ b/build/params_interop.go @@ -47,7 +47,7 @@ var UpgradeTurboHeight = abi.ChainEpoch(-15) var UpgradeHyperdriveHeight = abi.ChainEpoch(-16) var UpgradeChocolateHeight = abi.ChainEpoch(-17) -var UpgradeSnapDealsHeight = abi.ChainEpoch(-18) +var UpgradeOhSnapHeight = abi.ChainEpoch(-18) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/build/params_mainnet.go b/build/params_mainnet.go index a4781f1ff..6efc6d62f 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -67,7 +67,7 @@ const UpgradeHyperdriveHeight = 892800 // 2021-10-26T13:30:00Z const UpgradeChocolateHeight = 1231620 -var UpgradeSnapDealsHeight = abi.ChainEpoch(999999999999) +var UpgradeOhSnapHeight = abi.ChainEpoch(999999999999) func init() { if os.Getenv("LOTUS_USE_TEST_ADDRESSES") != "1" { @@ -75,7 +75,7 @@ func init() { } if os.Getenv("LOTUS_DISABLE_SNAPDEALS") == "1" { - UpgradeSnapDealsHeight = math.MaxInt64 + UpgradeOhSnapHeight = math.MaxInt64 } Devnet = false diff --git a/build/params_testground.go b/build/params_testground.go index 539e06b45..e139b6921 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -99,7 +99,7 @@ var ( UpgradeTurboHeight abi.ChainEpoch = -14 UpgradeHyperdriveHeight abi.ChainEpoch = -15 UpgradeChocolateHeight abi.ChainEpoch = -16 - UpgradeSnapDealsHeight abi.ChainEpoch = -17 + UpgradeOhSnapHeight abi.ChainEpoch = -17 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/chain/consensus/filcns/upgrades.go b/chain/consensus/filcns/upgrades.go index a21bdb05e..2fa020d3d 100644 --- a/chain/consensus/filcns/upgrades.go +++ b/chain/consensus/filcns/upgrades.go @@ -160,7 +160,7 @@ func DefaultUpgradeSchedule() stmgr.UpgradeSchedule { }}, Expensive: true, }, { - Height: build.UpgradeSnapDealsHeight, + Height: build.UpgradeOhSnapHeight, Network: network.Version15, Migration: UpgradeActorsV7, PreMigrations: []stmgr.PreMigration{{ From 065373eb040116e5d694e9e2aaa29c95b10c4d63 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Tue, 11 Jan 2022 17:46:49 -0500 Subject: [PATCH 118/129] update network version for test ground --- build/params_testground.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/params_testground.go b/build/params_testground.go index e139b6921..41c46d41e 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -107,8 +107,8 @@ var ( GenesisNetworkVersion = network.Version0 - NewestNetworkVersion = network.Version14 - ActorUpgradeNetworkVersion = network.Version4 + NewestNetworkVersion = network.Version15 + ActorUpgradeNetworkVersion = network.Version15 Devnet = true ZeroAddress = MustParseAddress("f3yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaby2smx7a") From eba26e6736692917fbf7931c4adb93c26db5ed3a Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Tue, 11 Jan 2022 21:41:58 -0500 Subject: [PATCH 119/129] update snap net upgrade epoch --- build/params_butterfly.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 17e40af4e..776a31714 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -42,8 +42,8 @@ const UpgradeTurboHeight = -15 const UpgradeHyperdriveHeight = -16 const UpgradeChocolateHeight = -17 -// 2022-01-13T19:00:00Z -const UpgradeOhSnapHeight = 18742 +// 2022-01-17T19:00:00Z +const UpgradeOhSnapHeight = 30262 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) From 4fd49cd541eb0ba35ff84dd82af541f9d56c26f6 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 18:49:24 -0500 Subject: [PATCH 120/129] go mod tidy --- testplans/lotus-soup/go.sum | 3 +++ 1 file changed, 3 insertions(+) diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 248bce866..e01a93827 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -1035,6 +1035,9 @@ 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= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> d923620d5 (go mod tidy) 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= From ab3c1c507e253252dc98c467863e3d5ad34907ce Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 12 Jan 2022 14:37:29 -0800 Subject: [PATCH 121/129] correctness fixes for the autobatch blockstore 1. Simplify shutdown and make it idempotent by using a context. 2. Make sure `Flush` actually _fully_ flushes if the previous flush failed. 3. Don't clear the flush batch if flushing fails. --- blockstore/autobatch.go | 92 ++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 53764d15c..6393b2e22 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -26,18 +26,17 @@ type AutobatchBlockstore struct { addedCids map[cid.Cid]struct{} stateLock sync.Mutex - doFlushLock sync.Mutex bufferedBatch blockBatch - flushingBatch blockBatch - flushErr error - flushWorkerDone bool + flushingBatch blockBatch + flushErr error flushCh chan struct{} + doFlushLock sync.Mutex flushRetryDelay time.Duration - flushCtx context.Context - shutdownCh chan struct{} + doneCh chan struct{} + shutdown context.CancelFunc backingBs Blockstore @@ -46,21 +45,21 @@ type AutobatchBlockstore struct { } func NewAutobatch(ctx context.Context, backingBs Blockstore, bufferCapacity int) *AutobatchBlockstore { + ctx, cancel := context.WithCancel(ctx) bs := &AutobatchBlockstore{ addedCids: make(map[cid.Cid]struct{}), backingBs: backingBs, bufferCapacity: bufferCapacity, - flushCtx: ctx, flushCh: make(chan struct{}, 1), - shutdownCh: make(chan struct{}), + doneCh: make(chan struct{}), // could be made configable flushRetryDelay: time.Millisecond * 100, - flushWorkerDone: false, + shutdown: cancel, } bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block) - go bs.flushWorker() + go bs.flushWorker(ctx) return bs } @@ -88,66 +87,85 @@ func (bs *AutobatchBlockstore) Put(ctx context.Context, blk block.Block) error { return nil } -func (bs *AutobatchBlockstore) flushWorker() { - defer func() { - bs.stateLock.Lock() - bs.flushWorkerDone = true - bs.stateLock.Unlock() - }() +func (bs *AutobatchBlockstore) flushWorker(ctx context.Context) { + defer close(bs.doneCh) for { select { case <-bs.flushCh: - putErr := bs.doFlush(bs.flushCtx) + // TODO: check if we _should_ actually flush. We could get a spurious wakeup + // here. + putErr := bs.doFlush(ctx, false) for putErr != nil { select { - case <-bs.shutdownCh: + case <-ctx.Done(): return case <-time.After(bs.flushRetryDelay): autolog.Errorf("FLUSH ERRORED: %w, retrying after %v", putErr, bs.flushRetryDelay) - putErr = bs.doFlush(bs.flushCtx) + putErr = bs.doFlush(ctx, true) } } - case <-bs.shutdownCh: + case <-ctx.Done(): + // Do one last flush. + _ = bs.doFlush(ctx, false) return } } } // caller must NOT hold stateLock -func (bs *AutobatchBlockstore) doFlush(ctx context.Context) error { +// set retryOnly to true to only retry a failed flush and not flush anything new. +func (bs *AutobatchBlockstore) doFlush(ctx context.Context, retryOnly bool) error { bs.doFlushLock.Lock() defer bs.doFlushLock.Unlock() - if bs.flushErr == nil { - bs.stateLock.Lock() - // We do NOT clear addedCids here, because its purpose is to expedite Puts - bs.flushingBatch = bs.bufferedBatch - bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) - bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) - bs.stateLock.Unlock() + + // If we failed to flush last time, try flushing again. + if bs.flushErr != nil { + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) } - bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + // If we failed, or we're _only_ retrying, bail. + if retryOnly || bs.flushErr != nil { + return bs.flushErr + } + + // Then take the current batch... bs.stateLock.Lock() - bs.flushingBatch = blockBatch{} + // We do NOT clear addedCids here, because its purpose is to expedite Puts + bs.flushingBatch = bs.bufferedBatch + bs.bufferedBatch.blockList = make([]block.Block, 0, len(bs.flushingBatch.blockList)) + bs.bufferedBatch.blockMap = make(map[cid.Cid]block.Block, len(bs.flushingBatch.blockMap)) bs.stateLock.Unlock() + // And try to flush it. + bs.flushErr = bs.backingBs.PutMany(ctx, bs.flushingBatch.blockList) + + // If we succeeded, reset the batch. Otherwise, we'll try again next time. + if bs.flushErr == nil { + bs.stateLock.Lock() + bs.flushingBatch = blockBatch{} + bs.stateLock.Unlock() + } + return bs.flushErr } // caller must NOT hold stateLock func (bs *AutobatchBlockstore) Flush(ctx context.Context) error { - return bs.doFlush(ctx) + return bs.doFlush(ctx, false) } func (bs *AutobatchBlockstore) Shutdown(ctx context.Context) error { - bs.stateLock.Lock() - flushDone := bs.flushWorkerDone - bs.stateLock.Unlock() - if !flushDone { - // may racily block forever if Shutdown is called in parallel - bs.shutdownCh <- struct{}{} + // TODO: Prevent puts after we call this to avoid losing data. + bs.shutdown() + select { + case <-bs.doneCh: + case <-ctx.Done(): + return ctx.Err() } + bs.doFlushLock.Lock() + defer bs.doFlushLock.Unlock() + return bs.flushErr } From 773c20a81c3d3c1e11ab121057948575504e783c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 19:16:25 -0500 Subject: [PATCH 122/129] Resolve conflict --- cmd/lotus-miner/sectors.go | 2 +- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 314 +----------------------------------- 3 files changed, 7 insertions(+), 311 deletions(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 90fe7b00b..be8170422 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1558,7 +1558,7 @@ var sectorsMarkForUpgradeCmd = &cli.Command{ } twoDays := abi.ChainEpoch(2 * builtin.EpochsInDay) - if head.Height() > (build.UpgradeSnapDealsHeight - twoDays) { + if head.Height() > (build.UpgradeOhSnapHeight - twoDays) { return xerrors.Errorf("OhSnap is coming soon, " + "please use `snap-up` to upgrade your cc sectors after the network v15 upgrade!") } diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index cb7b658ac..e96c7856d 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 e01a93827..8914f43f7 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -37,6 +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= +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= @@ -182,9 +183,8 @@ github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAm github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= 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= @@ -332,13 +332,8 @@ 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= -<<<<<<< HEAD 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/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= ->>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -384,20 +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= -<<<<<<< HEAD -<<<<<<< HEAD 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/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= ->>>>>>> e8df32579 (update lotus-soup deps) -======= -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= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -421,14 +405,8 @@ 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= -<<<<<<< HEAD -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-data-transfer v1.12.0 h1:y44x35JvB93kezahMURKizIa/aizGTPSHqi5cbAfTEo= github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= ->>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -437,27 +415,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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -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-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= ->>>>>>> e8df32579 (update lotus-soup deps) -======= 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= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) -======= -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= -<<<<<<< HEAD ->>>>>>> a98ca86a4 (Update butterflynet params) -======= ->>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -479,38 +438,17 @@ 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 -<<<<<<< HEAD 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.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= github.com/filecoin-project/go-state-types v0.1.3/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= ->>>>>>> a98ca86a4 (Update butterflynet params) -======= -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= ->>>>>>> a98ca86a4 (Update butterflynet params) 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.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= -<<<<<<< HEAD -<<<<<<< HEAD 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/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= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) -github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= ->>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -525,9 +463,6 @@ github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= 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 -<<<<<<< HEAD -<<<<<<< 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= @@ -537,16 +472,6 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsG github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= 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= -======= -======= ->>>>>>> a98ca86a4 (Update butterflynet params) -======= ->>>>>>> a98ca86a4 (Update butterflynet params) -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= ->>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -601,11 +526,6 @@ 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= @@ -1002,25 +922,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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 544cfa63a (cache added cids) 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-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= ->>>>>>> e8df32579 (update lotus-soup deps) -======= -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= -======= ->>>>>>> 8aabe1b48 (Fast migration for v15) -github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -1033,30 +936,8 @@ 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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> d923620d5 (go mod tidy) -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-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.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/go.mod h1:tQMjWNDD/vSz80YLT/VvzrUmy58aF9lR1uCwSLzjWzI= -<<<<<<< HEAD ->>>>>>> a98ca86a4 (Update butterflynet params) -======= ->>>>>>> a98ca86a4 (Update butterflynet params) -github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= ->>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -1110,19 +991,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= -<<<<<<< HEAD -<<<<<<< HEAD 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-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= ->>>>>>> e8df32579 (update lotus-soup deps) -======= -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/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= @@ -1165,14 +1036,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= -<<<<<<< HEAD -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-peertaskqueue v0.7.0 h1:VyO6G4sbzX80K58N60cCaHsSsypbUNs1GjO5seGNsQ0= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= ->>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -1187,44 +1052,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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD 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-car v0.3.3-0.20211210032800-e6f244225a16 h1:y6CW3GCY5Nm86/9vwphaghTTmOvEtfJjBOAzAIy3/Mk= -======= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) -github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -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= -<<<<<<< HEAD -<<<<<<< HEAD ->>>>>>> e8df32579 (update lotus-soup deps) -======= -github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= -======= ->>>>>>> 8aabe1b48 (Fast migration for v15) -github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) -======= -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.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= -github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= -<<<<<<< HEAD ->>>>>>> a98ca86a4 (Update butterflynet params) -======= ->>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1233,39 +1066,14 @@ 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= -<<<<<<< HEAD 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= -<<<<<<< HEAD -<<<<<<< HEAD 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 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= ->>>>>>> e8df32579 (update lotus-soup deps) -======= -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= ->>>>>>> 7fb590208 (Deps: Update lotus-soup to point to tagged releases) 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= -======= -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.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= -github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= -<<<<<<< HEAD ->>>>>>> a98ca86a4 (Update butterflynet params) -======= ->>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1567,18 +1375,8 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 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/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -<<<<<<< HEAD -<<<<<<< HEAD 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 v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= ->>>>>>> a98ca86a4 (Update butterflynet params) -======= -github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= ->>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -1928,14 +1726,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= -<<<<<<< HEAD -======= -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= -<<<<<<< HEAD ->>>>>>> a98ca86a4 (Update butterflynet params) -======= ->>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -2412,58 +2202,13 @@ 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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= -======= ->>>>>>> 8aabe1b48 (Fast migration for v15) -======= -go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= ->>>>>>> 544cfa63a (cache added cids) -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -======= ->>>>>>> e8df32579 (update lotus-soup deps) -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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= -======= ->>>>>>> e8df32579 (update lotus-soup deps) -======= ->>>>>>> 8aabe1b48 (Fast migration for v15) -======= -go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo= ->>>>>>> 544cfa63a (cache added cids) -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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= -======= ->>>>>>> 8aabe1b48 (Fast migration for v15) -======= -go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= ->>>>>>> 544cfa63a (cache added cids) -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -======= ->>>>>>> e8df32579 (update lotus-soup deps) 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= @@ -2557,9 +2302,8 @@ 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= @@ -2677,9 +2421,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx 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= -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= @@ -2808,7 +2551,6 @@ 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= @@ -2820,30 +2562,8 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= -======= ->>>>>>> 8aabe1b48 (Fast migration for v15) -======= -golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= ->>>>>>> 544cfa63a (cache added cids) -golang.org/x/sys v0.0.0-20211209171907-798191bca915/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= ->>>>>>> e8df32579 (update lotus-soup deps) -======= -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= ->>>>>>> a98ca86a4 (Update butterflynet params) -======= -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= ->>>>>>> a98ca86a4 (Update butterflynet params) 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= @@ -3136,34 +2856,10 @@ 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= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD 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= -<<<<<<< HEAD -<<<<<<< HEAD -======= -lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= ->>>>>>> e8df32579 (update lotus-soup deps) -======= -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= ->>>>>>> a98ca86a4 (Update butterflynet params) modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= -======= ->>>>>>> 8aabe1b48 (Fast migration for v15) -======= -======= -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= ->>>>>>> a98ca86a4 (Update butterflynet params) -modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= ->>>>>>> 544cfa63a (cache added cids) 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= @@ -3186,4 +2882,4 @@ 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= \ No newline at end of file +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= From 7377cf727eae1bb29ef6648699a01e7b082056ed Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 13 Dec 2021 15:03:54 +0200 Subject: [PATCH 123/129] 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 9c8a99c8f52da810f27787268b7912466bc5748f Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 12 Jan 2022 21:08:31 -0500 Subject: [PATCH 124/129] update change log --- CHANGELOG.md | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a420421de..4aa36e056 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,88 @@ # Lotus changelog +# 1.14.0-rc1 / 2022-01-12 + +This is the first release candidate for the mandatory release v1.14.0 of Lotus that introduces [Filecoin network v15, +codenamed the OhSnap upgrade](https://github.com/filecoin-project/community/discussions/74?sort=new#discussioncomment-1922550). + +The OhSnap upgrade introduces the following FIPs, delivered in actor v7-rc1: +- [FIP-0019 Snap Deals](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) +- [FIP-0028 Remove Datacap from Verified clients](https://github.com/filecoin-project/FIPs/pull/226) + +Note: +- This release is built on top of lotus v1.13.2. Enterprise users like storage providers, data brokers and others + are recommended to test out v1.15.0-rc1(coming on Jan 18th, 2022) for latest new features, improvements and bug + fixes and be ready for the upgrade! +- This release candidate uses temporary proof params for Snap Deals. +- It only sets upgrade epoch for Butterfly-SnapNet, and it does not set the upgrade epochs for calibration and mainnet. + +## Butterfly - SnapNet + +The ButterFly-SnapNet will be upgraded to Network v15 OhSnap at epoch 30262, around 2022-01-17T19:00:00Z. + +To join the network, simply building lotus by running `make butterflynet`. + +The network supports three sector sizes, 512MiB, 32GiB and 64GiB. Temporary proof params for Snap Deals should be downloaded upon your node restarts. + - The parameters are pinged on IPFS gateway https://proofs.filecoin.io/ipfs/ and the CIDs can be found [here](https://github.com/filecoin-project/lotus/blob/edd3486d2cf53b960382e9cda6671e647844aa41/build/proof-params/parameters.json), please let the lotus team know if the params are not fetched automatically. You can also download the params manually from s3://proof-params-ap/filecoin-snapdeal-parameters/. + +*SnapNet Resources*: +- [Faucet](https://faucet.butterfly.fildev.network/) +- [Stats Dashboard](https://faucet.butterfly.fildev.network/) +- For questions and feedbacks: + - Primary: [Discussion](https://github.com/filecoin-project/lotus/discussions/7935) + - Secondary: #lotus-ohsnap in Filecoin Slack + +## New Features and Changes +- Integrate actor v7-rc1: + - Integrate v7 actors ([#7617](https://github.com/filecoin-project/lotus/pull/7617)) + - feat: state: Fast migration for v15 ([#7933](https://github.com/filecoin-project/lotus/pull/7933)) + - correctness fixes for the autobatch blockstore ([#7940](https://github.com/filecoin-project/lotus/pull/7940)) +- Implement and support [FIP-0019 Snap Deals](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) + - chore: deps: Integrate proof v11.0.0 ([#7923](https://github.com/filecoin-project/lotus/pull/7923)) + - Snap Deals Lotus Integration: FSM Posting and integration test ([#7810](https://github.com/filecoin-project/lotus/pull/7810)) + - Feat/sector storage unseal ([#7730](https://github.com/filecoin-project/lotus/pull/7730)) + - Feat/snap deals storage ([#7615](https://github.com/filecoin-project/lotus/pull/7615)) + - fix: sealing: Add more deal expiration checks during PRU pipeline ([#7871](https://github.com/filecoin-project/lotus/pull/7871)) + - chore: deps: Update go-paramfetch ([#7917](https://github.com/filecoin-project/lotus/pull/7917)) + - feat: #7880 gas: add gas charge for VerifyReplicaUpdate ([#7897](https://github.com/filecoin-project/lotus/pull/7897)) + - enhancement: sectors: disable existing cc upgrade path 2 days before the upgrade epoch ([#7900](https://github.com/filecoin-project/lotus/pull/7900)) + +## Improvements +- updating to new datastore/blockstore code with contexts ([#7646](https://github.com/filecoin-project/lotus/pull/7646)) +- reorder transfer checks so as to ensure sending 2B FIL to yourself fails if you don't have that amount ([#7637](https://github.com/filecoin-project/lotus/pull/7637)) + +## Bug Fixes +- Fix: state: circsuypply calc around null blocks ([#7890](https://github.com/filecoin-project/lotus/pull/7890)) +- VM: Circ supply should be constant per epoch ([#7811](https://github.com/filecoin-project/lotus/pull/7811)) +- Mempool msg selection should respect block message limits ([#7321](https://github.com/filecoin-project/lotus/pull/7321)) + SplitStore: supress compaction near upgrades ([#7734](https://github.com/filecoin-project/lotus/pull/7734)) + +## Others +- chore: create pull_request_template.md ([#7726](https://github.com/filecoin-project/lotus/pull/7726)) + +## Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| Aayush Rajasekaran | 56 | +5866/-2523 | 316 | +| zenground0 | 11 | +3316/-524 | 124 | +| vyzo | 38 | +722/-485 | 117 | +| Rod Vagg | 2 | +6/-941 | 4 | +| whyrusleeping | 2 | +376/-339 | 27 | +| ZenGround0 | 3 | +263/-25 | 11 | +| c r | 2 | +198/-30 | 6 | +| Łukasz Magiera | 2 | +184/-3 | 3 | +| Jennifer Wang | 14 | +97/-69 | 41 | +| Whyrusleeping | 1 | +76/-70 | 8 | +| web3-bot | 10 | +99/-17 | 10 | +| Steven Allen | 1 | +55/-37 | 1 | +| Jiaying Wang | 5 | +30/-8 | 5 | +| Hannah Howard | 1 | +4/-29 | 3 | +| dirkmc | 1 | +11/-0 | 1 | +| Jakub Sztandera | 2 | +8/-3 | 3 | +| Colin Kennedy | 1 | +4/-2 | 1 | + + # v1.13.2 / 2022-01-09 Lotus v1.13.2 is a *highly recommended* feature release with remarkable retrieval improvements, new features like From 3505991def9abc276495a2a0bbf7841594ef6b5e Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 12 Jan 2022 21:26:20 -0500 Subject: [PATCH 125/129] fix the statsboard link --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aa36e056..943a57989 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ The network supports three sector sizes, 512MiB, 32GiB and 64GiB. Temporary proo *SnapNet Resources*: - [Faucet](https://faucet.butterfly.fildev.network/) -- [Stats Dashboard](https://faucet.butterfly.fildev.network/) +- [Stats Dashboard](https://stats.butterfly.fildev.network/d/z6FtI92Zz/chain?orgId=1&refresh=25s&from=now-30m&to=now&kiosk) - For questions and feedbacks: - Primary: [Discussion](https://github.com/filecoin-project/lotus/discussions/7935) - Secondary: #lotus-ohsnap in Filecoin Slack From 6f9fcc7ef2654ecc0e672c974dcc715d219419bd Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 21:37:47 -0500 Subject: [PATCH 126/129] Apply suggestions from code review --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 943a57989..81cd0109b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,12 @@ This is the first release candidate for the mandatory release v1.14.0 of Lotus that introduces [Filecoin network v15, codenamed the OhSnap upgrade](https://github.com/filecoin-project/community/discussions/74?sort=new#discussioncomment-1922550). -The OhSnap upgrade introduces the following FIPs, delivered in actor v7-rc1: +The OhSnap upgrade introduces the following FIPs, delivered in [actors v7-rc1](https://github.com/filecoin-project/specs-actors/releases/tag/v7.0.0-rc1): - [FIP-0019 Snap Deals](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) - [FIP-0028 Remove Datacap from Verified clients](https://github.com/filecoin-project/FIPs/pull/226) Note: -- This release is built on top of lotus v1.13.2. Enterprise users like storage providers, data brokers and others +- This release is built on top of lotus v1.13.2. Enterprising users like storage providers, data brokers and others are recommended to test out v1.15.0-rc1(coming on Jan 18th, 2022) for latest new features, improvements and bug fixes and be ready for the upgrade! - This release candidate uses temporary proof params for Snap Deals. @@ -20,9 +20,9 @@ Note: The ButterFly-SnapNet will be upgraded to Network v15 OhSnap at epoch 30262, around 2022-01-17T19:00:00Z. -To join the network, simply building lotus by running `make butterflynet`. +To join the network, simply build lotus by running `make butterflynet`. -The network supports three sector sizes, 512MiB, 32GiB and 64GiB. Temporary proof params for Snap Deals should be downloaded upon your node restarts. +The network supports three sector sizes, 512MiB, 32GiB and 64GiB. Temporary proof params for Snap Deals should be downloaded upon your node restart. - The parameters are pinged on IPFS gateway https://proofs.filecoin.io/ipfs/ and the CIDs can be found [here](https://github.com/filecoin-project/lotus/blob/edd3486d2cf53b960382e9cda6671e647844aa41/build/proof-params/parameters.json), please let the lotus team know if the params are not fetched automatically. You can also download the params manually from s3://proof-params-ap/filecoin-snapdeal-parameters/. *SnapNet Resources*: From 58cf84f07281443384882585bf4ad3e437b381f7 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 12 Jan 2022 21:39:29 -0500 Subject: [PATCH 127/129] address reviews --- CHANGELOG.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 943a57989..7796db772 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ The ButterFly-SnapNet will be upgraded to Network v15 OhSnap at epoch 30262, aro To join the network, simply building lotus by running `make butterflynet`. The network supports three sector sizes, 512MiB, 32GiB and 64GiB. Temporary proof params for Snap Deals should be downloaded upon your node restarts. - - The parameters are pinged on IPFS gateway https://proofs.filecoin.io/ipfs/ and the CIDs can be found [here](https://github.com/filecoin-project/lotus/blob/edd3486d2cf53b960382e9cda6671e647844aa41/build/proof-params/parameters.json), please let the lotus team know if the params are not fetched automatically. You can also download the params manually from s3://proof-params-ap/filecoin-snapdeal-parameters/. + - The parameters are pinged on IPFS gateway https://proofs.filecoin.io/ipfs/ and the CIDs can be found [here](https://github.com/filecoin-project/lotus/blob/edd3486d2cf53b960382e9cda6671e647844aa41/build/proof-params/parameters.json), please let the lotus team know in #lotus-ohsnap if the params are not fetched automatically. You can also download the params manually from s3://proof-params-ap/filecoin-snapdeal-parameters/. *SnapNet Resources*: - [Faucet](https://faucet.butterfly.fildev.network/) @@ -39,21 +39,21 @@ The network supports three sector sizes, 512MiB, 32GiB and 64GiB. Temporary proo - correctness fixes for the autobatch blockstore ([#7940](https://github.com/filecoin-project/lotus/pull/7940)) - Implement and support [FIP-0019 Snap Deals](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) - chore: deps: Integrate proof v11.0.0 ([#7923](https://github.com/filecoin-project/lotus/pull/7923)) - - Snap Deals Lotus Integration: FSM Posting and integration test ([#7810](https://github.com/filecoin-project/lotus/pull/7810)) - - Feat/sector storage unseal ([#7730](https://github.com/filecoin-project/lotus/pull/7730)) - - Feat/snap deals storage ([#7615](https://github.com/filecoin-project/lotus/pull/7615)) - - fix: sealing: Add more deal expiration checks during PRU pipeline ([#7871](https://github.com/filecoin-project/lotus/pull/7871)) - - chore: deps: Update go-paramfetch ([#7917](https://github.com/filecoin-project/lotus/pull/7917)) - - feat: #7880 gas: add gas charge for VerifyReplicaUpdate ([#7897](https://github.com/filecoin-project/lotus/pull/7897)) - - enhancement: sectors: disable existing cc upgrade path 2 days before the upgrade epoch ([#7900](https://github.com/filecoin-project/lotus/pull/7900)) + - Snap Deals Lotus Integration: FSM Posting and integration test ([#7810](https://github.com/filecoin-project/lotus/pull/7810)) + - Feat/sector storage unseal ([#7730](https://github.com/filecoin-project/lotus/pull/7730)) + - Feat/snap deals storage ([#7615](https://github.com/filecoin-project/lotus/pull/7615)) + - fix: sealing: Add more deal expiration checks during PRU pipeline ([#7871](https://github.com/filecoin-project/lotus/pull/7871)) + - chore: deps: Update go-paramfetch ([#7917](https://github.com/filecoin-project/lotus/pull/7917)) + - feat: #7880 gas: add gas charge for VerifyReplicaUpdate ([#7897](https://github.com/filecoin-project/lotus/pull/7897)) + - enhancement: sectors: disable existing cc upgrade path 2 days before the upgrade epoch ([#7900](https://github.com/filecoin-project/lotus/pull/7900)) ## Improvements - updating to new datastore/blockstore code with contexts ([#7646](https://github.com/filecoin-project/lotus/pull/7646)) - reorder transfer checks so as to ensure sending 2B FIL to yourself fails if you don't have that amount ([#7637](https://github.com/filecoin-project/lotus/pull/7637)) +- VM: Circ supply should be constant per epoch ([#7811](https://github.com/filecoin-project/lotus/pull/7811)) ## Bug Fixes - Fix: state: circsuypply calc around null blocks ([#7890](https://github.com/filecoin-project/lotus/pull/7890)) -- VM: Circ supply should be constant per epoch ([#7811](https://github.com/filecoin-project/lotus/pull/7811)) - Mempool msg selection should respect block message limits ([#7321](https://github.com/filecoin-project/lotus/pull/7321)) SplitStore: supress compaction near upgrades ([#7734](https://github.com/filecoin-project/lotus/pull/7734)) From 3b3a35ee47ec3d3b07bf004f066fe44fa68b7af0 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 12 Jan 2022 17:22:54 -0500 Subject: [PATCH 128/129] Add missing locks to Get() --- blockstore/autobatch.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index 6393b2e22..c2c281446 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -180,6 +180,8 @@ func (bs *AutobatchBlockstore) Get(ctx context.Context, c cid.Cid) (block.Block, return blk, err } + bs.stateLock.Lock() + defer bs.stateLock.Unlock() v, ok := bs.flushingBatch.blockMap[c] if ok { return v, nil From a1e0a87a23ba55eab006b761ea1310d90d668ff2 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 12 Jan 2022 21:52:05 -0500 Subject: [PATCH 129/129] add 7939 to change log --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd85fa9f9..f11c4ee4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ The network supports three sector sizes, 512MiB, 32GiB and 64GiB. Temporary proo - Integrate actor v7-rc1: - Integrate v7 actors ([#7617](https://github.com/filecoin-project/lotus/pull/7617)) - feat: state: Fast migration for v15 ([#7933](https://github.com/filecoin-project/lotus/pull/7933)) + - fix: blockstore: Add missing locks to autobatch::Get() [#7939](https://github.com/filecoin-project/lotus/pull/7939)) - correctness fixes for the autobatch blockstore ([#7940](https://github.com/filecoin-project/lotus/pull/7940)) - Implement and support [FIP-0019 Snap Deals](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0019.md) - chore: deps: Integrate proof v11.0.0 ([#7923](https://github.com/filecoin-project/lotus/pull/7923))

(`#wt?c$#i9}Fi+f3KB5meUrN9@ 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